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

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

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

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

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

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

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

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

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

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

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

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

/*

函数注释

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

*/

INT8U ABC(*P,*Q)

{

INT8U err;

*P、*Q有效性判断;

代码;

Return err;

}

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

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

软件设计—项目管理日记(5)相关推荐

  1. 《挖掘管理价值:企业软件项目管理实战》一2.4 软件设计过程

    本节书摘来异步社区<挖掘管理价值:企业软件项目管理实战>一书中的第2章,第2.4节,作者: 徐勤 责编: 杨海玲, 更多章节内容可以访问云栖社区"异步社区"公众号查看. ...

  2. 信息系统项目管理师自学笔记(八)——软件设计

    2.4 软件设计 从工程管理角度来看,软件设计可分为概要设计和详细设计两个阶段. 概要设计也称为高层设计,即将软件需求转化为数据结构和软件的系统结构.概要设计主要包括设计软件的结构.确定系统由哪些模块 ...

  3. 软件需求分析学习日记(一)需求工程概述

    软件需求分析学习日记(一)需求工程概述 文章目录 软件需求分析学习日记(一)需求工程概述 1.1需求工程的重要性 1.1.1几点说明和描述 1.1.2不适当的需求过程所引起的风险 1.2什么是软件需求 ...

  4. 软件外包项目管理的经验感悟

    自2003年参加工作至今,一直在参与软件外包项目.从程序开发人员到设计人员,再从设计人员到项目组长.项目经理,风风雨雨走了将近8个年头. 这期间经历了大大小小数十个项目,对项目和项目管理的认识也从无到 ...

  5. 现在流行的源程序版本管理软件和项目管理软件

    现在流行的源程序版本管理软件和项目管理软件有: 1.  Microsoft TFS 2.  Github 3.  SVN 4.  Coding 他们各自的优缺点是: Microsoft TFS: 优点 ...

  6. 蠕变断裂 ansys_如何避免范围蠕变,以及其他软件设计课程的辛苦学习方法

    蠕变断裂 ansys by Dror Berel 由Dror Berel 如何避免范围蠕变,以及其他软件设计课程的辛苦学习方法 (How to avoid scope creep, and other ...

  7. 现代软件工程 第十一章 【软件设计与实现】 练习与讨论

    1  如何避免在产品开发后期不断有重大修改,导致其它模块的连锁反应? DCR Tell mode vs. Ask mode设计变更 在项目早期,如果大家觉得要做一个设计变更,便可以采用告知模式(Tel ...

  8. 《大话软件工程—需求分析与软件设计》,给出了分析与设计过程中需要的理论、方法、工具和标准

    □ 做好一款软件从哪里开始呢?→ 客户需求的调研: □ 一款软件的价值高低由哪个环节决定呢?→ 软件的分析与设计: □ 软件顺利完成开发靠什么?→ 高效的项目管理: □ 软件开发的主要角色?→ 客户. ...

  9. 我的敏捷、需求分析、UML、软件设计电子书 - 下载(持续更新中)

    我将所有我的电子书汇总在一起,方便大家下载!(持续更新) 文档保存在我的网站--软件知识原创基地上(www.umlonline.org),请放心下载. 1)软件设计是怎样炼成的?(2014-4-1 发 ...

最新文章

  1. eclipse+android source code
  2. jqurey datatables属性
  3. BZOJ 4516: [Sdoi2016]生成魔咒 [后缀自动机]
  4. .NET 社区 NB,2019 中国 .NET 开发者峰会
  5. 少儿编程100讲轻松学python(九)-python如何判断字符串是否为整数
  6. LeetCode - 题 70 跳台阶 - 具体思路与python解法
  7. 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.6.2 使用StAX解析器
  8. matlab求两向量夹角_Matlab-自动化控制系统设计4频域分析
  9. 小微企业——信用风险与放款原则分析
  10. 学习J2ME需要掌握的七种技术
  11. U盘安装系统 从此告别光盘
  12. 谷歌浏览器加载外部 DLL 文件 关于chrome上的网银安全控件开发技术(chrome 调用本地dll)
  13. docker进阶(1):使用cAdvisor监控容器
  14. 有人把李白杜甫一生的旅行足迹做了地图,发现了大事!
  15. CDH集群更换ip,主机名
  16. Mac共享主机网络给虚拟机
  17. 写给我的客户da辉狼
  18. 基于JSP的汽车租赁管理系统的设计与实现
  19. SIM卡中UCS2编码的三种格式(80,81,82)分析
  20. windows下Ardupilot编译环境搭建

热门文章

  1. tiup dm prune
  2. 2018年河南省对口升学计算机基础答案,河南省2018 年计算机类基础课 对口升学考试题.doc...
  3. OERu使大学教育负担得起
  4. ubuntu 桌面卡死 解决方法
  5. Damn Vulnerable DeFi靶场实战(11-13)
  6. php mysql 随机字符串函数是_PHP 生成随机字符串的方法函数, 默认长度6位 字母和数字混合件...
  7. 揭秘苹果耗时半年修复的OS X漏洞
  8. 正则中文标点符号打包出错
  9. Redis 中数据的持久化
  10. 【转】关于SHSH破解