前言
软件工程师的成长路径往往遵循一个自然的演进过程:从缺乏经验的新手,发展到中级工程师,进而成为所谓的'经验过剩'的工程师。一旦进入这一阶段,部分工程师对编写核心代码的兴趣可能会显著降低。那么,有哪些迹象表明你可能已经陷入了'经验过剩'的状态?
奇怪的是,无论在哪家公司工作,大多数经验丰富的工程师都会表现出一些相似的特征。由于他们缺乏对代码本身的专注,在设计上花费的时间往往超过了实际写代码的时间,这在一定程度上拖慢了整体团队的开发速度。
从新手到'经验过剩'的转变并非一蹴而就。然而,经过多年甚至几十年的磨练,这些工程师会逐渐转变思维模式。几乎每一家公司都是如此,不断应对这些人的需求和不必要的忙碌工作确实令人沮丧。无论你是新手还是资深工程师,了解这些特征有助于避免这种发展趋势。
浪费时间重构
在业界,关于代码质量的讨论从未停止。有观点认为,删除和重构代码比编写新代码更有价值。这种工作不应仅仅被称为软件清理,而应上升到软件工程的高度。
我们应该设计代码而不是维护代码。维护代码的工作可以由其他人胜任,甚至实习生也可以胜任。软件工程师应该花时间编写旧的低效代码,而不是尝试改进旧的基础架构。为了保证系统正常工作,你甚至可以通过临时方案把这些代码组织到一起,将来必然有别的工程师接管我们的代码,在现阶段我们无能为力。然而,经验过剩的工程师总是觉得有必要维护旧代码。
过度追求完美重构往往会导致项目延期。在敏捷开发的背景下,快速交付价值比完美的架构更重要。如果为了重构而重构,不仅消耗资源,还可能引入新的 Bug。因此,适度的代码优化是必要的,但不应以牺牲交付速度为代价。
重心放在了顾全大局而非代码
在这里,需要澄清一点:顾全大局和业务并不完全是软件工程师的核心工作,我们的工作只有代码!
经验过剩的工程师习惯于重视大局胜过代码本身。他们喜欢提出的问题包括:'谁会受到这个项目的影响?'、'最终用户将如何与代码交互?'以及'我们将如何维护这些代码?'等等。
他们浪费了大量时间来了解项目的范围以及对公司的影响。有时,他们甚至会挑战领导,认为自己有'卓越的解决方案'。如果他们一味地专注于'影响'和'优先级划分'等诸如此类微不足道的事情,怎么可能有时间写完所有的代码呢?
将所有时间都花在各种会议、统计指标和代码审查上,我们只能眼睁睁看着写代码的时间一分一秒流逝。经验过剩的工程师对缺乏经验的工程师没有信心,对此我们一点也不会感到惊讶。缺乏经验的工程师只会全力以赴写代码,并按照吩咐做事,即便范围可能过于复杂。
这是因为优秀的程序员不会质疑他们的工作。相反,无论面对何种请求,他们都会低下头写代码。无论何时,对公司产生的影响都应该留给业务去评判。我们作为程序员的工作就是实现代码,而不是设法搞清楚哪些工作有价值,或如何适应公司的战略。
我们需要提醒经验过剩的工程师:你们是程序员,不是领导。
对他们来说,设计文档不可或缺
出于某种原因,经验过剩的工程师总是想要设计文档。
无论项目的规模大小,不考虑设计文档,全神贯注写代码可以快速推进项目。你大可不必纠结你需要哪些对象,或代码需要实现哪些操作场景。
从我们的角度来看,我们发现将一切记在脑海中要容易得多。即使拥有数千行代码,也并非难以管理。
我们不会用略微不同的对象或其他东西重复创建同一个功能。 我们不会使用多个对象创建重复的功能。
为什么经验过剩的工程师如此关心这些问题呢?
最后,如果我们不需要花时间思考设计文档,那么就可以将写代码的速度提高十倍,而且能够更有效地工作。
他们不喜欢'过于复杂'和'过度设计'。有时,我认为有些工程师不会考虑其他人的代码。因此,在创建一个模块的时候,你可以利用在学校学到的所有技术,将所有面向对象的概念都融合到一起,然而他们认为这种代码属于过度设计。
就个人而言,我认为他们只是不愿认真思考别人出色的工作。花点时间理解对象 A 继承了对象 B,而 B 调用函数 C,而 C 又调用函数 D,有时选项 F 或 G 会从配置文件 E 中获取信息,而 E 会通过函数 F 解析来自数据库 G 的数据,然后将日志存储在 Hadoop、CouchDB 和 S3 中,这很难吗?
他们会抱怨说,这些代码太优雅或过度设计。保留精心设计的代码,易于维护的生产环境,这些不过是掩盖他们懒惰的托辞。他们只想让年轻的工程师编写过于简单的代码。
虽然,简单的代码方便阅读和理解。但作为工程师,我们面对的不仅仅是简单的工作,我们需要面对复杂的问题,创建复杂的解决方案。有时候,过度的文档化反而成为了阻碍创新的枷锁。
永远在追逐未来
我只知道目前使用过的几个框架,而且我只需要知道这几个框架。
然而,经验过剩的工程师花了大把时间学习新的框架和语言,或者新的设计原则。
这一切似乎都在浪费时间。作为一名工程师,在大学毕业后你就应该掌握所有的技术,之后的技术都不重要。有些人甚至还在 LeetCode 上做练习和学习,好像他们要去参加面试一样。软件工程师又不需要担心失业。
难道不是每个人都会在大学学习编程语言吗?
盲目追逐新技术往往导致基础不牢。频繁切换技术栈会让团队陷入持续的学习成本中,而无法沉淀出稳定的技术资产。专注于现有技术的深度应用,往往比浅尝辄止地学习新工具更能带来实际的业务价值。
写在最后
经验过剩的工程师阻碍了整个社会的发展。


