中級程序員還應(yīng)該如何提高自己?
想法和問題
當(dāng)程序員已經(jīng)處于中級時(shí),應(yīng)如何提高自己?有很多關(guān)于“學(xué)習(xí)編程”的資源,能夠讓人從0到新手(雖然這些資源中大多數(shù)的質(zhì)量是值得商榷的),但是怎么樣才能將中級水平提高到專家級?如何構(gòu)建允許我在高級別編寫代碼的心理模型?
在這篇文章中,我將討論關(guān)于普遍性能改進(jìn)的一些理論,然后討論一些程序員用于實(shí)踐的方法(以及我對這些實(shí)踐的想法),然后是我對改進(jìn)成為中級或更優(yōu)秀程序員的***方法所作出的結(jié)論。
關(guān)于普遍性能改進(jìn)的快速指南
我最近一直在閱讀大量關(guān)于性能改進(jìn)的內(nèi)容,大多數(shù)文獻(xiàn)使用K. Anders Ericsson的研究作為起點(diǎn)。他是性能研究的杰出面代表,幾乎在所有涉及這個(gè)主題的書中都被引用。他今年發(fā)表的書《Peak: Secrets from the New Science of Expertise》,濃縮其30多年的研究,易于理解,這也是我推薦給大多數(shù)新手的單個(gè)***資源。
簡要總結(jié)上下文:
- 改進(jìn)任務(wù)的執(zhí)行來自于開發(fā)更好的心理模式,更好的心理模式通過有意或有目的的實(shí)踐。
- 為了能夠?qū)崿F(xiàn)改進(jìn),必須能夠定義什么構(gòu)成改進(jìn)性能并且分解實(shí)現(xiàn)步驟。
- 實(shí)踐和性能是不同的,***的實(shí)踐方法幾乎從不是性能。例如:一個(gè)想要提高擊中的棒球運(yùn)動(dòng)員應(yīng)該花費(fèi)30分鐘在練習(xí)場中練習(xí)200個(gè)投球(實(shí)踐),而不是用2個(gè)小時(shí)去比賽中觀看15個(gè)投球(性能)。
提高方法
我發(fā)現(xiàn)人們建議的大多數(shù)關(guān)于編程的改進(jìn)方法就是基于性能的。閱讀代碼,閱讀關(guān)于代碼的內(nèi)容,編寫代碼,做項(xiàng)目,談?wù)摯a等等。如果他們在自己的工作之外做這些事情,那么程序員基本上肯定會(huì)有所提高,但似乎不是很有效率。
如果我想更擅長于編程,但每周我只想從自己的時(shí)間中花幾個(gè)小時(shí)致力于編程呢?什么是建立更佳心理模型的最有效方式,以便于我可以做出更明智的決定? 《Peak》一書中關(guān)于刻意實(shí)踐的一個(gè)***例子是音樂家。想要提高特定樂器的技能或?qū)W習(xí)一首新的音樂,是有經(jīng)過定義的,標(biāo)準(zhǔn)化的方式的;包括一個(gè)音樂家在幾個(gè)月的時(shí)間里學(xué)習(xí)一首新音樂的例子——每日只是刻意練習(xí)5分鐘。而在編程中,我們沒有大量的明確目標(biāo)或改進(jìn)措施(即:在某一段音樂作品的錯(cuò)誤的數(shù)量),但其他的我發(fā)現(xiàn)都沒有這個(gè)比喻接近。
那么,我們?nèi)绾蔚玫轿覀冏鳛槌绦騿T的性能反饋循環(huán)?是的,我們有特定片段代碼的反饋循環(huán),無論代碼是否工作,它的性能和健壯性如何等等。我們對于系統(tǒng)的穩(wěn)健性有一個(gè)更長的反饋循環(huán),因?yàn)樗鼈冊谪?fù)載下會(huì)跌倒或隨著時(shí)間的推移會(huì)變得笨拙。但是我們并不經(jīng)常得到問題方法的實(shí)時(shí)反饋。
下面是我用來學(xué)習(xí)編程的方法,有些地方很不錯(cuò),也有些地方值得改進(jìn):
通過編程挑戰(zhàn)實(shí)踐
我享受于編程挑戰(zhàn),但一般來說,我發(fā)現(xiàn)它們不值得去接觸一種新的編程語言。它們提供弱反饋循環(huán)——你的程序要么產(chǎn)生正確的輸出要么不產(chǎn)生——并且不會(huì)給你對設(shè)計(jì)過程的反饋。這個(gè)方法可能會(huì)介紹一個(gè)新的算法或一個(gè)你不熟悉的語言的新功能,但在實(shí)踐方面,很弱。比起“實(shí)踐”,它更接近于“性能”,并且你處理的是人為的問題,而不是真正的問題。
我發(fā)現(xiàn)的一個(gè)例外是由@ericwastl的Advent Of Code。編程問題很好地模擬了現(xiàn)實(shí)生活中的問題(需求定義明確,但是邊緣情況沒有寫入規(guī)范并且必須隱含),并且對于解決方案有多么設(shè)計(jì)良好具備即時(shí)反饋,因?yàn)閷γ總€(gè)拋出額外需求或一些其他困難的問題有part 2,這意味著你必須重新評估你的原始解決方案有多少精心設(shè)計(jì)。這并不***,但我喜歡看到我的解決方案具有挑戰(zhàn)性,并且經(jīng)常不得不重新考慮我的解決方案的結(jié)構(gòu)和設(shè)計(jì),當(dāng)我達(dá)到part 2的時(shí)候。
做業(yè)余項(xiàng)目
做業(yè)余項(xiàng)目,如果你有一個(gè)的話,將是投入額外編程時(shí)間的偉大方式;如果你做一些你喜歡的事情的話,你就不會(huì)覺得這像工作。不幸的是,因?yàn)轫?xiàng)目參差不齊,所以你可能不會(huì)真正學(xué)到東西。如果你的業(yè)余項(xiàng)目與想要學(xué)習(xí)的編程內(nèi)容相一致的話,那么恭喜你,這是一個(gè)好選擇,否則它只是性能vs實(shí)踐的另一個(gè)版本。即使在***的情況下,如果主要目標(biāo)是生產(chǎn)某種東西,那就意味著實(shí)踐和學(xué)習(xí)得排在后面。
閱讀關(guān)于編程實(shí)踐的書
閱讀編程書籍是一個(gè)快速提升知識的很好方式,我認(rèn)為它應(yīng)該是幾乎任何“提高編程”方案的一部分。然而,它并非是讓人能夠一勞永逸的銀彈。純粹的知識獲取可以幫助你知道有哪些可用的選項(xiàng),當(dāng)你碰到某個(gè)問題的時(shí)候,但知識不能代替更好的心理模型。
最終建議
不幸的是,我沒有能夠得出具體的結(jié)論。也許答案是,需要有編程教練或?qū)?,以便可以得到針對性的反饋和具體的實(shí)踐建議。也許這學(xué)科還太年輕,沒有正式的性能改進(jìn)方法,不像古典音樂訓(xùn)練和運(yùn)動(dòng)訓(xùn)練。
在評論中告訴我你的想法。我特別想聽聽那些通過教學(xué)/訓(xùn)練/指導(dǎo)而高水平產(chǎn)出的程序員的看法,或者在這樣的老師下學(xué)習(xí)的人。
如果我對程序員的性能改進(jìn)有任何更明確的想法,一定會(huì)再寫一個(gè)后續(xù)帖子。謝謝閱讀。