1. 程式人生 > >程式設計師生存定律--細論軟體這個行當的根本特徵

程式設計師生存定律--細論軟體這個行當的根本特徵

程式設計師生存定律這系列的目錄在這裡:程式設計師生存定律--目錄

喜歡從頭瞄的,可以移步。

------------------------------------------------------------------------------

規律是必須順應而不能改變的,但除此之外現實中還有一些事實也是無法改變的,這兩者都很像程式中的常量,想提高人生的高度則需要同時駕馭這兩者,而不能試圖為兩者賦值。下面我們就一起來看一下,軟體世界中只能順應,而不能試圖改變的特質有那些。

技術更迭偏快

在學校裡,動力機械類專業往往會學習一門叫工程熱力學的課程,如果耐心翻閱就會發現雖然封皮換了,但這門課程現在的教科書和五幾年的教科書其實差別不大,熱力學第一定律還是那個熱力學第一定律。

與之相對應《C#高階程式設計》這本書在2005年還是第三版,但到2011年已經出到了第七版,頁數則從1027頁增加到了1473頁。

這看著是一個很小的不同,但實際上已經摺射出了軟體行業的一個根本特質:技術更迭、增加速度較快。

技術更迭較快說的是這樣一種現象:今天有價值的,明天可能會貶值為0

在軟體行業裡,你所依賴的某一平臺或語言很容易產生更迭。單以Windows平臺而論,10幾年前很多人只有Win32 API好用,但一個人如果只停留在Win32 API裡,是不太能適應今天的軟體開發的---雖然沒有官方統計,但感受上在今天Web開發、手機終端開發明顯比Windows開發要火熱。

這也許源自於這樣一種現實,很多傳統行業的技能直接依賴於某種自然規律,如:熱力學、流體力學、材料力學等等。這些東西自身只會深化或細化,比如從牛頓定律到相對論,但很少會有顛覆性變化。但軟體開發所需的東西(API

)往往依賴於某一個公司或組織,比如微軟、蘋果等,進而是一種人造系統。一旦社會基本需求發生變化,這些公司或組織就必需不斷的拋棄並更新自己的系統,比如:GDI -->GDI+ -->WPF

同時一旦公司因為某種原因倒閉,這一公司所支撐的技術也會變得淹沒無聞。

1995前後開始從事這個行業的人很多都會知道Delphi,但我估計2005後加入這個行業的人就會對這個東西感覺陌生了。我們很難去深究原因,但至少現象上來看,Delphi這樣的開發平臺隨著Borland一起遠去了。當然,與之一起遠去的還有Delphi世界裡的很多牛人。

極端來講,如果Windows徹底打輸了當前移動終端這場戰爭,那麼靠Windows

吃飯的人(包括研究Native API的和研究.net framework的)無疑的都有貶值的風險。

可以打一個比方來使這種差異更形象一點:

好比說兩個不同的人,一個在傳統行業一個在軟體行業,兩個人都很勤奮,不停的往自己腳下墊東西,努力使自己達到更高的位置。傳統行業中的人比較自然的會越墊越高,而軟體行業中的人則會墊到一定時候,突然間某幾塊磚就會消失了。

這倒並不意味著軟體行業中並非沒有具有較長生命價值的東西,但這些東西往往集中在一些特定的領域裡,牽涉的從業人員比較少因此不太具有代表性。

具有長久價值的東西里面最典型的東西是通用資料結構和演算法,今天的排序演算法在10年後必然同樣具有價值,但專門從事演算法優化改良的畢竟是少數。可以講大部分人群還是處在技術更迭的大潮之中。此外,圖形演算法、分析設計方法等也具有穩定且長久的價值。形象來講似乎越抽象、越偏向於研究的東西其價值越長久,而越具體、越立刻可用的東西其時效性就越強。 

這一基本特質的影響非常深遠,甚至引出了學習可能會產生較大負效應這類比較特別的問題,這點將在後續內容中陸續有所陳述。

為了讓大家對技術更迭有一個更直觀的印象,我們來看一下袁峰先生所著的《Windows圖形程式設計》的目錄,並看一下這本書裡那些東西在過去的10年裡被更迭掉了,而那些沒有?目錄有點長,但為了能把事情說清楚,我還是把它整個貼出來:

1章 基本技術和知識 

2章 Windows圖形系統體系結構 

3章 GDI/DirectDraw內部資料結構 

4章 Windows圖形系統窺視 

5章 圖形裝置抽象 

6章 座標空間和變換 

7章 畫素 

8章 直線和曲線 

9章 區域 

10章 點陣圖基礎 

11章 高階點陣圖圖形學 

12章 用Windows點陣圖進行影象處理 

13章 調色盤 

14章 字型 

15章 文字 

16章 元檔案 

17章 列印 

第 18章 DirectDraw和 Direct3D立即模式 

如果你仔細觀察,你會發現其中第一章,第四章牽涉的是一些基礎知識,比如Windows 基本結構、如何Hook API等,因此雖然部分內容有點過時,主體上仍然是有現實意義的。

第十章、第十一章、第十二章主要和點陣圖格式相關,而點陣圖格式變化不大,所以這幾章的主體部分仍然是有現實意義的。

第十四章主要講的是字型,而Truetype字型即使在今天也是字型的主流,因此也還是有現實意義的。

其他的章節則因為主要是和GDI相關聯大致上是過時了(不意味著完全沒用),也就是說18個章節裡只有6個章節還有較大的現實意義。

這本書在國內的出版時間是2002年,到2012年正好是間隔10年,10年時間淘汰了某一類技術差不多80%的內容。不知道還有那個行業會有這種淘汰率。

如果任何人以為書裡被淘汰的那80%的內容容易學,那就錯了,在當年即使是有Windows基礎程式設計知識的人(知道執行緒、訊息機制等)把這部分知識搞通至少也需要1年(工作後)。

介入門檻偏低

某一次喝酒的時候和幾個朋友閒聊,談到了自己的專業:

有的說我是學物理的,和核能有關係。

有的說我是學渦輪機的,這是主要動力機械,發電廠常用。

有的說我是學變壓器的,負責把電送出去。

聽了之後,其中一人大笑,說:你們幾個拼起來就是一個發電站,純屬打入軟體隊伍的雜牌。

雖然看不到具體數字,但就日常感受來看軟體行業中來自其他專業的人似乎確實偏多。這反過來就不成立,你很少聽說學軟體的跑去做數學了。

這背後隱含的是這樣一個事實:軟體行業介入的門檻相對比較低。雖然做到高處,很難講軟體就好做,機械就難做,但從介入壁壘來看,確實是軟體行業偏低。

如果去做動力機械,那麼要學習工程熱力學、傳熱學、材料力學這樣的課程,但如果要做軟體開發,那麼學好一門程式語言以及對應的IDE已經可以開始工作了。

當然,後勁不足可能會把不思進取的軟體開發人員限制在某個範圍內,比如說只能做應用級的開發,最終讓他們等待淘汰。

軟體的這個特質,也導致了軟體開發人員所特有的一些問題,比如:如果自身沒有突破,那麼很容易就會被海量的後來者趕上。這點的影響也將在後續章節裡陸續提到。

那門檻可以低到什麼程度?

以著名的北大青鳥為例,其公開資料是累計培養了50IT人才,均攤到10年裡,這麼一家培訓機構每年就可以提供大概5萬人。當然這其中不都是程式設計師,但從北大青鳥的角色來看,其中的主體部分是程式設計師。而國內的培訓機構則遠不止北大青鳥一家。這是量的視角。

如果你再細心去關注北大青鳥公開出來的故事,你就會發現,高考落榜者、酒店保安、流水線工人都在介入這個行業。這裡並沒有一點歧視任何人出身的意思,而只是想說,這個行業的介入門檻相對比較低。

而同時我們也很難講,只有做編譯器的、檔案系統、MapReduce的才是程式設計師。也許有的人做的工作更難,而有的人做的工作則相對容易,但不管怎麼樣,大家確實是屬於同一個行業,都叫程式設計師。

軟體和軟體差別可以很大

我在《完美軟體開發:方法與邏輯》這本書裡曾經寫過一段有點抽象的話:

從特質上來看,既然軟體是固化的思維,那就必然同時具備思維以及思維所承載之物之特質。

  • 思維的特質是指:思維的澄清通常是漸進的,思維自身是不可度量的,思維的主體一定是人,思維通常由概念和邏輯組成,思維的無邊界化(靈活易變)這樣的特質。這部分特質是共通部分,同時屬於所有軟體。
  • 思維承載之物之特質是指:當思維的物件是數學的時候,思維本身也就具備了數學的特質;當思維的物件是商業邏輯的時候,思維自身也就具備了商業邏輯的特質。

既然思維自身的特質是複合的,那麼作為固化思維的軟體,其特質必然也是複合的:

既有屬於所有軟體的共同特質,也有特屬於某類軟體,甚至同其他類軟體完全相反的獨有特質。

上述文字主要想強調的是雖然都是軟體但軟體A和軟體B可以有相似部分,但差異可能更大。一個人可能研究OCR演算法好幾年最終只寫幾百行程式碼,完全不需要用什麼面相物件和設計模式,但在資訊管理系統中一個人一兩天內可能就需要寫幾百行程式碼。這兩者雖然有巨大差異,但實際上都會被稱作軟體。

這種特質導致了軟體開發所需要的知識日益的分化,最終結果就是不同軟體領域差別很大。想用唯一的知識體系覆蓋所有的軟體類別變的非常困難。

對方法論而言,基於這一點最關鍵的一個引申結論是:任何一種方法論不只要陳述自己的方法,還要陳述自己方法的適用邊界。

對個人發展而言,那就意味著要關注知識的可流動性這類問題。可流動性是說,你在A類軟體中可能達到了一定高度,但如果穿越到了B類軟體的領域中,可能江湖地位會一下子下降很多。

通俗的說法是:男怕入錯行,不同的軟體種類也勉強可以被看做是不同的行業,雖然他們都用一個詞:軟體來概括。

這一特質也帶來很多非常典型的問題,比如:學習必須聚焦。這點的影響也將在後續內容裡陸續提到。

那多內部分野可以多到什麼程度?

要想對多內部分野這一點有個直觀感覺,最直接的方法是去看招聘廣告。

有以語言來區分職位的:.net開發工程師、C++軟體開發工程師、PHP開發工程師、Java工程師等。

有以平臺來區分職位的:Android開發工程師、iPhone遊戲軟體開發工程師等。

有以領域來區分職位的:GIS資料工程師、金融專案軟體工程師、電子商務軟體工程師等等。

接下來還會有各種交叉,比如:Java軟體工程師(金融)等。

這裡面未必沒有重疊,但大致上來講很難在彼此間穿越,年頭越多穿越越難。

如果覺得這個分類不是很系統,那麼可以參照軟體工程中對軟體的分類,再乘上平臺和程式語言就可以切分出大致不同的領域:

  • 航空電子
  • 應用系統
  • 命令與控制
  • 嵌入式系統
  • 微程式碼
  • Web應用
  • 科學研究和工程研究
  • 實時系統
  • 驅動程式
  • 電信軟體
  • ... ...

最極端的情形是也不用分什麼軟體種類,一個專案的整個生命週期就能耗盡一個人一生中大部的能量,想嘗試的可以維護個電信或銀行裡的大系統試試。

------------------------------------------------------------------------------

關於我自己的各種資訊,在左邊欄可找到,想了解下寫這系列文章的人是不是騙子和大忽悠的可以瞄。

最後希望感興趣的支援V眾投,感覺上這應該是國內最靠譜的生活購物等的問答社群了吧,都是朋友給朋友做的答案,同時實行一人一號,一人一票制度,想找什麼答案關注公眾號:vzhongtou(左側有二維碼)就行了