九天雁翎的博客
如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。 -- Paul Graham

漫谈好程序员的标准

无数的人问过类似的问题, 怎么样才能做一个好的程序员? 在回答这个问题之前, 首先得明白什么是好的程序员, 这样才有方向和目标, 可是这事情太主观, 可能各人的标准千差万别, 不谈那些传奇性的独自一人做出伟大事情的特例, 也不谈什么上天入地, 上帝大牛的诡论, 以下是我比较认可的, 在通常的项目开发中, 一个好程序员的标准.

目录:

解决问题的能力

在项目开发中, 一个程序员的能力等于其解决问题的能力. 假如想有个尺度来衡量这个能力的话, 一个程序员的能力可以用能完成任务的规模和难度来衡量.
因为难度上不好那么简单的划分, 并且在一般的项目开发中(非研究性项目), 任务的难度主要来自于任务的规模带来的复杂度, 这里把任务从规模上大致的划分为1个函数=>1个类=>1个功能=>1个模块=>1个项目
更细致的划分时,函数, 类, 功能, 模块, 项目本身也有简单和规模大小之分.

  • 一个初学编程的人总是从最小的函数和类开始学习的.
  • 一个程序员能基本无误的完成项目中的一个功能算是合格, 在此之前, 对项目的生产力为负, 即为他布置任务, 沟通, 和为他修补bug的时间其实要多于自己直接完成该功能的时间. 也就是说, 项目中存在这个水平的程序员纯粹是为了培养人才.
  • 能较好完成一个完整模块的程序员算是较好的程序员, 也是一般项目中的主要开发者.
  • 能完成整个项目的程序员才能算是好的程序员. 在多人项目中可做主程.

不同规模的任务主要的问题也体现在不同的方面:

  • 对于初学者来说, 写好一个函数和类的难点在于语言本身的语法上.
  • 对于完成一个功能来说, 难点在于理解这个功能, 以及很好的在现有的代码中加入此功能, 完成的功能不是独立于项目之外的, 而是要融入项目本身, 除了功能本身和其他功能衔接正常无误外, 特别重要的就是注意功能实现后不能对其他功能产生预期外的影响, 作为游戏开发来说, 典型的例子就是你完成的UI不能让其他该显示的UI显示有问题, 不该显示的UI又没有消失.
  • 对于完成一个模块来讲, 暴露给外部的接口设计比内部实现的设计同样重要(甚至更加重要), 合理易使用的接口设计决定了一个模块的好坏. 模块内部实现不好尚可更改, 接口实现不好, 更改起来可能是灾难性的.
  • 对于一个项目来讲, 在正确的地方使用正确的解决方案是最重要的事情, 最开始的技术选型直接决定项目的成败, 模块的划分能决定项目的开发速度, 架构的设计能决定项目的维护难度和增加需求时的痛苦程度. 对于多人项目来说, 主程让正确的人去做正确的事情也是无比的重要.

什么决定了一个程序员解决问题的能力呢? 我认为有如下几个因素:

知识积累

在同等水平的程序员之间, 一个对某领域问题有所了解, 一个对该领域完全不了解, 完成该领域同样任务的效率差了不止一个数量级. 这就是我们通常所说的”经验”的作用, 这种经验可以看作是知识积累,
一个程序员的知识积累很大程度上决定了其解决问题的能力.
有意思的是, 因为经验这个事情不太好有准确的衡量标准, 我们为了简单, 常常就拿工作几年说事, 但是这种粗暴的标准有很大的问题, 工作年限同样长的人水平差异可以是巨大的.
按老话说, 用一年的经验工作二十年并不等同于二十年工作经验.

自学能力

这是一个知识大爆炸, 知识刷新频率让人无法追赶的时代. 一方面, 面对一个稍有难度的任务, 难免会有超出自己现有的知识范围的时候, 此时自学能力决定了你能多快的完成此任务(或能否完成此任务). 另一方面, 你的自学能力决定了在平时的工作过程中, 你积累知识的多少.
自学能力强的人, 即使没有人指点也总能在项目的代码中学到东西. 而反过来, 学习意愿弱的人写的代码被别人重构后, 也不会想想, 这段代码是否改的更好了以及为什么. 同时, 一个自学能力强的人也更有希望主动的在业余去学习更多的知识, 而不是直到工作中碰到才去被动学习.
从较长的尺度上(比如一个人的工作生涯)来看, 一个程序员知识积累的多少只决定于其自学能力和他对编程本身的兴趣.

品味

本来我是想把一个程序员的品味单独列出来的, 后来仔细想想, 一个程序员的品味其实不是一种天生的能力, 而是基于现有知识的积累, 形成的对事物的看法. 所以把品味放在自学能力下面的. 同样的, 其实通常说的正确的思维模式和方法, 其实也是来自于知识的积累. 这里我就根本不提这一条了.
品味往往用于形容一个人对时尚衣着, 食物等的看法, 其实对程序员来说, 品味也很重要.
不同的品味不仅决定了不同的语言设计者怎么设计编程语言, 也决定了一个程序员在做项目时会使用什么语言, 什么框架. 不同的品味决定了你会选择什么样的操作系统, 什么样的工具, 用什么样的代码规范.
不同的品味甚至还决定了你会选择什么样的职业发展方向, 什么样的平台, 开发什么东西.
对代码的品味决定了你看到一段不好的代码就能”闻到坏味道”, 对解决方案的品味决定了你在 开源/闭源, 激进/保守, 简单/功能强大但复杂 等解决方案之间的选择.
对于代码的品味, 我觉得没有什么比The Zen of Python更有意思的了:

关于品味, 想顺便提及的是对设计的品味, 比如一个网站的设计, 一个博客的设计. 我最开始写博客是在CSDN(http://blog.csdn.net/vagrxie), 最大的好处就是免费, 并且不用我维护, 但是后来慢慢的就感觉模版风格没有符合我品味的, 而修改模版又麻烦, 弹出框也挺烦人的, 写文章的方法也尝试了很多, 总没有找到一个合适的. 建了独立博客后(http://www.jtianling.com), 刚开始就是照搬了酷壳的模版, 然后在线写, 后来感觉模版看着不舒服, 自己从wordpress的默认模版上改了一套自己的, 主要的改进就是文章内容页面改为了合适宽度的单独一列, 代码段用pygments的default风格做高亮, 因为我觉得这样才适合阅读并且美观, 而写博客的方法在在尝试了很多方法后, 现在使用Vim + markdown来写, 用git管理, 感觉很顺手. 在最新的服务器中, 我甚至把apache改成了lighttpd, 一起下来花费的时间可真不少, 花了那么多功夫, 其实仅仅是对自己品味的追求而已.

这里顺便推荐两篇关于品味的文章, 虽然和本文没有太大关系:

  • 程序员的品味说: 如果你不在乎博客给人的第一印象如何,我不相信你对文章质量能有多在乎.
  • 创造者的品味认为品味不是主观的, 就是有客观的好坏.

了解正确的做事方法

这里提及的正确的做事方法不是指写代码这个层面上的, 而是指一个项目进行过程中碰到问题的解决方法, 比如在需求不明确的时候知道需要先明确需求, 知道自己需要先理解问题了然后再开始真正的进入代码层面的工作, 知道碰到什么问题能自己独立的解决, 知道碰到什么问题自己需要先和其他人沟通了再决定. 知道自己需要先测试才能保证自己代码的质量等.
这些问题说起来简单, 但是不这么做的话, 常常带来让人无语的后果. 一个好的程序员, 起码要先了解这些.

沟通的能力

知识的积累很大程度上决定了一个程序员解决问题的能力, 但那好歹是只要努力就能学到的东西, 而以下这些, 我甚至都不明白差异的形成是在我们很小的时候就定下来了, 还是在工作中还能继续学习.

在一个分工明确的项目中, 程序员需要和产品(策划)沟通以理解产品, 和上级沟通以理解自己的任务, 和同事们沟通以正确的理解要接入的模块. 无论哪一个方面沟通出了问题都不是小事情, 同时, 程序还需要正确的给产品(策划)传达设计的实现难度, 以及在自己完成模块时让别人正确的理解模块的接口. 在不写文档时, 正确的口头沟通非常重要, 需要写文档时, 文档的写作能力也算做是沟通能力的一部分.
如上所述, 沟通的能力非常重要, 但是好的程序员似乎天生就不太会沟通, 你会发现很多技术顶尖的人, 其实本身就是有社交障碍或者自闭症, 因为自闭, 才能心无旁骛的潜心钻研技术, 达到更高的技术水平, 很难想象一个”社会活动家”, 他哪有那么多功夫去学习, 没有时间学习, 又怎么能成为一个技术顶尖的人. 这是一个两难的问题. 就理想的情况来看, 一个程序员最好是沟通能力足够好(能正确完成上述沟通工作), 但是又能足够的静下心来学习和钻研. 当然, 这是最理想的情况, 在实际中, 两者之间的较大波动范围都算是可以接受的好程序员标准.

对工作负责, 对代码有追求

对工作态度消极, 代码总等到别人来测试, 写代码以完成功能为唯一标准, 也不管bug是否成堆, 代码是否丑陋不堪, 这种程序员就算是工作一万年也成不了好程序员.
一个好程序员就该对自己的工作负责, 对自己的代码有追求, 不仅要完成功能, 还要代码优美, 不说要把代码写成艺术品, 起码也要当作自己的脸面来维护. 一个程序员不能容忍自己的脸上乱七八糟, 那么也同样不应该能容忍自己的代码乱七八糟.
事实上, 别的程序员在了解你之前, 先看到的是你的代码, 通过代码, 就能知道你是怎么样一个人. 项目紧, 随手写, 以后改都不能成为写烂代码的理由.
一个好程序员, 起码是想要把任务完成好的, 起码是想要把代码写好的, 不然如何能称其为”好”.

怎么提高自己解决问题的能力?

其实转了这么大个弯, 怎么样做一个好的程序员的问题可以转为问怎么提高自己解决问题的能力.
沟通能力, 对工作负责任的态度, 对代码的追求, 很大程度上由性格决定, 我不知道实际中怎么简单的去提高, 这里只稍微的谈谈我对知识积累的一些看法吧.

  1. 培养兴趣(我也不知道兴趣究竟能不能培养), 技术工作总是辛苦的, 编程尤其如此, 假如你对此没有浓烈的兴趣, 不能从编程本身找到很多乐趣, 那最好就不要奢求能成为一个好的程序员了. 对编程的兴趣也是我一般招聘初级程序员时最大的要求.
  2. 什么样的环境决定你有什么样的知识积累过程, 决定了你的品味, 决定了你会以什么方式来做事. 这个除非有强大的意志力(极少见), 不然概莫能外. 所以, 慎选你的工作环境, 特别是刚毕业的时候.
  3. 不要停留在自己学习的舒适区, 假如你的工作仅仅是以前工作的简单重复, 你会工作的很轻松, 同时, 也很难有提高.

分类:  编程 
标签:  programmer  程序员 

Posted By 九天雁翎 at 九天雁翎的博客 on 2013年05月03日

前一篇: Mac及Android环境下的JNI学习 后一篇: 又一本被过于抬高的普通之作 -- 小评代码整洁之道