技术项目失败的原因:管理、规划、流程

2025-06-10

技术项目失败的原因:管理、规划、流程

技术项目总是会失败,或者产出低于预期。例如,产品能用,但代码却很糟糕。作为开发者,我们都经历过类似的项目,或者不得不整理它们,这有时会令人沮丧。因此,了解技术项目失败的原因至关重要,这样我们才能减少失败的发生。希望我们能够让开发成为一项更令人愉悦的活动和工作。

作为开发人员,当我们讨论项目失败时,通常指的是代码质量。低质量代码有四个特点:

  • 写得不好
  • 没有文档
  • 越野车
  • 未能满足业务要求

许多开发人员认为代码质量与原则和测试息息相关。这合乎逻辑,因为不遵循原则或编写测试的开发人员会编写出质量低劣、漏洞百出的代码。然而,代码原则和测试虽然重要,却不会导致项目失败或直接降低代码质量。它们只是表象,而非根本原因。它们的缺失凸显了项目失败,但并不能解释其原因。

项目失败有三个原因:

MPP

  • 管理
  • 规划
  • 过程

管理

管理和管理人员是项目失败的根源。项目中所有可能出错的地方都源于管理。

如上所述,糟糕的代码的产生是因为开发人员不编写测试或不遵循代码原则。但开发人员不遵循代码原则或编写测试的原因,其实是经验或时间问题。

经验和时间的定义都由管理者决定。管理者负责招聘开发人员,如果他们只聘用缺乏经验的开发人员,事情很快就会出错。缺乏经验的开发人员通常能够完成产品,但他们并不总是能够理解原则、测试和文档的重要性。而且,他们常常难以接受反馈,难以向管理层指出自己的错误。在缺乏经验的环境中,代码质量只会受到影响,最终导致项目失败。

缺乏经验的开发人员本身没什么问题,我曾经很长一段时间都是这样。然而,缺乏经验的开发人员需要支持,并且必须分配合适的工作。他们不应该承担太多责任,而且必须得到指导。理想情况下,指导人员应该能够解释测试、原则、文档以及对细节的关注的价值。

时间是管理人员面临的另一个难题,它源于复杂性。项目越复杂,所需的时间就越多。管理人员往往无法理解项目的复杂性,因此设定了不切实际或不合理的时间表。这给他们带来了过大的压力,而开发人员在压力之下往往会跳过测试和原则。这必然会导致糟糕的代码和错误。

管理人员的行为与代码质量和项目失败密切相关。如果管理人员做出错误的决策,代码质量就会下降,项目就会失败。如果管理人员想要避免项目失败,他们需要为项目聘请合适的团队。他们还需要了解项目的复杂性,以便制定切实可行的时间表,而这需要规划。

规划

规划有四个目标:

  • 了解项目的复杂性
  • 突出显示已知的未知数
  • 尽量减少未知的未知数
  • 定义优先级。

许多组织未能充分规划,有些甚至拒绝规划。他们看不到规划的价值,或者认为他们的项目很简单,可以“直接开始工作”。在我的职业生涯中,我只在一家组织工作过,他们做了适当的规划。考虑到我从事专业编程工作十多年,这真是非同寻常。而且,这意味着我的职业生涯充满了失败和低质量的代码。

规划至关重要,每个项目和任务,无论大小,都需要规划。作为一名经理和开发人员,理所当然地认为项目或任务比看起来更复杂。大多数任务,如果考虑到测试、编码、文档编制、评审和部署,至少需要两到三天才能完成。如果你以小时为单位来安排时间,那么你可能没有充分考虑复杂性。

那么,规划是什么样的呢?它可以有多种形式,但正如前文所述,其主要目的是理解复杂性。

这可以通过与客户坐在一起撰写一些用户故事来实现。明确他们希望用户实现的目标以及原因。或者,您可以聘请业务分析师和用户体验专家来了解并记录客户的业务和用户需求。需要注意的是,用户体验专家是研究用户行为的人,而不是仅仅绘制站点地图和线框图的人。

还有行为驱动开发 (BDD)。Ciaran McNulty多年来一直在 PHP 社区推广BDD 原则。在他最近的 PHP 伦敦大会演讲中,他强调了示例映射的好处,该映射旨在通过编写需求、规则和示例来理解项目的复杂性。

示例要求可能是:

Shop A has a user loyalty scheme.

For each dollar spent by a user the user receives one loyalty point.
Enter fullscreen mode Exit fullscreen mode

表面上看,这项要求似乎很简单。一美元等于一个忠诚度积分。但还有一些问题需要解答,或者需要定义一些规则,比如,税收怎么办?

这里有一个例子可以提供帮助:

User 1 purchases Product A.

Product A costs $10 and there is 20% tax.

Product A's total cost is $12.

User 1 receives 10 loyalty points.
Enter fullscreen mode Exit fullscreen mode

通过一个例子,忠诚度方案的复杂性更加清晰。用户只会根据产品价格获得忠诚度积分,而不是税费。现在想象一下,一个大项目有数百个示例。突然间,这个项目变得更容易理解,需要做的事情也更清晰,也更易于测试。未知的未知数也大大减少。

如果你还没读过《行为驱动开发》,我建议你读一读。即使你不会用,其背后的原理也能帮助你成为更优秀的开发者或管理者。

在开始编码之前,还必须明确项目的优先级。如果数据输入是系统中最重要的部分,那么就不要从构建通知系统开始。

优先级必须基于证据,而不是一时兴起。仅仅因为CEO或经理认为某件事很重要,并不意味着它真的重要。优先级应该基于用户反馈、用户研究或财务状况。如果你因为复杂的结账流程而损失了20%的购买量,那么在实施CEO的品牌重塑计划之前,一定要解决这个问题。

优先级也会随着时间和新信息的变化而变化。因此,必须对其进行跟踪,并将其融入到每个功能的规划中。如果您没有基于证据的清晰优先级列表,那么您将无法交付所需的功能。

规划对于项目成功至关重要。开发人员需要绝对清晰地了解他们需要开发什么。如果没有清晰的计划、明确的优先级和需求,他们就无法满足所有业务需求。没有计划,代码质量也会受到影响。如果开发人员不得不随着新需求或优先级的出现而不断修改代码,那么“黑客攻击”就会开始。结果,测试和原则就会被抛诸脑后,质量下降,项目最终会失败。

过程

流程是一个优秀技术项目的最终环节,就像蛋糕上的樱桃一样。在讨论流程时,我们必须承认代码只是流程的一个方面,而且并非最重要的方面。如果你的流程看起来像“编写代码”、“部署代码”,那一定是出了什么大问题。

技术流程有三个目标:

  • 确保质量
  • 尽量减少错误
  • 避免延误

一个简单的技术流程可能如下所示:

  • 冲刺计划
  • 代码
  • 代码审查
  • 错误修复
  • 质量保证
  • 错误修复
  • 部署
  • 健全性检查

你可以添加更多步骤,例如文档编写和自动化测试。但重点是,“代码”只是多步骤流程的一部分。最重要的部分是测试和审查。你必须假设存在错误,无论开发人员多么经验丰富,计划多么周全。因此,必须有步骤来捕获和修复错误。

良好流程的另一个方面是沟通。团队成员之间必须有清晰的沟通渠道。能够快速沟通问题或阻碍尤其重要。对我来说,沟通方式是每天五到十分钟的站立会议,对其他人来说,可能是Slack频道。问题需要快速暴露,因为这样可以最大限度地减少延误,从而重新分配资源并调整优先级。

最后,团队合作至关重要。开发人员绝不能孤军奋战。每项工作都应该由多名开发人员共同审核。代码审查可以涵盖部分内容,但重要的是开发人员应该共同规划和讨论他们的工作。这将有助于更快地解决问题。这也能减轻压力,因为没有一个开发人员会觉得自己独自负责一项工作。

如果您还没有明确定义的流程,那么Joel 测试是一个很好的起点。它由Joel Spolsky于 2000 年编写,定义了优秀开发团队和流程的 12 个方面。您可能不完全认同其中的内容,但其中很多内容都是宝贵的建议,即使在近 20 年后仍然适用。用它来评估您团队目前的状况,并以此指导您的进步。获得满分可能很困难,但只要您在两到三个方面有所改进,您就能感受到益处。

如果没有流程,代码质量就会受到影响。开发人员将独立工作,编写质量参差不齐的代码,并且大量错误会潜入生产环境。这种影响可能非常严重,甚至可能导致项目彻底失败,因此,实施一个结构良好的流程至关重要。

预算神话

科技界有些人会认为,MPP 不可能实现。他们通常会说,预算不足,因此没有足够的时间进行适当的管理、规划和流程。

“我们只需要继续工作……”

这是软件开发中最大的误区之一。而且,那些持有这种观点的人也暴露了他们对“技术商业”的无知。

事实上,每个技术项目都有一个“总成本”,与交付该项目的团队相关。完全交付一个项目需要一定的开发时间。完全交付意味着所有业务需求都得到满足,并且项目没有错误。

最终,全部成本总会得到满足。唯一的问题是,全部成本是在发布前还是发布后由谁来承担。发布到生产环境中的错误必须得到修复,而所有者、客户或供应商需要承担这些成本。

在发布前可以走捷径,但发布后成本会开始螺旋式上升,并导致额外成本。发布后修复错误的成本会显著增加。通常,由于这些错误不在预算之内,可能需要进行结构性修改,拖慢其他工作进度,并需要增强测试。缺乏文档意味着开发人员需要更长的时间来理解现有代码。这会降低速度,并增加错误修复和系统扩展的成本。未完全满足的业务需求可能会降低其他团队的效率,从而推高业务其他部门的成本。最后一点可能会对企业造成重大的、无法追踪的财务影响。

举个例子,我曾为一位客户设计了一个数据仓库和可视化系统。我预计一个由三名开发人员和一名兼职项目经理组成的团队大约需要六个月的时间才能交付第一个版本。客户对这个报价并不满意,于是把我的设计方案交给了一家公司,对方承诺将在八周内交付项目。

项目启动六个月后,仍未完全交付。此外,为了节省时间,参与的开发人员决定将可视化工具直接连接到 MongoDB。在我的计划中,MongoDB 是数据转换管道的一部分。作为一个临时数据存储,数据可视化工具从未打算连接到它。这种捷径节省了时间,但这意味着数据分析师没有标准化且结构良好的数据集可用于可视化工具。数据仓库对他们来说几乎毫无用处,他们无法完成工作,于是开始寻找替代方案。

在这种情况下,客户决定采用便宜的报价,而不是实际报价。结果,项目超出了预期,导致数据团队的业务效率低下。而这个项目原本旨在帮助这个团队。最终,这个项目的全部成本将由供应商承担,而我最初的报价很可能会大幅超出。甚至有可能,项目会被搁置,造成巨大的资金浪费。

现实情况是,如果一个项目的成本是10万美元,你最终也得支付10万美元才能完成。如果你试图偷工减料,只花5万美元,那么随着成本的累积,最终很可能花费超过10万美元。削减预算的唯一方法是减少需求数量,直到工作能够在预算范围内完全完成。

管理、规划和流程对于任何技术项目的良好运行都至关重要。没有它们,代码质量就会下降,项目就会失败。它们也与项目的财务状况密切相关,如果它们不合理或被忽视,成本就会螺旋式上升。作为开发人员,我们需要先关注MPP,确保其正确无误,然后再考虑代码。没有良好的管理、规划和流程,就不可能编写出优秀的代码并生产出优秀的产品,而这正是所有开发人员梦寐以求的。

鏂囩珷鏉ユ簮锛�https://dev.to/robdwaller/why-tech-projects-fail-management-planning-process-hmg
PREV
为什么开发人员的面试是世界上最艰难的?
NEXT
如何使用 PHP 创建 JSON Web Token