最近看了一本書缎患,叫做 《The Effective Engineer》滞欠,中文名翻譯過來大概就是《高效率工程師》這種吧。收益良多雹洗,決定寫一下讀書筆記,因為書里面的 Engineer 大部分指的就是從事開發(fā)的程序員卧波,所以后面我多數(shù)會用研發(fā)时肿,程序員來表示了。
選擇正確的思維模式
關(guān)注高杠桿率事項
阿基米德曾經(jīng)說過『給我一個支點港粱,我能翹起地球』螃成,當然旦签,這話他到底說過沒有,我們先不糾結(jié)寸宏,這里要表述的意思很明確宁炫,就是杠桿的力量。對于高效率來說氮凝,可以用如下的公式來表示:
杠桿 = 產(chǎn)生的影響力 / 投入的時間
作為一個工程師羔巢,要做高效率的事情,自然將事情做到高杠桿率罩阵,做法就可能有三種:
- 減少完成這件事情的時間
- 提升這件事情的影響力
- 切換到另一個有更高杠桿率的事情上
上面列出來的幾個方法竿秆,已經(jīng)非常的直白容易實施了,譬如對于數(shù)據(jù)庫的優(yōu)化永脓,我們可以這么做:
- 使用更好的工具來定位性能問題袍辞,如常用的 perf,VTune 這些常摧,減少定位性能問題的時間搅吁。
- 深刻的理解 workload,知道哪些請求是高頻率的落午,或者哪些請求是最消耗資源的谎懦,解決這些大頭問題。
- 發(fā)現(xiàn)搞不定溃斋,讓業(yè)務去調(diào)整代碼界拦,譬如加個索引啥的,短期不做無謂的優(yōu)化了梗劫。
優(yōu)化學習方式
俗話說享甸,活到老,學到老梳侨,我們其實需要不斷的學習蛉威,不斷去提升精進自己。不過要接受這個走哺,首先得讓我們具備成長型思維蚯嫌。大家應該的聽說過固定型思維和成長型思維,沒有的話可以看看《終身成長》這本書丙躏,大概了解一下择示。總的來說晒旅,就是我們需要構(gòu)建一個成長型的思維模式栅盲,如何做這個,網(wǎng)上其實有很多方式敢朱,譬如:
- 承認并且接受自己的不完美
- 勇敢的面對挑戰(zhàn)剪菱,視挑戰(zhàn)為機會
- 嘗試不同的學習策略
- 摩瞎。。孝常。旗们。。构灸。
當有了成長型思維之后上渴,下一個要做的就是投資我們的學習率。大家應該都聽過復利喜颁,在投資的早期稠氮,收益其實是很低的,但隨著時間的推移半开,收益率會越來越高隔披。其實學習也是類似的情況,所以越早學習寂拆,學得越多奢米,后面學習新的東西就會越容易。
當然纠永,對于工作的我們來說鬓长,最好的做法就是能在工作中學習,如果我們能加入一個快速成長的公司(譬如 PingCAP)尝江,你在里面能接觸各種各樣有挑戰(zhàn)的事情涉波,能快速的學習成長。如果一個公司里面有很多牛人(再一次炭序,譬如 PingCAP)啤覆,你也可以通過從他們身上學習到很多事情,譬如你可以看他們寫的代碼惭聂,或者讓他們幫你去 review 你的代碼城侧,或者你的設(shè)計,這些都是能提升自己的方式彼妻。
當然,在工作之外豆茫,其實也是需要學習的侨歉,雖然很多人講究生活和工作的平衡,但有時候揩魂,我還是希望大家能在業(yè)余時間多花時間來提升自己幽邓。我們可以多看幾本書,多學習一門新的語言火脉,這些都是能讓我們變成一個更高效工程師的方式牵舵。
習慣優(yōu)先排序
當我們開始關(guān)注高杠桿事情之后柒啤,自然會面對事情優(yōu)先級的問題。這方面其實相關(guān)的書籍也不少畸颅,譬如著名的《高效能人士的七個習慣》這本書担巩,就把事情分成了四象限:
- 象限 1 - 緊急 + 重要
- 象限 2 - 不緊急 + 重要
- 象限 3 - 緊急 + 不重要
- 象限 4 - 不緊急 + 不重要
我們自然要盡量去避免做象限 3 和 4 的事情,但有時候没炒,我們會大量的精力去處理象限 1 的事情涛癌,但實際,我們最應該放精力的是象限 2送火,也就是重要不緊急的事情拳话,這樣才能讓我們長期成長。
另外种吸,在做事情的時候弃衍,我們還會面臨一個問題,就是拖延坚俗,人都是有惰性的镜盯,要戰(zhàn)勝惰性,有一個簡單的方法可以試試坦冠,這個就是 if-then形耗,如果我們要進行一項任務,可以在它之前設(shè)定一個場景開關(guān)辙浑,也就是如果發(fā)生了什么事情激涤,那我就應該干這項任務了。這樣沒準能戰(zhàn)勝拖延了判呕。
執(zhí)行倦踢,執(zhí)行,執(zhí)行
投資迭代速度
只有跑的更快侠草,才能學習的更快辱挥,在這個世界上,唯一不變的只有變化边涕。對于程序員晤碘,或者 team,或者公司來說功蜓,要讓自己的效率更高园爷,一個很重要的點就是:『工欲善其事必先利其器』。
工具對程序員的重要性毋庸置疑式撼,但恰恰很多程序員忽略了工具的重要性童社,他們疲于開發(fā),總覺得自己寫得多就代表著效率高著隆,但實際確是在不斷的給自己挖坑扰楼。
PingCAP 可以算是一個非常重視工具的公司呀癣,我們相信能自動化用工具去解決的,絕對不依靠人力來弄弦赖,這樣才能保證整個研發(fā)團隊的高效率项栏。譬如,我們研發(fā)了 Chaos 自動化測試平臺腾节,幫我們發(fā)現(xiàn)不少穩(wěn)定性問題忘嫉,引入了 Fuzzing 工具,來保證 SQL 的 logic 都能正確處理案腺,這些工具很好的保證了我們整個產(chǎn)品的快速迭代庆冕。
那么對于程序員來說,除了有意識的要重視起工具劈榨,一些簡單的方法也可以嘗試:
- 更好的熟悉 IDE 的快捷鍵访递,畢竟打字的速度還是比移動鼠標快多了
- 學至少一門高級的腳本語言,來簡化自己很多流程化工作同辣。
- 熟悉并且掌握 shell拷姿,尤其是數(shù)據(jù)處理,通過 shell 比自己手工來搞方便太多
- 旱函。响巢。。棒妨。踪古。。
當然券腔,程序員不能只盯著自己的技術(shù)伏穆,在其他方面,也需要提升纷纫,只有全面發(fā)展了枕扫,才可以迭代的更快。這里可以看看《軟技能:代碼之外的生存指南》這本書辱魁,來學習如何提升自己的軟技能烟瞧。
測量我們想提升的事項
如果我們要迭代,一個自然的問題染簇,就是如何衡量我們的迭代是有效的燕刻。這里,就可以使用最常用的辦法 - metrics剖笙。
大家在做性能優(yōu)化的時候,通常也會在一些關(guān)鍵的地方加上 metrics请唱,然后通過 metrics 來衡量優(yōu)化是否有效果弥咪,對于我們自己也是一樣过蹂。當然,我們要先選對 metrics聚至,畢竟錯誤的 metrics 反倒是會讓我們變得更加不高效酷勺,譬如如果我們用每周工作時長來衡量一個程序員的產(chǎn)出,那么最后就會變成大家為了看起來產(chǎn)出高扳躬,而在工作的時候混日子脆诉,拖時間。要選擇一個正確的 metrics贷币,通郴魇ぃ可以關(guān)注以下幾個指標:
- 最大影響,就跟優(yōu)化一樣的役纹,我們通常會首先關(guān)注開銷最大的地方偶摔。
- 可執(zhí)行,也就是這些 metrics 的提升真的是因為我們的努力而變化的促脉。
- 可反應辰斋,這些 metrics 能很直觀對變化給與正負反饋。
當我們有了計劃瘸味,有了 metrics宫仗,自然就可以去執(zhí)行,去實施旁仿,不過需要注意的是在實施的時候也需要時刻知道事情的進展藕夫,別偏離方向。我們可以使用工具來記錄丁逝,譬如對于我們自己系統(tǒng)汁胆,可以使用 Prometheus 來保存 metrics,這樣我們就能知道整個歷史的變化了霜幼。
不過最重要的一點嫩码,就是記錄的數(shù)據(jù)一定要是真是的,錯誤的數(shù)據(jù)甚至比沒有數(shù)據(jù)還要糟糕罪既,因為這可能會讓我們進行錯誤的決策铸题。
更快,更頻繁的去驗證我們的想法
要迭代的更快琢感,一個必要的事情就是要更快的去驗證我們的想法丢间。這里有一個詞,叫做 MVP - Minimum viable product驹针,也就是最小化的可行產(chǎn)品烘挫。我們需要很多小的工作,來收集數(shù)據(jù),從而驗證我們的假設(shè)和目標饮六。
要對產(chǎn)品迭代其垄,通常一個比較好的做法就是進行 A/B testing,同時建立起來完善的反饋循環(huán)卤橄,讓我們知道每一次決定是不是對的绿满。
增強我們項目評估技能
對于工程師來說,還需要鍛煉的一個能力就是項目評估技能窟扑,程序員向來喜歡高估自己的能力喇颁,低估事情的復雜度,項目時間通常預估不準嚎货,導致項目延期橘霎。所以我們需要使用更加精確的預估手段來推進項目,下面是一些可行的方案:
- 將項目拆分成更加細粒度的任務厂抖,
- 基于任務實際會耗時多久來評估茎毁,而不是基于我們或者其他人覺得要花多久時間
- 基于概率統(tǒng)計來評估,而不是基于最好的情況來
- 讓實際做任務的人來進行評估
- 使用多種方式來評估同一個任務
- 通過歷史數(shù)據(jù)來驗證評估是否合理
- 使用時間窗口來限制任務的時間
- 允許其他人來質(zhì)疑我們的評估
最后忱辅,無論我們選擇了什么方案七蜘,一點需要注意的是,一定要給未知的東西預留時間墙懂,也就是要給自己留點 buffer橡卤,隨時應變。
當我們評估完成時間之后损搬,需要設(shè)置好清晰的計劃碧库,以及可衡量的里程碑,讓我們盡量走在正確的道路上巧勤。這里幾點要注意:
- 要盡快的減少并且規(guī)避風險嵌灰,甚至需要先把風險最高的事情搞定
- 對于從頭造輪子,要保持足夠的警覺
- 要懂得項目是跑馬拉松颅悉,不要再中途就多次沖刺沽瞭,保持合理的節(jié)奏,當然有時候稍微提速也是可以的
構(gòu)建長期價值
務實的平衡品質(zhì)
有時候剩瓶,項目的快速發(fā)展跟品質(zhì)是有沖突的驹溃,所以這里我們需要好好的平衡兩者的關(guān)系。
首先延曙,我們需要建立 code review 的文化豌鹤,不允許大家隨意的增加功能,隨意的合并代碼枝缔。雖然這個可能會影響產(chǎn)品進度布疙,但好處不言而喻。在 PingCAP,我們有著嚴格的 code review 流程灵临,一個程序員如果要開發(fā)一個新的功能拣挪,他需要提交 RFC,只有 RFC 被通過了俱诸,才能進行開發(fā),當然赊舶,他也可以先自己做點原型驗證睁搭,讓 RFC 更容易被通過。每個 PR笼平,我們至少需要兩個人 review 并且 approve 才能 merge园骆。
在代碼層面,我們需要鼓勵抽象寓调,使用抽象來封裝復雜的邏輯锌唾,保證代碼容易學習,容易使用夺英,容易擴展晌涕。代碼的測試一定要跟上,一定要重視自動化測試痛悯,這個很多研發(fā)都不喜歡寫測試余黎,覺得那是 QA team 的事情,但恰恰研發(fā)是最應該懂測試的载萌。
最小化操作負擔
對于一個產(chǎn)品來說惧财,易用性是非常關(guān)鍵的,我們一定要保證操作的簡單扭仁,這點其實 TiDB 還有很大的進步空間垮衷,所以非常歡迎大家加入幫助我們一起來改進,如果你有任何易用性上面的問題乖坠,歡迎聯(lián)系我搀突。
投資整個 team 的成長
當然,除了要關(guān)注產(chǎn)品價值瓤帚,整個 team 也是要仔細考慮的描姚,畢竟得先有人,才能做出來產(chǎn)品戈次。要保證 team 不斷的成長轩勘,所以我們需要建立一個不錯的工程師文化,主要包括:
- 不斷的優(yōu)化迭代速度怯邪,實施 MVP
- 自動化绊寻,自動化,自動化
- 對代碼進行正確的抽象
- 關(guān)注代碼質(zhì)量,強制 code review
- 建立一個有尊嚴的工作環(huán)境
- 培養(yǎng)一個持續(xù)學習的文化澄步,并不斷的完善
- 給自己分配一點做研究的時間冰蘑,譬如每周 20% 時間,或者通過 hackathon
- 村缸。祠肥。。梯皿。仇箱。。
寫在最后
好了东羹,說了這么多剂桥,我們一直在聊的是高效,上面只是我的一些對照書的簡單總結(jié)属提。如果你能看到這里权逗,我表示很佩服,因為現(xiàn)在要說重點的東西了冤议。
作為一個程序員斟薇,高效是需要融入到自己骨子里面的,但是求类,很多同學一定會很苦悶到底如何才能變得高效奔垦?自然,一個很簡單的辦法就是加入一個高效率的公司尸疆。如果一個公司從上到下都是推崇的高效率工程師文化椿猎,待在里面,自然也就能潛移默化的變得高效了寿弱。很自豪的說犯眠,PingCAP 就是這樣一家公司 :-)
不過,這里我還會更進一步症革,在 PingCAP 里面筐咧,有一只神秘的特種部隊,天生是為高效而生的噪矛,它的名字就是 Effective Tool Team量蕊,簡稱 ET Team,沒錯艇挨,這個就是致敬 E.T. 外星人的残炮。
在 ET team 里面,我們立足于使用最少的資源來解決最大的問題缩滨,也就是會關(guān)注于杠桿的那個支點势就。在 ET team泉瞻,你會:
- 研究不同的測試技術(shù),譬如 Chaos苞冯,F(xiàn)uzzing袖牙,Performance regression,來不斷的去提升 TiDB 的質(zhì)量舅锄。
- 研究不同的 bot 技術(shù)鞭达,讓 PingCAP 的整個工作流自動化運轉(zhuǎn)。
- 研究各種診斷工具皇忿,通過開發(fā) ftrace碉怔,bcc,eBPF禁添,perf 等工具來讓整個系統(tǒng)的運轉(zhuǎn)在你的面前了無秘密。你甚至可以去 hack Linux 內(nèi)核桨踪。
- 參與到 TiDB 的研發(fā)老翘,尤其是涉及到性能,穩(wěn)定性相關(guān)的模塊锻离,你都可以肆意的去貢獻铺峭,去完善。
- 任何能提升團隊效率的事情
在 ET team汽纠,你可以不斷的去突破你的想象力卫键,我們一直相信『天空才是你的極限!』虱朵,如果你愿意加入莉炉,歡迎聯(lián)系我 tl@pingcap.com。