`
yuanlanxiaup
  • 浏览: 858729 次
文章分类
社区版块
存档分类
最新评论

软件设计—项目管理日记(5)

 
阅读更多

其实这系列文章的第一篇就应该写软件设计,却因为软件设计更需专业,感觉沉甸甸的。所以一直在找资料、看书,验证我的想法的合理性或者修正我的想法。经过两个月左右的不断总结,形成此篇。

我把软件设计分为四个重要部分,产品规划,架构设计,模块设计与编程修养。从各个侧面分析一个产品设计成功所需要的要素。

良好规划。产品有生命周期,在不同的阶段产品的使命不同,或者说根据研发规律来开发产品,不冒进,不迟缓。一家做汽车行业管理软件的公司,他们把一个产品分为七个阶段,具体如下:

  • 第一版,漂亮的包装,专业软件界面,统一操作,专业词条(业务宣传用);
  • 第二版,稳定,实现主要功能(现场应用);
  • 第三版,增强功能,稳定,易用,易维护,便捷升级(业务扩大);
  • 第四版,兼容,容错,易阅读,内部代码重构优化;
  • 第五版,性能优化;
  • 第六版,功能分类萎缩,分类增强;
  • 第七版,补丁,维护版本,团队萎缩,下一代产品酝酿。

从中可以看到产品很明显的成长过程,同时过程中不同的阶段的规律,有计划、有目的的实施研发,使研发过程顺畅合理。在我们的研发过程中,强调功能性能一步到位。殊不知,这对软件设计,特别对复杂的软件来说是及不科学且不现实的。我们的产品,第一版的目标就是功能完备,接下来程序员就像消防队员一样,哪里有火就扑向哪里,进行无休止维护。而我们的产品较为复杂,像下行抄表模块,任务繁多,逻辑复杂,而用户需求各不相同,三个客户一小改动,五个客户一大改动,如果载波厂家有较大变动,我们的程序可能要伤筋动骨。虽然我们的产品和洗车管理软件不同,他的生命周期与我们的产品也不一样,但是我产品也应该有相应该的阶段性使命,尊重并突显研发产品生命过程,就如我们之前所说的过程控制,根据不同的阶段的特点重点把握。根据我们产品及市场需求的特点,我拟定了一个产品开发阶段:

  • 第一版,实现主要功能,稳定,便捷升级(现场挂试);
  • 第二版,增强功能,稳定,易用,易维护(业务扩大);
  • 第三版,性能优化,兼容,容错,易阅读,内部代码重构优化(降成本);
  • 第四版,功能分类萎缩,分类增强,团队萎缩,下一代产品酝酿。

架构设计。最近京东商城后院起火,他用10年前的编程思想无法承载现今数据量的冲击,不是扩硬件,买服务器就可以解决的,所以架构亟需优化和重组。淘宝后台也是四易架构,现在已经达到4.0,满足双11节大流量的压力,相反几大商业银行服务后台却几次宕机。看来架构设计对一个产品的发展多么重要。我们的产品逻辑复杂,功能繁多,特别是用户需求各不相同,每个用户都要有不同的程序来支持,所以我们的产品也需要良好的架构来满足功能扩展和功能个性化修改。有国外研究数据表明,好的构架能减少50%以上的维护工作量。

我认为对我们产品来说好的架构应该做到以下两点:

  • 良好的功能扩展,比如扩展协议或扩展一个载波模块;
  • 各功能模块低耦合;

低耦合就是软件在构造的时候,各个模块、各个功能都不会过度依赖于它周围的环境。只有这样,才能使我们的模块在周围发生变更时不受影响,做到易于维护和易于适应变更。正因为如此,也使它更易于重用到其它功能类似的环境中,提高了重用性。高内聚则使软件中的各个模块能够各尽其能而又充分合作,也就是对于软件问题空间中需求的各个功能,系统可以合理地把它分配给各个模块来共同完成,而不是一个或几个八面玲珑、包打天下的超级类一个人完成。而对于该系统中的某一个模块,具有自己高度相关的职责,即该职责中的几个任务是高度相关的。每一个模块都决不去完成与自己无关职责的任务。

模块化设计。我们已经形成了模块化设计的意识,但是现有产品模块间耦合太强,不适合模块的移植复用。模块化设计应该做到把功能模块做成类似Windows中的插件一样灵活方便。模块化设计不仅指功能模块化,应该把模块化向下延展,达到程序结构的共同,函数共用。因为模块化的目的就是为了功能及代码的复用,降低程序复杂度,使程序设计、调试和维护等简单化,更提高了软件质量。

编程修养。按理论编程修养对个人来说最为重要。软件设计新员工的入职的第一课应该是编程修养。编程修养最基本的要求就是书写格式,正如语言,普通话最易沟通,若每位显其个性,用方言交流,结果会是交流不畅,甚至接收信息错误。编程风格也要有个统一的标准,以便大家交流和后续维护。在大学时我看过林锐博士的《高质量C++编程指南》,比较浅显易懂,也适用于我们。如果说规范书写格式是为了大家的沟通与交流,那么编程修养更深层次的意义就是实现高质量的编程,少出错误。我和张涛沟通,发现平时最容易出问题的是对函数入口参数没有加入口判断,导致一些莫名其妙的结果,很难查,所我们设计了一个函数编写规范,如下:

/*

函数注释

P为入口参数,Q为返回值

*/

INT8U ABC*P*Q

{

INT8U err;

*P*Q有效性判断;

代码;

Return err;

}

在这个规范中,参数与返回值都以入口指针实现,减少使用全局变量,减少代码的耦合性;如有入口参数,必须对入口参数进行有效性判断;返回值为错误代码,易查错。这个规范看似简单,却能把一些隐含的逻辑问题处理在设计过程中,减少不必要的问题,提高编程质量。这个函数规范只是其中一个例子,相信很多人都能做到这些,但是编程需要一惯性,一如继往,一次不留心都可能出错,所以把一些好的习惯整理成规范,时刻遵守更有效果。什么是修养?什么是能力?在我看来,在某种程度上他们是一致的,就是看自己有多少学习的或总结的可为我所用的习惯及技能。在网上看到有人说一个程序员要做到以下几点算好的程序员,拿出来与大家共勉。

  • 有专研精神,勤学善问、举一反三。
  • 积极向上的态度,有创造性思维。
  • 与人积极交流沟通的能力,有团队精神。
  • 写出的代码质量高。包括:代码的稳定、易读、规范、易维护、专业。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics