不是每一个程序员都能成为优秀的软件工程师。在过去的6年时间里,我在Ooyala、Quora和now Quip这3个创业公司面试过许许多多挺有发展潜力的“种子选手”,他们都有着5年以上的工作经验,并且曾为类似于谷歌这样的顶级技术公司服务过,但是就 是搞砸了面试。毫无疑问,这些应聘人员都是不错的软件工程师,并且,他们甚至可能很擅长他们目前的工作。我之所以否决他们,只是因为我不认为他们能成为一 名优秀的软件工程师。
我多年的面试、培训和指导经验告诉我,具备一些特殊的品质能让软件工程师更容易在创业环境中取得成功。并且,这些品质在初创企业比在一个更成熟的公司更为关键。因为在一家初创企业:
- 对产品、软件系统、团队及其文化有一个更为深刻的认识。
- 成功更依赖于团队的表现,而非你自己。当然,如果在一家更大更成熟的公司,你的出色表现可能会成为你向上爬的踏脚石,但是在一家又小又新的公司,这根本无足挂齿。
- 时间是关键因素,一方面是因为初创企业大多没有盈利,另一方面则是相较于那些盘根错节根深蒂固的老牌子公司,敏捷是他们最大的优势。时间有限就意味着你必须马不停蹄、加班加点,不能拖拖拉拉磨磨蹭蹭,也没有太多的时间供你挥霍在需要解决的问题上。
我曾经有幸合作过的最有效率的软件工程师,有着熟练的技术和卓越的决策能力。他们大多内涵以下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点品质限制你的发展。那么,从现在开始,写个计划学习和提高这些技能吧!
相关推荐
在电子工程领域,掌握关键技能是成为优秀工程师的基石。"电子工程师必备 关键技能速成宝典_13421165"很可能包含了大量实用的知识点,旨在帮助电子工程师快速提升自己的专业能力。这份资料可能涵盖了电路设计、模拟...
### JAVA软件工程师必备知识 在当今信息技术飞速发展的时代背景下,掌握Java编程语言已经成为许多软件工程师及开发者的必备技能之一。作为一门广泛应用于各种领域的高级编程语言,Java不仅以其跨平台性、安全性以及...
《电子工程师必备手册》第三部分聚焦于电磁兼容(EMC)设计,这是一门至关重要的技术,对于确保电子设备能够稳定、可靠地运行至关重要。EMC涵盖了电磁干扰(EMI)和电磁抗扰度(EMS),是电子产品设计工程师必须熟练...
《硬件工程师必备手册》是一份全面且深入的资源,旨在...通过阅读《硬件工程师必备手册》,硬件工程师可以系统地提升自己的专业技能,了解最新的技术趋势,解决实际工作中遇到的问题,从而成为一名优秀的硬件设计专家。
### 嵌入式软件工程师笔试必备知识点解析 #### 一、嵌入式C/C++语言精华文章集锦 **1. C/C++语言struct深层探索** - **struct的巨大作用**: - 在大型C/C++程序开发中,合理利用`struct`能够有效地组织和管理数据...
在软件工程师的职业生涯中,无论是求职还是晋升,笔试和面试都是至关重要的环节。这份压缩包文件"软件工程师笔试、面试题大全"包含了丰富的资源,旨在帮助准备...记住,持续学习和实践是成为优秀软件工程师的不二法门。
8. **项目功能与管理**:项目经验应包括系统的具体功能模块(如公文管理、文档管理、人事管理等)和管理特性(如日程任务管理、邮件管理、会议管理等),这体现了软件工程师对业务流程的理解和系统设计的全面性。...
通过以上分析,我们可以看出,2019年的软件工程师试用期工作总结主要涵盖了工作态度、项目管理、问题解决、技术文档编写、工装优化、工艺改进、自我提升等多个方面,这些都是一名优秀软件工程师必备的技能和素质。...
"硬件工程师必备基础知识书籍.zip" 提供了两本珍贵的资源,即 "硬件工程师必备电子书—ADC.DAC应用设计宝典" 和 "硬件工程师基础知识.pdf",这两本书籍涵盖了硬件工程师在实际工作中需要掌握的关键知识点。...
本文将深入解析一份针对Android工程师的开发必备软件集合,涵盖从基础编程环境搭建到代码编辑、版本控制、图形设计等多个方面,旨在为Android开发人员提供一站式解决方案。 ### 一、Java Development Kit (JDK) ...
本文将根据提供的内容框架,详细阐述一名优秀的射频硬件工程师所需要具备的知识体系。 ### 第一部分:硬件知识 #### 数字信号 - **TTL和带缓冲的TTL信号**:TTL(Transistor-Transistor Logic)是一种常用的数字...
### 华为硬件工程师必备技能解析 #### 一、基础知识与设计规范 1. **基本设计规范**:这是成为合格硬件工程师的基础,包括但不限于电路设计规范、元件布局原则、信号完整性考虑等内容。良好的设计规范有助于提高...
说明书还能帮助考生了解项目的开发流程,包括需求分析、设计、编码、测试和维护,这些都是软件工程师必备的技能。 在准备软考的过程中,考生不仅需要掌握编程技术,还要理解软件生命周期的各个环节。通过分析项目源...
【网络工程师笔记】深入解析 在信息技术领域,网络...这些笔记内容是网络工程师必备的基础知识,对于理解计算机系统、操作系统工作原理、网络通信机制以及嵌入式系统设计至关重要,是成为一名优秀网络工程师的基石。
通过以上对电子硬件工程师必备基础知识的详细解读,我们可以看出,成为一名优秀的电子硬件工程师不仅需要扎实的理论知识,还需要丰富的实践经验,以及不断学习和适应新技术的能力。希望这些知识点能够帮助有志于电子...
以下是对"硬件工程师必备的基本技能"的详细阐述: 首先,硬件工程师需要掌握基本设计规范,这是所有设计工作的基石,包括电气安全、电磁兼容性(EMC)、信号完整性和热设计等方面的标准。 CPU是系统的核心,了解其...
根据给出的文件内容,以下是关于模拟电路工程师必备的20种模拟电路的知识点,分为三个层次来介绍: 1. 初级层次: 在入门阶段,工程师需要熟练记忆并理解20种基础模拟电路的功能和应用。这包括桥式整流电路、电源...
本文将重点介绍电子工程师必备的10大热门免费DIY工具之一——Logisim 2.7.0。 Logisim是一款功能强大的逻辑模拟器,它源自SourceForge平台,被誉为类似锡达逻辑(Cedar Logic)模拟器的优秀替代品。Logisim不仅在...
以下是一些精选的免费在线工具,它们覆盖了电路设计、逻辑模拟、电路模拟等多个方面,是电子工程师必备的资源。 1. **Calculatoredge**:这是一个多领域在线计算器工具,特别适合电子工程师。它提供了一个广泛的...