(一)软件工程导学 —— 软件工程师与软件工程团队

南京大学软件工程导学课:《软件工程导学》


软件工程师是干什么的

我们或多或少都听过软件工程师这个称谓,但是软件工程是具体是干嘛的呢?根据坊间或者网络灌水论坛,可以得到一些信息,软件工程师具有以下特征:

  1. 是互联网时代的弄潮儿,接触新鲜技术
  2. 是码农,是程序猿
  3. 多金,工资高
  4. 工作单调,每天写代码
  5. 工作环境舒适,坐办公室的
  6. 天天加班,996

等等,以致于矛盾的特征,都是坊间对软件工程师的评价。

这里抛出一个结论,上面说的都是事实,但又不是全部的事实。

看完下面的东西。每个职业扮演的角色,也就明白了。


软件工程的目标

了解软件工程师,首先来搞懂软件工程。

软件工程,重点在工程二字上。按照科学的定义,工程:应用科学的方法,在成本效益比 有效的方式下,建立一个机器,解决针对性的现实世界的问题

有了工程的定义,我们看软件工程,就可以理解了,软件工程是开发软件来解决实现世界的问题的。

比如已经有的软件,word 解决文书工作问题,导航 解决日常出行问题。

但是我们这是事后的眼光看待问题的,因为,无论是 word 还是 导航 都已经被发明出来了。

如果在事前,那么问题是不好被发现以及处理的。就好比 导航 出来之前,人们都是买地图使用,但是鲜有人能发现需要 导航 这个东西出来解决出行问题,等到 导航 被发明出来以后,人们发现,哦,原来我就需要这个东西,比地图方便易用。

从事前的眼光看待问题,就是软件工程需要处理的问题。

因此软件工程处理的问题,也就是目标,一般有如下特性

  1. 有一定的难度,每个问题都是新的,不清楚的,因为在你做之前,鲜有人做。
  2. 需要处理的问题很广,你能解决某个领域的问题,那么我们假设你也能解决另外一个领域的问题。所有你需要处理的问题很广。

基于这两种原因,软件工程中专门分出一类人,来处理这个问题,他们是需求工程师,或者需求分析师,或者你熟悉的产品经理,这几种称呼,描述的一类人。


产品经理

划分出产品经理(需求分析/工程师)的愿景是,帮助软件工程解决上述的2个问题。

因此,产品经理的职责是:专门负责与现实问题打交道,专门负责发现问题、处理问题、确定问题的业务解决方案

简答说,你要发现用户的问题(痛点)、帮助他们解决这个问题,给出一个业务解决方案。比如,你要发现用户天天使用地图,何不开发一个机器来专门做这件事,而非每次带上纸质地图。

这里的业务解决方案,需要注意下,与工程解决方案不一样,它不关心软件的内部细节,如何实现,它只关注现实问题,如,关注用户的成本等。

再回到工程的定义 (应用科学的方法,在成本效益比 有效的方式下,建立一个机器,解决针对性的现实世界的问题) 上,其中问题被丢给了产品经理。相当于起点被解决了。那么问题的终点,创建一个机器,这个机器呢。

按照其他行业,针对某个问题,出做出个具体的机器来针对性的解决,那么这个机器就是计算机,但是这个计算机只是通用的计算机,因为软工面临的问题很广,为每个问题创建一个针对性的计算机是不现实 的。

软件工程中有一种 软件抽象解决方案 ,用于解决这个问题。通用的计算机+软件抽象解决方案,以此来解决特定问题。

说的大白话一点,就是计算机上装个特定软件,然后解决特定问题。


软件工程的任务

分为 本质性工作附属性工作

其中本质性工作,也就是 开发,附属性工作也就是 安装。这里的开发与安装,与我们通常理解的不是一回事,开发指的是拿出一套软件抽象解决方案,需要先分析,再设计。安装指的是,将无法落地的软件抽象解决方案落地,也就是进行编码、测试工作。

并且开发工作是永远无法避免的,是困难的,注意这里的措辞永远。因为新问题层出不穷,需要新的解决方案,就需要新的分析、设计。所以说开发是永远无法避免的,而且还难。而安装,则可以通过各种工具、方法使得其变得简单。比如你二十年前写代码和现在写代码,一定是现在写代码更简单些,各种框架层出不穷,解放生产力。但是面对新问题的分析,无论二十年前还是二十年后的今天,都是一样的,需要独立的分析、设计,没有工具和方法避免。

上文已经提到,开发主要是指:分析、设计。其中具体含义如下:

分析,是产品经理经过对问题的分析,拿出业务解决方案。

设计,则是将业务解决方案回归到工程解决方案。

这里的设计,有好几类工作的划分。


xxx设计师

设计师,一个团队的标配是:人机交互设计师、体系架构设计师、详细设计师

其中详细设计师一定是程序员,也就是需要扎实的编程经验,但是不是所有的程序员都是详细设计师。

上面提到的是标配,但是在某些复杂问题下,还有许多其他设计师出现,如网络环境比较复杂,则需要有网络设计师;如果安全很值得关注,则还需要安全设计师,等等。


程序员

附属性工作的编码,就是程序员做的。按照设计师的设计,完善细节。


测试人员

附属性工作的测试,就是测试人员做的。

主要是按照,产品经理当初给出的业务解决方案,测试程序员编写的程序,是否满足需求,如果不满足,则说明这中间有问题,或者理解出现问题、或者出现bug了。


项目经理

再回到工程的定义,其中有个 成本效益比,整个开发+安装过程,我们需要注意生产的控制:对时间、成本、质量的把控,这关乎软件开发的成败。

对时间、成本、质量进行把控,一般都是由项目经理做的。


辅助管理人员

如果项目很庞大,一个项目经理是不够的,就需要其他人员来帮助管理,如配置管理人员、生产管理人员,他们虽然挂着管理的名头,但是不是管理层,和开发、测试等属于一个级别。相辅相成。


软件工程师是干什么的

最后再次回到这个问题,我们发现,我们大概可以回答了。

我们发现。软件工程师根本不是具体的,至少可以细分为,产品经理、设计师、程序员、测试、项目经理。

而之前的那些平价,对应于其中,所以那些都是事实,但又不是所有的事实;比如高薪,那么产品经理、架构师、项目经理的,说到加班、996,青春饭,那可能是普通的程序员。




软件工程的三驾马车

它们是软件工程中最重要的三个角色。


产品经理

是产品的灵魂、把控整个产品的方向、定义产品实现的细节、构建业务解决方案。

  • 把握方向

    之所以,说它们是产品的灵魂,把控产品的方向,是因为他们掌握着产品的最终目标,最终产品是这个什么样,全是产品经理把控的。

    好比淘宝和京东,二者的产品经理的目标就不一样,一个是做自营、一个是做电商的平台。

    产品经理为了把握好目标、方向,会进行一些假设、然后拿出原型,根据反馈,再评估下方向是否合理。这里面有许多方法,比如目标、利害关系人、场景等分析,这里仅是导学课,老师没展开讲。

  • 定义细节

总之产品经理很重要!!!一个好的产品经理更是少见。他们的工资是高的,他们也不用写代码,码农跟他们不搭嘎,但是他们需要写 文档

如果需要一个好的产品经理,但是又找不到这样的,可以使用 team 来弥补下,就是建立一个产品团队,用一个团队来弥补个人的欠缺。


架构师

决定产品的质量,是整个团队的技术权威

凡是技术问题不会的,都可以去找架构师,这个技术问题,包括程序员以及测试人员的技术问题。

架构师需要 经验、知识、天赋,其中经验占比重最大。一个好的架构师也是很难得的。

同样的高工资,与产品经理有的一拼。

写关键代码、困难代码、文档。

如果找不到一个好的架构师,同样可以使用 team 弥补下。


项目经理

协调整个团队,具有领导力、领导、团结、激励大家

是一个决策者,需要决策团队的选择。

是问题的解决者,当出现问题的时候,而非去寻找产生问题的人,然后去处罚。

讲究激励团队,而非处罚。在软件工程中,命令与惩罚无效。因为程序员可以做在电脑面前一整天,但是一行代码不写。

因为需要决策,特别是在一些出现重大问题的情况下,做出决策,需要承受一定的 压力

也比较 ,因为需要计划、跟踪、监控整个团队的进度。




其他角色


人机交互设计师

主要是交互。使得软件具有以下特性:

  • 易学习,自然工作(word)
  • 高效工作(扫描收银)
  • 低记忆负担
  • 避免错误
  • 吸引眼球
  • 使用方便

需要一定的美学,还要了解行为,基本不需要会写代码。


程序员

软件开发中的中流砥柱。

一般具有如下特性:

  • 要具有抽象能力
  • 逻辑思维要强
  • 算法能力(这条是普通程序与高级程序员的划分,也是薪水的划分)

不同的程序员的生产效率比能有 20:1 这么大,但是二者之间的薪水差距要小的多。

有的代码需要创造性,需要高级程序员(算法),但是85%的代码是重复出现的,因此在软件开发中,接触高端技术、需要创造性是少数。

普通程序员,是比较吃青春饭的,对软件工程师的吃青春饭的印象,一般是这类程序员留下的。同时,他们的工资也一般,以代码为生,讨厌写文档。

发现了吗。写文档的工资比写代码的高。写文档的更赚钱。


软件测试

首先,测试不是像用户使用软件那样,用鼠标点几下就好了,测试也是需要写代码的,测试代码。

测试,以前是完备性测试,测试有效性,但是好多情况下,完备性是测不完的,太多种可能了,后来改为缺陷性测试,只要测出来的 bug 越多,则代表隐藏的 bug 越少。

地位、工资与程序员差不多。但是一直在测试,没有程序员写代码创造有成就感,有点枯燥。

同时地位比较尴尬,测出来的 bug 多,程序员头疼,测出的 bug 少,自己头疼。


维护工程师

这里的维护,不是其他行业的维护、保养的意思。而是增值、附加值、修改等意思,为软件添加新功能、修复 bug

地位比较尴尬,不受重视,成就感低,比如,程序员去找工作的时候,本能的找开发岗,而不去找维护岗。高级的程序员会被调去开发,而非维护。

工资与程序员差不多,有时候还低。

但是干的活,还比较难,因为需要理解、甚至修改别人的代码。写代码的都知道,看别人的代码是怎么样的体验。

但是行业调查发现,维护工程师确是软件工程从业者最多的行业,说明维护软件的成本很高。

原文地址:https://www.cnblogs.com/young-youth/p/11665552.html