从新人到L1
从新人到L1更多是技术能力上的考验,证明你能够把本职工作做好,这个时候需要的更多是硬实力:编程的能力、简单的设计能力。能够把一个定义好的问题妥善地解决,就达到了L1的要求。这个阶段下更多专注于技术解决方案,遇到一个问题,怎么样分解成可以编程解决的问题,在规定的项目期限内完成代码和测试工作,并部署到生产环境里。只要能够证明自己拥有这些能力,就达到了L1的标准。
上面更多是从全局的角度讨论一个L1应该具有哪些能力。
如果拆分开来,技术能力里包含了很多细小而具体的能力,这里试着列举几个:
- 能够熟练地使用项目需要的编程语言。
- 学习并掌握公司内部工具的使用,比如内部的测试框架、内部的部署流程等等。
同时这里也有很多隐含的非技术能力,同样也试着列举几个:
- 准确清晰地说清楚你在做什么,做了什么。
- 了解提问的智慧。
而加入一个新公司或者初入职场的时候,也有很多重要的事情要做,试着列举一些:
- 了解组里的概况,首先是本组的职责以及边界,具体拥有和维护哪些代码。
- 组里目前最重要的项目是什么,每个组员都在从事什么项目。
- 组里本年度的计划是怎样的,未来的路线图是怎么样的。
- 同事们性格如何,老板性格如何。
- 熟悉组里的代码。
- 熟悉公司的内部工具和Workflow,比如代码的管理 -> 代码的测试流程 -> 代码的审阅 -> 代码的合并和部署的流程。
从L1到L2
从L1到L2相对比较容易,大部分时候工作几年就会自然晋升到这个阶段。而比起上一个阶段,这个阶段的要求也只是稍微提高了一些。
技术上,要能够从独立完成一个定义好的问题 -> 能够自己解决一个中等规模的问题,这类问题往往复杂一些,但这种复杂更多是实现的复杂,而非问题的复杂。问题相对来说还是比较清楚的。在接到这样一个问题的时候,思考如何提出一个解决方案,写出一份技术设计文档,然后实现它。这样的问题通常不会涉及到太多的系统,也不会涉及到太多外部的组。可以看到比起L1来说,了解如何设计一些简单的系统,并且能够把这个设计付诸实践,就是最大的变化。这也是了解[[系统设计]]的开始,这是一条漫漫长路,这个阶段对此要求不高。
从非技术的角度来说,这个阶段沟通的重要性就开始体现了。理清问题,和PM沟通,和其他组沟通,和组里其他同事讨论设计等等,这些都需要沟通。当你完成了代码,你也需要通过沟通,来让其他人了解你的成果1。
另一个重要的能力就是写文档。清楚地描述问题和清楚地解释方案都是非常重要的技能。
从L2到L3
从L2 -> L3是一个非常大的分水岭,大部分公司里都把L3叫做Senior Software Engineer,很多公司会把L3作为terminal level,意即这可能是大部分人职业的终点,公司不再对员工有升职的要求,常年呆在这个级别也不会被开除。不同公司的要求对此可能不同,你不一定需要做到这里说到的所有要求,但是你迟早应该朝着这个方向前进。
第一点是心态上的转变,要从Independent -> Self Guide。意即不要止步于服从命令,而是开始自己思考,形成自己的判断和观点。这些判断和观点很多是从经验而来的,经验需要慢慢积累,需要多经历。但是这个心态和态度的改变可以从这个时候开始。
具体来说,L2的时候你可能更多是按照其他人的需求或者已经设计好的要求做事,比如PM说我们需要实现XX功能,其他人写好了设计文档,让你按照要求进行实现。L3的时候你应该开始问自己,为什么这么设计,这么设计好吗,有没有别的实现。XX功能能够实现,但是这些实现是为了短期还是长期?这背后真正想要解决的问题是什么,有没有可能这个功能其实并不是能解决的问题的办法。你和PM应该是平等合作的关系,你应该提供Engineer的视角的建议、策略、想法2。
进一步地,你应该开始从全局思考问题,有没有可能做得更好,当前的需求有没有可以优化的,当前的日常工作有没有可以提高的。从长远来看,这个功能真的是我们想要的吗,它可以在更长的时间范围内有效吗,如果从更长的时间考虑这个问题,我应该怎么设计。
一个完整的软件开发流程可能包含下面这些步骤。发现问题 -> 找到问题的实质 -> 找到需求 -> 确认需求 -> 协调并领导会议 -> 进行设计 -> 追踪进度 -> 实现功能 -> 测试 -> 上线 -> 后续追踪,级别越高,需要参与的环节越多,实现功能只是其中一个环节,可能反而是花时间精力最少的环节。