萌新开发接手大佬项目初体验
0x00 前言
本人某司安全开发萌新一枚,入职以来主要负责自研 IDS(Intrusion Detection System,入侵检测系统)的管理台开发。在全栈开发老司机波老师的指导下,顺利完成了数据读写效率优化、数据可视化展示、安全运营能力提升等开发需求,对 Web 应用的整体架构有了更深理解。
不久前,突然接到项目交接任务,与领导与波老师开完项目交接会后,虽然没明说,但下意识能感觉到,波老师即将离开。接下的一周内,波老师要将几年来的开发成果塞进我的脑袋,最后总算是顺利完成交接。整个过程下来,感觉大脑许久未在紧迫高压的状态下,涌入如此大量的信息。
客观而言,接手他人工作虽然开头难,但能若成功接下来,则会让萌新以最快的速度成长。本文将以开发人员的视角,对接手项目过程中的要点进行总结,便于日后再出现工作交接时查漏补缺,同时也为尚未接手过工作的职场技术新人提供参考。
0x01 交接要点
工作交接最重要的原则,是双方高效的互动交流。不仅对技术开发者而言,对所有岗位都具有普适性,只靠单方促成的工作交接,可想而知会有多少缺漏。
下面我将作为接替者,从「他给我的」与「我问他的」两个互动过程进行展开,指出每个过程中需要注意的交接要点。在此之前,先列出一些工作交接过程中的基本原则:
- 永远不要问对方离职原因(个人隐私)。
- 若离职者不主动说,在其离职前不要问跳槽去向。
- 可以询问离职时间,有助于工作交接的进度把控。
- 重点是收集离职者手上所有的公司资产信息,其次是掌握已上线项目的部署架构、具体功能、运营情况等,最后是了解项目实现的核心代码逻辑。
他给我的
工作交接刚开始,波老师先将能想到的项目资产移交给我,让我对他几年来的工作有个宏观认识。接下来,将对这些项目资产进行归类,并分析交接要点。
项目代码
公司内部代码通常使用 GitLab 管理,我需要核对波老师移交项目的数目是否正确,确认项目代码的时效性与完整性,自身是否拥有项目的开发或管理权限等。
项目文档
项目文档可分为两类:一是项目开发过程中所用技术的外部文档,二是项目本身的内部文档。
第一类,主要是开发语言、开发框架、外部系统调用接口等文档,由其他相应开发者编写,适用范围相对广泛成熟,对代码层面上的细节与 FAQ 有详细记载,并能够定时更新。
第二类,主要是所接项目本身的说明文档,由项目开发者波老师编写,只对重点项目的部署架构进行说明,包括但不限于各模块的具体功能与部署机器 IP 列表,而对代码实现的描述较为欠缺。其中缘由,一是因为负责此项目的开发者人数有限,难以兼顾日益变化的代码与其说明文档;二是公司也没硬性要求对每个项目必须附属说明文档。
此处应注意,切勿过分依赖于项目文档,而忽视沟通交流在工作交接过程中的重要性。细想一下,开发者需要花大量时间攥写文档,接替者也要花大量时间去阅读理解,并且要求细节覆盖要到位,在工作交接时间紧迫的情况下是不切实际的。话又说回来,倘若平时严格执行开发规范,说明文档能够及时更新,每个项目至少有两位熟悉的开发者,那在交接过程中会大大降低工作量。
系统架构
首先,要熟悉公司内部所有 IDC 机房的部署情况与逻辑区域的划分规则,以及跨 IDC 机房或跨逻辑区域通信时的网络防火墙策略。接着,重点关注大型应用、分布式应用、数据库集群、网络负载均衡等系统部署架构,厘清各模块的具体功能与相互关系。
波老师通过在生产环境实地讲解,并手绘架构图,不仅能使我很快掌握项目部署架构,而且对公司内部的网络架构也有了更全面的理解。
系统配置信息
掌握了系统架构后,波老师将相关项目的系统配置信息列表给了我,其中包括:相关应用系统的部署地址、登录地址、登录方式、管理员账户密码、配置文件关键项、定时任务设定、启停脚本路径等,相关数据库集群的部署地址、连接方式、普通角色与管理员角色的账户密码等。
此外,波老师还传授了如何在生产环境找到特定信息的技巧,例如:
- 通过
crontab -l
查看定时任务,可获取相关功能模块的绝对路径。 - 生产环境通常有保存 IP 列表的文件或查询 IP 列表的工具,可获取相关系统的部署地址。
- 查看应用系统配置文件,可获取其他对接应用系统的 API 地址、数据库连接地址、鉴权信息等。
- 查看 Nginx 配置文件,可了解相关应用系统的反向代理网络拓扑结构。
未完成工单
除了项目资产外,波老师还会把未能及时完成的工单转交给我,包括但不限于事件工单、安全工单、服务工单等。
首先,应厘清各个工单的详细内容及处理方法;其次,应尽快完成当前能够处理的工单;最后,应了解剩余工单暂时无法完成的原因,与相关同事保持沟通,必要时申请工单延期。
我问他的
工作交接进度过半,对波老师移交给我的项目资产有了大致认识。接下来,需要记录理解过程中的存疑,每天再约定好一个时段集中答疑,清空了存疑列表后,再记录新的问题,周而复始,不断完善自身对项目理解的逻辑链。最后要求达到的状态,是其他人对交接项目提出的问题,自己能够立刻解答。
资产清单
波老师移交的资产清单并非完整有序,因此我需要按照不同优先级重新整理资产清单,对尚不明确的地方做好标记,既能快速检验自己对所有资产的掌握情况,还能保证资产交接没有缺漏。
一级目录,根据相同功能模块的大类粗略区分,如入侵检测系统、漏洞扫描系统、Web 应用防火墙等。
二级目录,根据相同功能模块下的子类精细区分,如入侵检测系统的数据采集器、规则引擎、管理台等。
内容方面,简要概括每个子模块的功能,再分别记录生产环境与测试环境的部署地址。
1 | ##### (1)入侵检测系统 ##### |
此外,还要留意日报邮件与告警邮件等特殊资产,其归类方法同上,只需对内容稍作修改:
1 | ##### (2)安全日报邮件 ##### |
资产清单的列举可参考上述方式,按照实际需求再作调整。清单全部列举完后,需要找离职者确认一遍,将模糊之处厘清,将缺漏之处补齐。
对接关系
除了实际项目资产外,波老师原有的对接关系也是一项重要的隐形资产。
对接关系是指在项目开展过程中,与其他同事建立起的必要工作关系,这些同事包括但不限于资源申请联系人、关联子系统负责人、权限审核人员、系统运维人员等,以实际场景举例:
- 测试环境机器申请,需联系资源管理员 A。
- 生产环境网络策略不通,需联系策略管理员 B。
- 数据库扩容,需联系数据库管理员 C。
- 某编程框架的使用问题,可咨询开发专家 D。
与项目相关的对接关系复杂多样,通常只留存于离职者的工作聊天记录或大脑记忆中,而未被针对性地记录整理。因此,接替者应考虑各种可能出现的场景,当相应问题出现时应该与谁对接。否则,当你问了一圈都还未能找到对接人时,则会因为工作时间被白白消耗而感到抓狂。
整理好未知的对接关系后,一定要与离职者确认补齐,因为厘清这些关系后,对后续项目开展会有事半功倍的效果。
鉴权主体变更
项目开发过程中,或多或少会与公司内部其他子系统建立联系,需要调用 API 接口获取其他子系统的内部信息。在此之前,需要向相关子系统负责人申请 API 接口访问权限,而这些权限通常是以开发者波老师的名义申请的。
因此,我们需要整理以离职者名义申请的访问权限,并与相关负责人确认这些权限日后是否会失效。若会失效,则需要接替者重新申请访问权限,完成鉴权主体变更。
收信主体变更
项目运营过程中,开发者会设置与运营情况相关的日报或告警提醒功能。为避免波老师离任后导致系统监控缺失,我需要将日报或告警的提醒功能重置为自己的。
鉴于日报或告警的种类繁多,接替者需要与离职者确认每种日报的上报方式,或每种告警的触发方式,并完成收信主体的变更设置。
需求开发指点
项目交接后,我可能需要继续完成波老师正在开发的需求。由于刚刚接手的项目开发,我需要花费较多时间去理解代码,而波老师能够对当前或排期中的需求,给出合理的指导建议或实施方案,这有助于我快速过渡磨合期。
接替者需要重点关注自己不熟悉的开发领域,根据需求优先级向离职者寻求建议,例如:
- 为了监控程序的 IO 与 网络连接资源占用情况,可以用什么技术或哪个工具库实现?
- 如何根据服务器的 CPU 架构类型下发不同版本的程序?
- 此 SpringMVC 项目在 IntelliJ IDEA 的开发环境配置上需要注意什么?
问题解决方法
项目在开发或运营过程中,难免会出现各种问题,而波老师往往对自己项目可能出现的问题了如指掌,能够对常见问题给出解决方法作为指导,同样有助于我在磨合期内少踩坑。
接替者需要重点关注核心项目的常见问题及解决方法,例如:
- IDS 常见告警的确认方法?
- IDS 安装包下发失败的常见原因及解决方法?
- 数据库出现慢查询的常见原因及解决方法?
对于常见问题,通常有具体的解决方法,但若出现无法预料的问题,或某个问题可能由多种原因导致,则需要掌握问题排查思路,具体问题具体分析,例如:
- IDS 后端服务器重启可能原因及排查思路?
- IDS 采集客户端离线的可能原因及排查思路?
细枝末节
除了上述需要接替者重点关注的问题外,可能还有些细枝末节的问题,需要根据自身情况总结整理,在此暂不归类,包括但不限于管理归属确认、日常操作技巧、流程操作步骤等,例如:
- 某系统的开发或运营我需要关注吗?
- IDS 采集客户端的开发调试技巧?
- 如何快速统计日志文件中特定字段出现的次数?
- 新环境部署 IDS 的操作流程?
- 新版本发布时的操作流程?
0x02 写在最后
在时间洪流的推动下,交接工作不知不觉已基本完成。在某个平常的工作日,波老师收拾完工位后便悄咪咪地离开了,当时还在操作间奋战的我也没来得及跟他道别。得知波老师是去北京追求爱情时,能做的只有在微信群送上最后的祝福:祝波老师北漂之旅幸福美满!
最后,由衷感谢波老师对我项目开发的指导,道阻且长,行则将至,属于自己的战斗才刚刚打响…