软件工程=最佳实践
软件系统的复杂性、动态性使得:
– 高深的软件理论在软件开发中变得无用武之地;
– 即使应用理论方法来解决,得到的结果也往往难以与现实保持一致;
因此,软件工程被看作一种实践的艺术:
– 做过越多的软件项目,犯的错误就越少,积累的经验越多,随后作项目的成功率就越高;
– 对新手来说,要通过多实践、多犯错来积累经验,也要多吸收他人的失败与教训与成功的经验。
——当你把所有的错误都犯过之后,你就是正确的了。
在软件工程师试图解决“软件危机”的过程中,总结出一系列日常使用的概念、原则、方法和开发工具;
这些实践经验经过长期的验证,已经被证明是更具组织性、更高效、更容易获得成功;
大部分的这些实践都没有理论基础。
“最佳实践” :沟通阶段应做的事情:
– 识别出你需要与客户方的哪些人沟通;
– 找出沟通的最佳方式;
– 确定共同的目标、定义范围;
– 评审范围说明,并应客户要求作出修改;
– 确定若干典型场景,讨论系统应具备的功能/非功能;
– 简要记录场景、输入/输出、功能/非功能、风险等;
– 与客户反复讨论、交换意见,对上述内容进行细化;
– 与客户讨论,为最终确定的场景、功能、行为分配优先级;
– 评审最终结果;
– 双方签字;
软件工程的核心概念
复用(Reuse)
在一个新系统中,大部分的内容是成熟的,只有小部分内容是全新的。
构造新的软件系统可以不必每次从零做起;
直接使用已有的软构件,即可组装成新的系统;
复用已有的功能模块,既可以提高开发效率,也可以改善新开发过程中带来的质量问题;
分而治之(Divide and Conquer)
将复杂问题分解为若干可独立解决的简单子问题,并分别独立求解,以降低复杂性;
然后再将各子问题的解综合起来,形成最初复杂问题的解。
折中(Trade-off)
不同的需求之间往往存在矛盾与冲突,需要通过折中来作出的合理的取舍,找到使双方均满意的点。
例如:
– 在算法设计时要考虑空间和时间的折中;
– 低成本和高可靠性的折中;
– 安全性和速度的折中;
核心问题:如何调和矛盾( 需求之间、人与人之间、供需双方之间,等等)
演化(Evolution)
软件系统在其生命周期中面临各种变化;
核心问题:在设计软件的初期,就要充分考虑到未来可能的变化,并采用恰当的设计决策,使软件具有适应变化的能力。
即:可修改性、可维护性、可扩展性;
NFP :Non-Functional Property 非功能特性、性能特性
– 例如:完备性、正确性、健壮性、可靠性、效率、可用性、可维护性、可移植性、清晰性、安全性、兼容性、经济性、商业质量等。