程序員生存定律--細論軟件這個行當的根本特徵

程序員生存定律這系列的目錄在這裏:程序員生存定律--目錄

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

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

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

技術更迭偏快

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

與之相對應《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內部數據結構

4Windows圖形系統窺視

5章 圖形設備抽象

6章 座標空間和變換

7章 像素

8章 直線和曲線

9章 區域

10章 位圖基礎

11章 高級位圖圖形學

12章 用Windows位圖進行圖像處理

13章 調色板

14章 字體

15章 文本

16章 元文件

17章 打印

18DirectDrawDirect3D立即模式

如果你仔細觀察,你會發現其中第一章,第四章牽涉的是一些基礎知識,比如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應用
  • 科學研究和工程研究
  • 實時系統
  • 驅動程序
  • 電信軟件
  • ... ...

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章