更多服务
软件工程师生存指南:面试准备、工作经验和实用工具
作者:Valeri Alexiev 来源:medium.freecodecamp.org 日期:2018-11-19 浏览


我职业生涯的前几年是一个学习激烈的时期。


我遇到了成为软件工程师的现实,并且不得不获得许多我不知道需要的技能。回想起来,知道我现在所知道的事情肯定会很好。


所以,我写这本指南是为了帮助其他人根据我在最初几年作为专业人士,以及我自己和我的一些同事所指导的开发人员的经验。


我将介绍:

  • 如何充分利用面试,
  • 如何在软件工程师的工作中生存(并茁壮成长),
  • 在考虑持续改进时需要考虑哪些资源。

面试

当您从事软件工程的职业生涯时,您将不得不面对一个无可争议的事实。采访很糟糕。

他们对所有参与者都很糟糕。既然是面试官又是受访者,我可以证明面试是一个很大的时间,非常紧张,是未来工作表现的一个非常糟糕的指标。然而,它们是你和你的简历最好的准备所必需的邪恶。

准备战斗

如果您正在考虑从事软件工程,请务必学习一些最常见的编程面试问题,例如'FizzBuzz':

“编写一个程序,打印从1到100的数字。但对于三个打印'Fizz'的倍数而不是数字和五个打印'Buzz'的倍数。对于三个和五个打印'FizzBuzz'的倍数的数字。“
(编码恐怖片

听起来很简单吧?


嗯,绝大多数受访者都没有通过这个简单的测试,更不用说它更复杂的变种了。


我个人看到许多高级职位的候选人在完全上网的同时未通过此测试因此,请确保如果您的简历中列出了编程语言,您至少知道如何使用FizzBuzz。否则,你只是在浪费每个人的时间,包括你的。


当然,您需要了解的不仅仅是FizzBuzz才能在面试中幸存下来。您还需要确保您知道:

  • 基本数据结构和算法:例如链表,数组,树和排序。
  • 您选择的语言中常见的“陷阱”,例如字符串是否不可变,以及如何管理内存。
  • 面向对象的编程概念,如类与对象和继承。

在你的职业生涯开始时,你需要发现这些问题,因为你没有经验证明你会擅长这份工作。在准备面试时,我总是推荐两种资源:

  • “破解编码面试”,一本精彩的书,包括许多编码问题及其解决方案,以及解决这些问题需要了解的内容摘要
  • CodeWars,一个包含大量编码问题的网站,您可以使用多种语言在浏览器中解决这些问题。最有用的部分是了解其他用户如何解决同样的问题。您将看到针对同一问题的不同方法,并使用您选择的语言学习新工具。

给自己额外的优势

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

首先,

学会传达你的经历你应该有一个电梯音调,将你的简历概括为一个连贯而引人入胜的叙述。


另外,要了解自己的简历!这听起来很愚蠢,但我看到很多受访者都在努力解释他们的简历中的特定项目。您应该能够回答有关您在简历中列出的任何经历的问题,并解释它是如何使您成为更好的候选人。


接下来,让代码示例显示在Github或其他公共存储库)上。


眼见为实,面试官能够看到你的代码会创造奇迹。此外,它还表明您对版本控制系统有所了解。


代码示例不必太复杂,但它们确实需要干净并显示出良好的编码实践。这是您在没有编码面试时间压力的情况下展示编码方式的机会。


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


这将是您在行业环境中进行编程的最接近的实际环境。到目前为止,这是迄今为止最难和最耗时的项目,所以保留它直到你完成我上面讨论过的较低的悬挂水果。

采访你的面试官

在求职的匆忙和压力下,许多考生忘记了面试是一条双向的街道。当公司试图弄清楚你是否适合这份工作时,你应该弄清楚公司是否适合你。


确保您可以询问下面的一些问题,即使它是在后续电子邮件中。请注意,通常情况下,公司可能会尝试不遵循最佳工程实践作为福利,因此请在各行之间进行阅读。


以下是您可以提出的一些示例问题:

“典型的工作日对我来说会是什么样的?”


了解特定职位的期望非常重要,因为软件工程的工作变化很大。例如,您可能需要维护服务器或直接与客户端通信。


红旗: “ 我不确定。”→意味着面试你的人不会出现在你的团队中,或者他们不清楚他们为什么雇用你。


“你如何测试你的软件?”


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


红旗: “ 我们只是不写错误,哈哈。” →那些人正是那些写错误的人。


“你使用什么版本的控制系统?”


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


红旗#1:“呃,版本控制系统?” →跑得远,很远。


始终使用版本控制。


红旗#2:“<插入模糊或自定义VCS>”→表示他们很可能跟不上时代,并且很长时间没有更新他们的基础设施。


“你做同行评议吗?”


同行评论,或让其他人在进入代码库之前查看您的代码,是发现愚蠢错误的绝佳方式,并且在开始您的职业生涯时是一个重要的培训机会。


红旗: “我们只相互信任!”→很可能高级开发人员非常保护他们的代码,并且不太善于接收反馈。


“你有什么课程可以继续教育?”


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


红旗:“你的意思是在空闲时间在网上阅读东西?” →该公司要么现金紧张,要么认为开发商可以替代,而不是长期投资。

“你使用的软件开发过程是什么?”


无论实际细节如何,流程对软件工程至关重要。什么构成最佳过程的细节受到激烈的争论,但仅仅存在一个商定的项目工作方式可以最大限度地减少混乱,并确保每个人都在同一页上。


红旗: “我们的过程受到自由形式爵士乐的启发。” →很可能整个部门处于灭火模式,从紧急情况跳到紧急状态没有任何明确的目标。


“你如何解决技术债务?”


技术债务是代码库中过时技术和快速而肮脏的解决方案的积累。解决它对于代码的长期健康很重要,应该持续进行。

红旗: “我们专注于新功能。” →他们的代码库很乱或很快就会出现问题。


“你的公司文化是什么样的?”


公司文化可能是一个非常模糊的概念,但即使像开放式办公室与小隔间这样的小事,也会以显着的方式改变与同事的日常互动。没有一般的危险信号,但要确保他们的答案是你可以忍受多年来每周40多个小时的事情。


担任软件工程师

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

恭喜,你是正式的工程师!


怎么办?好吧,是时候重新学习很多关于编码和工作的东西了。既然我们是程序员,那么我们首先讨论代码。

良好的行业准则

良好的行业代码按以下顺序具有以下属性:

  • 可读,因为代码的读取和维护频率高于编写代码。在您编写代码之后的几年内,代码的目的必须清楚。
  • 防御性,如下面的防御性编码的最佳实践。防御性编码本身就是一个主题,但它的要点是:你必须确保不正确地使用你编写的类和方法不会导致你的代码崩溃软件。
  • 优化,这是这个列表的最后一个,因为大多数时候,你不会真的需要担心它。这并不意味着当存在线性解决方案时,您应该编写在O(n³)中执行某些操作的错误代码。但是开发人员通常在不需要时尝试过度优化,通常会损害代码的可读性和可防御性。您应始终能够证明实际需要牺牲这些属性的某种优化。

既然你知道如何编写好的行业代码:

你不会做很多编码

这可能会让人感到惊讶,但大多数时候你不会编写新代码,相反,你会:

  • 调试
  • 阅读现有代码
  • 在会议或写电子邮件
  • 研究如何做,你编写代码

因此,编码以外的技能对您的职业生涯至关重要。

调试和阅读代码

  • 除了使用print语句进行调试之外,您还需要更多。所有广泛使用的语言和技术堆栈都有各种强大的工具。学习使用它们,因为它们可以使调试变得轻而易举,为您节省数不清的时间。
  • 理解代码库。大多数技术堆栈都有某种代码图生成工具,可以帮助您理解代码库的结构。企业IDE通常具有内置的功能。您还可以使用ReSharper,grep或Sourcegraph等工具来探索代码。
  • 了解产品。Ÿ ou'll惊讶有多少开发人员不知道该软件是如何认为他们试图“修复”之前的工作。只需阅读文档。

组织你的想法

由于您将大量时间用于沟通,研究和多任务处理,因此您需要一些工具来帮助保持一切顺序。

  • TODO列表/任务:您的公司应该已经拥有某种类型的任务软件,但它也有助于建立个人系统。使用便利贴或Trello或Todoist等软件。
  • 注意:始终在会议中记笔记,努力改进现有文档并创建个人知识库。使用Evernote,OneNote或笔记本电脑,就像以前一样。这看起来有点矫枉过正,但是一年之后,当你重新审视这个模糊的构建过程时,你会感激自己,这个过程花了你3天的时间来弄清楚。我从未见过一位没有做过大量笔记的优秀软件工程师。
  • 图表/可视化:人类是视觉生物,创建流程和架构图表将帮助您和其他人理解复杂的主题。在与非技术同事沟通时,图表特别有用。使用Lucidchart,Visio或普通白板。

知道何时使用库

简短的回答:几乎所有的时间。

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

为了成为一名高效的软件工程师,您需要了解您拥有的库。大多数流行语言的标准库非常有用,并且比您期望的大。此外,代码库还可以使用其他专用库。阅读他们的文档并知道何时使用它们。

如果能节省时间,您也不应该害怕建议额外的库。但是,您需要确保选择一个适合行业使用的好库。一个好的图书馆是:

  • 开源,因此您可以自己验证代码的质量,并可能修复对您的应用程序至关重要的错误。
  • 根据麻省理工学院和BSD等许可许可进行许可,因此贵公司不会因使用它而遇到任何问题。小心使用GPL,以免意外地打开整个代码库。
  • 成熟,即它已经出了一段时间并且具有丰富的功能。
  • 维持,新版本经常出现。
  • 由其他公司或项目使用,作为批准印章,并确保其为持续维护提供行业支持。

连续的提高

除了学习能使您在日常工作中更好的技能外,您还需要不断提高自己的技能并学习新技能,以便为自己创造新的就业机会。