zoukankan      html  css  js  c++  java
  • (一)软件工程导学 —— 软件工程师与软件工程团队

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


    软件工程师是干什么的

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

    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

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

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

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

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

  • 相关阅读:
    docker安装dvwa
    新版recon-ng安装模块
    docker多段构建nessus镜像
    docker安装Nessus
    docker快速安装openvas
    pyinstaller打包一些三方库后,报资源不存在
    python解决“failed to execute pyi_rth_pkgres”问题
    Proxmox6.2简单配置
    JavaScript全面学习(koa2.0)/MVC实现登录
    windows下react-native环境配置的那些坑
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665552.html
Copyright © 2011-2022 走看看