01、從循規(guī)蹈矩到自尋出路
幾年前,當(dāng)我決心從零開始學(xué)編程的時候,我制定了一個「每天編程1小時」的計劃。
和大多數(shù)人一樣,我想系統(tǒng)的、有體系的去學(xué)習(xí),跟著教程從基礎(chǔ)學(xué)起。那時候還在印象筆記建了一個筆記本叫《每天編程1小時》,收集一些好的教程,根據(jù)知識點試著去列一套成體系的學(xué)習(xí)路徑。
但是開始跟著教程學(xué)的時候,問題來了??戳藥渍轮?,突然就會出現(xiàn)看不懂的概念,知識就斷層了,就跟上數(shù)學(xué)課撿了根筆之后發(fā)現(xiàn)后面的就聽不懂了,但我也沒錯過什么啊。我又試著跟著示例代碼敲,敲完也不知道這段代碼是怎么運作的,自己只要一拓展就會出錯,后來敲煩了就直接復(fù)制粘貼,感覺學(xué)的特別迷茫。
實在學(xué)不下去的時候,就換一本教程,基本都是從第一章開始覺得會了,但實際上又不知道學(xué)的這個要怎么去使,這種感覺就一直在我的腦子里嗡嗡的轉(zhuǎn)。到后來那一個概念我都看了六遍了,誰講都那樣,但還是不會使。
這時候開始對系統(tǒng)學(xué)習(xí)的方法有點懷疑了,大家都說要從底層學(xué)起、看大量書單,但會不會這種系統(tǒng)學(xué)習(xí)的方式不適合我這個非科班出身的新手?
畢竟,我已經(jīng)沒有4年時間來學(xué)編程了啊,我每天只有1小時能用來學(xué)習(xí),再這樣繼續(xù)看各種瑣碎的語法細(xì)節(jié),我就要失去耐心了。
我想,不如先寫點小項目練練手。于是我開始從一些簡單的程序?qū)懫穑瑢懸粋€匯率轉(zhuǎn)換的公式、寫一個隨機(jī)生成姓名的小腳本、寫一個把桌面文件自動歸類的小腳本、寫一個煎蛋的小爬蟲。
所以,開始動手寫練手項目,是我學(xué)習(xí)編程的一個重大轉(zhuǎn)折點,讓我開始把編程用起來了。
02、從報錯恐懼癥到巧解難題
邁過第一個坎之后,我開始嘗試一些更大的項目,試著用 Django 框架搭建一個網(wǎng)站,結(jié)果很受挫。敲了代碼之后,不光沒運行,結(jié)果還特么報錯,這么來回幾次之后,真的有種想要砸電腦的感覺。
有一次一個報錯卡了好幾天都沒解決,我覺得這樣下去不行了,于是找了一個國外的 Code Mentor 去有償請教他,我們 Skype 討論了一個小時,最后雖然解決了,但那是用他的思路去實現(xiàn)的,而我期望的是沿著我的思路去解決這個問題。
經(jīng)歷過這次求助之后,我發(fā)現(xiàn),如果我不能清楚準(zhǔn)確的描述問題,我就沒辦法解決這個問題。而問題一旦被清楚準(zhǔn)確的描述了,也就變得很容易解決了。
探索了一段時間之后,我甚至形成了一個自己的解決問題方法論:
▍第一步:提出假設(shè)
假設(shè)階段是最重要的,如果你對一個事情沒有假設(shè),說明你沒有思考。有時候之所以會痛苦,就是因為發(fā)現(xiàn)事實和你認(rèn)為最正確的假設(shè)是不一樣的。
在假設(shè)階段,我會從我的角度對這個問題做幾個推斷。報了一個錯之后,我腦子里會有若干個假設(shè),是環(huán)境錯誤導(dǎo)致的,還是語法錯誤導(dǎo)致的,還是網(wǎng)站的什么問題導(dǎo)致的?
▍第二步:搜索與修正
在這個階段,我把所有假設(shè)轉(zhuǎn)換成不同的形式進(jìn)行搜索。拆分假設(shè),重組語言,領(lǐng)域分類,轉(zhuǎn)換形態(tài)…用這些方法挨著個搜索一圈,會排除掉一些東西,但如果還是不行,我會往回退一步,搜一下我做的這個事情有沒有人在做,或者找一個相關(guān)視頻跟著敲。這樣下來,幾乎沒有什么問題是解決不了的。
通過這樣大量信息的檢索與對比之后,往往我會認(rèn)識到自己思路上的一些根本性錯誤,有一些假設(shè)是不成立的。
在初學(xué)時會犯很多這種假設(shè)上的錯誤,我通過幾輪會修正自己的常識,等到穩(wěn)固了之后,再在常識上進(jìn)行一些創(chuàng)新。
▍第三步:回歸問題
在經(jīng)歷了前兩個階段之后這時候問題本身就已經(jīng)變得清晰了很多,這時候只需要做的就是,將你認(rèn)為最有信心的解決方案大膽的實踐。如果成功那么問題就迎刃而解,如果不幸失敗,那就洗把臉振作一下,重新回到第一步。
在反復(fù)經(jīng)歷這些階段之后,我發(fā)現(xiàn)在解決新問題的時候,可以進(jìn)行一個準(zhǔn)確的假設(shè)了,因為我已經(jīng)積累了足夠多的編程常識。后來讀到《解決問題心理學(xué)》這本書,發(fā)現(xiàn)里面提出的方法和我自己總結(jié)的還挺像的,有一種欣慰的感覺,知道了自己解決問題的方法是經(jīng)過科學(xué)理論驗證的。
03、成長的唯一辦法就是寫更多代碼
雖然能做的事情比以前多了,但有些時候總會有一種不安、甚至是自卑感。就像是拼好了幾大塊拼圖,卻沒有把這些都連起來拼成一個完整的知識網(wǎng)絡(luò)。于是就想,是不是還是應(yīng)該系統(tǒng)學(xué)習(xí)、從底層老老實實的學(xué)起?
于是報名了一個美國的線下培訓(xùn)班,沒想到最后簽證沒過,后來才知道應(yīng)該選旅游簽證,而不是商務(wù)簽證。
參加培訓(xùn)受阻之后,我打算自己構(gòu)建一個知識體系,拆分了幾百個知識點、構(gòu)建了一條全面系統(tǒng)的學(xué)習(xí)路徑。但這些知識點都列出來之后,我又有了一種迷茫的感覺,面對著這么浩大的任務(wù)不知道該怎么進(jìn)行下去。那段時間感覺很無助、失去了方向,每天胡亂找些視頻來看。
無意中看到了 GNU 大神、Emacs 的作者 Richard Stallman 的一個演講視頻,他鼓勵大家從做中去學(xué),他說,
Programming is not a science. Programming is a craft. 編程不是一門科學(xué),編程是一門手藝。
聽到這句話之后我大受觸動,我覺得這種級別的大神都這么確鑿的認(rèn)為,除了動手做沒其他辦法學(xué)編程,那我已經(jīng)沒啥好辯駁的了。
于是我又回到了最初的項目驅(qū)動的學(xué)習(xí)方式,任由自己去折騰一些感興趣的項目,寫點自己工作用得上的插件,嘗試用最近流行的庫做點東西。
有一次試用 micro-django 那個庫,怎么弄都運行不成功,我就急了,就去看看他的源碼是怎么調(diào)用 Django 那個接口的,發(fā)現(xiàn)丫還有一組參數(shù)沒傳進(jìn)去,我改了下他的源碼,然后就成功了。這是我第一次看源碼,實際上他的源碼也就200多行,讀起來挺輕松的,我能理解他的思路,也能找到問題所在,還挺有成就感的。
從那時候起,我就有了看源碼的習(xí)慣。在閱讀別人代碼的過程中,我看到了更多的可能性。書里或者教程里教的知識,我并不清楚怎么在實際項目中運用。但在源碼中能看到不同人以不同形式去解決同一個問題,有的簡單有的復(fù)雜、有的長有的短,這讓我大開眼界。
我覺得對于技術(shù)上的學(xué)習(xí)讓我知道了技術(shù)的可能性并抱有警惕之心,在最關(guān)鍵的時刻派上用場。尤其是創(chuàng)業(yè)的時候,更需要在無路可走的情況下,找到解決方案。
剛開始學(xué)編程的時候,以為看完大佬給開的書單就是技術(shù)圈的人生贏家了。但后來發(fā)現(xiàn),選擇了學(xué)習(xí)編程,就是選擇了持續(xù)自學(xué)。隔段時間就會出現(xiàn)一些新技術(shù)、新框架刷新我的眼界。
最后,對于自學(xué)能力相對差的同學(xué)來說,如果覺得自個兒學(xué)習(xí)累,想找些引路人,報名IT培訓(xùn)班也是一個不錯的選擇。