11 July 2016

(译) Finding Time To Become a Better Developer

作为一名开发人员,我们永远有学不完的东西等着我们去学。工作强度大、行业竞争激烈、技术迭代快(尤其是我们前端),许多人总会感觉自己不够时间去做这去做那,巴不得一天有48小时,甚至更多。刚工作的时候,我很拼,下班回家、周末在家,不是在coding,就是在learning。但是半年下来,连续两场高烧让我的感觉身体都快不行了,我发现我慢慢开始承受不了太大工作强度了,注意力与工作效率也开始慢慢下降了,脾气还开始变得暴躁。这篇文章,从5个方面讲述了我们作为开发者如何更合理的分配时间,保证工作产出的可持续性发展,是一篇非常好的文章,解开了我心中诸多疑惑。于是乎决定翻译出来,一是让自己边译边有更多的思考,另一方面也是跟一些拥有跟我同样烦恼的同志们分享下。

译得不好,大家可以去阅读原文

(文章较长,如果没耐心看完的可以直接看最下面的总结。)

————– 正文开始 ————–

我们总是感觉自己没时间做这,没时间做那:没时间去学所有自己想学的东西、没有时间回过头去重构那些丑陋的代码、总是有各种各样的deadline在靠近、没时间去为所有代码写单元测试、没有时间去写文档或者注释、没时间思考、没时间休息(译者:没时间谈对象…)…blablabla…没时间!

好吧,如果你花几分钟读过这篇文章,我保证你能够找到更多时间去做你认为重要的事情。

我过去一直认为成为一个好的开发者的唯一途径就是疯狂的工作。在这样想法下,我的健康、朋友圈、家庭,都受到了影响。而正是以下这5条关于开发者的时间管理的真理解救了我。

1. 你不需要为了跟上潮流而学习所有的新东西

You don't

You dont.

毫无疑问的,一个优秀的开发者需要不停的学习,但是你关注的学习方向的不同,会对你保持站在行业前沿所需要花的时间上有巨大的不同。

“The old thing is dead. Long live the NEW, about-to-be-old thing!”

首先,不要被每时每刻都在更新的技术博客中的新玩意给愚弄了。大部分新技术、框架、特性,有可能永远都不会被广泛认同,而你其实完全不需要去关注它们。无论技术博客中把那些新技术描述的多么美好,那些最终能够脱引而出的新技术,总是需要花更长的时间才能够得到大家的认同。公司对于生产环境中使用的每一项技术都是一种投资,他们会谨慎的选择每一项技术栈,而不会愿意不停的尝试这些刚刚冒出的新技术。所以,放心吧,你的事业不会受到影响的。

将你的学习重点放在这三个方面,依照优先级从到到底排列如下:

  1. 基础 – 如果你对底层原理非常熟悉,有着扎实的基础,那么你掌握任何一项新技术都将变得非常简单。举个例子,如果你对JavaScript理解的非常深入,那么你在学习一个新框架的时候,将会学得像打字一样快。如果你对面向对象编程理解的非常深刻,那么你将很容易掌握一门面向对象的新语言。深入的掌握一门技术、语言的基础,将能够让你的学习这相关的新技术时效率提高10倍。永远将提高自己的基础知识放在学习的第一优先级。(译者注:个人一直认为基础就像是内功,而各种框架则是各种各样的外功。内功强大了,那么你随便学各种武功都会很牛逼)

  2. 你最常使用的技术栈的最新版本或特性 – 每个人都有自己最常使用的技术栈,她们是你谋生的工具。当她们发了新版本,或者新出了什么新特性,花些时间去研究她们是一种非常合算的投资。

  3. 行业领导者主导的热门技术 – 如果一个大型、被业内广泛认可的公司,如Google、Facebook、Microsoft推出了一些新技术,并且在业内产生了一定的反响,那么这些新技术就是值得你去关注的。就拿前端行业来说,在Ng和React出现之前,业内的框架多如牛毛,竞相争宠,但是当Ng和React出现以后,就直接将她们淹没了。我并不是说别人就不可能创建这种技术上的大变革,只是,大多数情况下,这种“无名”技术只是对行业方向的小扰动罢了,往往并不能引起波澜。(译者注:作者原话是: I’m not saying there won’t be disruptors that come from nowhere and become the next big thing but, more often than not, no-name tech is just noise. 个人感觉有些偏激,但是按概率来说的确是这样的。)

学习时间应该被安排到你每天的计划当中。每天抽出一部分独立的时间来学习,并不需要太久,哪怕每天只花25分钟阅读与实践,积累起来也非常可怕。

2. 写优秀的代码其实比写糟糕的代码花的时间更少,但是主观感觉上并不是这样

Time is a flat circle.

Time is a flat circle.

你可能认为你开发一个新功能需要的时间,到你能把代码跑通就结束了。实际上这只是一个开始,开发一个新功能所需要花的时间,包括将来出现异常时需要调试、定位问题的时间,还包括了将来为了兼容其他功能而带来的代码重构,你的任何错误的决定或者糟糕的设计都将在未来付出相应的代价。当你意识到这个问题以后,就会发现花时间写出高质量的代码是一种划算的时间成本投入。

有两件事情可以帮助你降低代码中可能出现的错误,并且可以帮助你写出良好设计的代码。

  1. 选择测试驱动开发(TDD) – 先写测试,再写出能够通过测试的代码。TDD不仅能够降低你代码中出错的可能性,更能引导你写出优秀设计的代码,因为在TDD时,你必须保证你写出的代码是可测试的,这能让你写出行数与依赖更少的函数。

  2. 使用迭代开发模型 – 千万不要在你把你的功能实现以前去花时间让你的代码看起来更完美。你永远不可能把所有代码完美的在脑海中设计出来,你必须把你需要实现的功能敲出来。然而问题在于许多开发者经常容易犯这种错误,要么是花了太多时间去思考与设计,导致最后没有充足的时间去敲代码;要么就是没有花足够的时间去优化自己的第一种实现。尝试在今后的工作中遵循这条由 Kent Beck 首先提出的规律:“先让代码跑起来,再让代码正确的跑起来,最后才让代码跑得更快更好”。

3. 7*24小时的工作并不会让你成为英雄,而管理期望可以(让你成为英雄)

Home from work. Time to work!

Home from work. Time to work!

就是这条几乎让我挂掉…我过去习惯于答应我老板或者客户给我排的任何疯狂的排期。我害怕说”不”,我害怕让任何人失望。我会不懈余力的满足他们的任何需求。我曾经几乎瘫倒在我的桌子下,不停地喝着咖啡去完成连续40+小时的编程马拉松。

一开始,这让我成为了一颗闪亮的明星。我得到了老板与客户的赏识,我感觉自己是一个英雄。但是,这样的工作节奏并不是一个正常人可以接受并且长时间坚持的,这种工作强度是不可持续的。终于有一天,我开始不行了,我开始生病,开始错过deadline。我开始让人觉得我是不可信赖与不可靠的。这是一个非常糟糕的信号。

慢慢的,我开始意识到这个事情,你也应该开始慢慢接受这个事实,那就是一个真正的英雄,是那些能够保持持续可靠、稳定、让人可信赖的工作状态的人。而唯一能够保持这种工作状态的办法就是学会管理期望。

你需要学会合理的管理你的工作排期,只有这样你才能持续稳定、高质量的按时完成交给你的所有工作。当你刚开始这样做的时候,会发现其实这非常非常的难,因为这意味着你必须学会拒绝以及学会推掉一些工作。

一开始,你的老板或者客户可能会被你的反抗与拒绝感到震惊,但是一旦你证明了你是值得信任的、可靠的,一切都会开始发生转变。

随着时间的推移,你团队中的其他开发者开始延期、提交马虎的代码了,或是开始跟不上节奏,以及慢慢变得不靠谱了。到那个时候,你就自然成为了你们团队中真正的英雄。事实上,正是因为学习到这些道理,让我成为了业内最能满足需求的顾问之一。我为自己建立了高质量、可靠的名声,因为我能够很好的管理期望。

4. 不是花在“优化”代码上的所有时间成本都有着同样的投资回报率

时间的花费是一种投资,正如所有的投资一样,你应该考虑投资时间成本的投资回报率。你时刻应该追求投入更少的时间,来获取更多的价值。

我曾经提到过:“先让代码跑起来,再让代码正确的跑起来,最后才让代码跑得更快更好”。这是一条很好的规律,但是这里面有着一个陷阱,那就是“正确”,并不代表完美,而“快”,并不代表着尽可能的快。

“正确”,意味着代码能持续、稳定的在线上运行,并且是容易维护的。“快”,意味着代码的执行速度并不会对用户体验造成影响。最重要的事情就是你的程序让用户“感觉”快。

所以,不要浪费时间去优化那些基本很少用得到的函数,或者尝试去为那些本身已经比人类眨眼睛更快的函数(300ms)优化个几毫秒执行速度。另外,永远不要因为你刚刚学到啥黑魔法,就说服自己去重构那些已经写完的、能够良好运行的、或是已经有着良好设计的代码。

5. 有计划地休息,能够让你更高产

Dude, relax.

Dude, relax.

这一条对我来说非常难学习和接受,你不把所有时间用来写代码,怎么可能变得更高产?好吧,但这是事实。

根据 Allison Gabriel(Virginia Commonwealth University的管理学助理教授,从事研究工作需求与员工积极性关系)所述,“根据大量研究表明,人类的认知资源是有限的。当你不断的耗尽你的资源,你将无法像你平时一样高效。当你的认知资源被耗尽时,我们可以看到你的工作表现明显的下降,并且你的持续工作的能力与解决问题的能力都将会下降”。

持续不断的工作将造成一系列大脑的反应,如压力、疲劳、负面情绪。这些情绪都将会影响你的注意力,并且会影响你的身心健康。

我们的大脑有自我调节的能力,来保证大脑的工作一切正常,但是这种自我调节能力会随着每天的脑力使用而下降,是一种消耗型资源,每隔一段时间必须得到补充。否则,大脑将变得越来越迟钝,难以完成工作任务、保持专注以及解决问题。

你的身体与精神是需要休息时间的,无论你喜不喜欢,他们都需要得到休息。所以,合理的安排休息的时间。真正的把休息时间安排进你的时间表内,这会让你在休息不工作的时候不会感到有负罪感。而且还能够让你更容易去承担工作压力,因为你知道你的休息时间已经安排好并在不远处了。

更多帮助与资源

为了更好的帮助你,我整理了一些非常有用的资源(视频、教程、网站等)来帮助你更好的理解如果合理的管理时间。你可以点击这里查看

译者总结

  1. 不需要学习所有新东西(比如每周周报中的一些新框架、新概念等等),因为大部分所谓的新玩意,可能过一会就死了。选择学习方向的时候遵循这个优先级: 基础 > 你最常使用的技术栈的最新版本或特性 > 行业领导者主导的热门技术。
  2. 稍微多花时间写出优秀的代码,要远比写出糟糕的代码造成将来的维护成本增加要来的划算。两件事可以帮助写出更高质量的代码: 1) TDD; 2) 使用迭代开发模型。
  3. 7*24小时的工作不会让你成为英雄,合理的预期管理才对团队更有价值。学会拒绝,学会合理的安排排期。短期高强度的爆发与保持持续可依赖相比,后者才是团队更需要的。(并不是说不需要爆发力,作者的意思是学会拒绝一些需求,保证自己的工作排期的合理性,为自己的产出质量负责)
  4. 不是花在“优化”代码上的所有时间成本都有着同样的投资回报率。我认为时间其实是我们一生中最重要也是最贵的资源,任何时间成本的开销都是一种投资。优化代码要找准关键点,打蛇打七寸,不要浪费时间去优化那些很少用到,或者只占运行时间相当少一部分,又或是去将那些本身已经执行得很快的代码优化个几毫秒。
  5. 有计划地休息,保持可持续发展。人的精力是有限的,大脑的恢复是需要时间的,如果把自己的脑力资源耗尽,无论对工作对自己身体都不会是好事情。

Posted in 2016-07-11 11:11


相关文章