知乎作者@叶小飞:
作为Oppo Reno2 超级夜景核心开发人员和奔驰San José Pilot落地工程师之一,我写代码基本尽可能地遵循Google Style. 在这里写几个自己的习惯+Google Style里面几个常用的要点。
自己的习惯
动手写代码前尽量做到胸中有丘壑。现在这世界讲究格局,写代码亦然。 我写代码前一般要先回答这么几个问题——这段代码的核心功能是什么?实现它的核心功能需要实现哪些functions? 这些functions需要设计哪些相应的class?这些class如何尽量做到hierarchy, 能否从已有的代码库里进行继承来避免重复开发?回答了这些问题后我才会动手写,这样避免写代码时东写一块,西写一波以及重复作业。
能高效一行写完的绝不写两行。 举个简单的python 例子,有人通过if else总共四行代码来判断return A or return B, 其实完全可以缩成一行:return A if something else B
做好文档规整。 程序员的工作不是学完代码就拉倒的,还包括整理好自己代码的文档介绍,一方面方便工作交接,让领导更实质性地看到你的功劳,另一方面方便给自己理清思路,同时为很久以后温习这份代码做准备。
坐姿端正,保护好你的颈椎。 老程序员都懂,颈椎不好多么影响工作效率。写代码时尽量用大屏,这样不用低头去写,坐姿正确对颈椎、老腰都好,可持续输出才是王道。
Setup好用的IDE事半功倍。 我写C++一般用Visual Studio, 写Python用Pycharm
C++ Google Style 里几个常遇到的要点
头文件引用:一般来说,每个cpp文件都要对应一个头文件。在你的.cpp 或者.h file里只引用你用得到的头文件,以此减少compilation时间。另外,尽量避免transitive inclusion(比如你引用的某个头文件A引用了头文件B,所以你的cpp文件虽然需要用到B的函数,但没有单独引用头文件B也可以正常compile 和运行,这就叫transitive inclusion)
Struct只用于passive object, 其他一律用class
变量命名法则: 变量名称一定要反应它的用途。变量名字太长没关系,首要让人明白它是做啥的。尽量不要使用非常见缩写,例如,digital_signal_processor可以缩写成dsp, 但是不能写成dig_sig_process。
注释尽量保持风格一致,比如你上一段用了//,下一段代码用/**/注释就属于风格混乱。每个函数下面都要有注释代码,来解释input/output 是什么,这段函数用来做什么
如果你的函数不需要改变argument里某个变量的内容,那么记得加const. 方便读者一目了然这个函数做什么用的,方便compiler更好的做type checking.如果你代码里有大量的指针,建议使用smart pointer, 以防你漏删指针造成内存泄漏。
知乎作者@平凡:
写文档能力很重要
团队作战会发现很多时间华仔写文档上,我之前实习的那个军工保密单位,一个项目会由好几个兄弟单位一起齐头并进,所以保持文档一致是非常重要的,二我再那段时间写过一个100多页的文档,并最终600多页的文档是由我和一个小伙伴合并完的,其中很多工作花在命名一致上,那段时间真让人头秃。
结对编程
有能力的话要结对编程,既可以让你精神愉悦
还能在你休息的时间review代码
干净整洁的编程环境
其中也包括了愉悦的心情,如果桌面脏乱差,非常影响心情。
心情愉快的前提下编程效率会大大提升。
习惯去看源代码
网上的攻略再好,也是二手资源
不要重复造轮子
要相信前人的智慧和尊重大家的鉴别能力
知乎作者@王哲:
关于代码本身
“要懒惰,不要懒惰”:如果发现重复的模式,思考如何抽象出来,避免重复的写类似的代码。不要”懒得“抽象。懒得及时抽象,会让代码重构变得越来越困难。
最简单的例子是写function抽象,复杂一点的可以通过meta programming,既写生成function的function抽象。这个各种语言提供的方法不一样,有些语言更加灵活,比如Clojure一类,几乎可以通过宏随意构造新语法的;有一些比较不方便,比如Java只能通过设计模式实现某些抽象。
通过写Generic operator抽象,就是可以动态dispatch的函数。
不要的代码及时删除,不要变成注释。你的git会帮助你找回你删除的代码。
一个函数如果超过了50行,考虑拆解成多个函数。
尽可能分离纯函数和非纯函数。纯函数就是那些无状态、无IO的,相同的call永远给你相同的结果。这些函数非常可靠而且容易测试;非纯函数就是IO、有状态的,他们的测试需要Mock,而且不稳定。所以,尽量把非纯函数推到程序的边界上,让内核尽可能的保持纯洁。
关于注释
写注释的时候应该记住,你的注释是写给其他人和未来的自己看的。不要写过多解释代码的注释,要写假设、注意事项、例子等等对用户有用的信息。这里用户包括两类:使用功能的人和将来维护拓展功能的人。
注释主要分成两种,一种是给接口写的,一种是给实现写的。
写给接口的注释,应该包括:input requirementoutput assumptionpossible raiseexamples写给实现的注释,应该包括:
Abstraction function,就是 实现是如何映射到目标数据结构的
Representation invariant,就是 实现的时候那些数据结构是有效的
关于测试
写函数的时候问自己,这个函数容易测试吗?如果容易,写几个test case。如果不容易,拆解函数成容易测试的。
新的一年,小夕给大家拜年啦!
祝小伙伴们在新的一年里,
算法如巧克力般硬核,
代码如牛奶般丝滑。
告别996,
拥抱财富自由!
<<< 滑动打开信封,查收祝福吧 >>>
后台回复关键词【入群】
加入卖萌屋NLP/IR/Rec与求职讨论群
后台回复关键词【顶会】
获取ACL、CIKM等各大顶会论文集!