淺論自學(xué)成才的程序員如何提高自我
有事者,事竟成;破釜沉舟,百二秦關(guān)終歸楚;苦心人,天不負(fù);臥薪嘗膽,三千越甲可吞吳。這句話,古今往來不知道激勵(lì)了多少寒門學(xué)子。在今天,這句話用在那些自學(xué)成才的程序員身上,也是極其合適的。你知道嗎?有很多著名的程序員,其實(shí)并不是科班出身,而是靠自學(xué)成才的半路出家的“野生程序員”,比如 Bill Gates。如果你不是科班出身的程序員,而是靠自學(xué)成才的,那么該如何提高自身呢?今天,我們來聽聽過來人 Matthew MacDonald 分享的心得和經(jīng)驗(yàn)。
如果你是自學(xué)成才的程序員,可能會(huì)遇到一些盲點(diǎn),本文為你介紹了如何查漏補(bǔ)缺的方法。
如果你是一名開發(fā)人員,你可能會(huì)有一個(gè)如何走上編程之路的故事,但我并不是指你第一次是如何學(xué)會(huì)編寫代碼的故事,盡管這個(gè)故事可能與本文要講的內(nèi)容有所重疊。我的意思是,當(dāng)你第一次決定用邏輯和軟件指令來解決一個(gè)新問題的時(shí)候;當(dāng)你決定將代碼作為永久有用的工具放入你的工具箱的時(shí)候;事情轉(zhuǎn)變的那一刻,你決定成為一名真正的程序員。
我的編程之路,與大約 三分之一 的專職程序員一樣,并沒有正式的計(jì)算機(jī)科學(xué)學(xué)位。但我從小就喜歡鼓搗電腦,是傳奇的 QuickBasic 和 VB 伴著我長(zhǎng)大的,而這些愛好在當(dāng)時(shí),仍然是一種新奇的事物。我知道,不管我最終是否會(huì)進(jìn)入計(jì)算機(jī)領(lǐng)域,這個(gè)巨大的 米色盒子(譯注:所謂的米色盒子,就是個(gè)人電腦主機(jī),當(dāng)時(shí)主機(jī)體積比今天大得多)將會(huì)以某種形式,永遠(yuǎn)成為我生活的一部分。但在我上大學(xué)的時(shí)候,我更感興趣的是學(xué)習(xí)那些我自認(rèn)為并沒有機(jī)會(huì)自學(xué)的課程,比如粒子物理。
但也許這并不是一個(gè)壞主意,因?yàn)椋掖_實(shí)找到了一條通往專業(yè)編程的道路。當(dāng)我在一個(gè)不那么有趣的崗位上工作時(shí),我就利用空閑時(shí)間來學(xué)習(xí)和考取證書。不久之后,我就進(jìn)入了一個(gè)全新的領(lǐng)域,并突然為之著迷,比如密碼學(xué)、網(wǎng)絡(luò)協(xié)議和數(shù)據(jù)庫(kù)優(yōu)化等。當(dāng)然,我也開始編寫程序來填補(bǔ)我在公司工作中的空缺,比如報(bào)告工具、訂購(gòu)工具,以及可以完成本不該做某些事情的軟件,比如依賴不穩(wěn)定的 ActiveX 控件。不久之后,.NET 出現(xiàn)了,我遇到了一些 非常聰明的人,并且難得有機(jī)會(huì)重塑自己,并重置了 Microsoft 出色的平臺(tái)。剩下的就是歷史了。
作為一名自學(xué)成才的程序員,我很清楚我的基礎(chǔ)并不完美。當(dāng)然,也有未受過正規(guī)教育而自學(xué)成才的 軟件傳奇人物 和 黑客天才。但是,如果你不是神童,而是一個(gè)普通人的話,那么自學(xué)技能就會(huì)伴隨著一個(gè)巨大的“星號(hào)”(*)。有差距,也有盲點(diǎn)。對(duì)于許多自學(xué)成才的程序員來說,他們很難確定自己到底缺少了哪些知識(shí)或技能。因此,我寫下本文的初衷,就是為那些自學(xué)成才的開發(fā)人員提供提高技能的快速指南。
你不知道哪些事情你還不知道
自學(xué)編程最大的局限性就是,你不知道哪些事情你還不知道。是的,無知確實(shí)會(huì)發(fā)生在任何人身上,哪怕他擁有博士學(xué)位。但是,由于自學(xué)成才的程序員會(huì)堅(jiān)持不懈地專注于實(shí)際目標(biāo),如建立網(wǎng)站,讓應(yīng)用程序運(yùn)行,將數(shù)據(jù)從 A 點(diǎn)傳到 B 點(diǎn),因此,他們更容易跳過那些看上去 “沒什么大用”的理論內(nèi)容。
以下是一些來自計(jì)算機(jī)科學(xué)核心的話題,而自學(xué)成才的程序員往往會(huì)繞過這些話題:
算法。 因?yàn)榫幊陶Z(yǔ)言實(shí)現(xiàn)了它們自己的排序和搜索,所以自學(xué)成才的程序員總是傾向于學(xué)習(xí)如何使用它們,而不是去了解它們的工作原理。
計(jì)算理論。 這是關(guān)于計(jì)算機(jī)如何解決問題,以及編程語(yǔ)言如何構(gòu)建的一門科學(xué)。從有限狀態(tài)機(jī)到 Λ 演算,在這一類中,有一大堆重量級(jí)的主題。
純數(shù)學(xué)。 傳統(tǒng)的計(jì)算機(jī)科學(xué)涉及范圍廣泛的重要數(shù)學(xué)主題,包括線性代數(shù)、微積分、概率論和統(tǒng)計(jì)學(xué)。
大〇符號(hào)法(Big O notation)。 這個(gè)改編自數(shù)學(xué)領(lǐng)域的工具,讓開發(fā)人員能夠描述并比較不同算法的整體性能。
當(dāng)然這并不是說,自學(xué)成才的程序員就不能自己學(xué)習(xí)這些課程了。只是,當(dāng)有另一個(gè)新的 JavaScript 框架需要解決的時(shí)候,你就很難將自己投入到理論中去。而且,由于自學(xué)成才的程序員專注于實(shí)踐項(xiàng)目和工作代碼,他們甚至可能沒有意識(shí)到實(shí)際代碼表面下的理論“冰山“。
縮小計(jì)算機(jī)科學(xué)理論差距
雖然計(jì)算機(jī)科學(xué)理論可能不會(huì)有立竿見影的效果,但它還是有其他好處的,只不過沒有那么明顯罷了。實(shí)際上,前面列表中所有看似深?yuàn)W的主題,在適當(dāng)?shù)臅r(shí)候可能都是至關(guān)重要的:
算法。 有時(shí)候,默認(rèn)選擇并非最佳選擇。如果你有更深刻的理解,你就會(huì)知道什么時(shí)候該走出老路,或者如何解決一個(gè)不尋常的問題。
縮小差距:閱讀 Algorithms in a Nutshell(《果殼中的算法》http://shop.oreilly.com/product/9780596516246.do),這是我最喜歡的一本書,或者你可以去可汗學(xué)院( Khan Academy)轉(zhuǎn)一轉(zhuǎn)。
計(jì)算理論。 大多數(shù)程序員永遠(yuǎn)不會(huì)去構(gòu)建自己的編程語(yǔ)言(雖然 你可以這么做)。但是計(jì)算理論為你提供了抽象概念,幫助你理解不同語(yǔ)言之間的聯(lián)系。如果你需要從過程式編程語(yǔ)言轉(zhuǎn)到函數(shù)式語(yǔ)言,那么你就會(huì)感到掌握計(jì)算理論后,完成這一過程特別方便。
縮小差距:這個(gè)是很難自學(xué)的領(lǐng)域之一,但你可以通過免費(fèi)的虛擬教室來學(xué)習(xí)很多東西。Neso 學(xué)院就有我最喜歡的關(guān)于這一主題的 系列講座(https://www.youtube.com/playlist?list=PLBlnK6fEyqRgp46KUv4ZY69yXmpwKOIev),有 100 多個(gè)小視頻。這些講座講得很深入,但每期只需十分鐘就能看完。
純數(shù)學(xué)。 許多程序員在生活中,甚至到退休的時(shí)候,連一行高等數(shù)學(xué)都沒有接觸過。但是,如果你正在從事機(jī)器學(xué)習(xí)、自然語(yǔ)言處理、數(shù)據(jù)分析或軟件開發(fā)前言的十幾個(gè)其他主題中的任何一個(gè),那么硬數(shù)學(xué)還是必不可少的。
縮小差距:如果你已準(zhǔn)備好動(dòng)手,可以從非常容易理解的 A Programmer’s Introduction to Mathematics(《程序員數(shù)學(xué)指南》https://pimbook.org/)這本書開始,這是隨你付的下載版本。
譯注: 隨你付,Pay what you want (PWYW)是賣家按所望付費(fèi) —— 有時(shí)也含免費(fèi) —— 的定價(jià)策略。商品或設(shè)最低價(jià)和 / 或指導(dǎo)建議價(jià),買家也能出更高價(jià)購(gòu)買。
大〇符號(hào)法。 要成為一名高效的開發(fā)人員,一定要有一種可以用來與同行交流的速記工具。雖然你不會(huì)經(jīng)常使用大〇符號(hào)法(也許永遠(yuǎn)不會(huì)用上),但如果你需要討論如何優(yōu)化復(fù)雜的分布式系統(tǒng),它可能就會(huì)派上用場(chǎng)了。
縮小差距: 大〇符號(hào)法很好學(xué)。你可以在 這里(https://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/) 找到一個(gè)不錯(cuò)的概述。
我為你提供一些好建議。如果你是自學(xué)成才的程序員,那就抽點(diǎn)時(shí)間(比如 5%)去研究更多的理論性課題。就用上面列表中的鏈接即可。就算你在日常工作中用不著這些知識(shí),但它也能拓寬你的視野,培養(yǎng)你的好奇心,并幫助你理解計(jì)算機(jī)科學(xué)中一些更深層次的奧秘。畢竟,正如每個(gè)經(jīng)驗(yàn)豐富的程序員都知道的那樣:除非你去使用理論,否則你永遠(yuǎn)不會(huì)去使用。
你的信心何在?
規(guī)劃計(jì)算機(jī)教育的最重要好處,可能并不在于你學(xué)到了哪些關(guān)于計(jì)算機(jī)科學(xué)的知識(shí),而是在于你學(xué)會(huì)了如何看待自己。
無論是自學(xué)成才的程序員,還是受過正規(guī)教育的程序員,當(dāng)他們剛進(jìn)入職場(chǎng)時(shí),都會(huì)存在知識(shí)差距。但是,自學(xué)成才的程序員更可能會(huì)感受到一種揮之不去的恐懼:擔(dān)心他們的技能不完整或不合理。他們還擔(dān)心,有些事情他們應(yīng)該知道,但卻從來沒有通過 Google 搜索核實(shí)過。他們還擔(dān)心其他語(yǔ)言和計(jì)算理論的核心知識(shí)。還有一件令人驚訝的事是,他們居然還擔(dān)心發(fā)音的問題,認(rèn)為用錯(cuò)誤的方式來講述編碼器行話時(shí)會(huì)暴露出他們是 “江湖騙子”。通常強(qiáng)調(diào)的詞匯包括技術(shù)(SQL、ECMAScript、JSON、Wasm)、技術(shù)術(shù)語(yǔ)(貝葉斯、元組),甚至是符號(hào)(#!、或 “hashbang”。)。
然而,自我懷疑并不全是壞事,畢竟,它可以驅(qū)使你去尋找新的知識(shí)不是?但是,當(dāng)你需要向客戶、同事或潛在雇主表明自己是程序員時(shí),這些不安全感可能會(huì)傷害到你。
解決這些問題的最好辦法就是參與盡可能多的對(duì)話。你不可能研究軟件開發(fā)的每一條途徑,但你可以通過與盡可能多的不同類型的程序員打交道來拓寬你的視野。下面,我提供了一些建議:
參加當(dāng)?shù)鼐蹠?huì)。 這些聚會(huì)沒有黑客馬拉松那么令人生畏(盡管這些也很棒),而且你還會(huì)發(fā)現(xiàn),經(jīng)驗(yàn)豐富的程序員出人意料地如此渴望社交和分享他們的知識(shí)。
參加會(huì)議。 如果你能負(fù)擔(dān)得起,沒有什么比圍繞你感興趣的主題組織的面對(duì)面會(huì)議更能抓住新技術(shù)的興奮點(diǎn)了。這就好比軟件框架下的快速約會(huì)一樣。你還可以通過 “感受房間的溫度”。(譯注:指參加會(huì)議之類)學(xué)到很多東西——換句話說,對(duì)演講和研討會(huì)的反應(yīng)可以幫助你判斷哪些技術(shù)背后有社區(qū)熱情,哪些新項(xiàng)目可能會(huì)蓬勃發(fā)展。
加入開源項(xiàng)目。 這個(gè)門檻就更高了:你必須真正地編寫代碼,而不僅僅是喝咖啡和聽音樂,但帶來的回報(bào)是巨大的。在結(jié)構(gòu)化的環(huán)境中,哪怕是一個(gè)簡(jiǎn)單的項(xiàng)目,與其他程序員進(jìn)行交互,也能夠訓(xùn)練你從十幾個(gè)不同的角度來看待一段代碼。
作為附帶的好處,人脈關(guān)系網(wǎng)對(duì)你職業(yè)前景的好處遠(yuǎn)超于建立一個(gè)最好的投資組合網(wǎng)站。
所有編程都趨向于自學(xué)
對(duì)專職程序員的調(diào)查表明,自學(xué)成才的程序員始終是少數(shù)。但換一種方式來提個(gè)問題,情況就不同了。
例如,以 Hacker Rank 的調(diào)查為例,它發(fā)現(xiàn)了這么一種現(xiàn)象:自學(xué)成才和只在學(xué)校接受教育的開發(fā)人員,在所有程序員中所占比例都略低于三分之一。但是,將正規(guī)學(xué)習(xí)和自學(xué)結(jié)合起來的開發(fā)人員的比例反而超過了這兩者,占到了近 38%。
這并不奇怪。在瞬息萬(wàn)變的軟件開發(fā)世界中,每個(gè)程序員都離淘汰只有幾步之遙。最成功的程序員,都是那些能夠不斷自學(xué)的人。
正規(guī)的計(jì)算機(jī)科學(xué)教育是一種優(yōu)勢(shì)。但自我提高的能力也是必不可少的。
這就是自學(xué)成才的程序員的收獲。這并不是說,有正規(guī)計(jì)算機(jī)科學(xué)教育背景的程序員就沒有自學(xué)的能力。但自學(xué)成才的程序員已經(jīng)面臨著一場(chǎng)嚴(yán)峻的考驗(yàn):他們一無所有,就一頭扎進(jìn)去,擁有的只是好奇心和赤裸裸的野心,就學(xué)會(huì)了他們需要的東西。這項(xiàng)技能,將會(huì)為你的整個(gè)職業(yè)生涯帶來回報(bào)。
作者介紹:
Matthew MacDonald,教師、程序員、重磅書籍的作者。