软件工程专业学什么

软件工程教的是「把软件当成工程产品交付出去」:需求怎么谈清楚、架构怎么定、代码怎么协作、测试怎么保证、上线后怎么维护。写代码只是其中一环,而且不是最难的一环,所以这个专业的课程有一半不在键盘上。

它和计算机科学与技术的差别,不在于谁更「高级」,而在于关注点不同。一个追问计算本身的原理,一个负责在预算和工期里把系统交出去。

软件工程教的是「交付」,不是「写代码」

一个人写课程作业,能跑就行。十个人写一个要上线、要维护五年的系统,问题就完全变了:接口谁定、代码风格怎么统一、改动怎么不互相覆盖、出了故障谁负责。这些是软件工程要解决的问题。

所以这个专业的课程里有一批看起来「不写代码」的课:需求工程、软件设计与体系结构、软件测试、软件项目管理、软件质量保证。它们教的是流程、文档、评审和度量。

很多学生大三才明白这一点。前面两年一直在学语言、数据结构、算法,以为这就是全部;到了课程设计分组做项目,才发现真正的难点是沟通和协调。

软件生命周期:每一门课对应一个阶段

软件从想法到退役,会经过需求、设计、编码、测试、部署、运维几个阶段,业内叫软件生命周期。这个专业的课程设置,基本就是按这条线铺开的。

阶段 主要产出 对应课程 企业里的角色
需求 需求规格说明书、原型 需求工程、软件工程导论 需求分析、产品经理
设计 架构图、接口文档、数据库设计 软件设计与体系结构、数据库系统 架构师、高级开发
编码 可运行的程序、单元测试 程序设计、数据结构、面向对象方法 开发工程师
测试 测试用例、缺陷报告 软件测试技术 测试工程师、测试开发
运维 监控指标、发布记录 软件项目管理、DevOps 实践 运维、SRE

这条线不是让人人都去做全流程,而是让每个人知道自己那一段的上下游是谁。写代码的要知道需求为什么这么定,做测试的要知道设计上哪些地方最容易出问题。

和计算机科学与技术,差别到底在哪?

两个专业在前两年的课程重合度很高:程序设计、数据结构、离散数学、计算机组成、操作系统、计算机网络,几乎一样。这也是很多人觉得「两个专业没区别」的原因。

分岔出现在大三。计算机科学与技术会往理论深水区走,编译原理、算法设计与分析、计算理论、人工智能是重头;软件工程则往工程实践走,软件体系结构、软件测试、项目管理、软件过程改进占大头。

培养目标也不一样。前者培养的是能理解并推进计算技术本身的人,后者培养的是能组织团队把系统按时交付的人。落到就业上,计算机专业去算法岗、基础架构岗的比例更高,软件工程去业务开发、测试开发、实施交付的比例更高。

实际招聘中,两个专业的简历通常都能过筛。企业看的是项目经历、实习经历和基本功,专业名称的影响远小于想象。真正的差别在四年里你花时间学了什么。

工程教育认证和那半年实习,为什么绕不开?

很多高校的软件工程专业通过了工程教育专业认证。这个认证有一套硬指标:培养目标要能对应行业需求,毕业要求要覆盖十二条能力,课程体系要能支撑这些能力,还要有持续的改进机制。

其中一条硬要求是「复杂工程问题」的训练,以及与企业结合的实践环节。所以不少学校把大四设为实习年,要求在企业连续实习六个月以上,有的直接是「3+1」:三年在校,一年在企业。

这个安排对应届生是好事。半年实习意味着你参与过真实项目,知道代码评审怎么提、需求变更怎么处理、上线流程是什么。简历上有这一段,比多修两门选修课有用得多。

代价是时间被压缩。大三下就要开始投实习,大四的秋招和实习期重叠,课程和毕设要提前安排。想考研的学生要提前和学院确认实习能否置换,各校规定不同,以本校教学计划为准。

毕业生的第一份工作,通常从改 bug 开始

最常见的入口是后端开发。入职第一周领到的往往不是新功能,而是几个历史遗留的缺陷单。要读懂别人写的代码,找到问题在哪,改完跑测试,提交评审,被资深工程师打回两三次,再改。

日常节奏是固定的:早会同步进度,白天写代码,下午或晚上代码评审,每周发一次版。写单元测试、写接口文档、处理线上告警,这些占的时间比想象中多。

其他常见岗位包括前端开发、客户端开发、测试开发、实施顾问。测试开发这两年需求不小,既要会写自动化脚本,又要懂业务,起薪和开发岗接近。

常见问题

软件工程是不是吃青春饭?

一线的编码岗位确实偏好年轻人,但这不是全部。工作五到八年后,路径会分开:走技术线做架构、做技术专家;走管理线做项目经理、研发负责人;走业务线做产品、做解决方案。真正被淘汰的不是年龄,是只会写某一种框架、不肯更新知识结构的人。

数学不好能学软件工程吗?

能学,但要避开一些方向。业务开发、前端、测试对数学要求不高,会基本的逻辑和统计就够。算法、图形学、密码学、机器学习这些方向对数学要求高,离散数学和线性代数必须扎实。高考数学吃力的学生,建议入校后重点补离散数学。

软件工程和人工智能专业怎么选?

人工智能专业偏算法和模型,需要较强的数学基础和读研准备,本科直接就业的对口岗位不多。软件工程偏工程落地,就业面宽,本科毕业就能进企业做开发。想清楚是要做模型还是做系统,前者选人工智能,后者选软件工程。