程式設計能力七段論(下)

2021-08-09 20:50:43 字數 4084 閱讀 6465

前面的所有層次,都是關注程式設計本身的技能,說白了,就是基本功,本身並不能產生太大的價值。但有太多的程式設計師浪費太多的時間在那些築基的層次上。

有些程式設計師特別喜歡鑽研程式語言,每有一種新的程式語言出來或者舊語言被熱炒,就會投入精力進去研究。我就是其中之一,浪費了很多精力在程式語言上,在奇技淫巧上。

我覺得電腦科學是乙個面相當廣泛的學科,有很多領域知識需要和值得我們深入研究,我們才能寫出有價值的程式來。軟體必須要和行業結合起來,要落地才有價值。僅僅研究程式設計技巧,不懂領域知識是寫不出有價值的程式的。

儲存—-塊裝置,檔案系統,集群檔案系統,分布式檔案系統,光纖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協議,你才能知道你怎樣才能虛擬化乙個硬體裝置。

你知道網絡卡硬體協議,你才能模擬出乙個虛擬機器能正常使用的虛擬網絡卡。

你了解intelvt/amd v指令集,才能知道虛擬化是怎樣實現的。

你明白工作流其實就是狀態機,在遇到複雜工作流程時,你才能知道怎樣設計滿足要求的工作流引擎。

3段—科學家

你是領域知識專家,但你的知識都是來自於書本,來自於其他人的。

如果你滿足於當領域知識專家,你只能拾人牙慧,永遠別想超越。別人的研究成果,未必願意告訴你。當別人告訴你的時候,它可能已經發現了更新的理論,並且新一代產品可能馬上就要發布了。

科學家是探索未知,勇於創新的人,是推動人類社會進步的人。

傳說,思科的一位高管曾經半開玩笑地說過:「如果思科停止了新技術的研發,華為就會找不著方向」。這是在嘲笑華為只是處在領域知識專家的水平,只能山寨無法超越。我不知道華為的實際情況,但希望現在的華為已經走到了領跑者的位置。

歐文·雅各布斯發現了cdma分碼多重進接的原理,並發現它在通訊上大有可為,組建了高通公司。高通公司主要以專利授權費為生,它僱傭了大量科學家在通訊領域展開研究。有人說高通是專利流氓。這些人不明白知識的價值。在他們眼裡,windows的合理**就應該是5元錢,一張光碟的**。iphone就應該是1000多元裸機的**。高通是專利流氓,那你也流氓乙個cdma,lte出來給我看看!

x86晶元在設計上沒有考慮虛擬化。因此會有所謂的「虛擬化漏洞」出現。就是說,一些cpu特權指令執行時,在虛擬機器環境下不會丟擲異常,因此就無法切換到host。這樣,x86晶元上就無法執行虛擬機器。

vmware公司是由美國的幾位科學家在2023年建立的。他們發現可以使用二進位制翻譯的技術,在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。

程式設計能力七段論(下)

前面的所有層次,都是關注程式設計本身的技能,說白了,就是基本功,本身並不能產生太大的價值。但有太多的程式設計師浪費太多的時間在那些築基的層次上。有些程式設計師特別喜歡鑽研程式語言,每有一種新的程式語言出來或者舊語言被熱炒,就會投入精力進去研究。我就是其中之一,浪費了很多精力在程式語言上,在奇技淫巧上...

藍橋杯 七段碼

小藍要用七段碼數碼管來表示一種特殊的文字。上圖給出了七段碼數碼管的乙個圖示,數碼管中一共有 7 段可以發光的二極體,分別標記為 a,b,c,d,e,f,g。小藍要選擇一部分二極體 至少要有乙個 發光來表達字元。在設計字元的表達時,要求所有發光的二極體是連成一片的。例如 b 發光,其他二極體不發光可以...

藍橋杯 七段碼

題目描述 小藍要用七段碼數碼管來表示一種特殊的文字。上圖給出了七段碼數碼管的乙個圖示,數碼管中一共有 7 段可以發光的二 極管,分別標記為 a,b,c,d,e,f,g。小藍要選擇一部分二極體 至少要有乙個 發光來表達字元。在設計字元 的表達時,要求所有發光的二極體是連成一片的。例如 b 發光,其他二...