首页 程序人生 优秀软件工程师必备的7大特性

优秀软件工程师必备的7大特性

不是每一个程序员都能成为优秀的软件工程师。在过去的6年时间里,我在Ooyala、Quora和now Quip这3个创业公司面试过许许多多挺有发展潜力的“种子选手”,他们都有着5年以上的工作经验,并且曾为类似于谷歌这样的顶级技术公司服务过,但是就是搞砸了面试。毫无疑问,这些应聘人员都是不错的软件工程师,并且,他们甚至可能很擅长他们目前的工作。我之所以否决他们,只是因为我不认为他们能成为一名优秀的软件工程师。

我多年的面试、培训和指导经验告诉我,具备一些特殊的品质能让软件工程师更容易在创业环境中取得成功。并且,这些品质在初创企业比在一个更成熟的公司更为关键。因为在一家初创企业:

  • 1.对产品、软件系统、团队及其文化有一个更为深刻的认识。
  • 2.成功更依赖于团队的表现,而非你自己。当然,如果在一家更大更成熟的公司,你的出色表现可能会成为你向上爬的踏脚石,但是在一家又小又新的公司,这根本无足挂齿。
  • 3.时间是关键因素,一方面是因为初创企业大多没有盈利,另一方面则是相较于那些盘根错节根深蒂固的老牌子公司,敏捷是他们最大的优势。时间有限就意味着你必须马不停蹄、加班加点,不能拖拖拉拉磨磨蹭蹭,也没有太多的时间供你挥霍在需要解决的问题上。

我曾经有幸合作过的最有效率的软件工程师,有着熟练的技术和卓越的决策能力。他们大多内涵以下7种特质:

1.系统调试技巧

编程很大一部分时间其实是花在调试上的。有用户报告紧急问题,尽快将其修复;服务器的CPU出现负载高峰,尽快找出原因;数据莫名遭到破坏,尽快找出罪魁祸首,等等,都是你的工作。而良好的调试技巧则能让我们干净利落地解决这些问题。

在调试时,我们应该用一种科学严谨的思维看待问题:先假设出错的地方,然后用最有效的方法或者最小可重现的情况去验证。此外调试过程还需要涉及各种的工具:发现瓶颈的分析器、单步执行代码的调试器、缩小回归原因范围的git bisect、交叉分析现状的UNIX命令行等等。

不过,调试的应用范围不仅仅局限于技术领域。如果产品的增长率和使用率趋于平稳,我们该怎么假设和测试用户的行为以调试未来目标的重心?如果一个团队完不成他们的项目目标,我们该怎么调试才能知道导致项目流产的根本原因是技能不足,团队沟通不畅还是别的其他原因?招聘有的时候并不能尽如人意——你也知道,大家对于你是如何调试的过程并不能一目了然,不是吗?(关键:先从数据入手)

2.勇于面对未知

作为一名软件工程师,你需要经常专研那些又大又不熟悉的代码库:可能你需要好好研究你正在使用的那个开源工具的代码,才能随心所欲地挥洒自如;又或者你需要搞清楚其他团队成员写的代码,因为他没有修改时间等等。所以,快速驾驭大型代码库和精通相关区域的能力显得至关重要。而这种能力大部分来自于经验,通过阅读过大量代码积累的经验。还有一小部分则需要靠我们熟悉能搜索代码库、跳转到相关部分的工具了,以及会查找有关提交历史中的版本控制——这些捷径都能减少我们去了解新代码所需的时间。如果是在更为成熟的公司,这种勇于面对未知的精神也能让我们受益匪浅,不过不同的是,我们往往只需要专注并精通一部分代码库就能成果斐然了。

当然,其他非代码领域有时候也需要你去探索。软件工程师常常需要接待客户、与销售人员讨论客户要求的可行性、给新的工程师培训,以及其他领域的很多你甚至完全没有接触过的事宜。在这些经历中成长,会让你受益无穷。

3.对决策的务实态度

可能在一家大规模公司,在代码审查和单元测试坚持己见有助于改善组织平衡。但是在一家初创公司,务实更重要,因为这能让团队快速完成任务。在这里我所说的务实指的是,知道什么时候应该积极辩论,而一旦有了决策,即便你再不同意,也能一丝不苟地作为团队的一份子认真执行。我曾经看到过因为编码风格而相互争执的现象,一个说在源代码起码得有80,100,或120个字符和大括号,而另一个觉得应该另起一行。呵呵。我深深地觉得,我们还不如把这些宝贵的时间和精力用到更重要的决策上。

对决策的指导启发式评估应该侧重于“是否最终能增加团队成功的概率?”。很多因素都会对这个问题产生影响:产品的选择、架构的侧重点、团队的文化、人才结构,等等。我们在决策前最好限定讨论的时间,然后坚决执行,各抒己见。

4.善于运用工具

工欲善其事,必先利其器。工具的合理运用能让我们节约大量的时间,而时间则是我们最重要的资源。高效的工程师常常是那些善于利用工具的人,而这一点在创业公司尤为重要,因为这里的时间更紧迫。一些大型的组织可能会有专门的工具团队。而在初创公司,你善用工具的能力越强,完成的任务数量就越多。如果这些工具也为其他团队成员所接受,那么团队生产力将会发生乘数效应。

5.牛逼的多面手

初创企业早期出现的很多问题其实并不需要很专业的知识。具备的技能越多,在解决问题时遇到的瓶颈就越少,哪怕我们只是对这些技能有一个最基本的了解,还在摸索熟悉技能的过程中。如果前端Web工程师也装备了基本的服务器技术(server skill),那下次再遇到与此相关的问题就不必去请服务器工程师在百忙之中拨冗相见了。而后端工程师,假如会一些基本的HTML、CSS和JavaScript技能,就能将他所制作的工具设计成一个Web界面,以方便其他团队成员使用,从而不必因为缺乏Web设计师而裹足不前。一个成长中的工程师,应该是那种能顺利使用基本的数据分析工具分析实验数据,而不必受制于数据分析员的多面手。

不过,有一种更欢迎“专家”的例外是,如果是在利基、重技术的环境里,例如启动数据库,那么拥有精深的专业知识工作效率会更高。而且,随着创业公司的发展,对于博而不精的多面手,越到后期,能取代你的人就越多。

6.保持玩家心态,而非受害者心态

在Fred Kofman的《Conscious Business》一书中,他描述了人们对待问题采取的两种不同态度。可以是受害者心态,怨天尤人,责怪他人的不是(项目时间太少、产品推出不当、以及和队友发生争执等等),通通归咎于外部原因。另一种就是玩家心态,审视自己的能力,一旦确定能做补救,毫不犹豫地贡献自己的能量。虽然短时间内,受害者心态能抚慰我们受伤的心情,但是从长远角度看,拥有玩家心态的人才能不断进步与发展。

在创业公司工作压力是很大的,并且随着压力程度的增加,人们往往不但不能勇于承担个人责任,反而很容易陷入互相推诿以逃避责任的怪圈。而这样做,我不得不遗憾的说,最后终将导致失望和解聘。

7.不断学习与回顾,持之以恒

研究发现,只要我们有足够的激情和动力,上述种种品质通过学习和培养都是可以后天养成的。而学习这些技巧的所有能量来源于一种叫做“坚忍不拔”的品质。Angela Lee曾在她的TED演讲《The key to success? Grit》(《成功的关键:坚持》)中,提及这个概念:

坚忍不拔是一种专注于长远目标的激情和毅力。坚持梦想,坚持未来,不是一天两天,也不是一周两周,更不是一个月两个月,而是持续多年,不畏艰辛、勇往直前,为了目标而奋斗。

如果我们也能拥有这种坚忍不拔的品质,愿意投入时间回顾自己的所作所为,那么就能发现自己的薄弱之处和需要改进的地方。然后随着时间的推移,不断进步的你必将会成为一个更为优秀的软件工程师。在早期如果能得到大咖的指点迷津,尽早行进在正确的方向,也能让我们走的更远。

上述这些技能即便是在更为成熟的公司也是能助你一臂之力的,不过在初创公司发挥的作用更大,原因么,上面也有提到,因为初创公司的时间更紧凑。当然,并不是说不具备这些技能就不是一个好的工程师了,这只能说明,可能你不大适合这种创业环境。但是,如果你立志要成为一个优秀的软件工程师,不要让上面这7点品质限制你的发展。那么,从现在开始,写个计划学习和提高这些技能吧!

站心网

不是每一个程序员都能成为优秀的软件工程师。在过去的6年时间里,我在Ooyala、Quora和now Quip这3个创业公..

为您推荐

编写优秀 CSS 代码的 8 个策略

编写基本的CSS和HTML是我们作为Web开发人员学习的首要事情之一。然而,我遇到的很多应用程序显然没有人花时间真正考虑前端开发的长久性和可维护性。我认为这主要是因为许多开发人员对组织CSS / HTML和JavaScript的策..

C#13新特性 使用System.Threading.Lock简化线程同步

C# 13 引入了新的线程同步类型 System.Threading.Lock,它通过作用域管理的方式简化了锁的使用,使代码更加清晰可靠。本文将全面介绍 System.Threading.Lock 的功能、适用场景,并提供完整的运行示例程序。1. 什么是..

.NET9 F#有什么新特性?

F# 9 的新特性简介F# 9 是 .NET 9 的一部分,带来了多项增强功能,旨在提升开发效率和语言特性的一致性。这些改进不仅为现有的 F# 开发者提供了更强大的工具,也使新手更容易上手。以下是主要特性概览:1. 改进的类..

.NET9 C# 13 有哪些新特性?

在 .NET 9 和 C# 13 中,微软引入了一些新的语言特性和性能改进,帮助开发者提高代码效率、简化语法和提升可维护性。以下是一些主要的新特性:参数扩展支持:params 参数现在可以支持除数组外的集合类型,例如 List..

Vue 3.5引入新特性 还有与SSR相关的改进

Vue 3.5引入了响应式属性解构、useTemplateRef方法、useId实用函数、内部响应性重构等新特性。以下是具体介绍:响应式属性解构此功能允许开发者在defineProps宏中解构属性而不会失去响应性,这为组件间的属性传递提..

Attribute特性封装通用数据验证

在接口接收数据或者数据库写入的时候一般都会进行数据验证。如果在接收到数据或者插入的时候对对象的每个属性进行检验,代码会很臃肿,而且无法复用,通过Attribute特性可以优雅地进行数据验证。例如我们写一个特性..

C#12新特性和语法糖有哪些?

C# 12 于 2023 年 8 月 10 日发布,引入了许多新特性和语法糖,包括:C# 12 新特性records:一种新的值类型,可用于表示具有固定字段集合的实体。记录可以用于表示数据库表、对象模型或其他类似的结构。pattern matc..

优秀求职者应主动问的5个问题

许多有经验的面试官觉得问面试者一些问题是很浪费时间的,所以面试官总会在面试最后问“你有什么问题需要问我吗?” 一般的求职者并不会太关注面试官会怎样回答自己的问题,他们更多的只是想让自己问出..

.NET8 15个新特性

1、.NET 8 中的 System.Text.Json序列化和反序列化功能进行了多种改进2、新增时间抽象功能,新的 TimeProvider类和 ITimer接口添加了时间抽象功能,让你可以在测试方案中模拟时间。3、.NET8 对 UTF8 改进4、处理随机..

.Net8 AOT有什么新特性

这次.Net 8发布,更新了诸多功能,但从各个编程社区看到大家讨论和交流最多的,还是AOT这个功能。ASP.NET Core也引入AOT的支持,但也不是所有功能都支持,MVC还不支持目前,支持最好的是Web API。.NET 8 在 AOT 方面..

json5新特性

JSON5 是 JSON 的一种扩展格式,旨在提供更加人性化和便捷的 JSON 语法。JSON5 在 JSON 的基础上增加了一些特性,使其更加灵活和易读。以下是 JSON5 的一些特点:注释支持: JSON5 允许在数据中添加注释,这在标准 J..

C# 11 的新特性和改进预览

摘要截止2022年8月9日,.NET 7 已经发布了Preview.7了,C#11 的新特性和改进也即将敲定。在这个时间点上,不少新特性都已经实现完毕并合并入主分支C# 11 包含的新特性和改进非常多,类型系统相比之前也有了很大的增..

Google Chrome谷歌浏览器七大新特性

Google Chrome在日常生活中扮演的角色不只是一个功能强大的网络浏览器,它内置的 DevTools同样也是网络开发者进行网络开发的重要工具。 DevTools在不断的进行版本更新,其中有很多重要的更新细节你可能会错过。在这..

Angular 17新特性

Angular 17是 Angular 的最新版本。该版本包括了许多新特性和改进,旨在提高 Angular 的性能、可维护性和可访问性。性能改进Angular 17 包括了许多性能改进,旨在提高 Angular 应用程序的性能。这些改进包括:新的 I..

Redis6.x新特性介绍

在Redis 6.x中,引入了多线程IO处理,这意味着在处理客户端的网络请求时,可以使用多个线程来并行处理,从而更有效地利用系统资源,提高系统的吞吐量和响应速度。特别是在高并发场景下,多线程处理可以大幅提高效率..

SQL Server 2022有哪些新特性?

SQL Server 2022 是 Microsoft 推出的最新版本数据库管理系统,它包含许多新功能和改进,旨在提高性能、安全性、云支持和人工智能和机器学习功能。以下是 SQL Server 2022 的一些主要新特性:性能改进:内存优化表: ..

.NET8.0新特性和改进

.NET 8.0 是微软于 2023 年 11 月 8 日发布的最新版本的 .NET 框架。它是 .NET 7.0 的重大更新,带来了许多新特性和改进。.NET 8.0 的主要新特性支持 C# 11:.NET 8.0 支持 C# 11 的新特性,包括可选类型、尾调用优..

C#中FieldOffset特性的应用示例

在C#编程中,FieldOffsetAttribute特性是一种非常有用的工具,可以帮助开发人员精确地控制字段在内存中的偏移量,以及对齐方式。这个特性的主要作用是为了优化内存布局,提高程序的效率和准确性。定义FieldOffsetAtt..

Entity Framework8(EF8)有哪些新特性

Entity Framework 8(EF8)是用于 .NET 开发人员的流行对象关系映射 (ORM) 框架的最新版本。它于 2023 年 11 月发布,包含许多新功能和改进。EF8 的主要新功能包括:对 JSON 列的支持:EF8 现在支持将 JSON 数据存储..

发表回复

返回顶部