让有经验的工程师来做系统设计
写于2023年02月26日

是的,正如标题所示,应该让有经验的工程师来负责系统设计。

有时由于各种原因,初级工程师会被要求负责系统设计,这是可以理解的。毕竟我们必须利用现有资源来实现目标,而不是所有工程师都能承担这一重任。此外在项目开始时期,「让系统可以尽快交付工作更重要,花大量时间思考好的系统设计放在以后在做」很容易说服人。

因此,很多初期设计粗糙的系统在后期迭代中会带来很多问题,例如:

  1. 难以扩展,变得臃肿且难以理解,无法适应未来的需求变化,或者使用更多 hack 的设计来适应当前系统(这样糟糕的代码往往被同行戏称为“屎山”,而很多糟糕的代码都是由糟糕的设计导致的);
  2. 很不稳定,由于修复当前存在的错误而导致系统其他地方出现错误,往往需要增加人力以实现交付目标;
  3. 可维护性差,难以修改或修改成本巨大;
  4. 性能可能存在问题,初期为了上线的 MVP 版本可能会忽略这些性能问题,但如果在后期迭代中不加以解决,这些问题将持续存在。

经验丰富的工程师由于其经验丰富,在设计系统时通常会考虑上述问题,并根据业务权衡各种可行方案,因为:

  1. 他们拥有更广阔的软件开发视野 - 他们可能开发了各种不同需求和条件限制下的系统,更清楚哪些技术可以完成哪些任务,如何搭配可以更有效地实现目标;
  2. 他们理解整体愿景 - 他们从整体视角看待这个软件「产品」,从真实用户那里获得(或意识到)反馈,例如你开发的系统只是客户使用的系统中的一个子系统,当用户使用该子系统时,如何与其他模块(或竞争对手的产品)协同工作,你只能从用户那里看到真实场景。软件「产品」不仅是其中的代码;
  3. 他们可以识别潜在问题 - 有经验的工程师往往能够在潜在问题成为大问题之前察觉并避免;
  4. 他们还可以指导其他开发者 - 他们懂得如果需要让系统一直保持良好的改进和迭代,让参与者更好理解其设计理念,然后保持整洁。怎么保持呢?详尽的设计文档和相关指南,懂得将他们的知识沉淀下来,让后来者乘凉。在项目后期,这些优势会表现得更加明显。
  5. 他们懂得用简单的语言把他们的意图或者复杂概念传达给利益相关者 - 跟第 4 条很接近,但是这里的对象并不是开发者,而是开发者之外的非技术专业人。

因此,让有经验的工程师来主导初期的系统设计,或者后期的系统改良,是非常重要的。当然,对于初创公司或者团队来说,可能没有足够的资源来聘请有经验的工程师来设计系统,这时候可以考虑寻找合适的外部技术顾问或者利用在线资源来获取专业的建议和指导。