林老師在群里給大家布置了一個學習任務,為過一段時間的實戰(zhàn)項目做準備。
任務是這樣的:
前臺用 react + redux,后臺用 jersey + mybatis + mysql 寫一個 todolist,可以對 todo 進行查看,刪除,新增的功能
作為一個剛剛參加完ThoughtWorks暑期訓練營的同學,我應該怎么來完成這個任務呢?
首先看一下兩天之后部分同學的進展:
”我準備今天才開始,準備跟某茹同學一起合作學習。還是以前那種5w1h,然后分享,一天最多兩個技術吧,這樣想的。想著先搞懂基, 然后結(jié)合寫demo。“
”我是昨天開始學習的林老師任務。昨天主要學了mySQL,基本知識點差不多了,還沒寫demo練習,打算從今天開始和某秀同學結(jié)對學習java的相關東西。jersey + mybatis 我們暫定時間是一個星期,然后開始寫todolist“
”老師,我前幾天了解了一下docker和selenium,昨天看了jersey 后期準備和某紅同學結(jié)對學習mytalis和mysql以及復習java的知識。暫定用一周來了解這些技術棧。“
看到同學們已經(jīng)開始了,有了一個粗略的計劃,并且沒有忘記我們在訓練營中學到的”合作學習“、”5w1h“、”分享“、”先寫Demo“等方法,我覺得非常開心,你們很棒!只是我有些擔心同學們的意愿是好的,但是在如何把它想得更細,并劃分成可以有效執(zhí)行的任務時,會遇到困難。
所以我在這里想聊一下,如果我接到了這個學習任務,我應該做什么以及怎么做。同學們在閱讀的過程中,可以回想一下我們在訓練營里所教授的東西,結(jié)合起來,希望在下一次遇到類似的任務時,也能按類似的方法給自己定出一個詳細的學習計劃。
先在前面說一下我的套路:
明確需求 -> 分解問題 -> 各個擊破 -> 總結(jié)分享 -> 小步快跑,不斷循環(huán)
明確這個學習任務的需求
當林老師告訴我們這個學習任務時,我們需要問自己(以及林老師)這幾個問題:
- 老師為什么要給我們布置這個學習任務?
- 通過這個任務,我們要鍛煉哪些軟硬技能?
- 我們應該在什么時間前完成?
- 我們應該學到什么程度?
- 我們應該使用什么樣的合作方式?自學,結(jié)對,還是建立一個學習小組?
- 這些學習任務中,哪些是最重要的,必須掌握的,哪些可以延遲?
- 這看起來是一個比較大的任務,我怎么對它進行拆分?
- 我怎么知道我掌握了?比如每個小任務應該有什么輸出?
- 我最近有什么其它的事情要忙,怎么安排我的時間與精力?
這些問題大家都清楚了嗎?至少有一些,我是不太清楚的(比如時間等),等林老師方便的時候問下他。
明確TodoList的需求
回顧一下林老師的任務:
前臺用 react + redux,后臺用 jersey + mybatis + mysql 寫一個 todolist,可以對 todo 進行查看,刪除,新增的功能
可以看到這里分為兩個部分,一是”技術需求“,另一個是”功能需求“。
技術需求就是我們要學習的,可以稍后再看,我們先看一下功能需求:
寫一個 todolist,可以對 todo 進行查看,刪除,新增的功能
這個描述還是不太清楚的,不過我們其實還有一些背景信息的:之前我們在課堂上應該了解過這個著名的http://todomvc.com,所以我覺得這里說的就是上面的例子。如果不太確定,我們可以先看看,然后再問問林老師。
隨便找了個例子(比如http://todomvc.com/examples/angularjs/),看了一下它的demo,實際操作了一下,看看我們要做成什么樣子。
這里先放個圖:

我們可以在上面試試新增、刪除、標記為完成、修改等功能,另外要注意底部左邊的"n items left"的數(shù)字會變動,底部右邊幾個按鈕還可以點擊。
這時我可以把這個網(wǎng)址發(fā)給林老師,問問我們是不是要做成這個樣子,底部那些按鈕需不需要做。當然,我覺得林老師的回答肯定是,你能做就做,做不完就算了。。。
明確技術需求
然后我們再看看技術需求:
前臺用 react + redux,后臺用 jersey + mybatis + mysql
這里列出了主要的技術點,看起來不多,但是想一想,發(fā)現(xiàn)后面其實還有很多的隱藏信息:
- 我們的暑期訓練營上剛剛培訓完,當初教的各種實踐和方法都要用上吧:分解任務,提問,畫圖,限時,Demo預研,等等
- 語言沒有提(JavaScript和Java),這假設我們已經(jīng)掌握了足夠的基礎知識。真的嗎?
- 項目實踐:構(gòu)建工具,IDE使用,git+github,測試,結(jié)對,合作
- 這是一個學習任務,所以還有:自學能力的鍛煉,規(guī)劃與總結(jié),分享
這樣一想,似乎東西還不少啊。怎么辦?我到底需要學哪些東西?。?/p>
明確技術點
我們可以先把前面的技術需求再明確一些,只有再精細一些,我們才知道到底需要學習哪些東西。
這里,我把它們分為了”前端,后端,數(shù)據(jù)庫,工具,其它“五個方面。
前端
- 語言:ES6 / HTML / CSS
- 包管理工具:npm
- 構(gòu)建工具:gulp
- 資源打包工具:webpack,及相應的插件Babel
- 測試框架:Mocha(推薦)或者Jasmine, nock, supertest
- 前端框架:react, react-router, redux
- AJAX庫:superagent
- CSS框架:bootstrap,或者react-bootstrap
- 可能用到的庫:lodash, async
后端
- 語言:Java 8
- 構(gòu)建工具: Gradle(推薦)或者Maven
- Rest庫:jersey
- 應用框架:spring, spring boot
- 操作數(shù)據(jù)庫:mybatis
- 測試框架:JUnit, AssertJ, NestedRunner
- JSON庫:fastjson
- 數(shù)據(jù)庫遷移工具:flyway
數(shù)據(jù)庫
- mysql
- 圖形管理工具:自行尋找
工具
- IDE:Webstorm, IntelliJ IDEA社區(qū)版
- 版本控制工具:git, github, hub
- CI: travis-ci
- 博客:簡書, markdown
- 博客客戶端:inoreader(http://jianshu.milkythinking.com/)
- 效率:IDE快捷鍵,Linux命令行
- http api客戶端:如postman,httppie, curl
其它
- http協(xié)議,比如各種http code
- Restful架構(gòu)
天啊,怎么會這么多,我是不是想多了?當然,同學們可能一開始是想不到這么多的,但是隨著項目進行,你會發(fā)現(xiàn),到最后可能會比這還多。。。
那么有兩個問題:
- 這些我們都需要在這個任務中學嗎?
- 我們有沒有辦法合作學習?
關于第一個問題,大家留意一下上面加粗的技術點,就屬于特別重要、必須掌握的,其它的可以參考已有代碼或者根據(jù)自己的情況來定(或者分工,一人學一些,然后分享給其他人)
關于第二個問題,我們需要找到組織。
找到組織
我們有十幾位同學都在做相同的學習任務,我們能不能成立一個或者多個學習小組?我們已經(jīng)有:
- 微信群(不公開)
- github組織:https://github.com/organizations/twa-2016-todolist (各位同學快發(fā)過來你們的github帳號)
- 論壇:Todolist學習任務討論區(qū) 有問題在論壇上討論啊,老師們會一直盯著(為了防止惡意注冊,目前實行邀請制,大家把郵箱發(fā)給我)
當然,如果你們有自己的學習小組,也可以建立自己的github組織或者項目。
找個學習的小伙伴
有了組織,但是一個人學習還是太孤單,找一個小伙伴吧。兩個人平時可以一起學習、討論、寫代碼。
對于這個任務來說,找一個離自己近的,聊得來的,經(jīng)常能坐在一起交流的同學更合適一些。
準備博客
在學習的過程中,大家都需要通過寫博客來記錄和分享自己所學。由于大家在學差不多的東西,所以可以互相關注,及時看到別人的成果,節(jié)省自己踩坑和卡住的時間。
有些同學在csdn或者cnblogs等地方有自己的博客,我推薦大家使用簡書,界面漂亮,寫作體驗非常好,能讓人愛上寫作。里面還可以使用markdown語法,寫起來非常方便,另外還可以自動保存,歷史版本比較,最贊的是可以發(fā)布的朋友圈讓人打賞!說不定你寫的東西解決了某個同學的問題,他一高興打賞你十塊八塊的。
(插播:本文求打賞:)
然后每個人都有了博客,怎么才能最快的知道別人寫了什么新博客呢?推薦使用一個叫inoreader的RSS訂閱服務,它在安卓和蘋果下都有客戶端,比較好用。把同學的博客地址貼上去,就可以訂閱了。一旦有新文章,就可以第一時間看到。
這里需要注意的是,簡書并沒有提供rss服務,不過我們可以使用簡書RSS生成器,把簡書上的用戶地址貼上去,如果正確的話,就能生成相應的RSS鏈接,貼到inoreader里就可以啦。
現(xiàn)在知道老師為什么能第一時間知道同學們寫了什么新博客嗎?

建議大家像老師一樣,把大家的博客(甚至我們的BBS)都訂閱上,需要鏈接的可以找老師,到時候把種子文件導入一下就行了,非常簡單。
Markdown
大家寫博客肯定需要貼一大堆代碼,還有各種標題、列表等等,使用普通的富文本編輯器,又麻煩又難控制,最終的效果通常也不怎么好看。
這時我們就可以花半個小時學習一下markdown,就可以高效的寫出漂亮的博客了!而且這種語法在github/stackoverflow等各種地方都可以使用,受益終生啊。
需要注意的是,markdown有很多增強版,我們通常使用的是github的版本,參看這里:https://guides.github.com/features/mastering-markdown/
你也可以試試在線的markdown編輯器,可以實時看到效果,方便學習,比如:https://stackedit.io/
IntelliJ IDEA也提供了markdown插件,常用的編輯器如Sublime Text, atom也都有Markdown插件。
分解任務,制定計劃
前面我們明確了技術點,但真正動手的時候,我們還需要對它們進行進一步的細化,制定出可執(zhí)行、可驗證的更小的任務,才能動手做。在這個過程中,我們往往會發(fā)現(xiàn)一些事前沒有考慮到的問題,產(chǎn)生更多的小任務。
這里需要注意兩點:
最終的每一個小任務都是應該能在半天左右完成(熟練后一到兩個小時內(nèi))。這樣可以讓我們在同一時刻需要關注的事情更少,并且能利用好每天的碎片時間,及時完成,及時分享,每天都能感覺到進步。
每個任務必須有輸出,輸出形式可以根據(jù)任務類型來定,比如圖形、博客、代碼、視頻、分享、甚至教給別人等等
概念探索類的小任務
當我們第一次看到一個名詞,對它一無所知,或者僅僅是聽說過而已,我們應該怎么辦?
不要慌張,也不要隨便找了一篇文章或者一本書就從第一頁一直讀下去,而且要圍繞著這個東西,問一些問題等等:
- 它是什么?
- 它能做什么?
- 它怎么來的?
- 它有什么重要概念?
先對這些最基本的問題做一定程度的發(fā)散,搜索資料(請使用google)獲得一些信息,同時還會得到一些新的問題,然后再做發(fā)散,直到感覺那些問題或者答案跟我目前想學習的東西關系不大時,就可以及時停止,然后再針對最核心的概念與知識進行深入學習。
這里以webpack為例,看小波老師是怎么學習的。首先小波老師提出了一堆最基礎的問題:

然后找到了它們的答案:

同時又引出了新的問題:

以及新問題的答案:

我們可以看到,其中有的問題很早就結(jié)束了,比如“什么時候出現(xiàn)的?”,這可能是因為其答案并不容易搜到,但由于不是很重要,所以就算了。
其它的問題或者答案也可以根據(jù)我們的興趣、精力,以及它與我們當前學習目標的緊密程度,我們來決定是否繼續(xù)追問下去。
比如,這里是小波老師的最終版本:

當我們畫完上面這個圖時,我們對于webpack在宏觀上就已經(jīng)有相當程度的了解了,足以支持我們當成當前的學習任務(甚至都可以做個分享出來)。然后我們就可以深入到內(nèi)部,去研究它的核心概念和方法(一般在文檔中都會重點提到),畫出一個“概念關系圖”。
這里以redux為例(因為redux是必學,并且概念很多),給出相應的“概念關系圖”:

從圖中我們可以看出,里面是真實的類或者方法的名字,通過連線表示出來它們之間的相互關系,通過數(shù)字來表示它們之間的調(diào)用順序。
對于我們要研究的東西,相信只要我們能畫出這兩張圖,我們對它的理解就達到很好的程度,后面再結(jié)合Demo預研,相信很快就可以掌握。對于jersey, mybatis,甚至mysql,我想大家都可以用上這種方法。
另外,在提問、尋找答案、畫圖的過程中,建議大家和自己的小伙伴一起,這樣效率更高,效果更好。
對于這類小任務,我們的輸出通常是這些:
- 自學提問圖
- 概念關系圖
- 相應的博客
功能驗證類的小任務
當我們經(jīng)歷了前面的畫圖探索之后,雖然我們對它的整體情況有了一定程度的了解,但是我們還沒有用真實可執(zhí)行的代碼來驗證,這時我們再細分出一些demo預研的小任務。
這些小任務通常要比較小,從簡單到復雜,每個小任務只完成一個功能集中且相對簡單的任務(比如可以在一到兩個小時內(nèi)完整實現(xiàn))。我們會創(chuàng)建一個新的目錄,從零開始,創(chuàng)建一個獨立、完整、僅包含要驗證功能的最小代碼的一個項目,然后把它push到github上,僅自己使用或者分享給同學。
代碼中除了必要的代碼外,還需要有一個README文件,里面用簡潔的方式說明這個項目是做什么的,怎樣配置和運行,有什么注意的地方,以及相關的資料鏈接等。分享給別人后,別人應該不需要再來問你,就可以自己運行起來。
在這個過程中,需要特別強調(diào)的幾點:
項目命名非常重要,請盡量使用能夠突出主要目的的關鍵字。比如我想寫一個最簡單的react項目,那么名字可能是
react-hello-world-demo;如果想演示state的使用,那么是react-state-demo;如果想強調(diào)使用的是ES6中的class,那么可以是react-es6-class-hello-world-demo。當我們小項目越來越多時,你會覺得這些命名實在太重要了。每個項目要完成的功能一定要單一。不論是自己以后使用,還是分享給別人,如果項目中混合了多個功能,基本上就沒法使用,因為別人很難區(qū)分項目到底哪些代碼是為這個功能,哪些是為那個功能,它們之間有沒有聯(lián)系??梢远嘟ㄒ恍╉椖浚遣灰旌显谝黄?。
-
README一定要有,但要簡潔。我們不必假設使用這個項目的是一個完全不了解它的小白,而應該是有一定經(jīng)驗的開發(fā)人員。這樣,readme中可能給出一些關鍵的命令,以及一些需要的注意的點,必要的時候再加一些擴展閱讀的鏈接即可。比如:
readme示例 依賴的版本號要明確。比如
package.json中,最好使用固定的版本號,比如"react": "15.3.0",而不要使用默認的"react": "^15.3.0"。這是因為在js的世界里,依賴庫的升級非常容易導致不兼容的現(xiàn)象,而當我們在一個比較久的時間之后來運行這些代碼,很可能因為太多的庫有新版本而導致程序出錯。當我們的demo項目越來越多后,為了方便對它們進行分類,我們可以在github上創(chuàng)建一些組織(orgnization),用于存放不同語言的Demo。
如果你不知道怎么做,就到看看老師的demo,找找感覺。我把我的兩個demo orgnization放在上里,你會在上面發(fā)現(xiàn)很多有用的demo:
- https://github.com/js-demos (當前超過100個demo)
- https://github.com/java-demos (當前超過20個demo)


(注意,剛才我在查看的過程中,發(fā)現(xiàn)不少項目的README上的名字或者內(nèi)容有錯誤,歡迎同學們指出。這是因為我創(chuàng)建了一些最基本的demo項目,然后在做新的demo時copy它們導致的)
對于這種類型的任務,我們的輸出通常是一個github上的demo(可分享給其他同學),以及,如果過程中我們遇到了坑或者有意思的東西,可以寫一篇博客分享出來。
細分小任務
前方高能。
對于前面提到的技術點,讓我們對它們細分吧!
前端
- 常用ES6語法(比如class, map/reduce/filter等)
- 使用webpack+babel來支持es6完整語法(如import/export)
- 使用React在頁面上輸出"Hello world"
- 使用React在頁面上創(chuàng)建嵌套的兩個組件
- 使用react-router來切換兩個內(nèi)容塊
- 使用CSS或者Bootstrap來進行布局
- 使用React state的簡單例子
- 純Redux(不使用react)的簡單的”點擊按鈕數(shù)字加1“
- Redux + react簡單的”點擊按鈕數(shù)字加1“
- 使用superagent向后臺發(fā)AJAX請求
- 使用mocha運行最簡單的測試
- 在測試中使用nock模擬http服務器
- express例子(方便寫服務器端來配合前端)
- 使用gulp來運行webpack打包
- 使用gulp運行測試
后端
- 在IDEA中成功運行一個Java程序,輸出"Hello World",使用1.6的語法
- 在IDEA中寫一個最簡單的JUnit測試,使用JUnit提供的
assertEquals - 在IDEA中寫一個最簡單的JUnit測試,使用assertj
- 使用gradle/maven來運行一個最簡單的hello world程序
- 使用gradle/maven來運行一個最簡單的測試
- 使用gradle/maven來運行一個有多個第三方依賴庫的程序
- 使用jersey建立一個最簡單的api,返回hello world即可
- 使用spring運行一個hello world,要使用到它的依賴注入功能
- 使用spring boot創(chuàng)建一個最簡單的例子
- 使用mybatis來連接mysql數(shù)據(jù),執(zhí)行最簡單的增刪改查功能
- 使用fastjson進行對象與字符串之間的轉(zhuǎn)換
數(shù)據(jù)庫
- 在Linux下安裝和啟動mysql數(shù)據(jù)庫
- 在Linux命令行下進行常見的數(shù)據(jù)操作
- 通過命令行對數(shù)據(jù)庫進行備份
- 安裝mysql桌面管理工具
- 在mysql桌面管理工具中操作數(shù)據(jù)庫
- 結(jié)合實例使用常用的SQL語句
工具
- 使用Webstorm進行Javascript項目開發(fā)的常用技巧
- 使用IntelliJ IDEA進行Java項目開發(fā)的常用技巧
- 如何把一個簡單Javascript項目部署到Travis-CI上
- 如何把一個簡單Java項目部署到Travis-CI上
- 如何把一個使用了mysql數(shù)據(jù)庫的Java項目部署到Travis-CI上
- 簡書有什么功能,如何切換成markdown,如何生成rss
- Markdown的常用標簽總結(jié)和示例
- inoreader介紹與使用
- postman的常用操作
- httppie的常用操作
其它
- 如何理解http協(xié)議
- 常用的http code介紹
- 對Restful的理解
上面的這些任務是我拍腦袋想出來的,可能并不全,以后會根據(jù)大家實際遇到的情況進行添加和修改。當然你也可以根據(jù)自己的情況,創(chuàng)建不同的小任務,這里僅供參考。
對于這里的每個小任務,大家可以根據(jù)自己的情況,來決定輸出是什么。只需要記住最重要的一點:你的輸出一定是可以分享給其他人的東西。
如何完成一個需要寫代碼的小任務
對于上面需要寫代碼的小任務,我們應該怎么做?
沒錯,你已經(jīng)測到了,就是我們在訓練營中已經(jīng)練習了一遍又一遍的“基于管道圖的任務分解大法”,或者用英文“基于pipeline的tasking大法”。
已經(jīng)不記得的同學,請閱讀下面幾篇文章,這都是仝校長的智慧結(jié)晶:
- 像機器一樣思考(一)—— 宏觀的基礎
- 像機器一樣思考(二)—— 數(shù)據(jù)的細節(jié)
- 像機器一樣思考(三)—— 窮盡就是力量
- 像機器一樣思考(四)—— 一圖抵千言
- 像機器一樣思考(五)—— 第一個應用
- 像機器一樣思考(六) —— 跨應用思考
以及我們核心的做事方式:
同時,大家不要忘了:
- 小步快跑
- 估時編程,反思問題
- Test First
那我什么時候才能開始做Todolist?
前面列出來了這么多的小任務,我應該把它們?nèi)迹ɑ蛘叽蟛糠侄迹┱莆找院蟛砰_始做Todolist嗎?
當然不是,如果這樣的話,不知道要等多久了。。。
正確的做法是,我們需要開兩條線并行前進:
- Todolist線:完成林老師要求的Todolist功能
- 小任務線:分解小任務進行demo預研
我們應該從Todolist線開始,如果我們沒有遇到問題,那就繼續(xù)實現(xiàn)功能;當我們遇到了不會的東西時,離開Todolist線,把剛才遇到的問題抽象成一個或多個簡單的小問題,轉(zhuǎn)到小任務線,把它們實現(xiàn)出來;然后再回到Todolist線,用剛才學到的知識繼續(xù)實現(xiàn)。
如果同學們組成了學習小組,我們就可以互相分享小demo,這樣就可以省掉了很多自己研究的時間,同時也有了人可以討論。
有問題及時提
知識至少分為兩種:
- 信息型的:沒法推理出來,需要搜索或者別人告訴
- 研究型的:可以根據(jù)已有信息推理出來,需要自己花時間去想去嘗試
對于初學者來說,最浪費我們時間的往往都是信息型的知識。比如需要某個功能但是不知道什么庫可以做到,怎么引用它,IDE怎么配置,有什么注意事項,哪里有什么坑,等等,往往一卡就是幾個小時。這時候我們需要做的不是自己悶著頭,不搞定不睡覺,而是及時提問,說不定幾分鐘就搞定了呢?
我們有哪些提問和信息獲取渠道呢?
- stackoverflow
- 你身邊的同學
- 我們專門建立的bbs
- 微信群
- 同學的博客和項目demo
- more ...
比如我可以提前告訴大家一個坑:我創(chuàng)建了一個哪怕非常簡單的gradle項目,下載依賴居然卡幾個小時,把我坑了很久。后來解決了,發(fā)現(xiàn)只要在build.gradle里加上一個jar包倉庫的配置即可。當你遇到了同樣的問題,問我的話,一分鐘就能解決,不問的話,,,哈哈
另外我們在bbs專門創(chuàng)建了To-Do List 學習任務討論版,有問題第一時間上去問啊,老師們都盯著呢。(已經(jīng)把這個bbs加入到我的inoreader閱讀器里了)
學到了東西及時分享
再強調(diào)一下,當你學到了東西,不論是完成了小任務,還是解決了一個問題,一定要花時間把它分享出來。比如寫博客,給同學講,在網(wǎng)上直播寫代碼,或者在實驗室定期組織分享活動,都可以。
也許這會花掉你的一些時間,但是要知道,這在鍛煉你的軟技能:你的思考能力、信息整理能力、寫作能力、表達能力、同理心、公眾演講能力,你的收獲可能會比你寫的那些代碼更大!
及時關注其他同學的輸出
像老師一樣,在手機上安裝一個RSS閱讀器(推薦inoreader),把同學們的博客,github,以及bbs全都加進去,這樣當你沒事的時候,就可以打開看一眼,也許只花10秒種就可以讓你省掉幾個小時。
最后,祝大家能通過這一個簡單的Todolist學習任務,真正學到項目所需要的各種技能。
