大學計算機相關專業,對本校提供的教學資源不滿意,或者大學其他專業學生,想要從事開發相關工作的本科生有較為充足的時間,但是缺乏學習資源(這裡指的“資源”並不是書本或其他學習資料,而是真正意義上的“教學資源”:學校提供的上機環境、合格的老師和助教,乃至於上進心和姿勢水平都足夠高的同學等)
如果符合,那麼這篇文章將會對你有很大的幫助
來程式設計問答 看看
我將首先給出一些基本的指導思想,然後介紹一個具體的學習方法路線圖。本文將最大限度地保證這些方法具有儘可能強的可操作性。
兩種不同的學習路線
通過自學成為開發行業從業者,有“正向”和“反向”兩種路線:
反向路線——指的是繞過一系列基礎知識,直接從上層應用方向,以工程為導向開始學習和實踐,直接參與開發工作,然後根據實際需要逐漸補充電腦科學知識;
正向路線——指的是從基礎開始,按照計算機專業培養計劃,系統地依次學習。
一般而言,正向路線比起反向路線,相對來說更加“安全”,更加不容易出現電腦科學基礎知識的短板——但是缺點也是很明顯的:入門難度更大,門檻更高,時間容忍度也更低。
在實踐中,兩種路線各有千秋,既不能互相取代,也絕非互不相容——這篇文章將以正向路線為主進行詳細的說明,本專欄後續的文章將會邀請一些現役工程師來介紹反向路線的相關思想方法。
正向路線的三條基本原則
關於“如何自學程式設計”類似的話題,在很多社群都已經有了不止一次的討論——為什麼同一個問題會有不止一次的討論呢?這當然是因為,當讀者們按照前輩們給出的書單開始讀書上課,之後沒多久就會受到這樣那樣的打擊,最後信心耗盡而徹底放棄。大多數前輩自身的姿勢水平高,人生經驗豐富,因此不可避免地會犯下這樣一個錯誤——過高估計了讀者們的學習能力和信心。
不光是寫 Guideline 的前輩,讀者自身也要注意——永遠不要高估自己的學習能力和信心(或者說,學習熱情)。只有能完成的課程,能看完的書才有意義——負載過大,無法完成的課程,就算再怎麼優秀也是弊大於利的。因此,在路線和方法的選擇上,一定要以以下的三個基本法為基本的指導原則:
1、永遠不要假設自己有足夠的熱情(信心保護)
前面說過,正向路線的缺點,在於入門難度更大,門檻更高——畢竟,同樣是輸出“Hello World”,一個漂亮的網頁頁面,總比黑乎乎的命令列更好看,也更讓人有成就感。
在知乎和其他的一些跟程式設計學習相關的社群,總能看到有各式各樣的大神,給新手們傳遞著這樣那樣的人生經驗:
“程式設計入門一定要從 gcc+Vim 開始”、
“萌新學習 C++ 請認準《C++ Primer》”、
“大一學生要寫一個 500-1000 行的課程作業,讓我們先從一個小目標開始——比如實現一個編譯器” :
諸如此類言論,不勝列舉——通常還會附加“連這點東西都學不會,以後就別想著學 CS 了”之類的論斷。
不得不說,大神們的出發點確實是好的,這些建議也確實是有一定的合理性——但是,這些做法有一個重要的前提,那就是“大力出奇跡”,假設讀者都擁有無限的學習能力和無限的熱情……然而,理想很豐滿,現實卻很骨感——大神們初中學習程式設計,高中就能寫出一個成型的編譯器,然而現實中的大部分人學生都不具備這樣的能力……
一個人的命運,當然要靠自我的奮鬥,但也要考慮到歷史的行程——對於名校 CS 專業的學生來說,他們就算自身的才能並不出眾,至少也有“安全網”在保護他們:老師在上課的時候會重點地強調需要注意的問題,助教在上機的時候會手把手地教他們正確的做法,甚至身邊才能出眾的同學,也可以讓他們“抱大腿”……然而,對於本文的讀者來說,這一切都不存在。
孤獨而脆弱,是本文讀者普遍具有的特點——任何一個看起來微不足道的小挫折,都可能挫傷他們的信心和熱情,當這兩者降到 0 的時候,他們的學習道路便到此為止了,以後想要再一次出發將會變得非常困難,甚至完全不可能。
因此,對於本文的讀者,在路線的選擇上,一定要做到循序漸進,從小到大,在初學階段儘可能地挑選不容易踩坑的路線,從第一個 Hello World 開始,通過不斷地獲得正向反饋來提高自己的能力和信心——在後續的內容中,我們將會應用這一原則,向大家推薦合適的路線。
2、確保你學到的東西都是價效比最高的內容(高價效比學習)
這裡的“價效比”包括兩個概念,其一是知識的可遷移性,其二是知識的可使用性。
所謂“可遷移性”,指的就是軟體開發領域,那些共通的,放之四海皆準的內容——C 家族語言的語法,程式設計的熟練度、思想和方法,以及電腦科學專業知識,都是具有可遷移性的內容,而具體的某某框架的 API 用法則不是。
而“可使用性”則是另一個概念——它的含義是,這部分知識能不能立竿見影地幫助你增加程式碼量。很多大神都提到過,一個好的程式設計師必須有 XX 萬的程式碼量——這確實是對的,但是反過來卻不一定成立:如果這個世界有數萬種程式語言,那麼你用每一種語言都寫一遍 Hello World,那麼你的程式碼量也能達到大神說的數字——但是這代表你就有對應的程式設計能力嗎?答案顯然是否定的。
所謂“好的程式設計師必須有 XX 萬的程式碼量”,更進一步地說,好的程式設計師必須要寫數量和種類都足夠多的程式。而就像上文中貼出的那個連結一樣,大一學生剛學完 C 語言,如果想要寫一個 500-1000 行程式碼的大作業,最後真的能完成的也只有“圖書館資訊管理系統”這樣的,看起來很“low”的程式——因為只使用基本的 C 語言語法和標準庫,你是很難寫出非常複雜的程式的。這個時候,就需要你學習更多的電腦科學知識,來擴充你可以編寫的程式的廣度與深度了……
你必須明白,學習的目的是為了提高自己的開發能力,讓自己能夠寫出更大更好的程式。因此,對於走正向路線的讀者來說,在沒有專案牽引的前提下,對於流行技術和框架的學習應該有所節制,切忌貪多嚼不爛,千萬不要陷入到“用更多的語言/框架寫 HelloWorld”的陷阱中。
關於這條原則的應用,將與下一條原則一起進行說明。
本作品採用《CC 協議》,轉載必須註明作者和本文連結