最近新闻网站HackerNews上的一篇帖子很火。20件事。如果您多年来一直从事科技工作,您会对后代说些什么?本文包含20条建议,其中许多建议来自他人的经验。文章作者JustinEtheredge拥有丰富的职业生涯,他职业生涯的前半段是一名软件工程师,曾为各种小型企业和初创公司工作,之后进入咨询行业并在许多真正的大公司任职。此后,JustinEtheredge的事业发展得很好,团队从2人发展到25人。10年前,JustinEtheredge主要与SMB合作,现在他们与大型和小型企业合作。这20条建议主要来自以下人员的经验:那些几乎总是在小型精干团队中工作的人,因为他们可以事半功倍;那些重视工作软件开发而不是特定工具的人;那些不断从事新项目并努力维护其他系统的人;JustinEtheredge说,他过去20年的经历塑造了他对软件的看法,并产生了一些信念,他试图将这些信念缩减成一个可管理的清单,希望这些建议能为他人带来价值。JustinEtheredge的20堂课1.我还是什么都不懂我们大多数人可能都听过这样的话,“你怎么不知道BGP是什么?你从来没有听说过铁锈?”我们很多人之所以热爱软件,是因为我们是终身学习者,而在软件中,无论你往哪个方向走,都有广阔的知识视野向四面八方传播,发展的方向每天都在扩展。这意味着你可以在你的职业生涯中花费数十年,但与同样在看似相似的角色中花费数十年的人相比,软件人员仍然存在巨大的知识差距。你越早意识到这一点,你就能越早摆脱冒名顶替综合症,转而乐于向他人学习和教导他人。2.软件最难的部分是构建正确的东西大多数软件工程师不相信这一点的原因是他们认为这贬低了他们的工作。相反,恰恰是这一点凸显了软件工程师工作环境的复杂性和不合理性,进一步加剧了软件工程师的挑战。你可以设计出技术上最惊人的东西,最糟糕的是,最后没人愿意使用它。这种事情经常发生。设计软件主要是一种倾听需求的活动,我们通常必须同时是软件工程师、倾听者和人类学家。专注于这个设计过程,无论是通过专门的UX团队成员还是通过简单的自我教育,都会带来巨大的回报。3.最好的软件工程师需要像设计师一样思考伟大的软件工程师会深入思考他们编写的代码的用户体验。无论是外部API、编程API、用户界面、协议还是其他界面,优秀的软件工程师都会考虑谁将使用他们的研究成果、为什么要使用它、如何使用它以及对这些用户来说什么是重要的。牢记用户需求是良好用户体验的核心。4.最好的代码是没有代码,或者不需要维护的代码。程序员需要能够编程。大多数人都会在自己擅长的事情上犯错误,这是人之常情。许多软件工程师在编写代码时经常犯错误,尤其是在非技术解决方案不明显的情况下。不需要人工维护的代码也是如此。这是一种平衡行为,当许多算法已经存在时,工程团队可以很容易地想要开创新的方法。重新发明轮子的原因有很多,但重要的是要注意“非原创”不是其中之一。5.软件是达到目的的手段软件工程师的主要工作是交付价值,但很少有软件开发人员理解这一点,将其内化的就更少了。真正的内化会导致解决问题的不同方式,以及看待工具的不同方式。如果您真的相信软件是从属于结果的,那么您将准备好实际找到适合该工作的正确工具,这可能根本不是软件。6.为自己设定截止日期有些人倾向于深入研究问题并开始编码,而另一些人则只想研究理论,而不是编码,让自己陷入困难的漩涡。在这些情况下,给自己设定一个截止日期并开始探索解决方案。当你开始解决问题时,你会学得更快,这会让你迭代到更好的解决方案。7.如果你不能很好地掌握所有可能发生的事情,你就不能设计出一个好的系统如果不知道在给定的生态系统中什么是可能的,什么是可用的,就不可能设计出一个合理的解决方案来解决所有问题,除了最简单的问题。总而言之,你要警惕那些很长时间没有写过任何代码设计系统的人。8.每个系统都很糟糕,你需要克服它BjarneStroustrup有一句名言:只有两种语言,一种是人们抱怨的,一种是没有人使用的。这个格言可以扩展到大型系统。没有正确的软件架构,您将永远无法还清所有技术债务,也永远无法设计出完美的界面。尽可能少地担心系统的优雅和完美,而是努力不断改进您的系统并创建一个合适的系统,让团队乐于在其中工作并可持续地提供价值。9.问为什么。抓住每一个机会去问。看似微不足道的问题,例如“有新的团队成员加入吗?注意他们在哪里感到困惑以及他们在问什么问题。有没有意义的新功能请求?”等等。确保您了解您的目标以及推动此功能需求的因素。如果您没有得到明确的答案,请继续问为什么,直到您得到为止。10.伟大的程序员都是传奇。找一个能达到10倍工作效率的程序员是不可取的。一个人可以在1天内完成而另一个程序员(有能力、努力工作、同样有经验)在2周内完成的想法是愚蠢的。如果程序员抛出10倍的代码,你需要10倍的努力来修复它。某人成为10x程序员的唯一方法是将他们与0.1x程序员进行比较。浪费时间、不寻求反馈、不测试代码、不考虑边缘情况等的人……我们应该更关心让0.1倍的程序员远离我们的团队,而不是寻找出色的10倍的程序员。11.工程师需要更多建议。最担心的是没有人对高级工程师构建的软件有意见。相反,他们宁愿强烈反对,也不愿完全没有意见。如果你正在使用某个工具,你需要更多的经验才能知道这个工具的优缺点。对于缺点,您可能需要探索其他语言、库和范例来解决它们。没有比积极寻找其他人如何使用不同的工具和技术来完成任务更快地提高技能的方法了。12.你不知道什么是创新。人们经常谈论创新,但他们通常是在寻找廉价的胜利。如果你真的在创新和改变人们做事的方式,那么你应该期待负面反馈。如果您相信自己正在做的事情并且知道它实际上会改善事情,那么您需要为长期战斗做好准备。13、数据是系统最重要的部分对于很多程序员来说,数据是系统最重要的部分。在这样的系统中,任何发生在黄金路径之外的操作都会产生脏数据。处理这些脏数据可能会在未来变成一场噩梦。请记住,数据的寿命可能比代码库长。从长远来看,努力保持数据的组织性和清洁性会得到很好的回报。14.寻找技术“鲨鱼”一直存在的旧技术可以被认为是“鲨鱼”,而不是“恐龙”。这些旧技术解决问题的能力如此之好,以至于它们在瞬息万变的技术世界中得以生存。但是请不要随意更换这些技术,只有在有充分理由的情况下才更换它们。这些技术不会很花哨或令人兴奋,但它们可以在很多情况下完成工作。15.不要把谦逊误认为是无知许多软件工程师除非被要求,否则不会说出来。不要以为别人不发表意见,就没有什么可补充的。有时声音最大的人是我们最不想听到的人。与周围的人交谈,征求他们的反馈和建议。你会很高兴你做到了。16.软件工程师应该定期记录研究软件工程师应该定期写博客、写日记、记录和做一些保持书面沟通技巧的事情。写作可以帮助软件工程师思考问题,帮助他们更有效地与团队沟通。良好的书面沟通是任何软件工程师需要掌握的最重要的技能之一。17.保持流程尽可能精简现在每个人都想变得敏捷,但敏捷是通过构建小块、学习和迭代来实现的。如果想往里面塞更多的东西,这是不可取的。在工作中,你很少听到科技公司或大型开源项目吹嘘他们的Scrum流程有多棒?在工作中保持苗条。18.软件工程师需要有归属感。如果你让某人远离他们的工作成果,他们就不会那么关心他们的工作。这就是跨职能团队工作得如此出色以及DevOps变得如此流行的主要原因。这不仅仅是关于交接和效率低下,而是关于从头到尾拥有整个流程并直接负责交付价值。当一群充满激情的人全权负责设计、构建和交付软件(或任何真正的事情)时,就会发生惊人的事情。19.面试对于证明一个团队成员有多好没有什么价值。面试的重点是了解他/她是谁,以及他们对特定专业领域的兴趣程度。而面试的意思是“shouldhave”,试图了解自己能否成为一名优秀的团队成员是徒劳的。相信我,一个人有多聪明或知识渊博与他或她在团队中的贡献能力关系不大。没有人会在采访中告诉你他们不可靠、爱辱骂、自负或从不准时出席会议。有人可能会声称他们可以在面试中说出“如果他们在第一次面试中询问休息时间,请小心”。但那是胡说八道。如果你用这样的信号作为判断标准,你只是在猜测和拒绝好的候选人。20.小即是美有很多力量促使你预先构建更大的系统。要求更多的预算,无法决定削减哪些功能,想要交付系统的“最佳版本”,这些都在驱使我们构建太多,但你应该与这种趋势作斗争。在搭建系统的时候,你会学到很多东西,会和你最初想象的很不一样。但对许多人来说,追求最好是很困难的。这些来自老程序员的建议,或许对你有些帮助。成为开发者后,有没有踩过的坑,或者总结过的经验?原文链接:https://www.simplethread.com/20-things-ive-learned-in-my-20-years-as-a-software-engineer/【本文为专栏《HeartoftheMachine》,微信公众号《机器之心(id:almosthuman2014)》]点此查看作者更多好文
