還在讀書,也在實驗室?guī)兔ψ隽诵〇|西舅柜,自己也搭過幾個網(wǎng)站梭纹。在周圍人看來似乎好像我很厲害,做了那么多東西致份,但是我發(fā)現(xiàn)這些東西雖然是我做的变抽,但是實際上我手把手自己寫的代碼卻并沒有多少,很多都是用開源的東西氮块,我寫的代碼無非是把別人的東西整合下绍载,類似于膠水一樣的工作。
我之前所認(rèn)為的編程是全手動一行一行敲代碼滔蝉,但是現(xiàn)在我發(fā)現(xiàn)哪怕是工程上也有很多人是復(fù)制黏貼來解決問題的击儡,并且提倡不要重復(fù)造輪子。
但是靠谷歌和復(fù)制別人的輪子蝠引,雖然我做出了很多東西阳谍,可是我并不覺得自己能力上有提升蛀柴,倒是利用搜索引擎的能力的確提升了不少。而學(xué)校里另外一部分在搞ACM的人边坤,他們每天都在刷題練算法名扛,但單憑我個人的感受感覺他們似乎對工程上有些東西并不了解,或許算法的能力才算是實打?qū)嵉木幊棠芰胙鳎磕?膠水"的能力和整合輪子的能力算不算編程能力呢?
所以我現(xiàn)在就很困惑,所謂的編程能力到底是什么融蹂,我該如何提升自己的編程能力旺订?
非常好的一個問題。這可能是我在知乎見到過的問編程有關(guān)的問題中問得最好的一個了超燃。我非常喜歡這個問題区拳。
計算機科學(xué)有兩類根本問題。一類是理論:算法意乓,數(shù)據(jù)結(jié)構(gòu)樱调,復(fù)雜度,機器學(xué)習(xí)届良,模式識別笆凌,等等等。一類是系統(tǒng):操作系統(tǒng)士葫,網(wǎng)絡(luò)系統(tǒng)乞而,分布式系統(tǒng),存儲系統(tǒng)慢显,游戲引擎爪模,等等等等。
理論走的是深度荚藻,是在追問在給定的計算能力約束下如何把一個問題解決得更快更好屋灌。而系統(tǒng)走的是廣度,是在追問對于一個現(xiàn)實的需求如何在眾多的技術(shù)中設(shè)計出最多快好省的技術(shù)組合应狱。
搞ACM的人共郭,只練第一類。像你這樣的更偏向于第二類侦香。其實挺難得的落塑,但很可惜的是第二類能力沒有簡單高效的測量考察方法,不像算法和數(shù)據(jù)結(jié)構(gòu)有ACM競賽罐韩,所以很多系統(tǒng)的苗子都因為缺少激勵和正確引導(dǎo)慢慢就消隱了憾赁。
所以比爾蓋茨才會說,看到現(xiàn)在學(xué)編程的人經(jīng)常都把編程看作解各種腦筋急轉(zhuǎn)彎的問題散吵,他覺得很遺憾龙考。
做系統(tǒng)蟆肆,確實不提倡“重復(fù)發(fā)明輪子”。但注意晦款,是不提倡“重復(fù)發(fā)明”炎功,不是不提倡“重新制造”。恰恰相反的缓溅,我以為蛇损,系統(tǒng)的編程能力正體現(xiàn)在“重新制造”的能力。
能把已有的部件接起來坛怪,這很好淤齐。但當(dāng)你恰好缺一種關(guān)鍵的膠水的時候,你能寫出來嗎袜匿?當(dāng)一個已有的部件不完全符合你的需求的時候更啄,你能改進它嗎?如果你用的部件中有bug居灯,你能把它修好嗎祭务?在網(wǎng)上繁多的類似功能的部件中,誰好誰壞怪嫌?為什么义锥?差別本質(zhì)嗎?一個開源代碼庫喇勋,你能把它從一個語言翻譯到另一個語言嗎缨该?從一個平臺移植到另一個平臺嗎?能準(zhǔn)確估計自己翻譯和移植的過程需要多少時間嗎川背?能準(zhǔn)確估計翻譯和移植之后性能是會有提升還是會有所下降嗎贰拿?
系統(tǒng)編程能力體現(xiàn)在把已有的代碼拿來并變成更好的代碼,體現(xiàn)在把沒用的代碼拿來并變成有用的代碼熄云,體現(xiàn)在把一個做好的輪子拿來能畫出來輪子的設(shè)計藍圖膨更,并用道理解釋出設(shè)計藍圖中哪些地方是關(guān)鍵的,哪些地方是次要的缴允,哪些地方是不容觸碰的荚守,哪些地方是還可以改進的。
如果你一點不懂理論练般,還是應(yīng)該學(xué)點的矗漾。對于系統(tǒng)性能的設(shè)計上,算法和數(shù)據(jù)結(jié)構(gòu)就像在自己手頭的錢一樣薄料,它們不是萬能的敞贡,但不懂是萬萬不行的。
怎么提高系統(tǒng)編程能力呢摄职?土辦法:多造輪子誊役。就像學(xué)畫畫要畫雞蛋一樣获列,不是這世界上沒有人會畫雞蛋,但畫雞蛋能馴服手指蛔垢,感受陰影線條和筆觸击孩。所以,自己多寫點東西吧鹏漆。寫個編譯器巩梢?渲染器?操作系統(tǒng)艺玲?web服務(wù)器且改?web瀏覽器?部件都一個個換成自己手寫的板驳,然后和已有的現(xiàn)成部件比一比,看看誰的性能好碍拆,誰的易用性好若治?好在哪兒?差在哪兒感混?為什么端幼?
更聰明一點的辦法:多拆輪子。多研究別人的代碼是怎么寫的弧满。然而這個實踐起來經(jīng)常很難婆跑。原因:大部分工業(yè)上用的輪子可能設(shè)計上的思想和技術(shù)是好的,都設(shè)計和制造過程都很爛庭呜,里面亂成一團滑进,讓人乍一看毫無頭緒,導(dǎo)致其對新手來說非常難拆募谎。這種狀況其實非常糟糕扶关。所以,此辦法一般只對比較簡單的輪子好使数冬,對于復(fù)雜的輪子节槐,請量力而行。
輪子不好拆拐纱,其實是一個非常嚴(yán)重的問題铜异。重復(fù)發(fā)明輪子固然是時間的浪費,但當(dāng)輪子復(fù)雜而又不好拆的時候秸架,尤其是原來造輪子的人已經(jīng)不在場的時候揍庄,重新發(fā)明和建造輪子往往會成為無奈之下最好的選擇。這是為什么工業(yè)界在明知道重復(fù)發(fā)明/制造輪子非常不好的情況下還在不斷重復(fù)發(fā)明/制造輪子的根本原因咕宿。
程序本質(zhì)是邏輯演繹的形式化表達币绩,記載的是人類對這個世界的數(shù)字化理解蜡秽。不能拆的輪子就像那一篇篇丟了曲譜的宋詞一樣,能讀缆镣,卻不能唱芽突。
鄙人不才,正在自己研究怎么設(shè)計建造一種既好用又好拆的輪子董瞻。您沒那么幸運寞蚌,恐怕是等不到鄙人的技術(shù)做出來并發(fā)揚光大了。在那之前钠糊,多造輪子挟秤,多拆好拆的小輪子,應(yīng)該是提高編程能力最好的辦法了抄伍。
以上艘刚。嗯。
(文章屬個人觀點截珍,與本人工作雇主無關(guān)攀甚。)
作者:劉賀
鏈接:https://www.zhihu.com/question/31034164/answer/50423838
來源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)岗喉,非商業(yè)轉(zhuǎn)載請注明出處秋度。