程式設計師怎樣新學一門技術

程式設計師雜誌發表於2015-10-13

因為公司缺一個系 Web 管理系統的開發,我決定挑一個技術棧來學習一下,然後自己來寫。我選擇了 Node.js+Express+AngulaJS+MongoDB 這一條技術棧,花了將近兩週的時間,做了很多小 demo,寫了一系列博文,終於基本熟悉了 Node.js、Express、AngulaJS、UI Bootstrap、CSS、HTML、MongoDB、Mongoose 等內容,覺得可以開始寫我的 Web 管理系統了。

興奮啊,讓興奮飛一會兒。

之前公司有來過一個從沒做過開發的同事,在學習與實踐的路上遇到一些問題。最近有一個來實習的同事,也在學習中。結合我自己的學習過程,感慨良多,遂成此文:怎樣新學一門技術。

注意我的用詞,是“新學一門技術”,而不是“學一門新技術”。我想強調的是再一次學習這件事,而不是強調技術是新的。因為你有得東西跟著學,就說明技術其實已經不新了。扯起淡來收不住,還是別展開了吧,下面就正經八百地來總結一下,水一水。

有很多條,我們一條一條過吧,今天沒吃藥,感覺萌萌的,就說到哪裡是哪裡了。

選擇什麼技術棧

每一個技術棧都有存在的理由,都有最適合使用它的場景。某一個技術棧最適合解決某一類問題,你選擇它有時是因為它適合解決你的問題,有時是別人覺得它適合你或者你的問題,總之你一定有個理由,也許你只是想用用不同的技術。這些都不重要,重要的是,你終於開始了學習之旅。

對於我學習基於 Node.js 的技術棧,有兩個原因:

  1. 我以為它能輕鬆勝任寫一個 Web 管理系統這類任務,而且後續還可用於後端服務
  2. Node.js + Express + AngularJS + Mongoose + MongoDB 這條路,一門 JavaScript 基本就貫通了前端後端

瞭解你的問題和技術棧的特點

我們新學一門技術,往往是為了解決用現有技術棧不太容易解決的問題。因此,很有必要了解你面臨的問題,看看解決問題的關鍵在哪裡,可能的路徑由多少。然後呢,就要了解備選的技術棧能做什麼、擅長做什麼、有什麼公司什麼產品使用了它,這些產品的特點和規模與你面臨的問題有沒有可比性。

這一點其實和前面的“選擇什麼技術棧”是相輔相成的,甚至可以合併同類項。

列出待學習的技術點

熟悉了待解決的問題,選擇了一個技術棧後,就要靜下心來,進一步深入瞭解技術棧,看看究竟這條路上有多少技術點是必須要學的,把它們列出來,一定要列出來,這樣才可以一個一個來學,不至於學著學著忘了這個漏了那個。

每一項技術,對學到什麼程度也應心中有數。當然對於從未有過開發經驗的人來講,怎麼講可能都是心中忐忑忑,不過沒關係,且去學就是了。後面還會講到。

尋找合適的學習資料

網際網路時代,知識盈餘,資訊過量,你想學什麼東西,Google 或百度一下,有關聯的主題成千上萬,沒關聯的主題萬兒八千,總之資訊浩如煙海,而我們卻如落水的螞蟻,實在有點浩淼水面終生難渡之感。無力啊。

學過C,學過C++,學過 Windows 程式設計,學過 MFC,學過 Python,學過 Qt,學過 JavaScript,學過 Java,學過 Android,學過 SQL,學過 Node.js,學過 Objective C……

對我來講,我覺得一本好書是最好的開始,我每次新學一個東西,第一件事就是了解有什麼書,而且我一定要買紙質的。所以,我的書越積越多。這次學習 NEAM(Node.js+Express+AngularJS+MongoDB),我買了《Node.js+MongoDB+AngularJS Web 開發》這本書,覺得挺不錯的。

一本系統講述某項技術的書,可以讓你少走好多彎路,短時間覺得過程漫長,長遠看卻是捷徑。

另外最好的資料就是某項技術的官方 SDK,一般技術都有文件,API,Quick Start,Guide,Tutorial,Demo,Example……這些資料是頂好頂好的。不過我覺得結合書對照著來看效果更好。

如果能在網路上找到前輩們寫的系列文章,也是蠻好的。但很多文章就是蜻蜓點水或只涉及某一細節,適合對該技術有了一定了解再去看。不過呢,現在有很多人在分享,質量高的文章確實也很多。但是呢,對新學一門技術來講,來回尋找、判斷、選擇,時間成本太高。

網路上還有很多視訊教程,也可以一看。

總之各種資料都會有,根據你自己的學習經驗,選擇最適合你的那種。

坦然面對問題,不放棄

要說新學一門技術不遇到問題,鬼也不信呢。

比方說你換了技術樹,原來是玩兒C的,現在改玩 J2EE 或者C#,能不遇到問題嗎。比方說你原來玩 HTML 和 CSS,現在改 Swift……比方說……比方說……

當然也不全是技術問題,還會有心理上的問題。比如你急於看到你的問題能夠三兩下就解決,一旦過個三五八天你還不能用新學的技術解決實際的問題,就開始懷疑了,就不自信了,就自我否定,就打算放棄了,就有換個技術試試的想法了……我想說的是,軟體開發這裡,沒有哪個技術你學個三兩天就能用它幹出點兒名堂來,兩三週都難呢。所以心要靜,屁股要沉,意志要堅定,把一個坑挖出水來再說。

有時可能公司或領導不給你那麼多時間,但是這也不是大問題。8 小時之外你還有很多時間,還有周末,總之你要是想堅持,就一定有時間,時間就一定不是問題。

也許你有個階段會篤定“我實在理解不了掌握不了這個技術”,真的想放棄,但我想還是堅持多一秒吧,拐過這個路口就有彩虹了。

你不放棄自己,就沒人能放棄你。

保持對最終目標的清晰認識

我們最終要做出一個什麼東西,具有什麼功能,解決什麼問題,一定要明確下來,這樣才會有穩定的目標。

巨集大的遠景會讓人身心澎湃,會帶來源源不斷的動力。

只有樹立明確的目標,才能進一步往下拆分出一系列細小的子目標。最好把大目標分解,列到紙上或記到電腦上,不管怎麼樣,記下來很重要,而且要放在容易看到的地方,每天都看看,想想,保持敏感、緊迫感、期待感。

不斷實踐,積累自信

新學一門技術,不斷的小練習,持續的實踐是非常重要的。每學完一個知識點,都要動手寫點程式碼來看看效果。有時一個 Hello World 都讓人激動不已。

每一個小的成就都會傳達給你正能量,加強你的信心,都會讓我們離目標近一點。

按我的經驗,最好一兩天就能有小的 demo 完成,這樣刺激就會不斷,High 不停歇。要是你看上十天書才動手寫一個 demo,那可能還沒到十天呢,就放棄了。

目標太遠看不到產出和成長,就非常容易懈怠。即刻的成就感刺激很重要,它能推著你前進。如果你能把每個小 demo 都和前面從大目標拆分出的小目標結合起來,形成每一個小 demo 完成大目標的某一個細分小目標的話,那就太好了!

記筆記

毋庸置疑,學習過程中會遇到各種問題,又因為我們是奔著解決問題而去,很多知識原本是成塊的,而我們只用到某一點,或者某個技術還有很深入的內容而我們只是蜻蜓點水……

總之我們十二萬分有必要記筆記。筆記也不需要那麼正式,也不一定要遵循什麼特定的格式,也不一定要多麼美觀,只要能易懂即可。

筆記可以記錄下列內容:

  • 學習過程中搜集的資源連結
  • 遇到的未決的疑問
  • 那些很寬而我們用的很窄的知識點
  • 那些能進一步深入而我們淺嘗輒止的知識點
  • 某個功能可能存在的其它實現方案的蛛絲馬跡(要知道,知道茴香豆的“茴”字有幾種寫法對技術人員來講可是極好的)

待你長髮及腰或者胡茬勝草,就可以回頭整理你的筆記,回顧並進一步學習。這樣對新學的技術的理解就會更進一步。

步步為營,持續推進

新學一門技術,是還走馬觀花好還是細嚼慢嚥?

前一陣子有個哥們買了我的書《Qt Quick 核心程式設計》,我們反反覆覆郵件來往了N次,他讓我非常意外也非常感動。這個哥們每次郵件都會提出針對書中細節的疑問,附上拍攝的圖片,從圖片可以看到用手寫在書上的標註,還能看到用繪圖工具加的標註,我一下子就震驚了,這是多麼認真對待新學一門技術這件事兒的人呢!這哥們最終指出了書中的四處有效謬誤,我記錄了下來,準備再次印刷時修正過來。他告訴我,他在新學技術時,書裡的程式碼都要照著敲下來驗證!

我自己在學習時,也會隔三差五跑一跑書裡的程式碼,但絕對沒有這位朋友這麼認真,他讓我深感慚愧。

對於初學程式設計的人來講,我建議向這位朋友學習,步步為營,持續推進,不要怕慢,要求穩求細求紮實。多花些時間是值得的,良好的學習習慣養成了終身受益。

對於有經驗的程式設計師,在新學習一門技術時,也要儘量避免走馬觀花,要力求落到實處。當然此時我們往往很急切地要奔向目標,也有能力判斷哪些知識、技能是解決問題所必須的,可以挑著看,有針對性地學,但是,對於分揀出來的這些點,就要持初學者的虔誠態度,一步一個腳印,穩步前進。

投資自己要放開手腳

程式設計師最本質的財富是自己,挖掘自己的潛能,讓自己不斷增值,這是最要緊的事兒。像學習技術拓寬知識領域這種事情,再怎麼花錢都不過分啊。

有的朋友可能因為經濟原因,在學東西時不大願意買書、買視訊、買資料、買 VPN(很多技術資料都在國外站點),覺得不值當。

你像 Android 開發的線上文件、AngularJS 的文件,在天朝基本都不能正常訪問,都得翻 qiang 或使用 VPN,但是免費的翻 qiang 軟體就像多情公子段譽的六脈神劍時靈時不靈,來來回回找啊試啊特別浪費時間,而你買個靠譜的 VPN,一年也就一兩百塊,非常划算。

還有就是書,有的影印版的按美元定價,折成人民幣好幾百,不過也是值的。知識無價。

在增值的方向上投資自己,才是最明智的。

跨越心理障礙

其實新學一門技術的有兩類人:

  • 沒有開發經驗的新手
  • 掌握了某種技術的人

這兩類人在新學一門技術時會有不同的心理感受,也會遇到不同的問題。

對於沒有開發經驗的新人,進入到一個公司才開始學習開發技術,會有比較大的壓力,因為什麼都不懂,有時別人說的詞語都理解不了,巨大的未知領域會帶來巨大的壓力。有些人喜歡挑戰,會特別興奮,每天都自 High 到不行。有些人比較容易自我否定,碰一次壁就收縮一下,碰多了就跟無花果乾似的皺得不行毫無生氣。

其實呢,我沒學過,不知道,不會,這很正常,絕對是正常現象,不必為此憂慮,有智慧的人也不會因此看不起你,因為大家都這麼過來的,沒哪個傢伙孃胎裡蹦出來就能開發出一個 App 來。遇到問題少關注“別人怎麼看我”、“我這麼差”、“我搞不定”、“我好難受”這些負面的東西,多想怎麼解決,積極嘗試解決問題,這樣才會越來越好越來越好。

有過專案經歷的人在新學一門技術時,通常會有急於求成或錯誤預期這方面的問題。因為有了一定經驗,就會覺得再學別的什麼應該手到擒來易如反掌,往往會期待三幾天就能搞出點成績來,領導上也會有類似的期待,而實際上,這種浮躁的心態往往會導向不好的結局。你想啊,哪一項技術是那麼容易的,隨便搞搞就能搞定?

我 2014 年其實動過學習 Node.js 技術棧的念頭,在網上看過幾天資料,沒搞定就放棄了,當時就是因為錯誤的估計了新學一門技術的難度導致心態浮躁,在預期結果沒有如期到來時很容易就動搖了。

所以呢,有經驗的人,新學一門技術,就要努力放空自己,讓自己歸零,這樣會比較容易學進去,堅持下來。

堅持,堅持,再堅持

你以為我是湊數的嗎?重要的話說三遍,堅持很重要,所以要堅持,堅持,再堅持。這是最後的制勝法寶。

本文曾發表於《程式設計師》2015.10.A 期

相關文章