QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

Facebook 元老王淮眼中的软件开发原则

  • 2013-03-18
  • 本文字数:2240 字

    阅读完需:约 7 分钟

王淮是 Facebook 的早期员工,也是 Facebook 内部第二位中国籍工程师和第一位研发经理,曾经负责支付后台和安全系统,担任反欺诈部门的技术经理。最近,他分享了一些基本的码农原则,包括代码结构、测试重要性等。

正确性是第一要求,他认为“不能解决问题的代码是耍流氓”。

然后是代码结构,王淮觉得结构体现逻辑:

第一步,第二步,需要什么数据,需要做什么处理,处理完了结果到那里去,都应该在结构中被很好的体现出来。

结构体现设计。 设计一定要清晰。我的经验来看,一般来说,在设计结构图上面的每个组件都对应着自己的类,然后之间或类内部的通信通过成员函数来完成。

他提供一个可借鉴的做法:在一个大的功能实现过程中,给出第一个 diff(提交代码增量)的时候,可以只把结构当做一个 diff,里面的函数可以是空的 (place holder,作为占位符)。 把数据的生成和界面的展示分开来。典型的可以按照 MVC 的模式来,但也可以只把数据和 UI 界面分开来的比较轻量级的做法。结构应当是提交代码审查的时候最最关注的地方。最需要问的问题就是“这个 diff 号称要解决的问题被正确解决了吗?”

测试的重要性不言而喻。王淮指出:

不论你再正确,还是有错误的时候。通过(相对)公正的测试一是来减少自己被绕到代码里的几率,二是让后续的或者别人的改动对自己代码不经意的破坏被最快的展现出来。测试应该把类主要的功能都测一遍。测试也应该把类和其他类最重要的集成部分也测一遍。

对于提交代码增量的问题,王淮说了几个需要注意的事项:

  • Bug 修改,无所谓,该多大就多大。一般 bug fix 不会超过 100 行。超过的要特别重视,想想究竟是什么原因造成。会不会是当初设计的问题。一个 diff,原则上不应该超过 200-300 行修改。但多了怎么办,把一个 diff 变成多个。
  • 每个 diff 应该只做一件事情。每个 diff 尽可少的做一个改动。这样可以尽可能的方便自己的管理 (学会用 git branch),和方便审阅者的代码审查。如果 diff 越集中做一件事,审查代码的人需要越短的时间来审查做出高质量的,整体效率越高。
  • 一个功能超过一屏,则将其分割。

面向对象还是面向函数,王淮指出,Java 本身就是面向对象,所以这个问题不大。但千万不要出现披着面向对象的外皮,在类里面写超长的面向函数的处理。这种情况下,尽可能的分流成辅助函数。

关于代码规范,他举了一些简单的例子:比如文件名,变量或函数名的命名规范,分行的前置空 2 个空格或 4 个;每行的字数(不应超过 80 字符);如何使用 public/private/protected;用左右括号的原则;空行的使用;文件和代码 comments 的位置 (比如,代码注释只能单独成行);对“// TODO:”的使用规范;宏、常量的使用。这里没有特别的哪一种样式一定更对,但是需要有一个大家统一的指南,一起遵守,让整体的代码有统一的风格和标准。最大的好处就是有利于可读性,可读性的好坏决定着维护成本。

注释应当简洁但充分。有些人觉得代码应该自说名。王淮不大同意,代码是实现细节,适当的在意图上给予说明,可以大幅度的减少读代码的人的烦恼。

代码审查越来越受到重视,王淮指出:

  • 作为审查者,一定要读懂 diff;所有被接受的 diff 必须是在读懂的前提下。做审查者的人要有“将来如果这些代码线上出问题,我要帮助支持”的心理准备。
  • 代码审查应该被每个工程师当做工作的重要一部分。
  • 应当在 24 小时内给回复,这应当变成共识。
  • 感觉有问题的代码,一定要在相应的行上做出评论 (inline comments),以让作者明白问题所在。
  • 尽可能把对修改的所有意见一次性给出,减少来来回回的次数。比较复杂的建议审查者主动找代码作者来进行线下沟通,达成一致。
  • 一般的 diff,来回次数不宜超过 3 次;如果超过 3 次,想想看,是不是 diff 太大,太复杂了。

说到代码审查,thoughtbot 公司最近在 github 上发布了自己的代码审查原则,其中几个值得关注的要点包括:

  • 接受这样的现实:很多编程上的主张都是一种个人观点。应该讨论它们的利与弊,提出你的倾向观点,迅速地达成一种解决方案。
  • 提问,而不是命令。(“把这个变量改成:user_id,你觉得如何?”)
  • 请求给予说明。(“我不明白。你能解释一下吗?”)
  • 避免代码的归属之争。(“我的”,“不是我的”,“你的”)
  • 避免使用一些会被认为是有关人身特征的词语。(“笨蛋”,“愚蠢”) 要把所有人都看作是有魅力的、聪明的、善意的。
  • 要明确。要记着并不是每个人都能理解你的意图。
  • 要谦虚。(“我不能确定——我们来分析一下。”)
  • 不要用夸张修辞语。(“总是”,“从不”,“永远”,“毫无…”)
  • 不要讽刺。
  • 展现真实的你。如果你不是幽默型的人,不喜欢使用一些表情符号或动画 gif 图,不要勉强。如果你是这种人,请自信的发挥。
  • 如果有太多的“我不理解”或“另一种方案:”的评论,请专门针对这个人进行交流。可以把你们线下的交流总结成一个帖子附在后面。
  • 对审查者的建议表示感激。(“谢谢提醒。我会把它改正。”)
  • 理解审查是对事不对人。审查的是你的代码,而不是你。
  • 解释为什么代码写成这样。(“因为 xxx 原因我才写成这样。如果我把这个类 / 文件 / 方法 / 变量改个名会更清晰些吗?”)
  • 整理所作的改动,在以后的迭代中重构它们。
  • 在做修改的版本上注明代码审查的链接。
  • push 提交要基于最早的一轮反馈,并形成一个独立的分支。等这个分支上的任务完全完成了再合并。这让审查者能够根据早先的反馈找到你的单独的更新。
  • 努力站在审查者的立场上理解。
  • 争取回复每个评论。
  • 直到最后一个人退出登录后再合并分支。
  • 直到持续集成测试 (TDDium, TravisCI, 等) 告诉你这个分支的测试套件通过后再合并分支。
2013-03-18 05:012955
用户头像

发布了 501 篇内容, 共 259.9 次阅读, 收获喜欢 61 次。

关注

评论

发布
暂无评论
发现更多内容

融云X-Meetup南京站 探讨实时通信架构的高质量设计

融云 RongCloud

荷小鱼 x mPaaS | 借助 H5 容器改善 App 白屏、浏览器兼容等问题

蚂蚁集团移动开发平台 mPaaS

html5 mPaaS 离线包 教育科技

激光雷达(LiDAR)技术

澳鹏Appen

人工智能 大数据 智能驾驶 激光雷达 点云标注

如何抓住新社交风口下的音视频通讯大潮?

融云 RongCloud

Java程序员都要懂得知识点:原始数据类型

华为云开发者联盟

Java 字符串 StringBuffer 原始数据类型 布尔类型

已拿到8个Offer!阿里巴巴Java面试参考指南(泰山版)

钟奕礼

Java 编程 程序员 架构 面试

Github上堪称最全的面试题库(Java岗)到底有多香

钟奕礼

Java 编程 程序员 架构 面试

用DeBug的方式,带你掌握HBase文件在Snapshot的各种变化

华为云开发者联盟

HBase 元数据 数据迁移 数据备份 Snapshot

flink流计算可视化web平台

无情

sql 流计算 flin

二次元界福音:MakeGirlsMoe创建动漫人物

不脱发的程序猿

GitHub 开源 4月日更 二次元 MakeGirlsMoe

软件测试分类体系,系统学习

程序员阿沐

软件测试 测试工程师 黑盒测试 白盒测试 测试类型

盘点几代会声会影图标

奈奈的杂社

融云推出超值套餐包,音视频20万分钟免费享

融云 RongCloud

如何美化 GitHub 个人主页?

彭宏豪95

GitHub 写作 markdown IT 4月日更

嘉楠科技发布勘智K210-MicroPython 无需寄存器手册就能上手开发

Android AAC音频硬编解码你知道多少?

Engineer-Jsp

区块链版「滴滴+Uber」,让出行带来收益

CECBC

移动互联网

货运物流移动端解决方案:为货运物流行业打造高性能、高粘性的“双端”触点

蚂蚁集团移动开发平台 mPaaS

移动开发 mPaaS 移动端 智慧物流

Github连夜下架!阿里新产Java全栈面试突击小册太香了

Java架构之路

Java 程序员 架构 面试 编程语言

公安重点人员管控系统搭建,智慧派出所系统

一体化智能安全防御 京东云星盾安全加速正式发布

京东科技开发者

互联网 网络安全

为什么拥有云原生数据平台对电信公司很重要?

VoltDB

云原生 5G VoltDB 电信

阿凡提EGGNETWORK恒价通证+加密社交催生新玩法 EFTalk

币圈那点事

构建用户安全评级,UGC智能化审核应用实践

爱奇艺技术产品团队

人工智能

数字货币,已成为理解现代经济不可排斥的一个因素

CECBC

数字经济

入职字节跳动那一天,我哭了(蘑菇街被裁,奋战7个月拿下offer)

Java 编程 程序员 架构 面试

单片机异常复位后如何保存变量数据

不脱发的程序猿

嵌入式 单片机 4月日更 硬件研发 单片机异常复位

Java开发8年,40W年薪被别人叫垃圾?请你们不要口嗨了,好好去刷题吧!

Java架构追梦

Java 架构 面试 金三银四 年薪40W

将AI部署到现实?或许你该读读这本书!

澳鹏Appen

人工智能 大数据 AI 伦理

HBase底层读写过程

五分钟学大数据

HBase 4月日更

阿里云 RTC QoS 弱网对抗之变分辨率编码

阿里云CloudImagine

阿里云 WebRTC 分辨率 视频编解码 视频云

Facebook元老王淮眼中的软件开发原则_语言 & 开发_崔康_InfoQ精选文章