所謂軟體工程

yinwang發表於2015-07-06

  很多程式設計的人包括我,頭銜叫做“軟體工程師”(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%”的跳蚤藥,撒了好多在床上。第二天早上起來,發現又被咬了好多新的大包。妻子責怪丈夫,說他沒看說明書就亂撒。結果丈夫開啟說明書一看,內容如下:

本跳蚤藥使用方法:

  1. 抓住跳蚤
  2. 掰開跳蚤的嘴
  3. 把藥塞進跳蚤嘴裡
  4. 合上跳蚤的嘴

  我發現很多軟體工程的所謂方法論失敗之後的藉口,跟這跳蚤藥的說明書很像 :)

  人都想省錢,僱用高質量的程式設計師不容易呀,所以很多公司還是上鉤了。他們請這些“軟體工程專家”來到公司,推行各種各樣的軟體方法論,可是發現最後都失敗了。這是為什麼呢?因為再高明的方法論,也無法代替真正的,精華的電腦科學教育。直到今天還有很多公司推行所謂的Agile,煞有介事的搞一些stand-up meeting, scrum之類的形式主義東西,以為這些過家家似的做法就能提高開發質量和效率。很多開發人員也很把一些軟體工程的工具當回事,喜歡折騰Git,Maven等工具一些偏僻的“新功能”。他們很在乎所謂的版本控制,測試等東西,以為熟練的掌握這些就能開發出高質量,可靠的程式碼。可是你最後發現,無論你如何高效的使用這些工具,它們都只能起到輔助的,次要的作用。程式設計工具永遠不是程式本身,對程式設計工具的熟練掌握,永遠也無法代替真正的對程式和計算的理解。過分強調這些工具的使用,是本末倒置的,讓工程走上失敗道路的作法。

  程式設計真的是一門藝術,它完全符合藝術的各種特徵,程式設計界也充滿了藝術界的獨有特徵。有些初學藝術的人(比如10年前的我),總是挑剔手上的工具,非要用最新最炫的工具,用它們最偏僻最難用的“特性”,才覺得自己能夠做出優秀的作品。很多人照不出好的照片,就怪相機不好。買了幾萬塊錢的笨重高檔相機,照出來的照片還不如別人用手機照的。這些人不明白,好的攝影師和不好的攝影師,區別在於眼睛,而不是相機。一個真正的藝術家,可以用任何在手上的工具創造出色的作品。有些甚至可以用一些廢品垃圾,拙劣的工具,做出傑出的,別具風味的藝術品。因為藝術存在於人的心裡,而不在他們使用的工具裡面。

相關文章