1. 程式人生 > >分享一些自己的學習歷程和學習方法

分享一些自己的學習歷程和學習方法

學習的三個階段



第一階段:消費者階段

我在快上高中的時候,開始接觸的程式。那會兒家裡有一本 Visual Basic 的書,30 多頁左右,也是家裡唯一一本計算機類書籍,是我哥學校發的一本課外書,他對計算機貌似沒有什麼興趣,就一直堆在家裡,直到無意中被我翻到。

書裡的程式格外的簡單,幾行簡單的英語程式碼,就能讓計算機彈出一個對話方塊,當時看到簡直神奇極了!躍躍欲試的在老媽店裡的電腦上一步一步的敲下程式碼,彈出一個簡單的對話方塊,那一瞬間,感覺像是推開了新世界的大門,從此一發不可收拾。
實踐完 VB 後,又在小書攤,看到了一本 《黑客 X 檔案》,看著各路高深的入侵,木馬,盜號,試圖努力學會這些技能,然後去跟朋友們炫耀,但一直都無法入門。因為需要太多計算機的基礎知識了,不是寫個彈框,或者計算器水平的人能搞定的。

那會兒家裡也沒有懂電腦的,也沒有人可以問,又處在小城市,連個培訓班都沒有。

隨即,開始漫漫買書求學路。

  • 一旦開始買書,就進入了學習的第一個階段:消費者
    階段。當個消費者其實是個挺輕鬆的事情,對著書本照貓畫虎,一會兒就能跑起來一個看著很有趣的程式。

那會兒,瘋狂的買各種書,但是由於周圍沒有人指導,買了很多類似 21 天 xxx 系列的書,那會兒真的有這種書,我還抱有幻想⋯⋯覺得 21 天后我就⋯⋯

現在想想國內的圖書市場簡直惡劣到一定程度。很多高校,教師升職評比需要考察發表書籍情況,導致國內一大批爛書其實都是高校老師發出來的。我現在依然認為國內 95% 的技術類書籍是不值得買的,除了像侯傑老師這種文筆很好的技術人以外。

很多作者總是做不到『以讀者能理解的順序,而非自己認為的順序』寫文章,坑害了不少對計算機有興趣的同學。我一直很崇拜侯傑老師的另一個原因是侯傑老師的書,總是能把你最想問的,如同庖丁解牛,深入淺出的解答出來。就如同 MFC 框架(很早前的一個 Windows SDK 框架,現在已經用的很少了),MFC 是很複雜的一個框架,所有初學的人,都會問一樣的問題:"這玩意兒是怎麼工作起來的?!",但所有國產的 Visual C++ 的書,都避而不答,讓你照貓畫虎的做,就能彈出一個窗體。當初國內只有 《深入淺出 MFC》一書,講明白了背後的一切。

學完一些基礎知識後,就進入了學習的第二個階段 實踐者階段
階段。所謂實踐者,就是開始用自己所學,去開發程式,成為一名專業或非專業的碼農,很多人的職業生涯,也就停留在了這個階段,過上了小富即安的程式設計師的日子。

我從消費者階段過度到實踐者階段大概用了三四年的時間,其實已經挺長的了。我一直都認為我是一隻笨鳥,無意中起飛,卻飛了很久的那種。

第二階段:實踐者階段

我真正開始實踐的,是在本科學校做的幾個網站。

第一個是個學校的匿名聊天系統,就是所有人都可以登入學校的站點,然後會匿名匹配到一個異性,開始聊天,當時用的 Asp.net 做的開發,配合 ajax + jquery,但由於當時技術太差,導致很多人聊著聊著就斷線了,導致小產品不告而終。

第二個是給我們資訊學院開發的一個官網,用的 PHP。在做這個網站的同時,我選修了一門叫《網路安全》的課程,這門課的老師叫陳路,我曾當著老師的面兒,誇下海口,我開發的官網,堅不可摧...(大概這個意思)陳老師知道了我做的網站,隨即下達一個作業:"誰能攻陷我們的官網,一個漏洞加五分...",後來,咳咳⋯網站資料沒有了⋯⋯ 有個同學用一個很通用的掃描工具,在他也不知道發生了什麼的情況下,工具把網站內容都刪除了⋯⋯恩,我犯了個超低階的錯誤⋯⋯ GET 請求可以刪除資料,外加身份認證程式碼有誤⋯⋯

幸好,檢視 Apache 日誌的時候,發現刪除請求到來的前幾分鐘,Google 爬蟲來過(那會兒 Google 還能用),隨即馬上去 Google 的快取裡找回了所有的資料。
後來陳路老師被學校批鬥了一頓,批鬥的罪名是『鼓勵學生攻擊校園網路』,我其實是極力跟學校執事說明這個錯誤是我犯的,陳老師做的並沒有錯,而且我到現在還是很喜歡陳老師這種教學方法,畢竟實踐出真知。

  • 可能現在陳老師在教《網路安全》課程的時候,會以 "當年有個學生...." 作為開頭,有時候想想也挺有意思的。

再後來我花了很多實踐學習 Web 安全相關的知識。寫各種 Web 程式時,都會最大程度的考慮安全問題。
網站攻陷後沒多久,Android 出來了,我買了第一部 Android 手機,然後自己照著官方文件開始學 Android,動力的源頭,是我聽說寫 App 能賺錢。賺錢真是學技術的很強的動力,之前寫網站零零星星的賺了六七千塊錢,作為同學裡的小土豪,我又把目光轉到了剛出來沒多久的 Android 上。
當時先定了一個目標,寫一個圖片類 App,打算叫『無盡畫廊』。因為很喜歡 WeHeartIt 這個小眾文藝圖片網站。隨即計劃利用正則解析圖片地址,然後再把圖片呈現在 App 上。那會兒 Java 和 Android 完全零基礎。

自己在入門 Android 的時候真的超級拼。早上 6 點起床,然後開始悄悄下床(不能吵著舍友),開啟電腦開始研究加開發。折騰到早上 7點半左右就和舍友一起去吃早飯,然後上課。中午回來也不午休,開發到快上課,晚上基本都會熬到 12 點左右。持續了 1 個月左右,終於從零基礎到開發出一個粗糙的 1.0 版本,發到了國內的幾個 App 市場。反饋不是很多,但是都挺積極,隨即決定開發 2.0 版本,還加入了廣告積分牆。就這樣超拼的持續了 3 個月左右。現在網上能看到的基本都是 2.0 版本。我從這個 App 裡,也賺到了一些廣告費,大概幾百塊。但是因為廣告服務商倒閉了⋯⋯ 錢到現在還沒取出來⋯⋯ 心痛⋯⋯
持續更新那個 App 到快畢業的時候,選擇了保送到北師大。

暑假的時候去上海一家小公司去實習了,在實習的這家小公司,我做了一個到現在來看依然很屌的功能。現在來看是一個相當不錯的 Growth Hacker 的一個案例(那會兒可沒有增長黑客這個概念)。

實習所在的公司,是做類似小米盒子的東西。當時的盒子,最重要的當屬內容,版權還處於蠻荒時代的時候,大家紛紛解析優酷,土豆這類的網站,以最少的成本,盜用優酷的頻寬。簡單點而來說,就是做視訊聚合。視訊聚合最麻煩的就是提取視訊的真實檔案地址,這樣能為所有的創業公司免去版權糾紛,同時解決頻寬費用問題。

我去那家公司實習的主要內容,就是用 Node 語言做視訊地址解析,費勁功夫搞定了幾乎所有的視訊網站,各種黑科技都用上了,抓包,逆向,Headless Browser 等等。搞定所有網站後,也算勉強跟競爭對手站在同一起跑線。實習第二週的時候,已經有些沒事兒幹了,就在這會兒瘋狂的想法出現了!

可能很多人還記得當年偉大的迅雷雲播,解救了不知道多少個少男寂寞的夜。我們瘋狂的想法就是要讓我們的小盒子,能夠流暢的播放使用者從電腦上推送的任意種子檔案,無需等待。在那會兒 TV 上,這種功能簡直就是創舉!

想法出來後,我抗下大旗,開始用程式碼模擬迅雷雲播的全套流程。開發的過程十分艱難,得從不同平臺的迅雷上抓包,尋找蛛絲馬跡。優先從 Web 端模擬登陸和提交種子檔案,這些都相對容易一些,最難的是如何提取到視訊的真實地址。花了大概一週時間攻陷了所有的流程,然後公司買了 10 幾個迅雷會員,又和各路 BT 網站開始合作,開啟了浩浩蕩蕩的使用者增長之旅。具體增長了多少新使用者,其實我心裡沒有數,但是看見旁邊的小朋友,每天都在加伺服器,優化 Socket 連線數,我猜那一週得新增了 5 - 10萬用戶,更為壯觀的是每到夜裡,所有的迅雷賬號裡就瞬間塞滿各種不可描述的日本電影,全部清空後,又被瞬間塞滿。以至於後來,實習到第十七八天的時候,我的老闆和 CTO 喊我過去,直接送了我 20 萬期權,那感覺也是蠻爽的。後來微博上,這個功能也是火了一陣子,不過很快就掛了,起因是有使用者在微博上 at 了小米電視和迅雷,讓他們跟我們學著點兒⋯⋯ 然後,不超過半小時⋯⋯ 服務就掛掉了⋯⋯ 不過掛掉沒幾天我就去帝都準備研究生報名了。

還有一件很爽的事,就是我上了研究生後的半年裡,那家公司一直給我支付著工資⋯⋯ 每個月輕輕鬆鬆就有幾千塊錢零花錢⋯⋯ 再後來的後來,那家公司倒閉了⋯⋯

快從上海實習結束的時候(實習一個月),我又認識了少楠,加入了 AT!組織。AT! 組織是一個分享優質原創動畫的小團隊,從此我從一枚野生開發正式晉升為一枚正規軍。少楠是一枚非常優秀的產品經理兼設計師,跟著他學到了很多產品的知識和團隊協作的技巧,也讓我最後真的開發出了近百萬使用者的 App。AT!組織到現在都是我愛的組織,大家雖然從事不同行業,但就跟親人一樣。每次聚會都是一年一度最嗨皮的日子,都是我經歷過最真誠的聊天。從後來做了 AnimeTaste 再到 EverMemo,我第一感覺到團隊的重要性,第一次見識到優秀的設計師和 iOS 開發者。

以上的諸多經歷也為自己創業埋下了很多伏筆。這些都是我是我的實踐者階段,漫長的三四年。

第三階段:創造者階段

實踐者階段之後,自己開始嘗試創造。也是我認為學習的第三個階段 — 創造者階段,這個階段是沒有結束節點,就一直這麼存在著。

我大致是研究生一年級的時候開始摸到創造者階段的門樑,大三的時候接觸的 GitHub,感覺是我學程式來,開啟的第二個世界的大門(第一個,算是那個 VB 程式的彈框)。接觸到 GitHub 讓我第一次開始學習和研究指令碼語言( Python,Node,PhantomJS 等等),第一次開始接觸真正的生產工具(類似 Less,Sass 等等),GitHub 簡直是求學者的寶庫,你會很期待明天的 Trending 榜單上會是什麼新東西冒了出來。

那會兒在研究生階段,每個月有了公司發的幾千塊錢,也開始入手了人生第一臺 iPhone,一臺土豪金版的 iPhone5s,買 App 太貴便折騰起了越獄(現在都是買 App 了)。裝了一款越獄後的 Store(我忘了叫什麼了),那個 Store,在下載一個 App 的時候,有個超漂亮的進度條,我每次都會認真的的盯著那個進度條,一邊看,一邊感嘆,一邊也暗許自己也要在 Android 上實現一套,這也是我開始第一次開發自定義元件的初衷,也是 NumberProgressBar 誕生的最初原因。

啃下第一個自定義元件,對很多人來說都是很痛苦的,我也一樣,那會兒的 Android 元件少的可憐,不斷的看文件,看原始碼,讀別人的程式碼,試圖搞清楚更多更底層的東西,不斷的嘗試執行,折騰了一週左右(每天超過 10 小時投入),終於做出來了,照貓畫虎的寫好文件,做好測試,小心翼翼的釋出到 GitHub,然後發表到當時為數不多的 GitHub Android 分享社群裡。地址在這裡:plus.google.com/+daimaj

再到後來的幾個月,又陸續寫了一些其他的庫,發到 GitHub 上,其實我根本沒想到會有那麼多人去 Star,可能跟下手比較早有關,恩。

創造者階段,就是努力創造那些沒有的,源自你腦海裡的東西,而不是別人安排給你的。努力做到讓更多的人用到,可以是一個 App,可以是一個幫助人們提高效率的 Chrome 外掛,也可以是一個簡單的元件。創造是最挑戰你對一個行業的熱愛程度的。

我從來不反對重複發明輪子。每一個輪子即便有一些小的改進,都是適應自然法則,優勝劣汰的。

就我身邊而言,我最崇拜的創造者是尤小右,將一個小的 Framework,一點點的做大,再到做出國際影響力,真是個不得了的事情,也是很多技術人夢寐以求的事情。

總而言之

如果你忽然覺得自己這幾年一直處在一個很穩定的狀態中,覺得自己沒有提升,那你得想想是不是我卡在了某個階段,一直無法突破,你是否需要做些什麼,突破到下一階段去。隨後的文章我也總結了一些誤區和突破方法。

被誤以為的學習


當年,有一本書刊特別流行,叫《故事會》。《故事會》後來銷聲匿跡了,在我眼裡,取代《故事會》的是知乎。對,就是那個知乎。
我其實一直很反對一個論調:“上知乎,學知識”。醒醒吧。知乎明顯就是現代版的故事會好嗎?!
我不否認知乎存在有價值的知識,但,根本不值得你花那麼多時間,去發現那少的可憐的知識。去讀書吧。用最系統的邏輯,去學會一項技能,哪怕你去《矽谷百年史》裡去讀那些振奮人心的快捷半導體的故事,也比你不斷的知乎看著水的一筆的帖子要強的多。現在,最可怕的是大家在知乎上消費著垃圾,卻依然覺得自己在吃著乳酪,學習的過程都是伴隨著思考和痛苦的,如果你邊笑邊學習,那你真的得醒醒了。

目標和激勵很重要


我在大三下半學期被保研後,開始了另一個小專案,一個叫 小熊詞典 的 App,起因是因為在學英語的時候,所有詞典類 App 想要獲取最全的詞語解釋都需要聯網,流量消耗大不說,電量是最大問題,自習一早上電量就沒了。所以,自己想動手寫一個詞典 App,主打離線詞庫和快速查詢。

但最後的時候,小專案胎死腹中。說實話,整個 App,已經開發到 95% 了,抓取了非常多有名的詞庫的資料,並且整理成了規範格式。但專案最後還是放棄了。即便今天來看這個詞典依然很酷!(最豐富的詞庫和最快的查詢速度)

現在想想,當初一個人開發的時候,每次想到一個很酷的功能,就決定加進來,專案進度遙遙無期。完全沒有專案管理的思路,也沒有意識到這樣會很快拖垮我的體力,消磨掉自己的意志和熱情。

對於很多初學者來說,總是抱著書學,其實也是同樣的後果,你無法獲得任何的反饋和激勵,以至於覺得一件事情越做越難。學習的過程,最好能定一個簡單的目標,比如:“我即便現在什麼都不會,我就要做個小遊戲出來,這個遊戲應該是這樣的一個玩兒法,blablabla。”,做出來後,快些去找使用者,可以是你的朋友,也可以是你的父母,最好是那些不吝惜讚美的朋友們,讓他們無形之中給你一些動力。

你永遠無法一步達到完美


我認識的朋友中,他們都有各種稀奇古怪的想法亟待實現,但最後,以信誓旦旦開始 Side projects,最後卻都銷聲匿跡了,這是不無原因的。因為很多的開發者在剛開始的時候,缺乏清晰的計劃,卻想一步登頂完美的境地。這是很可怕的想法。就好比,我一個很少登山的人,卻在第一次的時候,就決定登頂珠峰,結果自然可想而知。在實踐自己想法的時候,最好能考慮以最低成本去展現你想法的核心部分,而非一個大而全的方案。

從最小成本的想法核心,一步步的去驗證自己的想法,去收集反饋,調整策略。最終抵達一個正確的目標。

趕在興趣消失之前,去學習新知


不得不承認懶惰是人的共性,當你看到別的朋友做出來很酷的小遊戲的時候,你是否也有幾分鐘衝動的想要去學習遊戲製作。不要等!快去買兩本書抓緊學起來,哪怕你知道你這個熱情的苗頭很快會熄滅,但請不要放棄任何發現新大陸的機會,在學習衝動消失之前,去入個門先。

我每次跟人互相分享初高中生涯的時候,我總是能想起來我初中時候的一位語文老師,微胖,性格和藹。
她在一次自由複習準備期末考試的時候給我說: “你複習,不要侷限在課本上,你背會 24 節氣都是很有意義的,想看什麼書,就去看,不要等,不要擔心自己學不會。”
這話對我學習新東西影響特別深,現在我基本上想學習什麼東西,立馬去學,即便可能一週後氣餒了,放棄了,但是從來不會懷疑學這些零碎知識的意義。
我學過吉他,寫過毛筆字,寫過 Delphi,用 Sketch 畫過 icon,用 Blender 畫過 3D 保齡球,寫過 Unity 小遊戲⋯⋯ 很多我都沒堅持下來,但給我帶來的最大改變就是我不會懼怕去接受新事物,思考問題的時候總是能把很多場景考慮到。也能慢慢的找到自己最愛做的那件事情,更清楚的定位自己。
所以,當你忽然對某件事情有興趣的時候,抓住那幾分鐘,那幾天,趕緊去學點新東西。
畢竟,點總是會串成線的。

少看別人寫的文章,多看優秀的程式碼


我做 Gank 以來,很多開發者都投稿過,以至於現在後臺還擠壓著 2000 多個投稿沒有處理。看過這麼一圈而後,我開始不主張去看別人寫的技術類文章。看別人的文章,你看到的是他想講給你的,而這些可能只是他在自己的專案裡用到的,而不是一個客觀全面的角度。時間一長,以至於你只知道這個東西的一兩種用法,更可怕的是你可能已經對思考喪失興趣,總想走捷徑,可能這樣前期學習效果顯著,但是後期會很快到達瓶頸。我想如果你經常讀各種語言的官方文件,總是會有 “啊哈!這樣都可以,我以前都不知道還有這種方法存在。” 的感嘆,但你看別人的文章,卻很少有這種感覺。

至於主張看優秀的程式碼,其實是希望學習一個技術細節,是伴隨著思考的。其實,評價某一種方案好與不好,是沒有意義的。只有多積累其他人解決同一問題的方法,才能在下一次做決策的時候,找到適合當前場景的最優解,很多時候,也能觸類旁通,給解決其他問題提供思路。

慢慢減少對二手知識的依賴


技術提升這個過程,其實是你對二手知識減少依賴的過程。二手知識是什麼?就是那些經過別人翻譯,總結的文章。一開始入門,大家看到的都是二手知識(也可能是三手,四手的知識),但,想要提升自己的能力,強迫自己多去看些更官方的文件,體系化去學習。這個過程是很消耗體力和腦力的,但多堅持,一定會有明顯改善的。

收藏的意義不大,收藏也不能改變什麼


很多人看到不錯的文章,總要 @我的印象筆記⋯⋯ 我之前也會這麼幹,經常把一些不錯的文章,存到 Pocket 或者 Readability 裡,但,真的回顧去看那些文章的機會太少了,而收藏這些文章給我帶來不少壓力。有的文章,我只是淺顯的讀了讀,腦子裡總是得記著有時間了再去讀完剩下部分,正如大多數人一樣,再也不會去讀了。久而久之,拖延症也就變得理所應當。

有可能你會說萬一哪天用到呢?其實我覺得再 Google 一次就好啦,可能會找到比這篇文章更好的。就這樣。

現在,看到一篇不錯的文章,首先從標題推測下內容,再掃一眼,如果跟我猜測的八九不離十,我基本就關掉了。如果有跟我的推測大相徑庭,我一定會一口氣讀完,而不是收藏起來以後再讀。

之所以我說收藏什麼也改變不了,是因為讀別人的東西,思考的過程是別人的。努力去減少從別人文章裡閱讀學習的頻率,多去讀一手資料然後自己總結。

培養一些對產品的感覺


你有沒有在 PM 說了要實現某個效果或者功能的時候,你站出來反對,說這樣並不合理。如果你有過,那麼我想你也是一個有理想的開發者,而不是一個“碼農”。聰明人喜歡跟聰明人合作,大家一開口就互相明白了。沒有人是天生聰明的,只是看的多了,想的多了,就顯得聰明瞭。

看些什麼呢?看看一個優秀的 App 早起的冷啟動是怎麼做的,看看 Apple Store 或者 Google Play 上最近有沒有什麼新奇的 App 出現,看看 Tech Crunch 上最近又有什麼天馬行空的專案融到了錢。

想些什麼呢?想想一個產品功能的存在有沒有意義,他的下個階段又會怎麼發展,想想某段文案是否會降低產品某個功能的轉換率,想想某個動畫效果是否是很惱人的存在,如果你可以對微信加一個功能,減一個功能,你又會作何選擇。

每個人都應該有個 idea list


我在西安讀大學那會兒開始,就有一個小本子,記錄著突然衝入自己腦海的一些靠譜或是離譜小想法。上面會寫著類似:

  • 做個 Every big moment,用手機記錄自己的每個值得紀念的瞬間,然後列印成相簿發給我或者放在網上當做自己的 Profile。
  • 狗狗出門便便,主人打掃很不方便,有沒有更好的方案?
  • 程式一旦崩潰,直接傳送操作記錄和堆疊資訊到 Dashboard,而不要讓測試人員努力重現,寫個 SDK,搭建一套服務,一定會很好用。
  • 很多的 Bug 追蹤服務,為什麼不在錯誤堆疊旁邊,展示出來這個 Bug 的解決方案,哪怕是一個 StackOverflow 的連結也好,這樣我就不用去自己搜尋了。

那個小本上記錄了自己好多做產品的想法,有不少,後來市面上都出來了相應的產品。也有一些現在看來很可笑,有的想法今天再翻看的時候,仍然會衝動的想要組團隊去實現。

Idea list 總是能激發你去創造的慾望,有空,就去不斷的記錄自己的 Idea list 吧。

另外,不要把自己的 idea 當做一個祕密,多和人去討論自己的想法,在不斷的否認和肯定中,完善自己的想法,idea 是不值錢的,只有實現它才是有價值的。

爭取去更優秀的地方


這句話可能大家都懂,但我的體會卻比大家都深刻。

我在西安一個叫西北大學的地方讀的大學,是一個普通的 211。計算機專業客觀來說比較一般,在來北京師範大學讀研究生之前,我甚至沒聽說過 ACM。

Python、Ruby、Node 這種程式語言在我們的計算機系,根本連影子都沒有,所以正統的計算機技能點基本都是 C,C++這樣,這並沒有什麼錯⋯⋯ 但路子就變窄了很多,學長畢業去個騰訊、阿里,已經能被大家推上神壇。

本科學校大二會給計算機系開一門日語課。為什麼會給計算機系開日語課呢?因為很多外包來自日本。這個邏輯我一直都接受不能。這都什麼年代了,我們早都不需要用外包支撐我國的 IT 產業了。

學校給學生的定位更多是一個學校展示就業率的棋子,你會什麼不重要啦,只要你最後有個工作就好了,不要拖累了學校的名聲。

來師大後,感受到了前所未有的轉變。學校整體的氣氛相當自由,很多老師們,都是各自領域的專家,你問一個問題,他們能給你引匯出很多有意思的點。久而久之,你也會被這些感染到。有時候,我也會想,以後穩定下來之後,要不要去申請個美國名校讀一讀。