怎樣新學(xué)一門技術(shù)? 從零到能寫Web管理系統(tǒng)的經(jīng)歷
因?yàn)楣救币粋€(gè)系 Web 管理系統(tǒng)的開發(fā),我決定挑一個(gè)技術(shù)棧來學(xué)習(xí)一下,然后自己來寫。我選擇了 Node.js+Express+AngulaJS+MongoDB 這一條技術(shù)棧,花了將近兩周的時(shí)間,做了很多小 demo,寫了一系列博文,終于基本熟悉了 Node.js、Express、AngulaJS、UI BootStrap、CSS、HTML、MongoDB、Mongoose 等內(nèi)容,覺得可以開始寫我的 Web 管理系統(tǒng)了。
興奮啊,讓興奮飛一會(huì)兒。
之前公司有來過一個(gè)從沒做過開發(fā)的同事,在學(xué)習(xí)與實(shí)踐的路上遇到一些問題。最近有一個(gè)來實(shí)習(xí)的同事,也在學(xué)習(xí)中。結(jié)合我自己的學(xué)習(xí)過程,感慨良多,遂成此文:怎樣新學(xué)一門技術(shù)。
注意我的用詞,是“新學(xué)一門技術(shù)”,而不是“學(xué)一門新技術(shù)”。我想強(qiáng)調(diào)的是再一次學(xué)習(xí)這件事,而不是強(qiáng)調(diào)技術(shù)是新的。因?yàn)槟阌械脰|西跟著學(xué),就說明技術(shù)其實(shí)已經(jīng)不新了。扯起淡來收不住,還是別展開了吧,下面就正經(jīng)八百地來總結(jié)一下,水一水。
有很多條,我們一條一條過吧,今天沒吃藥,感覺萌萌的,就說到哪里是哪里了。
選擇什么技術(shù)棧
每一個(gè)技術(shù)棧都有存在的理由,都有最適合使用它的場景。某一個(gè)技術(shù)棧最適合解決某一類問題,你選擇它有時(shí)是因?yàn)樗m合解決你的問題,有時(shí)是別人 覺得它適合你或者你的問題,總之你一定有個(gè)理由,也許你只是想用用不同的技術(shù)。這些都不重要,重要的是,你終于開始了學(xué)習(xí)之旅。
對(duì)于我學(xué)習(xí)基于 Node.js 的技術(shù)棧,有兩個(gè)原因:
-
我以為它能輕松勝任寫一個(gè) Web 管理系統(tǒng)這類任務(wù),而且后續(xù)還可用于后端服務(wù)
-
Node.js + Express + AngularJS + Mongoose + MongoDB 這條路,一門 JavaScript 基本就貫通了前端后端
了解你的問題和技術(shù)棧的特點(diǎn)
我們新學(xué)一門技術(shù),往往是為了解決用現(xiàn)有技術(shù)棧不太容易解決的問題。因此,很有必要了解你面臨的問題,看看解決問題的關(guān)鍵在哪里,可能的路徑由 多少。然后呢,就要了解備選的技術(shù)棧能做什么、擅長做什么、有什么公司什么產(chǎn)品使用了它,這些產(chǎn)品的特點(diǎn)和規(guī)模與你面臨的問題有沒有可比性。
這一點(diǎn)其實(shí)和前面的“選擇什么技術(shù)棧”是相輔相成的,甚至可以合并同類項(xiàng)。
列出待學(xué)習(xí)的技術(shù)點(diǎn)
熟悉了待解決的問題,選擇了一個(gè)技術(shù)棧后,就要靜下心來,進(jìn)一步深入了解技術(shù)棧,看看究竟這條路上有多少技術(shù)點(diǎn)是必須要學(xué)的,把它們列出來,一定要列出來,這樣才可以一個(gè)一個(gè)來學(xué),不至于學(xué)著學(xué)著忘了這個(gè)漏了那個(gè)。
每一項(xiàng)技術(shù),對(duì)學(xué)到什么程度也應(yīng)心中有數(shù)。當(dāng)然對(duì)于從未有過開發(fā)經(jīng)驗(yàn)的人來講,怎么講可能都是心中忐忑忑,不過沒關(guān)系,且去學(xué)就是了。后面還會(huì)講到。
尋找合適的學(xué)習(xí)資料
互聯(lián)網(wǎng)時(shí)代,知識(shí)盈余,信息過量,你想學(xué)什么東西,Google 或百度一下,有關(guān)聯(lián)的主題成千上萬,沒關(guān)聯(lián)的主題萬兒八千,總之信息浩如煙海,而我們卻如落水的螞蟻,實(shí)在有點(diǎn)浩淼水面終生難渡之感。無力啊。
學(xué)過C,學(xué)過C++,學(xué)過 Windows 編程,學(xué)過 MFC,學(xué)過 Python,學(xué)過 Qt,學(xué)過 JavaScript,學(xué)過 Java,學(xué)過 Android,學(xué)過 SQL,學(xué)過 Node.js,學(xué)過 Objective C……
對(duì)我來講,我覺得一本好書是最好的開始,我每次新學(xué)一個(gè)東西,第一件事就是了解有什么書,而且我一定要買紙質(zhì)的。所以,我的書越積越多。這次學(xué) 習(xí) NEAM(Node.js+Express+AngularJS+MongoDB),我買了《Node.js+MongoDB+AngularJS Web 開發(fā)》這本書,覺得挺不錯(cuò)的。
一本系統(tǒng)講述某項(xiàng)技術(shù)的書,可以讓你少走好多彎路,短時(shí)間覺得過程漫長,長遠(yuǎn)看卻是捷徑。
另外最好的資料就是某項(xiàng)技術(shù)的官方 SDK,一般技術(shù)都有文檔,API,Quick Start,Guide,Tutorial,Demo,Example……這些資料是頂好頂好的。不過我覺得結(jié)合書對(duì)照著來看效果更好。
如果能在網(wǎng)絡(luò)上找到前輩們寫的系列文章,也是蠻好的。但很多文章就是蜻蜓點(diǎn)水或只涉及某一細(xì)節(jié),適合對(duì)該技術(shù)有了一定了解再去看。不過呢,現(xiàn)在有很多人在分享,質(zhì)量高的文章確實(shí)也很多。但是呢,對(duì)新學(xué)一門技術(shù)來講,來回尋找、判斷、選擇,時(shí)間成本太高。
網(wǎng)絡(luò)上還有很多視頻教程,也可以一看。
總之各種資料都會(huì)有,根據(jù)你自己的學(xué)習(xí)經(jīng)驗(yàn),選擇最適合你的那種。
坦然面對(duì)問題,不放棄
要說新學(xué)一門技術(shù)不遇到問題,鬼也不信呢。
比方說你換了技術(shù)樹,原來是玩兒C的,現(xiàn)在改玩 J2EE 或者C#,能不遇到問題嗎。比方說你原來玩 HTML 和 CSS,現(xiàn)在改 Swift……比方說……比方說……
當(dāng)然也不全是技術(shù)問題,還會(huì)有心理上的問題。比如你急于看到你的問題能夠三兩下就解決,一旦過個(gè)三五八天你還不能用新學(xué)的技術(shù)解決實(shí)際的問題, 就開始懷疑了,就不自信了,就自我否定,就打算放棄了,就有換個(gè)技術(shù)試試的想法了……我想說的是,軟件開發(fā)這里,沒有哪個(gè)技術(shù)你學(xué)個(gè)三兩天就能用它干出點(diǎn) 兒名堂來,兩三周都難呢。所以心要靜,屁股要沉,意志要堅(jiān)定,把一個(gè)坑挖出水來再說。
有時(shí)可能公司或領(lǐng)導(dǎo)不給你那么多時(shí)間,但是這也不是大問題。8 小時(shí)之外你還有很多時(shí)間,還有周末,總之你要是想堅(jiān)持,就一定有時(shí)間,時(shí)間就一定不是問題。
也許你有個(gè)階段會(huì)篤定“我實(shí)在理解不了掌握不了這個(gè)技術(shù)”,真的想放棄,但我想還是堅(jiān)持多一秒吧,拐過這個(gè)路口就有彩虹了。
你不放棄自己,就沒人能放棄你。
保持對(duì)最終目標(biāo)的清晰認(rèn)識(shí)
我們最終要做出一個(gè)什么東西,具有什么功能,解決什么問題,一定要明確下來,這樣才會(huì)有穩(wěn)定的目標(biāo)。
宏大的遠(yuǎn)景會(huì)讓人身心澎湃,會(huì)帶來源源不斷的動(dòng)力。
只有樹立明確的目標(biāo),才能進(jìn)一步往下拆分出一系列細(xì)小的子目標(biāo)。最好把大目標(biāo)分解,列到紙上或記到電腦上,不管怎么樣,記下來很重要,而且要放在容易看到的地方,每天都看看,想想,保持敏感、緊迫感、期待感。
不斷實(shí)踐,積累自信
新學(xué)一門技術(shù),不斷的小練習(xí),持續(xù)的實(shí)踐是非常重要的。每學(xué)完一個(gè)知識(shí)點(diǎn),都要?jiǎng)邮謱扅c(diǎn)代碼來看看效果。有時(shí)一個(gè) Hello World 都讓人激動(dòng)不已。
每一個(gè)小的成就都會(huì)傳達(dá)給你正能量,加強(qiáng)你的信心,都會(huì)讓我們離目標(biāo)近一點(diǎn)。
按我的經(jīng)驗(yàn),最好一兩天就能有小的 demo 完成,這樣刺激就會(huì)不斷,High 不停歇。要是你看上十天書才動(dòng)手寫一個(gè) demo,那可能還沒到十天呢,就放棄了。
目標(biāo)太遠(yuǎn)看不到產(chǎn)出和成長,就非常容易懈怠。即刻的成就感刺激很重要,它能推著你前進(jìn)。如果你能把每個(gè)小 demo 都和前面從大目標(biāo)拆分出的小目標(biāo)結(jié)合起來,形成每一個(gè)小 demo 完成大目標(biāo)的某一個(gè)細(xì)分小目標(biāo)的話,那就太好了!
記筆記
毋庸置疑,學(xué)習(xí)過程中會(huì)遇到各種問題,又因?yàn)槲覀兪潜贾鉀Q問題而去,很多知識(shí)原本是成塊的,而我們只用到某一點(diǎn),或者某個(gè)技術(shù)還有很深入的內(nèi)容而我們只是蜻蜓點(diǎn)水……
總之我們十二萬分有必要記筆記。筆記也不需要那么正式,也不一定要遵循什么特定的格式,也不一定要多么美觀,只要能易懂即可。
筆記可以記錄下列內(nèi)容:
-
學(xué)習(xí)過程中搜集的資源鏈接
-
遇到的未決的疑問
-
那些很寬而我們用的很窄的知識(shí)點(diǎn)
-
那些能進(jìn)一步深入而我們淺嘗輒止的知識(shí)點(diǎn)
-
某個(gè)功能可能存在的其它實(shí)現(xiàn)方案的蛛絲馬跡(要知道,知道茴香豆的“茴”字有幾種寫法對(duì)技術(shù)人員來講可是極好的)
待你長發(fā)及腰或者胡茬勝草,就可以回頭整理你的筆記,回顧并進(jìn)一步學(xué)習(xí)。這樣對(duì)新學(xué)的技術(shù)的理解就會(huì)更進(jìn)一步。
步步為營,持續(xù)推進(jìn)
新學(xué)一門技術(shù),是還走馬觀花好還是細(xì)嚼慢咽?
前一陣子有個(gè)哥們買了我的書《Qt Quick 核心編程》, 我們反反復(fù)復(fù)郵件來往了N次,他讓我非常意外也非常感動(dòng)。這個(gè)哥們每次郵件都會(huì)提出針對(duì)書中細(xì)節(jié)的疑問,附上拍攝的圖片,從圖片可以看到用手寫在書上的標(biāo) 注,還能看到用繪圖工具加的標(biāo)注,我一下子就震驚了,這是多么認(rèn)真對(duì)待新學(xué)一門技術(shù)這件事兒的人呢!這哥們最終指出了書中的四處有效謬誤,我記錄了下來, 準(zhǔn)備再次印刷時(shí)修正過來。他告訴我,他在新學(xué)技術(shù)時(shí),書里的代碼都要照著敲下來驗(yàn)證!
我自己在學(xué)習(xí)時(shí),也會(huì)隔三差五跑一跑書里的代碼,但絕對(duì)沒有這位朋友這么認(rèn)真,他讓我深感慚愧。
對(duì)于初學(xué)編程的人來講,我建議向這位朋友學(xué)習(xí),步步為營,持續(xù)推進(jìn),不要怕慢,要求穩(wěn)求細(xì)求扎實(shí)。多花些時(shí)間是值得的,良好的學(xué)習(xí)習(xí)慣養(yǎng)成了終身受益。
對(duì)于有經(jīng)驗(yàn)的程序員,在新學(xué)習(xí)一門技術(shù)時(shí),也要盡量避免走馬觀花,要力求落到實(shí)處。當(dāng)然此時(shí)我們往往很急切地要奔向目標(biāo),也有能力判斷哪些知 識(shí)、技能是解決問題所必須的,可以挑著看,有針對(duì)性地學(xué),但是,對(duì)于分揀出來的這些點(diǎn),就要持初學(xué)者的虔誠態(tài)度,一步一個(gè)腳印,穩(wěn)步前進(jìn)。
投資自己要放開手腳
程序員最本質(zhì)的財(cái)富是自己,挖掘自己的潛能,讓自己不斷增值,這是最要緊的事兒。像學(xué)習(xí)技術(shù)拓寬知識(shí)領(lǐng)域這種事情,再怎么花錢都不過分啊。
有的朋友可能因?yàn)榻?jīng)濟(jì)原因,在學(xué)東西時(shí)不大愿意買書、買視頻、買資料、買 VPN(很多技術(shù)資料都在國外站點(diǎn)),覺得不值當(dāng)。
你像 Android 開發(fā)的在線文檔、AngularJS 的文檔,在天朝基本都不能正常訪問,都得翻 qiang 或使用 VPN,但是免費(fèi)的翻 qiang 軟件就像多情公子段譽(yù)的六脈神劍時(shí)靈時(shí)不靈,來來回回找啊試啊特別浪費(fèi)時(shí)間,而你買個(gè)靠譜的 VPN,一年也就一兩百塊,非常劃算。
還有就是書,有的影印版的按美元定價(jià),折成人民幣好幾百,不過也是值的。知識(shí)無價(jià)。
在增值的方向上投資自己,才是最明智的。
跨越心理障礙
其實(shí)新學(xué)一門技術(shù)的有兩類人:
-
沒有開發(fā)經(jīng)驗(yàn)的新手
-
掌握了某種技術(shù)的人
這兩類人在新學(xué)一門技術(shù)時(shí)會(huì)有不同的心理感受,也會(huì)遇到不同的問題。
對(duì)于沒有開發(fā)經(jīng)驗(yàn)的新人,進(jìn)入到一個(gè)公司才開始學(xué)習(xí)開發(fā)技術(shù),會(huì)有比較大的壓力,因?yàn)槭裁炊疾欢?,有時(shí)別人說的詞語都理解不了,巨大的未知領(lǐng)域 會(huì)帶來巨大的壓力。有些人喜歡挑戰(zhàn),會(huì)特別興奮,每天都自 High 到不行。有些人比較容易自我否定,碰一次壁就收縮一下,碰多了就跟無花果干似的皺得不行毫無生氣。
其實(shí)呢,我沒學(xué)過,不知道,不會(huì),這很正常,絕對(duì)是正?,F(xiàn)象,不必為此憂慮,有智慧的人也不會(huì)因此看不起你,因?yàn)榇蠹叶歼@么過來的,沒哪個(gè)家伙 娘胎里蹦出來就能開發(fā)出一個(gè) App 來。遇到問題少關(guān)注“別人怎么看我”、“我這么差”、“我搞不定”、“我好難受”這些負(fù)面的東西,多想怎么解決,積極嘗試解決問題,這樣才會(huì)越來越好越來 越好。
有過項(xiàng)目經(jīng)歷的人在新學(xué)一門技術(shù)時(shí),通常會(huì)有急于求成或錯(cuò)誤預(yù)期這方面的問題。因?yàn)橛辛艘欢ń?jīng)驗(yàn),就會(huì)覺得再學(xué)別的什么應(yīng)該手到擒來易如反掌, 往往會(huì)期待三幾天就能搞出點(diǎn)成績來,領(lǐng)導(dǎo)上也會(huì)有類似的期待,而實(shí)際上,這種浮躁的心態(tài)往往會(huì)導(dǎo)向不好的結(jié)局。你想啊,哪一項(xiàng)技術(shù)是那么容易的,隨便搞搞 就能搞定?
我 2014 年其實(shí)動(dòng)過學(xué)習(xí) Node.js 技術(shù)棧的念頭,在網(wǎng)上看過幾天資料,沒搞定就放棄了,當(dāng)時(shí)就是因?yàn)殄e(cuò)誤的估計(jì)了新學(xué)一門技術(shù)的難度導(dǎo)致心態(tài)浮躁,在預(yù)期結(jié)果沒有如期到來時(shí)很容易就動(dòng)搖了。
所以呢,有經(jīng)驗(yàn)的人,新學(xué)一門技術(shù),就要努力放空自己,讓自己歸零,這樣會(huì)比較容易學(xué)進(jìn)去,堅(jiān)持下來。
堅(jiān)持,堅(jiān)持,再堅(jiān)持
你以為我是湊數(shù)的嗎?重要的話說三遍,堅(jiān)持很重要,所以要堅(jiān)持,堅(jiān)持,再堅(jiān)持。這是最后的制勝法寶。