知乎上看到一題主的發問:
還在讀書,也在實驗室幫忙做了些東西,自己也搭過幾個**。在周圍人看來似乎好像我很厲害,做了那麼多東西,但是我發現這些東西雖然是我做的,但是實際上我手把手自己寫的**卻並沒有多少,很多都是用開源的東西,我寫的**無非是把別人的東西整合下,類似於膠水一樣的工作。
我之前所認為的程式設計是全手動一行一行敲**,但是現在我發現哪怕是工程上也有很多人是複製黏貼來解決問題的,並且提倡不要重複造輪子。
但是靠谷歌和複製別人的輪子,雖然我做出了很多東西,可是我並不覺得自己能力上有提公升,倒是利用搜尋引擎的能力的確提公升了不少。而學校裡另外一波搞acm的人,他們每天刷題練演算法,或許倒是的確提公升了點程式設計能力,但是對工程幾乎一竅不通。
所以我現在就很困惑,所謂的程式設計能力到底是什麼,我該如何提公升自己的程式設計能力?
在眾多回答者中,劉賀的回答得到了眾多網友的點讚。他通過電腦科學的理論和系統知識開始闡述觀點,並提出了提高系統程式設計能力的一些方法和建議。或許以下的回答,你能找到一些啟發。
劉賀回答:
非常好的乙個問題。這可能是我在知乎見到過的問程式設計有關的問題中問得最好的乙個了。我非常喜歡這個問題。
電腦科學有兩類根本問題。一類是理論:演算法,資料結構,複雜度,機器學習,模式識別,等等等。一類是系統:作業系統,網路系統,分布式系統,儲存系統,遊戲引擎,等等等等。
理論走的是深度,是在追問在給定的計算能力約束下如何把乙個問題解決得更快更好。而系統走的是廣度,是在追問對於乙個現實的需求如何在眾多的技術中設計出最多快好省的技術組合。
搞acm的人,只練第一類。像你這樣的更偏向於第二類。其實挺難得的,但很可惜的是第二類能力沒有簡單高效的測量考察方法,不像演算法和資料結構有acm競賽,所以很多系統的苗子都因為缺少激勵和正確引導慢慢就消隱了。
所以比爾蓋茨才會說,看到現在學程式設計的人經常都把程式設計看作解各種腦筋急轉彎的問題,他覺得很遺憾。
做系統,確實不提倡「重**明輪子」。但注意,是不提倡「重**明」,不是不提倡「重新製造」。恰恰相反的,我以為,系統的程式設計能力正體現在「重新製造」的能力。
能把已有的部件接起來,這很好。但當你恰好缺一種關鍵的膠水的時候,你能寫出來嗎?當乙個已有的部件不完全符合你的需求的時候,你能改進它嗎?如果你用的部件中有bug,你能把它修好嗎?在網上繁多的類似功能的部件中,誰好誰壞?為什麼?差別本質嗎?乙個開源**庫,你能把它從乙個語言翻譯到另乙個語言嗎?從乙個平台移植到另乙個平台嗎?能準確估計自己翻譯和移植的過程需要多少時間嗎?能準確估計翻譯和移植之後效能是會有提公升還是會有所下降嗎?
系統程式設計能力體現在把已有的**拿來並變成更好的**,體現在把沒用的**拿來並變成有用的**,體現在把乙個做好的輪子拿來能畫出來輪子的設計藍圖,並用道理解發布設計藍圖中哪些地方是關鍵的,哪些地方是次要的,哪些地方是不容觸碰的,哪些地方是還可以改進的。
如果你一點不懂理論,還是應該學點的。對於系統效能的設計上,演算法和資料結構就像在自己手頭的錢一樣,它們不是萬能的,但不懂是萬萬不行的。
怎麼提高系統程式設計能力呢?土辦法:多造輪子。就像學畫畫要畫雞蛋一樣,不是這世界上沒有人會畫雞蛋,但畫雞蛋能馴服手指,感受陰影線條和筆觸。所以,自己多寫點東西吧。寫個編譯器?渲染器?作業系統?web伺服器?web瀏覽器?部件都乙個個換成自己手寫的,然後和已有的現成部件比一比,看看誰的效能好,誰的易用性好?好在哪兒?差在哪兒?為什麼?
更聰明一點的辦法:多拆輪子。多研究別人的**是怎麼寫的。然而這個實踐起來經常很難。原因:大部分工業上用的輪子可能設計上的思想和技術是好的,都設計和製造過程都很爛,裡面亂成一團,讓人乍一看毫無頭緒,導致其對新手來說非常難拆。這種狀況其實非常糟糕。所以,此辦法一般只對比較簡單的輪子好使,對於複雜的輪子,請量力而行。
輪子不好拆,其實是乙個非常嚴重的問題。重**明輪子固然是時間的浪費,但當輪子複雜而又不好拆的時候,尤其是原來造輪子的人已經不在場的時候,重新發明和建造輪子往往會成為無奈之下最好的選擇。這是為什麼工業界在明知道重**明/製造輪子非常不好的情況下還在不斷重**明/製造輪子的根本原因。
程式本質是邏輯演繹的形式化表達,記載的是人類對這個世界的數位化理解。不能拆的輪子就像那一篇篇丟了曲譜的宋詞一樣,能讀,卻不能唱。
鄙人不才,正在自己研究怎麼設計建造一種既好用又好拆的輪子。您沒那麼幸運,恐怕是等不到鄙人的技術做出來並發揚光大了。在那之前,多造輪子,多拆好拆的小輪子,應該是提高程式設計能力最好的辦法了。
以上。嗯。
什麼才算是真正的程式設計能力
回答者1 電腦科學有兩類根本問題。一類是理論 演算法,資料結構,複雜度,機器學習,模式識別,等等等。一類是系統 作業系統,網路系統,分布式系統,儲存系統,遊戲引擎,等等等等。理論走的是深度,是在追問在給定的計算能力約束下如何把乙個問題解決得更快更好。而系統走的是廣度,是在追問對於乙個現實的需求如何在...
什麼才算是真正的程式設計能力?
電腦科學有兩類根本問題。一類是理論 演算法,資料結構,複雜度,機器學習,模式識別,等等等。一類是系統 作業系統,網路系統,分布式系統,儲存系統,遊戲引擎,等等等等。理論走的是深度,是在追問在給定的計算能力約束下如何把乙個問題解決得更快更好。而系統走的是廣度,是在追問對於乙個現實的需求如何在眾多的技術...
什麼才算是真正的程式設計能力?
電腦科學有兩類根本問題。一類是理論 演算法,資料結構,複雜度,機器學習,模式識別,等等等。一類是系統 作業系統,網路系統,分布式系統,儲存系統,遊戲引擎,等等等等。理論走的是深度,是在追問在給定的計算能力約束下如何把乙個問題解決得更快更好。而系統走的是廣度,是在追問對於乙個現實的需求如何在眾多的技術...