软件工程:背景知识 / 企业应用

更多
2019年05月28日 08点37分 作者:叶飞 修改

首先,为什么要专门学习软件工程?

两个误区:

  • 你不是来学什么什么语言的,你是来学技术的;
  • 你不仅仅要学技术,你还要学工程学管理的!


概念分类

软件和硬件

计算机首先可以分成两大类:

  • 硬件:简单的说,看得见摸得着的都属于硬件。比如一台电脑,就包括:显示器(屏幕),键盘鼠标,还有里面藏着的CPU、内存、磁盘、网卡等等。(复习:计算机硬件组成
  • 软件:看不见摸不着的,以信息、代码、程序等形式存在,运行在计算机硬件上的东西。比如:电脑上都要安装的操作系统,QQ或者微信,浏览器打开的网站……

工程和科学

我们的课程基本上不涉及硬件,所以我主要再聊一聊软件里面的分类:

  • 科学:其特点是以研究而不是解决具体问题为目的,不解决具体的问题,目标是科学技术根本上的突破产出主要就是论文。比如:二级制的运算、数据如何快速查找、加密和压缩等。
  • 工程:其特点就是利用现有技术资源解决具体的问题(参考定义),工作结果就是一个又一个的软件/程序/应用

计算机科学我们的课程肯定也不怎么涉及,所以这里关注的核心就是软件工程。其特点:

  • 为实现既定目标:大白话首先你要有一个idea,你要“清晰地”(特别强调)知道,你究竟想做个什么出来
  • 利用现有资源:资源包括:技术、人力、物/财力、时间等,他们都是有限的(特别强调“现有”技术,尖端都可以算现有,但还未出现的技术属于科学发明范畴),所以产生了工程学的要求:
  • 科学合理组织:
    • 效益优先:而不是技术优先。这是从(搬砖的)程序员到(做管理的)老大思想上的标志性的升华。
    • 良好的管理:管人管钱管工期,项目经理其实就干这活

项目开发流程

整个软件工程,如果采用瀑布型开发模式,又可按阶段分为:

  1. 需求:弄清楚说明白究竟要做一个什么软件出来!干这事的人现在通常被称之为“产品经理”(公司内部)或者“甲方”(公司外部)。细分的话又还可以包括:美工(把产品界面弄漂亮点)和UI(界面布局更合理更人性)……这个岗位其实不需要什么计算机专业知识,当然懂一点更好,免得提一些莫名其妙的需求被程序员打,^_^
  2. 开发:把需求以代码的形式实现。干这活儿的,就是大家都熟悉的“程序员”(或者“码农”“代码民工”)。这是最核心技术含量最高的岗位,有兴趣了解的同学先点个赞,我们再后面细说。
  3. 测试:开发出来的代码不一定——好吧,我承认,是肯定有问题(被称之为bug)的。所以在正式交付/上线之前还需要测试。干这活儿的被称之为“测试人员”,就类似于工厂里面的质检员,把不合格的产品给找出来。这个岗位又可以分为:
    • 人工测试就像普通用户一样拿着鼠标点点点,几乎不需要任何技术含量;
    • 自动化测试其实就可以算是程序员了,他一样要写代码,所以技术含量也不低。
  4. 支持:软件开发完成,就需要部署(发布),可以是打包压缩成光盘,也可以是发布到服务器网站/APP上线;一般部署/发布之后,还需要监控其运行情况,比如有时候访问量过大,服务器挂了,就要采取一些(不更改代码)的措施,这些岗位都被称之为“支持”,其技术含量高于人工测试,略等于自动化测试。

按应用种类划分

一般我们把直接面向“终端用户”的软件称之为应用。但这里面的终端用户其实不太好界定:

  • 可以面向普通用户,比如游戏、微信、一起帮……;
  • 也可以面向专业人员,比如Office、PhotoShop、CAD、数据库(哦豁?利用应用做应用)……

还可以按其种类划分为:

  • IT信息化应用:这个稍稍有点抽象。简单的理解,它其实就是把现实生活中的数据搬到计算机里面处理。比如淘宝,其实就是一个大商店,只不过这个商店里面不放具体的商品,而是展示商品的信息,比如名称、图片、价格、销售情况等等。整个淘宝,本质上是数据的:
    • 录入(比如发布商品/好评);
    • 修改(改价格/图片等);
    • 删除(货物下架删差评);
    • 查找(各种各样的商品)
    的过程。背后通常都需要“数据库”(由此衍生了“大数据”的概念)的支撑。现在大部分应用都属于这一类。
  • 系统应用:其核心业务不是数据的增删改查,背后也不需要大型数据库支持。典型的就是工具类软件,比如绘图的Photoshop和CAD,以及各种游戏。其实这种应用的技术含量更高,目前我们国家超级多的应用,各种APP,但都不属于这一类。

按职责领域划分

因为互联网的蓬勃发展,现在的应用通常都会把大量的运算放在服务器端,用户的电脑上只需要做简单的界面操作。(详见:Web开发基础

所以根据你写的代码运行的位置,又可以分为:前端和后端(以及DBA)

好吧,终于可以汇总来看看了,一图胜千言啊!


企业应用

其实并不是所有的和网络相关的编程开发都是(我们通常意义上说的)Web开发。Web开发除了好网络相关,和浏览器相关,还应该是一种企业应用

“企业”(enterprise)这个翻译其实是有问题的,容易把人引向:企业/公司级别所开发/使用的应用……让人挠头!但木已成舟,约定俗成。

同学们最好回归其本义:(英英词典

a large or important project, especially one that is new or different

或者,大家想一想:企业号航母……航母和企业(公司)也没关系是不是?

关于“应用”(Application),复习:操作系统


Martin Fowler的定义

那么,究竟什么是企业应用?在这本号称“企业应用开发圣经”的《企业应用架构模式》(强烈推荐!)中

Martin Fowler花了一章节的来进行解释。我总结出来了一些关键字:

  1. pesistent data  
  2. a lot of data
  3. access data concurrently  (要使用“数据库”)
  4. a lot of user interface screens    (很多“用户界面”)
  5. integrate with other enterprise applications
  6. conceptual dissonance:比如:评价(赞/踩/评论……)
  7. complex business "illogic"   (繁杂:业务逻辑)


数据库

Martin的定义1-3:都和数据相关,更通俗粗糙的解释:就是要利用数据库

因为目前来说,数据库是完成大量 数据的持久化,并有效处理 并发冲突 的不二选择。

PS:为什么我学的数算都没用呢?这锅就该数据库来背,^_^

所有的应用,按其是否使用数据库,或者说,看软件的主要目的/功能是不是:

  • 录入/保存数据:添加和修改(包括删除)
  • 检索数据:查找

又可以分为:

  • 数据型:比如一起帮(注册登录/发布/浏览)、淘宝(上架/购物车订单/后台账目)、医院挂号、银行取款……
  • 功能型:几乎不需要数据库,比如WPS、CAD、360安全管家……

用户交互

Martin的4:用户使用大量的UI界面和应用进行交互。

Web开发里面就是浏览器里面的一个又一个的网页,里面包含了:内容、链接、表单元素(文本框/选项/按钮……)

复杂的业务逻辑

首先大家要习惯的第一个词:业务(business),有点商业的味道,实际上代指应用应该实现的功能。比如:注册/登录、发布、评论、提交订单……

那么业务逻辑(Buisness Logic)的特点:

  1. complex:复杂的。和数据结构和算法里面的复杂度不是同一个意思。这里用“繁杂”可能更为贴切,意思是造成“复杂”的原因是:繁多、琐碎、七零八落……整个应用是由无数个小功能小模块构成,每一个单个的小功能小模块都很简单;但是,把这些功能糅合在一起,问题就复杂了!
  2. illogic:这里Martin进行了调侃:业务逻辑不逻辑。这个,只有等同学们接触了各种“千奇百怪”的业务之后才会有所体会(参考)。这里说了也是白说,因为“一起帮”的业务逻辑是非常有逻辑性的,^_^
    反对的童鞋可以上来领一个轮椅……

  3. dissonance:概念上的“不一致”。理解一个应用,你首先要理解它里面大量的“概念”,比如“一起帮”里的:帮帮币、悬赏、冻结、求助……但是,不同的应用之间他们的概念完全有可能是不相同的。比如,最简单的用户(User)
    • “一起帮”里面,注册的才算用户;
    • 另外一个系统,只要访问网站的都算用户。
    这种概念上的不一致,对我们理解需求也造成了非常大的困扰。

我们要学习的Web开发,就是典型的企业应用。


演示:在线类图绘制


UML(Unified Modeling Language)历史和争论


1997年推出 UML1.0 规范草案。曾经火过一段时间(架构师必备),但现在基本上有点凉了…… (UML2.0有点无人问津)

优势:

  • 一图胜千言(有时候我们就是需要图)
  • 统一的标准,可以降低沟通的代价

劣势:

  • UML 生成代码:实现不了或者实现的代价太大(还不如直接写代码)
  • 统一的标准:还是太复杂了点
  • 文档:和注释一样,有一个“冗余一致性”的问题


附录参考:

w3school详细介绍




源栈 项目管理 类图 UML
赞: 0 踩: 0

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 0

编程基础


项目管理相关

需求发布、开发规划、部署、测试,源代码版本管理(git)等……

逸闻史话

认识计算机

编程语言

数据结构和算法

Web开发基础

全部
关键字



帮助

反馈