摘要:王淮是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)

原文出自:王淮

王淮经验谈:我的码农原则相关推荐

  1. 老闪创业那些事儿(外传)——林家小妹的码农男友

    林家小妹毕业之后进了当地一家国企,是电网企业的下属公司,工作是项目管理.天性聪明善良又热情活泼知进退的林家小妹几个月的时间就熟悉了环境,跟大家处得十分愉快,做起事情来游刃有余.965的日子里,把自己的 ...

  2. 缓存为王:老码农眼中的分布式缓存

    本文来自作者 老曹 在 GitChat 上分享 「缓存为王:老码农眼中的分布式缓存」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 世界是相似的,在商业的世界中,有一句经典语录叫 &quo ...

  3. 我,一个靠GitHub打赏谋生的码农,年入十万美元

    | 作者:Caleb Porzio | 转载自:机器之心 | 编辑:王玥敏 | 设计:刘颖洁 如果提到靠打赏生活的人,我们首先想到的会是主播.但现实情况是,码农也可以.这位活成主播的码农名叫 Cale ...

  4. 王淮:我在Facebook的十点经验分享

    博客地址:http://blog.sina.com.cn/u/1892234075 我是 2007 年初加入 Facebook,那时大概 150 人.2011 年 9 月底离开,当时 3200 多人. ...

  5. [转载]王淮:我在Facebook的十点经验分享

    [转载]的目的是2017年给自己一个新的定位,原文出处http://kb.cnblogs.com/page/139599/ 我是 2007 年初加入 Facebook,那时大概 150 人.2011 ...

  6. 30 岁码农人生:人生至暗时,你依然能窥见光明

    作者 | 佚名 来源 | 程序员纪实录 文中的老刘.小蔡.高经理.鹏哥.周哥.小凯.小王.强哥.夏总均是虚构名称. 景原市.湖平市.新阳市.高顺市乃是虚构地名. 看到这个题目,大概你会认为这篇无聊的文 ...

  7. 老码农揭开行业黑幕:如何编写无法维护的代码

    作者 | 老码农的自留地 来源 | 程序员的那些事 如何编写无法维护的代码 让自己稳拿铁饭碗 简介 永远不要(把自己遇到的问题)归因于(他人的)恶意,这恰恰说明了(你自己的)无能.-- 拿破仑 为了造 ...

  8. Zoom 袁征码农逆袭:8 次申请美国签证被拒,独闯硅谷成亿万富翁

    作者 | 哈那 出品 | 出海瞭望(ID:Globalinsights) Zoom,袁征(Eric S. Yuan). 这可能是你最近在中外科技.财经类报道里经常看到的关键词.继去年成功在纳斯达克上市 ...

  9. 百般优势的腾讯搜搜为何最后还是死掉? 基层码农忆搜搜

    http://www.nowamagic.net/librarys/news/detail/1467听到腾讯和搜狗合作消息时,还在外旅游的我伴皆呆:出去时大家还是威风的帝企鹅,回来都变小土狗了.我的免 ...

最新文章

  1. android mysql 搜索功能_android利用数据库实现搜索联想功能
  2. Genome Sequencing and Assembly by Long Reads in Plants植物基因组的长读测序与组装
  3. 102页PPT,DeepMind强化学习最新进展,含图文、公式和代码
  4. 使用PYTORCH复现ALEXNET实现猫狗识别
  5. ANTLR教程– Hello Word
  6. golang的panic用法
  7. ASP.NET企业开发框架IsLine FrameWork系列之十三--框架配置信息大全(上)
  8. linux svn with ad,svn+apache+AD域
  9. 反欺诈模型常用开发工具
  10. 互联网公司面试流程面试技巧(附被无良HR欺骗的经历)
  11. 全面了解CAN总线协议
  12. 基于DSP的主动降噪开发之三(CCS软件学习)
  13. CPT CPC CPA CPM 广告投放了解
  14. 水晶易表(Xcelsius) 2008 学习
  15. c语言获取系统时间精确到毫秒,如何获取系统流逝时间(要求精确到毫秒)
  16. Turtle库绘画实例
  17. 从利用gensim 训练好的word2vec模型中取出向量并计算余弦相似度,Levenshtein distance 计算
  18. 数据分析思维九段路线图
  19. python自动点名程序_利用python+tkinter开发一个点名软件
  20. 蓝牙UART和PCM接口传输的信号 硬件接口

热门文章

  1. 【转】ABP源码分析二十二:Navigation
  2. 【转】MVVM大比拼小结
  3. 【转】Magento2 数据库操作
  4. Python 数据分析三剑客之 Pandas(六):GroupBy 数据分裂、应用与合并
  5. CCNP-第十篇-BGP(二)
  6. 【CodeForces - 602D】Lipshitz Sequence(思维,单调栈,斜率单调性)
  7. Coursera自动驾驶课程第11讲:2D Object Detection
  8. 实现运动轨迹_【自动驾驶】运动规划丨速度规划丨时间维度
  9. html 表格文字颜色 css,CSS 表格-JavaScript中文网-JavaScript教程资源分享门户
  10. bash: pcre-config: 未找到命令..._Docker 常用操作命令