笔记:腾讯CodeReview规范

原文章地址:https://mp.weixin.qq.com/s/MzozROQY9szDF1GCOFrUuw

为什么要做code review

同学们可以在 review 过程中做到落地沟通,不再是空对空的讨论,可以在实际问题中产生思考的碰撞,互相学习,大家都掌握团队里积累出来最好的实践方式!当然,如果 leader 没时间写代码,仅仅是 review 代码,指出其他同学某些实践方式不好,要给出好的实践的意见,即使没亲手写代码,也是对最佳实践要有很多思考。

必须形而上的思考

从知识点联系起来形成面,技术细节和系统要满足的需求在思考上连接起来

工程最佳实践的形而上的思考过程

把工程实践中遇到的问题,从问题类型和解法类型,两个角度去归类,总结出一些有限适用的原则,就从点到了面。

把诸多总结出的原则,组合应用到自己的项目代码中,就是把多个面结合起来构建了一套立体的最佳实践的方案。

model 设计

你必须要有 Domain 思考探索model 拆解/抽象/构建的能力。

进入某个领域,就是首先去看前人的思考,站在前人的肩膀上,再用上自己的通识能力,去进一步思考

基于 model 设计的代码,能更好地适应产品经理不断变更的需求

你一开始就应该思考自己面对的业务领域,思考自己的日历应用可能的模型边界,把可能要做的能力都拿进来思考,构建一个 model,设计一套通用的 store 层接口,基于通用接口的逻辑代码。当产品不断发展,就是不停往模型里填内容,而不是推翻重来。这,思考模型边界,构建模型细节,就是两个很重要的能力,也是绝大多数腾讯产品经理不具备的能力,你得具备,对整个团队都是极其有益的。你面对产品经理时,就听取他们出于对用户体验负责思考出的需求点,到你自己这里,用一个完整的模型去涵盖这些零碎的点。

UNIX 设计哲学

工程和设计的每个分支都有自己的技术文化。在大多数工程领域中,就一个专业人员的素养组成来说,有些不成文的行业素养具有与标准手册及教科书同等重要的地位(并且随着专业人员经验的日积月累,这些经验常常会比书本更重要)。资深工程师们在工作中会积累大量的隐性知识,他们用类似禅宗'教外别传'的方式,通过言传身教传授给后辈。软件工程算是此规则的一个例外:技术变革如此之快,软件环境日新月异,软件技术文化暂如朝露。然而,例外之中也有例外。确有极少数软件技术被证明经久耐用,足以演进为强势的技术文化、有鲜明特色的艺术和世代相传的设计哲学。 ----《UNIX 编程艺术》

Keep It Simple Stuped!

大道至简--把一个事情做出来容易,把事情用最简单有效的方法做出来,是一个很难的事情。

两张经典的模型图:RBAC(权限管理),Logging(分布式日志追踪)

RBAC

《RBAC用户、角色、权限、组设计方案》https://zhuanlan.zhihu.com/p/63769951

Logging

《Metrics, tracing 和 logging 的关系》https://blog.csdn.net/sD7O95O/article/details/79314622

设计时考虑拼接组合

继承树,很难适应层出不穷的变化。但是如果使用组合,就可以拆解出 UserSignature 等等各种可能需要的部件,在需要的时候组合使用,不断添加新的部件而没有对老的继承树的记忆这个心智负担。

使用组合,其实就是要让你明确清楚自己现在所拥有的是哪个部件。

如果部件过于多,其实完成组合最终成品这个步骤,就会有较高的心智负担,每个部件展开来,琳琅满目,眼花缭乱。

如果不用继承树把它组织起来,平铺展开,组合出一个页面,将会变得心智负担高到无法承受。OOP 在'需要无数元素同时展现出来'这种复杂度极高的场景,有效的控制了复杂度 。代价是什么呢?代价就是,一开始做出这个自上而下的设计,牵一发而动全身,每次调整都变得异常困难。

组合,还有一个关系很紧密的词,叫插件化。

吝啬原则: 除非确无它法, 不要编写庞大的程序

代价是代码越多,越难维护,难调整。我们对于代码,要吝啬。能把系统做小,就不要做大。手 Q 的同学们,看看自己代码,曾经叹息过么。能小做的事情就小做,寻求通用化,通过 duck interface(甚至多进程,用于隔离能力的多线程)把模块、能力隔离开,时刻想着删减代码量,才能保持代码的可维护性和面对未来的需求、架构,调整自身的活力。

透明性原则: 设计要可见,以便审查和调试

透明性和可显性

如果没有阴暗的角落和隐藏的深度,软件系统就是透明的。透明性是一种被动的品质。如果实际上能预测到程序行为的全部或大部分情况,并能建立简单的心理模型,这个程序就是透明的,因为可以看透机器究竟在干什么。

如果软件系统所包含的功能是为了帮助人们对软件建立正确的'做什么、怎么做'的心理模型而设计,这个软件系统就是可显的。因此,举例来说,对用户而言,良好的文档有助于提高可显性;对程序员而言,良好的变量和函数名有助于提高可显性。可显性是一种主动品质。在软件中要达到这一点,仅仅做到不晦涩是不够的,还必须要尽力做到有帮助。

透明性:

我们要写好程序,减少 bug,就要增强自己对代码的控制力。你始终做到,理解自己调用的函数/复用的代码大概是怎么实现的。

为了保证大家能对自己代码能做到有控制力,所有人写的函数,就必须具备很高的透明性。而不是写一些看了一阵看不明白的函数/代码,结果被迫使用你代码的人,直接放弃了对掌控力的追取,甚至放弃复用你的代码,另起炉灶,走向了'制造重复代码'的深渊。

可显性:

可显性的标准很简单,大家看一段代码,懂不懂,一下就明白了。但是,如何做好可显性?那就是要追求合理的函数分组,合理的函数上下级层次,同一层次的代码才会出现在同一个函数里,追求通俗易懂的函数分组分层方式,是通往可显性的道路。

完备的文档还需要出现在离代码最近的地方,让人'知道这里复杂的逻辑有文档',而不是其实文档,但是阅读者不知道。

通俗原则: 接口设计避免标新立异

缄默原则: 如果一个程序没什么好说的,就沉默

沉默是金。除了简单的 stat log,如果你的程序'发声'了,那么它抛出的信息就一定要有效!

补救原则: 出现异常时,马上退出并给出足够错误信息

如果出现异常,异常并不会因为我们尝试掩盖它,它就不存在了。所以,程序错误和逻辑错误要严格区分对待。这是一个态度问题。

其他

CI(continuous integration)

《unix 编程艺术》T7 及更高级别的同学。你们已经积累了大量的代码实践,亟需对'工程性'做思考总结。很多工程方法论都过时了,这本书的内容,是例外中的例外。它所表达出的内容没有因为软件技术的不断更替而过时。

佛教禅宗讲'不立文字'(不立文字,教外别传,直指人心,见性成佛),很多道理和感悟是不能用文字传达的,文字的表达能力,不能表达。大家常常因为"自己听说过、知道某个道理"而产生一种安心感,认为"我懂了这个道理",但是自己却不能在实践中做到。知易行难,知道却做不到,在工程实践里,就和'不懂这个道理'没有任何区别了。

在实践中去不断践行和积累自己的'教外别传'。

Tips:实践是检验真理的唯一标准

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值