最近看了一本書,叫做 《The Effective Engineer》,中文名翻譯過來大概就是《高效率工程師》這種吧。收益良多,決定寫一下讀書筆記,因?yàn)闀锩娴?Engineer 大部分指的就是從事開發(fā)的程序員,所以后面我多數(shù)會(huì)用研發(fā),程序員來表示了。
選擇正確的思維模式
關(guān)注高杠桿率事項(xiàng)
阿基米德曾經(jīng)說過『給我一個(gè)支點(diǎn),我能翹起地球』,當(dāng)然,這話他到底說過沒有,我們先不糾結(jié),這里要表述的意思很明確,就是杠桿的力量。對(duì)于高效率來說,可以用如下的公式來表示:
杠桿 = 產(chǎn)生的影響力 / 投入的時(shí)間
作為一個(gè)工程師,要做高效率的事情,自然將事情做到高杠桿率,做法就可能有三種:
- 減少完成這件事情的時(shí)間
- 提升這件事情的影響力
- 切換到另一個(gè)有更高杠桿率的事情上
上面列出來的幾個(gè)方法,已經(jīng)非常的直白容易實(shí)施了,譬如對(duì)于數(shù)據(jù)庫(kù)的優(yōu)化,我們可以這么做:
- 使用更好的工具來定位性能問題,如常用的 perf,VTune 這些,減少定位性能問題的時(shí)間。
- 深刻的理解 workload,知道哪些請(qǐng)求是高頻率的,或者哪些請(qǐng)求是最消耗資源的,解決這些大頭問題。
- 發(fā)現(xiàn)搞不定,讓業(yè)務(wù)去調(diào)整代碼,譬如加個(gè)索引啥的,短期不做無謂的優(yōu)化了。
優(yōu)化學(xué)習(xí)方式
俗話說,活到老,學(xué)到老,我們其實(shí)需要不斷的學(xué)習(xí),不斷去提升精進(jìn)自己。不過要接受這個(gè),首先得讓我們具備成長(zhǎng)型思維。大家應(yīng)該的聽說過固定型思維和成長(zhǎng)型思維,沒有的話可以看看《終身成長(zhǎng)》這本書,大概了解一下??偟膩碚f,就是我們需要構(gòu)建一個(gè)成長(zhǎng)型的思維模式,如何做這個(gè),網(wǎng)上其實(shí)有很多方式,譬如:
- 承認(rèn)并且接受自己的不完美
- 勇敢的面對(duì)挑戰(zhàn),視挑戰(zhàn)為機(jī)會(huì)
- 嘗試不同的學(xué)習(xí)策略
- 。。。。。。
當(dāng)有了成長(zhǎng)型思維之后,下一個(gè)要做的就是投資我們的學(xué)習(xí)率。大家應(yīng)該都聽過復(fù)利,在投資的早期,收益其實(shí)是很低的,但隨著時(shí)間的推移,收益率會(huì)越來越高。其實(shí)學(xué)習(xí)也是類似的情況,所以越早學(xué)習(xí),學(xué)得越多,后面學(xué)習(xí)新的東西就會(huì)越容易。
當(dāng)然,對(duì)于工作的我們來說,最好的做法就是能在工作中學(xué)習(xí),如果我們能加入一個(gè)快速成長(zhǎng)的公司(譬如 PingCAP),你在里面能接觸各種各樣有挑戰(zhàn)的事情,能快速的學(xué)習(xí)成長(zhǎng)。如果一個(gè)公司里面有很多牛人(再一次,譬如 PingCAP),你也可以通過從他們身上學(xué)習(xí)到很多事情,譬如你可以看他們寫的代碼,或者讓他們幫你去 review 你的代碼,或者你的設(shè)計(jì),這些都是能提升自己的方式。
當(dāng)然,在工作之外,其實(shí)也是需要學(xué)習(xí)的,雖然很多人講究生活和工作的平衡,但有時(shí)候,我還是希望大家能在業(yè)余時(shí)間多花時(shí)間來提升自己。我們可以多看幾本書,多學(xué)習(xí)一門新的語言,這些都是能讓我們變成一個(gè)更高效工程師的方式。
習(xí)慣優(yōu)先排序
當(dāng)我們開始關(guān)注高杠桿事情之后,自然會(huì)面對(duì)事情優(yōu)先級(jí)的問題。這方面其實(shí)相關(guān)的書籍也不少,譬如著名的《高效能人士的七個(gè)習(xí)慣》這本書,就把事情分成了四象限:
- 象限 1 - 緊急 + 重要
- 象限 2 - 不緊急 + 重要
- 象限 3 - 緊急 + 不重要
- 象限 4 - 不緊急 + 不重要
我們自然要盡量去避免做象限 3 和 4 的事情,但有時(shí)候,我們會(huì)大量的精力去處理象限 1 的事情,但實(shí)際,我們最應(yīng)該放精力的是象限 2,也就是重要不緊急的事情,這樣才能讓我們長(zhǎng)期成長(zhǎng)。
另外,在做事情的時(shí)候,我們還會(huì)面臨一個(gè)問題,就是拖延,人都是有惰性的,要戰(zhàn)勝惰性,有一個(gè)簡(jiǎn)單的方法可以試試,這個(gè)就是 if-then,如果我們要進(jìn)行一項(xiàng)任務(wù),可以在它之前設(shè)定一個(gè)場(chǎng)景開關(guān),也就是如果發(fā)生了什么事情,那我就應(yīng)該干這項(xiàng)任務(wù)了。這樣沒準(zhǔn)能戰(zhàn)勝拖延了。
執(zhí)行,執(zhí)行,執(zhí)行
投資迭代速度
只有跑的更快,才能學(xué)習(xí)的更快,在這個(gè)世界上,唯一不變的只有變化。對(duì)于程序員,或者 team,或者公司來說,要讓自己的效率更高,一個(gè)很重要的點(diǎn)就是:『工欲善其事必先利其器』。
工具對(duì)程序員的重要性毋庸置疑,但恰恰很多程序員忽略了工具的重要性,他們疲于開發(fā),總覺得自己寫得多就代表著效率高,但實(shí)際確是在不斷的給自己挖坑。
PingCAP 可以算是一個(gè)非常重視工具的公司,我們相信能自動(dòng)化用工具去解決的,絕對(duì)不依靠人力來弄,這樣才能保證整個(gè)研發(fā)團(tuán)隊(duì)的高效率。譬如,我們研發(fā)了 Chaos 自動(dòng)化測(cè)試平臺(tái),幫我們發(fā)現(xiàn)不少穩(wěn)定性問題,引入了 Fuzzing 工具,來保證 SQL 的 logic 都能正確處理,這些工具很好的保證了我們整個(gè)產(chǎn)品的快速迭代。
那么對(duì)于程序員來說,除了有意識(shí)的要重視起工具,一些簡(jiǎn)單的方法也可以嘗試:
- 更好的熟悉 IDE 的快捷鍵,畢竟打字的速度還是比移動(dòng)鼠標(biāo)快多了
- 學(xué)至少一門高級(jí)的腳本語言,來簡(jiǎn)化自己很多流程化工作。
- 熟悉并且掌握 shell,尤其是數(shù)據(jù)處理,通過 shell 比自己手工來搞方便太多
- 。。。。。。
當(dāng)然,程序員不能只盯著自己的技術(shù),在其他方面,也需要提升,只有全面發(fā)展了,才可以迭代的更快。這里可以看看《軟技能:代碼之外的生存指南》這本書,來學(xué)習(xí)如何提升自己的軟技能。
測(cè)量我們想提升的事項(xiàng)
如果我們要迭代,一個(gè)自然的問題,就是如何衡量我們的迭代是有效的。這里,就可以使用最常用的辦法 - metrics。
大家在做性能優(yōu)化的時(shí)候,通常也會(huì)在一些關(guān)鍵的地方加上 metrics,然后通過 metrics 來衡量?jī)?yōu)化是否有效果,對(duì)于我們自己也是一樣。當(dāng)然,我們要先選對(duì) metrics,畢竟錯(cuò)誤的 metrics 反倒是會(huì)讓我們變得更加不高效,譬如如果我們用每周工作時(shí)長(zhǎng)來衡量一個(gè)程序員的產(chǎn)出,那么最后就會(huì)變成大家為了看起來產(chǎn)出高,而在工作的時(shí)候混日子,拖時(shí)間。要選擇一個(gè)正確的 metrics,通??梢躁P(guān)注以下幾個(gè)指標(biāo):
- 最大影響,就跟優(yōu)化一樣的,我們通常會(huì)首先關(guān)注開銷最大的地方。
- 可執(zhí)行,也就是這些 metrics 的提升真的是因?yàn)槲覀兊呐Χ兓摹?/li>
- 可反應(yīng),這些 metrics 能很直觀對(duì)變化給與正負(fù)反饋。
當(dāng)我們有了計(jì)劃,有了 metrics,自然就可以去執(zhí)行,去實(shí)施,不過需要注意的是在實(shí)施的時(shí)候也需要時(shí)刻知道事情的進(jìn)展,別偏離方向。我們可以使用工具來記錄,譬如對(duì)于我們自己系統(tǒng),可以使用 Prometheus 來保存 metrics,這樣我們就能知道整個(gè)歷史的變化了。
不過最重要的一點(diǎn),就是記錄的數(shù)據(jù)一定要是真是的,錯(cuò)誤的數(shù)據(jù)甚至比沒有數(shù)據(jù)還要糟糕,因?yàn)檫@可能會(huì)讓我們進(jìn)行錯(cuò)誤的決策。
更快,更頻繁的去驗(yàn)證我們的想法
要迭代的更快,一個(gè)必要的事情就是要更快的去驗(yàn)證我們的想法。這里有一個(gè)詞,叫做 MVP - Minimum viable product,也就是最小化的可行產(chǎn)品。我們需要很多小的工作,來收集數(shù)據(jù),從而驗(yàn)證我們的假設(shè)和目標(biāo)。
要對(duì)產(chǎn)品迭代,通常一個(gè)比較好的做法就是進(jìn)行 A/B testing,同時(shí)建立起來完善的反饋循環(huán),讓我們知道每一次決定是不是對(duì)的。
增強(qiáng)我們項(xiàng)目評(píng)估技能
對(duì)于工程師來說,還需要鍛煉的一個(gè)能力就是項(xiàng)目評(píng)估技能,程序員向來喜歡高估自己的能力,低估事情的復(fù)雜度,項(xiàng)目時(shí)間通常預(yù)估不準(zhǔn),導(dǎo)致項(xiàng)目延期。所以我們需要使用更加精確的預(yù)估手段來推進(jìn)項(xiàng)目,下面是一些可行的方案:
- 將項(xiàng)目拆分成更加細(xì)粒度的任務(wù),
- 基于任務(wù)實(shí)際會(huì)耗時(shí)多久來評(píng)估,而不是基于我們或者其他人覺得要花多久時(shí)間
- 基于概率統(tǒng)計(jì)來評(píng)估,而不是基于最好的情況來
- 讓實(shí)際做任務(wù)的人來進(jìn)行評(píng)估
- 使用多種方式來評(píng)估同一個(gè)任務(wù)
- 通過歷史數(shù)據(jù)來驗(yàn)證評(píng)估是否合理
- 使用時(shí)間窗口來限制任務(wù)的時(shí)間
- 允許其他人來質(zhì)疑我們的評(píng)估
最后,無論我們選擇了什么方案,一點(diǎn)需要注意的是,一定要給未知的東西預(yù)留時(shí)間,也就是要給自己留點(diǎn) buffer,隨時(shí)應(yīng)變。
當(dāng)我們?cè)u(píng)估完成時(shí)間之后,需要設(shè)置好清晰的計(jì)劃,以及可衡量的里程碑,讓我們盡量走在正確的道路上。這里幾點(diǎn)要注意:
- 要盡快的減少并且規(guī)避風(fēng)險(xiǎn),甚至需要先把風(fēng)險(xiǎn)最高的事情搞定
- 對(duì)于從頭造輪子,要保持足夠的警覺
- 要懂得項(xiàng)目是跑馬拉松,不要再中途就多次沖刺,保持合理的節(jié)奏,當(dāng)然有時(shí)候稍微提速也是可以的
構(gòu)建長(zhǎng)期價(jià)值
務(wù)實(shí)的平衡品質(zhì)
有時(shí)候,項(xiàng)目的快速發(fā)展跟品質(zhì)是有沖突的,所以這里我們需要好好的平衡兩者的關(guān)系。
首先,我們需要建立 code review 的文化,不允許大家隨意的增加功能,隨意的合并代碼。雖然這個(gè)可能會(huì)影響產(chǎn)品進(jìn)度,但好處不言而喻。在 PingCAP,我們有著嚴(yán)格的 code review 流程,一個(gè)程序員如果要開發(fā)一個(gè)新的功能,他需要提交 RFC,只有 RFC 被通過了,才能進(jìn)行開發(fā),當(dāng)然,他也可以先自己做點(diǎn)原型驗(yàn)證,讓 RFC 更容易被通過。每個(gè) PR,我們至少需要兩個(gè)人 review 并且 approve 才能 merge。
在代碼層面,我們需要鼓勵(lì)抽象,使用抽象來封裝復(fù)雜的邏輯,保證代碼容易學(xué)習(xí),容易使用,容易擴(kuò)展。代碼的測(cè)試一定要跟上,一定要重視自動(dòng)化測(cè)試,這個(gè)很多研發(fā)都不喜歡寫測(cè)試,覺得那是 QA team 的事情,但恰恰研發(fā)是最應(yīng)該懂測(cè)試的。
最小化操作負(fù)擔(dān)
對(duì)于一個(gè)產(chǎn)品來說,易用性是非常關(guān)鍵的,我們一定要保證操作的簡(jiǎn)單,這點(diǎn)其實(shí) TiDB 還有很大的進(jìn)步空間,所以非常歡迎大家加入幫助我們一起來改進(jìn),如果你有任何易用性上面的問題,歡迎聯(lián)系我。
投資整個(gè) team 的成長(zhǎng)
當(dāng)然,除了要關(guān)注產(chǎn)品價(jià)值,整個(gè) team 也是要仔細(xì)考慮的,畢竟得先有人,才能做出來產(chǎn)品。要保證 team 不斷的成長(zhǎng),所以我們需要建立一個(gè)不錯(cuò)的工程師文化,主要包括:
- 不斷的優(yōu)化迭代速度,實(shí)施 MVP
- 自動(dòng)化,自動(dòng)化,自動(dòng)化
- 對(duì)代碼進(jìn)行正確的抽象
- 關(guān)注代碼質(zhì)量,強(qiáng)制 code review
- 建立一個(gè)有尊嚴(yán)的工作環(huán)境
- 培養(yǎng)一個(gè)持續(xù)學(xué)習(xí)的文化,并不斷的完善
- 給自己分配一點(diǎn)做研究的時(shí)間,譬如每周 20% 時(shí)間,或者通過 hackathon
- 。。。。。。
寫在最后
好了,說了這么多,我們一直在聊的是高效,上面只是我的一些對(duì)照書的簡(jiǎn)單總結(jié)。如果你能看到這里,我表示很佩服,因?yàn)楝F(xiàn)在要說重點(diǎn)的東西了。
作為一個(gè)程序員,高效是需要融入到自己骨子里面的,但是,很多同學(xué)一定會(huì)很苦悶到底如何才能變得高效?自然,一個(gè)很簡(jiǎn)單的辦法就是加入一個(gè)高效率的公司。如果一個(gè)公司從上到下都是推崇的高效率工程師文化,待在里面,自然也就能潛移默化的變得高效了。很自豪的說,PingCAP 就是這樣一家公司 :-)
不過,這里我還會(huì)更進(jìn)一步,在 PingCAP 里面,有一只神秘的特種部隊(duì),天生是為高效而生的,它的名字就是 Effective Tool Team,簡(jiǎn)稱 ET Team,沒錯(cuò),這個(gè)就是致敬 E.T. 外星人的。
在 ET team 里面,我們立足于使用最少的資源來解決最大的問題,也就是會(huì)關(guān)注于杠桿的那個(gè)支點(diǎn)。在 ET team,你會(huì):
- 研究不同的測(cè)試技術(shù),譬如 Chaos,F(xiàn)uzzing,Performance regression,來不斷的去提升 TiDB 的質(zhì)量。
- 研究不同的 bot 技術(shù),讓 PingCAP 的整個(gè)工作流自動(dòng)化運(yùn)轉(zhuǎn)。
- 研究各種診斷工具,通過開發(fā) ftrace,bcc,eBPF,perf 等工具來讓整個(gè)系統(tǒng)的運(yùn)轉(zhuǎn)在你的面前了無秘密。你甚至可以去 hack Linux 內(nèi)核。
- 參與到 TiDB 的研發(fā),尤其是涉及到性能,穩(wěn)定性相關(guān)的模塊,你都可以肆意的去貢獻(xiàn),去完善。
- 任何能提升團(tuán)隊(duì)效率的事情
在 ET team,你可以不斷的去突破你的想象力,我們一直相信『天空才是你的極限!』,如果你愿意加入,歡迎聯(lián)系我 tl@pingcap.com。