王淮經驗談:我的碼農原則

摘要:王淮是Facebook第二位中國籍工程師,也是第一位中國籍研發經理,他一手開創了Facebook的支付安全和客服工具領域。2011年他離開Facebook,回國成為天使投資人。本文是王淮以前寫代碼和做代碼審查時候的一些原則,供大家借鑒。

作者王淮分享了在寫代碼和做代碼審查時候的一些原則,供大家學習與參考。

正確性(Correctness)

正確性是第一要求。不能解決問題的代碼是耍流氓。

第一步,結構體現邏輯。第二步;需要什么數據,需要做什么處理,處理完了結果到那里去,都應該在結構中被很好的體現出來。

結構體現設計。設計一定要清晰。我的經驗來看,一般來說,在design?chart上面的每個component都對應著自己的class,然后之間或class內部的通信通過member?function來完成。

一個可借鑒的做法——在一個大的feature?implementation過程中,給出第一個diff的時候,可以只把結構當做一個diff,里面的函數可以是空的(place?holder)。

把數據的生成和界面的展示分開來。典型的可以按照MVC的模式來,但也可以只把數據和UI分開來的比較輕量級的做法。結構應當是diff?review時候最最關注的地方。最需要問的問題就是“這個diff號稱要解決的問題被正確解決了嗎?”

不論你是在正確還是有錯誤的時候。通過(相對)公證的test來1)減少自己被繞到代碼里的幾率;2)讓后續的或者別人的改動對自己代碼不經意的破壞被最快的展現出來。

test應該把class主要的function都測一遍

test也應該把class和其他class最重要的integration也測一遍。

可讀性(Readability)

diff的大小

bug修改,無所謂,該多大多大。一般bug fix不會超過100行。超過的要特別重視,想想究竟是什么原因造成。會不會是當初設計的問題。

一個diff,原則上不應該超過200-300行修改。但多了怎么辦,把一個diff變成多個–split to multiple changes.

每diff應該只做一件事情

每個diff盡可少的做一個改動。這樣可以盡可能的方便自己的管理(學會用 git branch),和方便reviewer的代碼審查。如果diff越集中做一件事,審查代碼的人需要越短的時間來審查做出高質量的,整體效率越高。

一個function超過1屏=>split it, idiot.

統一的代碼規范

比如文件名,變量或函數名的命名規范,分行的前置空2個spaces或4個;每行的字數(不應超過80char);如何使用public/private/protected;用左右括號的原則;空行的使用;文件和代碼comments的位置(比如,代碼comment只能單獨成行);對“//TODO:”的使用規范;macro,constant的使用;

等等等等。

這里沒有特別的哪一種style一定更對,但是需要有一個大家統一的guideline,一起遵守,讓整體的代碼有統一的風格和標準。

最大的好處就是有利于readability.

object-oriented v.s function-oriented

Java本身就是面向對象,所以這個問題不大。但千萬不要出現披著面向對象的外皮,在class里面寫超長的面向函數的處理。這種情況下,盡可能的分流成helper function.

crispy & sufficient的注釋

注釋應當簡潔但充分。有些人覺得代碼應該speak for itself。我不大同意,代碼是實現細節,適當的在意圖上給予說明,可以大幅度的減少讀代碼的人的煩惱。

diff發出去之前

與master做一次merge update,確保resolve all conflicts

run一次所有涉及的test cases(需要工具)

考慮最可能做reviewer的人,可以是團隊伙伴,也可以是修改涉及到的源代碼owner。但必須是關心該改動或和改動相關的人。

所有的manager應當自動subscribe自己的團隊里所有人的diff requests (做好filtering,但你不一定要看)

code-review之中應該做的

作為reviewer,一定要讀懂diff;所有被 accept的diff必須是在讀懂的前提下。做reviewer 的人要有“將來如果這些代碼線上出問題,我要幫助 support”的心理準備。

code review應該被每個engineer當做工作的重要一部分。做Performance Review 的時候應該把幫助做過的code review考慮,for both employee & manager.

應當在24小時內給回復,這應當變成共識。

感覺有問題的代碼,一定要在相應的行上做出評論(inline comments),以讓作者明白問題所在。

盡可能把對修改的所有意見一次性給出,減少來來回回的次數。比較復雜的建議reviewer 主動找author來進行線下溝通,達成一致。

一般的diff,來回次數不宜超過3次;如果超過3次,想想看,是不是diff太大,太復雜了。

check-in之前應該做的

與master做一次merge update,確保沒有問題

run一次code change涉及到的所有test cases(包括新增的和涉及到的 test cases)

原文出自:王淮

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448740.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448740.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448740.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

centos uwsgi自動調用python2環境,指定uwsgi調用版本

將自己開發好的django項目用uwsgi部署到Linux服務器、當運行uwsgi時出現了uwsgi選擇python版本的問題。因為本機器是在原來的機器上安裝了python3環境和pip3, 使用命令安裝uwsgi: pip3 install uwsgi 一點問題也沒有,使用uwsgi部署項目時 uwsgi --http :…

docker build Dockfile ---- RUN 中 cd 切換路徑失敗 的原因、解決

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 我只是想 直接切換到對應目錄下 執行后續命令。 ?????寫法如下: FROM openjdk:8-jre-alpineMAINTAINER JiangYuRU…

米爾電子Zynq UltraScale MPSoC核心板資料介紹

米爾Zynq UltraScale MPSoC核心板(MYC-CZU3EG)是采用Xilinx新一代Zynq處理器。該核心板是業界最小尺寸Zynq UltraScale 核心板,采用16納米制程,相比Znyq7000系列每瓦性能提升5倍,且單芯片融合4核心Cortex-A53&#xff…

幸福秘訣 男女必須要看哦

女人說:這一輩子最大的成功是什么?我認為是找到一個真正疼自己的老公,有了老公的支持才可以把事業做得有聲有色,有一個幸福的家和一個可愛的寶寶。 男人說:我的成功是在我的人生之中,是妻子和我形影相隨,朝夕相伴。她是我身邊…

解決:If the number of processors is expected to increase from one, then you should configure the numbe

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 按官方說明用 docker 部署 rocketmq ,啟動 broker 報錯: OpenJDK 64-Bit Server VM warning: If the number of processo…

JAVA-緩存機制

本地緩存 繼承AbstractBaseLocalCache&#xff0c;并實現相應的抽象方法&#xff1b;適用于單實例項目或不會經常變化的數據&#xff1b;代碼示例&#xff1a;/*** 倉庫信息緩存類*/ Service public class WarehouseCache extends AbstractBaseLocalCache<Long, Warehouse&g…

騰訊QQ團隊開源分布式后臺毫秒服務引擎全解析:引擎架構、RPC、灰度……

騰訊QQ團隊將于12月4日開源一個服務開發運營框架&#xff0c;叫做毫秒服務引擎&#xff08;Mass Service Engine in Cluster&#xff0c;MSEC&#xff09;&#xff0c;它集RPC、名字發現服務、負載均衡、業務監控、灰度發布、容量管理、日志管理、Key-Value存儲于一體&#xff…

古代隱士如何忙衣食

三歲娃兒都曉得&#xff0c;吃飯穿衣是維持生命的基本條件&#xff0c;想瀟灑地“舊山歸隱浪搖青&#xff0c;綠鬢山童一帙經”&#xff0c;就得準備足夠的柴米油鹽。 所謂隱士&#xff0c;須得強調是“士”&#xff0c;即讀書人。手無縛雞之力&#xff0c;不仕就無俸祿&…

一個秘密

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 這是一個秘密&#xff0c; 一個不想說出來&#xff0c;卻真實的秘密&#xff1a; --- --- 本來我不想說&#xff0c; 可是最近的一切…

程序員如何在大公司做管理

本文被記錄的最大初衷在于從創業公司的CEO轉變成阿里巴巴的一名開發專家&#xff0c;打心底觸動了心靈最深處的一次學習經歷&#xff0c;無論成長、挫折、困難、收獲都烙在心里。 寫文章的思路&#xff1a; 背景&#xff08;認清現狀&#xff09;管理&#xff08;闡述自己的理解…

WebGL之物體選擇

原文地址: WebGL之物體選擇 使用WebGL將圖形繪制到畫布后&#xff0c;如何與外部進行交互&#xff1f;這其中最關鍵的就是如何實現物體的選擇。比如鼠標點擊后判斷是否選中了某個圖形或圖形的某個部分。 本節實現的效果: WebGL選中物體 如何實現選中物體 顏色區分法 《WebGL編程…

中國歷史上影響最大的10首詩

中國是詩歌的國度&#xff0c;有許多詩都有很大的影響。這里所謂影響“最大”(而不是“最好”)的十首詩&#xff0c;除了要寫得好之外&#xff0c;還必須通俗易懂、易記。 第一首&#xff1a;李白的《靜夜思》 床前明月光&#xff0c;疑是地上霜。 舉頭望明月&#xff0c;低頭…

XML建模

建模分兩步&#xff1a;1、以面向對象的編程思想&#xff0c;描述xml資源文件。 2、將xml文件中內容封裝進model實體對象。 導入文件&#xff1a;config.xml <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE config[<!ELEMENT config (acti…

Docker 方式安裝部署 rocketMQ 、部署 圖形化界面控制臺、rocketMQ 控制臺

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 直接上官網&#xff0c;找到工程&#xff0c;clone 到本地&#xff0c;地址&#xff1a;https://github.com/apache/rocketmq-extern…

迭代器(iterator)

Date: 2019-05-23 Author: Sun 為何要引入迭代器&#xff1f; ? 通過列表生成式&#xff0c;我們可以直接創建一個列表&#xff0c;但是&#xff0c;受到內存限制&#xff0c;列表容量肯定是有限的&#xff0c;而且創建一個包含100萬個元素的列表&#xff0c;不僅占用很大的存…

初識python之函數基礎

課堂筆記&#xff1a; 1、什么是函數&#xff1f;函數相當于工具&#xff0c;需要事先準備好&#xff0c;在需要用時再使用。2、如何使用函數&#xff1f;函數必須先定義、后調用。3、函數的語法:# def 函數名(參數1,參數2...):# """# 注釋# 函數的說明# 水…

java 的幾種對象 (PO,VO,DAO,BO,POJO) 解釋

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、PO:persistant object 持久對象,可以看成是與數據庫中的表相映射的java對象。最簡單的PO就是對應數據庫中某個表中的一條記錄&#x…

【隨想】每日兩題Day.22

題目&#xff1a;102. 二叉樹的層序遍歷 給你二叉樹的根節點 root &#xff0c;返回其節點值的 層序遍歷 。 &#xff08;即逐層地&#xff0c;從左到右訪問所有節點&#xff09;。 示例 1&#xff1a; 輸入&#xff1a;root [3,9,20,null,null,15,7] 輸出&#xff1a;[[3],[…

幫助子女成功的十大路徑

美國全國家長協會(National PTA)建議指出&#xff1a;作為家長您對你子女的成功起著非常重要的影響作用&#xff0c;并舉出幫助子女成功的十種路徑。 1、與子女溝通 如果我們盡早地與子女溝通&#xff0c;提供給他們信息與行為準則&#xff0c;獲得子女的信任&#xff0c;在…

shell關閉指定進程

例如要關閉jupyter-notebook這個進程&#xff1a; ps -ef | grep jupyter-notebook | grep -v grep | cut -c 9-15 | xargs kill -9 說明&#xff1a;管道符“|”用來隔開兩個命令&#xff0c;管道符左邊命令的輸出會作為管道符右邊命令的輸入。 “ps -ef” 查看所有進程  …