软件工程是将工程化的方法应用到软件研发中。软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。
而核心的工程学思想又是什么呢?
如果从系统工程学来讲即任何事物的发展都有规可循,事物发展经历一个特定的生命周期过程,从最初的概念构思,到设计,到生产最终形成最终的产品。即事物发展有特定的阶段和过程,相互之间还相互制约和影响,最终形成我们期望的产品。对应到软件研发,即我们常说的软件生命周期模型。
核心的工程学思想仅此而已,而随着软件研发和管理进步,发现仅仅有工程学的思想并不能高质高效的研发出我们需要的产品,因此在此基础上融入了管理学知识和支撑质量管理思想。如果对应到CMMI即是项目管理过程域和支撑保障过程域。而CMMI相对于CMM更加强调了IPPD集成化产品研发的思想。
软件工程兴起是为了解决软件危机的问题,针对大规模复杂软件的研发,针对高精度和高质量的软件研发。而针对大型软件任何一个人都不可能成为各方面的专家,产业化必然趋势就是更加喜欢的分工。但是分工后带来的是更多的协作和过程,因此为了保证软件研发成功和质量,需要对所有的控制环节都进行控制,需要将软件周期阶段划分的足够细化,同时进度,成本相关问题重要性则进一步弱化。
工程学思想要的就是严谨。希望将软件开发过程按部就班的流水线化,变得任何一个步骤或动作都有章可循,都可以严谨和量化定义。但是现实往往并非如此,软件开发的主体是人而非简单的机器,这就导致了软件过程本身很难做到完全的标准化和量化可控。
正是这个原因逐步出现了软件工艺的概念。
那我们再看看工艺本身的定义,工艺(Craft)是劳动者利用生产工具对各种原材料、半成品进行增值加工或处理,最终使之成为制成品的方法与过程。
制定工艺的原则是:技术上的先进和经济上的合理。由于不同的工厂的设备生产能力、精度以及工人熟练程度等因素都大不相同,所以对于同一种产品而言,不同的工厂制定的工艺可能是不同的;甚至同一个工厂在不同的时期做的工艺也可能不同。可见,就某一产品而言,工艺并不是唯一的,而且没有好坏之分。这种不确定性和不唯一性,和现代工业的其他元素有较大的不同,反而类似艺术。
而软件工艺思想的提出,其核心是在强调不是人人都在做大型复杂和高精度的软件,重过程有其适用场景也有其不适用的场景。其二,软件开发的核心是人,人不是机器,人的思维和主观能动性对软件开发的成败仍然作用巨大;其三,小作坊也可以产生赏心悦目的产品,软件除了科学还有艺术。
软件是一个复合体,应该是科学和艺术的结合,工程学和工艺学的结合。
在生产管理中我们可以看到,我们可以用工程学的思想设计和定义我们的生产线,但是我们却更加需要工艺学的思想设计生产工艺,以保证生产过程足够的灵活性,柔性和适应客户对产品的要求。产品不是千篇一律,毫无生命力,产品也不是流水线一固定就一成不变,而引入工艺学正是将僵化的生产线融入了更多的成本性,经济学,适用性,人员技能等各方面的情况考虑和综合评估。
在没有提出软件工艺思想前,软件工程学认为工程学是一成不变的,是可以解决所有软件研发问题,工程学的一套方法并不会太多的考虑客户的需求,软件的领域,人员的技能,项目目标要求等诸多内容。而为了保证工程学思想的严谨,工程学将所有无法把握和预测的内容都作为了工程学基本的入口假设。它们假设需求一开始就清楚的,需求是不会变化的,人员的技能是满足的,客户的需求是可以无偏差传递的等等。
为了应对这些现实的问题,我们引入了敏捷思想和敏捷软件开发过程。对于敏捷方法我们一直再看,其核心思想究竟有哪些。
敏捷思想第一点是肯定了人在软件开发中的核心价值,如果不是这样那么软件开发就是传统工厂,软件生命周期就是流水线,软件过程也应该是全自动化的过程。但是事实并不是如此,对于软件开发,如果一群新手在一起,即使有再好的工程学思想也无法开发出高质量的软件。
敏捷思想第二点是证实了软件研发过程中的不确定性,认可了需求是可能存在变化的,认可了我们开始并不能完全地预测和认知一切。变化是绝对的,那么我们剩下的就是适应变化。为了适应变化我们进行快速原型,短周期迭代,通过适应变化我们将浪费降低到最少的精益思想。
敏捷思想的第三点是我们在管理方法上的进一步改进,我们认为软件项目管理其核心是对人的管理,软件项目管理应该以人为核心展开,因此首先强调自我的管理,强调在个人高度自治下的自适应团队。过程的敏捷来源于使用过程的人的敏捷,而非过程本身。同时我们借鉴其他管理学经验,认为管理应该是可视化的,而不是一个黑盒,在此我们将任务可视化,进度可视化,结果可视化。而看板可能仅仅是我们借鉴的一种思路。
软件开发应该是工程学和工艺学的融合
工程学关注科学,技术和方法工具;而工艺学根据关注人,学习和自适应。工程学关注最终高精度的产品,工艺学关注外部的环境,人,需求对工程的影响。工程学希望系统化地解决一切问题,工艺学希望充分发挥人的主动能动性,采用不同的方法灵活应对各种问题。工程学培养的是机器和螺丝钉,而工艺学培养的是让产品发挥生命力的匠人和大师。工程学循规蹈矩和严谨科学,而工艺学则以人为本体现软件艺术之美。
软件工程不应该抱着将软件开发工厂化和机器化的思想;而软件工艺也不能完全抛弃工程,将软件单纯地看做一个艺术品。工程和工艺思想的结合,过程和人的结合是不二选择,而不能从一个极端走到另外一个极端。
软件工艺部分思想整理
软件工艺是我比较钟爱的一本书,虽与传统的软件工程思路有出入,但里面有很多思想&思路可以借鉴。其实软件工艺和软件工程并不矛盾和敌对。项目的特点不同,周期不同,我们在做项目的时候确实应该采用不同的策略和方法论。其目的只有一个就是保证项目成功和按期交付。
软件项目中人始终是最重要的因素,这是软件项目管理和其它工程项目管理的一个重要区别。忽略了人的因素很难管理好项目。我们离CMMI5级还有距离,离软件工厂还有距离,如果真正能够实现软件工厂,说明某阶段工作可以自动化,这时候可以不考虑人的因素。否则必须考虑到人对项目的重要影响。
优秀设计开发人员和一般人员之间生产率存在6-10倍甚至更大差距,这一点不容置疑,但往往我们很难给优秀人员2倍甚至更高的薪水,但投入和回报无法成正比的时候,很难留住优秀的人才,很难让优秀人才保持搞得责任感和工作热情。
任何工程或文档都无法替代沟通和交流。面对面的沟通是最高效直接的方式。任何一个团队在没有经过前期多年磨合,形成团队词汇表之前不要轻易启动远程协同。这个已经不是简单的沟通效率问题,也是无法形成团队文化认同感的问题。
决定项目成败的一个重要因素是项目中各个成员的知识,技能和经验。不可能每个项目都有天才,但我们需要每个项目成员都是合格,胜任的人员。
以师带徒是新成员成长和技能提升的最佳方式,任何组织级培训计划和执行都无法代替以师带徒模式。如何面试和挑选合适的项目成员是一个需要重点关注的问题,否则会浪费老师大量时间,得不偿失。
中小型的项目更适合敏捷开发和增量迭代,这样可以更好地应对变化,以更快速的方式交付用户满意的产品。应该为测试和维护而设计,但往往需要达到这样的水平需要开发人员有多年的经验和知识的积累。
活到老学到老,在完成项目工作的过程也是自我不断学习和知识积累的过程。
,