国庆期间,我以批判性的态度来审视,最近的一个月以来我主导的两个项目当中存在的问题。程序员
项目1:小程序
这个是纯粹网络系统,由多个端组成的,没有界面。网络
得:并发
a. 协议文本化工具
从项目一开始,就说服你们采用文本化的协议,这样便于阅读和理解通讯过程。学习
透明性和可显性大大加强,同事们开始体会到这样作的优点了。测试
这样作增大了编解码的难度,不过是划算的。设计
b. 日志指针
对于多端的程序共同协做来完成某个任务,日志是很是重要的。项目的初期由于没有日志,致使日志
不少本来不该该发生的Bug或者能够避免的Bug。如今你们慢慢养成看Log的习惯。
失:
a. 网络库的选择
在项目中采用libuv库,如今看来多是一个不大不小错误。所以致使如今的代码感受有点不三不四。
为何不直接用Boost当中的ASIO呢!
这样跨平台能力没有受到影响,同时直接采用Boost以后,基本上再也不须要引入其它第三方的库了,
如今的Boost库已经很是丰富了,丰富的都不行了。
b. 测试工具
各类测试工具的开发和使用没有跟上项目的进度,开发人员老是说还有一点小问题,彷佛没有尽头。
项目2:
项目2的开发时间已经不短了,可是随之而来的多方面的问题却愈来愈严重。
国内大多数程序员的有一个毛病,即设计能力大大超越了他们实现和排错的能力,一旦出现问题颇有可能依靠他们的能力没法解决,如今的这个项目遇到了这个问题。
所以在9月28日,内部开会决定重构。
如何重构呢?我提出了几条原则和想法。
1. 利用Erlang思想,移植到C++的项目当中
学习过Erlang以后,我真的很是佩服设计Erlang的那帮人,在上个世纪八十年代就开始考虑如何进行多核并发的问题,他们真的超越了那个时代。
我从Erlang的思想库中引入两条:
I. 多进程
II. 文本化的消息
多进程和文本化的消息其实都不是Erlang首创,但Erlang是把它发挥到极致的。
我反对将程序写成一个庞然大物,我更喜欢直接拆分红不少能够独立调用的小程序,这样一来,不少小程序能够进行独立的替换和测试,而不影响全局。
多进程的作法,骨子里其实仍是Linux/Unix思想,即”Do one thing, Do it well”。
2. 消息模型
从新认识消息模型,原先的代码中,处处都是充斥着指针,各类由于指针引的崩溃。这里我还要说Erlang的思想。
其实Erlang的思想很好理解,说白了就是把人类的并发模型移植到计算机当中,人类社会是如何并发的,Erlang里面就怎么并发。
好比,一个团队在作一件事情,这就是一个小规模的并发模型,每个人如同一个独立的模块,这些模块之间的协同工做是依靠说话的方式,计算机术语叫消息。
每一个人都有独立的运算单元及独立的内存,人与人之间的协同,是不可能把一我的头脑中的一片内存指针分享给其余人的。协同全面依靠消息,这就是Erlang的并发模型。
因此,咱们在重构时,要把握这点,模块之间尽可能采用消息的模型,而不是用指针。
模块是一个相对的概念,能够是一个类也能够是一个lib还能够是一个dll或者是其它什么,只要是逻辑上相对独立的东西,就能够称为模块。
更进一步,能够把Qt当中的信号和槽理解成另类的收发消息的机制,这样一来类与类之间的沟通就变成消息的通知。
所以,模块之间的耦合性降到最低了。
对于这个项目,2013年国庆将是明显的分界线。