我自己的一點(diǎn)感想
關(guān)鍵點(diǎn)一:不斷更新自己的信息來源。
這就需要定期整理自己的信息,大概分析下這些信息的來源忍啤,評估一下哪些是低效的,二手以上的信息仙辟,哪些是高效一手的信息同波。
目前相對可靠又十分便捷的信息渠道是:
- GitHub
- medium
- 官方文檔
- 長期更新的高質(zhì)個人博客
關(guān)鍵點(diǎn)二:養(yǎng)成記錄、分析數(shù)據(jù)的習(xí)慣
這里強(qiáng)調(diào)對自己平常的時間花費(fèi)進(jìn)行記錄叠国。比如這種:小實(shí)驗(yàn):對17年兩周的作息時間分析
關(guān)鍵點(diǎn)三:定期回顧積累的知識
這是一種看似慢節(jié)奏耽誤時間的行為 未檩,但其實(shí)稍微把周期拉長一點(diǎn)去看,這是一種高效的行為粟焊。這其實(shí)是區(qū)分短視的人和有遠(yuǎn)見的人的一個標(biāo)準(zhǔn)冤狡。看似一個小的轉(zhuǎn)變项棠,背后其實(shí)反映了很多很多悲雳。
回到復(fù)習(xí)知識上來,對系統(tǒng)級別的香追,整體的知識積累特別需要執(zhí)行好這點(diǎn)合瓢。并且重點(diǎn)還不是執(zhí)行了復(fù)習(xí)這一行為就行了,重點(diǎn)是不斷思考積累的知識之間的關(guān)聯(lián)透典,層級歪玲。這很費(fèi)精力,所以大部分人只走個復(fù)習(xí)的形式掷匠,逃避思考滥崩。
具體的做法是:留好大段的整塊時間專門用來思考,邊回顧邊思考讹语,要切實(shí)的感覺很累為止钙皮,并且如何判斷是否執(zhí)行了思考的標(biāo)準(zhǔn)是——思考完后一般都有很多想記錄下來的想法,很多想通了的那種興奮。
怎么練習(xí)語言和框架
參考自文章:演進(jìn):在工作的前三年里快速成長(練習(xí)篇)
買本相關(guān)的書籍短条,或者尋找份教程导匣、官方指南。
再找個合適的Demo茸时,熟悉基礎(chǔ)概念贡定,并掌握好相關(guān)基礎(chǔ)
在Demo的基礎(chǔ)上,實(shí)現(xiàn)一些業(yè)務(wù)功能可都,了解各種特性缓待、功能
查看官方文檔,查有沒有漏掉了什么重要的東西
撰寫博客渠牲、日志來記錄這個過程
工程實(shí)踐怎么練習(xí):模仿開源軟件
軟件工程實(shí)踐包括:
- 使用版本管理
- 使用持續(xù)集成
- 完整的測試用例
- 代碼檢視
- 等等
這方面可以參考優(yōu)秀的開源軟件旋炒。他們?yōu)榱吮WC好的項目質(zhì)量,擁有者往往付出很多精力提高軟件工程的實(shí)踐签杈。
所以練習(xí)提高軟件工程實(shí)踐最好是去模仿開源軟件瘫镇,并且自己去創(chuàng)造一些輪子。
如何正確練習(xí)提高
框架用多了其實(shí)提升很少答姥。真正的提升方法:
- 閱讀開源軟件與重構(gòu)代碼
- 造自己的輪子來重寫應(yīng)用
- 結(jié)合設(shè)計模式
- 引入其他領(lǐng)域思想
展開這四點(diǎn)铣除,以下引用原文:
閱讀開源軟件與重構(gòu)代碼
如果在工作環(huán)境中,沒有代碼寫得比較好的人鹦付,那么我們就只能從開源代碼中去學(xué)習(xí)通孽。筆者之前寫過一篇《如何以“正確的姿勢”閱讀開源軟件代碼》的文章,文中我建議的閱讀開源軟件代碼的方式是:
- clone 某個項目的代碼到本地睁壁。
- 查看這個項目的 release 列表。
- 找到一個看得懂的 release 版本,如1.0或者更早的版本。
- 讀懂上一個版本的代碼落恼。
- 向后閱讀大版本的源碼耸携。
- 讀最新的源碼。
可只讀這些代碼捂刺,不能讓我們顯著的提高水平,我們應(yīng)該結(jié)合『重構(gòu)』這個技能來練習(xí)。從我的練習(xí)經(jīng)驗(yàn)看來遂填,對于重構(gòu)的練習(xí)是最有意思的。我們可以見證澈蝙,一段不好的代碼在我們的調(diào)教之下吓坚,煥發(fā)出新的光彩。當(dāng)我們重構(gòu)一段壞味道的代碼灯荧,對比重構(gòu)前后的代碼礁击,便會發(fā)現(xiàn)自己竟然有這樣神奇的能力。
如果找不到合適的練習(xí)項目,可以到 GitHub 上找一些 star 多哆窿,但是沒有測試链烈、缺少 CI 等的項目練習(xí),這樣的項目在 GitHub 上也是蠻多的挚躯。
有一次强衡,我在尋找一個迷你的 Markdown 解析器,看到 GitHub 有一個精巧的實(shí)現(xiàn)码荔。它有 100+ 的 star漩勤,但是沒有測試、四百行的代碼里目胡,有一個方法有三百多行等等的壞味道锯七。于是,便花了幾天的時間誉己,邊思考邊重構(gòu)這個項目眉尸。這樣對編碼的提升比較大,因?yàn)楣ぷ鞯臅r候巨双,完成任務(wù)是第一優(yōu)先級噪猾,然后才是質(zhì)量。
因此筑累,對于我們練習(xí)來說袱蜡,我們只需要:
- 找一個不錯的開源庫。
- 閱讀其中的代碼慢宗。
- 找到代碼中設(shè)計不好的地方坪蚁。
- 對自己認(rèn)為設(shè)計得不好的代碼重構(gòu)。
- 結(jié)合《重構(gòu)》一書镜沽,來改進(jìn)設(shè)計敏晤。
需要注意的是:不同的人對于代碼設(shè)計,有著不同的觀點(diǎn)缅茉。因此嘴脾,在這時如果只是因?yàn)榇a的設(shè)計不好,而不是代碼里有各種壞味道(code smell)蔬墩,那么译打,就不應(yīng)該去給別人的代碼提 Pull Request。
造自己的輪子來重寫應(yīng)用
與閱讀代碼拇颅、重構(gòu)相比奏司,造一個自己的輪子,來實(shí)現(xiàn)同樣的功能樟插,便是一個更不錯的選擇结澄。在 Web 開發(fā)領(lǐng)域哥谷,大部分的開發(fā)框架本身都是『通用型』的框架。即它擁有相當(dāng)多的功能麻献,其中有很多的功能都不會用到们妥。如你使用 jQuery 的時候,你可能只會使用到其中的 Ajax勉吻、Event等功能监婶,那么你就可以寫一個新的框架,兼容這兩個接口齿桃。
練習(xí)時間充裕的時候惑惶,便可以自己動手去做一個。上面說到的閱讀框架代碼短纵,是一種好的方法带污。除此無論是前端還是后端,我們都可以找到從零創(chuàng)建框架的資料香到,來幫助我們理解框架的組成鱼冀。
通過閱讀諸如 Python 里的 Flask、 Ruby 里的 Sinatra 等輕量級的框架悠就,我們就能理解一個框架所需要的元素千绪,并模仿他們做出一個新的系統(tǒng)。這些框架的關(guān)注點(diǎn)是:處理 HTTP 請求的 CGI梗脾、與數(shù)據(jù)庫交互的 ORM荸型、控制邏輯的 Controller 層、返回 HTML的 View 層等等炸茧。除了相關(guān)的框架瑞妇,我們還能在 GitHub 上看到很多人模仿這些框架。做一個這樣的后臺框架梭冠,搭建自己的博客辕狰,那就能理解好這一系列的邏輯了。
對于前端來說妈嘹,也是類似的,諸如 Building React From Scratch绍妨,可以讓我們在 250 行理解 React 的原理润脸,并做出一個類似的框架。除了 MVC他去,還有模塊化設(shè)計毙驯、數(shù)據(jù)請求等等的內(nèi)容。在兩三年前灾测,《JavaScript框架設(shè)計》就是這方面一個不錯的選擇爆价。
我曾經(jīng)造過一個名為 Lettuce 的前端框架,它的主要目的就是用于:學(xué)習(xí)前端框架的設(shè)計,便在自己的多個業(yè)余項目上使用這個框架铭段。而在前端領(lǐng)域骤宣,定制自己的 UI 框架、CSS 框架也是一個很不錯的選擇序愚。再用到自己的博客上憔披,再寫上『自豪地采用xx框架』,豈不是更加的自豪爸吮?
在底層領(lǐng)域芬膝,又有各式各樣的《自制操作系統(tǒng)》、《自制編程語言》形娇、《自己動手設(shè)計物聯(lián)網(wǎng)》等等的書籍锰霜,它們都能讓我們從底層理解一個系統(tǒng)的組成。除此桐早,還有各種各樣的剖析類書籍癣缅,可以讓我們理解底層機(jī)制的同時,也能讓我們制作出一個框架勘畔。
最后所灸,我們只需要能不改寫或少數(shù)改寫代碼,將我們的應(yīng)用運(yùn)行在上面炫七,便是成功的一個仿造的輪子了爬立。
結(jié)合設(shè)計模式
設(shè)計模式,不同的人有不同的看法万哪。在我看來侠驯,一個優(yōu)秀的程序是要能『看懂』的。即不一定要精通奕巍,但要能識別出來吟策,它是一種設(shè)計模式。當(dāng)我們看到了一次又一次的相似設(shè)計時的止,應(yīng)該猜想到檩坚,其背后應(yīng)該是一種設(shè)計模式。如在前端開發(fā)框架中的『雙向綁定』诅福,它實(shí)際上就是發(fā)布-訂閱模式匾委,又或者稱觀察者模式的一種實(shí)現(xiàn)。
在筆者看來氓润,模式就是一種高級的語言赂乐。當(dāng)別人一說『工廠模式』,多數(shù)人瞬間就明白了咖气,不猶得會發(fā)出:原來如此挨措,這一類的感嘆挖滤。認(rèn)識了一些模式后,一遇到一些特定的場景浅役,我們就能一下子套用這種模式斩松。
可只憑閱讀 GoF 的《設(shè)計模式》一書,又或者《Head First 設(shè)計模式》担租、《重構(gòu)與模式》等設(shè)計模式書籍砸民,我們所學(xué)的知識便是有限的。我們要做的是:
先熟悉書本上的示例代碼奋救,來對不同的設(shè)計模式有一個大的了解岭参。
識別日常代碼中的設(shè)計模式。
練習(xí)這些設(shè)計模式尝艘,并掌握常見的設(shè)計模式演侯。
嘗試在日常的代碼中,套用設(shè)計模式背亥。
重構(gòu)現(xiàn)有的代碼到設(shè)計模式秒际。
要對設(shè)計模式進(jìn)行練習(xí),不是一件容易的事狡汉。并且很多時候娄徊,容易模棱兩可的情況,即適合使用 A 模式盾戴,又適合使用 B 模式寄锐。這是因?yàn)槲覀兪窃跒樵O(shè)計而設(shè)計,因此會盡可能的貼近現(xiàn)有情況尖啡。
引入其它領(lǐng)域的思想
不同的領(lǐng)域里橄仆,都有自己領(lǐng)域的優(yōu)秀思想。如我們熟知的設(shè)計模式衅斩,便是受建筑領(lǐng)域的《建筑的永恒之道》中描述的 253個 建筑模式的啟發(fā)盆顾。又如今天流行的精益思想,最早是來自汽車制造業(yè)畏梆,可它對軟件行來說您宪,有著令人受益匪淺的啟發(fā)。好的框架奠涌、軟件是會相互學(xué)習(xí)宪巨,如 iPhone 與 Android,都在不斷地借鑒——通知中心铣猩,但是又在那之上做一些改進(jìn)揖铜。
又比如茴丰,今天的前端框架里达皿,很多思想都是從后端“借鑒”過來的天吓。如 Angular 中采用的依賴注入,便是深受 Java 語言的影響峦椰。近一點(diǎn)來說龄寞,Redux,框架最初是用在 React 上汤功,但是它已經(jīng)被推廣到了 React 和 Vue.js 上物邑。
因此,當(dāng)我們發(fā)現(xiàn)一個新的優(yōu)秀思想產(chǎn)生時滔金,便可以嘗試引入到自己的領(lǐng)域里色解。又或者我們所處的領(lǐng)域,正遇到一些難題餐茵,答案可能就在別的領(lǐng)域里科阎。可在這方面的練習(xí)忿族,往往都是一些創(chuàng)新性的練習(xí)锣笨。多數(shù)時候,我們的探索可能沒有結(jié)果道批,但是它往往能對自己有更大的啟發(fā)错英。
找到合適的時間練習(xí)
每天能有半小時、一小時甚至更長時間的穩(wěn)定練習(xí)隆豹,比三天打魚兩天曬網(wǎng)的效果要好得多椭岩。清理出一些固定的時間,用于為自己騰出時間來提高自己噪伊。既然簿煌,你都有時間到這篇文章,那么你應(yīng)該屬于能騰出時間的人鉴吹。
如果不能的話姨伟,那么我們也可以嘗試去擠出一些時間,如從上下班去尋找空間豆励。即使是同一公司夺荒,不同的人都有不同的上下班時間,所花費(fèi)在路上的時間也有所不同良蒸。有的人技扼,需要在幾環(huán)外坐個一個多小時的地鐵,再轉(zhuǎn)公交才能到公司嫩痰;有的人剿吻,只需要出門左轉(zhuǎn),走個十分鐘就到公司了串纺。因?yàn)樵诼飞匣ㄙM(fèi)的時間不同丽旅,也在一定程度上影響了學(xué)習(xí)椰棘、練習(xí)等等的時間。
因此榄笙,如果可能的話邪狞,應(yīng)該減少花費(fèi)在上班路上的時間,才能避免繼續(xù)陷入這樣一個惡性循環(huán):租不起近的房子茅撞,花費(fèi)大量的時間在路上帆卓,沒有時間提升技能。
早上
早上的練習(xí)米丘,是一種慢慢進(jìn)入一天工作狀態(tài)的感覺剑令。一旦上班時間到來的時候,就已經(jīng)進(jìn)入工作姿態(tài)了——對于“資本家”來說拄查,可謂好事一件尚洽。早晨剛醒來,總會想不起昨天項目做到哪一步靶累,便更容易反思哪里做得有問題腺毫。
如筆者已經(jīng)習(xí)慣了,每天七點(diǎn)起床挣柬、洗漱潮酒,隨后寫會代碼,再去上班邪蛔。有時候急黎,可以有一個半小時的練習(xí)時間,有時候會有半個小時侧到,將這些時間浪費(fèi)在夢里總是有些可惜勃教。同時,之前為了能成功地上公交匠抗,便提前半個小時到公司故源,寫一些開源軟件的代碼。畢竟汞贸,作為一家非產(chǎn)品公司绳军,你無法和別人解釋說,我們做了些什么矢腻、取得了哪些成就门驾。
在很多地方,這是一個很好的策略:錯開高峰期上下班多柑,路上就不容易堵車奶是。所花在路上的時間就縮短了,那么我們就有時間來練習(xí)了。
需要注意的是:練習(xí)的時候不要關(guān)注時間聂沙,而是關(guān)注怎么于提高腐魂。關(guān)鍵點(diǎn)在于:讓每天進(jìn)步一點(diǎn)。
中午
吃完飯后逐纬,因?yàn)槊罪堁侵笖?shù)高的緣故,容易犯困削樊。對于北方的同學(xué)來說豁生,因?yàn)橹魇巢皇敲罪垼赃@就不算是一個問題了漫贞。這個時候甸箱,身體會妨礙我們進(jìn)行一些練習(xí)⊙钙辏可如果你的午休時間比較長芍殖,那么也可以做一些練習(xí),再去休息片刻谴蔑。
碎片時間
對著屏幕寫代碼豌骏,時間一久,集中力就會開始渙散隐锭,便應(yīng)該休息會兒窃躲。刷刷資訊、朋友圈钦睡,又或者收集各種資料蒂窒,開放我們的視野。接收各種新的知識荞怒,來擴(kuò)大自己的視野洒琢,以便于自己了解整個市場的水平。
常見的方式有:
閱讀個人博客褐桌、微信公眾號衰抑。
維護(hù)自己的 Awesome 列表——尋找自己覺得好的開源項目。
IT新聞荧嵌、技術(shù)文章聚合網(wǎng)站——我很不喜歡聚合網(wǎng)站停士,大部分的聚合站點(diǎn)的行為無異于文章抄襲。
GitHub Trending完丽。
將這些內(nèi)容存儲到 Evernote恋技、WunderList、OneNote 等各式各樣的云筆記里逻族,然后定期清理蜻底、定期清理、定期清理。收集只是一種方式——沒有啥用的方式薄辅,因此建議先讀完一遍要拂,再去收藏這樣的文章。多數(shù)時候站楚,我們會發(fā)現(xiàn)自己收藏了很多的內(nèi)容脱惰、買了很多的書,但是卻沒有時間去讀窿春。
晚上
經(jīng)歷了漫長的加班拉一,回到住的地方,可能就會想休息了旧乞。如果白天沒時間練習(xí)蔚润,晚上也不能抽出時間練習(xí),長期以往尺栖,一年的工作經(jīng)驗(yàn)就要變成五年來用了嫡纠。
晚上練習(xí)的同時,我們應(yīng)該注意:在睡覺前 30~60 分鐘停止編碼延赌,否則上床的時候除盏,腦子里可能還是這些代碼,就容易失眠挫以。萬一靈感一來痴颊,那就還要爬起來繼續(xù)寫。這個時候屡贺,可以閱讀一些相關(guān)或者無關(guān)的書籍蠢棱、資料。在閱讀的過程中甩栈,盡管我們已經(jīng)不在思考內(nèi)容泻仙。但是潛意識里還在思考中,這時就能很容易就會遇到一些靈感量没。
最后玉转,休息的時候,盡情睡覺吧~殴蹄。
怎樣才能持之以恒下去
在上文里究抓,我們只談?wù)撘恍┓椒ê图记桑墒撬鼈儾]有什么用袭灯。每個人都知道所謂的『一萬小時理論』刺下,但是真正要堅持下來,并沒有我們想象中的那么容易稽荧。
我們需要從娛樂時間里抽到一部分橘茉,原本舒適的玩游戲、睡覺、刷微博時間畅卓,現(xiàn)在要成為另外一種『痛苦』擅腰?可是,既然這些“無聊的事情”我們都能上癮翁潘,那么我們是不是沒有找到合適的路趁冈?
設(shè)定目標(biāo)與 SMART 原則
按上文中的分法,練習(xí)可以分為:日常固定時間的練習(xí)拜马,及針對某一特定主題的練習(xí)等多種類型渗勘。當(dāng)我們開始練習(xí)某一個具體的技術(shù)、框架一膨、模式時,最好能制定一個簡單的練習(xí)計劃洒沦,如每幾天練習(xí)某一內(nèi)容豹绪、多少天內(nèi)用某一個框架實(shí)現(xiàn)什么功能。
先設(shè)計一個小的目標(biāo)申眼,并且能在短期實(shí)現(xiàn)瞒津。當(dāng)發(fā)現(xiàn)自己可以輕松地堅持下來時,再慢慢的擴(kuò)大目標(biāo)括尸,直至我們能做得更好巷蚪。可是濒翻,設(shè)定一個練習(xí)目標(biāo)也不是一件簡單的事屁柏,它也有很多考量的地方。
畢業(yè)的時候有送,在公司接受了針對于畢業(yè)生的培訓(xùn)淌喻,期間學(xué)習(xí)到了一個用于制定任務(wù)、目標(biāo)的 SMART 原則:
具體的(Specific)雀摘。即我們要有一個明確的目標(biāo)裸删,如在一周內(nèi)用 Django 寫一個博客系統(tǒng),而不是用 Django 寫個東西阵赠。
可度量的(Measurable)涯塔。即衡量是否達(dá)成目標(biāo),我們只需要能創(chuàng)建清蚀、查看匕荸、刪除博客,那么我們就算完成了這樣的任務(wù)枷邪。它可以用來不斷地突破自己每聪。
可實(shí)現(xiàn)性(Attainable)。即這個目標(biāo)一定是可以實(shí)現(xiàn)的,不能實(shí)現(xiàn)的目標(biāo)沒有啥意義药薯。與些同時绑洛,練習(xí)初期定下的目標(biāo)不能困難。
相關(guān)性(Relevant)童本。即目標(biāo)與其他目標(biāo)的關(guān)聯(lián)情況真屯,如我們練習(xí) Django 是為了提高 Django 或者后臺的技能。如果我們的大目標(biāo)是提高前端技能穷娱,那么這個目標(biāo)對于當(dāng)前的意義并不是太大绑蔫。
時限(Time-based)。即時間限制泵额,如上面提到的一周內(nèi)用 Django 寫一個博客系統(tǒng)的期限配深。
經(jīng)常能在微信朋友圈看到,朋友的 100 天英語閱讀計劃嫁盲,這樣的目標(biāo)就是合理的——可實(shí)現(xiàn)的篓叶、具體的、有時間限制羞秤、可度量的缸托。
如果我們想每天固定時間進(jìn)行練習(xí),那么我們應(yīng)該做一個短暫的嘗試瘾蛋,如七天俐镐,再慢慢的不斷擴(kuò)大時間目標(biāo),二十一天哺哼、兩個月佩抹,隨后再擴(kuò)大到一個更大的目標(biāo)。
堅持與激勵自己
我們可以使用 GitHub 上的 Contributions 來激勵自己取董,每一天的痕跡都很明顯匹摇,甚至于可以拉攏一些小伙伴,與我們一起參加類似的活動甲葬。GitHub 本身具有社交屬性廊勃,可以讓我們看到別人做了什么,做了多久经窖。
由于 GitHub 的服務(wù)器在國外坡垫,訪問的時候可能會受限于網(wǎng)絡(luò)。國內(nèi)的開源中國的碼云和 Coding 也有類似的活躍度画侣,建議訪問 GitHub 有問題的讀者冰悠,可以使用這些服務(wù)。
上文中提到的朋友圈 100 天英語閱讀計劃配乱,也是相似的溉卓,它可以讓別人監(jiān)督你是否完成——前提是皮迟,有人一起和你做相同的事,因此可以找個人和你一起練習(xí)桑寨,相互監(jiān)督伏尼。
剛開始練習(xí)的時候,練習(xí)的內(nèi)容基本上很充實(shí)尉尾。時間一長爆阶,可能就會陷入一些瓶頸:要么找不到合適的練習(xí)內(nèi)容,要么覺得練習(xí)過于乏味沙咏。因此這個時候辨图,可以切換不同類型的練習(xí)項目——如,做一些自己覺得有意思的小項目練習(xí)肢藐。又或者故河,當(dāng)我們完成一個目標(biāo)時,給自己一些獎勵吆豹,以此來鼓舞自己鱼的。
總結(jié)
練習(xí)完之后,還有一種很好的提高方式瞻讽,就是輸出鸳吸、總結(jié)熏挎。整理自己練習(xí)過程中學(xué)到的知識速勇,將之與我們需要的技能做對比,我們就會發(fā)現(xiàn):在哪些地方還需要提高坎拐。我們就能制作出下一次練習(xí)的目標(biāo)烦磁,不斷地反復(fù),以些來提高自己哼勇。