有一句老话叫:正确的结果只有一种,错误的现象千奇百怪。
对于高手程序员来说,他们并不是不写 bug,而是通过良好的编程习惯在开发阶段避免了百分之八十的 bug。所以一些良好的编程习惯非常重要。
这里我列举一些:
1. 写代码前先想好思路,先规划框架,再到局部实现
这点很重要,很多同学拿到工作内容后,上来就开始写代码,尤其是在设计一些关键步骤时,最后写出来不是有偏差,就是考虑不全。举个例子,我们可以利用 TODO 标记在开始写代码之前,确定我们代码的逻辑步骤。例如:
//TODO: 1. 处理定时器逻辑
//TODO: 2. 利用IO复用函数检测socket上的读写事件
//TODO: 3. 处理socket读写事件
//TODO: 4. 处理其他任务
再比如,我们要设计一个 HttpServer,我们可以先规划一些类,例如 HttpServer 类,HttpSession 类,HttpSessionManager 类,HttpConnection 类以及用于客户端的 HttpClient 类等等。
那从哪里可以学习到这些知识?
-
学习设计模式
-
学习面向对象思想
-
学习常用的一些编程范式或者惯用法,如 C++中的 PIMP 。
设计模式的书推荐《大话设计模式》和《图解设计模式》:
《大话设计模式》
链接: https://pan.baidu.com/s/1NfAObPc9jtYAExCvT40a1Q 提取码: jev3
《图解设计模式》
链接: https://pan.baidu.com/s/1H0-9i3lDjYVRlTYCXvjRQQ 提取码: 8nuy
关于系统设计的推荐《大规模 C++ 程序设计》《C++ API 设计》《重构 改善既有代码的设计》等经典书籍:
《大规模 C++ 程序设计》
链接: https://pan.baidu.com/s/12LmOGotS66ea7byw39L-Wg 提取码: 6sqb
《C++ API 设计》
链接: https://pan.baidu.com/s/1ZGWv4_V2qQCbppgW6cF-cA 提取码: ipcv
《重构 改善既有代码的设计》
链接: https://pan.baidu.com/s/134mTlILgv_jRDFclXVqnBw 提取码: ypnr
2. 注重代码风格
代码风格很重要,例如和团队或者已有的风格保持一致。
变量、类和函数等命名要清晰,例如表示名称的变量一般用名词或者形容词、动词过去式修饰的名词等,函数一般用动词或者动词加宾语的结构等。加减乘除等运算符左右各一个空格,有良好的缩进(将 IDE 的 Tab 设置为插入四个空格而不是一个 \t),变量命名以业务背景描述,而不是无意义的字面意思。注释量不少于代码总量 20%,在关键算法或者关键逻辑出给出详细的注释,对于一些存在意外情况暂时不修复的代码加上 TODO 或者 FIXME 标记,对于一些不直观或者很绕的逻辑,加上详细的注释,以方便他人或者之后自己回顾或者 review 代码。
这里涉及的点太多,也最琐碎,推荐基本经典书籍。
-
《代码整洁之道》
链接: https://pan.baidu.com/s/1_m6dRPY0b9I9flF4yEnjdQ 提取码: dg9q
-
《程序设计实践》
链接: https://pan.baidu.com/s/1BYGDfiiBZScf-SCTs3kGgQ 提取码: ti9e
这两本我强烈推荐一下,尤其是对于应届生和写代码年限不长的同学,这两本书的特点是从基本的变量命名、注释、宏定义到一大段代码的设计,详细地给出了最佳代码风格实践。
-
《Google C++编程风格指南》
链接: https://pan.baidu.com/s/12mcbF89o6_Cf2OZ3yqeCFg 提取码: ndxx
3. 注重代码执行效率
例如,查询时使用效率更高的数据结构和算法,减少遍历;循环之前,将循环累计计数先计算出来,而不是每次都计算;减少内存拷贝,减少对象构造等等,使用池化技术(内存池、对象池、连接池等等)。
这一点的话,需要不断的积累,和对一些原理性的东西的理解,例如学习 C/C++ 可以学习下汇编,知道编译器将 C/C++ 代码编译成什么样的机器指令等等。
推荐 :
-
《程序员的自我修养—链接、装载与库》
链接: https://pan.baidu.com/s/1CPv6khHh3ad93w-XN0YXdA 提取码: 8dbu
-
王爽《汇编》
链接: https://pan.baidu.com/s/1YhweuJmYEIMR5rJ_xGYXiw 提取码: fe45
-
《老码识途 从机器码到框架的系统观逆向修炼之路》
链接: https://pan.baidu.com/s/1Aenuk7LY8eVEJ86jqYPHOw 提取码: embr
-
《C++反汇编与逆向分析技术揭秘》
链接: https://pan.baidu.com/s/1eZPw6OlciGHRWNimIHpJXw 提取码: svj9
4. 掌握一些编码原则
例如,定义变量时尽量给一个有效的初始值,释放指针对象指向的资源时,尽量将指针设置为 NULL(对于 C/C++ 程序排查一个空指针问题远比排查野指针问题要容易得多),使用 RAII 技术保证资源在每条出口路径上都会被释放,多线程加锁时,尽量减小锁的粒度,加多个锁时,锁的方向一致,避免死锁等等。
5. 解决问题时,对于原理性的问题,不要面向搜索引擎编程。
很多同学在遇到问题时,习惯上去百度等搜索引擎上去寻找答案,解决问题后,就直接过去了,下次遇到同样的问题,可能又去搜索引擎继续搜索,这样日复一日,功能做了一个又一个,技术毫无长进。建议当我们通过搜索引擎解决了某个问题,如果是原理性的问题,一定要在之后去搞清楚其背后的原理。要记住,解决业务问题,可以帮老板成长,掌握技术原理,才能帮你成长。
6. 多写博客,多总结技术流程和原理
写博客不仅可以锻炼你的表达能力,同时也是在梳理你的技术思路,如果一个技术问题,你不能清晰地给别人讲明白了,说明你也没掌握好。
推荐阅读
我的书单