為什麼寫程式這麼難?

自學寫程式

【我們為什麼挑選這篇文章】 自學寫程式究竟有多難?又或者說,這一漫長過程中將經歷哪些障礙?這篇文章恐怕講進了許多工程師的心坎裡:想當初就是這樣一路辛苦學會程式的啊!但現在回頭一看,一切都是值得的!(責任編輯:劉庭瑋)

對每一個決心學習寫程式的工程師來說,入坑之前,你也許只是一個「穿著正裝在辦公室裡上班」的人。

你的學習歷程可能是這樣:如同一片樹葉,開始被各種建議拽著走,直到學完了每一個你能想像到的線上課程。

最後,雖然你成功拿下了一份軟體開發的工作,但也對工程師有了新的認知:「那些看似正常的工程師們其實都是些『反社會』的怪人,鬼才知道他們經歷了什麼樣的精神創傷。」

一份常見的程式學習過程:先從 Ruby 著手。很快,開始穿梭在 Scala, Clojure 和 Go 等其他語言中了。學習了 Emacs,接著是 Vim,甚至還了解了 Dvorak 鍵盤佈局。接著又學習了 Linux,甚至還涉獵了 Lisp,以及用 Python 寫過程式,後來一直在命令行駐足半年多。

一起來看一下學習寫程式要經歷哪幾個階段:

階段一:手把手蜜月期

我們從小就聽說過寫程式如何難學的謠言,就像那些拿來嚇唬小孩的無稽之談,最後把孩子們逼去學了社會科學一樣。而另一方面,「學會寫程式」運動的推廣效果確實十分成功,因為它讓人們相信,這一行並沒有那麼高的進入壁壘,而且學習程式毫無壞處。像 Codecademy,Treehouse,以及 Code School 這類機構,以最溫柔的方式告訴普通大眾,一定會教會任何人學會寫程式,並讓其成為一名資深的開發人員。

所以,對於進入寫程式這行抱有過高期望的人,真的沒有辦法去責怪他們。

在很大程度上,這些介紹性的工具手牽手地引導我們穿越那些可怕的參數、條件語句、早期的程式語法階段,確實給了我們很大的幫助。當我們征服了一個又一個遊戲化的挑戰,自信心也開始迅速膨脹。我們覺得最終一定可以做到,這並沒有什麼難的,我們以為自己已經成為一個開發者了。

(圖例縱軸為信心值,橫軸為能力水平,虛線區間展示了蜜月期信心隨能力增長而增長的曲線圖)

但問題是,我們這個時候的狀態正處在「手牽手蜜月期」的階段,我們以為很快就要走到終點了,但其實只是走了一部分,路才剛剛開始……

規劃前方的路

在我們深入了解到第二階段之前,一起來看一看宏觀的局面。在這篇文章裡,會介紹一段典型的程式學習之旅必經的四個階段,以及應該如何應對。我們將了解資源的密度以及所需知識的廣度這兩大要素是如何定義這段旅程的。

就業準備之路可以用下圖曲線表示,它描繪了信心水平如何隨著能力增長而變化。

(圖例「寫程式信心與能力」:縱軸為信心值,橫軸為能力水平,虛線從左至右依次分割出手牽手蜜月期、混沌懸崖、絕望沙漠、令人興奮的上升期四個階段,第 5 條虛線標誌著工作準備就緒)

下面將會介紹在剩餘的 3 個階段會面臨的獨特挑戰,這是每個階段的核心內容:

1、手牽手蜜月期: 這是一個充滿喜悅的、非常容易取得成功的過程,借助精雕細琢的資源,你會解決那些看似很難,但在網絡導師的強大支援下完全是可以攻破的問題。你會掌握基本的語法結構,對於取得的成就很開心。

2、混沌懸崖: 這是一個痛苦的自我實現的過程,比蜜月期難過得多,你會覺得憑自己的力量似乎什麼也做不了。你的首要挑戰是不斷地調試,同時你還不太知道該怎麼問正確的問題,來找到一種可以積聚能量的辦法。

3、絕望沙漠: 這是一段很長又很孤獨的旅程。在廣大的沙漠裡,沒有一條清晰的道路,每一個方向似乎都是正確的。你總是繞圈圈,對於穿越沙漠所需的資源如飢似渴。請小心來自「海市蜃樓」的誘惑,它好比沙漠裡的汽笛聲,會讓你誤入歧途。

4、令人興奮的上升期: 終於,你找到了一條穿越沙漠的路,對於如何構建應用軟體有了自己的理解。但是你的程式碼仍然像是地窖倉庫,脆弱得像紙牌屋。網站的良好運行給了你信心,你掌握了一些有用的模式,朋友們認為你的界面很酷,但你根本不敢直視界面底下糟糕的程式碼,最終你還是不知如何得到「可應用於生產環境」的程式碼。那麼怎樣才能填補這段距離一份真實工作所需能力的空檔?

在過去幾年間,我們採訪了成百上千名優秀的開發人員,反覆聽到了相似的故事。而發布這篇文章的目的,就是希望大家在 設計學習路線的時候,既要眼觀六路又要做足計劃,以繞開前人踩過的坑。

階段二:混沌懸崖

當我們在第一階段細數著自己獲得了多少徽章與完成了多少挑戰的時候,自信心和能力也在不斷增長,這被叫做「過度不理智的尖峰」。在這個懸崖險境一面,很多高手都跌在了裡面,從而跌落到「寫程式太難學」的陣營。想要跳躍這個險境,需和第一次坐在電腦前一樣,打開文本編輯器,從 0 開始,在沒有任何「瀏覽器內置編輯器」、搭建好的程式碼、或是暗示性的幫助下,嘗試創建一個項目。

不要再想著上幾個特別的教程來拓展能力,沒有任何一個人可以在不飛離對面的前提下觸及天空,必須要要經歷在一張空白文本文件上施展魔法的過程。

(圖例縱軸為信心值,橫軸為能力水平,虛線標亮的第二個區間-即沿曲線頂點向右下滑-為第二階段「混沌懸崖」)

這個時候,我們的信心會跌落谷底。有時會為了達成一個幾乎不起作用的解決方案日思夜想,仍然感覺缺失一些東西。如同在一場消滅 Bug 的戰役裡面,這些 Bug 與星艦戰將相比都讓後者顯得十分和藹可親。我們開始感覺每次勝利都是因為在谷歌搜尋時運氣好而找到了答案,解決問題的訊息開始一落千丈。

Buuuuuuuuuuuuuuuuuuuuug!!!

從教育者的角度,以及對於這一行的從業者來說,這是讓人十分惱火的階段。寫程式可能並不適合每個人,但我們希望你取得進步,因為有時看似最不可能的故事卻成為了最偉大的成功事蹟。當這個手牽手輔導期結束,學生們被推下懸崖被迫飛行,有太多高潛力者在還未學會揮舞翅膀的情況下,低空盤旋不一會,就撞向了挫折的岩石。

最可怕的是,你還沒有走到實質性內容上。混沌懸崖這個階段對你來說還為時尚早。當你最終消滅了足夠多 Bug 以結束「埃及的第八次瘟疫」才標誌著第二階段的尾聲,這還只是剛剛開始。

對於那些真正有志於投身該行業的人來說,跨越「混沌懸崖」通常是決定傾其所有地去開啟新生活的關鍵點,然而有太多人沒能堅持過來。即使堅持了下來,你又要踏入「絕望荒漠」的階段。

兩個關鍵點

所以究竟什麼代表著某一階段和下個階段的不同呢?為什麼第二階段(混沌之崖)相對於第一階段(手拉手蜜月期)這麼煩人?理解這些會幫助你明白,如果你有上述的相似經歷,那完全不是你的錯。

大體上,在每個階段有兩個關鍵因素:資源密度和知識體系。在我們了解階段三之前,先來看看這兩個關鍵因素究竟是什麼。

因素一:資源密度

如之前所說,剛開始時,彷彿有千千萬萬的資源在等你去深入了解寫程式。而且事實正是如此,搜索一下「學習寫程式」,會找到很多有用的工具、文章、影片和課程。

不幸的是,在之後階段資源的飽和度很快開始降低。任何人從初學者到中級階段都能感受到,可用資源在學習寫程式與獨立應用階段的差距非常大。

當知識量累積到階段三的時候,這個問題更加嚴重,這也是為什麼我們稱這種情況為「絕望的沙漠」。但一旦你克服了這個階段並且開始明白你真正想問什麼,那麼你的資源又會很快充裕起來,你開始有效利用技術工具,例如寫程式的部落格和影片。所以,這一階段的關鍵就是明白真正想要問什麼。

下圖是資源密度在每個階段的分佈(更密的線代表更多的資源):

因素二:知識體系

現在我們來談一個相關的話題:知識體系。這代表每個階段新知識的寬度。它看起來是這樣的:

剛開始學習時,你需要理解的東西很少。不論什麼目的、語言或背景,只需要明白一個「for」循環是什麼、如何用條件邏輯框架以及寫程式語言的基本語法。而且基礎知識終究沒有那麼多,所以知識體系在一開始並不複雜。但一旦掌握基礎,需要學習的知識面就一下變寬了,因為你需要了解更複雜的問題,例如了解程式錯誤以及什麼時候用哪些程式碼。這跟回答普通的問題截然不同,這個特殊的問題並沒有一個正確的答案,事情開始複雜起來。

當進展到第三階段,知識面開始像氣球一樣膨脹。現在你開始知道需要什麼工具、用什麼程式語言、相關的計算機常識、如何寫模塊化的程式、面對對象寫程式、好的格式以及如何尋求幫助(這只是列舉了一些)。每次去谷歌搜尋或者駭客新聞,你就會發現更多你不知道但感覺要學習的知識。你產生了一個永遠不知道還有什麼不知道的念頭。

當終於找到牽引力並離開了這個「沙漠」之後,你需要的知識才會減少。到那時,你會看明白你所選擇的技術和它所處的生態系統,你最終也會了解你不知道什麼並去找到解決辦法。在事業剛起步的過程中,你的關注點會更加集中。

階段三:絕望的沙漠

理解這些因素後,我們會發現,「混沌之崖」其實只是一個轉折點。來自於需要學習的知識面的急劇增加和資源密度的減少的痛苦,會讓人進入這種被稱之為「絕望的沙漠」的階段。

從本質上講,我們知道這個沙漠肯定有盡頭,但卻不知道如何走出去。

並且,這個沙漠長而充滿了危險。你會發現自己陷入「狂熱的海市蜃樓」,即很多資源看似找到了答案,但這個答案卻將你帶到一個迷失之地,充滿了未知。

這時候,也許你會從 Coursera、Udacity 或 edX 註冊了一系列 MOOC 課程。又或者找到一個課程聲明會從頭到尾帶領你學習。你開始堅信除了這個「手拉手蜜月」課程之外,其它的都不能帶領你完成課程的學習。但是,一個人不可能在短短一周,一個月或者一門大學課程裡去學會這麼多東西。所以,不論別人怎麼宣傳,一定不要再掉入陷阱!

一個人需要學習的知識會比我們想像的多得多。即使你能夠開始運行一些 App,在想要成為一個真正的行業專家這個遠大的計劃下面也會變得迷茫起來。因為我們不知道需要學習什麼甚至是不是真正在學需要的東西?

即使有了正確的方向,了解自己的學習進展也很難。我們可能會感覺到完全迷失了,但最終還會完成一些我們想要的或者預期的結果。但有了足夠的積累和好的導向之後,我們會開始接觸幾個「真正」的項目,雖然直到目前依然困難重重,但這些網絡開發的東西看起來並沒有那麼難。

階段四:令人興奮的上升期

我們成功地穿越了沙漠,自信心逐漸提升。又因為谷歌功力實在驚人,我們可以理解那些深入的程式部落格和影片了。並且有的人成為了某種語言或者框架的達人,並且開始有信心製作正常運行的程式。這就是令人興奮的上升期:

雖然我們表面看起來胸有成竹,但我們深知還有很多需要學習的內容。比如: 你能讓程式運行卻不知它到底在如何工作;你的程式碼或許雜亂無章,最可怕的是你不知道哪裡寫的不好哪裡還行;偶爾覺得自己是個程式天才,卻並不明白到底程式是如何實現的,並且很快被愚蠢的錯誤和自我猜疑擊退。

這是一個感受差異兩極化的階段。你感覺有時候自己是一個無堅不摧的碼農而有時候又覺得自己是一個蒙著眼在道路上摸索的新手。

你覺得你應該早已是個合格的碼農,但是你在寫的程式碼和一個專業的工作環境相差甚遠…

但最終我們會做到的,因為有太多的動力讓我們停不下來。絕望的沙漠被我們拋在了腦後,困惑之崖也早已成為了久遠的記憶。我們開始提升的很快,也比以前更加明智,慢慢掌握了足夠的聯繫去把知識結合起來應用到實際中去。

到達令人興奮的上升期總是會比預期花更長的時間,並且這種感覺是無止盡的。因為在這條正確的道路上堅持不懈下去,我們就離成功很近了。並且我們的努力使得別人相信我們,願意付錢支持我們繼續學習,工作也不再是問題。

整體回顧這四個階段的情況

現在我們已經知道了步入寫程式行業的整個歷程,並了解到為什麼這麼難。當把上述的四個階段過程與各個因素都整合在一起後,得出了下面的圖:

圖例說明(從左至右):信心、資源密度、知識領域、勝任力、手把手的蜜月期、混沌懸崖、絕望沙漠、快速成長期、專業水平

「知道」和「會做」是兩回事,我們終於邁出了正確的第一步。

如何完成歷煉

坦率地說,整個過程看起來很艱辛,尤其是當我們獨自前行時。但我們並不是一個人在戰鬥,實際上在很多時候是有捷徑可循的。學習寫程式並不像人們想像的那麼容易,但也不是絕望的深淵。

在這一部分,介紹一些關鍵策略來引導大家沿著正確的方向行進。

圖例說明(從左到右):完成學程式的歷練、信心、勝任力、構建、合作、設定目標、專注、獲得反饋、專業水平

要學會享受「手把手的蜜月期」。因為有大量的資源可以令你在手把手蜜月期中感到樂趣無窮,使我們建立今後必不可缺的邏輯性思維。所以盡量享受這個過程,並牢記以下兩點:

1、嘗試多種資源以確定最適合你的學習方式。開始階段盡可能開放思路,不要在意你想具體學哪一種計算機語言,因為所有的語言在這一階段都是一樣的。

2、一旦選擇一個適合自己的資源,堅持下去,完成他們的介紹性課程,你應該可以掌握到編寫基本腳本和 App 的基礎知識,並開始準備自寫程式了。

如何在「 混沌懸崖」階段堅持?

幾乎所有碼農都體驗過「困惑懸崖」,因為這是成手的必經之路。你可以假裝註冊了幾門課(或扮作「已經完成」了這些課程)期望完成了這個階段,但那隻是想法拖延,這個階段無法避免。那些課程的確提供了更高頻次互動的介紹性內容,但你必須要擺脫這些「安撫奶嘴」,在某些時刻面對真實的世界。

以下三招可以讓我們更好的過渡到自寫程式階段:

1、和其他人共事,即使是另一個新手。你將會驚詫到原來互相檢查出被自己忽視的錯誤是那麼簡單。

2、多看看其他人寫的程式碼,多學習好的程式方式。盡量去理解作者為什麼這麼做。就像你若想成為作家,必須要多讀書一樣。我們將在即將發布的文章中重點介紹這一點,但是現在請關注他人為解決任意一個微小的問題或項目所編寫的程式。

3、從小事入手,不斷的做下去。你的目標雖然要成為做大項目的高手,但目前卻需要著眼於尋找、調試小型的項目。這種經歷是不可代替的。

如何在「絕望沙漠」階段生存?

一旦你具備了調試程式的能力,最大的問題將是面對著大量需要掌握的知識卻感到無從下手去將它們統統學完,即「絕望沙漠」。這種情況下,你需要的就是沿著既定的大路堅定地走下去。看似有趣的小路、令人好奇的「兔子洞」和號稱快速提高技巧的把戲實際上都是浪費時間的海市蜃樓。

所以盡快逃脫「絕望沙漠」的關鍵是:

1、為實現你的期許而抱有強烈執著的信念,否則你會陷入對所有好奇的事都插上一腳但卻原地打轉的怪圈,徒勞無功。但如果你有的是時間,好吧,請忽略這條……

2、確保你行進的方向明確的通往你的目標。這個目標可比那些行銷口號、線上課程網站上的笑臉或書皮上「將幫助你實現……」的要深刻、嚴肅得多,需要你深思熟慮。

3、保持專注,避免分心。因為如果你是一個對寫程式感興趣的人,那麼你一定也對其它很酷的事感興趣。當寫程式進入到攻堅階段,你需要調整自己保持向前的動力而不是半途而廢去尋找其它樂子。

只有「咬定青山不放鬆」,你才可以進入下一個階段,而不是花上數月甚至數年去追逐「鏡中花、水中月」。

如何在「快速成長期」中學得更多更好?

快速成長期是最棘手的過渡期之一。你雖然能夠開發應用了,但你更想成為一名真正的網頁開發工程師。想要度過這個階段並達到入行工作的標準,你需要完成以下三件事:

1、做最棒的程式練習題。你需要理解解決方案和最佳解決方案之間的差距。這些好的練習題可以幫助你達到生產出符合專業級別的高質量程式碼的標準。

2、檢查你的程式,因為你可能已經寫了好多程式碼,而這些程式碼中藏著你甚至都不知道的漏洞。你需要診斷並修復它們。

3、解決那些很少被處理但是轉換到專業環境時卻是高度重要的一板一眼的技能。包括測試、數據建模、架構和配置,這些技能看似簡單,但對於良好的開發工作來說是非常重要的基礎。

完成上述工作並順利度過快速成長期的關鍵是獲得反饋。那些完全依靠自學的學生或許富有成效,但卻缺乏專業級別的那種清晰的、模塊化的、易維護的程式碼寫作能力。你需要和其它人一起質疑你的假設、提出尖銳的後續問題,並迫使你去解決這些漏洞。

那麼,你能做到嗎?

上述內容看起來相當繁重,但想想那些已經走過這些歷程的前輩們。雖然本文沒有詳細解釋每一個階段,或者提供大家迫切需要的具體建議。但通過對本文介紹的各個階段的理解,大家知道瞭如何安排合理的計劃,從而獲得合適的幫助,已經處於一個有利的位置了。

前路漫漫,但你並不孤單。祝大家好運!

原文網址:http://www.vikingcodeschool.com/posts/why-learning-to-code-is-so-damn-hard

(本文經合作夥伴 大數據文摘    授權轉載,並同意 TechOrange 編寫導讀與修訂標題,原文標題為 〈為什麼編程這麼難?!〉。)

更多自學程式資源?TO 推薦你:

2017 年最完整自學資源懶人包:Python、Google Analytics 到人工智慧想學什麼全都包
【附完整程式碼教學】教你一步一步用 Python 打造數據實驗室,輕鬆預測比特幣價格趨勢
想當資料科學家?除了 Python 之外,你還應該要認識這 6 個資料界的超強 coding 語言
打敗 R 語言,Python 是如何登基成為史上最熱門數據分析語言?

 


【2018 年 TechOrange 招募新血,引領台灣正向改變】
如果你平常關注人工智慧、fintech、區塊鏈、創新創業、數位行銷、技術開源、資安、物聯網、經營管理、科技小物等,加入《TO》跟我們一起關注社會、產業創新!

TechOrange 社群編輯、實習生持續徵才中
意者請提供履歷自傳以及文字作品,寄至 jobs@fusionmedium.com
來信主旨:【應徵】TechOrange _填上應徵職稱_:您的大名

點關鍵字看更多相關文章: