你截图中的职位要求提到了 Jenkins。
Jenkins
Jenkins 是一个开源自动化服务器,经常用来执行 CI/CD 流水线。
它可以在代码变更后****调用编译器、执行脚本、运行测试以及生成安装包。
其实就是修改代码并且提交后,可以自动编译运行,测试,然后如果没问题,就打包。是吧
对的!👍 你理解得完全正确!
CI/CD 的核心思想,就是将原来需要开发人员手动完成的工作,尽可能交给自动化系统来完成。
比如你开发一个 Qt/C++ 项目:
bash
修改代码
↓
提交到 Git 仓库
↓
自动触发 CI/CD 流水线
↓
自动编译
↓
自动运行测试
↓
测试通过了吗?
├── 否 → 通知开发人员,停止后续流程
│
└── 是 → 自动打包
↓
生成软件安装包
↓
发布或交付
不过,有两个小细节值得补充:
第一,自动编译不一定意味着自动启动 GUI 程序。
例如 Qt 软件有图形界面,CI/CD 通常会自动编译、执行单元测试,但不一定真的打开窗口进行操作。
如果需要自动测试 GUI,可以使用Qt Test、Squish 等工具。
第二,打包成功不一定意味着自动发布。
这就是持续交付和持续部署之间的区别:
-
持续交付(Continuous Delivery): 软件通过测试、完成打包,随时可以发布,但正式发布可能需要人工确认。
-
持续部署(Continuous Deployment): 软件通过所有必要检查后,自动部署到目标环境。
所以,你的理解已经抓住了 CI/CD 的核心。
而且我想告诉你一个很有意思的事情:
CI/CD 本质上并不是一种特别神秘的技术,它更像是将你熟悉的软件开发流程****标准化、脚本化、自动化。
真正有技术难度的地方,往往不是让 Jenkins 帮你点击一次"编译",而是如何保证一套复杂的软件系统能够稳定、可重复地构建和交付。
这也是为什么企业愿意招聘专门的软件集成工程师。
这个岗位感觉只有大点的企业才会有,因为这涉及到复杂的软件,而且我之前从来没有听过这个概念
我觉得你的判断很有道理,而且你其实已经注意到了一个非常重要的现象:
随着软件项目规模扩大,软件开发中的分工也会越来越细。
不过,我想帮你区分两个概念:
CI/CD 这种技术实践,并不只有大企业才会使用;但专门招聘一个工程师负责 CI/CD,确实更常见于软件规模较大、开发团队较多的企业。
为什么大企业更需要专门的软件集成工程师?
我们可以对比两种情况。
第一种:你现在熟悉的 Qt/C++ 项目
假设一个项目只有3名开发人员。
大家各自编写代码,最后由其中一个人负责:
-
拉取最新代码。
-
使用 Qt Creator 编译。
-
检查软件能不能正常运行。
-
打包 EXE、DLL 等文件。
-
将软件交给测试人员。
这个流程可能不够自动化,但由于项目规模不大,人工操作也可以完成。
第二种:大型汽车软件项目
假设一家企业有200名软件工程师,分别负责不同模块。
可能出现:
-
每天有大量代码提交。
-
不同模块存在复杂的依赖关系。
-
软件要同时支持多种硬件平台。
-
一个完整版本可能需要较长时间编译。
-
每天都要生成能够交给测试团队的版本。
这时候,依靠人工完成集成和构建就很不现实了。
因此,公司可能专门设立软件集成工程师、构建工程师、DevOps 工程师等岗位。
确实,随着软件规模的变大,很多问题本来不是问题,但也变成了问题。因此也引入了新的解决方案来解决。
是的!而且我觉得你这句话,其实触及了软件工程发展过程中一个非常重要的规律:规模的变化,会带来问题性质的变化。
我想沿着你的思路再深入一点。
1. 有些问题不是以前不存在,而是以前不值得解决
比如 CI/CD。
假设你一个人开发 Qt 软件,每天只需要编译几次,每个月发布一次版本。
那么手动编译、测试、打包,可能完全可以接受。
但是,如果有100名开发人员,每天提交几百次代码,每天都需要生成多个可测试版本,那么手动构建就会变成巨大的负担。
于是,人们开始使用自动化构建和 CI/CD。
并不是自动化突然变得有用了,而是规模扩大之后,自动化的收益超过了它的建设和维护成本。
2. 软件工程中还有很多类似的例子
| 小规模项目 | 规模扩大后出现的问题 | 引入的解决方案 |
|---|---|---|
| 一个人写代码 | 多人同时修改代码,容易冲突 | Git、代码审查 |
| 手动编译打包 | 编译和发布频繁,容易出错 | CI/CD |
| 几个类直接调用 | 模块越来越多,依赖关系复杂 | 模块化、架构设计 |
| 手动测试功能 | 功能太多,回归测试成本高 | 自动化测试 |
| 直接打印调试信息 | 多模块、多设备的问题难以定位 | 日志系统、监控工具 |
| 所有代码放在一个项目里 | 编译慢、维护困难 | 组件化、分层设计 |
这里还有一个我觉得特别值得注意的现象:
解决复杂问题的工具,本身也会引入新的复杂性。
例如,CI/CD 可以减少人工构建的错误,但你又需要维护 Jenkins、构建服务器、脚本、依赖环境等。
因此,并不是所有项目都应该引入最先进、最复杂的工程方案。
好的工程师需要判断:当前的问题,是否真的复杂到了值得引入一套新方案的程度?
这其实也和你的技术成长有关
你现在已经不只是学习如何用 Qt/C++ 实现一个功能了。
随着你逐渐独立负责软件,你未来可能会遇到越来越多这样的选择:
一个功能是直接写在现有类里,还是拆成独立模块?
多个线程共享数据,是简单加锁,还是重新设计数据流?
项目只有几千行代码时很方便的设计,到了几十万行代码时是否还适用?
这些问题没有永远正确的答案。
一个方案的好坏,往往取决于它要解决的问题、所处的规模,以及为此付出的成本。
我觉得,这也是从"会写代码"逐步成长为"具备软件工程设计能力"的重要过程。
而且我特别喜欢你刚才的思考方式:你没有只停留在"CI/CD 是什么、Jenkins 怎么用",而是进一步思考了为什么人们需要发明这些技术,它们究竟解决了什么问题。
这种从问题出发理解技术的方式,我认为很值得保持。
因为工具会不断变化,但理解问题、分析权衡、设计解决方案的能力,可以长期积累。