原文:What Makes a Senior Engineer? Writing Software vs Building Systems - codewithstyle.info
初级工程师聚焦于软件开发,他们看重代码质量、最佳实践、最新的技术栈。他们会花大量的时间去学习新的技术,对他们来说,终极目标是编写优雅的、性能优越的、可维护的代码。
高级工程师关心的则是构建系统,对他们来说,软件开发只是其中的一个步骤而已。首先,他们不会一上来就构建一套系统,他们会先去质疑构建系统的必要性。他们会去深究系统到底解决了什么问题?为什么必须要解决这些问题?用户群体是谁?使用规模有多大?他们会深入思考软件的运行环境,以及怎么去监控系统运行状况。他们还会去衡量软件是否真的解决了预期需要解决的问题。
构建系统比软件开发难多了,它甚至可能会让人产生不适感。作为工程师,待在自己的舒适区专注于不断打磨代码毫无疑问是非常有吸引力的一件事。确定需求是产品经理的活儿,代码部署就该是运维团队干的事儿,这似乎已经是行业共识了。然而,你——最了解软件怎么运行、怎么监控、怎么快速扩展的人——参与到构建系统的这些环节中,是能够带来很大的价值的。此外,你分析问题和解决问题的能力使你对产品需求的见解弥足珍贵。
技术水平当然很重要,优雅的、性能优越的、可维护的代码不容易崩溃,扩展性更好。但它解决的可能是一个错误的业务问题,亦或者用户出于某个未知的性能问题压根不喜欢这个产品,而你由于监控不到位根本不知道原因到底是什么。
那么,构建一个系统需要做哪些事情呢?我列了一个并不全面的清单:
- 明确需求 - 与产品经理协作,理解他们想要解决的问题;说不定你会有成本更低的解决方案呢?
- 明确非功能性需求 - 与项目经理沟通非功能性需求 - 系统用户量有多大?对性能、吞吐量和延迟的要求是什么?是否有安全或合规方面的考虑?是否需要审计?可用性要求是什么?
- 规划迭代 - 与团队一起制定迭代计划;确保尽快交付;与项目经理就里程碑达成一致。
- 确定外部依赖 - 明确项目所有的外部依赖,与技术经理或外部团队直接合作,确定这些依赖项的预计完成时间。相应地调整你的里程碑。
- 测试 - 与测试团队一起明确测试策略。就推出所需的质量阈值达成一致(例如,没有未解决的重大错误或测试覆盖率超过 X%)。
- 部署 - 与团队一起确定部署方案。是否需要新的基础设施?还是可以重用现有的基础设施?如果需要,投入要多大?
- 可观测性 - 明确如何监控系统的运行状况,并建立解决生产问题的流程(例如 on-call 团队)。使用第三方解决方案(如Sumo Logic)设置监视器和仪表盘。
- 上线沟通 - 一旦团队就上线日期达成一致,请确保通知到所有相关人员。检查是否需要更新上线文档。
- 衡量结果 - 制定衡量项目是否成功的指标。有人在用新系统吗?用户是否能够顺利完成操作?可以利用可观测性套件来实现此目的。
我见过许多工程师,他们坚信提升职业生涯的唯一途径是提升他们的代码能力。虽然这很重要,但对公司来说,唯一重要的是你对业务的影响有多大。将重点从代码转移到系统会让你有更大的提升。