當我拿到一個前后端實現(xiàn)todolist的學習任務時,我應該怎么做?

林老師在群里給大家布置了一個學習任務,為過一段時間的實戰(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)

明確這個學習任務的需求

當林老師告訴我們這個學習任務時,我們需要問自己(以及林老師)這幾個問題:

  1. 老師為什么要給我們布置這個學習任務?
  2. 通過這個任務,我們要鍛煉哪些軟硬技能?
  3. 我們應該在什么時間前完成?
  4. 我們應該學到什么程度?
  5. 我們應該使用什么樣的合作方式?自學,結(jié)對,還是建立一個學習小組?
  6. 這些學習任務中,哪些是最重要的,必須掌握的,哪些可以延遲?
  7. 這看起來是一個比較大的任務,我怎么對它進行拆分?
  8. 我怎么知道我掌握了?比如每個小任務應該有什么輸出?
  9. 我最近有什么其它的事情要忙,怎么安排我的時間與精力?

這些問題大家都清楚了嗎?至少有一些,我是不太清楚的(比如時間等),等林老師方便的時候問下他。

明確TodoList的需求

回顧一下林老師的任務:

前臺用 react + redux,后臺用 jersey + mybatis + mysql 寫一個 todolist,可以對 todo 進行查看,刪除,新增的功能

可以看到這里分為兩個部分,一是”技術需求“,另一個是”功能需求“。

技術需求就是我們要學習的,可以稍后再看,我們先看一下功能需求:

寫一個 todolist,可以對 todo 進行查看,刪除,新增的功能

這個描述還是不太清楚的,不過我們其實還有一些背景信息的:之前我們在課堂上應該了解過這個著名的http://todomvc.com,所以我覺得這里說的就是上面的例子。如果不太確定,我們可以先看看,然后再問問林老師。

隨便找了個例子(比如http://todomvc.com/examples/angularjs/),看了一下它的demo,實際操作了一下,看看我們要做成什么樣子。

這里先放個圖:

todomvc

我們可以在上面試試新增、刪除、標記為完成、修改等功能,另外要注意底部左邊的"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ù)庫,工具,其它“五個方面。

前端

后端

數(shù)據(jù)庫

  • mysql
  • 圖形管理工具:自行尋找

工具

其它

天啊,怎么會這么多,我是不是想多了?當然,同學們可能一開始是想不到這么多的,但是隨著項目進行,你會發(fā)現(xiàn),到最后可能會比這還多。。。

那么有兩個問題:

  1. 這些我們都需要在這個任務中學嗎?
  2. 我們有沒有辦法合作學習?

關于第一個問題,大家留意一下上面加粗的技術點,就屬于特別重要、必須掌握的,其它的可以參考已有代碼或者根據(jù)自己的情況來定(或者分工,一人學一些,然后分享給其他人)

關于第二個問題,我們需要找到組織。

找到組織

我們有十幾位同學都在做相同的學習任務,我們能不能成立一個或者多個學習小組?我們已經(jīng)有:

當然,如果你們有自己的學習小組,也可以建立自己的github組織或者項目。

找個學習的小伙伴

有了組織,但是一個人學習還是太孤單,找一個小伙伴吧。兩個人平時可以一起學習、討論、寫代碼。

對于這個任務來說,找一個離自己近的,聊得來的,經(jīng)常能坐在一起交流的同學更合適一些。

準備博客

在學習的過程中,大家都需要通過寫博客來記錄和分享自己所學。由于大家在學差不多的東西,所以可以互相關注,及時看到別人的成果,節(jié)省自己踩坑和卡住的時間。

有些同學在csdn或者cnblogs等地方有自己的博客,我推薦大家使用簡書,界面漂亮,寫作體驗非常好,能讓人愛上寫作。里面還可以使用markdown語法,寫起來非常方便,另外還可以自動保存,歷史版本比較,最贊的是可以發(fā)布的朋友圈讓人打賞!說不定你寫的東西解決了某個同學的問題,他一高興打賞你十塊八塊的。

(插播:本文求打賞:)

然后每個人都有了博客,怎么才能最快的知道別人寫了什么新博客呢?推薦使用一個叫inoreader的RSS訂閱服務,它在安卓和蘋果下都有客戶端,比較好用。把同學的博客地址貼上去,就可以訂閱了。一旦有新文章,就可以第一時間看到。

這里需要注意的是,簡書并沒有提供rss服務,不過我們可以使用簡書RSS生成器,把簡書上的用戶地址貼上去,如果正確的話,就能生成相應的RSS鏈接,貼到inoreader里就可以啦。

現(xiàn)在知道老師為什么能第一時間知道同學們寫了什么新博客嗎?

inoreader安卓客戶端

建議大家像老師一樣,把大家的博客(甚至我們的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)生更多的小任務。

這里需要注意兩點:

  1. 最終的每一個小任務都是應該能在半天左右完成(熟練后一到兩個小時內(nèi))。這樣可以讓我們在同一時刻需要關注的事情更少,并且能利用好每天的碎片時間,及時完成,及時分享,每天都能感覺到進步。

  2. 每個任務必須有輸出,輸出形式可以根據(jù)任務類型來定,比如圖形、博客、代碼、視頻、分享、甚至教給別人等等

概念探索類的小任務

當我們第一次看到一個名詞,對它一無所知,或者僅僅是聽說過而已,我們應該怎么辦?

不要慌張,也不要隨便找了一篇文章或者一本書就從第一頁一直讀下去,而且要圍繞著這個東西,問一些問題等等:

  • 它是什么?
  • 它能做什么?
  • 它怎么來的?
  • 它有什么重要概念?

先對這些最基本的問題做一定程度的發(fā)散,搜索資料(請使用google)獲得一些信息,同時還會得到一些新的問題,然后再做發(fā)散,直到感覺那些問題或者答案跟我目前想學習的東西關系不大時,就可以及時停止,然后再針對最核心的概念與知識進行深入學習。

這里以webpack為例,看小波老師是怎么學習的。首先小波老師提出了一堆最基礎的問題:

針對webpack的基礎問題

然后找到了它們的答案:

找到了它們的答案

同時又引出了新的問題:

引出新的問題

以及新問題的答案:

新的答案

我們可以看到,其中有的問題很早就結(jié)束了,比如“什么時候出現(xiàn)的?”,這可能是因為其答案并不容易搜到,但由于不是很重要,所以就算了。

其它的問題或者答案也可以根據(jù)我們的興趣、精力,以及它與我們當前學習目標的緊密程度,我們來決定是否繼續(xù)追問下去。

比如,這里是小波老師的最終版本:

最后的問題

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

這里以redux為例(因為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)的幾點:

  1. 項目命名非常重要,請盡量使用能夠突出主要目的的關鍵字。比如我想寫一個最簡單的react項目,那么名字可能是react-hello-world-demo;如果想演示state的使用,那么是react-state-demo;如果想強調(diào)使用的是ES6中的class,那么可以是react-es6-class-hello-world-demo。當我們小項目越來越多時,你會覺得這些命名實在太重要了。

  2. 每個項目要完成的功能一定要單一。不論是自己以后使用,還是分享給別人,如果項目中混合了多個功能,基本上就沒法使用,因為別人很難區(qū)分項目到底哪些代碼是為這個功能,哪些是為那個功能,它們之間有沒有聯(lián)系??梢远嘟ㄒ恍╉椖浚遣灰旌显谝黄?。

  3. README一定要有,但要簡潔。我們不必假設使用這個項目的是一個完全不了解它的小白,而應該是有一定經(jīng)驗的開發(fā)人員。這樣,readme中可能給出一些關鍵的命令,以及一些需要的注意的點,必要的時候再加一些擴展閱讀的鏈接即可。比如:


    readme示例
  4. 依賴的版本號要明確。比如package.json中,最好使用固定的版本號,比如"react": "15.3.0",而不要使用默認的"react": "^15.3.0"。這是因為在js的世界里,依賴庫的升級非常容易導致不兼容的現(xiàn)象,而當我們在一個比較久的時間之后來運行這些代碼,很可能因為太多的庫有新版本而導致程序出錯。

  5. 當我們的demo項目越來越多后,為了方便對它們進行分類,我們可以在github上創(chuàng)建一些組織(orgnization),用于存放不同語言的Demo。

如果你不知道怎么做,就到看看老師的demo,找找感覺。我把我的兩個demo orgnization放在上里,你會在上面發(fā)現(xiàn)很多有用的demo:

js-demos上的項目
java-demos上的項目

(注意,剛才我在查看的過程中,發(fā)現(xiàn)不少項目的README上的名字或者內(nèi)容有錯誤,歡迎同學們指出。這是因為我創(chuàng)建了一些最基本的demo項目,然后在做新的demo時copy它們導致的)

對于這種類型的任務,我們的輸出通常是一個github上的demo(可分享給其他同學),以及,如果過程中我們遇到了坑或者有意思的東西,可以寫一篇博客分享出來。

細分小任務

前方高能。

對于前面提到的技術點,讓我們對它們細分吧!

前端

  1. 常用ES6語法(比如class, map/reduce/filter等)
  2. 使用webpack+babel來支持es6完整語法(如import/export)
  3. 使用React在頁面上輸出"Hello world"
  4. 使用React在頁面上創(chuàng)建嵌套的兩個組件
  5. 使用react-router來切換兩個內(nèi)容塊
  6. 使用CSS或者Bootstrap來進行布局
  7. 使用React state的簡單例子
  8. 純Redux(不使用react)的簡單的”點擊按鈕數(shù)字加1“
  9. Redux + react簡單的”點擊按鈕數(shù)字加1“
  10. 使用superagent向后臺發(fā)AJAX請求
  11. 使用mocha運行最簡單的測試
  12. 在測試中使用nock模擬http服務器
  13. express例子(方便寫服務器端來配合前端)
  14. 使用gulp來運行webpack打包
  15. 使用gulp運行測試

后端

  1. 在IDEA中成功運行一個Java程序,輸出"Hello World",使用1.6的語法
  2. 在IDEA中寫一個最簡單的JUnit測試,使用JUnit提供的assertEquals
  3. 在IDEA中寫一個最簡單的JUnit測試,使用assertj
  4. 使用gradle/maven來運行一個最簡單的hello world程序
  5. 使用gradle/maven來運行一個最簡單的測試
  6. 使用gradle/maven來運行一個有多個第三方依賴庫的程序
  7. 使用jersey建立一個最簡單的api,返回hello world即可
  8. 使用spring運行一個hello world,要使用到它的依賴注入功能
  9. 使用spring boot創(chuàng)建一個最簡單的例子
  10. 使用mybatis來連接mysql數(shù)據(jù),執(zhí)行最簡單的增刪改查功能
  11. 使用fastjson進行對象與字符串之間的轉(zhuǎn)換

數(shù)據(jù)庫

  1. 在Linux下安裝和啟動mysql數(shù)據(jù)庫
  2. 在Linux命令行下進行常見的數(shù)據(jù)操作
  3. 通過命令行對數(shù)據(jù)庫進行備份
  4. 安裝mysql桌面管理工具
  5. 在mysql桌面管理工具中操作數(shù)據(jù)庫
  6. 結(jié)合實例使用常用的SQL語句

工具

  1. 使用Webstorm進行Javascript項目開發(fā)的常用技巧
  2. 使用IntelliJ IDEA進行Java項目開發(fā)的常用技巧
  3. 如何把一個簡單Javascript項目部署到Travis-CI上
  4. 如何把一個簡單Java項目部署到Travis-CI上
  5. 如何把一個使用了mysql數(shù)據(jù)庫的Java項目部署到Travis-CI上
  6. 簡書有什么功能,如何切換成markdown,如何生成rss
  7. Markdown的常用標簽總結(jié)和示例
  8. inoreader介紹與使用
  9. postman的常用操作
  10. httppie的常用操作

其它

  1. 如何理解http協(xié)議
  2. 常用的http code介紹
  3. 對Restful的理解

上面的這些任務是我拍腦袋想出來的,可能并不全,以后會根據(jù)大家實際遇到的情況進行添加和修改。當然你也可以根據(jù)自己的情況,創(chuàng)建不同的小任務,這里僅供參考。

對于這里的每個小任務,大家可以根據(jù)自己的情況,來決定輸出是什么。只需要記住最重要的一點:你的輸出一定是可以分享給其他人的東西。

如何完成一個需要寫代碼的小任務

對于上面需要寫代碼的小任務,我們應該怎么做?

沒錯,你已經(jīng)測到了,就是我們在訓練營中已經(jīng)練習了一遍又一遍的“基于管道圖的任務分解大法”,或者用英文“基于pipeline的tasking大法”。

已經(jīng)不記得的同學,請閱讀下面幾篇文章,這都是仝校長的智慧結(jié)晶:

以及我們核心的做事方式:

同時,大家不要忘了:

  • 小步快跑
  • 估時編程,反思問題
  • Test First

那我什么時候才能開始做Todolist?

前面列出來了這么多的小任務,我應該把它們?nèi)迹ɑ蛘叽蟛糠侄迹┱莆找院蟛砰_始做Todolist嗎?

當然不是,如果這樣的話,不知道要等多久了。。。

正確的做法是,我們需要開兩條線并行前進:

  1. Todolist線:完成林老師要求的Todolist功能
  2. 小任務線:分解小任務進行demo預研

我們應該從Todolist線開始,如果我們沒有遇到問題,那就繼續(xù)實現(xiàn)功能;當我們遇到了不會的東西時,離開Todolist線,把剛才遇到的問題抽象成一個或多個簡單的小問題,轉(zhuǎn)到小任務線,把它們實現(xiàn)出來;然后再回到Todolist線,用剛才學到的知識繼續(xù)實現(xiàn)。

如果同學們組成了學習小組,我們就可以互相分享小demo,這樣就可以省掉了很多自己研究的時間,同時也有了人可以討論。

有問題及時提

知識至少分為兩種:

  • 信息型的:沒法推理出來,需要搜索或者別人告訴
  • 研究型的:可以根據(jù)已有信息推理出來,需要自己花時間去想去嘗試

對于初學者來說,最浪費我們時間的往往都是信息型的知識。比如需要某個功能但是不知道什么庫可以做到,怎么引用它,IDE怎么配置,有什么注意事項,哪里有什么坑,等等,往往一卡就是幾個小時。這時候我們需要做的不是自己悶著頭,不搞定不睡覺,而是及時提問,說不定幾分鐘就搞定了呢?

我們有哪些提問和信息獲取渠道呢?

  • google
  • 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學習任務,真正學到項目所需要的各種技能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,725評論 25 709
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 15,035評論 4 61
  • 作業(yè) 問題一: 沒有資料庫,讀書口味雜亂。 問題二: 目前想寫一個玄幻小說。 背景是人和妖魔鬼怪生活在一起的世界,...
    水金兔閱讀 381評論 2 3
  • 云云這兩年的進步神速,莊周早就教不了了,就抽空帶著兒子去自己的那位高手朋友那里學習,順便自己也學習下,后來在一次全...
    琴癡1102閱讀 580評論 0 0
  • 世間遺憾事 往往起始于再見二字 而世間幸運事 又往往在于之后真正再見之時 只可惜 遺憾事多 而幸運事少
    哀慕熙榮閱讀 266評論 0 1

友情鏈接更多精彩內(nèi)容