原文: 9 Habits I Wish I Had as a Junior Developer

你曾经有过坐下来一一列举你的习惯的时候吗?习惯造就了我们。好的习惯帮助你变成你想要的样子,而不好的习惯会慢慢地将你变成你最不想成为的样子。

在做了12年多的软件开发者之后,我养成了一些令我引以为傲的习惯,也养成了一些我希望改掉的习惯。大多数时候,我并没有意识到我的习惯,但回顾过去,我很清楚哪些习惯帮助我成长,哪些习惯阻碍了我。这促使我盘点并写下一些开发者的好习惯,希望能激励你也这么做。

如果你刚开始做开发人员,看看下面列出的习惯,问问自己这些习惯是否能帮助你成为你想成为的人。意识到你的习惯并积极培养它们,然后成为一名优秀的软件开发者。

自发做一些以前没有做过的事情

在你职业生涯的开始,你知道的事情不多。当你加入一个新项目时,你会觉得自己像是一个“冒牌开发人员”,因为即使你连他们在每场会议上抛出的缩略词、技术和框架的一半都不理解,他们也在向你支付报酬。而另一半你只知道一点点,因为你在谷歌上搜索过。

把“在你职业生涯的开始”换成“在任何新项目的开始”,你就对软件开发职业生涯有了一个很好的总结。

每个新项目,我们都需要重新开始。每一次都有新的人要认识,新的需求要理解,新的框架要学习。这就是为什么学习新东西是很重要的事,如果你只是继续做你知道的事情,你永远不会有信心开始一个新项目,对未知的恐惧总是存在的。

如果你养成了自愿做你一无所知的任务的习惯,你就会不断地学到新东西。

如果一个构建需要被修复,而你从未使用过对应的构建系统,那就开始吧!你将学习到构建管理相关的知识。

如果JavaScript前端中有一个bug,而你到目前为止只做过Java后端相关的工作,那就修复它吧!你将学习新的JavaScript的语言特性。

做一些你没有信心的事情是一个很好的成长方式。不过,一定要管理好别人对你的期望。不要假装你是处理这类事情的高手,告诉他们你以前没有做过,但你想学着去做这件事。

请求结对编程

如果你因为对任务的上下文不熟悉而陷入困境,无法开始任务,那么请找一个在该主题上有经验的人与你结对编程。

结对编程是开始任务工作的绝佳方式。 与你的搭档讨论需求,直到你明白任务的期望产出是什么,然后一起讨论解决方案。

上下文是什么?你需要触及哪些代码库?代码库中有哪些显式和隐式的约定?

但你还可以进一步地进行结对编程。不仅仅是为了开始一个任务而结对,还要安排更多与你的搭档共同工作的时间。在启动任务后,你们需要一起开始工作,你推进任务进度,你的搭档提供建议,然后你和你的搭档进行角色对调。

通过这种方式,你甚至可以了解你的搭档是如何思考和解决问题的。你只会从中受益!即使只是学到了一个新的IDE快捷键。

关于在家工作的说明: 在家工作的那段时间我遇到了以前不会成为问题的事情。我曾经犹豫是否要求队友与我结对编程。曾经在办公室里简单地轻拍队友的肩膀进行高效率的沟通,在远程工作和使用视频会议软件进行沟通时却成了一个很大的障碍。

如果这是你团队中的问题,与你的队友讨论一下(例如,在回顾会议中),之后的沟通会变得容易得多。不同场景下采用的沟通方式只是一个需要重新学习的习惯。

谈谈你在做的事(和你没有在做的事)

我不记得我有多少次欣然接受一项任务后以为自己一天就能完成,但一周后我仍然在执行这个任务。

这种情况随着经验的积累变好了许多,但我仍然发现自己在开始一项任务前,对这项任务做出了过于乐观的估计。有太多的理由让我们做出乐观的评估:

  • 因为截止日期迫在眉睫,需要快速交付这个新功能的压力
  • 在同伴中表现良好的压力
  • 事情没有按照我的预期运行(这是最常让我困惑的一点,即使我有多年的经验,我也依然无法规避)
  • 其他的理由......

很有可能大多数情况下你对任务的评估最终都过于乐观了。面对这种情况,你能做些什么来改变这种现状呢?

你可以在评估任务的过程中管理期望。

不断地谈论你在做什么,是什么阻碍了你。我所说的“持续”并不是指你应该每隔15分钟向整个团队提供一次状态更新。但至少要确保相关人员在一天开始或结束时知道你的处境。

所以,如果你的经理/团队/项目经理/产品经理/利益相关者期待你的结果,每天给他们一个快速的更新:“这是我一直在做的事,这是我下一步要做的事,这是我面临的一个问题,这些都是我的选择。”

这会让每个人都知道你的进步。如果你碰壁了,没人会责怪你,只要你让他们知道。

这将使“为什么花了这么长时间?”之类的讨论成为过去。作为一个额外的好处,状态更新将引发有助于解决问题的讨论。

在最好的情况下,这种状态更新在团队中是仪式化的。它通常被称为“每日站立”,每个团队成员都会快速向团队其他成员更新他们的进度和问题。

但即使你有这样的日常习惯,也请花几分钟时间考虑一下是否应该向不参与“每日站立”的人更新信息。他们应该被包括在内吗?还是应该通过其他方式通知他们?

养成定期向那些关注你的工作成果的人更新信息的习惯。

写博客

对你来说我可能不是第一个这样说的人,但我还是要说:写博客!

它甚至不必是公开的。它可以是公司wiki中的几页,也可以是带有示例代码和几行解释性文本的GitHub存储库的集合。

为什么呢?

因为“带着教会他人的目的进行写作”是一个很棒的学习和成长的方式。

写下你是如何解决一个棘手的问题的。写下如何使用你一直想尝试的新框架。或者把你每周做的事情写在博文里(这也有助于养成“谈论你正在做的事情”的习惯,因为你可以查看你一直在做的事情)。

我开过几次博客。一开始很难保持动力,因为没有人会读你的博客文章,在收不到任何反馈的情况下坚持写作会有一种非常奇怪的感觉,所以我停下来了。然后,我在三年前开始了我现在的博客,在没有读者的情况下写了半年。我才注意到我的“robots.txt”文件不允许搜索引擎索引我的博客!所以我修改了robots.txt文件,人们开始读我写的东西了。虽然不多,但它给了我继续下去的动力。所以,我坚持下来了,在这个过程中我不断调整我的写作技巧,我的博客业发展到每月浏览量超过20万。

这一切都是因为我开始写想学习的框架和已经解决的问题,这样就可以在需要的时候再次查阅我的文章。做这件事的初衷不是因为我想吸引大批观众。

写博客一开始是一件苦差事,但如果你坚持下去,它会变得非常有益。如果你这样做的目的是为了学习和教学,你不仅会学到很多东西,而且其他人最终会注意到你的博客,它将打开一个充满机会的世界。

拥有一个记笔记的本子和一套体系

我最近才成为笔记本的忠实粉丝。我说的不是电脑上的笔记本,而是真正的纸质笔记本。我随身携带它(和一支笔!),这样我可以随时记录我认为重要的事情。

当我听讲座时,或者等公交车的时候,甚至是考虑这周我可以做什么晚餐时,我都会做笔记。

我还使用笔记本来维护列表:我想读的书、我想尝试的框架、我想为我的副业项目添加的功能。最重要的是,我用它在阅读书籍时做笔记,因为这样可以保留我从书中学到的知识。

我把所有压在我心头的事情都记下来。如果我不写下它,它会让我的大脑忙碌不休, 有时甚至会让我感到焦虑,导致我难以入睡。

我在没有笔记本的情况下感到焦虑的原因是我不信任我的记忆。如果你的记忆力很好,可以回忆起你一周前所思考的一切,那么你可能不需要笔记本。但如果你的记忆力像我一样断断续续,这将对你保持平静大有帮助。

要建立对你笔记本的信任,你需要一套体系. 你需要说服自己任何你写入笔记本的内容都不会丢失。

在笔记本的前几页创建一个索引以便检索信息,然后养成定期复习和处理笔记的习惯。

例如,为了处理我在阅读书籍时做的笔记,我会在读完书后复习这些笔记,并在我的博客上写一篇书评。几乎没有人读这些书评,但写书评的过程使我学到的东西更加牢固。

持续记录你的成就

拥有一个笔记本也可以帮助你养成下一个习惯:记录你的成就。

如我所说,我的记忆力在最佳状态下也是断断续续的。我通常能记住昨天我吃了什么午餐,但如果我全神贯注地解决一个复杂的问题,我的记忆效率会大大降低。

这就是为什么我喜欢在一天结束时记录我的成就。这通常不是大的成就,而是小小的胜利 - 比如解决了一个bug,或者完成了我正在开发的软件中新增功能的其中一个步骤。我也会记录个人的胜利,比如坚持早晨的锻炼计划。

我每天晚上在我的笔记本上创建一个要点清单,但如果你更喜欢比如电子表格或其他你最熟悉的工具等数字媒介,你也可以用它们进行记录——只要你能坚持下去。

随着时间的推移,这些成就会累积起来。你可能想标记那些对你来说最重要的成就,这样你以后就可以轻松找到它们。

然后,在像绩效评估这样的场合,你可以查看那个列表,找出与该场合相关的成就,并列出它们以作准备。 有准备的绩效评估总是更有效。

拥有一个你的成就列表也有助于在日常情况下讲述你做了什么(参见习惯“谈论你正在做的事情”)。

为重要任务预留时间

每天结束时,我经常觉得自己什么都没做。虽然记录你的成就或者你做的事有作用,但你仍然需要真正地去完成那些事情。

你可能一直在开会,从一个会议到另一个会议,然后一天很快就结束了。会议结束后,你想继续在会议前开始的任务,但正当你进入状态时,下一个会议就开始了。会议结束后,你又得重新开始,因为你失去了上下文。

频繁的上下文切换会降低生产力。

如果有一件事让我学会提高生产力,那就是为你想完成的事情预留专门的时间段。如果你没有为某个任务预先规划时间段,那么你开始这个任务的机会就会很小。它会被日常工作或其他计划中的工作所占据。

实际上,没有一种单一的方法来实施时间管理习惯,说实话,我每隔几个月就会从一个生产力方法跳到另一个方法。但核心始终是相同的:在你的一天中为你最想完成的事情预留一些时间。

我在早上工作前预留一个小时的时间,为我的博客写文章(或者为其他博客,就像这篇文章一样)。大多数日子,我也会在晚上预留一个小时的时间,当孩子们上床睡觉时,我会用这个时间来做任何可能的副业项目。

目前我有一个Trello板,每周都有一个专栏,我会在那里放置我想要在早上和晚上做的任务。我每周会更新一次那个板子,列出我下周想要做的事情,这样我就不必浪费我宝贵的预留时间去考虑下一步要做什么。

我为我的软件开发工作也准备了一个非常相似的Trello板。每天早上,我会考虑我想做的事情,并将它们放入当天的专栏。

我还会在我的日历中预留至少2小时的专注时间,这样我的同事就不会尝试在那个时候安排任何会议。那时我会完成我的任务清单。

如何管理你的时间实际上并不重要,但重要的是要这样做并将其养成习惯。否则,你的日子会被那些对你不重要的事情所占据。

当遇到困难时,休息一下

作为软件开发者,我们经常会遇到困难。当我陷入困境找不到解决问题的方法时,我真的会很生气。

当你遇到困难时,休息一下是一个显而易见的建议,但实施起来却很难。“我离解决这个问题非常近了,现在我不能休息!”

而且现在休息意味着稍后我需要重新回到思考这个问题的状态。上下文切换是浪费时间的首要原因,为什么我应该刻意地切换上下文呢?

当你陷入困境时,你的思维并不清晰。你会想到“自己陷入到这个问题中”是多么的愚蠢,你的团队成员可能会很容易地解决它,以及为什么他们总是得到简单的任务。但你并没有思考如何解决这个问题。

休息一下,转而做一些其他事情。或者更好的是,第二天再试。离开问题一段时间会让你发现之前想不到的解决方案。

如果你之前没有尝试过这种方法,你不会相信多少问题在第二天早上就“神奇地解决”了。而这主要是因为你发现了一个之前没有想到的解决方案。

“去休息”这件事说起来很容易,但是你如何判断自己当前处于“困境模式”,然后说服自己暂时放下问题不去工作呢?

说实话,我自己在这方面并不擅长,因为我通常希望尽快完成这个愚蠢的任务,这样我就可以证明我已经取得了一些成果!

但我发现对我有帮助的是将我的一天分成30分钟的时间段,并在每个时间段结束后进行简短的回顾。 这种技巧被称为番茄工作法,源于那些番茄形状的厨房计时器。

每个番茄时钟结束后,我会问自己我是否仍然处于“解决模式”,或者我是否陷入困境,应该暂时做些其他事情。

番茄工作法的一个好处是,你可以将一个单位时间的结束作为其他习惯的触发器。

例如,我用它作为站起来伸展一下肌肉和喝点水的触发器。这有时被称为“习惯叠加”,因为你在一个习惯上叠加另一个习惯,这是非常有效的。

如果你想更多地了解习惯,我强烈推荐詹姆斯·克利尔(James Clear)的书《原子习惯》(Atomic Habits)。

不要追求万金油

我写了一本关于特定架构风格的书籍,我经常收到这样的邮件:“我喜欢某种架构风格,我想在所有项目中都应用它!我该如何做呢?”

你能猜到我的答案是什么吗?

没有一种单一的架构风格适用于所有问题。

当项目规模较小时,你可以构建一个简单的CRUD API。当你有一个复杂的领域模型时,你会构建一个更复杂的六边形架构。当你在特定的上下文中构建微服务时,你可以使用上百种不同风格的架构。

同样地,没有一种单一的框架适用于每一个项目。也没有一种单一的最佳编程语言或编码风格。

不要追求万金油,它们并不存在。

如果你的观点有充分的论据支持,那是好的。 “这是最好的架构风格”或“我一直都这样做”并不是好的论据,人们会拆穿它们。

想象一下,你的团队中有一个开发者,对所有事情都有自己的看法,总是想按照自己的方式去做,“因为这是最好的方式”。你会很快厌倦这样的人。不要成为那样的人。

养成这些习惯!

哇,这篇文章比我想象的要长。我希望这篇文章能给你一些启发,让你知道在发展软件开发者的职业生涯时应该考虑些什么。当然,我还没有完全掌握这些习惯,但我每天都在努力做得更好。

选择一个最能让你产生共鸣的习惯,并有意识地把它应用到日常工作中。

期待你在Twitter告诉我这些习惯是如何行之有效的!我很高兴能收到你的反馈。