纯编程能力:不写一行多余代码
程序员的纯编程能力是程序员水平的最直接表现。在解决实际问题时候,程序员经常会被要求实现项目的某一个子模块,一个函数或者一个算法等等。令人惊讶的是,我发现在这个过程中,很少有人能够做到用最少的命令高效地完成任务。我甚至发现在很多团队中,竟然存在会忘记使用排序算法的不称职的程序员,这让他们甚至无法胜过虽然缺乏实践经验但理论完备的毕业生。

经验:踩在前人的肩膀上
所谓经验,我指的是重复出现的任务的成熟解决方案。一个有经验的程序员知道如何处理各种任务。这可以避免重复设计,更重要的是可以避免设计错误,设计错误是程序员效率的最大敌人。

专注:高效利用时间
对于任何事情,时间的有效利用都至关重要,许多内在和外在的因素都会导致程序员丧失专注度。内在因素包括拖延症、没有兴趣、缺乏经验、睡眠短缺等。外在因素包括频繁的会议、工作环境、同事的干扰等。提高专注度、避免打扰能够提高编程效率,这很好理解。有时,为了专注,需要狠下心来,采取较为极端的措施。比如邮件,虽然都会看,但只回复很少的一部分。

不要吝惜时间设计:防止推倒重来
很多时候,程序员非常不情愿看到的一种情况是,需要在一些无关紧要的功能上浪费大量的时间,但你又不得不去将这个无关紧要的功能实现,因为它牵扯着这个项目的主要功能。这种时候,就需要反思,在顶层设计的时候是否考虑周全。详细而缜密的顶层设计能够减少上述情况的发生,即降低模块间的耦合性。对于项目的设计者来说,意识到每一个细小的模块都有可能成为项目的瓶颈,这很重要。对于项目而言,最终的目标是合理的时间做最大的产出,那么实施重点就应该放在项目最主要的模块上。拿我设计Disque(一个开源的分布式消息队列)为例,我意识到只要提供最优的消息排列方式,至于项目其他锦上添花的方面都可以后续慢慢补充,例如,可用性、查询语言、客户端交互、简易性及系统性能。

简洁性:避免细节错误才是程序简洁的根本
简洁性意味着很多。为了理解什么是简洁性,首先来看看究竟可以多复杂?我相信导致复杂性有两个罪魁祸首,除了上面所说的不愿意花费过多的时间在设计上,还有一个是在设计过程中错误的累积。

思考一下程序实施的过程,所谓失之毫厘,谬以千里。一个初始的设计错误可能不会导致所在功能的重新设计,但可能会导致开发者需要在其他功能上做大量的工作来应对这个错误。因此,项目一步一步走向复杂和低效。

简洁性需要一步一步实现。程序员可以从最直接可靠的解决方式开始入手,用尽可能简单的方式实现功能,之后随着经验和编程能力的提高,程序员就有能力去优化设计了。

每次遇到不得不采取复杂的解决的方案的情况,开发者都应该花些时间想想如何避免这种情况的发生。只有在考虑了各种不同的方式,发现不得不走这条道路的时候,才继续在这个方向上前进。

完美主义:高效产出的最大阻碍
完美主义有两种类型,一种是追求至高性能的工程师文化,一种要符合个人趣向的执拗。两种情况都妨碍到程序员快速发布项目。完美主义和对外界评价的在乎会使程序员过多地将关注点放在一些细枝末节上,进而主观忽视项目的关键特性,例如程序的稳健性、简洁性、及是否能够按时交付。

知识:某些关键问题还是要依靠理论解决
当处理复杂的任务时:数据结构知识、对计算能力的极限的了解、对针对某个任务最行之有效的小众算法的了解,会帮助我们解决这些任务。对于开发者而言,对所有问题的所有解决方案都了如指掌这不现实,但对于某类问题的多数潜在解决方案都有所了解是必须的。例如,容许一定错误率,考虑概率集合基数估计量,可以设计一个优化的流的元素计数算法,避免复杂,缓慢,空间效率低下的缺点。

底层:熟悉计算机的脾性
即便我们使用的是高级语言,但不了解计算机的内部运行机制仍然会导致一些问题。有时系统会出现涉及到底层问题的工具或算法错误,导致整个系统的重新设计实施。深入理解C语言、CPU运算机理和操作系统内核会避免我们遇到在项目后期“推倒重来”的情况。

Debug能力:无需多言
寻找Bug总是非常耗费时间的。擅长发现、定位并合理地解决Bug,以及在编程过程中尽可能简化程序以减少Bug,这些素质将极大地提高程序员的编程效率