当前位置: 首页 > Go语言, 代码艺术, 工程能力 > 正文

软件工程能力之思:什么是软件工程

本文是《软件工程能力之思》这个系列中的第一篇文章,将介绍什么是软件工程。在此我想着重讲三个方面,即:软件工程的定义、为什么软件工程如此重要,以及软件工程对个人发展的作用。当然,笔者也是通过学习前辈们的经验以及一些大公司的方法论,结合自己的学习理解和思考,难免有不足之处,也期望有看见此博文的同道指点交流。

 

在谈什么是软件工程之前,我想看说说什么是“工程”,以及由此引发的“理科”与“工科”的差异。理科是基础性的科学,旨在研究自然界中的各种规律和联系,如数学、物理学、化学、生物科学、天文学、电子信息科学和环境科学等。简而言之,它是科学范畴。而工科呢,它是应用基础科学的原理,结合生产实践开发出来的技术,所以,工科,研究的是技术范畴。那与之对应的科学家思维和工程师思维又有哪些差异呢?这里引用万维钢《精英日课第三季》中《计算机思维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



这篇博文由 s0nnet 于2021年03月23日发表在 Go语言, 代码艺术, 工程能力 分类下, 通告目前不可用,你可以至底部留下评论。
如无特别说明,计算机技术分享发表的文章均为原创,欢迎大家转载,转载请注明: 软件工程能力之思:什么是软件工程 | 计算机技术分享
关键字: ,

软件工程能力之思:什么是软件工程:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter