1. 前言
个人在 web 前端开发方向已经呆了近 8 个年头了,前端的基础也算比较扎实,开发经验也有相当的积累。近一年作为前端小组长带着几名成员一起做业务开发,工作中碰到的大问题也不会太多,所以最近在思考如何进一步提升自己。
除了老生常谈的提升开发管理、前端架构设计、技术深度、技术广度等能力,有没有更具体的一些经验和方法来实践呢?毕竟技术成长还是很依赖环境的,工作或开源社区的实际开发经验才能让技术有所沉淀,不然很多时候自学都只能在技术表面或略深一层做探索。
三人行必有我师,向优秀的人学习总是能快速成长的方法之一。通过阅读《卓有成效的工程师》,再结合个人理解做些总结分享,内容分为三个部分:个人提升,工作准则、团队成长。
-
个人提升
- 争取每天至少进步 1%。学习就像利息一样具有复利,让雪球滚起来。
- 利用工作中的机会来提高你的技能。工作中的开发任务是实践你技术的最好时机,同时向最优秀的同事学习,研究他们的代码及评审记录。
- 制订”如果...就...”计划来对抗拖延症。将想做某事的意图与一个触发点绑定在一起,会大大增加完成这件事的可能性。
-
工作准则
- 利用杠杄率来衡量工作成效。专注于时间投资回报率最高的工作,系统性地提高杠杄率。
- 避免多任务并行状态。避免将注意力分散在多个不同的任务上,不然只会降低整体工作效率。
- 在工具上投资。提升使用工具的技能,同时为重复性工作创建自动化工具,工具的使用次数越多,在复利效应下获得的益处就越大。
- 在单人项目中工作时,要想办法定期征求反馈。一个人做独立项目可能很容易也很舒服,但也可能会忽略某些巨大的风险,如能及早发现,就可以避免浪费大量的精力。
- 定义可度量的里程碑。有明确定义的里程碑可以提醒我们是否偏离了正轨,根据里程碑及时调整方向。
-
为团队成长投资
- 建立代码审查文化。代码审查有助于形成良好的编码实践范例,学会在代码审查和快速交付之间找到合适的平衡。
- 任务排期要留出缓冲空间。充分考虑团队成员相互冲突的工作职责,以及假期、疾病等因素。项目的时间越长,其中一些情况发生的可能性就越大。
- 对入职培训和指导进行投资。越快地培养新的团队成员,团队就越高效;团队越高效,我们就有越多的自由来处理不同项目。
- 建立代码的共享所有权。共享代码所有权也意味着每个人都参与维护代码,而不是由某一个人承担全部责任,这将使你能灵活地专注于其他高杠杄率的活动。
- 汇报并记录集体智慧。与团队成员一起对项目复盘,了解哪些方面是成功的、哪些不是,记录和分享经验及教训。
2. 个人提升
2.1. 争取每天至少进步 1%
相信大家都知道这个数据:1.01 的 365 次方 = 37.78343433289,每天都进步一点点,厚积薄发。同时你学得越多,就越容易运用学过知识和经验来学习新事物,这就是学习的复利。
说的容易,实际行动却没那么简单,你可能因为加班、玩游戏、家庭琐事等等原因,在一天繁忙之后只想刷刷短视频,下面提供几个建议让你学起来:
- 立即行动,当你的大脑还在犹豫是刷视频还是学习时,直接身体先行动起来,坐下来学习,学了一会后犹豫也就不存在了。
- 利用多巴胺的力量,你是否发现当你计划要一门新技术或者收藏了一篇好文时,你会很期待,感到很快乐,因为这是多巴胺在起作用,它驱使着你去追求新事物。一旦你开始学习,多巴胺不再起作用,往往这时候大多人感觉学习时比较枯燥的事情,就放弃了。这时你可以在设置一些目标,激活多巴胺,比如我持续学习,明年就可以涨薪。不过学习这个过程还是由当下分子如血清素控制的,当下分子驱使你享受可以立刻拥有的东西如刷短视频,拥有及时的快乐,就是血清素之类的物质在起作用,所以要学会享受学习过程,让当下分子给你带来快乐。
- 学习的内容可以不都与软件工程技能有关,从长远来看,成为更快乐、更好的学习者将帮助你成为更有成效的工程师。
2.2. 利用工作中的机会来提高你的技能
在工作中你的技能提升速度肯定比自学快,除此之外,你可以每天抽一两个小时出来提升自己(工作量比较饱和的话可以提前大半小时来公司或者午休抽些时间之类的)。这些时间你可以用来做以下这些事:
- 学习公司里优秀的工程师编写的核心抽象代码。
- 如果编程是你的弱项,你可以在这些时间编写更多的代码。
- 研读公司内部可获取的技术和学习资料。
- 更好地掌握你所使用的编程语言,读一些优秀书籍。
- 勇于学习自己不熟悉的代码,读一些开源社区优秀库的源代码。
利用 20% 的时间创造学习机会,你的技能和工作效率就会稳步提高。
2.3. 制订”如果...就...”计划来对抗拖延症
有时候,阻碍我们自我提升是拖延症。在面对困难或不感兴趣的事情时,我们往往喜欢能拖延多久就多久,但是这会大大降低我们的效率。
尝试用”如果...就...”来对抗拖延症。比如:如果今天 6 点准时下班,我就花 1 个小时看书;如果会议提前结束,我就去调查这个长期存在的 bug 等等。一旦触发了信号,随后的行为则会“在没有任何意识的情况下自动发生”。
3. 工作准则
3.1. 利用杠杄率来衡量工作成效
在工作久了后,就会碰到一个问题,就是作为在这个领域呆了很多年的你,自身的优势有哪些。除了完成一些常规任务开发外,你更应该将时间投入到高杠杆率的事情上。杠杆率=产生的影响/投入的时间,换句话说,杠杆率就是时间的投资回报率(ROI)。
整体杠杆率即单位时间内产生的价值,只能通过以下三种方式增加:
-
减少完成某项工作所需时间。
-
增加该工作的产出。
-
转向杠杆率更高的工作。
可以将这三个方式转化为三个问题,可以用来评估我们正在进行的工作:
-
如何在更短的时间内完成这项工作?
-
如何增加该工作产生的价值?
-
是否有其他工作可以在当下创造更多价值?
例如通过一些方式提高会议的杠杆率:将会议时长设置为半小时,而不是 1 小时,以便在更短的时间内完成同样的工作量;为会议准备一份议程并设立一组目标,在会前分发给与会者,使会议上的讨论更加集中且更有成效。
我们应该把精力集中在杠杄点上,平时可以写下待办事项清单并时常回顾,优先处理高杠杆率的事情。
同时注意将精力花在调整任务的优先级上,而不是试图记住它们,将大脑当作处理器,而不是存储器。
3.2. 避免多任务并行状态
如果你将注意力分散在多个不同的任务上,最终只会降低整体工作效率。比如你在开发一个新任务,同时你的前一个任务正在测试中,工作时测试人员时不时会抛出一个问题让你去修复,你如果不断在开发和修复 bug 中切换状态,虽然感觉很忙碌,但是效率肯定不如先专注开发任务,随后找个时间集中处理累积的 bug。
微软研究院的一项研究发现,在被邮件和即时消息打断后,员工平均需要 10~15 分钟才能恢复专注的工作状态,所以我们需要更长、更连续的时间块来提高工作效率,要避免频繁被打扰。
3.3. 在工具上投资
当你向软件工程领域的大佬请教哪些投资收益最高时,“工具”是最常见的答案。我们要提升使用工具的技能,同时为重复性工作创建自动化工具,工具的使用次数越多,在复利效应下获得的益处就越大。
找到一个可以用工具节省时间的领域,构建出工具并展示其价值,这也是一个高杠杆的任务。虽然构建工具是一项重要但不紧急的工作任务,但是不要因为需要不断发布新功能的压力而将它搁置起来。
3.4. 在单人项目中工作时,要想办法定期征求反馈
一个人做独立项目可能很容易也很舒服,但也可能会忽略某些巨大的风险,如能及早发现,就可以避免浪费大量的精力。比如你接到了一个较大的任务,随后就直接开始了开发工作,花费了两周的时间终于完成了开发,当提交大量代码审核时,却被告知你的底层实现不够通用,需要重新设计,这就造成了开发时间的浪费。
虽然从事单人项目本身并没有什么问题,但它确实会带来额外的风险,如果不予处理,就可能会降低个人成功的概率,所以要想办法定期征求反馈。同时独自工作时,项目的低谷会让人更加沮丧,如果项目中至少还有另一个人,即使你被卡住,团队仍然可以维持整体势头并保持士气。
下面是一些单人工作时候的建议:
- 尽早并经常提交代码进行评审。相信大家都不喜欢大批量的代码的评审,当你完成一个模块的内容,就可以提交代码申请评审。
- 在编写代码前先完成设计文档的编写。虽然会增加一个额外的工作量,但是可以锻炼自己的设计能力,同时保证项目整体方向的正确。
- 在投入太多时间之前,征求对有争议的功能的支持。
- 征求团队成员的反馈,问问其他人对你现在功能的实现有什么看法。
3.5. 定义可度量的里程碑
当我们开发一个较大的项目时,我们都会设置一些具体的目标,随后我们就会朝着这个目标前进。除了具体的目标,同样很重要的是列出可度量的里程碑,它可以帮你跟踪进度,因为里程碑是可度量的,系统要么满足标准并按所承诺的方式执行,要么没有。
例如对于前端项目重构来说,里程碑包括:
- 完成脚手架等前端工程化和技术栈升级。
- 完成基础能力升级并在菜单管理页面完成验证。
- 完成其他页面升级。
4. 团队投资
4.1. 建立代码审查文化
代码审查的好处是显而易见的,包括以下几点:
- 尽早发现错误或设计上的缺陷。2008年,一项针对 650 家公司的 12500 个项目的软件质量的研究发现,通过设计和代码审查平均可以消除 85% 的剩余 bug。
- 增加做代码变更时的责任心。如果知道团队中有人会对代码进行审查,你就不太可能在代码中添加一个快速但丑陋的临时解决方案,然后把这个烂摊子留给另一个人解决。
- 如何写好代码进行积极的示范。代码审查提供了分享最佳实践的途径,软件工程师可以从自己审查的代码中学习,也可以从其他人审查的代码中学习。
- 分享代码库的知识。有人审查过你的代码,这确保了至少还有一个人熟悉你的工作,并且当你不在时可以替你解决高优先级 bug 或其他问题。
- 增加长期的敏捷性。代码的质量越高,越容易理解,修改起来越快,并且越不容易出现 bug。这些都可以直接提升工程团队的迭代速度。
对于代码审查会影响迭代速度这点,你需要找到适合你和团队的代码审查的正确平衡点。你可以在迭代早期只审查核心代码,在迭代进入平稳期在进行更全面的代码审查。
4.2. 任务排期要留出缓冲空间
我们应该在排期时考虑一些缓冲时间,每天的工作时间是 8 小时,但是我们并不可能将 8 小时都投入到开发任务上,我们会查看邮件、开临时会议、负责线上问题排查等各种事项,这些事情会打扰开发进度,同时需要充分考虑团队成员相互冲突的工作职责,以及假期、疾病等因素。
开发排期时要是忽略这些点,你的项目往往会出现延期情况。为了避免项目时常出现延期现象,在排期时更多考虑一些其他影响,尤其是长期的项目。
4.3. 对入职培训和指导进行投资
高质量的入职培训流程是提高团队效率的强大杠杆点,如果你已经入职一段时间,而且是一名经验丰富的开发者,你或许想知道帮助新员工适应工作环境对你个人有什么好处?为什么要从自己的工作中抽出时间做这些事?
请记住,为团队的成功投资意味着你也更有可能成功。用心地培养新的团队成员,最终会使你能够更灵活地选择杠杆率更高的活动。团队的规模越大,成员的能力越强,意味着做代码审查就越容易,可以修复 bug 的人越多,能参与响应系统告警和提供支持的人越多,完成更大型项目的机会也就越多。
对于入职流程,我们应该实现以下几点:
- 帮助新人尽快度过适应期。员工越早进入状态,他们就能越早创造有意义的产出。
- 传授团队的文化和价值观。拥有相同的价值观才能更好的朝着同一目标前进。
- 让新员工了解项目组的基础知识。
- 通过社交方式让新员工融入团队。
4.4. 建立代码的共享所有权
共享代码所有权也意味着每个人都参与维护代码,而不是由某一个人承担全部责任,这将使你能灵活地专注于其他高杠杄率的活动。虽然感觉上成为唯一负责某个项目的软件工程师会增加个人的价值,但是共享代码所有权才更有利于自己,也有利于整个团队。
如果你不想再某个年假时间被工作不停的打扰,你就应该更注重这件事情;又或者你的大部分时间都花在响应问题、维护系统、调整功能或修复系统中的错误上,而这仅仅因为你是这块领域的专家,这将导致你就很难找到空闲时间去学习和构建新的事物。
以下有一些增加共享代码所有权的策略:
- 避免出现一人团队。
- 互相审查对方的代码和软件设计。
- 团队成员轮流承担不同类型的任务和职责。
- 保持代码的可读性和高质量。
- 为软件编写文档,不管是高层的设计文档还是代码注释均可。
- 将完成工作所需的复杂工作流程或不是常规的实现方法用文档记录下来。
4.5. 汇报并记录集体智慧
与团队成员一起对项目复盘,了解哪些方面是成功的、哪些不是,记录和分享经验及教训。项目复盘要是做的好也是一项杠杆率很高的活动,它可以避免团队第二次或更多次的出现同一问题,也有助于避免相关类型问题的出现。
对于这点,团队除了定期开会做一些项目复盘,还可以建立知识库。你可能花费了大半天的时间,解决了一个困难的问题,如果其他人也碰到了该问题,他可能也花费了同样的时间才解决该问题,这就造成了开发时间浪费,建立一个知识库可以大大地增加知识的流通性。
5. 总结
上述提到了很多具体的实践点,在一开始,你可以选择其中的几点去实践,比如:争取每天至少进步 1%、利用杠杄率来衡量工作成效、建立代码的共享所有权等等。当你将这些实践点变成习惯后,你可以选择更多的建议在自己的学习和工作中去实践,一步步让自己成为卓有成效的工程师。