我见过两种程序员,一种是想做事的,一种是混饭吃的。

第一种人最容易犯两个错误,一是过度优化,二是过度设计。两种错误共同的原因是经验不足,不同的地方是过度优化往往出于知其然不知其所以然,而过度设计一般是想得太远从而脱离实际。

比如我见过的一个人,凡是联表的语句,都要拆开来写,完全不考虑这些联表语句实际会不会发生性能问题。这就是过度优化,只记住一些成例和范式,不从实际出发,胶柱鼓瑟,刻舟求剑。联表当然会造成数据量以笛卡尔积的形式增长,但如果所联表的数据量并不大,或者通过限制条件过滤后的数据量不大,并不会出现性能问题,而拆开SQL语句会导致代码量增大、可读性下降,是得不偿失的。

至于过度设计,我自己就是个很好的反面教材。刚工作的时候,我在写程序之前和过程中会不断地冒出新的想法,设想到很多种可能,为了照顾到这些可能性,我会不断地重构程序,导致出活很慢。多数人并不会认真了解别人,只是从结果上武断地下结论。所以关于我写程序太慢的说法就悄悄流传开,而那些程序写得很烂、混饭吃但出活很快的人反而获利颇丰。最可笑的是过了很长时间后回顾曾经设想到的可能性,几乎全部没有发生。为一些将来可能发生而实际没有发生的可能性,在一开始就花费更多的成本,这就是过度设计。

不过经验作为知识存量,是不值钱的,假以时间,有一定认知水平、不甘于庸俗的人总可以积累得到。所以相对于第二种人,我宁愿和第一种共事。