一份软件工程行业生存指南

如今越来越多的人进入软件工程行业,偶遇一份国外同学写的行业生存指南,读来感觉颇值得参考,简单翻译过来,分享一下。也许生存指南能更好得让你在这个行业生存下来,并快速获得成长与发展。


我遭遇了作为一名软件工程师的现实:我必须去掌握当时还不知道,但我将会需要的许多技能。回首过往,如果早知道我现在知道的这些事情,肯定要好很多。

因此,我写了篇指南,它源自早年我作为专业人士去辅导程序员的经验,以及我本人和我一些同事的经验来帮助其他人。

包括以下内容:

  1. 如何充分利用好面试;
  2. 如何在软件工程师的工作中存活下来并茁壮成长;
  3. 以及在考虑持续改进时需要哪些资源。

1. 面试

当你开始你的软件工程职业生涯时,你将不得不面对一个不争的事实。面试糟透了。

对每一个牵涉其中的人来说都是可怕的。作为一名面试官和一名应聘者,我可以证明面试是一个很大的时间无底洞,它包含极度的压力,并且是一个非常糟糕的未来工作表现的指标。然而,它们是必要的邪恶,以至于你和你的简历都最好为此做好准备。

1.1 准备战斗

如果你正在考虑从事软件工程,一定要学习一些最常见的编程面试问题,比如 “FizzBuzz”:

编写一个将数字从 1 打印到 100 的程序。对于 3 的倍数就打印 ‘Fizz’ 而不是数字,对于 5 的倍数 就打印 ‘Buzz’。对于既是 3 又是 5 的倍数,就打印 ‘FizzBuzz’。

听起来足够简单,对吧?

好吧,绝大多数应聘者都没有通过这个简单的测试,更不用说其更复杂的变体了。

我个人见过许多高级职位的候选人在可以完全上网的情况下都没能通过这道测试。因此,如果你在简历中列出了一种编程语言,那么你至少要知道如何使用它编写 'FizzBuzz' 程序。否则,你就是在浪费所有人的时间,包括你的时间。

当然,你需要知道的应不止于 'FizzBuzz',才能在面试中幸存下来。你还需要确保你知道:

  • 基本数据结构和算法:例如链表、数组、树和排序;
  • 你选择的语言中,公共的 “常识” 问题”:例如字符串是否可变,内存是如何管理的;
  • 面向对象的编程概念,比如类和对象,以及继承。

在你的职业生涯之初,你将需要在这些问题上表现出色,大放异彩,因为你还没有足够的经验来证明你会很胜任这份工作。

1.2 给自己额外的优势

有几件事你可以做,这会给你一些额外的东西。

首先,学会交流你的经历。你应该有一个 “电梯演讲”(在乘坐电梯的短时间内的推荐演讲)来把你的简历总结成一个连贯且吸引人的叙述。

另外,了解你自己的简历!这听起来很傻,但我看到很多应聘者在艰难解释简历上的某一特定项目。你应该能够回答你在简历上列出的任何经历相关的问题,并解释它如何使你成为更好的候选人。

接下来,在 GitHub (或其他公共代码库)上拥有代码示例。

眼见为实,面试官能够看到你的代码可是会产生奇迹的。此外,它还展示了你对代码版本控制系统的理解。

代码示例不必太复杂,但它们确实需要干净,并展示良好的编码实践。这是你的机会,在一个没有时间压力的编码面试中展示你会如何编码。

完成上述所有工作之后,就应该考虑参加一个开源项目了。显示你可以在现有的代码库中工作,并与其他程序员协作。

这将是你身处工业编程环境之外,最接近工业编程环境的方法了。这也是迄今为止最困难和耗时的方法,所以先把它留到最后,直到你把前面那些 “低垂的果实” 都摘了。

1.3 面试你的面试官

在求职的匆忙和压力下,许多应聘者忘记了面试是双向的。当公司试图发现你是否适合这份工作的时候,你也应该弄清楚公司是否适合你。

确保你可以问下面的一些问题,即使是在后续的电子邮件中。

下面是一些你可以问的问题:

问题 #1
“对于我来说,一个典型的工作日会是什么样子?”

重要的是要明确对某个特定职位的期望,因为软件工程的不同岗位差异很大。例如,你可能需要维护服务器或与客户直接交谈。

红灯警示:“我不确定。” → 这里的意思是面试你的人不是招聘你的团队中的人,或者他们还没有一个清晰的认识为什么要雇用你。

问题 #2
“你们是如何测试软件的?”

理想情况下,应该使用单元测试、手动测试和自动化测试的组合来验证代码的质量。

红灯警示:“我们通常不写 bug,哈哈。” → 这样说的家伙正是写 bug 的人。

问题 #3
“你们使用什么版本控制系统?”

版本控制系统对于协作非常有用,没有任何理由在专业环境中不使用版本控制系统。

红灯警示 #1:“啊,版本控制系统?” → (若他们不知道)赶快逃跑,跑得远远的。

红灯警示 #2:一些模糊或自定义的 VCS 系统 → 表明他们很可能跟不上时代,很长时间没有更新他们的基础设施了。

问题 #4
“你们是否进行同行评审?”

同行评审,或让其他人在你提交到代码库前查看你的代码,是发现愚蠢错误的极好方法,也是开始职业生涯时的一个重要的培训机会。

红灯警示:“我们相互信任!” → 这种情况很可能是高级开发人员对他们的代码具有自利的保护性,而不是很乐意收到反馈。

问题 #5
“你们有什么继续教育的计划?”

作为一名软件工程师意味着不断地学习,因为技术以眼花缭乱的速度出现、成熟和过时。因此,许多公司都有一个培训预算,用于支付大学和在线课程、专业会议或内部讲座的费用。

红灯警示:“你是说在空闲时间上网阅读东西吗?” → 这暗示公司要么现金紧缺,要么认为开发者是可替代的,而不会长期投资。

问题 #6
“你们使用的软件开发流程是什么?”

无论实际细节如何,流程对于软件工程都是至关重要的。关于什么是最优流程的具体问题,需要进行激烈的辩论,但只要有一种商定的项目工作方式存在,就会尽量减少混乱,并确保大家达成共识,保持一致。

红灯警示:“我们的过程是受自由形式的爵士乐启发。” → 表明很可能整个部门都处于消防模式,从紧急情况跳到紧急情况,缺乏任何明确的目标。

问题 #7
“你们如何处理技术债?”

技术债是代码库中的一种过时技术和快但脏的解决方案的累积。解决这个问题对于代码的长期健康是很重要的,并且应该持续地进行。

红灯警示:“我们只关注新特性。” → 他们的代码库可能一团糟,或者它就快变得一团糟了。

问题 #8
“你的公司文化是怎样的?”

公司文化可能是一个非常模糊的概念,但即使是像开放式办公室和隔间这样的小事情,也会在很大程度上改变你与同事的日常互动。这里没有通常意义上的 “红灯告警”,但要确保他们的答案可以让你每周忍耐 40+ 小时,并持续数年。

2. 作为软件工程师而工作

在这个阶段,如果你在面试中表现出色,并且喜欢面试官对你问题的回答,那你很可能会被录用。

恭喜,你已正式成为一名软件工程师了!

现在该谈什么了?是时候重新学习关于编码和工作的很多事情了。既然我们是程序员,就让我们从讨论代码开始吧。

2.1 好的工业级代码

好的工业级代码具有以下属性,按顺序排列:

  • 可读性,因为代码被读取和维护的频率比编写要高。在你编写代码多年之后,其他开发人员必须清楚代码的意图。

  • 防御性,遵循防御性编码的最佳实践。防御性编码本身就是一个主题,但它的主旨是:你必须确保你编写的类和方法被不当使用时不会导致软件崩溃。

  • 优化的,这条在最后是因为大部分时间,你不会真得需要担心它。但这并不意味着,当存在线性解决方案时,你应该写些执行效率为 O(n³) 的烂代码。但在有些不必要的时候,开发人员会渴望尝试和过度优化代码,这通常会损害代码的可读性和可防御性。你应该总是能证明做出某种优化而牺牲的可读与防御属性是合理的。

现在你已经知道如何编写良好的工业级代码了。

2.2 你不会编写太多代码

这可能令人惊讶,但大多数情况下,你不会编写新代码,而是:

  • 调试
  • 读已存在的代码
  • 开会或者写邮件
  • 研究该做什么,这样就不用编写代码了

因此,编码以外的其他技能对你的职业生涯也同样重要。

2.3 调试和阅读代码

您需要的不仅仅是用 print 语句进行调试。所有广泛使用的语言和技术栈都有各种强大的工具,学会使用它们,因为它们会使调试变得轻而易举,并为你节省无数的时间。

理解代码库。大多数技术栈都有一些代码图形生成工具,可以帮助你理解代码库的结构。企业级 IDE 通常内置这样的功能。

理解产品。你将会惊讶的,在尝试 “修复” 软件之前,有多少开发人员不知道软件应该如何工作。

2.4 整理思绪

由于你的大部分时间将花在沟通、调研和多任务处理上,你需要一些工具来使得一切有序。

TODO List / 任务列表:你的公司应该已经有某种任务处理软件了,但是拥有一个针对个人的软件也是有帮助的。

注意事项:在会议上做笔记,努力改进现有文档,建立个人知识库。使用 Evernote、OneNote 或纸质笔记本,就像以往的旧时光一样。这看起来可能有点过火了,但一年后,当你重新查看那个花了你 3 天的时间才想出来的费解的设计过程时,你会感谢自己的。我从未见过一个优秀的软件工程师,他不做大量的笔记。

图表/可视化:人是视觉动物,创建流程和体系结构图表将帮助你和其他人理解复杂的主题。在与非技术同事交流时,图表特别有用。

2.5 知道何时使用库

简短答案:几乎总是使用。

长篇大论:99% 的时间里,你不应该重新发明轮子。在大多数软件工程职位中,实现特定类型的排序完全是浪费时间。这并不意味着你不应该知道所用的算法和数据结构是如何工作的,因为这将帮助你决定使用什么以及何时使用。

为了成为一名高效的软件工程师,你需要了解可供你使用的库。大多数流行语言的标准库非常有用,比你预期的要大。此外,代码库还可能利用了额外的专门库。阅读他们的文档,并知道什么时候使用它们。

如果额外的库可以节省时间,那么你也不应惮于建议使用它们。但是,你需要确保选择了一个良好的库供工业级使用。一个好的库是:

  • 开源,这样你就可以自己验证代码的质量,并可能修复对你的应用至关重要的 bug。
  • 宽容的许可证,例如 MIT 和 BSD,使用它们你的公司不会遇到任何问题。小心 GPL,以免意外开源了你的代码库。
  • 成熟的,即它已经推出了一段时间,并有一套丰富的功能。
  • 在维护的,新版本经常发布。
  • 被用于其他公司或项目,这是一种批准可用的标记,并确保它有行业支持,并持续维护。

3. 持续进步

除了学习能让你在日常工作中做得更好的技能之外,你还需要不断地改进你的技能,学习新的技能,以便为自己创造新的职业机会。

学习的机会很多,其中多数都是负担得起的。

在线课程:不应错过以灵活的形式向该领域最好的老师学习的机会。

在线硕士学位:最近在名列前茅的大学中,在线硕士学位是一种灵活的方式来继续你的正规教育,它们通常也比较便宜。(译注:国内不知道有没有了,学位有时是个门槛)

博客:博客是开发人员社区的重要组成部分(这并不奇怪,因为你现在正在阅读博客)。有时,博客能给你一些关于软件工程师做什么以及不做什么的好想法。

会议:放在最后,但并非最不重要。会议是一个惊人的学习机会,你一定要利用你公司的培训预算去参加。

...

最后,希望这篇文章能让你对作为一名软件工程师的职业生涯的起步阶段有所了解,并为你提供了在这一令人兴奋的旅程中表现出色的工具。


作者:Valeri Alexiev
日期:2018-10-29
原文:A Software Engineering survival guide


写点文字,画点画儿,记录成长瞬间。
微信公众号「瞬息之间」,既然遇见,不如同行。

posted @ 2019-01-06 20:44  mindwind  阅读(1662)  评论(2编辑  收藏  举报