學習編程, 既要考慮詩和遠方, 也要考慮眼前的茍且。
每年像你這樣的學生不計其數,大一剛進校,一門C語言,學校發一本垃圾C語言教材,按時上課,老師在那裏念念PPT,講講浮點型變量,malloc啥的,你若認真聽了,那你可能懂了,但是發現不會寫,你若沒聽,玩手機了,你是既不懂,也不會寫,上來上去,蒙在鼓裏的人出不來,水平就一直這樣,龜速增長。
有的學生學的一頭霧水,開始懷疑自己,準備轉專業,放棄電腦,有的學生學懂了,寫程式一直報錯,開始懷疑自己,有的學生覺得教材寫得不好,去書店轉了一圈,買了三四本C語言的書,但最後厚厚的灰塵蓋在了書上,再也沒翻過。
這三種學生,如果繼續這樣,最後都要涼涼。
馬克思教給我們要具體問題具體分析,那我今天就來分析一下,電腦專業的學生,到底應該怎麽學電腦,才能效果最好,進步最快。
如果你要學習物理,我推薦你順著物理的發展史學習,先學習牛頓經典物理,再學習熱力學,電磁學這些不那麽經典的,再學習相對論,量子力學這種徹底推翻經典物理的,再學習量子電動力學這種硬核的,比較前沿的,整個學習過程,是 自底向上 。
但是學習電腦,真的適合這樣嗎?
先學習電路,馮諾依曼結構,造一台電腦?然後再用組譯寫個小作業系統?寫個小編譯器?最後一步一步往上走,最後開始用高級語言編程?
你要是這麽學,必然爆炸。
電腦的學習最好應該是 自頂向下 。
這個頂,頂到什麽程度?
有人說,C語言就是高級語言了,從C語言開始學就好了。
但是如果讓我教電腦,我第一節課教學生們的,絕對不是C語言,而是教大家如何使用 Github , Stackoverflow ,告訴世界上正在發生什麽,程式設計師之間是如何協作的,告訴你在這個大社群,你可以讀到這個世界最牛逼的程式設計師寫的程式碼。
我還要告訴大家如何使用 雲服務 ,告訴大家可以買一個一個月十塊錢的學生伺服器,自己做點有趣的事,我還要推薦大家去用 Visual Studio Code, 而不是簡單粗暴的在機房裝一個VC6,或者CodeBlocks,美其名曰,「我們當年用記事本還XXXX,現在的學生被慣壞了」這種話。
如果可以,我還會教同學們如何科學上網,讓英文編程環境成為習慣,讓遇到問題google,而不是百度成為習慣,讓大家在第一節課上完,就能進入這個世界編程大社群,哪怕什麽都不懂,你也能保證所在的社群,就是世界程式設計師的大家庭當你進入Github,看著各種有趣的計畫的時候,相信我,你的視野就會在此為起點,快速開啟,不斷增長,進入一個良性迴圈。
而當剛上大一的學生第一次進入github時候,被眼前的各種沒聽過,沒見過,但感覺很厲害的計畫所吸引的時候,當他兩眼冒光的時候,我就知道,他這四年,成了。
有人會這樣說我:
「Github還用教?剛才你說的那些學生,如果能被C語言的困難打倒,那他也不適合做程式設計師,轉行正好。」
像這種話,我想說,在很多時候,佛和魔僅在一念之間,你在最開始的時候點到了,給了他引導,他以後可能會馬上進入一個正反饋狀態,如果你沒點到,馬上可能就負反饋了。
我一直覺得國內的電腦專業的學生很可憐。
當VScode表現越來越優異的時候,學生們還在機房用著VC6,看著密密麻麻的報錯無可奈何。
當Google搜尋可以精準定位你的問題的時候,學生們還在為百度搜尋出來亂七八糟的搜尋結果無可奈何。
你用百度,用中文搜尋,你連 stackoverflow 都搜不出來。
但是你可以去問問,做一個調查,有多少大一結束的學生,沒上過 stackoverflow ,不知道怎麽在github裏送出issue和pull request,你統計一下,看看這個比例有多大?
你再統計一下有多少比例的大一結束的學生沒用過google,並且對其用不了的原因不太清楚?
視野打不開,一切都完了。
有人說,剛開始直接學了python這種很簡單的高級語言,以後遇到C肯定被嚇跑了。
事實恰恰相反,在你了解到python的效能問題時,你才會了解python是解釋型語言,C是編程型語言,你才會思考為什麽C更快,進而,如果需要用C,去學C。
在你在程式語言中涉及到了「原子性」,「同步」,「異步」,「執行緒」,「行程」,「記憶體分配「等概念的時候,你會自然而然地產生很多疑問,進而去學習作業系統,在學作業系統的過程中,你之前的一系列疑問逐漸被解決,這個過程是很爽的。
當你發現某個演算法,人家的實作比你快很多的時候,你會自然地去思考,為什麽我的程式執行這麽慢,然後發現對方用的數據結構與你不同,甚至用了一些演算法,比如動態規劃等,這也會驅使你去學習演算法,學習數據結構。
有了需求和疑問,再去學,這樣一個過程,是學習的金鑰匙。
你指望學生自己開啟視野,但是那些自己打不開,需要你幫忙開下門的呢?
在你的視野被開啟之後,我還希望你懂這些:
比如你學C語言,與其去做那些OJ題,不如在github上找個C語言計畫,然後閱讀,理解,修改,模仿。
個人認為在知識爆炸的年代,兩不要:
學個啥都要買本教材,試圖線性地,從頭讀到尾。
(真實情況:經典教材都能下載到免費pdf,語言,框架,文件往往已經寫的很好,而且最新,github上有無數優質開源學習資源)
不讀優質程式碼,不參考最佳實踐,啥都要自己從頭開始搞。
三個要:
要讀文件,英文文件
做知識輸出,用文字總結自己的學習內容。
多用命令列
我曾聽過一種論調,說程式設計師不會用命令列也沒關系。
我想說的是,第一,這個世界沒有那麽美好,什麽都要給你做一個圖形界面,第二,對於命令復雜,命令多的工具,就算做出來圖形界面,往往比命令列更難用,而且命令列可以用命令列指令碼進行批檔自動化執行。
兩個原則:
有問題,先文件,再stackoverflow,再技術文章
要用例項驅動學習,不要說你會什麽,要說你做了什麽
我希望所有程式設計師明白一個事實是,」我會什麽」這句話,其實是最沒用,最虛飄飄的東西,你說你會java,python,c,rust,go,然後呢?你怎麽證明?寫個hello world?會用api?
但是你要說,XX著名計畫作者,那你就牛了,我也不需要讓你證明什麽了。
大概隨便說了點,還有很多內容可以補充,先就這樣了,謝謝大家。