我見過兩種程序員,一種是想做事的,一種是混飯吃的。

第一種人最容易犯兩個錯誤,一是過度優化,二是過度設計。兩種錯誤共同的原因是經驗不足,不同的地方是過度優化往往出於知其然不知其所以然,而過度設計一般是想得太遠從而脫離實際。

比如我見過的一個人,凡是聯表的語句,都要拆開來寫,完全不考慮這些聯表語句實際會不會發生性能問題。這就是過度優化,只記住一些成例和範式,不從實際出發,膠柱鼓瑟,刻舟求劍。聯表當然會造成數據量以笛卡爾積的形式增長,但如果所聯表的數據量並不大,或者通過限制條件過濾後的數據量不大,並不會出現性能問題,而拆開SQL語句會導致代碼量增大、可讀性下降,是得不償失的。

至於過度設計,我自己就是個很好的反面教材。剛工作的時候,我在寫程序之前和過程中會不斷地冒出新的想法,設想到很多種可能,為了照顧到這些可能性,我會不斷地重構程序,導致出活很慢。多數人並不會認真瞭解別人,只是從結果上武斷地下結論。所以關於我寫程序太慢的說法就悄悄流傳開,而那些程序寫得很爛、混飯吃但出活很快的人反而獲利頗豐。最可笑的是過了很長時間後回顧曾經設想到的可能性,幾乎全部沒有發生。為一些將來可能發生而實際沒有發生的可能性,在一開始就花費更多的成本,這就是過度設計。

不過經驗作為知識存量,是不值錢的,假以時間,有一定認知水平、不甘於庸俗的人總可以積累得到。所以相對於第二種人,我寧願和第一種共事。