写点什么

软件工程师生存指南

  • 2019 年 12 月 13 日
  • 本文字数:4941 字

    阅读完需:约 16 分钟

软件工程师生存指南

我的职业生涯的最初几年是在紧张的学习中度过的。


软件工程师的工作不好做,我就遭遇了这一现实,因此不得不努力掌握很多我根本都不知道我需要掌握的技能。


在很多开发者工作的最初几年,我以导师的身份,对他们进行过辅导。我自己在这方面经历颇丰,我的一些同事也有相应经历。所以,基于这些经验,我撰写了本文,希望帮助那些需要帮助的人。


本文涵盖以下内容:


  • 如何在面试中脱颖而出

  • 如在软件工程师岗位上生存(并壮大)

  • 需要持续改进时,应当寻找何种资源


面试

在你的软件工程师职业生涯开启的那一刻,你不得不面对一个不争的事实:面试真操蛋。


面试对于身处其中的每个人都是梦魇。我既做过面试官也做过应聘者,我可以作证,面试是一件很浪费时间的事情,压力超级大而且并不能很好地反映未来工作表现。尽管如此,面试还是必要之恶,你最好带着精心修饰的简历好好准备。


备战

如果你正在考虑选择软件工程师行业,请确保掌握那些编程面试中最常问的问题,比如 FizzBuzz:


编程打印从 1 到 100 的数字。如果数字是 3 的整数倍,打印 Fizz;如果数字是 5 的整数倍,打印 Buzz;如果数字既是 3 的倍数又是 5 的倍数,打印 FizzBuzz。(来源:Coding Horror


听起来足够简单,对吧?


然而,很大一部分应聘者都没能通过这道简单的测试,更不用说其他的复杂衍生版本了。


我个人曾经眼睁睁看到过很多高级岗位的候选人,在可以自由上网的情况下,没能解出这道题目。所以,如果你的简历上展示了某种编程语言,你得确保自己可以用这种语言解决 FizzBuzz 问题。否则,你就只是在浪费大家的时间,包括你自己的时间。


当然了,要从面试中胜出,你还需要知道远多于 FizzBuzz 的知识。你同时需要确保你知道:


  • 基础数据结构和算法,比如链表、数组、树和排序

  • 你选择的编程语言中常见的问题,例如字符串是否不可变,以及如何管理内存

  • 面向对象编程的概念,比如类和对象,以及继承。


在你的职业生涯伊始,你需要格外重视这些问题,因为你没有经验可以证明你的工作能力。对于在准备面试的人,我总是推荐两种资源:


  • Cracking the Coding Interview 是一本很神奇的书。书中包含了大量的编程问题和相应解法,并汇总了解决此问题需要知道的知识。

  • CodeWars 是个网站。这个网站罗列了大量的编程问题,你可以在浏览器中求解这些问题,可选择的编程语言范围也十分广泛。其中最有用的部分是,你可以看到其他用户是如何解决同一问题的。你可以看到同一问题的不同解法,并学到关于你选择的编程语言的新的工具。


赋予自身额外优势

有几件事情是你可以提前准备的,它将赋予你特殊的优势。



首先,学会向他人展示你的经验成果。用连贯而引人入胜的简述总结你的简历内容,就像电梯演讲一样。


另外,熟知你自己的简历!这听起来很傻,但是我却看到过很多应聘者挣扎着说不清楚他们简历上的某个特定细节。你应该有能力回答有关你简历上的经历的任何问题,并讲清楚这一经历如何让你更加适合应聘的岗位。


其次,展示你在 GitHub(或者其他代码仓库)的示例代码


眼见为实。有机会亲自看到你的代码的面试官都会忍不住想看一眼的。另外,这也表明你对于版本控制系统是有一定理解的。


这些示例代码不必太复杂,但是要整洁并展示良好的编程习惯。这是你展示无现场编程面试的时间压力下的编程习惯的好机会。


一旦你完成了以上两步,就需要考虑参与开源项目了。这将展示你可以在已有代码基础上工作,并且可以和其他程序员协同。


这将是你在尚未真正身处工业环境时最接近工业环境编程的了。这是迄今为止最难的也是最耗时间的项目,所以如果没有完成我前面提到的低难度任务,先不要做这个。


反过来面试你的面试官

在匆匆忙忙、紧紧张张的找工作过程中,很多应聘者忘记了面试是个双向通道。在公司试图搞清楚你是否是这个岗位的合适人选的时候,你也应该搞清楚这个公司是不是适合你。


确保自己要提出以下问题中的几个,就算是邮件面试也要提。要记得,大多数情况下,公司都不会像遵守最佳工程实践一样给员工清晰的定位,所以要逐字逐句的阅读。


以下是一些你可以提出的问题:


“对这个岗位而言,一个典型工作日是怎么样的?”

了解特定岗位的需求是很重要的,因为软件工程师岗位千差万别。比如,你可能需要长期维护服务器或者直接和客户沟通。


红色警报:“我不太确定”→意味着面试你的人不和你在一个团队,或者他们没有想清楚为什么要聘用你。


“你们如何做软件测试?”

理想状况下,要检测代码质量,需要综合使用单元测试、人工测试和自动测试。


红色警报:“哈哈,我们写的代码没有 bug。”→这么回答的人,就是那些写出 bug 的家伙。


“你们采用何种版本控制系统?”

版本控制系统(Version control systems)对团队协作是极其有用的,在专业团队配置中,没有任何理由不采用版本控制系统。


红色警报 No.1:“呃……什么是版本控制系统?”→赶紧跑,跑得越远越好。



红色警报 No.2:“< insert obscure or custom VCS > ”→ 这意味着他们基本上已经落伍了,很长时间没有更新过他们的基础设施了。


“你们做 peer review 吗?”

Peer reviews,或者在你的代码并入代码库前请其他人审阅你的代码,是检查低级错误的高效方式,也是在职业生涯初期的重要的训练机会。


红色警报:“我们相互信任!”→很可能高级工程师们对自身的代码十分“护食”,也不乐于接受反馈。


“对于员工的持续教育,贵司有什么项目支持吗?”

随着新科技的出现、成熟和过时的速度越来越快,身为软件工程师就意味着要持续学习。因此,很多公司都有相应的培训预算,支持员工参加大学课程、在线课程、会议或室内讲座。


红色警报: “你指的是下班后在网上自学吗?”→公司要么是现金流紧张,要么就是将开发者视为可替代品而非长期投资。



“你们采用何种软件开发流程?”

不论实际细节如何,流程对软件工程都是至关重要的。关于什么是最优软件开发流程的细节还存在激烈的争论,但是,仅仅存在一种商定的工作方式就能最大限度地减少混乱并确保所有人都在同一个频道上。


红色警报:“我们的流程是受自由爵士启发而来的。”→很可能整个部门都是在战火纷飞的状态,没有清晰目标的情况下应对一个又一个的突发紧急状况。


“你们如何解决技术债问题?”

技术债是代码库中的过时技术和糙快猛解决方案的长期累积造成的。强调技术债对于代码库的长期健康是重要的,并且应该持续的改进。



红色预警:“我们特别关注新功能。”→他们的代码库乱成一团,或者马上就会乱成一团。


“贵司的企业文化是怎样的?”

企业文化可能是十分虚无的概念,但是开放式工位 VS 格子间这样的小细节都可以极大地影响到你和同事的日常接触。这里并没有通用的红色预警,但是要确保,他们回答的内容是你可以连续数年下来每周在其中工作 40+ 小时的环境。


软件工程师的职业生涯

在这个阶段,如果你在面试中表现不错,并且也喜欢面试官回答你问题的方式,你基本确定被录用了。


恭喜恭喜。你终于成为一名正式的工程师了。



然后呢?是时候重新学习这些关于编码和工作的繁文缛节了。因为我们是程序员,所以就从代码开始讨论吧。


良好的工业级代码

良好的工业级代码具备以下特性:


  • 可读性。代码只需写一次,却需要阅读和维护远不止一次。在写完代码之后若干年,对于其他开发者而言,代码意图依旧必须清晰明了。

  • 防御性,也就是防御性编程最佳实践。防御性编程是个独立话题,但是其要义在于,你要确保未正确使用的类和方法不会导致软件崩溃。

  • 最优化。这是清单中排在最后的,所以不用过于担心这个。这并不是说,存在线性解的情况下,还可以写出复杂度是 O(n³) 的破烂代码。但是,工程师通常急于试验并且在根本不必要的情况下过度优化,结果往往损害了代码的可读性和防御性。你需要随时可以证明,损害这二者而做的那些优化真的是值得的。


既然你已经知道了什么是良好的工业级代码:


你没多少时间写代码

这可能会令你大吃一惊,不过大部分时间你都不是在写新的代码,而是在


  • debug

  • 阅读已有代码

  • 开会或者写邮件

  • 看看做些什么才能够不写代码


所以写代码以外的技能对于你的职业生涯相当重要。


测试代码、研读代码


  • 用 print 语句 debug 是最省时间的方式。所有广泛使用的编程语言和技术栈都包含大量的有力工具,学会使用他们,debug 将变得小菜一碟并为你节省大量时间。

  • 理解代码库。大多数技术栈都有代码图表序列工具,可以帮助你理解代码库结构。企业级 IDE 一般都有内置功能。你可以借用外部工具,诸如 ReSharper, grep 或者 Sourcegraph

  • 理解产品。如果你知道在“修复”系统前,多少开发者并不清楚软件如何运行,你绝对会大吃一惊的。多读文档就是了。


理清自身思路

因为你要在在交流、研究和多任务处理上花费很多时间,所以你需要一些工具,帮你让一切保持井井有条。


  • TODO 清单/ 任务:你所在的公司应该已经有某种任务管理软件了,这却不妨碍你拥有自己的个性化配置。可以使用便利贴或者 Trello 或 Todolist 这样的软件。

  • 笔记:会议一定记笔记,坚持改善已有文档并提升自我知识基线。就像过去一样,使用 Evernote、OneNote 或者笔记本。这看起来有些落伍,不过当你在一年后花了三天时间才找到当时的潦草记录的时候,你会感谢当年记笔记的你。我认识的优秀的软件工程师,没有一个不是做了详实笔记的。

  • 图表/可视化工具:人类是视觉化的动物,创建流程和结构图表有助于帮助你和他人理解复杂的话题。在与非技术背景的同事交流时,表格是极其有用的。推荐使用 Lucidchar、Visio 或者白板。


知道何时使用其他库

一言以蔽之:一直用。


详细说明:99% 的时间,你都不应该重复造轮子。在大多数软件工程岗位中,重新撰写某一种排序算法都是彻头彻尾的浪费时间。这并不是说,你不必知道所用的算法和数据结构如何运行。知晓这些内容,将有助于你决定何时采用什么。


作为一位高效的软件工程师,你需要理解你手头当下可以用的库。大多数流行编程语言的标准库都是特别有用并且远超你想象的。此外,代码库还可以使用其他专门的库。你需要熟读其文档,并知道何时使用。


如果使用额外的库可以节省时间,你也不必为此战战兢兢。但是,您需要确保选择工业级别的优秀的库。一个优秀的库应当具备以下特点:


  • 开源,这样你才能检查代码质量并修复对你的应用致命的潜在 bug 。

  • 使用相对宽松的许可证,如 MIT 和 BSD,这样你的公司不会因此担上任何官司。要小心 GPL 许可,除非你想不小心开源你的全部代码。

  • 成熟,也就是已经面世一段时间并具备丰富的功能。

  • 持续维护,常有新功能问世。

  • 其他公司或项目在用,这可以作为例证,并确保其具备工业应用的持续更新。


持续改善

你需要学习那些是你的日常工作更加出色的技能,此外,你也需要持续提升你的技能并学习新的技能,这样才能为你自己不断创造新的职业机会。


学习机会多如牛毛,其中很多都是触手可及的:


  • 在线课程:你不应该错过向你所在领域的最顶尖教授学习的机会, 而且形式很灵活。在 CourseraUdacity 和 edXps://www.edx.org/ 等网站上,你可以找到很多补充你现有技能的课程。

  • 在线硕士学位:在世界顶尖大学中,在线硕士学位是继续接受正规教育的一种灵活方式。和在校课程相比,在线硕士学位通常也不太贵,大部分课程的学费都在 1 万美元左右。 Georgia TechUT以及 UC San Diego 都提供此类学位。我个人推荐佐治亚理工学院在线硕士( Georgia Tech’s Online Master’s),我今年刚刚从这里毕业。

  • 博客:博客是开发者社区一个重要组成部分(这个不足为奇,因为你现在正在阅读的就是我的博客)。诸如 Coding HorrorJoel on Software甚至更加幽默的网站比如 The Daily WTF 都可以提供作为一位软件工程师哪些该做和哪些不该做的建议。浏览 Medium、r/programming、HackerNews 和其他 feed 流网站,你都会找到很多有益的文章和博客。

  • 会议:最后但并非最不重要,会议是一个及其有用的学习机会,你应该充分利用公司的培训预算去参加会议。以下是高价值会议(含会议主题)推荐的不完整名单:GOTO; (General)、 Strange Loop (General)、 PyCon (Python)、 CPPCon (C++)、DEF CON (Security)、 Fluent (Web dev)。YouTube 上有以上所有会议的(大部分)演讲的视频,所以就算你不能亲临现场,也能够学到东西的。


我希望这篇文章为你提供了软件工程师职业生涯伊始需要的知识,并提供了激动人心的旅程中表现卓越所需要的工具。


原文链接:


https://medium.freecodecamp.org/a-software-engineering-survival-guide-fe3eafb47166


2019 年 12 月 13 日 08:043143
用户头像
蔡芳芳 InfoQ高级编辑

发布了 702 篇内容, 共 378.9 次阅读, 收获喜欢 2493 次。

关注

评论

发布
暂无评论
发现更多内容

架构设计学习资料汇总

俞凡

架构

Linux之ssh-copy-id命令

入门小站

Linux

Kubernetes官方java客户端之八:fluent style

程序员欣宸

4月月更

微服务从代码到k8s部署应有尽有系列(四、用户中心)

万俊峰Kevin

微服务 RPC web开发 go-zero Go 语言

在 Flutter 和 Dart 中取消 Future 的 3 种方法

坚果

4月日更

谈谈高并发系统的一些解决方案

xiaoxi666

高并发 高并发系统设计 高并发系统

王者荣耀商城异地多活架构设计

「架构实战营」

系统架构实践(一)

Trent

SeekTiger治理通证STI流动性质押的背后,是DAO社区的支持

西柚子

浅谈软件项目开发过程

小锅米线

swagger2 统一默认Response Code

Rubble

swagger 4月日更

在线XML转HTML工具

入门小站

工具

微信朋友圈高性能架构

流火

推荐一款可以替代Postman的国产api管理工具apipost

CodeNongXiaoW

php 后端 开发工具 java api管理工具

怒肝 JavaScript 数据结构 — 数组篇(一)

杨成功

JavaScript 数据结构 4月月更

三高Mysql - Mysql索引和查询优化(偏理论部分)

懒时小窝

MySQL 数据库

基于python的struct模块实现简单的ByteBuf

歆晨技术笔记

智能时代,应该如何培养中小学AI教师?

脑极体

架构师成长路线图

俞凡

架构

全链路压测(八):构建三大模型

老张

性能测试 全链路压测 稳定性保障

模块7作业-王者荣耀商城异地多活架构设计

卡西毛豆静爸

#架构实战营

新的篇章,Pancake开通STI的流动性LP质押

BlockChain先知

在线OPML美化格式化工具

入门小站

工具

一条SQL语句是如何执行的?

程序员阿杜

MySQL 数据库

SeekTiger治理通证STI流动性质押的背后,是DAO社区的支持

小哈区块

当东数西算变成一场西游记……

白洞计划

架构训练营-作业七

默光

异地多活 架构训练营5期

STI已于Pancake开通流动性LP质押

石头财经

容器 & 服务:Kubernetes运维记录

程序员架构进阶

Kubernetes 容器 4月日更 4月月更

软件工程师生存指南_文化 & 方法_Valeri Alexiev_InfoQ精选文章