程式設計師生存定律--細論軟體這個行當的根本特徵
程式設計師生存定律這系列的目錄在這裡:程式設計師生存定律--目錄
喜歡從頭瞄的,可以移步。
------------------------------------------------------------------------------
規律是必須順應而不能改變的,但除此之外現實中還有一些事實也是無法改變的,這兩者都很像程式中的常量,想提高人生的高度則需要同時駕馭這兩者,而不能試圖為兩者賦值。下面我們就一起來看一下,軟體世界中只能順應,而不能試圖改變的特質有那些。
技術更迭偏快
在學校裡,動力機械類專業往往會學習一門叫工程熱力學的課程,如果耐心翻閱就會發現雖然封皮換了,但這門課程現在的教科書和五幾年的教科書其實差別不大,熱力學第一定律還是那個熱力學第一定律。
與之相對應《C#高階程式設計》這本書在2005年還是第三版,但到2011年已經出到了第七版,頁數則從1027頁增加到了1473頁。
這看著是一個很小的不同,但實際上已經摺射出了軟體行業的一個根本特質:技術更迭、增加速度較快。
技術更迭較快說的是這樣一種現象:今天有價值的,明天可能會貶值為0。
在軟體行業裡,你所依賴的某一平臺或語言很容易產生更迭。單以Windows平臺而論,10幾年前很多人只有Win32 API好用,但一個人如果只停留在Win32 API裡,是不太能適應今天的軟體開發的---雖然沒有官方統計,但感受上在今天Web開發、手機終端開發明顯比Windows開發要火熱。
這也許源自於這樣一種現實,很多傳統行業的技能直接依賴於某種自然規律,如:熱力學、流體力學、材料力學等等。這些東西自身只會深化或細化,比如從牛頓定律到相對論,但很少會有顛覆性變化。但軟體開發所需的東西(API
同時一旦公司因為某種原因倒閉,這一公司所支撐的技術也會變得淹沒無聞。
1995前後開始從事這個行業的人很多都會知道Delphi,但我估計2005後加入這個行業的人就會對這個東西感覺陌生了。我們很難去深究原因,但至少現象上來看,Delphi這樣的開發平臺隨著Borland一起遠去了。當然,與之一起遠去的還有Delphi世界裡的很多牛人。
極端來講,如果Windows徹底打輸了當前移動終端這場戰爭,那麼靠Windows
可以打一個比方來使這種差異更形象一點:
好比說兩個不同的人,一個在傳統行業一個在軟體行業,兩個人都很勤奮,不停的往自己腳下墊東西,努力使自己達到更高的位置。傳統行業中的人比較自然的會越墊越高,而軟體行業中的人則會墊到一定時候,突然間某幾塊磚就會消失了。
這倒並不意味著軟體行業中並非沒有具有較長生命價值的東西,但這些東西往往集中在一些特定的領域裡,牽涉的從業人員比較少因此不太具有代表性。
具有長久價值的東西里面最典型的東西是通用資料結構和演算法,今天的排序演算法在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已經可以開始工作了。
當然,後勁不足可能會把不思進取的軟體開發人員限制在某個範圍內,比如說只能做應用級的開發,最終讓他們等待淘汰。
軟體的這個特質,也導致了軟體開發人員所特有的一些問題,比如:如果自身沒有突破,那麼很容易就會被海量的後來者趕上。這點的影響也將在後續章節裡陸續提到。
那門檻可以低到什麼程度?
以著名的北大青鳥為例,其公開資料是累計培養了50萬IT人才,均攤到10年裡,這麼一家培訓機構每年就可以提供大概5萬人。當然這其中不都是程式設計師,但從北大青鳥的角色來看,其中的主體部分是程式設計師。而國內的培訓機構則遠不止北大青鳥一家。這是量的視角。
如果你再細心去關注北大青鳥公開出來的故事,你就會發現,高考落榜者、酒店保安、流水線工人都在介入這個行業。這裡並沒有一點歧視任何人出身的意思,而只是想說,這個行業的介入門檻相對比較低。
而同時我們也很難講,只有做編譯器的、檔案系統、MapReduce的才是程式設計師。也許有的人做的工作更難,而有的人做的工作則相對容易,但不管怎麼樣,大家確實是屬於同一個行業,都叫程式設計師。
軟體和軟體差別可以很大
我在《完美軟體開發:方法與邏輯》這本書裡曾經寫過一段有點抽象的話:
從特質上來看,既然軟體是固化的思維,那就必然同時具備思維以及思維所承載之物之特質。
- 思維的特質是指:思維的澄清通常是漸進的,思維自身是不可度量的,思維的主體一定是人,思維通常由概念和邏輯組成,思維的無邊界化(靈活易變)這樣的特質。這部分特質是共通部分,同時屬於所有軟體。
- 思維承載之物之特質是指:當思維的物件是數學的時候,思維本身也就具備了數學的特質;當思維的物件是商業邏輯的時候,思維自身也就具備了商業邏輯的特質。
既然思維自身的特質是複合的,那麼作為固化思維的軟體,其特質必然也是複合的:
既有屬於所有軟體的共同特質,也有特屬於某類軟體,甚至同其他類軟體完全相反的獨有特質。
上述文字主要想強調的是雖然都是軟體但軟體A和軟體B可以有相似部分,但差異可能更大。一個人可能研究OCR演算法好幾年最終只寫幾百行程式碼,完全不需要用什麼面相物件和設計模式,但在資訊管理系統中一個人一兩天內可能就需要寫幾百行程式碼。這兩者雖然有巨大差異,但實際上都會被稱作軟體。
這種特質導致了軟體開發所需要的知識日益的分化,最終結果就是不同軟體領域差別很大。想用唯一的知識體系覆蓋所有的軟體類別變的非常困難。
對方法論而言,基於這一點最關鍵的一個引申結論是:任何一種方法論不只要陳述自己的方法,還要陳述自己方法的適用邊界。
對個人發展而言,那就意味著要關注知識的可流動性這類問題。可流動性是說,你在A類軟體中可能達到了一定高度,但如果穿越到了B類軟體的領域中,可能江湖地位會一下子下降很多。
通俗的說法是:男怕入錯行,不同的軟體種類也勉強可以被看做是不同的行業,雖然他們都用一個詞:軟體來概括。
這一特質也帶來很多非常典型的問題,比如:學習必須聚焦。這點的影響也將在後續內容裡陸續提到。
那多內部分野可以多到什麼程度?
要想對多內部分野這一點有個直觀感覺,最直接的方法是去看招聘廣告。
有以語言來區分職位的:.net開發工程師、C++軟體開發工程師、PHP開發工程師、Java工程師等。
有以平臺來區分職位的:Android開發工程師、iPhone遊戲軟體開發工程師等。
有以領域來區分職位的:GIS資料工程師、金融專案軟體工程師、電子商務軟體工程師等等。
接下來還會有各種交叉,比如:Java軟體工程師(金融)等。
這裡面未必沒有重疊,但大致上來講很難在彼此間穿越,年頭越多穿越越難。
如果覺得這個分類不是很系統,那麼可以參照軟體工程中對軟體的分類,再乘上平臺和程式語言就可以切分出大致不同的領域:
- 航空電子
- 應用系統
- 命令與控制
- 嵌入式系統
- 微程式碼
- Web應用
- 科學研究和工程研究
- 實時系統
- 驅動程式
- 電信軟體
- ... ...
最極端的情形是也不用分什麼軟體種類,一個專案的整個生命週期就能耗盡一個人一生中大部的能量,想嘗試的可以維護個電信或銀行裡的大系統試試。
------------------------------------------------------------------------------
關於我自己的各種資訊,在左邊欄可找到,想了解下寫這系列文章的人是不是騙子和大忽悠的可以瞄。
最後希望感興趣的支援V眾投,感覺上這應該是國內最靠譜的生活購物等的問答社群了吧,都是朋友給朋友做的答案,同時實行一人一號,一人一票制度,想找什麼答案關注公眾號:vzhongtou(左側有二維碼)就行了。