Archive for the ‘非技术’ Category


开发效率与系统稳定性杂谈

在互联网系统中,开发效率与系统稳定性与产品成败非常相关。开发效率在一定程度反映了团队的执行力,快速开发能力带来了产品的竞争优势。系统稳定性(包括安全及性能等)则是产品的后防线,稍有失误则会给产品带来很大伤害。因此开发效率与系统稳定性是衡量互联网系统开发成熟度最重要的两个指标。

在软件开发周期不同阶段,这两者如何控制?

在需求阶段,对开发效率的影响常见的是沟通理解偏差带来的技术风险,之外最常见的还有需求变更的风险。后者大多是来自市场环境的变化作出调整,技术主管更多的是积极心态去应对。但对前者沟通理解偏差导致效率问题也不罕见,更值得警惕。

在技术设计阶段最大的风险是技术方案,找个无需多讲,考验团队的架构能力以及对当前系统的驾驭程度。

开发阶段最大的风险是单元测试不到位或缺失。很多号称“敏捷”型项目依赖在线上测试及修改,当模块增多后,这样代码健壮性就会变得比较脆弱,不少团队也会越走越慢。

Review阶段风险是简洁性及性能。除了压力测试能达标之外,警惕那些不易懂的代码,这些代码将来会成为事故多发地带。

部署阶段最大的风险是上线计划把控,上线过程中操作错误的情况并不罕见,如去年Amazon EC2的故障就是由于操作失误造成。

从宏观看来,技术方案的风险最大,由于模块很多,具有丰富经验的高手不可能参与每一个环节,这就会出现木桶的短板效应,架构师认为不重要的地方总是会出问题。给用户体验造成极大伤害。

另外还有团队文化的风险。大部分团队很难形成书面交流的习惯。口头沟通需求、讨论方案对创业团队非常适合。在团队变大之后,这样的习惯会造成信息流动障碍,可能会给工作效率带来更多负面问题。同时大部分团队也对流程、模板、规范缺乏了解与重视,过多依赖参与人的内部驱动力及能力,无法依靠制度与流程来取胜。

谈团队每周技术交流

最近在微博上提到了每周五进行一次内部的技术交流,方法也在不断的改进中,目前情况分享如下。希望也能听到一些更好的建议。

内容选取

大部分都是接近工作的,比如应用层如何访问cache及db、当前项目的重构或某个复杂的算法等。比如一个重构的话题让大家找出项目中目前不合理的若干问题,并分析这些问题存在的历史原因。然后大家分别发表自己认为合适的解决方案并进行讨论。

可以取得的成效

  • 团队成员取长补短,获得更全面的技术
  • 分享经验,避免成员步入已知的雷区
  • 提高分析技术问题的能力
  • 认识不足,找到自己需要提高的方向
  • 达成团队更多共识,比如什么是好的做法什么是不推荐的做法

后续主题

以后可以进一步考虑的讨论主题,最大的原则是考虑跟近期项目有相关性,比如

  • 互联网应用合适的压力测试方式
  • profiler 系统性能分析,热点调用的主要消耗点并提出解决方案。
  • 工具介绍,可以提高效率或者对工作有帮助
  • 某个算法,如粉丝排序

与code review的区别

code review关注代码细节, 团队讨论更关注宏观抽象层面的问题,但部分时候团队讨论也进行一些有代表意义的code改进。

与主题演讲区别

倾向于圆桌式的讨论,需要大家参与的开放式问题。以前也尝试过主题式的,但是由于团队内的主题演讲空间有限,演讲者可能要先精通某个领域才适合讲,如果每周一轮不太可行,比如Facebook Engineering tech talks也是精英演讲的方式,结果也不是非常活跃。因此每周一次更合适讨论一些跟工作相关未达成共识的话题,这样更敏捷,也更容易给参与者带来成效。

-EOF-

广告:我们团队招收各层次技术人才,包括Java后端工程师,数据架构师(MySQL),PHP工程师, 数据挖掘工程师(如精通Hadoop)等,工作地点是北京,有兴趣可以直接给我邮件。

上次提到的Web 2.0技术沙龙已经与CSDN顺利举行了第一期,由于之前报名的已经非常多,就未在博客上宣传了,第一期活动今天已经结束。

做卓有成效的程序员

最近阅读了《卓有成效的程序员》(The Productive Programmer) 一书,此书虽是2009年出版,但是介绍内容的价值并不会随着时间过去而降低,相信5-10年后对于大部分开发者仍然具有借鉴价值。

大部分章节是介绍具体的方法来如何提高程序员工作效率。记住具体的技巧未必有太大价值,很多人都认同一种观点就是,读一本书最终的目标是忘记其中所有的观点,但是它会潜移默化影响了你以后的思维和或观点,包括你的行为。因此我认为此书直接的影响就是帮助思考开发过程的方法和问题,思考以前的惯例是否存在问题。比如最近在设计某个产品删除功能的时候,一位同事突然提到是否产品将来有需要查看行为历史,如果需要记录历史,删除的流程就会变复杂,不但影响删除功能的实现,还会影响后端数据的规模,从而进一步会影响架构的设计。因而我的直觉是这是一个过早优化,也就是书中第9章讲的YAGNT(You Ain’t Gonna Need It 你不需要这个特性)。由于第一时间的质疑,这个可能需要耗费大量开发时间的特性被暂停,对于项目本身或许是一件好事。

此外书中一些敏捷的思路也会带来一些间接影响,我还意识到过去一些非敏捷方法可能会给项目带来风险,一个过去的项目,开发完成之后逐渐变得臃肿,和大部分后端服务相似,需要依赖一些特定的数据库及其他依赖环境。由于不希望开发环境与真实环境差距太大,开发环境也全部按真实环境最小单元的配置来进行,这就导致开发依赖的环境很多

内部依赖
MySQL master/slave
分表
Memcached(多个)

外部依赖
Message Queue(消息队列)
用户及鉴权服务
internal HTTP service

导致的问题
需要特定的环境才能开发,比如公司配好的环境中
无法在家中或咖啡馆干活,因为系统跑不起来,无法看到效果
一旦部分依赖环境有问题,则无法开工,只能等着服务恢复
一旦几天没跟进代码,可能就由于环境设置的变化而无法独自启动工程。

这些问题就导致代码改进的工作令人生畏,要像Google那样做到任何对代码感兴趣的人可以patch代码的意愿都会变成”mission impossible”。因此对于这个项目来说,最急需的一个改进是分析依赖,让项目能够随时随地可以方便的跑起来,大家可以很简单的改进代码,对改进的代码进行测试验证,测试之后新的代码基本可以无风险的运行到线上环境去。否则臃肿的项目只会降低大家的贡献的热情,最后变成一个死气沉沉的工作任务。

你的项目中的惯例是否存在问题呢?比如Java中POJO中无用的get/set方法,比如一些使用c/c++来“优化”项目中的瓶颈而走向时间泥潭的经历,比如贵公司是否又在雄心勃勃要做一个自己的框架,事实上这个框架对于项目本身毫无价值。诸如此类的情况会非常多,这本书主要介绍的是程序员要如何提高自身的效率,但我觉得程序员更多的也应思考团队的效率改进并发出声音。