(一)软件工程导学 —— 软件工程师与软件工程团队
南京大学软件工程导学课:《软件工程导学》
文章目录
软件工程师是干什么的
我们或多或少都听过软件工程师这个称谓,但是软件工程是具体是干嘛的呢?根据坊间或者网络灌水论坛,可以得到一些信息,软件工程师具有以下特征:
- 是互联网时代的弄潮儿,接触新鲜技术
- 是码农,是程序猿
- 多金,工资高
- 工作单调,每天写代码
- 工作环境舒适,坐办公室的
- 天天加班,996
等等,以致于矛盾的特征,都是坊间对软件工程师的评价。
这里抛出一个结论,上面说的都是事实,但又不是全部的事实。
看完下面的东西。每个职业扮演的角色,也就明白了。
软件工程的目标
了解软件工程师,首先来搞懂软件工程。
软件工程,重点在工程二字上。按照科学的定义,工程:应用科学的方法,在成本效益比 有效的方式下,建立一个机器,解决针对性的现实世界的问题。
有了工程的定义,我们看软件工程,就可以理解了,软件工程是开发软件来解决实现世界的问题的。
比如已经有的软件,word
解决文书工作问题,导航
解决日常出行问题。
但是我们这是事后的眼光看待问题的,因为,无论是 word
还是 导航
都已经被发明出来了。
如果在事前,那么问题是不好被发现以及处理的。就好比 导航
出来之前,人们都是买地图使用,但是鲜有人能发现需要 导航
这个东西出来解决出行问题,等到 导航
被发明出来以后,人们发现,哦,原来我就需要这个东西,比地图方便易用。
从事前的眼光看待问题,就是软件工程需要处理的问题。
因此软件工程处理的问题,也就是目标,一般有如下特性:
- 有一定的难度,每个问题都是新的,不清楚的,因为在你做之前,鲜有人做。
- 需要处理的问题很广,你能解决某个领域的问题,那么我们假设你也能解决另外一个领域的问题。所有你需要处理的问题很广。
基于这两种原因,软件工程中专门分出一类人,来处理这个问题,他们是需求工程师,或者需求分析师,或者你熟悉的产品经理,这几种称呼,描述的一类人。
产品经理
划分出产品经理(需求分析/工程师)的愿景是,帮助软件工程解决上述的2个问题。
因此,产品经理的职责是:专门负责与现实问题打交道,专门负责发现问题、处理问题、确定问题的业务解决方案。
简答说,你要发现用户的问题(痛点)、帮助他们解决这个问题,给出一个业务解决方案。比如,你要发现用户天天使用地图,何不开发一个机器来专门做这件事,而非每次带上纸质地图。
这里的业务解决方案,需要注意下,与工程解决方案不一样,它不关心软件的内部细节,如何实现,它只关注现实问题,如,关注用户的成本等。
再回到工程的定义 (应用科学的方法,在成本效益比 有效的方式下,建立一个机器,解决针对性的现实世界的问题) 上,其中问题被丢给了产品经理。相当于起点被解决了。那么问题的终点,创建一个机器,这个机器呢。
按照其他行业,针对某个问题,出做出个具体的机器来针对性的解决,那么这个机器就是计算机,但是这个计算机只是通用的计算机,因为软工面临的问题很广,为每个问题创建一个针对性的计算机是不现实 的。
软件工程中有一种 软件抽象解决方案 ,用于解决这个问题。通用的计算机+软件抽象解决方案,以此来解决特定问题。
说的大白话一点,就是计算机上装个特定软件,然后解决特定问题。
软件工程的任务
分为 本质性工作 和 附属性工作 。
其中本质性工作,也就是 开发,附属性工作也就是 安装。这里的开发与安装,与我们通常理解的不是一回事,开发指的是拿出一套软件抽象解决方案,需要先分析,再设计。安装指的是,将无法落地的软件抽象解决方案落地,也就是进行编码、测试工作。
并且开发工作是永远无法避免的,是困难的,注意这里的措辞永远。因为新问题层出不穷,需要新的解决方案,就需要新的分析、设计。所以说开发是永远无法避免的,而且还难。而安装,则可以通过各种工具、方法使得其变得简单。比如你二十年前写代码和现在写代码,一定是现在写代码更简单些,各种框架层出不穷,解放生产力。但是面对新问题的分析,无论二十年前还是二十年后的今天,都是一样的,需要独立的分析、设计,没有工具和方法避免。
上文已经提到,开发主要是指:分析、设计。其中具体含义如下:
分析,是产品经理经过对问题的分析,拿出业务解决方案。
设计,则是将业务解决方案回归到工程解决方案。
这里的设计,有好几类工作的划分。
xxx设计师
设计师,一个团队的标配是:人机交互设计师、体系架构设计师、详细设计师。
其中详细设计师一定是程序员,也就是需要扎实的编程经验,但是不是所有的程序员都是详细设计师。
上面提到的是标配,但是在某些复杂问题下,还有许多其他设计师出现,如网络环境比较复杂,则需要有网络设计师;如果安全很值得关注,则还需要安全设计师,等等。
程序员
附属性工作的编码,就是程序员做的。按照设计师的设计,完善细节。
测试人员
附属性工作的测试,就是测试人员做的。
主要是按照,产品经理当初给出的业务解决方案,测试程序员编写的程序,是否满足需求,如果不满足,则说明这中间有问题,或者理解出现问题、或者出现bug了。
项目经理
再回到工程的定义,其中有个 成本效益比,整个开发+安装过程,我们需要注意生产的控制:对时间、成本、质量的把控,这关乎软件开发的成败。
对时间、成本、质量进行把控,一般都是由项目经理做的。
辅助管理人员
如果项目很庞大,一个项目经理是不够的,就需要其他人员来帮助管理,如配置管理人员、生产管理人员,他们虽然挂着管理的名头,但是不是管理层,和开发、测试等属于一个级别。相辅相成。
软件工程师是干什么的
最后再次回到这个问题,我们发现,我们大概可以回答了。
我们发现。软件工程师根本不是具体的,至少可以细分为,产品经理、设计师、程序员、测试、项目经理。
而之前的那些平价,对应于其中,所以那些都是事实,但又不是所有的事实;比如高薪,那么产品经理、架构师、项目经理的,说到加班、996,青春饭,那可能是普通的程序员。
软件工程的三驾马车
它们是软件工程中最重要的三个角色。
产品经理
是产品的灵魂、把控整个产品的方向、定义产品实现的细节、构建业务解决方案。
-
把握方向
之所以,说它们是产品的灵魂,把控产品的方向,是因为他们掌握着产品的最终目标,最终产品是这个什么样,全是产品经理把控的。
好比淘宝和京东,二者的产品经理的目标就不一样,一个是做自营、一个是做电商的平台。
产品经理为了把握好目标、方向,会进行一些假设、然后拿出原型,根据反馈,再评估下方向是否合理。这里面有许多方法,比如目标、利害关系人、场景等分析,这里仅是导学课,老师没展开讲。
-
定义细节
总之产品经理很重要!!!一个好的产品经理更是少见。他们的工资是高的,他们也不用写代码,码农跟他们不搭嘎,但是他们需要写 文档。
如果需要一个好的产品经理,但是又找不到这样的,可以使用 team
来弥补下,就是建立一个产品团队,用一个团队来弥补个人的欠缺。
架构师
决定产品的质量,是整个团队的技术权威
凡是技术问题不会的,都可以去找架构师,这个技术问题,包括程序员以及测试人员的技术问题。
架构师需要 经验、知识、天赋,其中经验占比重最大。一个好的架构师也是很难得的。
同样的高工资,与产品经理有的一拼。
写关键代码、困难代码、文档。
如果找不到一个好的架构师,同样可以使用 team
弥补下。
项目经理
协调整个团队,具有领导力、领导、团结、激励大家
是一个决策者,需要决策团队的选择。
是问题的解决者,当出现问题的时候,而非去寻找产生问题的人,然后去处罚。
讲究激励团队,而非处罚。在软件工程中,命令与惩罚无效。因为程序员可以做在电脑面前一整天,但是一行代码不写。
因为需要决策,特别是在一些出现重大问题的情况下,做出决策,需要承受一定的 压力。
也比较 忙,因为需要计划、跟踪、监控整个团队的进度。
其他角色
人机交互设计师
主要是交互。使得软件具有以下特性:
- 易学习,自然工作(word)
- 高效工作(扫描收银)
- 低记忆负担
- 避免错误
- 吸引眼球
- 使用方便
需要一定的美学,还要了解行为,基本不需要会写代码。
程序员
软件开发中的中流砥柱。
一般具有如下特性:
- 要具有抽象能力
- 逻辑思维要强
- 算法能力(这条是普通程序与高级程序员的划分,也是薪水的划分)
不同的程序员的生产效率比能有 20:1
这么大,但是二者之间的薪水差距要小的多。
有的代码需要创造性,需要高级程序员(算法),但是85%
的代码是重复出现的,因此在软件开发中,接触高端技术、需要创造性是少数。
普通程序员,是比较吃青春饭的,对软件工程师的吃青春饭的印象,一般是这类程序员留下的。同时,他们的工资也一般,以代码为生,讨厌写文档。
发现了吗。写文档的工资比写代码的高。写文档的更赚钱。
软件测试
首先,测试不是像用户使用软件那样,用鼠标点几下就好了,测试也是需要写代码的,测试代码。
测试,以前是完备性测试,测试有效性,但是好多情况下,完备性是测不完的,太多种可能了,后来改为缺陷性测试,只要测出来的 bug
越多,则代表隐藏的 bug
越少。
地位、工资与程序员差不多。但是一直在测试,没有程序员写代码创造有成就感,有点枯燥。
同时地位比较尴尬,测出来的 bug
多,程序员头疼,测出的 bug
少,自己头疼。
维护工程师
这里的维护,不是其他行业的维护、保养的意思。而是增值、附加值、修改等意思,为软件添加新功能、修复 bug
。
地位比较尴尬,不受重视,成就感低,比如,程序员去找工作的时候,本能的找开发岗,而不去找维护岗。高级的程序员会被调去开发,而非维护。
工资与程序员差不多,有时候还低。
但是干的活,还比较难,因为需要理解、甚至修改别人的代码。写代码的都知道,看别人的代码是怎么样的体验。
但是行业调查发现,维护工程师确是软件工程从业者最多的行业,说明维护软件的成本很高。