软件开发SOP

Posted by Jingming on September 10, 2025

软件工程师SOP

SOP就是标准操作流程,类似的含义是最佳实践。掌握好SOP,可以让事情做的更对,更成熟而且快速。

单元测试改动 SOP

  1. 先要保证原来的代码以及单元测试是处于通过的状态

如果不这么做就直接写新的代码,新的测试,之后若出现单元测试通不过,会隐藏着一种原因,就是本来的测试就不工作,这样调试起来极其困难。

  1. 添加新的测试

这是一种测试驱动的原则,测试的代码就是一种需求规格。

默认新写的测试是一定会失败的

  1. 再做代码改动

  2. 调试单元测试,使得通过

  3. 调整所有修改的文件的代码风格,通过代码规范检查标准

  4. 验证所有的其他测试是否通过

Oncall SOP

Oncall先看责任,如果只是普通的oncall,那么大致SOP如下:

  1. 保证可以及时接受消息

保证手机通畅,接到电话后,马上打开电脑(要带在身边),第一时间查看。

  1. 第一时间判断问题的严重性,并回复

10分钟左右,给出自己的第一判断。

首先,查看是否出现过类似的问题。

如果没有,那么这个时候应该有一些文档来参考问题的严重程度。

  1. 查看系统的性能指标系统,程序运行错误系统

检查问题的严重性,以便进一步的回复

  1. 如果自己可以分析清楚,那么回复,并给出解决建议

  2. 如果自己不可以解决,第一时间升级到上一层oncall

做代码的重构

  1. 先了解哪些地方需要修改

可以使用AI(copilot或者Claude的agent模式)来问。

  1. 分析这些地方的先后次序

可以问AI。

  1. 和队友做确认

  2. 分别做改动

可以在改动后,问AI是否是正确的改动。

  1. 部署之前先部署到QA和SandBox环境详细测试

Web项目K8S部署结构

三个部分:

  1. 主程序

负责提供API,Web界面,以及HTTP请求。

其中往往一起部署: Nginx 代理容器 + Unicorn 应用容器。

Nginx 容器:

  • 终止 SSL/TLS 连接
  • 处理长连接(ELB 健康检查)
  • 监听 443 端口
  • 将请求转发到 localhost:11000

Unicorn 容器:

  • 运行 Rails 应用
  • 监听 11000 端口
  • 处理实际的业务逻辑

外部请求 → Nginx (443) → Unicorn (11000) → Web应用(例如Rails应用)

Unicorn在整个部署中的核心作用:

  • HTTP 服务器:将 HTTP 请求转换为 Rails 应用调用
  • 进程管理器:管理多个 worker 进程,提供并发处理能力(注意,同一个请求只会被一个进程处理,worker的数量可设置为CPU核心的数量,因为执行的任务多为CPU密集型,且rails多线程效率低)
  • 稳定性保障:进程隔离确保单个请求不会影响整个应用
  • 资源优化:COW 内存共享,减少内存使用
  • 运维友好:支持零停机重启和优雅关闭

主线程的副本数比其他的多,例如生产环境中部署30个副本。

  1. 工作线程Workers

不处理http请求,但是做后台的操作,例如读取数据库,处理消息队列等。

workers是默认24小时都在运行的。

  1. 定时任务CornJob

和Workers类似,但是是定时执行,例如每一天的2点执行。

  1. 如何选择机器大小

主程序往往是CPU密集型任务,所以,可以多配置CPU核心和内存,例如18核心,10GB的内存,30个副本;

工作线程Workers做数据库处理,所以,也要稍多的CPU核心和较多的内存,例如8核心,32GB的内存,8个副本;

定时任务CornJob做任务之后,机器就关机,所以,不需要太多CPU和内存,例如1核心,4GB内存,1个副本。

Web项目从零开发

  1. 一定要使用容器技术开发

例如使用docker开发,因为可以屏蔽本地环境的影响,例如在mac上开发,还是windows开发,

RVM的版本,Ruby的版本,Rails的版本可以保持一种隔离的控制。

  1. 开发环境和生产环境区别开来,整个项目使用一个镜像

开发环境就是把整个项目打包成一个镜像,然后可以修改,运行,测试。

生产环境就是把这个镜像里的一个具体的命令进行部署。整个项目使用一个镜像的好处就是,增加系统的稳定性,减少开发运维的复杂性,

保证所有的代码版本的一致,例如使用rails的某一些具体的gem,而且部署起来,可以缓存这样的镜像从而节省时间。

PS. 如果做的是超大项目,那么当然不使用一个镜像,例如出于安全考虑要有专门的gateway来减少代码的被攻击的面;

出于技术栈不同考虑,例如有些专门处理大数据的;出于资源需求不同考虑等。

工作浏览器使用的收藏文件夹

可以创建如下的文件夹来加强链接的管理

  1. 日志文件Logs

记录所有相关的日志平台的链接,以及要保存的日志链接。

  1. 设计文档

记录所有关于项目的设计文档

  1. 知识文档knowledge

记录所有关于项目的知识性的链接。

  1. 值班Oncall

(1)oncall的轮班表链接 (2)系统的健康面板链接 (3)oncall遇到的问题的链接

  1. 公司平台

记录公司的平台链接,自己的工资信息链接(方便交税),各种福利链接, 密码管理链接。

  1. 数据库DB

记录所有数据库的访问链接,文档链接,以及具体操作链接。

  1. 将要处理的列表TODO以及完成的列表DONE

两个文件夹,一个负责记录最近处理的所有链接,一个记录已经处理好的所有链接。

学会再任何事情之后总结

  1. 应该继续做什么?
  2. 应该停止做什么?
  3. 应该开始做什么?