王淮经验谈:我的码农原则

摘要:王淮是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.mzph.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” 查看所有进程  …