編程能力七段論(下)
領域知識層次
前面的所有層次,都是關註編程本身的技能,說白了,就是基本功,本身並不能產生太大的價值。但有太多的程序員浪費太多的時間在那些築基的層次上。
有些程序員特別喜歡鉆研編程語言,每有一種新的編程語言出來或者舊語言被熱炒,就會投入精力進去研究。我就是其中之一,浪費了很多精力在編程語言上,在奇技淫巧上。
我覺得語言是一個特別大的坑。剛開始是作為面向對象的C被開發的。後來發現了模板編程,就大力鼓吹模板編程和進一步的模板元編程。最近又推出了新標準,進一步添加了很多新東西,函數式編程,類型推斷等,過分復雜,太多的坑消耗了大量程序員的大量精力。我使用時,只使用面向對象部分和模板部分,其他過於精深的特性都不使用。
計算機科學是一個面相當廣泛的學科,有很多領域知識需要和值得我們深入研究,我們才能寫出有價值的程序來。軟件必須要和行業結合起來,要落地才有價值。僅僅研究編程技巧,不懂領域知識是寫不出有價值的程序的。
計算機科學領域有很多,列舉一些如下:
- 存儲—-塊設備,文件系統,集群文件系統,分布式文件系統,光纖SCSI,iSCSI,RAID等。
- 網絡—-以太網,光纖網,蜂窩網絡,WIFI,VLAN等。
- 計算機體系結構,主要就是CPU指令集。x86,ARM等。
- USB協議。需要知道URB包。
- PCI協議,PCI-E協議。現代計算機的外設都是PCI協議和PCI-E協議的。顯卡現在全是通過 PCI-E協議連接到計算機上的。相對來說減少了很多需要學習的知識。搞虛擬化就需要深入掌握PCI協議。
- 圖像處理–圖像壓縮,視頻實時編碼等。
- 3D遊戲
- 關系數據庫
- NoSQL數據庫
- 操作系統
- 分布式操作系統
- 編譯原理
- 機器學習–現在大數據要用哦!
了解這些領域知識,也包括了解該領域現有的商用硬件、商用軟件和開源軟件。很多時候,你要完成的工作,已經有現成的工具了。你只要使用現成的工具就可以完成任務,不需要進行開發。有時候,只需要組合現有的工具,寫一些腳本就可以完成任務。
如,我一次要實現一個雙向同步任務。找到了一個優秀的開源軟件Unison,編寫一下配置文件就圓滿地完成了任務。不需要編寫任何代碼。
還有一次,要做高可用,用Python調用了幾個開源軟件就輕松實現了。
編寫安裝程序,定制操作系統,知道了操作系統的領域知識,寫幾行腳本就可以輕松搞定。
不具備領域知識的人,就可能不得不進行大量無謂的開發,甚至開發很久之後才發現,這根本就是一條死路。
另外,紮實的領域知識,可以大大提高編程調試、查錯的能力。知道編譯器和編程語言運行時工作原理,就能快速根據編譯錯誤和警告信息修改代碼。
知道操作系統底層運行機制,就能快速找到運行時錯誤的問題根源。如,有一次我編寫一個windows升級服務程序。它是一個windows服務,需要執行dos腳本,這個腳本會替換掉這個windows服務本身。發現有時腳本執行無效,查了一晚上,發現當windows服務安裝後,第一次啟動就執行腳本時就會有權限問題,log都正確,但實際執行這個腳本沒有任何效果。但一旦windows服務程序啟動一次之後就ok。這必然是windows操作系統底層安全機制的問題,因為我對Windows內核了解不多,因此花了很長時間才發現這個問題,並對造成這個問題的根源並不清楚。
0段—領域知識菜鳥
對領域知識沒有多少認知,通過搜索引擎找到一些該領域的軟件和硬件的介紹性文章,按照文章指示配置和使用軟件。勉強能夠使用現有軟硬件。
1段—領域知識行家
了解領域內常用硬件,深入掌握領域內常用軟件的配置和使用技巧。能夠使用現有軟硬件熟練搭建解決方案,能夠解決實際工作中遇到的種種問題。
2段—領域知識專家
當你不僅僅掌握了該領域的軟件和工具,知道怎麽用,還知道其原理,“知其然,也知其所以然”,就是該領域的知識專家了。
你知道網絡協議的原理,你才能在網絡出現問題時知道是哪裏可能出現了問題。是mac沖突,ip沖突,還是網絡環路?
你知道存儲的原理,你才能知道為什麽這種存儲方式不適合虛擬化,那種存儲方式適合虛擬化,另一種方式適合資料備份。
你知道PCI協議,你才能知道你怎樣才能虛擬化一個硬件設備。
你知道網卡硬件協議,你才能模擬出一個虛擬機能正常使用的虛擬網卡。
你知道視頻編碼格式和原理,才能知道什麽視頻格式占用帶寬最少,什麽視頻格式占用CPU最少。
你了解IntelVT/Amd V指令集,才能知道虛擬化是怎樣實現的。
你明白工作流其實就是狀態機,在遇到復雜工作流程時,你才能知道怎樣設計滿足要求的工作流引擎。
3段—科學家
你是領域知識專家,但你的知識都是來自於書本,來自於其他人的。
如果你滿足於當領域知識專家,你只能拾人牙慧,永遠別想超越。別人的研究成果,未必願意告訴你。當別人告訴你的時候,它可能已經發現了更新的理論,並且新一代產品可能馬上就要發布了。
科學家是探索未知,勇於創新的人,是推動人類社會進步的人。
傳說,思科的一位高管曾經半開玩笑地說過:“如果思科停止了新技術的研發,華為就會找不著方向”。這是在嘲笑華為只是處在領域知識專家的水平,只能山寨無法超越。我不知道華為的實際情況,但希望現在的華為已經走到了領跑者的位置。
歐文·雅各布斯發現了CDMA碼分多址的原理,並發現它在通訊上大有可為,組建了高通公司。高通公司主要以專利授權費為生,它雇傭了大量科學家在通訊領域展開研究。有人說高通是專利流氓。這些人不明白知識的價值。在他們眼裏,Windows的合理價格就應該是5元錢,一張光盤的價格。iPhone就應該是1000多元裸機的價格。高通是專利流氓,那你也流氓一個CDMA,LTE出來給我看看!
X86芯片在設計上沒有考慮虛擬化。因此會有所謂的“虛擬化漏洞”出現。就是說,一些CPU特權指令執行時,在虛擬機環境下不會拋出異常,因此就無法切換到Host。這樣,X86芯片上就無法運行虛擬機。
VmWare公司是由美國的幾位科學家在1998年創建的。他們發現可以使用二進制翻譯的技術,在X86計算機上運行虛擬機。
Xen虛擬化軟件也是幾位科學家發明的。他們發現只要修改虛擬機操作系統和Host操作系統的內核,在需要執行“虛擬化漏洞”指令時直接調用Host的功能,就可以實現虛擬化,而且大大提高了虛擬機的運行性能。
後來,Intel為自己的芯片添加了IntelVT指令集,Amd為自己的芯片添加了AmdV指令集,彌補了“虛擬化漏洞”。於是就有了KVM虛擬機軟件,它直接用CPU硬件指令實現虛擬化。
KVM在執行CPU指令時,是直接在物理CPU上運行的,因此效率極高。但是,虛擬機運行虛擬外設時,就必須用軟件模擬,因此虛擬機的IO訪問速度很慢。
IBM科學家RustyRussell,借鑒了Xen的研發經驗,創建了VirtIO技術。就是在虛擬機中編寫一套PCI虛擬設備和驅動,這套虛擬PCI設備有一塊虛擬設備內存。這個虛擬設備內存Host是可以訪問的,虛擬機通過VirtIO驅動程序也可以訪問。也就是一塊內存在虛擬機和Host中共享,這就解決了虛擬機的IO性能問題。
再講一個搜索引擎的故事:
很久以前,我要給一個程序添加搜索功能。剛開始使用sql查詢實現,發現實在太慢了。後來找了開源的Lucene項目。它使用反向索引技術,通過在文件中創建反向索引,大大提高了搜索速度。
Google的兩位創始人發現了html中link的秘密,他們發現可以通過html頁面的link關系來為每一個html頁面設置權重。也就是PageRank算法。於是,Google的自動搜索引擎擊敗了Yahoo人工分類的搜索引擎。
OK,利用反向索引技術和PageRank,以及一個簡單的html爬蟲機器人,我們就可以創建一個搜索引擎了。但是,互聯網很大,每天產生大量新網頁,要為整個互聯網建立反向索引是很困難的。
若幹年後Google又公開了三篇論文:Googlefs、Mapreduce、Bigtable。於是Lucene項目的開發者根據Google的Mapreduce論文開發了Hadoop項目。MapReduce就是使用大量計算機存儲數據並計算,最後匯總結果。使用Hadoop 反向索引 PageRank,就可以創建搜索引擎了。Yahoo,Baidu等公司紛紛基於Hadoop開發了自己的搜索引擎。
但是,其他公司的搜索引擎效果還是沒法和Google相比。這一點我們程序員最清楚。像我,就總是翻薔出去,只為了Google一下。
Google黑板報上發表了吳軍博士的一些文章,其中介紹了很多機器學習方面的知識。從文中可以知道,Google其實使用機器學習來分析搜集到的頁面。Google明顯不會把這個公式公開出來。即使有一天Google真的公開了這個公式,那麽可以想見Google肯定又研發出了更加犀利的秘籍,山寨貨的搜索引擎效果還是比不上Google的。
山寨是通向創新的必由之路。在成為領域的領頭羊和領導者之前,必然要經過學習,模仿的階段。但要成為行業的老大,成為Champion,必須勇於彎道超車,勇敢地走上創新之路,成為真正的科學家,真正的大牛!
總結
編程能力可分為兩個維度:一個是編程技能水平,另一個是領域知識水平。
有些程序員可能把精力都花在提升編程技能上了,領域知識知之甚少,這其實在日常工作中也是極其有害的。有些需求可能早已經有了現成、開源免費的解決方案,或者只需要組合幾個現有軟件就可以快速搞定,而他們卻不得不自己花大量時間去開發。另外,缺少領域知識,在程序出現非預期狀況時,很難快速定位到問題的根源,很難解決bug。
轉:http://gad.qq.com/article/detail/34177
編程能力七段論(下)