回顾最近项目中存在的问题

国庆期间,我以批判性的态度来审视,最近的一个月以来我主导的两个项目当中存在的问题。

项目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年国庆将是明显的分界线。

posted @ 2013-10-04 15:17  Russinovich`s Blog  阅读(1721)  评论(10编辑  收藏  举报