最近阅读到一篇不错的文章,包括评论部分都有不小的参考价值。于是,将文章翻译出来与大家分享,并针对部分内容添加了个人的一些看法。以下部分为正文:

软件工程师往往会花大量的时间在刷面试题和整理履历上。但一旦在谷歌、亚马逊或其他创始公司找到工作,会发现找工作时所学习和准备的技能与实际工作中所使用的技能并不匹配。

PS:这也就是我们所说的“面试造火箭,入职拧螺丝”。

团队领导总结了七条高效程序员应该拥有的技能,对我们团队很有启发,顺便也说说我们的看法。下面便是高效程序员的七个技能。

第一:学会如何阅读其他人的代码

image

Everyone but you writes terrible code。“除你之外,所有人写的代码都很垃圾。”

因此,学会如何阅读别人的代码将是一项受益颇多的技能。

不可否认的是,无论之前的开发人员写的代码有多糟糕,当你接手项目时,阅读并领会代码含义便是你的工作。

学会阅读别人的代码有两个好处。阅读别人的代码是一个了解什么是糟糕设计的机会。当阅读别人的代码时,可以学到哪些代码是有效的,哪些代码是无效的。更重要的是,可以了解到什么样的代码更有益于其他开发人员阅读和维护。

Your code should be so well-designed that it requires no documentation. In fact, you shouldn’t document any of your code if you are a good programmer. This is just a waste of time and you need to spend your time coding and in meetings.

PS:这段的核心思想是“优秀的程序员写的优秀代码不需要文档”,笔者对此不以为然。无论多么优秀的代码,如何能够自解释的代码,必要的注释或文档还是必须的。在评论区有大量针对该条建议的批评,其中最有价值的一个说法是:代码用于展示实现了“什么”,而注释用于展示“为什么这样做”。

阅读他人的代码,在需要时可以轻松进行更新升级。某些情况下也能刷新你的编程经验。比如,我们曾经将脚本从Powershell转为Python,再转为Perl。我们在Perl方面的经验有限,但仍然有足够的信息可以弄明白它是如何运作的,并进行所需的修改。这源于对代码和Perl脚本的理解。

第二:保持对坏项目的辨别度

有很多技能需要花时间来学习。其中值得学习的技能之一就是:了解哪些项目不值得做,哪些项目很明显会步履维艰。

大公司往往有很多已经完成或具有影响力的项目。其中,一些项目可能没有任何商业意义,最起码对你来说是如此;一些项目又缺乏管理。

当然,这并不意味着当你不赞同某个项目时就切断对该项目的一切想法。但是,如果项目的参与者都无法说清楚项目最终要做什么,那么这个项目肯定就不值得做。

此外,有些项目可能过于关注技术而不是解决方案,以至于从一开始就很明显不会产生太大的影响。

在获得这项技能之前(了解到底什么是坏项目),你可能需要做很多坏项目。因此,在职场早期不用花太多时间在每个项目上进行辨别的尝试。

在职场的某个时刻,总是要有良好的直觉。

PS:这项技能可以用在选择一个项目或一份工作时,当对所做项目的价值有足够的判断,才能获取更大“赢”的概率。如果没有选择权,那就选择把当前项目做到最好吧。

第三:避免会议

无论你是软件工程师还是数据科学家,开会都是必要的,因为你需要与项目经理、用户和客户保持一致。但会议有可能突然占据你的整个日程,这也是为什么需要学会避免非必要的会议。或许用“管理”代替“避免”更加合适。参与会议要以驱动决策和帮助推动团队进度为目标。

最常见的方法是每天抽出固定两小时的会议时间。通常,大多数人认为定期召开会议是比较有效的方法,同时还能把控项目的进度。

另外一种避免会议影响工作进度的方法就是提早到达办公室。就个人而言,提早到达办公室,安静的环境可以更快的解决手头上的问题。

这对个人工作者而言更为重要,因为我们的工作需要专注的时间,且不需要与其他人交谈。当然,有时你可能想与其他人一起解决问题,但一旦问题解决,需要做的是立即回归工作当中。因为在工作的过程中,脑海中会有很多相关的思维,一旦频繁的中断,很难从上次停下来的地方恢复。

PS:参与会议的确是一件浪费精力和时间的事,而且往往收效甚微。作者建议的提早到办公室的方法,经个人实践的确很有效,而且也在一直使用。

第四:熟练使用Git

image

对于某些专业的学生来说,天生就会使用Git,他们了解Git的每个命令和参数,并且身边有大量的专业人士。但对于其他人来说,或许在第一份工作中才使用到Git,而且在使用的过程中充满疑惑。他们从来不敢百分之百确定执行的命令会做些什么,此时,备忘录是一个很好的解决方案。

不管你的公司使用哪种存储库,正确使用该存储库都是非常有帮助的。简单的pull或commit的操作并不会花费大量的时间,同时避免各类分支或fork操作带来的冲突问题。此外,如果你经常忘记拉取(pull)最新代码,合并冲突这件事是不可避免的。

如果你需要存一份Git的命令清单,那就赶紧行动吧,这会让你的操作更加简单。

第五:编写简单可维护的代码

image

年轻的软件工程师已经呈现出一种趋势:将学到东西一股脑的运用到解决方案中。这种欲望可以很好的帮助大家理解面向对象编程、数据结构、设计模式和新技术,并且能够在实践中进行运用。但也会造成不必要的复杂性和过度设计,比如很容易将曾经使用过的解决方案和设计模式运用到当前代码中。

在复杂的设计理念与简单的代码之间需要寻求一个平衡。设计模式和面向对象的设计可以在大型项目中对代码进行简化。但是,当越来越多的流程被抽象化、封装和黑盒处理,那么调试(debug)代码的过程将会便变得越来越困难。

PS:这不就是在说“当你手里有一把锤子,看什么都像钉子”一样吗?其实大家都会在实践中会不自觉的犯一些过度设计的错误,当学一门新技术时也总想在项目中进行运用和实践。这对学习新技术来说是非常必要的,但也需权衡是否符合业务场景,毕竟“适合的才是最好的”。

第六:学会说“NO”和优先级排序

无论你是财务分析师还是软件工程师,这一条适合任何角色。但是技术角色比较特殊,因为好像每一个人都需要他们似的。如果你是数据工程师,则可能会被要求做更多的事情,而不仅仅是本职工作。比如,一些团队需要你提取数据,一些团队需要仪表板,一些团队则需要为其数据科学家提供支持等。

优先级排序和说“不”实际上是两种不同的技能,但是它们密切相关。确定优先级意味着你只会将时间花费在对公司有重大影响的事情上,而说“不”意味着拒绝处理本该由其他人(或团队)处理的工作。对于职场中的所有角色来说,它们往往会同时发生。

该项技能的获得并非易事,当别人向你提出请求时,你很容易不自觉的就去执行了。特别是初入职场,为了维持关系,不得不去承受大量额外的工作。

在大公司中,总是有无尽的工作等待着去做。此时的关键便是该采取什么样的措施来应对。

PS:学会说不和优先级排序,无论在工作中和生活中都是非常重要的技能,可以让你拥有更轻松的生活状态和更高效的工作节奏。

第七:运营设计思维

image

在面试中或学习的过程中很难测试的一个技能就是:思考用户会如何错误的使用软件。

比如,许多程序都是需要后期升级维护的,这就意味着需要去修改一些高度耦合的代码。此时,即使简单的修改,也需要跟踪和验证相关对象、方法或API接口的可用性。否则,即使在数据库中修改一个类型也很容易影响到原有功能。

此项,还包括开发之前对功能边界的界定和更高层面的设计。

对于新功能模块的开发,则需要花费更多的时间来思考功能的使用场景。同时,需要考虑如果用户错误地使用功能时该如何进行处理。

编写代码并在本地运行是很容易的,一旦部署到生产环境则会出现许多未知异常。在设计时最好要考虑到未来五年中项目的发展情况。

笔者小结

读读英文技术文章,学学新思维,学学新技能,同时还能学学英语。空闲时间再把它翻译一下,结合实践经验点评一下,也是一种不错的学习方法。



高效程序员的7个技能插图4

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://www.choupangxia.com/2020/06/06/programming-skills/