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