国庆期间,我以批判性的态度来审视,最近的一个月以来我主导的两个项目当中存在的问题。
项目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年国庆将是明显的分界线。