很多程序員,在很多的時間,都會說出很多相同的話來,其中最為引起共鳴的就是這么一句話:“每天都要學習新知識,不然就會被淘汰”。
嗯,這真是件很辛苦的事情,你看,老中醫(yī)就過得很輕松,收銀員也過得很輕松,官員當然過得更輕松。沒別的,絕大多數(shù)正常的人類,學會一種技能,則無需進一步學習其他的,大致上就能夠或輕松或艱難的生活下去。這個所謂絕大多數(shù),應(yīng)該是90%。
那么,程序員或者好聽一些,軟件工程師這種職業(yè),為什么就過得更辛苦一些呢?
因為我們實際上完全沒有必要每天甚至每個星期甚至每個月都要學習新知識,因為很多所謂的新知識都是些將簡單的問題復雜化的東西,它們既沒有令事情變得更簡單,有時候甚至引起倒退,更多的時候是盲目的消耗了程序員的精力而一無是處。
我們完全可以過得非常輕松。
舉個例子,大家知道微軟的Wpf、Wcf和WF這些新的東西,其中任何一個專題,程序員都需要花費大量的時間去學習,當然,也許學習半年之后,還是碰到很多疑惑。人的一生有多少個半年呢?這樣的學習對你究竟有什么好處呢?
簡單的拿Wpf做例子,你需要了解這種新東西誕生的理由。
微軟的工程師認為,桌面編程應(yīng)該有一個類似Html的界面設(shè)計方式,使用一種規(guī)范的Xaml來描述界面,這是第一個動因。第二個主要的動因,是微軟的.net框架,這上面需要有專門的本地應(yīng)用開發(fā)技術(shù),微軟的工程師認為Winform形式太過落伍了。
還有其他原因嗎?
當你看到非常炫目的界面效果之后,你會覺得震撼,震撼之后你會覺得不學習實在就太會落伍了。
可是結(jié)果呢?
你想要用他開發(fā)桌面軟件,面臨的第一個問題,就是每個用戶下載的時候都需要下載好幾百兆的東西,還不一定保險。因為XP也好、Vista也好、Windows7也好還是Windows 2008 R2也好,老實說你要下載的包都不相同。
第二個問題是用戶安裝你的軟件非常困難,這些打包附帶的東西顯然無法讓用戶在安裝你的軟件之后,還有更多的興趣再看一眼。
第三個問題是開發(fā)應(yīng)用并不簡單,有太多的概念,比如Xaml、比如樣式、比如Trriger、比如StoryBoard、比如MVVM,沒有圖表控件、沒有自動完成控件,完成一件最簡單的任務(wù)你比以前可能需要更多的時間,而非更少。
第四個問題是有太多的細節(jié),比如Command如何帶參數(shù)、比如進度條怎樣后臺展現(xiàn)進度,嗯,我敢肯定的說,包括微軟的開發(fā)工程師在內(nèi),整個地球上用Wpf開發(fā)應(yīng)用的程序員們,只有不到十個人有一個通用的方案,來使用進度條簡單的在后臺報告進度。
第五個問題是慢,驚人的慢。大家可以看看“飛信”,這是一個微軟控主導決策的,嗯,使用.net 2.0。為了解決程序發(fā)布的問題,專門弄了個微型的.net框架,但是你將它與QQ比,是不是覺得慢得太多?持續(xù)多年以后,移動的先生們不耐煩了,才有的現(xiàn)在的基于C++的原生版本,請比較一下速度。這里特別提醒一下,飛信的開發(fā),是中國移動投入巨資、得到微軟中國整個團隊無微不至的支持的,這些高人甚至赤膊上陣親自動手,這樣使用他們的開發(fā)工具,歷時數(shù)年也不過是做出一個被淘汰的產(chǎn)品。先生,請掂量一下,你比他們這些家伙更厲害嗎?你比孩子的母親對孩子更了解嗎?
嗯,最后可以看到,包括微軟自己在內(nèi),地球上并沒有太多基于Wpf的產(chǎn)品。少得可憐,但它確實浪費了至少一百萬程序員的生命,基本上每個程序員因此短命了半年以上。
微軟則繼續(xù)想在僵尸的基礎(chǔ)上,禍害更多的人,于是出現(xiàn)在Web領(lǐng)域,老天,有了Silverlight,事實無情的宣告這種妄想進一步失敗,依然找不到多少有點看點的Silverlight的商業(yè)應(yīng)用。微軟碰了一鼻子灰,但他成功的繼續(xù)禍害了50萬以上的另一批程序員,這個時間估計超過半年,因為據(jù)說Web程序員更固執(zhí)、也更舍不得告別已經(jīng)浪費的生命。
故事還沒有完結(jié),微軟開始將這一套東西轉(zhuǎn)到手機領(lǐng)域。
我仿佛看見一只野狗,被左邊的一個人踢了一腳,這個人叫桌面應(yīng)用;又被右邊的人踢了一腳,這個人叫做Web應(yīng)用;然后,他高高的跳向空中,嗯,空中等著他的那個人叫手機開發(fā),他是不是也長著一雙腳呢?
他們推出WP7,這種微軟最新的手機操作系統(tǒng),開發(fā)工具是Silverlight,我已經(jīng)看到他失敗的那一天了……
這是新技術(shù)典型的例子,你不用責怪微軟,dos到Windows,是一種包裝,將底層封鎖住;Win32到.net FrameWork是第二次包裝,繼續(xù)封閉第二底層;.net“原生”開發(fā)到Wpf又是一種包裝,這是封閉了WinForm的內(nèi)容改用Xml呈現(xiàn)的包裝。
你能夠想象得到,每一次包裝,顯然都帶來運算效率的下降,這種包裝如果成功,是有益的,因為硬件性能畢竟在快速的增長。當然,也正由于這種包裝,電腦發(fā)展幾十年之后,我們常見的應(yīng)用基本上都沒有真正的變快,甚至與二十年前比較更慢了。
同時,開發(fā)應(yīng)用軟件,好象每經(jīng)過一次包裝,復雜度又增加許多,而開發(fā)成本又上升許多。
這很矛盾,不是嗎?多數(shù)時候,微軟的目的都是讓開發(fā)更簡單,這是沒錯的。
但什么是簡單?
我的理解是:第一是概念盡可能少,理解上簡單。第二才是代碼盡可能少,實現(xiàn)上簡單。
微軟幾乎百分之百的工程師,和幾乎百分之百的高層決策人員,都不理解第一個問題,“概念要盡可能少”。
嗯,你這么想想吧,剛剛看到有研究Prism的,我估計此人又要浪費半年以上的生命。
這是個什么東西呢?MVVM框架嗎?依賴注入嗎?模塊化嗎?
看看上面這句話,普通人定然看不懂,這也是我們絕大多數(shù)程序員漸漸變得不會說人話的原因。
你只要看到Prism那些難以理解的代碼,然后看到使用這種編程框架需要理解多少個概念,使用這種框架開發(fā)應(yīng)用會使人多么發(fā)狂。對于一個團隊來說,這又會造成多大的災難。
請記住,即使你誤入了微軟的賊船,也一定要記住:每次面臨一項新的技術(shù)的時候,花費5分鐘的時間了解一下,它的目的是什么?它是否達到了這些目的?使用這種東西需要理解的概念多不多?有無可能在一天內(nèi)完全掌握?
如果不能,忽略它。
微軟是沒錯的,錯的是你,先生,你不知辨別,你也不知道自己究竟有多長的生命。
想一想,還是列出一個清單吧:
1、Asp.net Mvc V3:可以看一下,新的視圖引擎確實更簡單
2、WCF:忘掉它,這是微軟希望擴展和取代Web服務(wù)的東西,它不是標準,這些年也基本上很少有應(yīng)用。
3、WPF:忘掉它,要開發(fā)原生應(yīng)用,還是老老實實的用VC+Mfc,要好看一點,用Vs2010里的Ribbon體系。
4、WF:不需要關(guān)注,當然,如果你從事工作流范疇的開發(fā),這個有一定益處,問題是性能也堪憂
5、Sql2008 R2的數(shù)據(jù)挖掘部分:忘掉它,基于數(shù)據(jù)庫的挖掘,基本上是很難實用的.
6、Silverlight:請轉(zhuǎn)向Html 5吧,或者現(xiàn)實一些,F(xiàn)lash。你不應(yīng)該這樣特立獨行,遵循多數(shù)人的標準吧
7、Wp7:躲遠一點,買手機也不要買這種
8、Silverlight手機開發(fā):不要碰,賺不到錢的
9、嵌入式開發(fā)WinCe或windows Mobile:轉(zhuǎn)向Android或者linux吧
10、Ado.net Entity FrameWork :忘了它,這只是微軟在面臨強抱的時候無力的呻吟,它希望能夠?qū)崿F(xiàn)數(shù)據(jù)庫和對象之間的無縫連接、也希望解決領(lǐng)域驅(qū)動開發(fā)問題,但是老天,十年之內(nèi)請大家不要幻想這種DDD的方式能為成為現(xiàn)實---這也意味著所有程序員失業(yè)先…
11、linq:關(guān)注但一定要慎用,linq To Sql性能肯定不如原生Ado.net直接訪問數(shù)據(jù)庫,linq To Object很多基于IEnumerable接口的,很顯然在針對數(shù)組和IList的時候較之直接編程性能大幅下降。
12、TFS:重要,很好的工具,但記住一定要用基本安裝,只使用源碼管理和基本的項目管理,不要安裝SharePoint之類,簡單就好
13、Tfs的Scrum模版:重要,這樣一種方法論,對個人對團隊都有益處
14、Vs2010的單元測試項目:重要,這是改變個人變成習慣,改變心態(tài)的習慣。不會TDD的基本上是苦瓜程序員。會了,你就是蜜瓜程序員。
15、.net Framework:出現(xiàn)之后,桌面應(yīng)用開發(fā)工具出現(xiàn)斷檔,僅在Web領(lǐng)域應(yīng)用,在桌面應(yīng)用和手機應(yīng)用中應(yīng)該遠離。
16、C# 3.0之后:C#語言設(shè)計的存在一定問題,從細節(jié)的所謂裝箱拆箱到高層面的linq之類,我猜想語言設(shè)計人員沒有列出“開發(fā)人員應(yīng)掌握多少概念、特定場景如何實現(xiàn)、結(jié)合.net Framework的主要領(lǐng)域是哪些”這樣的清單。邏輯層次上下浮動的很厲害。但C# 3。0之后的擴展方法、匿名代理、lambda表達式、匿名類、動態(tài)類型等,可以多用,對簡化代碼和代碼的清晰度確實有益。