我遇到了成为一个软件工程师的现实,我必须掌握许多技能,但我不知道我是否需要这些技能。回想起来,如果早知道这些事情,肯定要好很多。
因此,我写了这篇指南,根据早些年我作为专业人士辅导开发者的经验,以及我和我一些同事的经验来帮助其他人。
我将介绍:
- 如何充分利用面试
- 如何作为一个软件工程师在工作中生存下来,并茁壮成长
- 在考虑持续改进时需要哪些资源
面试
当你开始你的软件工程师生涯时,你将必须面对一个不争的事实。面试糟透了。
对每一个参与者都很糟糕。作为一名面试官兼一名面试者,我可以证明面试是一个很大的时间陷阱,非常紧张,并且是一个非常糟糕的未来工作表现指标。然而,这是必要的坏事,所以你和你的简历都要做好准备。
准备战斗
如果你考虑软件工程职业,请务必学习一些最常见的编程面试题,例如“FizzBuzz”:
编写一个将数字从 1 打印到 100 的程序。对于 3 的倍数就打印 ‘Fizz’ 而不是数字,对于 5 的倍数 就打印 ‘Buzz’。对于既是 3 又是 5 的倍数,就打印 ‘FizzBuzz’。
听起来很简单,对吧?
好吧,绝大多数面试者没有通过这个简单的测试,更不用说其他更多的变化了。
我亲眼看到很多高级职位的候选人在可以上网的情况下依然没能通过这个测试。因此,如果你在简历中列出一种编程语言,你至少确保知道如何使用它编写“FizzBuzz”程序。否则,你只是在浪费所有人的时间,包括你的时间。
当然,你需要知道的不仅是“FizzBuzz”才能在面试者中生存下来。你还需要确保你知道:
- 基本数据结构和算法:例如链表、数组、树和排序
- 你选择语言中的常见“陷阱”,例如字符串是否可变,内存是如何管理的
- 面向对象编程概念,像类与对象,还有继承
在你的职业生涯开始之初,你需要在这些问题上表现的出色,因为你还没有足够的经验证明你能胜任这份工作。在准备面试时,我重视推荐这两种资源给面试者:
- “破解编码面试 ”,一本精彩的书,包括许多编码问题及其解决方案,以及解决这些问题需要了解的内容摘要
- CodeWars,一个包含大量编码问题的网站,您可以使用多种语言在浏览器中解决这些问题。最有用的部分是了解其他用户如何解决同样的问题。您将看到针对同一问题的不同方法,并使用您选择的语言学习新工具。
给自己额外的优势
你可以做几件事情,给你一些额外的东西。
首先,学会传达你的经历。你应该有一个电梯议案(短时间内的意思),将你的简历概括为一个连贯而引人入胜的叙述。
另外,了解自己的简历!这听起来很蠢,但是我见过许多面试者都在努力解释他们的简历中的特定项目。你应该能够回答有关你简历中列出的任何经历的问题,并解释它是如何使您成为更好的候选人。
接下来,让代码示例显示在GitHub(或其他公共存储库)上。
眼见为实,面试官能够看到你的代码可能会有奇迹发生。此外,它还表明你对版本控制系统有所了解。
代码示例不必太复杂,但它们确实需要干净并显示出良好的编码实践。在没有时间压力的编码面试中,这是你展现如何编码的机会。
完成上述所有操作后,就可以考虑参与一个开源项目。它将表示你可以在现有代码库中工作并与其他程序员协作。
这将是你身处工业编程环境之外,最接近工业编程环境的方法了。这也是迄今为止最困难和耗时的方法,所以先把它留到最后,直到你把前面那些 “低垂的果实” 都摘了。
面试你的面试官
在求职的匆忙和压力下,许多面试者忘记了面试是一条双向的街道。当公司试图弄清楚你是否适合这份工作时,你应该弄清楚公司是否适合你。
确保你可以问下面的一些问题,即使是在后续的电子邮件中。
下面是一些你可以问的问题:
“对于我来说,一个典型的工作日会是什么样子?”
了解特定职位的期望非常重要,因为软件工程的工作变化很大。例如,您可能需要维护服务器或直接与客户端通信。
注意:“ 我不确定。”→意味着面试你的人不会出现在你的团队中,或者他们不清楚他们为什么雇用你。
“你们如何测试软件的?”
理想情况下,应使用单元测试,手动测试和自动测试的组合来验证代码的质量。
注意: “ 我们只是不写bug,哈哈。” →这些人就是那些写bug的人。
“你们使用什么版本的控制系统?”
版本控制系统对于协作非常有用,没有任何理由在专业环境中不使用版本控制系统。
image.png注意 #1:“啊,版本控制系统?” → (若他们不知道)远离,越远越好。
注意 #2:一些模糊或自定义的 VCS 系统 → 表明他们很可能跟不上时代,很长时间没有更新他们的基础设施了。
“你们做同行评审吗?”
同行评审,或让其他人在提交到代码库之前查看您的代码,是发现愚蠢错误的绝佳方式,并且在开始您的职业生涯时是一个重要的培训机会。
注意: “我们只相互信任!”→很可能高级开发人员非常保护他们的代码,并且不太善于接收反馈。
“你们有什么课程可以继续教育?”
作为一名软件工程师意味着随着技术的出现,成熟并以令人眼花缭乱的速度过时而不断学习。因此,许多公司都有培训预算,用于支付大学和在线课程,会议或内部会谈。
注意:“你的意思是在空闲时间在网上阅读东西?” →该公司要么现金紧张,要么认为开发商可以替代,而不是长期投资。
“你们使用的软件开发过程是什么?”
无论实际细节如何,流程对软件工程至关重要。什么构成最佳过程的细节受到激烈的争论,但仅仅存在一个商定的项目工作方式可以最大限度地减少混乱,并确保每个人都在同一页上。
注意: “我们的过程受到自由形式爵士乐的启发。” →很可能整个部门处于灭火模式,从紧急情况跳到紧急状态没有任何明确的目标。
“你们如何解决技术债务?”
技术债务是代码库中过时技术和快速而肮脏的解决方案的积累。解决它对于代码的长期健康很重要,应该持续进行。
注意: “我们专注于新功能。” →他们的代码库很乱或很快就会出现问题。
“你们的公司文化是什么样的?”
公司文化可能是一个非常模糊的概念,但即使像开放式办公室与小隔间这样的小事,也会以显着的方式改变与同事的日常互动。没有一般的危险信号,但要确保他们的答案是你可以忍受多年来每周40多个小时的事情。
作为一个软件工程师工作
在这个阶段,如果你在面试中表现良好,并且喜欢面试官对你提题的回答,那么你很可能会被录用。
恭喜,你已正式成为一名软件工程师了!
现在该谈什么了?是时候重新学习关于编码和工作的很多事情了。既然我们是程序员,就让我们从讨论代码开始吧。
良好的行业代码
良好的行业代码按以下顺序具有以下属性:
- 可读,因为代码的读取和维护频率高于编写代码。在你编写代码之后的几年内,其他的开发人员必须能清楚代码的目的。
- 防御性,遵循防御性编码的最佳实践。防御性编码本身就是一个主题,但它的要点是:你必须确保你编写的类和方法被不正确地使用时不会导致软件崩溃。
- 优化,这是最后一条,因为大多数时候,你不会真的需要担心它。但并不意味着当存在线性解决方案时,您应该编写在O(n³)中执行某些操作的错误代码。但是开发人员通常在不需要时尝试过度优化,这通常会损害代码的可读性和可防御性。你应该总是能证明做出某种优化而牺牲的可读与防御属性是合理的。
现在你已经知道如何编写良好的工业级代码了。
你不会编写太多代码
这可能令人惊讶,但大多数情况下,你不会编写新代码,而是:
- 调试
- 读已存在的代码
- 开会或者写邮件
- 研究该做什么,这样就不用编写代码了
因此,编码以外的其他技能对你的职业生涯也同样重要。
调试和阅读代码
你需要的不仅仅是用 print 语句进行调试。所有广泛使用的语言和技术栈都有各种强大的工具,学会使用它们,因为它们会使调试变得轻而易举,并为你节省无数的时间。
理解代码库。大多数技术栈都有一些代码图形生成工具,可以帮助你理解代码库的结构。企业级 IDE 通常内置这样的功能。
理解产品。你将会惊讶的,在尝试 “修复” 软件之前,有多少开发人员不知道软件应该如何工作。
整理思绪
由于你的大部分时间将花在沟通、调研和多任务处理上,你需要一些工具来使得一切有序。
TODO List / 任务列表:你的公司应该已经有某种任务处理软件了,但是拥有一个针对个人的软件也是有帮助的。
注意事项:在会议上做笔记,努力改进现有文档,建立个人知识库。使用 Evernote、OneNote 或纸质笔记本,就像以往的旧时光一样。这看起来可能有点过火了,但一年后,当你重新查看那个花了你 3 天的时间才想出来的费解的设计过程时,你会感谢自己的。我从未见过一个优秀的软件工程师,他不做大量的笔记。
图表/可视化:人是视觉动物,创建流程和体系结构图表将帮助你和其他人理解复杂的主题。在与非技术同事交流时,图表特别有用。
知道何时使用库
简短的回答:几乎所有的时间。
长篇大论:99% 的时间里,你不应该重新发明轮子。在大多数软件工程职位中,实现特定类型的排序完全是浪费时间。这并不意味着你不应该知道所用的算法和数据结构是如何工作的,因为这将帮助你决定使用什么以及何时使用。
为了成为一名高效的软件工程师,你需要了解可供你使用的库。大多数流行语言的标准库非常有用,比你预期的要大。此外,代码库还可能利用了额外的专门库。阅读他们的文档,并知道什么时候使用它们。
如果额外的库可以节省时间,那么你也不应惮于建议使用它们。但是,你需要确保选择了一个良好的库供工业级使用。一个好的库是:
- 开源,这样你就可以自己验证代码的质量,并可能修复对你的应用至关重要的 bug。
- 宽容的许可证,例如 MIT 和 BSD,使用它们你的公司不会遇到任何问题。小心 GPL,以免意外开源了你的代码库。
- 成熟的,即它已经推出了一段时间,并有一套丰富的功能。
- 在维护的,新版本经常发布。
- 被用于其他公司或项目,这是一种批准可用的标记,并确保它有行业支持,并持续维护。
持续进步
除了学习能让你在日常工作中做得更好的技能之外,你还需要不断地改进你的技能,学习新的技能,以便为自己创造新的职业机会。
学习的机会很多,其中多数都是负担得起的。
在线课程:不应错过以灵活的形式向该领域最好的老师学习的机会。
在线硕士学位:最近在名列前茅的大学中,在线硕士学位是一种灵活的方式来继续你的正规教育,它们通常也比较便宜。(译注:国内不知道有没有了,学位有时是个门槛)
博客:博客是开发人员社区的重要组成部分(这并不奇怪,因为你现在正在阅读博客)。有时,博客能给你一些关于软件工程师做什么以及不做什么的好想法。
会议:放在最后,但并非最不重要。会议是一个惊人的学习机会,你一定要利用你公司的培训预算去参加。
...
最后,希望这篇文章能让你对作为一名软件工程师的职业生涯的起步阶段有所了解,并为你提供了在这一令人兴奋的旅程中表现出色的工具。
本文翻译自:A Software Engineering survival guide
作者:Valeri Alexiev
网友评论