如何成為一名更優(yōu)秀的程序員?我總結(jié)出 7 條建議
想成為一名優(yōu)秀程序員?本文作者用自己十幾年的經(jīng)驗(yàn),提出了七條建議和具體措施。
有幾個(gè)人在 React 大會(huì)上向我請(qǐng)教一個(gè)問題——如何成為一名更優(yōu)秀的程序員。人們將我視為一名非常資深的程序員,因此值得聽聽我的建議。我覺得可以分享一下,自己多年來在編程方面的“思維模式”。
先簡(jiǎn)要自我介紹一下:我叫 James Long,今年 32 歲,有超過 10 年的豐富工作經(jīng)驗(yàn)。不過,直到近幾年,我才對(duì)自己的工作越來越有信心。即使現(xiàn)在,我還是不斷懷疑自己。關(guān)鍵是這種感覺不會(huì)消失,所以試著忽略它,繼續(xù)深究技術(shù)知識(shí),繼續(xù)積累經(jīng)驗(yàn)。
我再次提醒一下,這些只是提高你技能的幾點(diǎn)建議。最終,你需要弄清楚自己適合的方式是什么。
1. 找到能激勵(lì)你的人,但不要崇拜他們
過去許多年,我仰慕過許多人,并且通過他們關(guān)注新技術(shù)。我相信他們是正確的,并且對(duì)他們所做的事情深入研究,因此學(xué)到很多。
這些人往往非常高效、才華橫溢,并且能鼓舞人心。你要想盡辦法找到他們,讓他們激勵(lì)和指導(dǎo)你。
不過,別崇拜他們。如果僅看 twitter 上的貼子,你會(huì)覺得他們遙不可及。但是,如果走近他們的真實(shí)工作中,你會(huì)發(fā)現(xiàn)自己與他們相比沒什么不同。只不過在到處摸索嘗試而已,我們都只是在進(jìn)行試驗(yàn)。
最后,不要盲目地相信他們。如果你有不同意見,就請(qǐng)他們參與進(jìn)來,并從觀點(diǎn)碰撞的過程中汲取經(jīng)驗(yàn)。
我的一些最有成效的對(duì)話就是這樣發(fā)生的。曾經(jīng),我的 Emacs 配置一團(tuán)糟。不知道為什么,我的 OCaml autocompletion 不能用了(它壞了一個(gè)多月)。我沒有自動(dòng)化的東西,有時(shí)必須在 shell 歷史中尋找所需的命令。為修復(fù)問題,我一開始寫 ugliest 代碼。我將東西寫成全局對(duì)象,直到最后才明白我到底做了什么。
最有經(jīng)驗(yàn)的程序員一直在破解和鉆研;最重要的是,你能完成任務(wù),達(dá)成目標(biāo)。
2. 不要貶低自己的工作
程序員小白往往認(rèn)為他們的工作價(jià)值不大,因?yàn)樗麄兪切率?。或者你可能是一名有?jīng)驗(yàn)的程序員,但是在一個(gè)新領(lǐng)域工作,這會(huì)讓你感到不爽。但在我看來,最好的想法往往來自于新程序員,他們可以看到現(xiàn)有技術(shù)的改進(jìn)點(diǎn),而思維固化的人卻看不見。
不管怎樣,你的工作都是值得的。最壞的情況是,即使你的想法沒有成功,社區(qū)也可以從中了解到為什么這種方法行不通。
(給社區(qū)的一個(gè)提示:這要取決于我們是怎么做的,并讓新人很容易融入進(jìn)來。)
3. 不要因?yàn)楹ε侣湮槎煌9ぷ?/h2>
每天都會(huì)有新技術(shù)問世,如果你一晚上不碰技術(shù),可能就會(huì)感覺跟不上這個(gè)世界。這不是真的。事實(shí)上,如果經(jīng)常放下手頭工作,你會(huì)做得更好,因?yàn)槟銜?huì)有新想法。
我發(fā)現(xiàn),當(dāng)不工作的時(shí)候,我總會(huì)有新想法不斷產(chǎn)生。
實(shí)際上,網(wǎng)絡(luò)上每天發(fā)布的內(nèi)容大多是“新瓶裝舊酒”,真正具有革命性的技術(shù)每隔幾年才會(huì)出現(xiàn)一次。關(guān)于這個(gè)問題,你可以看看這個(gè)視頻—— Hammock Driven Development 。
https://www.youtube.com/watch?v=f84n5oFoZBc
4. 忽略 fluff
客觀上說,你能取得更快進(jìn)步的主要方法之一是忽略那些并不能提高技能的“fluff”。換句話說,要“聰明的利用時(shí)間”。一天的時(shí)間有限,你需要將時(shí)間花在鉆研更深層次的事情上。隨著時(shí)間的發(fā)展,你會(huì)發(fā)現(xiàn)自己有很大進(jìn)步。
那什么是“fluff”?這取決于你自身的具體情況。但是,我可以給你一些我認(rèn)為是“fluff" 的例子:語言語法、庫 API 和配置構(gòu)建工具。例如,學(xué)習(xí)一個(gè)新的 ES7 JS 語法并不會(huì)讓你成為一個(gè)更好的程序員,這就像學(xué)習(xí)編譯器是如何工作的一樣。同樣,采用一個(gè)實(shí)現(xiàn)相同想法卻使用新 API 的新庫也沒多大意義。當(dāng)然,這些事情很重要,但我建議你花更多時(shí)間學(xué)習(xí)更深層次的概念。這些概念可以讓你終生受益匪淺。
我有個(gè)問題想問你:你是否花費(fèi)大把時(shí)間讓代碼看起來很漂亮?如果是這樣,我建議你不要太關(guān)注這樣的事。不管怎樣,隨著時(shí)間發(fā)展,你的代碼會(huì)有很多改變。
最好將注意力集中在你試圖解決的核心問題上,比如仔細(xì)考慮一下你的抽象層。在完成所有這些工作后,你可以花點(diǎn)時(shí)間來改進(jìn)代碼。這也適用于 DRY 原則(Don’t Repeat Yourself,不要寫重復(fù)的代碼)。不過別那么擔(dān)心,隨意復(fù)制粘貼吧。
5. 深入學(xué)習(xí)過去的研究成果
如果你有一個(gè)新想法,就會(huì)感到很興奮,情不自禁地想坐下來馬上行動(dòng)。但是,你不應(yīng)該這樣做,你應(yīng)該先做一些粗略研究,了解前人是如何解決它的。碰到類似情況時(shí),先花幾天時(shí)間研究一下,最終會(huì)徹底改變我們解決問題的方式。
學(xué)會(huì)閱讀學(xué)術(shù)論文是一項(xiàng)很寶貴的技能。我對(duì) denotational、operational 等語義一無所知,所以我看不懂很多論文。但是,有很多論文使用代碼而不是數(shù)學(xué)公式來闡述問題,因此并不會(huì)太難讀。過去 30 年來,有大量的知識(shí)通過論文發(fā)表出來。如果你善于獲取這些信息,你很快就會(huì)成為思想領(lǐng)袖。
Prettier 是一個(gè)佳例。我知道自己想要的是什么,但不知道如何實(shí)現(xiàn)它。做過一些研究后,我發(fā)現(xiàn)這篇論文,再過幾天后,我就知道怎么做了。我在一周內(nèi)就把主體工作全完成了。如果忽略別人的研究成果,那我就要花更長時(shí)間。
http://homepages.inf.ed.ac.uk/wadler/papers/prettier/prettier.pdf
如果你想尋找論文的話,GitHub 庫 Papers We Love 是一個(gè)推薦。
https://github.com/papers-we-love/papers-we-love
6. 去參與一些大項(xiàng)目
經(jīng)驗(yàn)比任何東西都寶貴。不是每個(gè)人都有機(jī)會(huì)去嘗試,但如果有時(shí)間,你可以試著去做一些大項(xiàng)目。你甚至不需要去完成它們。僅僅是嘗試寫一個(gè)編譯器之類的東西,這就能在開始幾周教你很多東西。
說實(shí)話,我很討厭那種我不知道如何解決復(fù)雜問題的感覺。這讓人很痛苦。在接近解決方案前,我必須做大量的研究和學(xué)習(xí)。有過這樣的痛苦經(jīng)歷后,我總是可以得到提升,成為更優(yōu)秀的程序員。
從學(xué)習(xí)一門新語言開始。這是幫你擺脫當(dāng)前習(xí)慣和從新角度看問題的最有效方法。
對(duì)我來說,當(dāng)我還是一個(gè)年輕的程序員時(shí),我做的最好事情就是學(xué)習(xí) Scheme 。這是一門非常簡(jiǎn)單的語言,它會(huì)強(qiáng)迫你以函數(shù)式的方式完成所有事情,并真正了解代碼工作的基本原理。我在 Scheme 上花費(fèi)數(shù)年時(shí)間,直到今天仍然受益。并且,我對(duì)代碼的看法發(fā)生根本性改變。
7. 建議做的六件事
我推薦做幾件事,這些都我的程序員生涯產(chǎn)生重大影響。并且,他們中的許多事直到現(xiàn)在還以微妙的方式影響我,幫我對(duì)新想法進(jìn)行分析。為了成為一名優(yōu)秀的程序員,你無需做完全相同的事,你可以學(xué)習(xí)很多其他東西提高自己。
學(xué)習(xí) C 語言——如果你沒學(xué)過,學(xué)一些基本的就夠了。試著去想想,為什么每個(gè)人都抱怨它,這件事非常有價(jià)值。
寫一個(gè)編譯器——這可能讓你很不爽,可以看看 super tiny compiler 項(xiàng)目。
學(xué)習(xí)宏——請(qǐng)參考 Scheme、Lisp 或 Clojure(腳本)。宏會(huì)真正改變你對(duì)代碼的看法。
SICP—— SICP 是一本舊書,我認(rèn)為直到今天仍然很有價(jià)值(有些人或許不贊成這個(gè)觀點(diǎn))。只要你有很少的編程知識(shí),它就可以引導(dǎo)你一直實(shí)現(xiàn) a meta-circular evaluator 和 compiler。另一本,我很喜歡并在編譯器方面做過深入研究的書是 Lisp In Small Pieces 。
了解 Continuations:Continuations 是一種低級(jí)的控制流機(jī)制。Scheme 是唯一實(shí)現(xiàn)它的語言。雖然你永遠(yuǎn)不會(huì)在生產(chǎn)環(huán)境中使用它們,但它們會(huì)改變你對(duì)控制流的看法。我寫過一篇試著解釋它們的博文。
如果有可能的話,試著使用一種新語言:不管你做什么,你真的應(yīng)該探索其他語言。我推薦以下任何一個(gè):Clojure、Rust、Elm、OCaml/Reason、Go 或 Scheme 都可以。它們都有自己的特點(diǎn),可以驅(qū)使你學(xué)習(xí)一種新的思維方式。