在眾多軟體相關的知識中,軟體工程絕對是很特別的一個。
很多人很鄙視軟體工程,說:我一看到軟體工程的書就直接略過;與之相對應,很多人很推崇軟體工程,會花很大的心思去研究敏捷、CMMI等。
剛入職場的程式員大致上是討厭軟體工程的,因為這東西離自己的實踐有點遠,並且主要是添加束縛。
但既然更加複雜紛繁的曆史都可以總結出規律,軟體開發沒道理就總結不出可以遵循的規律。
也許真的事實是:並不是軟體工程沒有用,而實在是很多軟體工程的書籍理論飄的太高,落地上有困難。
軟體工程一個很大的困境在於,它總是試圖以軟體整體為研究對象,但軟體的內部分野過多,不同種類的軟體間所適用的方法又充滿矛盾。
這最終就導致很多軟體工程理論往那裡落都有點困難。
而程式員或者專案經理這些現場的人往往是非常務實的,面對這種無法接地氣的東西,自然會猶豫和抵觸。
還是以前的那個觀點。
當一個人一個組織提倡一種方法時,不單要闡明方法自身,還要闡明方法自身的邊界。
CMMI,敏捷等等都不應該規避自己的有限性。
確實有無限適用於軟體的方法,但這種方法論必須基於軟體的根本特質。
對此我們可以講:
從特質上來看,既然軟體是固化的思維,那就必然同時具備思維以及思維所承載之物之特質。
- l 思維的特質是指:思維的澄清通常是漸進的,思維自身是不可度量的,思維的主體一定是人,思維通常由概念和邏輯組成,思維的無邊界化(靈活易變)這樣的特質。這部分特質是共通部分,同時屬於所有軟體。
- l 思維承載之物之特質是指:當思維的對象是數學的時候,思維本身也就具備了數學的特質;當思維的對象是商業邏輯的時候,思維自身也就具備了商業邏輯的特質。
既然思維自身的特質是複合的,那麼作為固化思維的軟體,其特質必然也是複合的:
既有屬於所有軟體的共同特質,也有特屬於某類軟體,甚至同其他類軟體完全相反的專屬特質。
這是兩條完全不同的處理軟體工程的方法,都有前途。
要麼你基于思維的特質去演繹軟體工程,要麼你基於具體的情境去演繹,但要闡明限度。
最怕兩者都不靠,那就導致內部矛盾,成為一種軟體工程自身的困惑。
那軟體工程自身究竟有沒有一種有效邊界?
如果把所有影響軟體的因素都涵蓋於軟體工程之內,那麼這事兒就變成無邊界的了,財務、公司運營、市場營銷全對軟體有影響,如果把他們都包含到軟體工程的概念內,
軟體工程就變成了四不像,什麼都是可也什麼都不是。
這點上可以向經濟學家取經,經濟學家研究經濟學的方法是:先假設某些因素不發生變動,進而觀察幾個特定因素的變化和關係。
我們可以先抽去商務因素、市場因素對軟體的影響,尋找本質規律,再把商務因素、市場因素的權變加回來,看看如何彎曲本質規律以適應現實。
好比我們畫圓的時候畫出的圓總是不理想的,但只要我們知道了圓的理想方程,我們就總可以畫出儘可能完美的圓。
從學習軟體工程的角度看,也許從《代碼大全》這書開始是個不錯的主意,這書裡即講軟體全體,又講軟體開發的細節,只要是寫過程式的人,大致都可以從中吸取養分。
個人感覺軟體工程在國內的一個困境是名詞始終在不停的變換,但實際起作用的卻不多,最終導致剛對一個絕望,就開始對新的一個報以希望這樣周而復始的狀況。
這種狀況也許有其更深層次的原因,比如短期內市場、生存壓力等維度上的力量過於強大導致工程力量的長遠價值被漠視,進而使方法論並不為解決現實問題而存在,而是為了認證而存在。
本質來看卻一定不是軟體工程毫無價值。