这篇文章对于新手工程师,以及那些想要培养工程领导力、寻求成长、达到新高度的人来说尤其有用。候选人还将了解在技术面试中对他们的期望以及在这些面试中采用的选择标准。
有不同的方法来定义程序员所需的技能集。要求因您合作的公司、项目和团队而异。最常见的定义是“经验丰富的”程序员不仅了解理论,而且成功地解决了实际的实际问题;知道如何找到非标准问题的解决方案。
显然,所有有经验的程序员都有一个共同的重要特征:搜索相关信息的能力。还有一些其他重要的品质,例如对编程的热爱和对工作的渴望。如果一个人没有工作的欲望,那么即使是令人印象深刻的经验和才华也将毫无用处。在工作中,我遇到了那些精通技术但不愿工作的人。
程序员的基本技能包括良好的记忆力、专注和学习新技术的能力以及逻辑思维。简而言之,一个有经验的程序员应该有一个运作良好的“活大脑”。没有它你就无法继续。这些重要特征决定了你从小就将编程作为一种职业的倾向。
我将描述的其余功能可以分为两类:技术知识和个人特征。如果技术知识可以在各种培训、课程中获得,并在实践中磨练出来,那么个人素质(或软技能)如果违背一个人的天性,就不是那么容易获得的了。无论如何,经验丰富的程序员在这两个领域都各行其道,并学到了很多东西。
很明显,经验丰富的程序员精通一种或多种技术和一些框架。但是,在掌握特定技术之前,程序员需要了解系统和网络的基本架构、数据结构和算法;系统管理和一般的计算机科学。系统管理员和 DevOps 都遵循此路径。就编程本身而言,了解数据结构和算法、技术抽象以及 OOP 原则非常重要。
在学习了某种语言之后,程序员会继续学习框架和库。这些是更高的抽象,它们联合了更小的抽象。对于前端开发人员来说,它是 React、Angular 和 Vue。
以下几点概述了理想程序员“活脑”的内部运作
🔴对技术的深刻理解和寻找最佳方法
一个有经验的程序员应该知道几种技术并应用最好的方法。这些知识不是表面的,而是在实践中掌握的。系统的方法可以让您看到项目的大局;将其视为一个整体而不是部分,然后选择其发展的最佳方法。生产力和效率的概念有时会混淆。您可以快速完成项目,但会犯很多错误,并且调试将比仔细的逐步开发过程花费更多时间。
速度并不总是高级工程师资格的标志。相反,以结果为导向是一个不可或缺的特征。动作和动作的效率比无数行代码和速度更重要。找到一种平衡质量和速度的项目开发方法是经验丰富的工程师的能力范围之内。
🔴 时刻关注用户体验
程序员的一个好习惯是时刻关注用户体验——从用户的角度思考程序的外观,是否方便、清晰。
您不必成为设计师就可以预测功能的工作方式。掌握代码测试以避免开发过程中的错误也很有用。
🔴 对技术流程的承诺
遵循技术流程可以被认为是任何程序员的一个好习惯,尤其是有经验的程序员。这是一个至关重要的细微差别。在更改变量或函数之前,您需要检查它的使用位置。
您需要深入研究技术文档;这将有助于避免愚蠢的错误并节省时间和技术主管的神经。好吧,有经验的人知道这一点并教别人🙂
🔴 编写易于他人使用的可读代码
该技能源自上一个技能。鉴于技术流程得到彻底遵循,每个人都可以轻松地从事该项目。请记住,其他人也可能使用您的代码,因此,编写时就像您自己编写一样。你的“拐杖”可以回旋镖回来。最好测试和定期重构你的代码,考虑你所谓的变量和函数,并考虑其他人。
为项目选择正确的技术是一项关键技能。有经验的程序员有时会坚持使用他们习惯的技术,即使团队的其他成员很难使用它。相反,您应该做出考虑到整个团队的决定;与他人协商、讨论和协调您的行动。
🔴架构的定性分析和开发
要定性地分析和理解建筑,你需要了解理论并有足够的实践经验。高级工程师能够执行全面的需求分析并开发在各个级别上有效实施的软件架构。
同时,必须在程序可读性和开发效率之间取得平衡。为了避免在规划阶段出现问题,经验丰富的程序员了解不同的技术并能够选择正确的技术。
🔴 能够示意性地解释
对于经验丰富的程序员,尤其是 Tech Leads,以图形方式解释技术原理信息和使用简单图表的能力是一项非常有用的技能。
图表、图形和图表提供了技术和项目的整体视图。可视化系统方法简化了整个团队的工作。通过这种方式,Tech Leads 可以将全貌传达给其他人。
🔴 创建有效的工作流程
经验丰富的工程师会区分团队绩效和他们自己的绩效。为了提高团队的效率,他们构建了工作流程或选择了新技术,例如自动部署。
此外,他们试图鼓励团队中的其他程序员在代码审查期间学习更多并分析他们的错误。
经验丰富的程序员非常清楚实现业务目标的重要性,并且能够平衡实现和代码质量。毕竟,如果您深入研究代码质量,一项任务可能需要一个月的时间,您可以一直重做直到最后几天,从而使整个项目变得完美。但为了业务增长,您需要在质量和客户要求之间找到平衡点。
有些程序员只关注业务任务并用“拐杖”填充他们的代码。我曾经在一个项目上工作,在开发 2 年后不得不完全关闭,因为每个新功能都需要一个月的时间来实现。方法和技术的“炖菜”根本无法使用。这就是想要做得更快的愿望如何导致悲惨的结果。
我认识深入研究代码质量并在一项任务上卡住 2 个月的程序员。老实说,我很惊讶他们保住了工作。最终,这项任务被证明是不可逾越的。这意味着,找到平衡至关重要。
完美主义靠近我的心。但是,必须有一种健康的方法,而不会过度使用。通常,人们不会改变。即使在面试中,我也会注意到这样的人,并且明白与他们一起工作会很有挑战性。
以下几点突出了健康完美主义的好处
🔴 团队合作能力
默认情况下,很明显团队成员在任何项目中都受到重视。这说明了他们的非对抗性,以及承担责任、沟通和可靠的能力。
你可以有自己的意见,但仍然听别人的。
🔴 对复杂任务充满信心
经验丰富的程序员自信,但不固执。他们不惧怕艰巨的任务,因为他们已经达到了一定的专业水平,拥有足够的技术知识,可以处理复杂的事情。
经验丰富的工程师可以从不同的角度规划项目,提供良好的建议并从框架开发到编码始终以结果为导向。这样的人在团队中很受重视;很高兴能和他们一起参加职业比赛。你总能学到一些东西。
🔴 不断开发和寻找必要信息的愿望
同样,经验丰富的工程师精通多种框架,并且能够使用多种技术。为此,您需要不断发展,并寻找机会在工作之外学习新事物。有经验的人学得很快,并掌握了他们工作所必需的新趋势。一些工程师认为只从自己的错误中学习就足够了。的确,在实践中,你获得了很多知识,但你需要根据别人的经验来加深它。今天网上资料够多了,真的可以学到很多。
可能,掌握一个项目的领域将是一个额外的优势。例如,如果您从事金融科技项目,您应该从业务角度了解软件的价值,并了解该领域的某些功能流程。
🔴 保持平衡的能力
当一个项目正在开发中时,可能会发生各种无法预料的情况,并且可能会出现错误。他们让没有经验的程序员大吃一惊,并将他们逼入绝境。经验丰富的工程师都知道,一切都必须冷静地解决,因为恐慌和大喊大叫无济于事。虽然,也许,这些错误纯粹是由人为因素造成的。
有经验的程序员会在保持平衡的同时找到替代解决方案。冷静比情绪化更容易找到解决问题的非标准解决方案。
🔴 分享知识和提供反馈的能力
理想情况下,经验丰富的程序员与他人分享知识;参加网络研讨会、会议和黑客马拉松。从一本书或其他人的理论中分享知识是一回事,而贡献你自己的经验——你过去的“痛苦”——是另一回事。网络确实很有帮助,尽管有些人可能不喜欢它。
有经验的程序员知道对他人的工作提供反馈是多么重要。这让初级专业人士有机会了解他们的潜在增长领域、要解决的问题以及要避免的错误。
及时反馈是透明管理和有效沟通。如果处于 Team Lead 职位的程序员能够理解并实践这一点,那就太好了。
🔴 承认错误的能力
有经验的程序员的另一个优点是承认错误。这种能力意味着一个人知道如何承担责任。错误是吸取教训并为未来获得宝贵经验的机会。 Tech Lead 可以在代码审查期间提供有用的见解,并告诉如何解决特定问题,而不是将责任归咎于其他人的错误。
有经验的程序员绝对不会把一个初级的“下车”并指责新手的错。整个团队都在工作,每个人都有自己的职责范围。有人鬼混会影响整个团队。牢记这一点可以更轻松地建立信任和透明的关系。
失败可以是技术上的,也可以是人为的。例如,如果员工不定期上班,这是人为因素。
至于重要的技术故障,我没有遇到过,因为我不经常和高级以下的程序员一起工作。显然,高级工程师和初级工程师可能的失败存在于不同的维度。
我将其称为在不运行测试的情况下将代码发送到存储库的失败。最好将这个过程自动化,就像我们公司所做的那样。另一个失败是代码“拐弯抹角”。有时希望快速编写代码,但如果这种加速过程会降低质量,那么它在未来会变得很明显。
代码质量有多种方法。必须绝对考虑 SOLID 原则。如果你做一个多态函数,你需要确保它不会破坏它已经被使用的区域。在进行任何代码更正时,您需要考虑后果是什么以及它们将如何影响您。
不遵循技术流程是程序员的失败。在我的团队中,它是创建拉取请求、运行代码质量测试、进行功能测试以及检查您自己执行的任务。如果您遵循公司设计的技术流程,则故障将降到最低。但是,我应该承认,并非所有公司都正确配置了流程,这也可能是未来失败的先决条件。
总的来说,我认为前辈的失败源于懒惰,而后辈的失败源于缺乏经验和注意力不集中。青少年的错误出现在你最不期望的地方。初中生的工作,一开始就是不断失败,必须不断改正。但这就是青少年的目的。
前辈的懒惰看起来像是习惯了一个过程,并且信任它,想着,“好吧,那我稍后会解决它”。通常它的结局并不总是很好,但仍然比初中的情况更好🙂
没有经验的程序员可以在两个阶段被识别:首先,在面试中,其次,最糟糕的是,在工作中,如果你错过了“冒牌货”。
帮助我评估程序员经验的问题:
这是帮助确定一个人知识渊博以及合作前景的问题的第一部分。如果候选人在这个阶段感到困惑,事情只会变得更糟。
碰巧一个程序员有 5 年的经验,并且精通 10 种技术,但是当你从这个列表中提出基本问题时,可能没有答案。下一个区块的一组问题也可能发生同样的情况。
在技术面试中,我不会给出复杂的算法任务,因为面试总是很紧张,我不想加重压力。即使开发人员习惯于使用某些技术,忘记如何执行某些任务也是正常的;没有人是完美的。知识的深度和快速解决问题是重点。
总体而言,我们在面试中评估软技能和硬技能。问题的技术块因技术和项目而异。
一些程序员有提供建议和指导的导师。我没有这一切。我自己研究并自己找到了必要的信息。虽然我获得了经济控制论学位并且已经了解了基础知识,但在阅读 Java 哲学时,很难理解新的抽象。
曾几何时,Java Rush 课程对我帮助很大;一切都很容易解释,我可以马上练习。但这与前端无关。
这就是帮助我成为程序员的原因。我从官方技术文档中研究了其余部分,并在免费视频课程中寻找信息。这对我来说已经足够了。
同时,认为获得课程学位会为 IT 公司打开大门的想法是错误的。没有知识,这张纸是没有意义的。为了文凭而参加课程是没有意义的。
在某种程度上,你可以获得结构化的信息,但你必须记住它,它必须是你未来成长的基础和开始。优秀程序员的特征之一是能够找到高质量的信息。
如果你能做到,一切都会好起来的。但是,如果您希望有人为您拼写出来,那您就大错特错了。我会推荐自我开发和浏览可用的在线课程。如果您已经是一名程序员,您可以参加 Udemy 课程,这是您工作所需的课程。
开发人员获得的经验越多,就越能意识到开发在工程领导领域的重要性。这不仅是关于那些已经管理团队的工程师;还有那些总是紧跟潮流,学习新事物,全面发展自己的软硬技能,与他人分享知识和能力的人。