初级开发人员常犯的八个最常见错误
初级开发人员常犯的八个最常见错误,它们是:
不理解业务需求和用户需求。
不了解所使用的编程语言和技术。
不遵循代码规范和最佳实践。
不进行充分的代码测试和调试。
不善于与团队成员沟通和协作。
不注意代码注释和文档编写。
不重视安全性和数据保护。
不进行持续学习和提升技能。
我认为软件开发是一项非常棒的职业,但我也认为它比我们通常认为的要复杂得多。问题在于在软件开发中犯错误非常容易,这不仅限于编码方面,也包括我们思考和处理工作的方式。在职业生涯的早期阶段,有许多不同类型的错误会发生,但哪一种是最常见的呢?没有经验的软件开发人员经常犯什么错误?我有什么建议可以帮助他们克服这些错误呢?本文我想探讨一下我对初级开发人员经常犯的八个最常见错误的看法。
第一个错误是认为软件开发只是编码。
这个错误非常常见,特别是对于刚刚开始的开发人员来说。他们可能写代码很好,但这就像问一个木匠做什么,然后回答说他们使用的是帽锯。重要的不是他们使用的工具,而是他们如何使用这些工具来制作门,椅子,橱柜等。同样,软件开发人员不仅仅是写代码,而是在创造整个软件系统。
软件开发旨在为人们解决问题,我们的工作是解决问题而不仅是编写代码。我热爱这个职业,部分原因是因为编写代码让我感到非常专注,但我更喜欢找到简洁的问题解决方案,即使有时候这并不需要编写代码。
作为软件开发人员,我们很容易陷入对我们所使用的工具的痴迷中,而忽略了真正需要解决的问题。因此,我建议我们更多地关注解决问题的本质。始终想着自己是否愿意使用所开发的软件,如果答案是否定的,那么我们需要想办法改变这种情况。
在我的职业生涯中,我有幸与一些伟大的软件开发人员合作。他们之所以伟大,并不是因为他们更精通所使用的编程语言,虽然他们中有些人确实很擅长自己所用的语言。他们之所以伟大,是因为他们对正在解决的问题有更多的洞察力,并能找到更简单的解决方案。成为一个10倍的程序员并不是指打字速度要快10倍,而是要能够用更少的代码解决问题。因此,我们需要把更多的注意力放在找到问题解决方案上。
第二个错误可能是:没有正确理解需求。
这种想法几乎完全误解了软件开发的本质。它假设编写代码是开发人员的唯一工作,而其他人的工作只是告诉开发人员要写什么代码。但是,为什么企业不能清晰明确地告诉我们解决方案是什么,然后我们把解决方案转换成代码呢?实际上,许多组织都试图通过这种方式来工作。如果开发人员的工作只是从详细描述中进行翻译,那么我们就失去了自动化的机会,无法将正确描述转化为代码。因此,我们需要更注重深入了解问题,并尝试找到更简单的解决方案,而不仅仅是编写代码。
在现实中,我们组织思维的难度要比理解计算机要高得多。对于人与人之间的交流,理解用户需要和有效的解决方案同样也是一项困难的任务。其次,另一个错误的假设是,有人知道问题的答案或应该怎么做,但实际上没有人确切知道,有很多数据证明了这一点。用户通常不知道自己需要什么,如果你问大多数用户他们需要什么,他们所提出的想法往往与他们的实际需求有很大的差距。了解用户需求当然很重要,但真正伟大的产品是能够超越用户期望并为他们带来惊喜的产品。
在iPhone发明智能手机并彻底改变手机行业之前,没有人提出过这个需求。同样的,在eBay和亚马逊开始之前,没有人要求在线购买书籍或在线销售沙发。这是因为这些公司本身也不知道这些需求的存在。
事实上,三分之二的软件产品创意并没有创造出任何价值,甚至带来了负面效果。当老板说我们有一个很棒的产品想法时,我们都是在猜测,因为在不确定的环境中开发系统是我们的工作。这并不是因为我们愚蠢、邪恶或者工作不够努力,这只是游戏的本质。
因此,我们需要以保护自己免受错误猜测的方式工作。我们需要逐步发展问题的解决方案,并且在这个过程中保持灵活性,给自己留有犯错的余地。速度是最重要的,但我们需要聪明地工作,而不是仅仅努力地工作。有一种琐碎的方式让初级程序员关注速度,这种做法需要多种形式才能快速前进。
(图片来源于网络)
有时候我会让自己内心微笑,即使作为一个有点脾气暴躁的老程序员,当我看到年轻的程序员们快速地打字改变代码,而我却跟不上他们的速度。也许是因为我年龄大了,速度慢了,但更重要的是,他们似乎不给自己思考和学习的时间。打字速度虽然很重要,但我们也要充分了解所使用的工具,以便更高效地工作。我们的目标不应该只是写更多的代码,而应该是写更少但更优秀的代码。
因此,停下来思考其他的解决方案总是一个好主意。画一张图,聊聊天,预测接下来会发生什么,然后以不同的方式尝试打字。虽然快速交付功能很重要,但如果我们只是追求工作的忙碌而不是真正的学习和思考,那么我们就错过了软件开发的真正意义。
软件开发是一门创造性的智力学科,我们的真正目标是学习和创新,这是非常昂贵的,但不是将学习转化为代码。一旦我们了解了问题的本质,编码就变得容易了。如果编码仍然很难,那么采用测试驱动开发(TDD)可能是最好的学习方法。
我的建议是要优化学习过程,而不是只关注特性开发的速度。我的工作是编写代码,但更重要的是要理解问题的本质。这与我之前提到的第一个问题有些相似,但有所不同。学习了解问题领域是成为优秀程序员的关键,最好的程序员都擅长学习这些知识,反之亦然,无论你对编程语言和工具了解多少。
如果你不深入了解你正在研究的问题,你的工作可能会出现问题。尽管在某些方面你不必成为领域专家,但最好的程序员应该足够了解问题领域,拥有甚至专家有时都忽略的洞察力。虽然我们不能像真正的领域专家那样拥有深入的领域专业知识,但我们可以做得很好,发现领域专家由于过于亲近问题而忽略的相似之处和机会。因此,当与领域专家交流时,需要建立一种可以共享的语言,以探索和解释问题。
如果你遇到不理解的概念,试着去现实世界中找到相关问题,这将对你编写的代码质量、简洁性和可读性产生深远的影响,并帮助你提高对问题的理解能力。如果你不是求助他人,这意味着你需要更多的知识和技能,而不是假装自己知道所有的答案。适应不确定性是作为一名优秀软件开发人员的必要素质,因为大多数问题都存在不确定性。在问问题时,诚实坦率是关键。如果有人认为你的问题很愚蠢,那是他们的问题而不是你的问题。如果你重复问同样的问题,试着给自己留一些时间去思考,让别人知道你不明白,并寻求他们的帮助。这样通常会得到帮助并激发新的思考。
在我的列表中,软件体系结构是专家设计的重点。要设计出一个好的体系结构,需要经验。我认为你至少需要看到三种不同的方式来实现类似的事情。理想情况下,你需要掌握三种不同的技术。在你真正有这种经验之前,软件体系结构不仅仅是创建它。好的软件体系结构有点像系统的旅游地图,它向你展示了足够的方向,而不会涉及太多你不能进入的细节。这样你就能找到你真正的位置。
在我以前的采访中,我曾经问过开发人员描述他们知道或工作的系统。我的目的是了解他们对系统的看法,而不是关心系统实际做了什么或它是如何做的。当被问及这种问题时,相当一部分开发人员只列出了技术。例如,一个运行在Tomcat上、带有Oracle后端的Java系统。但他们无法描述它做了什么以及它是如何做的。我认为任何开发人员都应该能够描述他们工作的系统是如何工作的。这对非技术人员来说也是一个很好的测试,至少对于那些对系统一无所知的技术人员来说。
在研究系统时,我们需要考虑它的组织原则是什么,它是否能帮助我们决定在系统中的哪个位置放置行为。在我的列表中,下一步是测试。测试是别人的工作,但如果你写代码,你也需要确保它能工作。即使你没有自动测试,你也需要手动运行它,看看它是否能工作。如果不能工作,那么你是危险的,需要离开键盘一步。
现在我们唯一的争论是我们的测试是否能自动运行。如果你是这里的常客,我不想让你太厌烦。如果你不是常客,请查看我关于测试驱动开发和行为驱动开发的其他一些内容。
了解正确答案为什么是自动化测试是重要的。现在,谁应该编写好测试呢?主要是我们开发人员。我们是编写能够通过测试的代码的人,也是在代码出错时修复代码的人。因此,我们应该是首先发现错误、最有能力理解和纠正错误的人。至少,我们应该对正在运行的测试负责。大多数情况下,我们自己编写测试是最佳选择。
要记住,我们的工作是解决问题,而不是编写代码。我们如何知道问题得到解决,如果没有检查它是否是我的清单上的最后一个?我会做得更好,但我的老板不让我这样做。这是一个很大但很常见的错误。在糟糕的组织中,解决这个问题可能会让人感到不舒服。解决这个问题需要再次依靠一些自信。这种自信在你职业生涯的开始可能很难找到。但在某种程度上,如果你雇用我当厨师,我们必须对自己的工作负责。你犯了一个大错误,但如果你犯了这个错误,你不会指望告诉我为了在我工作时清理干净。你会认为我会把我的工作区保持干净,我的工具会保持锋利,作为我日常工作的一部分。你不会问我做一顿好饭要多久,也不会指望我回答只要你不指望再次使用厨房,我可以在20分钟内做好。
但在软件中,我们有时会提供这样的答案。如果你曾经给出过不包括重构或测试的估计,如果你曾经跳过这些事情来赶在最后期限前完成,这里有专业的注意义务。我们都有责任,我们都是我们专业的专家。我认为我们不应该要求别人允许我们做一份体面的工作。
因此,这是我关于专注于正确事情的八条建议。不可避免地,你将在一个现有的团队中工作,遵循现有的规范。作为初级成员,你可能无法施加权威并要求他人改变。我的建议是做你能做的事,找出你能控制的事情,并更好地改变这些事情。找出你能影响的事情,你可能会惊讶于一个热情的新人可以对团队产生的作用。
推荐阅读(点击标题可跳转阅读)