查看原文
其他

软件工程师如何笑着活下去?

Valeri Alexiev CSDN 2019-02-24


这里有一份软件开发菜鸟成长必备资源,请查收。

作者 | Valeri Alexiev

译者 | 苏本如

责编 | 仲培艺

出品 | CSDN(ID:CSDNNews)

我职业生涯的前几年是一段紧张的学习期。

我有幸成为了一名软件工程师,需要掌握许多我不曾具备的技能。回首往事,我为自己掌握了这么多的技能感到高兴。

希望这份指南对其他人有所帮助,指南中包括了我和我的同事作为软件开发专业人士从指导那些菜鸟开发工程师中获得的经验。

下面我将介绍:

  • 如何在面试中充分展现自己;

  • 如何作为软件工程师生存下来,并获得很好的成长合发展;

  • 持续改进所需的资源。


面试


当你选择投身软件工程这个行业时,就必须面对一个无法逃避的问题——糟糕的面试。

面试对每个参与者都很不友好。我曾做过面试官也曾经被面试过,我的经历可以证明,面试要消耗巨量的时间,且让人极度紧张,还会成为衡量你未来工作的指标。然而,面试是一种“必要的邪恶”,你和你的简历都要做好准备。

准备战斗

如果你正在考虑从事进入软件开发行业,一定要了解一些最常见的编程面试问题,比如“FizzBuzz”:

写一个程序,它将 print 1 到 100 这些数字。但是遇到 3 的倍数时,用“Fizz”替代数字,5 的倍数时用“Buzz”代替,既是 3 的倍数又是 5 的倍数时则 print “FizzBuzz。

看起来很简单,对吧?

然而,绝大多数面试者都在这个简单的问题上栽了跟头,更不用说更复杂的问题了。

我个人见过许多高级职位的应试者在可以上网查询的情况下依然做不出这道题。所以,如果你想在简历中列出一种编程语言,那么你至少有能力回答类似 FizzBuzz 这样简单的问题。否则你只是在浪费所有人的时间,这其中也包括你自己的。

当然,仅仅会 FizzBuzz 这样简单的问题并不能保证你能通过面试。你还需要了解更多,包括:

  • 基本数据结构和算法:如链表、数组、树和排序;

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

  • 面向对象编程概念,如类、对象和继承。

在软件开发生涯早期,你需要关注这类问题,因为你还没有经验来证明你能胜任这份工作。对那些准备面试的人,我总是推荐下面两种资源:

  • 《Cracking the Coding Interview》,一本非常棒的书,其中包括许多编码问题及其解决方案,以及解决问题所需的知识汇总。

  • CodeWars(https://www.codewars.com/),一个拥有大量编码问题的网站,你可以使用多种语言在浏览器中解决这些问题。最有用的部分是了解其他用户如何解决相同的问题,你将看到针对同一个问题的不同方法,并使用你选择的语言学习新工具。

让自己脱颖而出的技巧

首先,学会介绍你的经历(我的简历大致上是根据我的职业经历写的)。你应该掌握 Elevator pitch(电梯法则),用极具吸引力的方式简明扼要地介绍你的工作经历。

其次,你需要了解你的简历都写了什么!这听起来很愚蠢,但我看到很多面试者经常努力解释他们简历中的某一项经历。你应该能够回答面试官对你简历中列出的任何经历的提问,并能解释这些经历是如何使得你更加胜任这份工作。

接下来,就是展示你在 GitHub(或其他公共代码库)上的代码的时候了。

眼见为实,面试官直接看你写的代码会有意想不到的效果。额外的奖励是:面试官藉此知道了你对版本控制系统有所了解。

代码示例不必太复杂,但它们必须干净整洁并符合良好的编码规范。这是你展现在没有面试时间压力下的编码能力的机会。

完成以上所有工作后,就可以考虑参与一个开源项目了。它可以展示你在现有代码库上与其他程序员协同工作的能力

这是你最接近生产环境的编程能力,尽管你还没有生产环境下的编程经验。迄今为止这应该是最困难和耗时的部分,所以请坚持下去,直到你完成了我上面讲的容易实现的部分。

面试你的面试官

在求职的匆忙和压力下,许多求职者忘记了面试是双向的。当公司试图弄清楚你是否适合这份工作时,你也应该弄清楚公司是否适合你。

确保你可以问出下面的一些问题,即使是在后续跟进的邮件中。但是通常情况下,面试官可能不会那么配合给你答案,所以请仔细阅读以下内容,下面是一些你可以问的示例问题和代表“危险信号”的回答:

“我面试的这个职位,每天的工作日常是什么样子的?”

了解一个特定的职位需要做什么,这很重要,因为不同的软件工程的工作差别很大。例如,你可能需要维护服务器或直接与客户交谈。

危险信号:“我不清楚。”

意味着面试官不是你的团队成员之一,或者他不清楚聘用你的目的是什么。

“你们如何测试软件?“

理想情况下,应该组合使用单元测试、手动测试和自动化测试来验证代码的质量。

危险信号:“我们写的代码没有 bug,哈哈。”

意味着这些人正是制造 bug 的人。

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

版本控制系统对于协同工作非常有用,没有理由不在专业环境中使用它。

危险信号#1:“嗯?版本控制系统?“

意味着他走神了。

危险信号#2:一些模糊或自定义的 VCS 系统

意味着他们很可能没跟上时代的步伐,并且很长一段时间没有更新他们的软件开发基础设施了。

“你们的代码要做 Peer Review 吗?。”

Peer Review (同行评审),或者让其他人在代码进入代码库之前检查你的代码,是发现愚蠢错误的极好方法,也是开始你的职业生涯时至关重要的培训机会。

危险信号:“我们开发人员彼此互相信任!“

可能意味着高级开发人员对他们的代码保护心很强,不擅长接收反馈。

“你们有什么持续教育计划?”

作为一名软件工程师,随着技术的出现、成熟和过时,必须不断学习以跟上时代的变化。因此,许多公司都有培训预算,用于支付大学和在线课程、会议或内部培训的费用等。

不及格的回答:“你的意思是在空闲时间上网看东西?“

意味着公司要么缺钱,要么视开发人员为可替换品,而非长期投资。

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

不管实际细节如何,流程对于软件工程都至关重要。关于什么是最优流程的细节会引起激烈的争论,但是大家一致同意遵循同一流程将极大减少项目工作中可能出现的混乱,并确保每个人都有共同的理解。

危险信号:“我们没有固定的流程,大家自由发挥。”

可能意味着整个部门一直都处在救火模式,从一个紧急状态跳到另一紧急状态,没有明确的规划。

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

技术债务是指代码库中累积下来的过时技术和粗制滥造的代码。解决这一问题对代码的长期健康很重要,应该持续进行。

危险信号:“我们只关注新特性。”

意味着他们的代码库是一团乱麻,如果还没有,那也不远了。

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

公司文化可能是一个非常模糊的概念,但即使是像开放式办公室和小隔间这样的细微处,也会在很大程度上影响到你与同事的日常互动。没有哪种回答代表危险信号,但要确保他们的答案是你在一周 40 多小时且计划工作多年的情况下可以接受的。


职业生涯开启(开始工作)


在这个阶段,如果你在面试中表现出色,而且面试官对你所提问题的回答让你满意,那么你很可能被录用。

恭喜你,你已经正式成为一名软件工程师!

现在怎么办?是时候重新学习很多关于编码和开发工作的知识了。既然我们是程序员,就先讨论代码吧。

良好的代码

良好的代码应当符合以下特征:

  • 可读性,因为代码读取和维护的频率比写入的频率高。代码的意图必须让其他开发人员容易理解,即使经过了几年时间;

  • 防御性,遵循防御性编码的最佳实践,其要点是:必须确保不正确地使用所编写的类和方法不会导致软件崩溃;

  • 最优化,这是列表的最后一项,因为大多数时候,你不会真的需要担心这个问题。但这并不意味存在先行解决方案时,你却编写复杂的代码来求O(n³)解。开发人员往往对代码做不必要的过度优化,这通常会损害代码的可读性和防御性。然而你应该相信并能够适时证明一点:因为代码优化而导致一定程度的可读性和防御性的牺牲是必要的。

好了,现在你知道了如何编写良好的代码了。

写代码只是开发工作的一部分

这可能有些意外,大多数时候你不会编写新代码,但是需要做下面的工作:

  • 代码调试

  • 读取已有代码

  • 开会或写电子邮件

  • 做些让你无需编写代码的研究工作

因此,除了敲代码以外,拥有其他技能对你的职业生涯同样至关重要。

调试和阅读代码

  • 仅仅使用 print 语句进行调试是不够的。所有广泛使用的语言和技术栈都有各种强大的工具。学习使用它们可以让调试变得更轻松,还能为你节省很多时间。

  • 了解代码库。大多数技术栈都有一些代码图形生成工具,可以帮助你理解代码库的结构。企业 IDE 通常都内置这种工具。你还可以使用诸如ReSharpergrep 或 Sourcegraph 等工具来帮助了解你的代码库。

  • 了解产品。你会惊讶地发现,有多少开发人员在试图“修复”软件之前不知道软件应该如何工作。他们只是通过阅读文档来修复软件。

保证条理性

由于你的大部分时间将花在沟通、研究和多任务上,所以你需要一些工具来帮助保持一切井然有序。

  • TODO 列表/任务:你的公司应该已经有了某种类型的任务处理软件,但是拥有一个个人系统也很有帮助,比如 post-it 便利贴,或者像 Trello 或 Todoist 这样的软件。

  • 做笔记:在会议中始终做笔记,改进现有文档并创建个人知识库。使用  Evernote、OneNote 或者就像以前那样使用笔记本。这看起来有点“过度”了,但一年后当你重新审视那个一开始就花了三天时间的模糊的构建过程时,你会感谢你自己。我从未见过一个优秀的软件工程师不做大量笔记的。

  • 图表/可视化工具:人类是视觉生物,使用流程图和架构图将帮助你和其他人理解复杂的问题。图表在与非技术同事沟通时特别有用。这一类工具有 Lucidchart、Visio 或普通白板。

使用 Library(库)

什么时候该使用库?

简短回答:100% 的情况下。

详细回答:99% 的时候,因为没有必要全部重新造轮子。对于大多数软件工程来说,实现库中已有的某种功能完全是浪费时间。但这并不意味着你不需要搞懂你使用的算法和数据结构是如何工作的,因为这将帮助你决定用什么和何时用。

为了成为一名高效的软件工程师,你需要了解你可以使用的库。大多数流行语言的标准库都非常有用,往往会比你预期中有用得多。你也可以使用其他专有库。通过阅读文档,你可以了解何时使用库。

其他库如果可以节省时间,你也可以建议采用。总之你需要为你们的软件开发挑选好的库——一个好的库应该具备下列条件:

  • 开源。这样你就可以自己验证代码的质量,还可能修复对应用程序至关重要的错误。

  • 使用许可证,如 MIT 和 BSD。这样你的公司不会因使用该许可证而遇到任何问题。使用 GPL 要小心,以免意外地将你的整个代码库的源代码开源出去。

  • 成熟。也就是说它已经上市一段时间了,具有丰富的功能。

  • 有人维护,经常有新版本发布。

  • 有其他公司或项目使用。这将确保这个库有行业支持,能持续维护。

    持续进步

    除了学习有助于你日常工作的技能外,你还需要不断提高你的技能并学习新的技能,以便为你的职业生涯创造新的机会。

    学习的机会很多,大多也都是可以负担得起的:

    • 在线课程:这种以灵活的方式向该领域最好的专家学习的机会不应错过。你可以查看 CourseraUdacity 和 edX 上的众多课程来提高/扩充你的现有技能。

    • 在线硕士学位:最近在一流大学中流行,在线硕士学位是一种灵活的方式来继续你的正规教育。他们通常也比较便宜,大多数课程花费约 10000 美元可以获得整个学位。乔治亚理工大学、犹他州立大学和加州大学圣地亚哥分校是提供此类学位的一些大学。我个人推荐乔治亚理工大学的在线硕士学位,我今年从那里毕业了。

    • 博客:博客是开发者社区的重要组成部分。诸如 Coding Horror、Joel on Software 上的博客,或者更有趣的网站,比如 The Daily WTF,都能让你很好地了解作为软件工程师应该做什么和不应该做什么。浏览媒体、R/Programming、HackerNews 或其他订阅源也将引导你挖掘到优秀的博文。

    • 参加会议:最后但依旧很重要的一点,就是参加会议,这是一个非常有效的学习机会,你一定要利用公司的培训预算去参加会议。这里有一个不完整的会议列表和它们的主题:

    • Strange Loop (General), 

    • PyCon (Python), 

    • CPPCon (C++), 

    • DEF CON(Security), 

    • Fluent (Web dev).

    以上这些会议大多数在 YouTube 上都有会议视频,即使你不能参加,也可以从视频中学到一些东西!

    希望这篇文章能让你从一个软件工程师的职业生涯起始就对未来有所了解,也希望其中提供的工具和资源能在今后的成长过程中助你前进!

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

    本文为 CSDN 翻译,如需转载,请注明来源出处。



     热 文 推 荐 


    ☞ 罗永浩、戴威的 C 位消亡史

    ☞ React vs Angular,哪种学习成本更低?

    ☞ 程序员面试被问到“三次握手,四次挥手”怎么办?

    “对不起,你的离职是我的错!”

    ☞ Gartner的预言:通向混合IT之旅

    ☞ 阿里“菜鸟”AI?

    ☞ 刚刚!华为又被美国盯上了!

    ☞ 心疼!能为程序员男友做些什么吗?

    print_r('点个好看吧!');
    var_dump('点个好看吧!');
    NSLog(@"点个好看吧!");
    System.out.println("点个好看吧!");
    console.log("点个好看吧!");
    print("点个好看吧!");
    printf("点个好看吧!");
    cout << "点个好看吧!" << endl;
    Console.WriteLine("点个好看吧!");
    fmt.Println("点个好看吧!");
    Response.Write("点个好看吧!");
    alert("点个好看吧!")
    echo "点个好看吧!"

    点击“阅读原文”,打开 CSDN App 阅读更贴心!

    喜欢就点击“好看”吧

      您可能也对以下帖子感兴趣

      文章有问题?点此查看未经处理的缓存