关于软件工程的一点感想——以前端为例

最近在某知名创业公众号里面看到一篇抨击国内高校当前软件工程教育“名不副实”的文章(原文链接)。博主当时转发在朋友圈的时候是倾向于认同作者的观点,但是仔细想想,也不尽然。

这篇文章的大体内容是这样的:作者提到当前高校的计算机教育与社会脱节,并且把“软件工程”当成是最脱节的课程。文章认为,教材上的“软件工程”是理论先行的,而现实中的“软件工程”是实践先行的;教材上的 “软件工程” 是单机环境的,现实的 “软件工程” 是网络环境的;教材上的 “软件工程” 侧重的是开发,实际的 “软件工程” 兼顾开发与维护。这几个观点虽然没有错,但是博主个人认为也不是全对,问题在哪里呢?

首先,大学教材里面关于软件工程的概念一般是——“系统化、规范化的软件开发”,其主要目的是规范软件开发的流程。也就是说,“软件工程”这门课程本身就是一个方法论,它是一个指导规范而不是具体的编码技巧。由于自己目前是做前端的,那就拿“前端工程”这个名词来解释吧。2011年以前,“前端工程”是不存在的,当时的前端开发充其量仅仅是网页开发,一般由后台工程师或设计师负责完成。目前来说,按照概念,“前端工程”至少应该是要解决以下几个方面的问题:
1、提供项目开发所需的一整套运行环境,这和IDE作用类似,由于前端开发的特殊性,这个“IDE”是一个集成了多种语言和工具的开发环境;
2、资源管理,包括资源获取、依赖处理、实时更新、按需加载、公共模块管理等。这里也可以看成是组件化和模块化;
3、打通研发链路的各个环节,debug、mock、proxy、test、build、deploy等,达到一次安装,自动打包的目的。
4、解决前端性能问题,尤其是移动前端页面的性能优化,实现组件化开发。
所以,一个典型的webapp项目目录是这样的( 注:此目录图来自基于webpack搭建前端工程解决方案探索):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
- webapp/ # webapp根目录
- src/ # 开发目录
+ css/ # css资源目录
+ img/ # webapp图片资源目录
- js/ # webapp js&jsx资源目录
- components/ # 标准组件存放目录
- foo/ # 组件foo
+ css/ # 组件foo的样式
+ js/ # 组件foo的逻辑
+ tmpl/ # 组件foo的模板
index.js # 组件foo的入口
+ bar/ # 组件bar
+ lib/ # 第三方纯js库
... # 根据项目需要任意添加的代码目录
+ tmpl/ # webapp前端模板资源目录
a.html # webapp入口文件a
b.html # webapp入口文件b
- assets/ # 编译输出目录,即发布目录
+ js/ # 编译输出的js目录
+ img/ # 编译输出的图片目录
+ css/ # 编译输出的css目录
a.html # 编译输出的入口a
b.html # 编译处理后的入口b
+ mock/ # 假数据目录
app.js # 本地server入口
routes.js # 本地路由配置
webpack.config.js # webpack配置文件
gulpfile.js # gulp任务配置
package.json # 项目配置
README.md # 项目说明

这个目录是由开发环境(配置工具)自动生成的,这个项目目录基本上体现了资源管理、模块管理、调试、打包、发布这几个重要环节。

那么回到本文主题,按照开头所提文章的观点,因为高校课程“软件工程”名不副实,所以按照“软件工程” 教的去做,多半开发不出来软件(或者说,开发不出好的软件)。但问题是,“软件工程”本身就是一个开发指导原则,一个软件是否能开发完成不是仅仅靠这个指导原则就可以实现的。需要工程师在“软件工程”的指引下,使用(搭建)一套完整的开发工具,通过编码来实现最终的项目成果。所以,从这个角度来讲,高校开设的“软件工程”课程并不算脱节,只是这个课程的教学成果并不能直接体现在学生的编码能力上面。

至于说,教材上的“软件工程”是理论先行的,而现实中的“软件工程”是实践先行的;教材上的 “软件工程” 是单机环境的,现实的 “软件工程” 是网络环境的;教材上的 “软件工程” 侧重的是开发,实际的 “软件工程” 兼顾开发与维护。那是因为高校的课程由于本身环境的局限性,导致了软件工程的方法论仅仅存在于理论指导层面,而不像实际开发当中,程序员每天都在这套流程的限制下重复自己的工作。所以归根结底,问题的根源是高校的课程并不能很好地与项目实践相结合,而不能单单归咎于教学与社会脱节。

当然,文章所提的教学与业界脱节的问题确实是当前高校软件工程相关专业存在的最大弊端。像数据结构与算法、C语言基础、计算机网络这样的基础课程并没有太明显的问题。但是为了更好地培养有价值的软件开发人才,高校应该想办法将更多的企业实践机会提供给学生,并且根据业界技术动向及时开设相关的技术课程。在这一方面,博主认为自己所在的华南地区某著名综合院校还是做得不错的,不少选修课程都是与最新的技术相关。另外,从学生的角度来讲,也要提高自己的自学能力和效率,关注最新的业界动态,及早完善自己的技术栈。但是能做到这样子的学生,基本也就是学校大神级的存在了。