和老同事的談話:關于職業生涯以及MDA
應該是bigtall在2007年度的最后一篇了,雖然2007年欠了大家很多帳,但是繼續寫應該是在2008年的事情了,很多時候非常有想法的東西,真正到落筆的時候,還是會發現欠缺許多東西,所以很多時候猶豫再三,還是不敢落筆。請大家見諒!
今天有機會見到了以前共事的同事XJ,在KFC海闊天空談了很多,主要都是集中在各自工作和技術方面,有點啟發,所以寫下來備忘。大家簡單看一個意思就行了。
以前覺得年齡不是一個問題,現在想來其實還真是一個大問題,不知不覺都是30出頭的人了,眼看著就要“奔四”,這個日子是慢慢的后半段不如前半段長了。今后的職業生涯怎么變化,也成了一個越來越需要思考的問題。什么是“有出路”的職業?我們經過討論,覺得定義應該是“一個不需要改行可以一直做到退休的職業”就是一個“有出路”的職業。但是現在的職業真的是一個“有出路”的職業嗎?
1.年齡問題
還記得20多歲的時候曾經想著30歲的程序員會不會有人要?結果現在發現30歲的程序員其實很厲害,并沒有想象中的“沒人要”的情況,相反是一個“香餑餑”(不過也挺貴的)。再看看我們國外那些出書寫作的,都是四五十歲的。似乎看起來很不錯,但是在中國的我們到40、50的時候還會不會有人要?
2.自身問題
再看,其實周圍很多同事都已經轉行了,總體來說,30歲以后的程序員數量是呈現一個逐步減少的趨勢。30歲之后的程序員們的生活壓力卻是在不斷的加大:娶妻生子,還有房子(加息聽說過嗎?);但是自身的學習能力、身體狀況卻是跟20多歲的時候不一樣了,還記得bigtall大學時候40個小時可以只睡2小時,現在呢?沒有一兩天緩不過來!
3.競爭問題
軟件這個行業的新技術新思想層出不窮,所以學習是很重要的,如果不持續學習,就可能在下一波的技術浪潮中被淘汰。可是隨著年紀越大,學習能力就越弱,也許現在我們可以自豪地說自己是屬于剩下的20%,但是我們50歲的時候還可以這樣保證?跟20歲的人比還是跟50歲的人比?
4.軟件技術發展的問題
曾經有一段時間國內有些人叫囂什么“軟件藍領”。bigtall認為喊早了,軟件開發領域的職責分工隨著整體水平的提高逐漸變得越來越細(10年前聽說過哪家公司招聘SQA嗎?),到時候別說是“軟件藍領”,就是“軟件背心”出現也是遲早的事情,但是這個前提應該是分工更加細致的時候,不會是現在,恐怕也不會是2020年(也就是我們50歲)之前。但是這個是一個持續漸進的過程。MDA概念的出現,其實就是標志著“軟件藍領”慢慢出現過程的開始。用bigtall自己的信條可以來解釋這個發展趨勢“如果人確實是不可靠的話,就盡可能讓機器來做”。當然,編碼是目前馮諾依曼體系的計算機軟件開發中必不可少的部分,正是因為機器不可能替代一切,所以未來會出現“軟件藍領”,當然也會出現“軟件金領”(記得C#的設計者嗎?)。
面臨這樣的趨勢,如果不因勢而變,要想自己的“奶酪”不被人動都很難。
5.公司發展的問題
其實小公司壯大成為大公司的概率比我們想象的都要小。那些成型的大公司(或機構),比如NASA(美國宇航局)、IBM、Microsoft甚至華為,他們的軟件開發模式已經基本成熟,可以開發出高質量的軟件,而且收入不小,他們有能力從人群中選擇最優秀的人為他們服務,而且更會培訓新人、挖掘人才。慢慢地,他們的軟件開發形成了一種正向循環:好公司-好人-好制度-好軟件-好收入-更好的公司-更好的人-更好的制度...
相比小公司,因為能力所限,所以會做很多短期工作,導致產品運行、維護代價太大,有不容易找到合適的人,也少有資源去培訓員工,慢慢地就走向了一種負面循環:小公司-軟件質量問題-收入減少-員工流失-更小的公司...除了那些有決心摒除軟件開發中短視行為的公司,并且有合適的機遇,才能壯大成為大公司。其他的基本都沒有未來
那么,小公司能提供給我們“有出路”的職業嗎?大公司又能提供幾個?要進大公司,又有幾個人能入他們的“法眼”呢?
總之一句話:有危機感,也有機會。
接下來談一下MDA的事情。因為bigtall這兩年一直在關注這個問題,但是目前的軟件開發現狀一直不能令bigtall滿意。我們目前的軟件開發已經進入了“組件化”的時代,但是顯然現在的“組件化”帶來的好處并不如想象的那么大。
bigtall一直很羨慕IC行業的做法,他們用一塊塊集成電路用幾個線連一下就可以弄出這么多神奇的東西,從電視到電腦,從手表到手機,從火箭到衛星(注:我說的是硬件范疇)...雖然是差異性很大的領域,但是他們基本都會用到相同的IC(航天領域的對可靠性要求有不同,但是IC模塊信號差異不大)。但是相比我們的“組件”,“集成電路(IC)”的通用性確實要大的多。為什么?
通過和XJ的探討,我們認為IC和“組件”的接口規范是一致的:一定規則的輸入,一定規則的輸出。但是IC的輸入輸出是“信號”,而“組件”的輸入輸出卻是“數據”。不同信號之間的差別,無非集中在電壓、電流、頻率三個方面,而且這三個方面都相對獨立,可以單獨拿出來處理;但是“數據”之間的區別卻太大了。我們的“組件化”過多地強調了“接口規范”但是卻忘記去屏蔽掉“數據”之間的差異,而更要命的是計算機程序不僅和“數據”,而且和“數據結構”之間的耦合實在是太緊密了。泛型(Generic)的出現主要是解決了“代碼”和“數據結構”之間的耦合過緊的問題。繼承(Inherit)和實現(Implement)的出現部分解決了數據的差異。但是“組件”是一個運行時的東西,所以泛型對“組件”和“數據結構”之間的解耦沒有幫助。真正的“組件化”時代,bigtall認為還要有“設計時”“組件”的支持。
“設計時組件”的應用場景就是在MDA中。只有“設計時組件”出現,才能解決“組件”和“數據結構”之間耦合過緊的問題,才能提供真正類似于IC應用那樣的水平的“組件”。兩年前參加過一個“華羅庚軟件”公司的推廣會(他們老總自稱是華老的弟子),這個公司致力于把“數據流圖”可執行化,也就是通過設計器把各種設計好的模塊像積木一樣連起來,最終形成一個應用程序。這個思路很好,但是軟件bug太多,聽半路就走了。
可見軟件開發的“積木化”是很多人的理想,一個“積木式”的軟件模塊無非就是若干個輸入,若干個輸出罷了。bigtall把這種“積木化”的模塊用一個漢字“米”來表示:橫線表示區域界線,也可以表示“積木”本身,橫線上面的三個筆畫表示輸入,橫線下面的部分表示輸出。現在的情況是做一個“米”比較容易,要把一堆“米”做成一個熟飯卻是相當的不容易。我們目前的“組件化”看起來依然是在“一粒生米”的階段,離煮成“一鍋熟飯”的時候還早得很。
如果我們不僅有“運行時組件”也有“設計時組件”的話,加上每一個步驟的“可自定義”特性,我想MDA就會讓編程進入一個新的時代。10年前流行的4GL并沒有帶來什么太大改變,但是以MDA以及類似的概念恐怕會帶來深刻的變化。bigtall和XJ曾經談到了MDA代碼生成的反向工程問題,提出了一個疑問:軟件行業普遍存在著不設計就進行編碼的問題,但是電子行業似乎沒有這個做法,他們都是仔細地計算每一個IC的輸入輸出參數,然后裝板調試,從來沒有說是把IC先接起來,然后再去設計或者“補設計”。道理很簡單,IC隨便連起來會燒片子的,會有實際現象(比如火光、閃電等)和真實的物品的損失,現實不容許他們這么做。但是軟件太靈活了,而且損失的“時間”對很多人來說無所謂(不珍惜時間算不算民族劣根性?),所以我們會有“先實現后設計”的奇怪而荒謬的做法。其實仔細想想,真的我們實現代碼的時候沒有“設計”過程?不是,我們都是要想好了才能去動手的,只是不習慣去把設計用文字和圖畫形式表現出來,穩定下來之后再去編碼而已。如果MDA成為了軟件開發的主要方式,這種“先實現后設計”現象自然就銷聲匿跡了。
當然,要真正深入去探索MDA,路還很長!
祝大家元旦快樂!新的一年里,事業順利!進步!

公眾號:老翅寒暑
浙公網安備 33010602011771號