轉自:https://www.zhihu.com/question/39431192
對于所有編程學習者,尤其是零基礎的同學們,在學習的初期,一定要給自己做一個思想上的轉變。在我的編程學習理論中,這個思想的轉變至關重要,什么時候你把這個思維轉換過來了,你就是真正上道的那一天。
這個思維轉換就是:不要把自己當學生,而是要把自己當開發者。
不同的身份認同感,最后會導致不同的行為模式,而這行為模式,會對你的編程學習造成非常大的影響。
區別一:記筆記 VS 寫技術文章
學生有一個特點,就是他們喜歡記筆記,但是開發者不怎么記筆記,而是會把自己學會的東西寫成技術文章、教程的形式發表在技術博客或者知乎等網站上。
一個很有名的學習法叫做費曼學習法,這個學習方法簡單地說,就是在學完一個東西之后,去給別人講明白,注意,是講給別人聽,當你寫成文章發表在網上的時候,你自然會去用更通俗的語言,更清晰的邏輯去講述這個事物背后的邏輯,這個過程,是對自己學習的一個檢驗,也是加深映像,整理思路的重要過程。
那么如果你是去記筆記的話,很有可能,你不會去試圖講清楚這個東西,而是傾向于去照抄,或是不完全照抄,以“提綱”或是“知識點”的形式抄在本子上,說句實話,照抄的筆記,真的沒用,因為現在搜索引擎的能力已經可以讓你把大多數東西快速找到,你為什么還要照抄到筆記本上呢?
從功利的角度考慮,技術文章的寫作,別人可以直接訪問,也可以逐漸累積你的影響力,一個好的個人技術博客,會給你的簡歷加分很多,而一個厚厚的筆記本,沒有人會管你記了什么。
區別二:以學會XX為目標 VS 以做出XX為目標
你會發現,學生思維里面有一個重要的特點,就是他們總是特別關注自己“學會了什么”,不僅如此,他給自己定的目標,定的計劃,永遠都是”學會XX書第XX章內容“。
學生永遠在準備, 而開發者早已動手。
如果你還在上學,學生思維是“這個學期我要學會XX課程”,而開發者思維是“這個學期我要做出XX”。
如果學Python,學生思維會拿起一本教材,開始從頭到尾看,我不知道你們發現沒有,幾乎所有那種編程語言教材,長得都差不多,上來先是基本的語法,基本的整型變量,浮點型變量之類的,然后伴隨著幾個小的教學例子。
開發者學Python,他第一步絕對不是去書店買教材,而是先去了解,Python適合做什么,然后他了解到,Python適合做爬蟲,數據分析,AI,還能很輕松地搭建Web后端,之后他逛了一下午Github,看了看那些Python高星項目都是做啥的,于是他給自己定下了這個目標:半年時間內,我要用Python和Python周邊的庫搭建出一個網站,這個網站服務端運用爬蟲技術爬取一些數據,可以提供知乎粉絲性別比例分析功能。
學生繼續看書,一個個的知識點去記憶,拿著他的小本本去總結知識點,而開發者上官網簡單的看了下Reference Doc的簡單交互式語法教程后,便馬上開始了邊做邊學的過程,有了一個實際的項目目標,朝著這個目標走,不斷地發現自己不會這,不會那,然后有目的性的去補足知識,他了解到了beautiful soup作為爬蟲主庫,flask作為后端web服務主庫,然后會去看一些簡單的教程,在這個過程中,基礎語法得到了熟練,也訓練了工程能力。
學生的成就感來源于學會了什么,開發者的成就感來源于做出來什么。
開發者很功利,他們深知他們學會的所有東西都是為了開發出偉大的產品而服務的,所以他們絕對不會出現“在學一個東西,但是也不知道學這個用來干嘛”的窘境。
區別三:厭惡不確定性 VS 接受不確定性
學生們總是對“確定性”有一種幾乎瘋狂的追求,他們總問,“C語言學到什么程度就一定能被大廠錄?。?/span>”,“掌握XX要幾個月?”,“上課認真聽講,認真做筆記,考試是否一定能上80分?”
這種對確定性的追求,直接導致學生有一種下意識的舉動:
干什么都等準備好了再去做,但是卻“永遠在準備”。
因為他們害怕那種不太會還要硬上帶來的各種不確定性,他們渴求一種內功的修煉,寄希望于”把基礎夯實了,就能順暢的開發,所以還是先夯實基礎吧!”
開發者選擇接受這種不確定性,他們愿意”邊學變做“,因為他們知道,最初學習敲鍵盤的時候,他們就是這么做的,邊看某個按鍵在哪,邊打字,做和學交叉進行,他們始終抱有疑問,他們又始終試圖通過學習的延伸拓展去解決疑問,他們仿佛就像是拿著燭火在迷宮中行走的俠客,在游戲的一開始,對迷宮的結構一無所知,通過不斷地摸索和碰壁,逐漸建立起對整個地圖的認知.
區別四: 線性學習 VS 遞歸學習
學生喜歡線性的學習,因為線性的學習(拿本教材從頭到尾慢慢看)正是符合了他們對確定性的追求,可惜這違背了學習的本來面目
開發者知道,人腦最不擅長的就是線性枚舉,即便我們認識幾千個漢字,但是我們無法去線性地去將所有認識的漢字枚舉出來,我們的大腦,本就不是用來進行線性思考的,而復雜度上了一定程度的知識,線性的掌握,基本不可能。
有難度的知識,往往是這樣的:為了搞懂A,而去學B,為了學會B,而去學C,這叫遞歸學習,遞歸雖深,但有回溯,它最終會回溯到我們的起點。
所以開發者的學習更偏向于遞歸式的學習,而且可能會以一個知識點為起點,去完成樹狀知識外圍的遍歷。(有點像搜索引擎去爬蟲)
知識是樹狀結構, 或者網狀結構.
當我們試圖遍歷一個樹的時候, 最簡單直接的方式就是遞歸, 如果你非要去"線性"的學, 那就你是把編程學習當成了鏈表, 還是“單向”的,這種算法怎么可能用來遍歷樹呢?
區別五:拿會XX定義自己 VS 拿XX項目作者定義自己
linus 從來不說自己精通 c 語言, 與其說他不需要, 不如說他不關心, 因為他是 linux 和 git 的作者.
linus 這個程序員之神就是一個典型的開發者思維的人.
我希望所有計算機專業的同學們, 等你們畢業了之后, 你的github應該是綠油油的, 而不是貧瘠的一片白.
我希望你們用你們的簡歷里寫的是"用c語言實現了一個XX引擎, github鏈接”http://github.com/xxxxxx”而不是"精通c".
我希望學生們明白, 任何一個像樣子的項目, 制作周期至少是按月計, 你的大學有四年時間, 哪怕一個項目做一年, 你也能拿出兩三個好項目, 不一定有多少star, 但是要完整, 文檔, 測試, 一應俱全.
我希望學生們知道, 做項目和寫課后習題不一樣, 課后習題一個小時, 而項目是長期不斷努力, 不斷學習突破的過程, 需要你每天都搞, 善始善終, 最終拿出成果來.
我希望學生們明白, 這個世界衡量一個人的成就, 從來都是"他做了什么", 而不是"他學會了什么", 不要總用修煉內功去感動自己, 必要時, 也請你為開源世界貢獻一點自己的力量.
我希望學生們明白, 考上985, 拿獎學金, 這都不叫成就, 因為和別人沒關系, 只有真正影響到別人的東西, 讓這個世界變得更好的東西, 才是值得去"秀"的.
最后送給學生們一句話: 愿你早日忘記學生的身份, 以開發者的姿態, 面對這個世界。