所謂的程式設計技能就是基本功,本身并不能産生太大的價值。但有太多的程式員浪費太多的時間在那些築基的層次上,這是不對的。
什麼是領域知識
計算機科學是一個面相當廣泛的學科,有很多領域知識需要和值得我們深入研究,我們才能寫出有價值的程式來。軟體必須要和行業結合起來,要落地才有價值。僅僅研究程式設計技巧,不懂領域知識是寫不出有價值的程式的。
計算機科學領域有很多,列舉一些如下:
存儲。塊裝置,檔案系統,叢集檔案系統,分布式檔案系統,光纖SCSI,iSCSI,RAID等。
網絡。以太網,光纖網,蜂窩網絡,WIFI,VLAN等。
計算機體系結構。主要就是CPU指令集。x86,ARM等。
USB協定。需要知道URB包。
PCI協定,PCI-E協定。現代計算機的外設都是PCI協定和PCI-E協定的。顯示卡現在全是通過 PCI-E協定連接配接到計算機上的。相對來說減少了很多需要學習的知識。搞虛拟化就需要深入掌握PCI協定。
圖像處理。圖像壓縮,視訊實時編碼等。
此外還有3D遊戲、關系資料庫、NoSQL資料庫、作業系統、分布式作業系統、編譯原理和機器學習等。
了解領域知識的好處
了解這些領域知識,自然也會包括了解該領域現有的商用硬體、商用軟體和開源軟體。
很多時候,你要完成的工作,在業界已經有現成的工具了,這就意味着,你隻要使用現成的工具就可以完成任務,并不需要進行開發。在這些時候,隻需要組合現有的工具,寫一些腳本就可以完成任務。比如要實作一個雙向同步任務,隻要找到了優秀的開源軟體Unison,編寫一下配置檔案就圓滿地完成了任務。不需要編寫任何代碼;比如要做高可用,隻要使用Python調用幾個開源軟體就能輕松實作了。再比如編寫安裝程式或定制作業系統,隻要知道了作業系統的領域知識,寫幾行腳本就可以輕松搞定。
而不具備這些領域知識的人,就可能不得不進行大量無謂的開發,甚至開發很久之後才發現,這根本就是一條死路。
另外,紮實的領域知識,可以大大提高程式設計調試、查錯的能力。知道編譯器和程式設計語言運作時工作原理,就能快速根據編譯錯誤和警告資訊修改代碼。
領域知識的層次
領域知識随着經驗的積累,會逐漸提高。領域知識可以分為一些層次,這些層次指的程式員對領域知識掌握程度的層級。
第0層——領域知識菜鳥
對領域知識沒有多少認知,通過搜尋引擎找到一些該領域的軟體和硬體的介紹性文章,按照文章訓示配置和使用軟體。勉強能夠使用現有軟硬體。
第1層——領域知識行家
了解領域内常用硬體,深入掌握領域内常用軟體的配置和使用技巧。能夠使用現有軟硬體熟練搭建解決方案,能夠解決實際工作中遇到的種種問題。
第2層——領域知識專家
當你不僅僅掌握了該領域的軟體和工具,知道怎麼用,還知道其原理(知其然,也知其是以然),你就是該領域的知識專家了。
比如你知道網絡協定的原理,你就能在網絡出現問題時知道是哪裡可能出現了問題,知道是mac沖突,ip沖突還是網絡環路導緻的問題。
比如你知道存儲的原理,你就能知道為什麼這種存儲方式不适合虛拟化,以及哪一種存儲方式适合虛拟化,另一種方式适合資料備份。
比如你知道PCI協定,你就能知道你怎樣才能虛拟化一個硬體裝置。
比如你知道網卡硬體協定,你就能模拟出一個虛拟機能正常使用的虛拟網卡。
比如你知道視訊編碼格式和原理,你就能知道什麼視訊格式占用帶寬最少,什麼視訊格式占用CPU最少。
比如你了解IntelVT/Amd V指令集,你就能知道虛拟化是怎樣實作的。
再比如你明白工作流其實就是狀态機,在遇到複雜工作流程時,你就能知道怎樣設計滿足要求的工作流引擎。
第3層——科學家
你是領域知識專家,但你的知識都是來自于書本,來自于其他人的。如果你滿足于當領域知識專家,你隻能拾人牙慧,永遠别想超越。别人的研究成果,未必願意告訴你。當别人告訴你的時候,它可能已經發現了更新的理論,并且新一代産品可能馬上就要釋出了。
而科學家則是探索未知,勇于創新的人,是推動人類社會進步的人。
比如,傳說思科的一位高管曾經半開玩笑地說過,如果思科停止了新技術的研發,華為就會找不着方向。這是在嘲笑華為隻是處在領域知識專家的水準,隻能山寨無法超越。我不知道華為的實際情況,但希望現在的華為已經走到了領跑者的位置。
比如,歐文·雅各布斯發現了CDMA碼分多址的原理,并發現它在通訊上大有可為,組建了高通公司。高通公司主要以專利授權費為生,它雇傭了大量科學家在通訊領域展開研究。有人說高通是專利流氓,這些人是不明白知識的價值。在他們眼裡,Windows的合理價格就應該是5元錢,一張CD光牒的價格。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性能問題。
再講一個搜尋引擎的故事。Yahoo要給一個程式添加搜尋功能,剛開始是使用SQL查詢來實作。但是發現這種方式實在太慢了,便找了開源的Lucene項目,這個項目使用反向索引技術,通過在檔案中建立反向索引,大大提高了搜尋速度。而Google的兩位創始人發現可以通過html頁面的link關系來為每一個html頁面設定權重,并創造了PageRank算法,于是Google的自動搜尋引擎擊敗了Yahoo的人工分類搜尋引擎。OK,利用反向索引技術和PageRank,以及一個簡單的html爬蟲機器人,一個搜尋引擎就能被建構出來了。但是網際網路很大,每天産生大量新網頁,要為整個網際網路建立反向索引是很困難的。于是,在若幹年後Google又公開了三篇論文,分别是Googlefs、Mapreduce和Bigtable。Lucene項目的開發者根據Google的Mapreduce論文開發了Hadoop項目。MapReduce就是使用大量計算機存儲資料并計算,最後彙總結果。使用Hadoop+反向索引+PageRank,就可以建立搜尋引擎了。Yahoo和Baidu等公司紛紛基于Hadoop開發了自己的搜尋引擎。但是,其他公司的搜尋引擎效果還是沒法和Google相比。這一點我們程式員最清楚,很多程式員就喜歡FQ出去,隻為了Google一下。再到後來,Google黑闆報上發表了吳軍博士的一些文章,其中介紹了很多機器學習方面的知識。從文中可以知道,Google其實使用機器學習來分析搜集到的頁面。但是Google顯然不會把這個公式公開出來。即使有一天Google真的公開了這個公式,那麼可以想見Google肯定是又研發出了更加犀利的秘籍,山寨貨的搜尋引擎效果還是比不上Google的。
是以可以說山寨是通向創新的必由之路。在成為領域的領頭羊和上司者之前,必然要經過學習,模仿的階段。但要成為行業的老大,成為Champion,必須勇于彎道超車,勇敢地走上創新之路,成為真正的科學家,真正的大牛!
總結
有些程式員特别喜歡鑽研程式設計語言,每有一種新的程式設計語言出來或者舊語言被熱炒,就會投入精力進去研究。比如我覺得C++語言是一個特别大的坑。剛開始是作為面向對象的C被開發的。後來發現了模闆程式設計,就大力鼓吹模闆程式設計和進一步的模闆元程式設計。然後又推出了C++11,C++14等新标準,進一步添加了很多新東西,函數式程式設計,類型推斷等。C++過分複雜,太多的坑消耗了大量程式員的大量精力。
這樣就可能會導緻這些程式員把精力都花在提升程式設計技能上了,對領域知識知之甚少,這其實在日常工作中也是極其有害的。因為有些需求可能早已經有了現成、開源免費的解決方案,或者隻需要組合幾個現有軟體就可以快速搞定,而他們卻不得不自己花大量時間去開發。絕大多數場景下,重複造輪子并不是一件好事。
你要去做一個大人,不要回頭,不要難過。