所謂軟件工程
文/王垠
很多編程的人包括我,頭銜叫做“軟件工程師”(software engineer),然而我卻不喜歡這個名字。我喜歡把自己叫做“程序員”(programmer)或者“計算機科學家”(computer scientist)。這是為什么呢?這需要從“軟件工程”(software engineering)在現實中的涵義談起。
有人把軟件工程這個領域的本質總結為:“How to program if you cannot?”(如果你不會編程,那么你如何編程?)我覺得這句話說得很好,因為我發現軟件工程這整個領域,基本就是吹牛扯淡賣“減肥藥”的。軟件行業的大部分莫名其妙的愚昧行為,很多是由所謂“軟件工程專家”發明的。總有人提出一套套的所謂“方法論”或者“原則”,比如 Extreme Programming,Design Patterns,Agile,Pair Programming,Test Driven Development(TDD),DRY principle,…… 他們把這些所謂方法論兜售給各個軟件公司,鼓吹它們的各種好處,說使用這些方法,就可以用一些平庸的“軟件工程師”,制造出高質量低成本的軟件。這就跟減肥藥的廣告一樣:不用運動,不用節食,一個星期瘦 20 斤。你開頭還不以為然,覺得這些膚淺的說法能造成什么影響。結果久而久之,這些所謂“方法論”和“原則”成為了整個行業的教條,造成了文化大革命一樣的風氣。違反這些教條的人,必然被當成菜鳥一樣的鄙視,當成小學生一樣的教育,當成“反革命”一樣的批斗。就算你技術比這些教條的提出者還高明不知道多少倍也一樣。
打破這些軟件工程專家們制造的幻覺的一個辦法,就是實地去看看這些所謂專家們自己用這些方法論做出了什么好東西。你會驚奇的發現,這些提出各種玄乎其玄的新名詞的所謂“專家”,幾乎都是從不知道什么旮旯里冒出來的民科,沒有一個做出過什么有技術含量的東西,他們根本沒有資格對別人編程的方式做出指導。這些人做出來少數有點用的東西(比如 JUnit),其實非常容易,以至于每個初學編程的人都應該做得出來。可世界上就是有這樣劃算的職業,你雖然寫不出好的代碼,你對計算原理的理解非常膚淺,卻可以通過一些手段,得到評價別人的“代碼質量”的權力,占據軟件公司的管理層位置。久而久之,別人還以為你是什么泰斗。你仔細看過提出 Java Design Pattern 的四個人(GoF),到底做出過什么厲害的東西嗎?沒有。提出“DRY Principle”的作者,做出過什么好東西嗎?沒有。再看看 Agile,Pair Programming,TDD……的提出者?全都是一群飯桶。他們其實根本就不懂很多編程的東西,寫出文章和書來也是極其膚淺,一知半解。
所謂“軟件工程”,并不像土木工程,機械工程,電機工程,是建立在實際的,科學的基礎上的。跟這些“硬工程”不一樣,軟件弄得不好不會出人命,也不會跟做芯片的公司那樣,出一個 bug 立即導致上億的損失,身敗名裂。所以研究軟件工程,似乎特別容易鉆空子,失敗了之后容易找借口和替罪羊。如果你說我的方法不好,你有什么證據嗎?口說無憑,我浪費了你多少時間呢?你的具體執行是不是完全照我說的來的呢?你肯定有什么細節沒按我說的做,所以才會失敗。總之,如果你用了我的辦法不管用,那是你自己的問題!
想起這些借口我就想起一個笑話:兩夫妻睡覺發現床上有跳蚤,身上被咬了好多大包。去買了號稱“殺傷率 100%”的跳蚤藥,撒了好多在床上。第二天早上起來,發現又被咬了好多新的大包。妻子責怪丈夫,說他沒看說明書就亂撒。結果丈夫打開說明書一看,內容如下:
本跳蚤藥使用方法:
- 抓住跳蚤
- 掰開跳蚤的嘴
- 把藥塞進跳蚤嘴里
- 合上跳蚤的嘴
</ol> </blockquote>我發現很多軟件工程的所謂方法論失敗之后的借口,跟這跳蚤藥的說明書很像 :)
人都想省錢,雇用高質量的程序員不容易呀,所以很多公司還是上鉤了。他們請這些“軟件工程專家”來到公司,推行各種各樣的軟件方法論,可是發現最后都失敗了。這是為什么呢?因為再高明的方法論,也無法代替真正的,精華的計算機科學教育。直到今天還有很多公司推行所謂的 Agile,煞有介事的搞一些 stand-up meeting, scrum 之類的形式主義東西,以為這些過家家似的做法就能提高開發質量和效率。很多開發人員也很把一些軟件工程的工具當回事,喜歡折騰 Git,Maven 等工具一些偏僻的“新功能”。他們很在乎所謂的版本控制,測試等東西,以為熟練的掌握這些就能開發出高質量,可靠的代碼。可是你最后發現,無論你如何高效的使用這些工具,它們都只能起到輔助的,次要的作用。編程工具永遠不是程序本身,對編程工具的熟練掌握,永遠也無法代替真正的對程序和計算的理解。過分強調這些工具的使用,是本末倒置的,讓工程走上失敗道路的作法。
編程真的是一門藝術,它完全符合藝術的各種特征,編程界也充滿了藝術界的獨有特征。有些初學藝術的人(比如 10 年前的我),總是挑剔手上的工具,非要用最新最炫的工具,用它們最偏僻最難用的“特性”,才覺得自己能夠做出優秀的作品。很多人照不出好的照片,就怪相機不好。買了幾萬塊錢的笨重高檔相機,照出來的照片還不如別人用手機照的。這些人不明白,好的攝影師和不好的攝影師,區別在于眼睛,而不是相機。一個真正的藝術家,可以用任何在手上的工具創造出色的作品。有些甚至可以用一些廢品垃圾,拙劣的工具,做出杰出的,別具風味的藝術品。因為藝術存在于人的心里,而不在他們使用的工具里面。
來自: www.yinwang.org