深度理解真正的編程能力

計(jì)算機(jī)科學(xué)有兩類根本問題。

一類是理論:算法,數(shù)據(jù)結(jié)構(gòu),復(fù)雜度,機(jī)器學(xué)習(xí),模式識(shí)別,等等等。

一類是系統(tǒng):操作系統(tǒng),網(wǎng)絡(luò)系統(tǒng),分布式系統(tǒng),存儲(chǔ)系統(tǒng),游戲引擎,等等等等。

理論走的是深度,是在追問在給定的計(jì)算能力約束下如何把一個(gè)問題解決得更快更好。而系統(tǒng)走的是廣度,是在追問對(duì)于一個(gè)現(xiàn)實(shí)的需求如何在眾多的技術(shù)中設(shè)計(jì)出最多快好省的技術(shù)組合。

搞ACM的人,只練第一類。像你這樣的更偏向于第二類。其實(shí)挺難得的,但很可惜的是第二類能力沒有簡(jiǎn)單高效的測(cè)量考察方法,不像算法和數(shù)據(jù)結(jié)構(gòu)有ACM競(jìng)賽,所以很多系統(tǒng)的苗子都因?yàn)槿鄙偌?lì)和正確引導(dǎo)慢慢就消隱了。

所以比爾蓋茨才會(huì)說,看到現(xiàn)在學(xué)編程的人經(jīng)常都把編程看作解各種腦筋急轉(zhuǎn)彎的問題,他覺得很遺憾。

做系統(tǒng),確實(shí)不提倡“重復(fù)發(fā)明輪子”。但注意,是不提倡“重復(fù)發(fā)明”,不是不提倡“重新制造”。恰恰相反的,我以為,系統(tǒng)的編程能力正體現(xiàn)在“重新制造”的能力。

能把已有的部件接起來,這很好。但當(dāng)你恰好缺一種關(guān)鍵的膠水的時(shí)候,你能寫出來嗎?當(dāng)一個(gè)已有的部件不完全符合你的需求的時(shí)候,你能改進(jìn)它嗎?如果你用的部件中有bug,你能把它修好嗎?在網(wǎng)上繁多的類似功能的部件中,誰好誰壞?為什么?差別本質(zhì)嗎?一個(gè)開源代碼庫,你能把它從一個(gè)語言翻譯到另一個(gè)語言嗎?從一個(gè)平臺(tái)移植到另一個(gè)平臺(tái)嗎?能準(zhǔn)確估計(jì)自己翻譯和移植的過程需要多少時(shí)間嗎?能準(zhǔn)確估計(jì)翻譯和移植之后性能是會(huì)有提升還是會(huì)有所下降嗎?

系統(tǒng)編程能力體現(xiàn)在把已有的代碼拿來并變成更好的代碼,體現(xiàn)在把沒用的代碼拿來并變成有用的代碼,體現(xiàn)在把一個(gè)做好的輪子拿來能畫出來輪子的設(shè)計(jì)藍(lán)圖,并用道理解釋出設(shè)計(jì)藍(lán)圖中哪些地方是關(guān)鍵的,哪些地方是次要的,哪些地方是不容觸碰的,哪些地方是還可以改進(jìn)的。

如果你一點(diǎn)不懂理論,還是應(yīng)該學(xué)點(diǎn)的。對(duì)于系統(tǒng)性能的設(shè)計(jì)上,算法和數(shù)據(jù)結(jié)構(gòu)就像在自己手頭的錢一樣,它們不是萬能的,但不懂是萬萬不行的。

怎么提高系統(tǒng)編程能力呢?土辦法:多造輪子。就像學(xué)畫畫要畫雞蛋一樣,不是這世界上沒有人會(huì)畫雞蛋,但畫雞蛋能馴服手指,感受陰影線條和筆觸。所以,自己多寫點(diǎn)東西吧。寫個(gè)編譯器?渲染器?操作系統(tǒng)?web服務(wù)器?web瀏覽器?部件都一個(gè)個(gè)換成自己手寫的,然后和已有的現(xiàn)成部件比一比,看看誰的性能好,誰的易用性好?好在哪兒?差在哪兒?為什么?

更聰明一點(diǎn)的辦法:多拆輪子。多研究別人的代碼是怎么寫的。然而這個(gè)實(shí)踐起來經(jīng)常很難。原因:大部分工業(yè)上用的輪子可能設(shè)計(jì)上的思想和技術(shù)是好的,都設(shè)計(jì)和制造過程都很爛,里面亂成一團(tuán),讓人乍一看毫無頭緒,導(dǎo)致其對(duì)新手來說非常難拆。這種狀況其實(shí)非常糟糕。所以,此辦法一般只對(duì)比較簡(jiǎn)單的輪子好使,對(duì)于復(fù)雜的輪子,請(qǐng)量力而行。

輪子不好拆,其實(shí)是一個(gè)非常嚴(yán)重的問題。重復(fù)發(fā)明輪子固然是時(shí)間的浪費(fèi),但當(dāng)輪子復(fù)雜而又不好拆的時(shí)候,尤其是原來造輪子的人已經(jīng)不在場(chǎng)的時(shí)候,重新發(fā)明和建造輪子往往會(huì)成為無奈之下最好的選擇。這是為什么工業(yè)界在明知道重復(fù)發(fā)明/制造輪子非常不好的情況下還在不斷重復(fù)發(fā)明/制造輪子的根本原因。

程序本質(zhì)是邏輯演繹的形式化表達(dá),記載的是人類對(duì)這個(gè)世界的數(shù)字化理解。不能拆的輪子就像那一篇篇丟了曲譜的宋詞一樣,能讀,卻不能唱。

鄙人不才,正在自己研究怎么設(shè)計(jì)建造一種既好用又好拆的輪子。您沒那么幸運(yùn),恐怕是等不到鄙人的技術(shù)做出來并發(fā)揚(yáng)光大了。在那之前,多造輪子,多拆好拆的小輪子,應(yīng)該是提高編程能力最好的辦法了。

感謝知乎網(wǎng)友@劉賀 的分享

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 伯樂在線小編注:本文綜合整理自知乎同名問答帖。題主的問題補(bǔ)充如下: 還在讀書,也在實(shí)驗(yàn)室?guī)兔ψ隽诵〇|西,自己也搭過...
    cmlong_閱讀 162評(píng)論 0 0
  • 還在讀書,也在實(shí)驗(yàn)室?guī)兔ψ隽诵〇|西,自己也搭過幾個(gè)網(wǎng)站。在周圍人看來似乎好像我很厲害,做了那么多東西,但是我發(fā)現(xiàn)這...
    鄭宏鑫閱讀 245評(píng)論 0 0
  • 轉(zhuǎn)載自什么才算是真正的編程能力?作者:IT程序獅 知乎上看到一題主的發(fā)問: 還在讀書,也在實(shí)驗(yàn)室?guī)兔ψ隽诵〇|西,自...
    Super_鄧帥閱讀 236評(píng)論 0 1
  • 話說猴王串長(zhǎng)城,游小縣,尋仙訪道,最后拜在方寸山菩提祖師門下,一心想修得長(zhǎng)生,跳出五行之外。 找個(gè)厲害師傅不容易,...
    凌云仙渡閱讀 259評(píng)論 2 5
  • 快速排序 快速排序也是分治思想下的排序方法。時(shí)間復(fù)雜度O(n*log2n),是不穩(wěn)定的。比如前兩個(gè)數(shù)字是一樣的,明...
    senninha閱讀 429評(píng)論 0 0

友情鏈接更多精彩內(nèi)容