许多年前我刚开始学编程时,朋友曾说过一个笑话:差劲的程序员有两种,一种是开始就写 main 函数的;还有一种是上来就上网找各种类库源代码的。当时我并不能完全理解:编程序,不去找类库源代码,不从 main 函数开始,那要怎么做呢?后来才逐渐明白,上来就写 main 函数,或者上来就找类库找源代码,归根到底都是因为不能克制对于代码的冲动。直接写代码当然很“爽”,很有“成就感”。可是,这样做真的是好事吗?
在现实生活中,我确实看到相当多的程序员写代码的冲动相当强烈,甚至难以克制。这可能是因为任何软件都需要以代码的形式来实现,拿到一个任务,直接写代码可以为程序员带来强烈的成就感。在心里想个明白或在纸上写写画画,反而成了一种难以克制的煎熬。但有经验的人都知道,程序不等于代码,程序的含义和复杂性远远超过代码;没有明晰的需求,没有清楚的头脑,没有良好的规划,写出来的代码就成了无源之水,无本之木,写得越爽,后果可能越严重。
我曾经见过一套系统,其中充满了各种状态码的条件判断,这种情况本来很正常,不幸的是所有的状态码都是硬编码的数字,整个系统就是一本天书:一会儿判断这里是否等于2,一会儿判断那里是否大于7……究其原因是程序员觉得这些状态码无非就是“用数字代表状态”,所以随便选些数字就好了,2 代表什么,7 对应什么,自己记得就好了。更重要的是,硬编码的状态码“用起来方便”,敲代码的速度大大提升——不需要查找变量,也不需要输入整个变量名。这种系统的问题相信大家都猜得到,维护和修改起来无比痛苦。因此,尽管写这些程序的程序员已有一两年甚至更多年的工作经验,但很难说他们有“职业素养”。
与此相反,重构的人员吸取了之前的教训。虽然全部硬编码看起来不爽,用起来更不爽,人人都有立刻动手改掉它的冲动,但重构时不是首先改代码,而是先仔细阅读程序,编写了一份包含所有状态码的图表(并且打印出来供随时查阅),再根据状态码的意义和使用场景,重新设计状态码(因为各个状态之间还存在逻辑关系,所以需要以自定义类型表示状态),最后才动手编码完成重构。事实证明,这种策略是非常成功的:阅读代码、制定图表、重新设计需要三周的时间,真正的重构只用几天就顺利完成了,而且从此以后维护和修改的难度大大降低,真正达到了重构的目的。完成重构工作的程序员,工作经验并不比最初编写程序的人多,他们没有一开始就写代码,甚至没有花太多时间在代码上,更没有用到高深莫测的技术,但他们身上体现出来的,恰恰是可贵的职业素养。
几乎所有程序员都喜欢狂敲代码的快感,但职业程序员必须要克制写代码的冲动,在写代码之前花更多时间理解需求,设计系统,制定规划,这样写出来的代码才会更加精练,更加聪明,整个程序也因此更有价值。贡献更有价值的程序才是程序员职业素养的体现。
作者余晟,非正统技术爱好者,毕业于计算机系,副修中文,《正则指引》作者。