作者丨ValeriAlexiev
译者
BrotherZhao
策划
蔡芳芳
我的职业生涯的最初几年是在紧张的学习中度过的。
软件工程师的工作不好做,我就遭遇了这一现实,因此不得不努力掌握很多我根本都不知道我需要掌握的技能。
在很多开发者工作的最初几年,我以导师的身份,对他们进行过辅导。我自己在这方面经历颇丰,我的一些同事也有相应经历。所以,基于这些经验,我撰写了本文,希望帮助那些需要帮助的人。
本文涵盖以下内容:
如何在面试中脱颖而出
如何在软件工程师岗位上生存(并壮大)
需要持续改进时,应当寻找何种资源
面试在你的软件工程师职业生涯开启的那一刻,你不得不面对一个不争的事实:面试真操蛋。
面试对于身处其中的每个人都是梦魇。我既做过面试官也做过应聘者,我可以作证,面试是一件很浪费时间的事情,压力超级大而且并不能很好地反映未来工作表现。尽管如此,面试还是必要之恶,你最好带着精心修饰的简历好好准备。
备战如果你正在考虑选择软件工程师行业,请确保掌握那些编程面试中最常问的问题,比如FizzBuzz:
编程打印从1到的数字。如果数字是3的整数倍,打印Fizz;如果数字是5的整数倍,打印Buzz;如果数字既是3的倍数又是5的倍数,打印FizzBuzz。(来源:CodingHorror)
听起来足够简单,对吧?
然而,很大一部分应聘者都没能通过这道简单的测试,更不用说其他的复杂衍生版本了。
我个人曾经眼睁睁看到过很多高级岗位的候选人,在可以自由上网的情况下,没能解出这道题目。所以,如果你的简历上展示了某种编程语言,你得确保自己可以用这种语言解决FizzBuzz问题。否则,你就只是在浪费大家的时间,包括你自己的时间。
当然了,要从面试中胜出,你还需要知道远多于FizzBuzz的知识。你同时需要确保你知道:
基础数据结构和算法,比如链表、数组、树和排序
你选择的编程语言中常见的问题,例如字符串是否不可变,以及如何管理内存
面向对象编程的概念,比如类和对象,以及继承
在你的职业生涯伊始,你需要格外重视这些问题,因为你没有经验可以证明你的工作能力。对于在准备面试的人,我总是推荐两种资源:
CrackingtheCodingInterview是一本很神奇的书。书中包含了大量的编程问题和相应解法,并汇总了解决此问题需要知道的知识。
CodeWars是个网站。这个网站罗列了大量的编程问题,你可以在浏览器中求解这些问题,可选择的编程语言范围也十分广泛。
其中最有用的部分是,你可以看到其他用户是如何解决同一问题的。你可以看到同一问题的不同解法,并学到关于你选择的编程语言的新的工具。
赋予自身额外优势有几件事情是你可以提前准备的,它将赋予你特殊的优势。
首先,学会向他人展示你的经验成果。用连贯而引人入胜的简述总结你的简历内容,就像电梯演讲一样。
另外,熟知你自己的简历!这听起来很傻,但是我却看到过很多应聘者挣扎着说不清楚他们简历上的某个特定细节。你应该有能力回答有关你简历上的经历的任何问题,并讲清楚这一经历如何让你更加适合应聘的岗位。
其次,展示你在GitHub(或者其他代码仓库)的示例代码。
眼见为实。有机会亲自看到你的代码的面试官都会忍不住想看一眼的。另外,这也表明你对于版本控制系统是有一定理解的。
这些示例代码不必太复杂,但是要整洁并展示良好的编程习惯。这是你展示无现场编程面试的时间压力下的编程习惯的好机会。
一旦你完成了以上两步,就需要考虑参与开源项目了。这将展示你可以在已有代码基础上工作,并且可以和其他程序员协同。
这将是你在尚未真正身处工业环境时最接近工业环境编程的了。这是迄今为止最难的也是最耗时间的项目,所以如果没有完成我前面提到的低难度任务,先不要做这个。
反过来面试你的面试官在匆匆忙忙、紧紧张张的找工作过程中,很多应聘者忘记了面试是个双向通道。在公司试图搞清楚你是否是这个岗位的合适人选的时候,你也应该搞清楚这个公司是不是适合你。
确保自己要提出以下问题中的几个,就算是邮件面试也要提。要记得,大多数情况下,公司都不会像遵守最佳工程实践一样给员工清晰的定位,所以要逐字逐句的阅读。
以下是一些你可以提出的问题:
“对这个岗位而言,一个典型工作日是怎么样的?”了解特定岗位的需求是很重要的,因为软件工程师岗位千差万别。比如,你可能需要长期维护服务器或者直接和客户沟通。
红色警报:“我不太确定”→意味着面试你的人不和你在一个团队,或者他们没有想清楚为什么要聘用你。
“你们如何做软件测试?”理想状况下,要检测代码质量,需要综合使用单元测试、人工测试和自动测试。
红色警报:“哈哈,我们写的代码没有bug。”→这么回答的人,就是那些写出bug的家伙。
“你们采用何种版本控制系统?”版本控制系统(Versioncontrolsystems)对团队协作是极其有用的,在专业团队配置中,没有任何理由不采用版本控制系统。
红色警报No.1:“呃……什么是版本控制系统?”→赶紧跑,跑得越远越好。
红色警报No.2:“insertobscureorcustomVCS”→这意味着他们基本上已经落伍了,很长时间没有更新过他们的基础设施了。
“你们做peerreview吗?”Peerreviews,或者在你的代码并入代码库前请其他人审阅你的代码,是检查低级错误的高效方式,也是在职业生涯初期的重要的训练机会。
红色警报:“我们相互信任!”→很可能高级工程师们对自身的代码十分“护食”,也不乐于接受反馈。
“对于员工的持续教育,贵司有什么项目支持吗?”随着新科技的出现、成熟和过时的速度越来越快,身为软件工程师就意味着要持续学习。因此,很多公司都有相应的培训预算,支持员工参加大学课程、在线课程、会议或室内讲座。
红色警报:“你指的是下班后在网上自学吗?”→公司要么是现金流紧张,要么就是将开发者视为可替代品而非长期投资。
“你们采用何种软件开发流程?”不论实际细节如何,流程对软件工程都是至关重要的。关于什么是最优软件开发流程的细节还存在激烈的争论,但是,仅仅存在一种商定的工作方式就能最大限度地减少混乱并确保所有人都在同一个频道上。
红色警报:“我们的流程是受自由爵士启发而来的。”→很可能整个部门都是在战火纷飞的状态,没有清晰目标的情况下应对一个又一个的突发紧急状况。
“你们如何解决技术债问题?”技术债是代码库中的过时技术和糙快猛解决方案的长期累积造成的。强调技术债对于代码库的长期健康是重要的,并且应该持续的改进。
红色预警:“我们特别