软件开发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

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