1. 程式人生 > >學程式設計為什麼這麼難?每個新手絕對要知道的那些事

學程式設計為什麼這麼難?每個新手絕對要知道的那些事

Quincy Larson曾經只是個穿西裝坐辦公室的傢伙,有一天,他決定要學習程式設計。於是,他到處打聽關於程式設計的事情。他從Ruby入手,接著很快學了Scala、Clojure和Go等多種其他的程式語言。他用過Emacs和Vim,甚至還學過Dvorak鍵盤佈局。他不僅學會了Linux,涉足過Lisp,並且有超過半年的時間靠在命令列下編 Python 程式碼為生。

Quincy就像龍捲風中的一片葉子,別人給他的建議讓他在程式設計的世界中暈頭轉向,直到他學完了“能想到的每一個線上教程”。儘管在故事的最後,Quincy得到了一份軟體開發的工作,但他說:

…我認為,我碰到過的程式設計師們看似一帆風順,實際上他們都飽嘗過學習程式設計的痛苦,只是他們都壓抑著沒有說出來。

唉,這些話是不是聽著很耳熟?

階段一:手把手輔導的蜜月期(Hand-Holding Honeymoon)

每個即將進入程式設計行業的人都滿懷期待,這很正常。

一方面,你在年輕的時候總聽流言說程式設計如何如何難,但它們就像老奶奶講的嚇人故事,是用來唬孩子們去學習社會科學而已。

而另一方面,“學習程式設計”運動已經取得了很多成就,它打破障礙並向人們展示程式設計其實也沒那麼可怕。 像 CodecademyTreehouse和 Code School 這樣觸手可得的工具,它們可以確保你(甚至任何人)不僅能學會程式設計,還能成為一名熟練的開發者。

突然間,問題不再是對程式設計的恐懼,而是抱有過多希望,期望太高。

而且最重要的是,這些入門工具足以像教小孩過馬路那樣,引導你學習那些令人頭疼的變數和條件語句,以及初級程式設計語法。當你不斷完成遊戲般的挑戰時,你的自信會隨之大增。說不定你最後就學會了程式設計!學會程式設計並不難,基本上你已經是一名開發者了。

手把手輔導的蜜月期(The Hand-Holding Honeymoon)

現在問題來了,你正處於程式設計初期階段,我喜歡稱之為“手把手輔導的蜜月期”。儘管你可能感覺成功就在不遠處,但其實你才剛踏出第一步。一切才剛剛開始……

描繪未來之路

在我們一頭扎進第二階段之前,先來仔細看看整個過程。

在這篇文章中,我將介紹典型的程式設計之路上必須經過的四個階段,以及如何平穩渡過每個階段。你也會看到資源的豐富程度和知識範圍(各個階段必須掌握的)的廣度這兩個關鍵因素是如何在程式設計之路上起到決定性作用的。

旅程艱辛就為了達到找工作的水平,這個艱苦的過程可以描繪成你的自信心隨能力增長的變化曲線。

學習程式設計之旅

由於自信和幸福感緊密關聯,而且只有在自信和能力相匹配時,才能正式地說你可以“上崗”了,因此,上圖中的自信和競爭力是息息相關的。

隨後我們會觀察剩下的三個階段中存在的獨特挑戰,但每個階段本質上都包含了上面的這種關係:

  1. 手把手輔導的蜜月期(The Hand Holding Honeymoon),這個階段充滿了樂趣,面對看似棘手的問題,那些高質量資源的鼎力相助讓你輕鬆取勝。雖然你主要學的是基礎語法,但完成的工作會讓你很有成就感。
  2. 充滿迷惑的下滑期(The Cliff of Confusion),在這個階段你會痛苦地發現手把手輔導的階段結束後,事情變得更困難了,實際上你沒法獨立做任何事。在你試圖重新振作時,你面對的首要挑戰不僅是要反覆除錯,而且你還不懂怎麼問問題。
  3. 絕望的迷茫期(The Desert of Despair),這個階段漫長而又孤獨在這個沙漠(充滿困惑迷茫就像身處沙漠)中幾乎沒有路,每個方向都看似正確,但你卻總是在繞圈,你極度渴望找到辦法逃出生天。警惕“狂燥中出現的海市蜃樓(Mirages of Mania)”,它們就像是沙漠的迷魂曲,將引誘你誤入歧途。
  4. 煎熬的上升期(The Upswing of Awesome),這個階段裡你終於找到了一條路走出沙漠,並且總體清楚瞭如何建立應用程式。但你的程式碼仍然很封閉,到處都是漏洞,就像紙糊的房子一樣搖搖欲墜。你的網站可以執行並且你已經掌握了幾種有效的模式,這些都讓你的信心大增,而且你的朋友們都在稱讚你的網站很酷,但實際上你知道底層連自己都不忍直視。你根本不知道該如何寫出“可釋出”的成熟程式碼。該如何彌補這個差距,從而找到一份真正的工作呢?

在過去這些年裡,我已經面試過成百上千的開發者,他們都心懷抱負,並且不斷給我說著相同的經歷。我寫這篇文章的目的,是希望你能夠在學習的路上擦亮雙眼,做一個詳細的計劃避開很多前人都曾掉入過的陷阱。

讓我們回到階段二吧…

階段二:迷惑的下滑期(The Cliff of Confusion)

你正處於階段一,也就是“手把手輔導的蜜月期(Hand-Holding Honeymoon)”,你正在獲取各種獎勵徽章並完成程式設計挑戰,同時你的自信和能力都在蹭蹭地上漲。情況也不是很糟糕…那大驚小怪些什麼呢?因為你的自信已經失去理智地膨脹到了極點。。。。。。

小心了!你即將踏出懸崖,多少英雄在此折腰淪為“程式設計太難”一族。這錯誤的一步發生在你第一次在鍵盤前坐下,開啟文字編輯器並試圖從零開始建立一個工程,但你卻不用任何很讚的線上編輯器,也不用別人的程式碼框架或尋求有用的提示。

簡直扯淡。

也許你能照著自學教程依葫蘆畫瓢,但是沒有人可以一步登天,而且從某種意義上來說,你要徒手從一個空白的文字檔案開始簡直是異想天開。你才剛剛進入學習的第二個階段,接下去你的自信將跌落谷底,這也是為什麼我稱之為“困惑的下滑期(Cliff of Confusion)”。

困惑的下滑期(The Cliff of Confusion)

你開始建立工程。你抓耳撓腮卻只找到了一個勉強能用的方案,但總覺得哪裡不對。為了你的星河戰隊(也就是你的大工程)能表現不錯,你陷入了和bug的戰爭之中。似乎只有通過一鍵谷歌才能解決每一個問題,你那些過去能搞定問題的自信蕩然無存。

Buuuuuuuuuuuuuuuuuuuuug!!!

不論是作為教育者,還是作為這個行業的從業者,在大家看來這個階段都格外令人沮喪。任何人寫的程式都可能有bug,但我們還是希望你能有所進步,因為最不可能的地方也能成就最偉大的成功。

在階段一結束時,學生們被迫進入了階段二。他們必須飛躍這個階段,但太多有潛力的人卻不去掌握真正有用的技能,而是一味地停留在挫敗的情緒中。

可怕的是,你甚至還沒有遇到過真正棘手的事情。階段二的結束還早得很。當你解決掉足夠多的bug結束了大部分的痛苦,並且已經完成了幾個工程,儘管這標誌著階段二的結束,但總體來說你也仍然是剛上路而已啦。

對那些真正準備從事這個行業的人來說,他們通常會在渡過階段二以後決定是否全身心投入這個新生活。但太多的人放棄了。而不幸的是,你現在才剛到階段三(“絕望的迷茫期”)的入口。

起作用的兩個關鍵因素

那麼前兩個階段的真正區別是什麼呢?為何相比階段一(手把手輔導的蜜月期)來說階段二(困惑的下滑期)給人的感受會如此糟糕?如果你的經歷很像我們前面描述的那樣,只要理解了這兩個問題,你就能釋懷了。

從根本上來說,每個階段都有兩股關鍵力量在起作用,那就是資源的密集程度知識面的廣度。在探索它們對階段三的影響之前,我們先來看看這兩個因素到底是什麼。

因素一:資源密集度

正如我前面所說,一開始你會感覺有遍地的資源在引導你上手程式設計。事實也確實如此!

搜尋“如何程式設計”,你會得到一大堆有用的工具、文章、視訊以及自學教程。而且,老實說它們都很棒!從未有過如此多的方法指導人們學習程式設計。

不幸的是,後期可供使用的資源太少了。每一個從初學者成長到當前狀態的人都能體會這其中的差距之大,相比剛開始入手,當你試圖完全依靠自己建立工程時,能利用的資源就少得多。

進入階段三後需要了解的知識猛然陡增,惡化了上面的問題,這也是為什麼我把這個階段稱之為“絕望的迷茫期”。一旦你度過了這個階段,並且開始瞭解你需要搜尋的東西,你就會找到很多資源,還能使用一些技術工具,如專業部落格和視訊講座。矛盾的部分僅僅在於明白該問什麼問題。

下圖顯示了各個階段中的資源密集程度(線條越密集表示資源越多):

各階段的資源密集度

因素二:知識面的廣度

現在我們來聊聊一個相關的話題——知識面的廣度。它表示你在每個階段中必須學習的新知識的總體廣度。下圖就顯示了這個因素在每個階段中的情況:

各階段所需知識的廣度

剛開始學程式設計時,你需要理解的東西很少。不論你的目標是什麼,不論你用什麼程式語言,也不論你之前是做什麼的,每個人要做的都是搞清楚什麼是for迴圈,如何建立條件語句,以及其他一些程式設計語法的基礎結構。總體來看也沒多少基礎概念,因此階段一所需要的知識面廣度很窄。一旦你學完了基礎部分,就需要去了解一些更復雜的東西,比如理解錯誤以及何時使用那些你已經會用的程式碼,此時你會發現需要學習的額外知識瞬間多了很多。這個時候情況變得不同了,因為一個明確的問題不一定有一個絕對正確的答案……事情開始變得棘手。

當你進入第三個階段後,所需的知識面廣度就更寬了。你需要理解該使用哪些工具,該學習什麼程式語言;學習相關的電腦科學基礎,如何寫模組化的程式碼;學習面向物件的程式設計,學習好的程式碼風格,以及學會尋求幫助(以上僅列舉幾個例子)。每一次在Google 或 Hacker News上進行搜尋都讓你大開眼界,找到的東西多得讓你喘不過氣,都是些你不知道但感覺自己應該瞭解的知識。

你不知道自己不懂哪些東西。

只有當你終於摸到了一些門道並結束這個“荒漠之旅”以後,所需的知識面廣度才會再次縮小。那時,你已經選擇了某種技術,並瞭解了它在這個行業的生態系統中所處的地位。你最終學會了那些你以前不懂的東西(可以說相當瞭解),也知道如何解決問題。隨著你深入學習和事業逐漸起步,你將越來越專注於自己領域的技術。

階段三:絕望的困惑期(The Desert of Despair)

理解了上面兩個因素後,你會發現階段二僅僅是個轉折點。快速提升的知識面廣度和急劇下降的資源密集度讓你在這個階段倍感痛,因此我稱它為“絕望的沙漠”(身處這個階段猶如在沙漠中一樣,迷茫得團團轉卻找不到方向)。

本質上來說,你知道這個沙漠肯定在某個地方有出口,但你就是不知道怎麼找到它。

絕望的沙漠

這個沙漠之旅路途遙遠,而且危機四伏。你會發現自己總是沉溺在虛無縹緲的東西里,許多誘人的資源看似包含了你要找的對策,實際上它們只是又一次地讓你深陷在了無邊無際的砂礫之中。

或許你已經在Coursera 、Udacity 或 edX上註冊了幾門MOOC課程,又或許你找到了一個聲稱能一路指導你的自學教程。你自以為吸取了階段一(手把手輔導的蜜月期)的經驗教訓,明白問題並不是那麼好解決,但還是忍不住去尋找幫助。你註冊的課程信誓旦旦地保證,一定能讓你達到前所未有的高度,對此你還信以為真。無論別人怎麼說,你都不可能只花一個星期或一個月的時間,也不可能就只上個學院課程就學會這些東西。因此,別再相信那些謊言!

這個階段要學的東西很多,遠超出你可能預期的那些。儘管你能讓許多app執行起來,但要成為一名真正的專業開發人員需要做的更多,在其中你很容易感到迷茫失落。你每一次進步都難以衡量,你如何知道自己該學什麼?甚至這些東西是不是你該學的呢?

就算你走對了方向,卻仍然很難衡量你取得的進步。在你能做出外形和功能都符合自己期望的東西之前,你可能會感覺很迷茫。但是隻要堅持不懈,並且保持正確的方向不跑偏,終有一天你能將那幾個“貨真價實”的處女作釋出出去,你終於開始上道了。一路走來確實很艱難,但你開發的這個web東東其實也沒有那麼糟。。。。。。一切都在變好!

階段四:煎熬的上升期

你已經成功穿越了荒漠,也越來越自信。你Google搜尋的技能( Google-fu)越來越了得,也能理解那些細緻入微的專業部落格文章和視訊講座。或許你已經深入掌握了某一種程式語言或框架,並且有自信能建立併發佈一個能執行的應用。

這是“煎熬的上升期”:

煎熬的上升期(Upswing of Awesome)

表面看上去一切都OK,但你知道底下還差得遠呢。

雖然你能讓那個應用程式運轉起來,但底層都發生了什麼?你的程式碼裡充滿補丁,最糟糕的是,你甚至不知道哪部分很糟糕,也不知道實際上哪部分將執行無誤。你不時地取得成就,同時也犯了許多菜鳥級錯誤,更糟的是,你漸漸開始懷疑怎麼還是搞不清自己在做什麼。

這是個兩極化的階段。一邊覺得自己是個無所不能的開發者,另一邊又覺得自己是個效率極低卻深陷其中的狂熱新手。走得越遠,越是感覺惶恐不安,生怕哪天有人 “揭穿”你程式碼中的詭計。

你覺得自己應該算是一名開發者了,但你現在寫的程式碼和在“職業”工作環境下寫出的程式碼相比,差距實在是太大了…

儘管艱難,最終你一定會成功。那時的你心情澎湃,渾身充滿力量,絕望的荒漠已經過去,而令你困惑迷茫的階段二也成了遙遠的回憶。終於,你是真的在走上坡路:你的學習速度更勝從前,也更理解如何學習程式設計。儘管歷盡艱難,但你會經歷足夠多的最佳實踐,把那些寶貴的知識凝結成產品級的技能集。這個可怕的上升期會比你預想的要長,也會讓你感覺看不到頭,因為你已經離終點如此之近……但你肯定會到達的。如果你在正確的道路(確定未來要做什麼)上足夠堅持,一定會有人願意付薪水給你,讓你繼續學習。工作機會是你的了!

總體來看

現在你已經看到了前方的路,也知道了為何會一路艱辛。將前面描述的四個階段和過程中對它們起作用的兩個要素結合起來,就得到了下面這個圖表:

整個過程

對這個過程的瞭解歸瞭解,去經歷又是另外一回事。你還是先邁出正確的第一步吧。

如何通過每一個階段

整個旅程看似艱難,但坦白地說,學習程式設計的過程通常都是這麼艱苦的。瞭解自己的目的很重要,尤其當你孤軍奮戰的時候。但你不會只能靠自己的,因為大部分問題都有捷徑可走。學習程式設計沒有人們說的那麼簡單,但也沒有你在絕望時想的那麼難。

我會在這部分介紹一些重要的策略,你能利用它們保持一個正確的方向。

你在各階段取得的進步

I:如何順利通過手把手輔導的蜜月期(Hand-Holding Honeymoon)

豐富的可用資源讓階段一充滿了樂趣。這些資源能夠在接下來的階段中,很好的培養你的邏輯思維。現在是學習程式設計的大好時機,記住這兩個建議,享受程式設計的樂趣吧!

  1.   從嘗試多種不同的學習資源入手,找到最適合自己的學習方式和最讓自己感興趣的專案型別。最適合你的可能是Khan Academy的快速挑戰、 Codecademy的線上練習,或者是Chris Pine的書《Learn to Program》和Code School裡那些古怪的try Ruby 訓練。剛開始你要思維開闊,不要理會那些告訴你應該學什麼的建議。。。。。。在這個階段學什麼都是一樣的。
  2.  選擇一個,一旦發現它適合自己就要堅持下去。完整學習整個入門教程,你會從中學到寫基礎指令碼和應用需要的所有基礎知識。接著,就要準備好開始獨立地建立工程。
II:如何順利通過困惑的下滑期(Cliff of Confusion)

幾乎每個人都要經歷這個階段,因為成為一名開發者的唯一途徑就是不斷去開發。你可以通過註冊一些自學教程(或那些冒充是“完美課程”的自學教程)來模擬建立工程,但最終你還是要自己動手,這麼做不過是拖延了時間。自學教程能很好地讓你從更個性化的例程中得到啟發,但是在某些情況下你必須脫離過多的輔助,獨立解決問題。

如何過渡到獨立地建立工程,下面有三個建議:

  1. 和他人一起工作,哪怕同樣是菜鳥。你會驚訝地發現,兩雙眼睛更容易調試出一個不可能的錯誤。
  2.  閱讀他人的程式碼,熟悉好的模式。儘量理解為什麼作者這麼做。同樣的道理,不讀書是不會想成為一名小說家的,對吧?我將在下一篇文章裡集中討論這個問題,但現在,請仔細注意其他人對任何小問題或工程提出的解決方案。
  3. 從小事做起,不斷嘗試。對於將來,你應該想過做一些有趣的大工程,但你也必須適應除錯的過程,搜尋一些帶有小型挑戰的學習資源。經驗是無可替代的。
III:如何順利通過絕望的困惑期(Desert of Despair)

一旦適應了除錯過程,最令你頭疼的問題就是難以獲取所需知識,以及學習所有這些知識必須付出的代價…簡直就像處於令人絕望的沙漠裡。這種情況下,你真正需要的是一條有效的前進路線。而Mirages of Mania代表那些吸引你的捷徑、誘惑你冒險的新世界和速成計劃,它們最終只會浪費你的時間。

因此,要逃離這個沙漠的關鍵在於:

  1. 擁有一個強烈的目標想去實現,否則,什麼有趣但沒用的東西都學的話,最終不過瞎忙活一場。如果你在學習之外還有充裕的時間,請忽略這一條。。。。。。
  2. 找到一條有效的路徑能直達你設定的目標,並且要驗證其可行性。你必須深入思考“這個方法到底能不能幫我實現目標?”,而不是光看那些課程網站或書皮上打出的營銷口號和看似真誠的笑臉。
  3. 專注,避免分心。因為你如果是個對學習程式設計很有興趣的人,那你肯定也會對所有美妙的事情感興趣。當程式設計遇到了困難,你需要進一步解決這個問題,而不是另起爐灶。

如果能確定一條路並堅持走下去,你最終一定會進入到下一個階段,而不是花費了數月或數年,最終只是徒勞。

IV:如何順利通過煎熬的上升期(Upswing of Awesome)

這個階段是最棘手的過渡階段之一。儘管你能開發出應用程式,但你實際上想成為一名web開發人員。通過這個階段並找到工作,你需要做三件事情:

  1. 為程式設計尋找最佳實踐,並效仿。你需要理解一個普通方案和最佳方案之間的差別。自己一味悶頭鑽研,遠遠比不上別人在真實工作環境下寫出的產品級程式碼,而最佳實踐樣例很好地體現了這其中的差距。
  2. 檢驗你的假設。因為你可能迴避了一些自己知識體系中的漏洞,甚至你自己都不知道有這些漏洞的存在。你需要檢查並修復這些漏洞。
  3.  正確對待那些並不吸引人的技能。儘管它們很少被強調,但是你要過渡到一個專業環境,它們還是相當重要的。這些技能包括測試、資料建模、架構和部署,我們很容易忽略它們,但它們都是優秀開發的基礎。

要做到上面這些並通過最後階段,關鍵是要不斷獲得他人的反饋。完全自學或許富有成效,但難以寫出易讀、模組化以及可維護的程式碼,這就使自學者在職業環境中沒那麼有吸引力。你需要和和那些會懷疑你假設的人們一起工作,他們會提出尖銳的後續問題,並迫使你對自己的知識體系進行查缺補漏。

那麼……這條路能行嗎?

這些可能聽起來讓人崩潰,但我保證,在你之前已經有很多人堅持不懈地通過了這個旅程。理解前面的路,你就能有一個明確的計劃,也會知道如何獲取真正有用的幫助,這些都為你踏上這個旅程開了好頭。

很顯然,這篇文章沒有按我們想的那樣,深入挖掘旅程中的每個階段,也沒有提供詳細的建議告訴你該怎麼做。即便如此,由於我們熟知這個旅程並且對此抱有極大的熱情,因此,我們希望傾盡全力幫助大家。

我們的核心課程是專為銜接整個過程而設計的,但如果你有興趣自學這個課程,我們將在未來的部落格文章中對此進行調整和深入探討。

在此我們進一步探討了各種問題(從尋找導師,到如何縮小差距得到一份web開發的全職工作),如果你也想嘗試一下,就在下面註冊吧。因為,儘管前方的路充滿挑戰,但你不是一個人在戰鬥。

祝你好運!

特別感謝Peter DePaulo、Javier Noris、 Michael Alexander、 Andy Brown、 Saul Costa、 Phil Nachum和Quincy Larson分享你們的經歷,以及幫助修正這些觀點。