软件工程能力之思:什么是软件工程
本文是《软件工程能力之思》这个系列中的第一篇文章,将介绍什么是软件工程。在此我想着重讲三个方面,即:软件工程的定义、为什么软件工程如此重要,以及软件工程对个人发展的作用。当然,笔者也是通过学习前辈们的经验以及一些大公司的方法论,结合自己的学习理解和思考,难免有不足之处,也期望有看见此博文的同道指点交流。
在谈什么是软件工程之前,我想看说说什么是“工程”,以及由此引发的“理科”与“工科”的差异。理科是基础性的科学,旨在研究自然界中的各种规律和联系,如数学、物理学、化学、生物科学、天文学、电子信息科学和环境科学等。简而言之,它是科学范畴。而工科呢,它是应用基础科学的原理,结合生产实践开发出来的技术,所以,工科,研究的是技术范畴。那与之对应的科学家思维和工程师思维又有哪些差异呢?这里引用万维钢《精英日课第三季》中《计算机思维4:工程的复杂》的比较:
第一,科学家是寻找事物的规律,而工程师是去设计一个东西。科学家只要觉得这个规律有意思就可以发表,而工程师得负责任。他得确保这个东西不但要有用,而且还得安全不出事,还得考虑成本,讲究可行性,让人用得上还用得起才行。
第二是对知识的态度。科学家面对知识,是把自己当成一个没有利益攸关的旁观者,感觉看懂了、能总结出规律就行。而工程师,则是参与者。他不能仅仅“懂”这个知识,他是要拿来用的。
第三是对模型的使用。科学家喜欢简化的模型,能抓住实质就行 —— 爱因斯坦有句名言说“什么东西都要越简单越好,要简单到不能再简单为止”。而工程师必须考虑所有的细节,“魔鬼在细节中”是工程师的座右铭。
顺带说个题外话,如果按抽象程度来排个序,可以简单这么表示:技术<科学<哲学<艺术。所以我们也常讲,技术是实践,科学是理论思维。而哲学、艺术还太过高深,不敢言述,不过善友老师常见的哲科思维,可见科学与哲学还是存在内联的,但望日后慢慢悟道。
那软件工程呢?我觉得可以这么描述:用工程化的方法去规范软件开发流程,让项目(产品)可以按时完成、成本可控、质量有保证。
那软件工程的角色和流程有哪些呢?就角色来讲,有:项目经理、产品经理、程序员(前端、后端、客户端)、UI/UX、测试、运维等。需要说明的是现在的软件工程模式中,又引入了其他相关的角色,如架构师、用户、客户、市场等等。从流程上讲,注意分为几个阶段:需求定义与分析、设计、实现、测试、交付和维护。对参与的人及整个过程的管理,即我们称之为“项目管理”。所以,基于软件过程,我们有了角色分工,有了对过程的管理和工具,对过程中每个阶段细分的方法学和工具。
那官方是如何定义软件工程的呢,具体如下:
Software engineering is the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software.
即:“软件工程是把系统的, 有序的, 可量化的方法应用到软件的开发, 运营, 和维护上的过程。” 结合《谷歌的软件工程》的说法,软件项目一般分为两种,一种叫programming,另一种叫software engineering。具体区别有:
- programming 指短期任务,比如一次性的脚本,一次性的算法题目,学校里的项目等等;一种是 software enginnering,要考虑你的项目要长期存活,所以要认真地考虑“时间”这个要素对软件本身的影响。
-
SE 核心要考虑的是项目的能力,即修改的能力、升级的能力等等,即使你不去做变动,也应该有这些能力。programming 不需要考虑这些。
-
programming 一般都是一些单人任务,而 software engineering 是团队作战。
- SE 要考虑项目的可持续性,比如各种重复劳动(repeated work)的可扩展(scale)问题,不能让你的项目的开发维护人员随着请求数/用户数增长而线性增长。
大家应该听说过“程序=数据结构+算法”这句话。那如果也用简单的公式表示的话,我个人对软件工程的理解可以表达为:软件工程=技术+方法+流程。
作为一名软件开发工程师,如何看待软件工程呢?想必每个人都有不同的理解。并且因为不同的领域,不同的企业对软件的作用也并不一致。比如在当前流行的互联网公司,就非常注重软件工程能力,因为他们需要处理的计算量和数据量已经达到了非常惊人的地步。只有对软件工程进行细化管理,才能开发出大型的软件以支撑业务的发展。对于世界一流的软件企业,软件科学、软件工程的作用非常大,因为这些企业普遍具有崇尚科学、工程的价值观和企业文化,逻辑是这样的:没有内部成熟的软件工程管理,他们不可能超越几乎所有对手,研发出如此复杂、如此精妙的世界一流、领先的技术和产品。
《人月神话》的作者布鲁克斯在上世纪六十年代末率领IBM公司300人的团队开发操作系统后,总结了他做完这件事之后两点感慨:
1个人干12个月的活,绝对不是12个人在1个月内能干完的。项目用的程序员越多,平均每个人出活的速度就越慢。所以你规划项目的时候不要算什么“人月”。
你这个团队做出来的软件的结构,往往和你这个团队的人员组织管理结构高度相似。所以软件工程不但要管项目,还要管人。
可见,软件工程不仅要管事,还要管人。而人永远是计算机技术中最强大却又最薄弱的一环。布鲁克斯曾在文章《没有银弹》中讲过:软件工程的根本问题,是人的问题。主导软件开发的这个人,必须得能够理解高度复杂的东西才行。现代软件工程要求,软件产品必须达到下面这五个目标,称之为”DRUSS”:
Dependable,可信赖,让顾客真能指望上你这个软件;
Reliable,得可靠,不能总出毛病;
Usable,软件是给人用的,得让人能够上手;
Safe,用的时候不能出安全事故;
Secure,它得不容易被黑客攻击才行。
而作为一名普通的软件工程师,唯有时刻谨记前辈们的经验教导,做到”惟精惟一”地专心致志,才能在这个软件工程如此复杂的世界留有生存之道。在以往的学习中,也发现了一些非常不错的资料推荐阅读扩展:
(1)邹欣《现代软件工程》教学博客:https://www.cnblogs.com/xinz/
(2)万维钢精英日课《计算机思维4:工程的复杂》:https://www.dedao.cn/article/yNwelz6kDn0aKeRx5BV7qLAO3Bb51j
(3)《Google软件工程之道》译文:https://mp.weixin.qq.com/s/0fSDxGmMfvIzFNunJ21I2A
(4)北京大学《软件工程》公开课:https://www.coursera.org/learn/ruanjian-gongcheng
(5)《许式伟的架构课》专栏:http://gk.link/a/10IcS
(6)阮一峰《软件工程的最大难题》博文:https://www.ruanyifeng.com/blog/2021/05/scaling-problem.html