比起寫業(yè)務(wù)代碼更不幸的是,,主要工作是修 Bug,,bug,,buG, bUg。
在一家大的公司里,,不同的人總會(huì)有不同的運(yùn)氣:
運(yùn)氣好的人遇上一個(gè)好的項(xiàng)目,,升職加薪,從此就走上了人生的巔峰,。
運(yùn)氣差的人攤上一個(gè)差的項(xiàng)目,,升不了職,少加了薪,,并且還獲得不了技術(shù)成長(zhǎng),。
我剛畢業(yè)那會(huì)兒,所在團(tuán)隊(duì)的主要工作是,,維護(hù)一個(gè)『又老又舊』的系統(tǒng),。比起寫業(yè)務(wù)代碼更不幸的是,我們的主要工作是修 Bug,,bug,buG, bUg,。
那一年多里,,盡管都是維護(hù)舊系統(tǒng)和少量的新需求,我們還是在飛速的成長(zhǎng)~~,。而來源主要是:
組內(nèi)技術(shù)活動(dòng),。
花時(shí)間投入練習(xí)。
假想項(xiàng)目的重構(gòu),。
當(dāng)你在有限的條件下,,還能做出一定的成績(jī),到底還是相當(dāng)有成就感的,。
只修 Bug 是怎樣的一種體驗(yàn)
在這樣的項(xiàng)目里:
工作一個(gè)月時(shí),,你打開 Backlog,,看看需求卡,發(fā)現(xiàn)那張需要三個(gè)人天的卡,,好像會(huì)更有挑戰(zhàn)一些,。
工作兩個(gè)月時(shí):你打開 Backlog,看看需求卡,,發(fā)現(xiàn)完成這卡只是時(shí)間問題,。
工作三個(gè)月時(shí):你打開 Backlog,看看需求卡,,發(fā)現(xiàn)清清楚楚地知道修改哪一行,。
有一天,業(yè)務(wù)人員來了一個(gè)新的需求,。雖然只是加上一個(gè)新的導(dǎo)航,,但是你總會(huì)小開心一會(huì)兒。
可你來到這樣的項(xiàng)目時(shí),,你總會(huì)想著離開,,向自己的 Buddy、PM ,、Sponsor 訴說,。可惜,,你只是一個(gè)畢業(yè)生,,太年輕了。對(duì)于你來說有挑戰(zhàn)性的項(xiàng)目,,不會(huì)考慮要你的,。在你的感覺里,那種『自己是大公司的輪子』的感覺就特別強(qiáng)烈,。多你一個(gè)不多,,少你一個(gè)不少。你走了也不會(huì)影響這個(gè)項(xiàng)目,,畢竟招一個(gè)人來修 bug,,還是蠻輕松的。因此,,這個(gè)項(xiàng)目走了一個(gè)又一個(gè)技術(shù)好的人,,卻也來不了一個(gè)技術(shù)好的人。
時(shí)間一久,,每個(gè)人都充滿了危機(jī)感,。我們總是擔(dān)心:當(dāng)你換到另外一個(gè)項(xiàng)目的時(shí)候,別的項(xiàng)目 PM 會(huì)考慮你么——因?yàn)槟闶莵碜赃@個(gè)沒有挑戰(zhàn)性的項(xiàng)目,。這個(gè)時(shí)候,,你已經(jīng)無路可走了,,你必須去提高你自己。
當(dāng)別人救不了你的時(shí)候,,你只能自救,。當(dāng)別人救不了你們的時(shí)候,你們也只能自救,。幸運(yùn)的是,,我們當(dāng)時(shí)還有足夠的時(shí)間,可以提高項(xiàng)目組的水平,。于是,,我們對(duì)組織了各種的組內(nèi)技術(shù)分享、workshop,、培訓(xùn)等等,。
當(dāng)你有強(qiáng)烈的改變意識(shí)的時(shí)候,那么事件就會(huì)變得很簡(jiǎn)單,。真正可怕的是溫水煮青蛙式的,,而當(dāng)你面對(duì)的是溫水,你總會(huì)不斷嘗試去離開,。
組內(nèi)技術(shù)活動(dòng)
當(dāng)你們項(xiàng)目無聊的時(shí)候,,總會(huì)空余一些時(shí)間。上進(jìn)一點(diǎn),,就會(huì)創(chuàng)造一些學(xué)習(xí)的條件,。有了條件,那么剩下的就是靠人為了,。
于是乎,,我們?cè)诿恐芴羧×藘蓚€(gè)時(shí)間,做一些技術(shù)的事情,。包含了下面的一些內(nèi)容:
技術(shù)分享
workshop,。
kata。
不同的活動(dòng)都有不同的目的,,有的可以提高演講者的技術(shù)能力,,有的則是可以一起提升能力。下面就讓我們?cè)敿?xì)了解一下不同的活動(dòng),。
技術(shù)分享
想必大家都已經(jīng)知道這個(gè)是什么了~~。當(dāng)時(shí)的情況,,大概是我們七個(gè)人里,,每周會(huì)有兩次技術(shù)分享。分享的主題會(huì)比較廣泛:
你最近在玩的技術(shù)棧,。當(dāng)你們所用的項(xiàng)目技術(shù)棧,,比較老舊的時(shí)候,,就想不斷地去嘗試新的技術(shù)。在工作之外,,便會(huì)去玩一些『新鮮』的技術(shù)棧(坑),。它就像是一股清流,即使不能幫你清除舊的污水,,也能讓人們看到一絲希望,。而且除了能提升團(tuán)隊(duì)的視野,還可以將之視為替換現(xiàn)有架構(gòu)的探索,。
項(xiàng)目相關(guān)的技術(shù)及業(yè)務(wù),。在沒有結(jié)對(duì)編程的項(xiàng)目里,共享知識(shí)對(duì)于團(tuán)隊(duì)來說是一個(gè)頭疼的問題,,而技術(shù)分享就是最簡(jiǎn)單的方式,。不過,對(duì)于新人來說,,讓他們做相關(guān)的技術(shù)分享才是最好的方式,。這也視作為我們對(duì)新人的考察:
對(duì)于項(xiàng)目的了解程度
找到缺少的相關(guān)知識(shí)
培養(yǎng)新人的表達(dá)能力
在項(xiàng)目上,這幾乎是每個(gè)新人都會(huì)經(jīng)歷的一個(gè)分享~~,。
特定主題的技術(shù)分享,。即,我們限定好一個(gè)大的主題,,每個(gè)人挑選一個(gè)特定的主題來分享,,它可以人為地提高整個(gè)組在某一領(lǐng)域的水平。當(dāng)時(shí)我們做過 SOLID,、設(shè)計(jì)模式,、前端相關(guān)等特定主題的分享——每個(gè)人挑選設(shè)計(jì)模式中的一個(gè)模式,然后做相關(guān)的技術(shù)分享,。當(dāng)你做分享的時(shí)候,,你對(duì)這模式就比較了解;而別人做分享的時(shí)候,也能引發(fā)你的思考,。由于這些主題之間的相關(guān)性比較強(qiáng),,它可以加深對(duì)這一領(lǐng)域的印象。
其他雜七雜八的內(nèi)容,。過多的技術(shù)分享,,可能會(huì)導(dǎo)致大家精疲力盡,因此就會(huì)有一些技術(shù)之外的分享,。比如,,你喜歡的各種動(dòng)漫啊、知乎上流行的程序員女裝啊等等。
而就效果來說,,技術(shù)分享對(duì)于分享者的能力提升比較大,,聽眾則是知道有這個(gè)東西,啟發(fā)性一般都會(huì)比較少,。如果是針對(duì)于提升能力來說,,應(yīng)該采用 workshop 等方式。
workshop
當(dāng)項(xiàng)目上要采用一個(gè)新的技術(shù)棧時(shí),,僅僅中是一個(gè)技術(shù)分享是不能解決問題的,,你還需要有 workshop 這樣的東西。比如你們將在新的項(xiàng)目里引入 Next.js,,那么這個(gè)時(shí)候就需要有一個(gè) Next.js Workshop,。由組織者來規(guī)劃每一步的內(nèi)容,第一步做什么,,第二步做什么,,等等。參與者則是單獨(dú)或者結(jié)對(duì)的形式,,按照組織者的步驟一步步往下來做相關(guān)的技術(shù)練習(xí),。比如在 workshop 開始前,先 clone 并搭建好基礎(chǔ)代碼(hello, world),。開始的時(shí)候,,便是先實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 header,然后是添加樣式等等,。
也因此在這樣的 workshop 里,,我們不僅可以聽過相關(guān)技術(shù)棧的知識(shí),也能掌握一些相關(guān)技術(shù)棧的具體實(shí)踐,。
kata
一種編程練習(xí)方式,,針對(duì)某個(gè)題目反復(fù)進(jìn)行操練,達(dá)到熟能生巧的目的,。簡(jiǎn)單的來說,,就是你一直練習(xí)某一個(gè)特別的東西,直到你習(xí)慣了,。比如,,對(duì)于 TDD(測(cè)試驅(qū)動(dòng)開發(fā),先寫測(cè)試,,并由測(cè)試驅(qū)動(dòng)出功能) 的練習(xí),。
在平時(shí)工作的時(shí)候,我們不會(huì)總是習(xí)慣于 TDD 的流程:測(cè)試 -> 實(shí)現(xiàn) -> 重構(gòu),。特別是,,當(dāng)你的卡就要被打包到新的 Release 包時(shí),,先實(shí)現(xiàn)總是會(huì)保證交付的。又或者是,,當(dāng)你對(duì)代碼庫(kù)特別熟悉的時(shí)候,你可能兩三分鐘就改完代碼,,然后去喝咖啡,,再回來花個(gè)十幾分鐘寫一個(gè)測(cè)試。而當(dāng)你不熟悉 TDD 的時(shí)候,,你更不會(huì)采用這種方式,,你會(huì)的可能就是 Test First。為了將 TDD 的思維融入你的想法里,, 你就需要大量的這種練習(xí)~~,。
在這個(gè)時(shí)候,我們就需要嚴(yán)格的按照步驟,,一步步往下執(zhí)行,。以便于在將來,我們可以嚴(yán)格的按照這些步驟來執(zhí)行,。
除此,,還有一種方式可以做,只是我們沒有在這個(gè)項(xiàng)目里實(shí)施,。
dojo
dojo,,(日語:道場(chǎng))。在西方世界,,dōjō 一詞主要指的是一個(gè)專門針對(duì)日本武術(shù)的訓(xùn)練場(chǎng)所,。在敏捷團(tuán)隊(duì)里,Dojo 的進(jìn)行方式比較『詭異』,,也比較有意思,。
如果你了解過結(jié)對(duì)編程的話,可能就會(huì)對(duì)兩個(gè)人的結(jié)對(duì)過程比較感興趣,。按我的理解,,結(jié)對(duì)編程存在著三種不同的階段:teaching(引入門),driver-navigator(有經(jīng)驗(yàn)與新手),,結(jié)對(duì)(有經(jīng)驗(yàn)與有經(jīng)驗(yàn)),。即在實(shí)現(xiàn)功能的時(shí)候,兩個(gè)人會(huì)輪流寫測(cè)試和實(shí)現(xiàn)功能——你先寫測(cè)試,,我實(shí)現(xiàn)功能,,然后換角色。而 Dojo 就是一堆人在輪流寫代碼:
即在有限的時(shí)間里,,每個(gè)人上去實(shí)現(xiàn)同一功能的代碼,。
如,,A 實(shí)現(xiàn)了測(cè)試,B 上去實(shí)現(xiàn)業(yè)務(wù),,C 上來重構(gòu),。D 上來看了看,你們寫的代碼都是 xx,,于是 Revert 之前寫的代碼,。可惜 D 的時(shí)間也只有七分鐘,,所以 E 上來 Revert Revert,。。,。
笑~~
花時(shí)間投入練習(xí)
限于之前已經(jīng)有相當(dāng)多的文章,,介紹練習(xí)相關(guān)的技巧,如:
《GitHub連擊500天:讓理想的編程成為習(xí)慣》
《關(guān)于編程,,你的練習(xí)是不是有效的?》
《我的成長(zhǎng)四步曲》
《我并不聰明,,只是多練習(xí)和思考》
假想項(xiàng)目的重構(gòu)
哈哈,如果你覺得你的項(xiàng)目技術(shù)棧老舊,,那么你一定在腦子里使用了 N 種技術(shù)棧,,對(duì)他們進(jìn)行重構(gòu)了。并且當(dāng)你有一些時(shí)間可以分配到上面,,如下班前的一個(gè)小時(shí)時(shí)間,,又或者黑客馬拉松等等。那么,,你一定會(huì)開始去做這樣的事,。
與上面的技術(shù)活動(dòng)相比,這是一個(gè)對(duì)于業(yè)務(wù)(我的意思是,,對(duì)于公司來說)更有價(jià)值,,并且更容易說服別人的方式。
學(xué)習(xí)別的項(xiàng)目的技術(shù)棧,,然后將之應(yīng)用到現(xiàn)有的系統(tǒng)上,。
使用一個(gè)新的技術(shù)棧練習(xí), 以此作為技術(shù)支撐,,在未來替換現(xiàn)有的系統(tǒng),。
由于我們與其他項(xiàng)目大組的業(yè)務(wù)是相似的,并且他們的團(tuán)隊(duì)規(guī)模差不多是我們的 10 倍,。當(dāng)某個(gè)新的應(yīng)用完成后,,我們要做的便是:fork from xx,將改吧改吧,,應(yīng)用到我們現(xiàn)有的模式上,。這個(gè)時(shí)候就有問題了,,一般這些新的項(xiàng)目都會(huì)采用最新的技術(shù)棧。在正式引入項(xiàng)目之前,,我們都是要學(xué)習(xí)這些技能,,并配合業(yè)務(wù)做一些修改。也因此,,我習(xí)慣性的將這種項(xiàng)目視為修改 bug,、bUg、Bug,。
后來,我們突然有機(jī)會(huì)彎道超車了,,我們可以先重構(gòu)某一部分系統(tǒng),。『因?yàn)橐呀?jīng)做好相關(guān)的技術(shù)積累,,并沒有遇上一些太大的問題』,。只是我們實(shí)施一半的時(shí)候,就發(fā)生了一些意外,。后來的后來,,這個(gè)項(xiàng)目“到期結(jié)束”了
現(xiàn)在是 2017 年,當(dāng)你的項(xiàng)目還在使用舊的 jQuery + Backbone,,又或者是 Angular 1.x,。并且你們覺得他們有一些問題,這些問題采用一些新的框架,,如 Angular 2,,又或者是 React 能解決這個(gè)問題的話。這個(gè)時(shí)候,,我們就可以嘗試去學(xué)習(xí)新的技術(shù)棧,,并驗(yàn)證它的可行性。當(dāng)有一天,,你們需要去重構(gòu)現(xiàn)有系統(tǒng)的時(shí)候,,你拿出的直接是一個(gè)可行性的 Demo,而不僅僅是一個(gè)理論上的東西,。
當(dāng)時(shí)我們的項(xiàng)目想替換掉舊的搜索引擎,,我們先是用 Solr 實(shí)現(xiàn)了一遍 DEMO,又用 ElasticSearch 做了一遍 DEMO,。同時(shí),,我們也在計(jì)劃替換應(yīng)用部分的功能,我們先用 React 實(shí)現(xiàn)了一遍 DEMO,,又嘗試用生態(tài)純靜態(tài)的方式玩了一遍,。,。。生命可貴,,可以多玩就多玩一些吧,。
小結(jié)
所以,你是因?yàn)榧影嗄?,還是因?yàn)榧影?,才沒有時(shí)間學(xué)習(xí)?