1. 程式人生 > >論程式設計師的自學心態

論程式設計師的自學心態

最近半年因為專案清閒,做了很多自學計劃,很多都是心血來潮,也並沒有都堅持下來,比如學習C語言、學習Spring和web基礎知識、學習作業系統等。在這個過程中,突然意識到“心態”是學習中一個很重要的部分。程式設計師大部分是獨自學習的,很容易進入一個懶惰或焦慮的極端狀態,當心態不穩定時,會發現時間眼睜睜地流過,而你卻無法進步,這是一種很難受的狀態。當心態健康時,不僅能保持穩定的學習速度,還能在學習中得到快樂,進入一個正向迴圈。

樓主是一個凡人,資質平庸,學習的目的無非是提高競爭力,使自己不至於某天淪為公司裁員的犧牲品。如果你有更清晰的夢想和目標,說明你比樓主層次高很多,歡迎來指點樓主。

為學而學是不行的

一開始學習時,樓主看了許多帖子,裡面的Java大神們都在說:要提高技術,就要不停地看原始碼,甚至自己造輪子……年輕的樓主深受這種理論影響,不屑於搞業務而日日研究如HashMap原始碼這樣枯燥的東西,甚至計劃自己寫一套collection framework,把大神們造過的輪子再造一遍,似乎只要寫完這一套東西就能立地成佛,能搞定所有的業務和bug。

當我開始寫HashMap的時候就發現,為了寫而寫是一種很蠢的行為。一個輪子內部的那些看似精巧繁雜的結構,存在的意義是為了讓輪子更好更長久地運轉,而不是工程師為了炫技而創造的。如果我們沒有一個實用的目標,反而會浪費時間,迷失在一些看上去很神祕的細節中。其實,像HashMap這樣的資料結構,只需瞭解它大致的工作原理就可以了,餘下的程式碼細節可以在使用有疑惑或者出了問題時再去看。

再比如,樓主看面經中總是提到JVM調優,因此覺得這是Java程式設計師進階所必備的知識,於是就買了書和教程去看,但是發現對於調優這個話題看書效率奇低,書上比較多的是一些描述性的內容,如JVM的記憶體分佈和垃圾處理演算法;還有一些實用性的內容,比如調優工具、調優案例。有些內容反覆看了又看,回想起來腦子裡卻不剩什麼,遠沒有看完一個演算法後的那種條理清晰的感覺。而花在這個問題上的時間卻遠遠超過看演算法的時間。

這幾個周,同事要做一個自動化測試工具,問大家有什麼好的建議。樓主想到自己一直學調優而無所得,靈機一動,提議在工具中加入調優功能,得到了同事認可。同事給樓主大概介紹了一些調優思路,推薦了一些資料去看。樓主希望爭取到這個親自實現調優功能的機會,於是幻想自己即將面臨各種效能問題,為了解決這些問題開始儲備知識,然後驚異地發現學習有了層次,樓主不再死板地按章節看書了,可以自動地篩選出重要和不重要的內容,甚至可以在腦中形成清晰的脈絡了!

所以計算機是一門實踐科學這句話一定要深刻理解。因為偏實踐,所以不可能當王語嫣,因為許多理論是從實踐中來的,好比數學公理,只能從實踐中得到感性認識,無法從其他的理論推測得來,也無法死記硬背。樓主是一個學院派的人,在這方面吃了不少苦。從中總結出的方法論是:

  • 電腦科學的知識大多是偏實踐的,學習這些知識不能只看理論,要依託於實踐。實踐和理論應該是兩條互相纏繞的螺旋線,當實踐無法繼續進行時就去看理論,當理論看起來無法理解更深時就去實踐。
  • 實踐最好是一個專案,但大多數情況要自己提需求,尋找實踐方法。可以是個人專案,也可以是自己的各種小demo等等,形式不限,學到就行。
  • 學習與任何事一樣,都需要務實。技術只是人們為了解決問題而創造的,包括那些聽起來很高大上的框架和名詞。只要懷著負責任的信念去做事一定會接觸到各種各樣的問題,面臨問題自然會去思考解決方法,在這個思考的過程中,你實際上就開始接觸了設計模式、JVM原理、計算機組成、網路協議等等……所以,不可以鄙視平時在公司做的那些看似簡單的業務。

持續輸出

長時間的學習很容易懈怠,陷入一種被動接受知識的狀態。另外,一個人的思想永遠不可能顧全所有方面。

比如,樓主的朋友最近想學習Java,於是樓主自告奮勇,每天給他介紹二十分鐘Java基礎。當說到垃圾處理時,樓主自然地老生常談:Java記憶體分為新生代和老年代,一般的GC只對新生代進行收集,而只有老年代也沒有空間了才會進行Full GC……朋友眨著天真的眼睛問樓主:為什麼要分兩個區進行收集,而不是每次都對所有記憶體進行垃圾處理呢?樓主驚訝地發現自己答不出來,因為從未想過這個問題……

今天樓主複習時無意中發現,書裡其實有介紹這麼做的原因,即大部分物件都是朝生夕死的,按年齡分代並頻繁地收集新生區比較貼合這個模型,這樣既能照顧到常用的記憶體,也能保證垃圾處理能在比較短的時間內結束。這一段樓主其實看過多遍了,但竟然從未將兩者聯絡起來,也未思考過分割槽設計的原因……

又比如,有一次面試時面試官問Java執行緒池中核心執行緒數和最大執行緒數的區別。樓主輕車熟路地說:核心執行緒數是執行緒池的初始執行緒數,最大執行緒數是執行緒池能擴充套件到的最大執行緒數,只有任務佇列提交滿時才會擴容。面試官接著問道:“那你想過為什麼要這麼設計嗎?”樓主支吾半天也沒答上來……事後一想,其實很簡單,就是為了既能重用執行緒,減少執行緒開銷,又能滿足偶爾的大規模請求而已。這麼簡單,為何當時沒想到呢?

……因為平時看書的時候就缺乏思考啊……

對於樓主這種口號上的巨人、思考上的矮子,除了經常給別人講東西從而被別人挑戰之外,還有一個好辦法,就是堅持寫部落格。

部落格是一篇文章,需要有文章結構這種東西,為了使你的部落格顯得比較有邏輯性,你會被逼著去梳理知識點之間的邏輯,以及一門技術的由來、歷史、產生背景等等。在梳理過程中,你會發現看書時遺漏的點被填滿了。另外,把思路寫出來能進一步強化你對知識的印象。而且,持續寫部落格會給你的學習造成一種健康的儀式感,即使一開始沒有太多讀者,你也會愛上這種輸出的感覺,反過來督促自己為了寫出更多部落格而堅持學習。

行動緊張,但心情輕鬆

焦慮是自學最大的敵人。有一陣子看到朋友看書很快,自己也想加快腳步,可是卻打亂了自己的一貫節奏。又有一陣子,像著了魔一樣四處搜尋名人自傳、大神部落格,然後發現自己跟大神的差距要以數十年計,陷入一種無止境的焦慮。

樓主願意相信,焦慮並不是完全不好的狀態,因為它證明一個人想要進步,想跟那些優秀的人比肩。但是,“認識自己”也是一門非常重要的學問。每個人都是不同的,現在跟大神差距很大並不意味著幾年後還會差距很大;但是有一個堅持下去的祕笈,跟跑馬拉松一樣,就是不要看別人,不要看終點。要做到這一點,先要接受自己的平凡,這樣才能平心靜氣地去吸收知識、抵禦外界的影響,而持續的焦慮只能適得其反。

如果每天都抱著一個遠大的夢想,正襟危坐地努力學習,會發現很快就累了。之所以看電視劇不容易累,是因為潛意識就告訴自己在玩。如果學習的時候,也可以調整到一個好玩的心態,把問題當作小樂趣去解,會發現不知不覺就沉浸在解題的樂趣中,而感受不到時間的流逝,這種狀態是學習的上乘狀態。

一些囉嗦

樓主是個心高氣傲的人,花了許多時間才接受自己是凡人這個事實。或許這個打擊來得越早,就越容易踏實地走腳下的路。 跟初高中就開始學演算法、寫遊戲,大學拿到ACM金牌,畢業後幾家大公司隨便選的大神相比,樓主實在是天資愚鈍,大學時僅有的一門程式設計課——C語言學得異常痛苦,研究生時自學程式設計磕磕絆絆,做畢設時經常晚上十一點被導師的郵件揪起來——程式碼又出現了問題。樓主天資平庸,工作平凡,在寫程式碼上沒有任何具體的目標,比如"要做出一款炫酷的RPG遊戲"這樣的…… 為了這個事實,曾經非常焦慮。喜歡拿自己跟別人比,唯一的結論就是還差得太多,連別人初中的水平都不如,得趕快補上……於是買書做計劃,每天都要完成計劃的指定部分,比如讀十頁書等等,這樣也堅持了一段時間,但是因為壓力比較大,學習效率實在不高,很久之後感覺還在入門邊緣徘徊。 也不是說時間不重要,畢竟有著名的"一萬小時定律"擺在那。但是看似努力學習超過一萬小時而還沒成為大牛的人也是有的。從我自身的經驗,還是"進入狀態"最靠譜。拿我自己來說,進入狀態後兩天學到的可能比沒進入狀態時幾個周學到的都多,絕不誇張。 所以,最近越來越相信方法論了。 如果你看到這裡,說:樓主說得都很有道理,但我缺乏學習的動力,怎麼辦?推薦你去看一下。你會發現作者對未來人類文明坍塌的預言可能超出你最悲觀的想象。作者認為,隨著現代科技的爆發式發展,社會貧富分化將迅速加劇,中產階級將逐漸消失。那些無法理解現代科技的人會沉到社會下層,淪為科技的奴隸;而由於AI技術的快速發展,大部分本屬於中產階級的程式設計師都將失業,失業後由於看不到希望,沉溺於虛擬遊戲這樣的“精神毒品”度過貧窮的一生。在這樣的魔幻世界中,“終生學習”已經不是一句口號,而是一個人清醒地生存在世界上的必需……