0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

软件工程师如何获得更好的发展

工程师人生 来源:工程师吴畏 2018-12-12 11:36 次阅读

我刚开始工作的头几年是紧张学习的时间。

我得面对现实,成为软件工程师需要有很多技能,这些我之前都不知道。回顾过去,显然学会那些东西是很好的。

所以我就根据自己及其他人的经验写了这篇指南来帮助入行的新人

本文将覆盖以下内容:

如何尽力做好面试

如何在软件工程师的角色中生存(及发展)

考虑持续改进时可以参考的资源

面试

当你开始软件工程职业生涯时,你得面对一个无可争议的事实。面试很恶心。

参与其中的每个人都觉得很恶心。既被人面试过又面试过别人的我可以证明,面试是一项极其耗时、极其有压力的工作,并且面试其实并不是将来工作表现一个的好的指示器。但不管怎样,这都是一个必要之恶,你和你的简历最好还是做好准备为妥。

做好战斗准备

如果你考虑做软件过程,确保了解一些最常见的编程面试问题,比如“FizzBuzz”:

写一个程序打印从 1 到 100 的数字。但是如果数字是 3 的倍数的话则打印“Fizz”,如果数字是 5 的倍数则打印“Buzz”。如果同时是 3 和 5 的倍数则打印“FizzBuzz”。

来自 Coding Horror

听起来很简单,是吧?

好吧,但其实绝大部分面试者都没能通过这一简单的测试,且不说更复杂的变种了。

我个人曾经见过很多角逐资深岗位的候选人在拥有完全互联网访问的情况下没能通过这一测试。所以如果你的简历上面列有编程语言的话,确保你知道如何用它来编写实现 FizzBuzz 程序。否则的话,你只不过是在浪费所有人的时间,包括你自己的。

当然,为了在面试过后生存,你需要知道的不仅仅只有 FizzBuzz。你还需要确保你知道:

基础的数据结构和算法:比如链表、数组、树以及排序。

要知道所选择语言的常见解决办法,比如字符串是否恒定,内存是如何管理的。

类似类与对象,以及继承等面向对象编程的概念。

在职业生涯开始时,你需要就这些问题做好准备,因为你并没有经历去证明自己能做好这份工作。在准备面试的时候有两个资源我会经常推荐

《Cracking the Coding Interview(破解面试代码)》,这是一本非常好的书,里面介绍了很多的编码问题和解决方案,同时还总结了解决这些问题需要了解的东西。

CodeWars ,这个网站收集了大量的编程问题,你可以运用各种语言在浏览器里面去解决这些问题。最有用的部分是看看别的用户是如何解决同样问题的。这样你就可以看到解决相同问题的不同办法,并且学到你所选语言的新工具。

赋予自身额外优势

为了让自己取得那点额外优势,有几件事情你可以去做。

首先,学会如何沟通你的经验。你应该进行一次电梯演讲来将你的简历总结成连贯的、打动人的个人介绍。

此外,要了解自己的简历!听起来很蠢是吧,但我就见过很多面试者连解释清楚自己简历上的特定事项都很困难。你应该能够回答任何有关你列上简历的经历方面的问题,并且解释清楚这一经历如何让你成为本工作更好的候选人。

接着,要在 GitHub(或者其他的公共代码库)上面有一些编码的例子。

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

你的代码例子不需要太复杂,但是一定要整洁,能够显示出好的编码实践。这是你展示自己在没有编码面试所带来的时间压力情况下代码写得如何的机会。

一旦你做完了上面的事情后,就得考虑参与一个开源项目了。参加开源项目能表明你能够在已有代码库基础上工作并且可以与其他程序员一些协作。

这是你在无需实际进入一个行业环境的情况下最接近在行业环境下编程的方式了。这也是目前为止最难最耗时的一项任务,所以等到你把前面我提到的比较容易取得的果实都摘完之后再干这件事。

面试你的面试官

在找工作的匆忙与压力之下,很多候选人都忘了面试是一个双向的过程。在公司努力寻找这份工作的合适人选时,你也应该设法弄清楚这家公司适不适合你。

确保你也要提出以下一些问题,哪怕对方是以电子邮件的形式回复你。要意识到公司经常把不遵循最佳实践说成是一项技能,所以要体会其言外之意。

以下是一些你可以去提问的例子:

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

知道特定岗位预期的样子很重要,因为软件工程工作差别相当大。比方说你的工作既可能是维护服务器,也可能是直接跟客户沟通。

危险信号:“我不大肯定。” → 意味着面试你的那个人不在你的团队,或者他们对为什么要招你并没有明确的想法。

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

理想情况下,验证代码质量应该是单元测试、人工测试以及自动化测试的结合。

危险信号:“我们都写不出 bug,哈哈。” → 那些人正是会写出 bug 的人。

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

版本控制系统对于协作极其有用,在职业环境下没有理由不使用。

危险信号 #1:“额,版本控制系统?” → 快跑,跑得越远越好。

永远记得使用版本控制。

危险信号 #2:“《插入不知名的或者定制的 VCS》” → 这表明他们很有可能没有跟上时代并且很久没有升级自己的基础设施了。

“你们进行同行评审吗?”

同行评审,或者让别人看看你的代码再把它放进代码库,这是识别愚蠢错误的极好办法,同时也是开始你的职业生涯时一个关键的培训机会。

危险信号:“我们相互信任!”→很有可能那些资深开发者对自己的代码非常警惕不想给人看也不擅长接受反馈。

“你们的继续教育计划是什么样的?”

作为一名软件工程师意味着当新技术出现、成熟并以令人眼花缭乱的速度走向过时的时候要不断学习。因此,很多公司都有培训预算用来买大学和在线课程、会议或者内部交流。

危险信号:“你是说在闲暇时间读读网上的东西?” →这家公司要么资金紧张,要么把开发者视为可替代的,而不是长期投资。

“你们采用的软件开发流程是什么?”

无论实际的细节是什么,流程对于软件工程都至关重要。至于哪些东西对于优化流程做出了贡献可能大家会有不同的看法,但仅就项目的工作方式达成一致就能将混乱最小化并且确保每个人都能达成共识。

危险信号:“我们的流程受到了自由风格的爵士的影响。” → 很有可能整个部门都处在救火模式,总是不断地从紧急跳到另一个紧急状态而缺乏任何明确的目标。

“你们是如何处理技术债务的?”

技术债务是过时技术以及代码库中临时应急的解决方案的累积。处理好技术债务对于代码的长期健康很重要,这件事情应该持续地做。

危险信号:“我们只关注新功能。” → 他们的代码库一团糟或者很快就会一团糟。

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

公司文化也许是个非常含糊的概念,但即便像开放办公室还是小隔间这样的小事情都会显著改变你与同事的日常互动。这方面没有普遍性的危险信号,但是要确保他们的答案是你可以按照每周 40+ 小时的节奏持续相处数年的东西。

以软件工程师的身份工作

在这个阶段,如果你面试过程中表现不错并且喜欢面试官回答你问题的方式,你被录用的可能性就很高了。

祝贺,你正式成为一名工程师了!

那现在又该如何呢?好吧,现在是时候重新学习大量编码和工作方面的东西了。既然我们是程序员,我们就从讨论代码开始。

好的行业代码

好的行业代码有以下属性,依序是:

可读性,因为代码用来读和维护的频次要高于写。代码的意图必须清晰,让其他开发者在多年后依然理解。

防御性,就是要遵循防御性编码的最佳实践。防御性编码本身就是一个课题,不过其要义是:你必须确保自己所写的类和方法的不恰当使用不会导致你的代码搞得软件都崩溃。

优化,位列清单的最后未知,因为大多数时候你并不需要真正去担心这个。这并不意味着你应该编写糟糕代码,在存在线性解决方案的情况下以O(n³)的效率去做某个东西。但开发者通常渴望尝试并且会在不需要的情况下过度优化,却牺牲了代码的可读性和防御性。你永远都应该能够证明牺牲了这些属性的特定优化是值得的。

现在你了解了如何去编写良好的行业代码了。

编码的工作你不会干太多的

说出来也许有点令人吃惊,但是大多数时候你都不用写新代码,而是相反,要做:

调试

读已有代码

开会或者写电子邮件

研究该怎么做以便不用写代码

因此编码以外的技能对你的职业一样关键。

调试和阅读代码

调试远不仅仅是用打印语句。一切使用广泛的语言和技术栈都有各种强大的工具。学会使用它们,因为这些会让调试轻而易举,节省你无数的时间。

理解代码库。大多数技术栈都有某种代码图谱生成工具来帮助你理解代码库的结构。企业级的 IDE 通常都内置了那种功能。你还可以利用 ReSharper、grep 或者 Sourcegraph 之类的工具来探索代码。

理解产品。你会对居然有这么多开发者在试图“修复”软件前不知道软件应该是怎么工作的感到惊讶。先看看文档再说吧。

组织你的思路

既然你的大量时间都是用在沟通、研究和多任务上,你需要一些工具来帮助一切井然有序。

TODO 清单/任务工具:你的公司应该已经有了某种任务管理软件了,但你自己也有类似的个人系统是有帮助的。使用便利贴或者像 Trello 或者 Todoist 之类的软件。

笔记:开会一定要记笔记,要致力于改进现有文档并且建立个人的知识库。使用 Evernote、OneNote 或者笔记本。使用这些工具似乎有用力过度之嫌,但日后在回顾这一耗掉了你 3 天时间才想清楚的晦涩的开发过程时你会感谢自己的。不做丰富笔记的好的软件开发者我一个都没见过。

图表/可视化:人是视觉动物,创建流程图和架构可帮助你和其他人理解复杂的话题。在跟非技术人员沟通时图解尤其有用。可使用 Lucidchart、 Visio 或者白板。

知道何时使用库

简短回答:随时都要。

详细回答:99% 的时间内你都不应该重新发明轮子。在大多数的软件工程岗位,实现特定类型的东西都属于纯粹浪费时间。这并不意味着你不应该知道所使用的算法和数据结构是怎么工作的,因为这可以帮助你决定用什么以及什么时候用。

为了成为一名高效的软件工程师,你需要理解自己可以任意支配使用的那些库。大多数流行语言的标准库都是极其有用的,其规模比你想象的要大。此外,代码库也许也会利用了额外的特殊库。阅读其文档,知道什么使用去使用它们。

你还应该不要害怕去建议额外的库,如果它们将节省时间的话。然而,你需要确保自己选择了一个好的库供行业使用。好的库的标准是:

开源,这样你就可以验证自身代码的质量,并有可能修补对应用非常关键的 bug。

按照 MIT 和 BSD 等方式进行的授权,这样你的公司使用起来就不会遇到任何问题。要小心 GPL,因为它会让你不小心就将整个代码库都开源出去。

成熟,比方说出来已经有一段时间了,并且功能集非常丰富。

维护性强,新版本推出很密集。

别的公司或者项目也使用,这个可以充当品质认证确保有行业支持,能持续维护下去。

持续改进

为了替自己创建新的职业机会,除了学习会让你更擅长日常工作的技能以外,你还需要持续改进自身技能并且学习新技能。

其实学习的机会有很多,而且其中很多都是你可以负担得起的:

在线课程:向领域内最好的教授学习的机会,而且方式灵活,不容错过。现有技能的补充性教程可以去可以看看 Coursera、 Udacity 以及 edX 等。

在线硕士学位:在线硕士学位是最近在顶级大学流行起来的一个趋势,这种方式可以灵活地继续你的正规教育。相比之下,这种继续教育方式费用没那么昂贵,修完整个学位大多数在 1 万美元左右。乔治亚理工大学、UT 以及加州大学圣地亚哥分校等大学均提供此类学位。我个人推荐乔治亚理工大学的在线硕士虚伪,我去年刚从这里毕业。

博客:博客是开发者社区的重要组成部分。诸如 Coding Horror、Joel on Software 等博客或者甚至更加诙谐的网站如 The Daily WTF 等都可以为你提供信息,了解到作为软件工程师该干什么不该干什么。浏览 Medium、r/programming, HackerNews 等新闻流也能让你找到好博客和好文章。

会议:最后但并非最不重要的一个,会议时令人赞叹的学习机会,你绝对应该利用公司的培训预算去参加会议。以下是不完全的好会议清单:GOTO(通用), Strange Loop(通用), PyCon (Pytho),CPPCon (C++),DEF CON (安全),Fluent (Web 开发)。上述所有的会议在 YouTube 上都有视频,所以你哪怕不出席也能学到东西!

希望这篇文章能够用相关知识把你武装起来,让你了解到作为软件工程师的职业生涯伊始应该期待什么,并且提供合适的工具给你在开启这段令人兴奋的旅程中助你一臂之力!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 软件工程师
    +关注

    关注

    8

    文章

    217

    浏览量

    21112
收藏 人收藏

    评论

    相关推荐

    FPGA算法工程师、逻辑工程师、原型验证工程师有什么区别?

    ,还需要与软件工程师、硬件工程师紧密合作,对整个系统进行集成和测试。 总的来说,FPGA 算法工程师着重于算法优化,FPGA 逻辑工程师专注于逻辑设计,FPGA 原型验证
    发表于 09-23 18:26

    正是拼的年纪|65岁电子工程师上班VLOG #65岁退休 #电子工程师 #搞笑 #上班vlog

    电子工程师
    安泰小课堂
    发布于 :2024年07月25日 11:31:02

    嵌入式软件工程师如何提升自己?

    嵌入式软件工程师如何提升自己? 作为一名嵌入式软件工程师,在这个充满机遇和挑战的领域里,如何提升自己显得非常重要,它决定了你未来的发展方向和成就。接下来,我们一起探讨一下。 1.奠定扎实
    发表于 06-12 11:20

    索尼诚邀软件工程师参与PS免费手游平台设计

    据悉,近日,澳大利亚知名媒体TweakTown发现,索尼互动娱乐正在为其旗下的PlayStation Studios Mobile招募一名资深的软件工程师,负责设计PlayStation的免费手机游戏平台。
    的头像 发表于 05-23 17:08 673次阅读

    嵌入式软件工程师和硬件工程师的区别?

    嵌入式软件工程师和硬件工程师的区别? 嵌入式软件工程师 嵌入式软件工程师软件开发领域中的一种专业工程师
    发表于 05-16 11:00

    大厂电子工程师常见面试题#电子工程师 #硬件工程师 #电路知识 #面试题

    电子工程师电路
    安泰小课堂
    发布于 :2024年04月30日 17:33:15

    Cognition发布首款AI软件工程师Devin

    据报道,Cognition公司今日公布了其首款人工智能软件工程师——Devin,掀起了打造软件模式变革的序幕。该产品在SWE-bench代码测验中展现出卓越表现,甚至超过了部分顶级人类工程师的水准。
    的头像 发表于 03-13 10:57 579次阅读

    如何构建linux开发环境和编译软件工程、应用程序

    前文介绍了如何使用官方提供的镜像文件启动开发板,本文将说明如何构建linux开发环境和编译软件工程、应用程序。
    的头像 发表于 01-03 12:31 1870次阅读
    如何构建linux开发环境和编译<b class='flag-5'>软件工程</b>、应用程序

    嵌入式软件工程师常用的

    最近我换工作了,看见不同嵌入式软件工程师用的平台都不一样,所以我整理了一下。PlatformIO:多平台支持:PlatformIO支持多种嵌入式平台,包括Arduino、ESP8266、ESP32
    的头像 发表于 12-24 08:00 611次阅读
    嵌入式<b class='flag-5'>软件工程师</b>常用的

    嵌入式硬件和软件哪个好?

    ,如复位电路、常用滤波器电路、功放电路、高速信号传输线的匹配电路等;故障定位、解决问题的能力;设计文档的组织编写技能! 那对于嵌入式软件工程师来说: 嵌入式软件工程师领域较新,他的发展也是很快的,像
    发表于 12-05 15:17