关于工作中的顺畅沟通

比如某天接到一个电话:

”喂?是秦迪吗?你那边负责微博视频是吧?现在上传流程里不能自定义xxxx,你那边的接口能不能加一个XXX功能?“

或者某天收到一封邮件:

秦老板:
需要开通a.b.c.d机器权限,请确认。

或者突然有个人过来找我:

“我这边有三个方案,blablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablabla,你觉着哪个好?”

或者突然被拉到一个群里:

@axb 看一下吧。

或者遇到了紧急问题。

axb:@xxx 现在什么情况?
xxx:在看
….30分钟后….
axb:@xxx 怎么样了?
xxx:还在看

沟通不畅不但浪费时间,而且特别影响一个人的心情,有时候甚至会怀疑到底是自己还是世界出了问题。

微博上前些天有人让我分享一下如何沟通,这我觉着很难以理解,就像我难以理解为什么有人能把几句话就说明白的事情搞的跟天体物理学公式一样。想要通过沟通说服一个人(比如销售商品)确实很难,但是仅仅是日常交流想要把话说明白的话,根本没有那么多所谓的技巧啊?… Read the rest

通过数据分析进行问题排查的case

前几天帮忙排查一个问题,简单记录一下。

背景

答题服务,近期用户答题率(答题人数/发题时的在线人数)有明显下降,需要分析这部分用户没有答题的原因。

初步排查

  1. 从服务端监控来看,客户端尝试连接、断连、超时比例都没有明显异常,整体也没有容量上的问题。
  2. 从没有答题的用户分析,没有明显的特征。
  3. 从没有答题的设备分析,大部分集中在IOS客户端。
  4. 从没有答题的设备网络分析,没有明显的地域或ISP分布。

进一步排查

在初步排查基本排除了服务端整体性能问题之后,接下来的问题是:这一部分IOS用户为什么在房间里但是没有答题?

可能的解释有几种:

  1. 发题的时候用户在线,但是没有弹出题目
  2. 发题的时候用户在线,弹出题目了,但是没有选择答案
  3. 发题的时候用户在线,弹出题目、选择答案了,但是没有提交成功
  4. 发题的时候用户其实不在线,统计有问题
Read the rest

如何从菜鸟成长为(伪)架构师

前些天,我在各种论坛里发招聘贴,遇见X君,前来问我道,“你可曾为招聘贴写过什么软文吗?”我说“没有”。他就正告我,“那还是写一点罢;现在的招聘贴不写点鸡汤文是没有人转发的。”

于是我思考许久,想起去年大约也是这个时候,写过一篇名为《如何从菜鸟程序员成长为(伪)高手》的技术鸡汤文,反响还不错。一年过去,似乎自己又成长了不少,就干脆再写个续吧。

工作了挺久,发现有个挺有意思的现象,从程序员、高级程序员,到现在挂着架构师、专家之类的头衔,伴随着技术和能力的提高,想不明白的事情反而越来越多了。这些疑问有些来自于跟小伙伴交流,有些是我的自问自答,有些到现在也想不清楚,这篇文章就来写一写这些问题。

学习

如何更高效的学习?

上篇文章谈到很多新人程序员学习没有方向的问题,在渡过了一段时间的新手期之后这类问题大多都会变得不再那么明显,工作的方向也会逐渐变得清晰起来。… Read the rest

记一次集群内无可用http服务问题排查

现象是这样的:每天到了某个时间点,就会出现服务不稳定的情况,偶发接口调不通。

线上业务使用了lvs-nginx-tomcat三层结构,首先查看tomcat监控,没有什么特别异常的情况,响应时间和错误码没发现有什么异常,CPU、IO等等指标也都正常。

再查看nginx上的监控,发现在某个时刻这个服务的5xx报错突增,大概7、8秒之后又恢复了。

继续在nginx服务器上找线索,发现Nginx在那个时间点会出现报错:

线上nginx会每秒探测后端所有服务器的某个uri,如果返回的http状态码是200则认为正常,连续3次探测失败则摘除探测失败的服务器,直到探测成功再恢复。

从日志中可以发现nginx在出问题的时间点对于后端所有tomcat的探测请求都出现了问题,导致摘除了所有后端服务器,在这段时间里请求会报502异常。… Read the rest

嵌入式开发随笔(误)

记录一下最近的状态。

2012-02-27 23:44

嵌入式就【】【】是个坑啊【】【】!!!
闲着没事看嵌入式的【】【】你伤不起啊!!!
哼着小曲儿屁颠屁颠的买了开发板!!!
买回来以后我就震惊了啊!!!
这尼玛买开发板送 14 张 DVD 有木有啊!!!
14 张 DVD 啊!!!不知道的以为我买的是苍老师合集啊!!!
花了一晚上才尼玛把片儿。哦不,教学资料拷完啊!!!

本来以为这就能开始玩开发板了。
后来才知道这【】【】是白日做梦啊!!!!
接线就接了一整夜啊!!!
接上以后尼玛计算机不认啊!!!
白屏啊!!!
黑屏啊!!!
叹号啊!!!
问号啊!!!
输入没反应啊!!!
尼玛插个串口线还要前戏啊!!
开发板湿没湿不知道,反正我是湿了啊!!!

劳资做足了 4 个钟头的前戏!!!
好不容易有反应,超级终端开始刷屏了!!!
我妈进门一看还说你们这些搞程序的真厉害。… Read the rest

关于烂代码的那些事(下)

假设你已经读过烂代码系列的前两篇:了解了什么是烂代码,什么是好代码,但是还是不可避免的接触到了烂代码(就像之前说的,几乎没有程序员可以完全避免写出烂代码!)接下来的问题便是:如何应对这些身边的烂代码。

改善可维护性

改善代码质量是项大工程,要开始这项工程,从可维护性入手往往是一个好的开始,但也仅仅只是开始而已。

重构的悖论

很多人把重构当做一种一次性运动,代码实在是烂的没法改了,或者没什么新的需求了,就召集一帮人专门拿出来一段时间做重构。这在传统企业开发中多少能生效,但是对于互联网开发来说却很难适应,原因有两个:

  1. 互联网开发讲究快速迭代,如果要做大型重构,往往需要暂停需求开发,这个基本上很难实现。
  2. 对于没有什么新需求的项目,往往意味着项目本身已经过了发展期,即使做了重构也带来不了什么收益。
Read the rest

使用Spock框架进行单元测试

关于单元测试

很多人一谈到单元测试就会想到xUnit框架。对于一些java新人来说,会用jUnit就是会写单元测试,高级点的会捣鼓一下testng,然后就认为自己掌握了单元测试。

而实际上,很多人不怎么会写单元测试,甚至不知道单元测试究竟是干什么的。写单元测试要比写代码要难上许多,而这里说的难度跟框架没什么关系。

所以,在开始介绍spock之前,需要先抛开框架,谈谈单元测试本身的事情。在理解了单元测试之后才能更清楚spock框架是什么,以及它否能够更优雅的解决你的问题。

单元测试是什么

写代码免不了要做测试,测试有很多种,对于java来说,最初级的就是写个main函数运行一下看看结果,高级的可以用各种高大上的复杂的测试系统。每种测试都有它的关注点,比如测试功能是不是正确,或者运行状态稳不稳定,或者能承受多少负载压力,等等。… Read the rest

关于烂代码的那些事(中)

什么是好代码

写代码的第一步是理解什么是好代码。在准备bootcamp的课程的时候,我就为这个问题犯了难,我尝试着用一些精确的定义区分出“优等品”、“良品”、“不良品”;但是在总结的过程中,关于“什么是好代码”的描述却大多没有可操作性

好代码的定义

随便从网上搜索了一下“优雅的代码”,找到了下面这样的定义:

Bjarne Stroustrup,C++之父:

  • 逻辑应该是清晰的,bug难以隐藏;
  • 依赖最少,易于维护;
  • 错误处理完全根据一个明确的策略;
  • 性能接近最佳化,避免代码混乱和无原则的优化;
  • 整洁的代码只做一件事。

Grady Booch,《面向对象分析与设计》作者:

  • 整洁的代码是简单、直接的;
  • 整洁的代码,读起来像是一篇写得很好的散文;
  • 整洁的代码永远不会掩盖设计者的意图,而是具有少量的抽象和清晰的控制行。

Michael Feathers,《修改代码的艺术》作者:… Read the rest

关于烂代码的那些事(上)

写烂代码很容易

刚入程序员这行的时候经常听到一个观点:你要把精力放在ABCD(需求文档/功能设计/架构设计/理解原理)上,写代码只是把想法翻译成编程语言而已,是一个没什么技术含量的事情。

当时的我在听到这种观点时会有一种近似于高冷的不屑:你们就是一群傻X,根本不懂代码质量的重要性,这么下去迟早有一天会踩坑,呸。

可是几个月之后,他们似乎也没怎么踩坑。而随着编程技术一直在不断发展,带来了更多的我以前认为是傻X的人加入到程序员这个行业中来。

语言越来越高级、封装越来越完善,各种技术都在帮助程序员提高生产代码的效率,依靠层层封装,程序员真的不需要了解一丁点技术细节,只要把需求里的内容逐行翻译出来就可以了。

很多程序员不知道要怎么组织代码、怎么提升运行效率、底层是基于什么原理,他们写出来的是在我心目中烂成一坨翔一样的代码。… Read the rest

分类目录