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


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

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

包括以下内容:

  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


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

一份软件工程行业生存指南相关推荐

  1. 最佳开发工具大全!前谷歌工程师两年打造“厂外生存指南”,登上GitHub热榜

    晓查 栗子 方驭洋 发自 凹非寺  量子位 报道 | 公众号 QbitAI 一位曾经的谷歌工程师,花费两年时间,辛苦整理了一份清单. 这个名为"xg2xg"的清单,原本是这位前谷歌 ...

  2. 内外兼修:程序员的成长之路+软技能 代码之外的生存指南

    .........代码之外的生存指南........... 内容简介  · · · · · · 这是一本真正从"人"(而非技术也非管理)的角度关注软件开发人员自身发展的书.书中论述 ...

  3. 速度来!《软技能:代码之外的生存指南 (第2版)》送书4本

    最近鱼哥和一位朋友聊天,他分享了一些他的苦恼-- 说起来这位朋友,他是985高校的本科生,竞赛保送,算是同辈中的佼佼者了.这些年闷头搞技术.做需求,头发白了不少,牙也被烟熏黑了,可职级卡在P7快八年了 ...

  4. 【读书笔记】程序员们需读的一本书《软技能:代码之外的生存指南》 | 约翰 Z.森梅兹

    这本书用微信读书第二小的字体来看也有一千多页,看了蛮久了.从年前还是在学校时候就开始刷了,讲了十几个章节,分版块来介绍程序员这条路上应当注意的一些事项.各方面都考虑到了,除了社会关系(感情之类的)基本 ...

  5. 【软技能:代码之外的生存指南】

    个人经历 虽然在学校也对自己的职业生涯有阶段性的目标和规划,但的确真正到了工作环境才能根据自己的实际情况再次规划自己的时间去执行自己的计划,因为在工作期间会有各种各样的情况,这时候是最容易松懈甚至于慢 ...

  6. 《软技能--代码之外的生存指南》读书笔记

    这本书可以说是程序员必读书了,本书共分为职业篇.自我营销篇.学习篇.生产力篇.理财篇.健身篇.精神篇等七篇,概括了软件行业从业人员所需的"软技能".通过阅读本书,软件工程人员.编程 ...

  7. 《软技能,代码之外的生存指南》--教你如何当一名程序员

    前言 世界上有两种力量,一种是思想,一种是剑. 还记得<倚天屠龙记>中的张无忌吗?光明顶上力挽狂澜,救明教于水火之中的侠之大者~ 教主之所以那么厉害,除了基因优良,父母.义父.师公.外公教 ...

  8. 三年一跳槽、拒绝“唯学历”,火速 Get 这份程序员求生指南!

    戳蓝字"CSDN云计算"关注我们哦! 作者 | 郭芮 责编 | 阿秃 根据埃文斯数据公司(Evans Data Corporation)2019 最新统计的数据显示,2018 年全 ...

  9. 运维必备生存指南 |《王者荣耀》乱象竟然也能反映出运维生存现状?

    <王者荣耀>已成为社会现象级手游,随之问题接踵而来.部分小学生沉迷后为买游戏道具刷爆家长银行卡.为抢夺游戏中"buff(增益效果)"大打出手. 这些问题怎么产生? 责任 ...

  10. 2023年程序员生存指南:不做低代码项目,不用go刷题,不去要求名校的岗位,不相信任何人的经验!

    2023年程序员该如何生存? 最近,一位网友给出了一份<2023年程序员生存指南>: 1.不要在互联网公司做低代码项目. 2.保证一定强度的刷题,不要用go刷题,用cpp或者java,性价 ...

最新文章

  1. 八皇后算法python_Python学习二(生成器和八皇后算法)
  2. Codeforces Round #504 E. Down or Right
  3. 每天一道LeetCode-----找出给定序列的所有子序列
  4. h5实现网页内容跟随窗口大小移动_h5页面能流行于各大社交平台必定有其原因的...
  5. Python 问题 unindent does not match any outer indentation level 在 pycharm 平台的解决方法
  6. Linuxqt制作文本编辑器_Python实操!速收藏!学习使用Python创建文本编辑器应用程序
  7. SBO的5个开发原则-机遇只给有准备的人[转]
  8. 一篇关于实体链接的小综述
  9. FreeRTOS基础认识
  10. ScreenToGif2.19.3中文版GIF录制工具
  11. NiFi 学习 —自己实现处理器
  12. Fortify 5.1漏洞整改方案(1)
  13. 计算机演示文稿实验报告,演示文稿实验报告
  14. Kafka删除历史消息的策略
  15. 2021新宁二中高考喜报成绩查询,新宁二中举行2021年高考倒计时100天誓师大会
  16. 序列化版本号(serialVersionUID)是做什么用的
  17. VMware创建共享文件夹并实现文件传输(Windows主机,Ubuntu虚拟机)
  18. 数据结构初阶之二叉树——概念篇
  19. 四轴FPV手动训练进阶步骤
  20. PCIe学习笔记之MSI/MSI-x中断及代码分析

热门文章

  1. 网易企业邮箱如何设置反垃圾规则?【网易企业邮箱】
  2. 用k-mer分析进行基因组调查:(二)用jellyfish进行k-mer频数统计
  3. 华为太极magisk安装教程_小米手机官方REC装面具(magisk)教程
  4. SDJZ2537LOL如何拯救小学生
  5. matlab中min函数
  6. 数码相机SD卡无法读取怎么办?照片怎么恢复
  7. 查询央行征信的APP有哪些?
  8. 如何查看自己的支付宝花呗是否已经接入央行征信? #花呗部分用户接入央行征信#
  9. Aras Innovator PLM二次开发
  10. VMware vCenter Converter Standalone