以下是我在担任开发者期间所获得的九条经验
我14岁的时候开始在父母家的卧室里写代码。我记得我通过我非常慢的网络连接阅读了我能得到的一切。然后在我20岁的时候,我签署了我的第一份合同,成为一名网络开发人员,当时学习了PHP和JavaScript。
而我在这个领域花了18年多的时间才明白,编码只是我们职业的一小部分。我仍然喜欢它,注意。我认为我永远不会停止编码--即使是在业余时间的乐趣--但除此之外还有很多东西。 这就是为什么我想和你分享我的经验,以及我认为开发人员在某些情况下往往认识的有点太晚的九条经验。
1.自我主义
事实上,开发者通常都有较强的自我主义。
为什么呢?我认为,任何认真对待自己职业的人都会认为自己在某种程度上是一个艺术家。是的,我们可能不会在数百万人面前唱歌或画蒙娜丽莎,但我们有时会编写代码,以优雅和高效的方式解决非常复杂的问题,我们不能不为我们的工作感到自豪。
我认为,通过解决问题的方式,开发人员和数学家一样是一个艺术家。
正因为如此,我们倾向于围绕在我们的代码周围--就像熊妈妈照看她的后代。我们创造了它,我们爱它,我们不能忍受人们开始争论它可能或不可能有多大错误。
话说回来,这对任何人都没有帮助。我们热爱我们的工作,但我们需要明白,我们正在解决问题。通过与他人讨论我们的想法和我们的解决方案,可能会出现更好的选择。这并没有错。事实上,合作通常是产生最佳解决方案的因素之一。
在我的工作中,我见过各种各样的自负,我从未见过这种自负对开发者有利的情况。
所以我的建议是?从你开始做开发工作的那一刻起,就把自负留在门外。咽下这口气,听听别人对你的工作有什么看法。接受更好的想法可能来自你的头脑之外,而且它们会帮助你提高你的技能。只有听取反馈意见,你才能获胜。
2.语言是一种工具。如果你只知道 JavaScript,所有问题都会像钉子一样。
不要再称自己为Java开发者或JavaScript开发者。是的,可能有一些语言是你喜欢的,因为你喜欢它们的功能或语法。这是很正常的。
然而,如果你暂时学习其他的东西,你会受益匪浅的。学习新的语言--特别是如果它们遵循与你习惯的工作模式不同的范式--将帮助你打开思路,以不同的方式解决问题。
这一点我怎么强调都不为过。学习多种语言并使用一段时间,会对你的技能有所帮助。几年前,我读了一本名为七周内学会七种语言 的书,这本书让我开阔了眼界,有了很多选择,因为它让我看到了更多的选择类型。我甚至从来没有考虑过这些选择,因为我是如此专注于我的日常任务和日常工具,我从来没有停下来看看其他地方。
我们是开发者。我们知道如何通过代码来解决问题。不要把自己放在一个盒子里。你会被那个盒子的大小所限制。要跳出这个框框,想一想,看看其他的选择,其他的语言,其他的解决问题的方法。即使是一小段时间,你也会带着新的想法和更大的心态回到你选择的武器中来。
3. 这不是关于记忆算法,而是关于知道如何足够快地搜索它们
有时,新的开发者认为他们需要熟记一切,所以当他们意识到他们开始忘记如何写一个简单的for语句时,他们就开始感觉很糟糕。
但是,这不仅是正常的,而且我认为这也是健康的。
外面有太多的东西需要背诵。我们也不需要这样做。我们需要接受这样一个事实:互联网只是我们武库中的另一个工具。就像我们需要我们的IDE一样,我们需要上网来寻找答案。
我们都是这样做的,如果你刚开始做,感觉不好,不要把时间浪费在这种感觉上。只要搜索你的答案,找出你的问题就可以了。
这样想吧。每种语言都会有一种类似但又略有不同的方式来实现观察者模式。你认为谁更现实?是了解观察者模式有什么用,它能解决什么样的问题,还是记住如何在你工作的每一种语言中实现它?
如果你知道它能解决你的问题,那么你就从字面上解决了你的问题。剩下的只是在谷歌上搜索实现它的最佳方法。这并不是从你的工作或你的经验中抢走任何功劳。
你所做的其他每项搜索也是如此。只要专注于我们职业中重要的、解决问题的一面,让谷歌唤起你的记忆。这就是它的作用。
4.在整个职业生涯中你将不断学习
或者说 "你应该在整个职业生涯中不断学习"。是否能跟上行业的最新发展,真的取决于你自己。但如果你想保持相关性,那么你就必须这样做。
技术在发展,语言在演变,这完全是正常的。诚然,一些生态系统的变化比其他的更快,跟上它们可能看起来是一个巨大的任务。但要专注于重要的事情,记住你只是一个人,你不可能知道一切。因此,如果你必须学习一件事,我的建议是学习如何学习。
我知道这听起来很傻,但这可能是一个开发人员需要的第一项技能。我们必须在快速学习新技能方面变得更好。否则,你就会遇到被贴上过时标签的风险。
这也是本文中其他一些课程发挥作用的地方。变化,改变,新的挑战,没有自我--这些都是能帮助你学习和拓宽你的技能范围的事情。你做得越多,你就会做得越好。最终,你会意识到所有语言都是相似的。你将开始看到它们的共同根源,你将能够使用它们中的任何一种。你所要做的就是阅读一些关键的东西。
你将会在你的整个职业生涯中学习:
- 新语言
- 新(和旧)的编程范式
- 新的工作方式
- 解决问题的新方法
- 与你的队友互动的新方法
- 审查和测试你的代码的新方法
如果你没有准备好面对学海无涯,请考虑这是否是合适你的职业。请注意,我的意思不是说 "现在就辞职",而是考虑你是否愿意敞开心扉,永远学习。
5. 工作先于完美
作为一个经理,我已经听自己说过太多次了。但作为开发者,我们倾向于认为我们的代码在发布前需要完美。而这不仅是不真实的,而且可能是一个问题。
早期优化是一个问题,因为你最终会在一些也许不需要优化的地方花费大量的时间和精力。而且在某些情况下,在进行优化时,你的假设可能会破坏这个功能。
因此,要专注于它需要做的工作和你要解决的问题。一旦修好了,就测试一下,迭代一下结果,看看你的团队对你的解决方案有什么看法--即使你已经能看到改进的方法。如果你要多花两天时间来完善它,但它现在就可以投入生产,那么它很可能现在就应该投入生产。
在一天结束时,你正在解决一个问题。你解决得越快,对你的用户就越有利。
6.让他工作,然后进行优化
与前面的一些观点一致,不要落入早期优化的黑洞。
即使你认为你会做得很快,一旦你从里面出来--如果有的话--你会发现时间膨胀效应是真实的。
作为一个编写新功能或修复错误的软件开发人员,你的首要任务是使其工作--无论代码看起来多么丑陋,或者你的解决方案多么低效。如果它成功了,你就证明了它是可以做到的。这就是战斗的一半。
第二步是优化它。这是一个可选的步骤。一些人往往会忘记这个细节。你有多少时间来优化你的代码,取决于很多变量,而这些变量有时并不在你的控制之下。所以,先专注于让它工作,然后再弄清楚你是否真的有时间来优化它。
早期优化是指在写代码的同时优化你的代码。这是一种危险的做法,因为当我们在优化时,我们会对执行时间、数据要求、内存需求以及其他我们还没有看到的因素做出假设。任何这样的假设都可能是错误的,你最终会在你的逻辑中引入bug。
思考一下TDD的工作流程:
- 写你的测试,了解你的功能需要做的一切(它会失败)。
- 编写你的代码以使测试通过。
- 现在再优化你的代码。
第二步是必须的。你首先需要担心的是通过测试,也就是让这个功能正常工作。测试并不关心你使用的算法或你是否使用了三个嵌套的if语句。这是后话,可能是代码审查过程的一部分。
7. 一个项目的最后 10% 需要 90% 的时间
如果你是单独工作,这一点尤其重要,但团队也会因为没有正确掌握这个小小的数学细节而受到影响。
任何完成过项目的人都会告诉你同样的事情(说实话,这不仅仅适用于我们这个行业)。你先是匆匆忙忙地处理了很多细节,以致于在最后不得不处理它们。
而这是完全正常的。我们倾向于首先关注大的功能,而把小的细节甚至是已知的bug留到最后。但是它们还是需要被解决的,这就是额外的90%的原因。精细的工作需要时间。你需要测试、修复、重新测试、编写文档、进行用户培训、展示最终的解决方案,等等。
当然,这取决于你的背景,你的客户是谁,以及很多其他因素,但总归是有的。所以请记住。当你认为你的代码快完成时,你可能忘记了一些事情。
8. 如果你要做的事情不止一次,就需要进行抽象化处理
编码是对行为的抽象化。通过抽象常见的逻辑,我们可以在其他地方重用它,但在开始的时候,我们有时没有注意到抽象的重要性。
这是我个人的经验法则:如果我有代码在两个地方重复,那么它就会进入一个函数(或一个方法,一个模块......你懂的)。
即使 2 这个数字对你来说似乎很小,但考虑到将来你可能会找到其他地方来使用这些抽象的代码。而通过当时将它移到一个普通的地方,你现在就可以复用它了。
抽象是关于规模的。一段抽象化的逻辑可以用最少的精力使用很多次,而到处复制粘贴代码--虽然很容易做到--越用越需要努力。考虑一下,如果你因为一个bug而不得不改变在整个项目中重复五次的逻辑,会发生什么。你会有五次机会在修复它时犯错。
同样的逻辑也可以应用于你的日常工作。如果你发现自己做的事情不止一次,那么它可能会以某种方式被自动化。这是效率的关键,所以不要只在你的代码中寻找重复的模式,也要在你的行动中寻找。如果你能将一项每天只花10分钟的任务自动化,那么你每月就能节省5个小时。
9. 副业不是必须的,但确实有帮助
有些人说,如果你想成为一个成功的开发者,你需要创建副业。我不认为那是真的。我个人认识很多厉害的开发者,他们只在朝九晚五的工作中编码。
老实说,我很佩服他们。他们能够在他们所做的事情上做得很好,同时也享受他们的空闲时间做其他事情。这绝对没有错。
然而,有时你需要额外的练习。有时你会觉得自己落后于其他同事。而这正是副业项目可以有帮助的地方。
我不是说要建立一个新的框架,让数以百万计的人使用,彻底改变这个行业。如果你愿意,就去做吧,我说的是复制别人的项目,以便向他们学习。我说的是通过解决错误或增加额外的功能来为别人的项目做贡献。
你可以利用副项目来体验你不常看到的开发方面。如果你每天8小时都在写单元测试,也许可以考虑从头开始创建一些东西,开发一些功能。如果你厌倦了独自工作,可以考虑为一个现有的项目做贡献,体验与他人协调工作的感觉。
你可以利用副业项目来加强你认定的任何薄弱领域,帮助你提高技能。但还是那句话,不要认为你需要在这些项目上工作,或者有一个绿色的 GitHub 活动表,才能被认为是一个严肃的开发者。那是很愚蠢的。
结语
这些是我在过去 18 年里作为一个开发者面对困难总结学到的九条经验。我希望通过分享我的经验,我能够为你新的(或已经存在的)职业生涯带来一些启示。
你是否有其他的经验教训想与大家分享?请在下面留言。我很愿意向你学习。