Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >项目中的技术债务

项目中的技术债务

原创
作者头像
被删
修改于 2024-07-05 04:02:26
修改于 2024-07-05 04:02:26
6611
举报

身为一名程序员,我们经常会调侃自己每天的工作就是在屎山上拉屎。这里的屎山还有一个更好的名称,叫做技术债务。

技术债务是怎么产生的

我参加过许多不同的项目,而基本上每个项目都会存在或多或少的历史债务。实际上,愿意给到资源去解决历史债务的团队,更是少之又少。

业务功能的快速迭代,往往意味着缺少长期的规划和设计,架构演化和迭代更是无从谈起。我们总会吐槽自己在屎山上拉屎,但许多项目的实际情况是生命周期很短,业务或许还未稳定就已经被淘汰。

这样的情况下,技术债务的产生是必然的,我们写的每一行代码都可能成为历史债务。因为我们的业务在不停地快速试错和迭代,项目也在不断地变更和发展。技术方案没有唯一解,最合适的技术方案想必也会跟随着项目产生变化。

即使我们很幸运地遇到了生命周期较长的项目,也不可避免地在业务快速发展的时候忙于堆叠功能。直到现有架构的维护成本过高,影响到后续功能迭代时,才会想起来需要进行技术变更。

当架构设计需要进行变更、新技术引入时,过往的方案设计很容易就成为了历史债务,这是一个必然过程。

虽然技术债务躲不了,那当技术发生变更的时候,我们可以通过一些方法使其产生更少的债务。

技术方案预研

这些年的前端技术变更十分迅猛,很多人会在项目中引入新技术,来获得更高的开发效率或是更好的性能。除此之外,我还见过许多技术的引入,单纯是为了跟上新的技术栈,或是拿业务代码来做试验。

最糟糕的还是为了汇报引入的技术,我在工作中已经见过无数为了晋级答辩强行造的轮子或是引入新技术。在答辩通过之后,他们往往会继续去攻陷下一个“技术亮点”,留下来大堆大堆的技术债务。当然,这也不能怪留下债务的人,很多时候他们也只是想办法在规则范围内获得更多的利益。

那么,当我们遇到需要引入新的架构设计或是技术的时候,可以进行较深入的技术方案预研,来尽量避免引入更多的技术债务。确保了技术方案的最优化,可以避免开发过程遇到问题需要推翻重做,也可以提前评估预期的效果和引入的技术债务如何解决等问题。

技术预研的话,可以从几个方面考虑起:

  1. 项目现状/痛点分析。
  2. 业界方案调研/方案选型。
  3. 架构可拓展性。

1. 项目现状/痛点分析

在进行技术方案调研的时候,我们需要首先结合自身项目的背景、存在的痛点、现状问题进行分析,只有找到项目的问题在哪里,才可以更准确、彻底地去解决这些问题。

很多人在拿到一个不熟悉的项目时,第一反应经常是重构它。说实话,要把重构这项工作做好,往往是吃力不讨好。对此,个人的建议是可以先开发和维护一段时间,确切知道项目的实际情况后,结合业务未来的规划,再来考虑是否需要进行重构工作,亦或是局部优化。如果说业务已经稳定,且不会再用什么新的功能了,除非是 bug 多到无法解决,否则就不需要投入过多的精力在这里。

项目痛点是什么?直白来说,就是我们每天在吐槽的事情,还有我们认为没有意思的事情,比如:糟糕的历史代码、枯燥又重复的开发工作、历史债务导致的开发效率低下等问题。相比于每天都在吐槽,我们可以动动手花点时间把问题解决,这样每天就可以有更多摸鱼的时间了(不是。

更多情况下,是项目现有的设计,无法支撑后续功能的快速迭代了。

我们可以主动寻找项目存在的问题和痛点,并尝试去解决。不同的项目或是同一个项目的不同时期,关注的技术点都会不一样。对于一个前端项目来说,技术价值常常体现在系统性能、稳定性、可维护性、效率提升等地方,比如:

项目情况

项目特点

关注点

用户量较大的项目

对系统稳定性要求较高

需要关注是否会导致历史功能不兼容、是否会引入新的问题等

大型复杂的项目

涉及多人协作,对系统可维护性要求高

需要避免每次的改动都会导致性能和稳定性的下降,如何提升协作开发的效率等

一次性的活动页面、管理端页面开发

如何提高开发效率

可以使用配置化、脚手架、自动化等手段来提升页面的开发和上线效率

2. 业界方案调研/方案选型

项目的痛点可以转化为一个目标方向,比如:

项目痛点

优化方向

优化措施

加载慢

首屏加载耗时优化

减少首屏代码/异步加载/懒加载等

开发效率低

提升项目自动化程度

配置化/脚本工具/CI、CD 等

多人协作容易出问题

提升系统稳定性

自动测试回归等

有了目标之后,我们就可以进行业界方案调研和选型。

比如说,项目代码已经很庞大了,模块之间调用关系过于凌乱、模块状态的数量过多导致修改和监听复杂等等。那么,这种情况下,我们则需要引入新的技术或是架构设计到项目中,比如使用依赖注入来管理模块间的依赖关系,使用状态管理工具来维护应用各模块以及全局的的状态。

具体到前端页面开发来说,前端状态管理工具也有很多,常见的比如各框架自带的 vuex、redux,以及比较热门的 mobx 等,具体的引入可以结合项目自身的情况比如使用的框架、项目技术栈等来进行选型。

除此之外,有时候我们会遇到一些现有开源工具无法直接在项目中的问题,这种时候我们往往需要“造轮子”,即参考业界成熟的技术方案,结合项目实际情况来调整落地。比如说依赖注入的方案,著名的开源项目中有 Angular 和 VsCode 都实现了依赖注入的框架,但并没有抽离出来直接可用的工具,我们可以通过研究它们的相关代码,分析其中的思路以及实现方式,然后在自己项目中使用。

3. 架构可拓展性

个人认为引入新架构或是新技术时,需要考虑两个很重要的点:

  1. 新架构/技术是否能支持业务的未来规划。
  2. 此次引入是否彻底,是否会留下新的技术债务。

不同的项目或是同一个项目的不同时期,关注的技术点都会不一样。在项目初期,关注重点往往是快速试错与功能迭代;在项目稳定期,项目的维护成本则会逐渐受到重视。

我们在引入新的技术或架构的时候,还需要考虑项目后续的发展规划。比如说我们在给项目引入依赖注入时,假设我们知道项目后续需要支持以应用中内嵌应用的功能,则可以考虑以 SDK 为维度来进行依赖注入,避免后续在同一个应用中存在两个 SDK 时,依赖注入管理混乱。

而技术变更会引入的技术债务问题,则还需要在方案设计的时候进行详细评估。举个例子,架构设计的改造,往往产生极大的工作量,面对这样的工作量是否有有效的解决方案,比如引入自动化流程进行、新增人力支援等。如果该问题无法有很好的解决方案,那么引入新技术必定会带来更多的技术债务,这种情况下就需要仔细衡量这个事情值不值得了。

至于技术方案调研相关,之前有写过一篇更详细的文章:《技术方案的调研和设计过程》,感兴趣的小伙伴也可以看看。

实际上,项目复盘也可以很好地解决剩余技术债务的问题,同时还能避免相同的错误再犯,之前《为什么项目复盘很重要》一文中也有介绍。

结束语

日子怎么过都是过,过得好过得坏也是一天天过,但稍微对自己有点要求和期待,日子可能会一天天变好呢~

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
很认真的看完了,分享超棒的!已三连! 技术债的产生,就好像桌面上的物品,长时间放在那,慢慢的也会布满灰尘。 这时候就需要有人来打扫整理,才能保证焕然一新。 其实很多新技术和新功能,看似很美好,但实际上并不是那么必要。 说不准这只是作者一时兴起的玩具之作,如果没有长期维护,后续的坑,可能还是得自己填。 然后突然脑海冒出一句话: 「与其修正过失,不如避免犯错」——狄仁杰
很认真的看完了,分享超棒的!已三连! 技术债的产生,就好像桌面上的物品,长时间放在那,慢慢的也会布满灰尘。 这时候就需要有人来打扫整理,才能保证焕然一新。 其实很多新技术和新功能,看似很美好,但实际上并不是那么必要。 说不准这只是作者一时兴起的玩具之作,如果没有长期维护,后续的坑,可能还是得自己填。 然后突然脑海冒出一句话: 「与其修正过失,不如避免犯错」——狄仁杰
回复回复1举报
推荐阅读
编辑精选文章
换一批
从「多端重复开发」到「一处写处处跑」,我重构了项目架构
作为一个在前端领域摸爬滚打了八年的老开发,我经历过各种技术栈的迭代,也踩过数不清的坑。但最让我崩溃的,莫过于两年前负责的一个旅游类项目 —— 要同时开发微信小程序、iOS 端和安卓端三个版本,代码重复写了三遍不说,改一个按钮颜色都要同步改三个地方,测试小姐姐天天举着 BUG 单追着我跑。直到接触到 FinClip,我才真正实现了「一处写处处跑」的梦想,今天就来跟大家聊聊这个让我少加了无数班的技术重构过程。
用户11686600
2025/06/11
780
从「多端重复开发」到「一处写处处跑」,我重构了项目架构
技术​选型的艺术---湖北技术价值分享会
各位好,我是A哥(YourBatman)。以下文章来源于softech华山论剑 ,作者徐凌云。
YourBatman
2020/07/21
7020
技术​选型的艺术---湖北技术价值分享会
【超赞】技术架构的战略和战术原则
技术架构,是将产品需求转变为技术实现的过程。技术架构解决的问题包括了如何进行纯技术层面的分层、开发框架选择、语言选择(这里以 JAVA 语言为主)、涉及到各自非功能性需求的技术点(安全、性能、大数据)。技术架构是确定组成应用系统实际运行的技术组件、技术组件之间的关系,以及部署到硬件的策略。
xcbeyond
2021/12/20
3000
【超赞】技术架构的战略和战术原则
我独到的技术见解--技术方案的调研和设计过程
技术方案设计属于架构能力中的一种,当我们开始作为某些功能/应用的 Owner 或是技术负责人来参与项目时,便会面临独立完成技术方案的调研和设计这样的工作内容。
被删
2024/02/05
6861
我独到的技术见解--技术方案的调研和设计过程
我的技术成长血泪史--为什么项目复盘很重要
当开发的个人能力成长到一定程度时,日常工作不再是缝缝补补、修修 bug、打打下手。
被删
2024/02/06
6291
我的技术成长血泪史--为什么项目复盘很重要
📌 深度搜索实战:3天完成原本1个月的代码重构
上个月,我接手了一个日均千万级请求的电商优惠券系统重构。面对5年前遗留的“面条式代码”,团队原计划用传统方法逐步重构,但业务方要求3周内上线新功能——时间成了最大敌人。
Jimaks
2025/04/18
1200
首次公开,最新手机QQ客户端架构的技术演进实践
接上篇《总是被低估,从未被超越,揭秘QQ极致丝滑背后的硬核IM技术优化》,本文则将重点介绍手机 QQ 客户端技术架构升级背后的故事。
JackJiang
2024/05/30
6490
首次公开,最新手机QQ客户端架构的技术演进实践
深度剖析技术债务对项目周期的隐形侵蚀与破解之道:评估技术债务对项目周期的影响
在软件开发的浩瀚宇宙中,技术债务是一个无法忽视的星际尘埃,它悄无声息地积累,却能在不经意间成为阻碍项目前行的巨石。技术债务,这个由Ward Cunningham在1992年提出的比喻,形象地描绘了在软件开发过程中因采取快捷方式或妥协方案而累积的潜在额外工作。本文旨在深度剖析技术债务如何在无形中侵蚀项目周期,探讨其影响机制,并提出行之有效的破解之道,以期为项目管理者和开发者提供一份导航图,助其穿越技术债务的迷雾,确保项目的顺利推进。
Towserliu
2024/06/28
2410
深度剖析技术债务对项目周期的隐形侵蚀与破解之道:评估技术债务对项目周期的影响
如何在金融企业推进故障演练?中国人寿分阶段实践总结
TakinTalks社区专家团成员。拥有多年开发和运维经验,专注高可用领域,目前负责中国人寿混沌工程等多项高可用举措的规划和落地实施,对于构建高可用系统具有深入的理解和实践经验。
TakinTalks稳定性社区
2023/12/04
3280
如何在金融企业推进故障演练?中国人寿分阶段实践总结
《软件工程之美》打卡第四周
最近笔者参加了极客时间的21天打卡行动,从年初开始到年末,21天无间断完成了打卡行动。虽然打卡行动已经结束,但还是不想因此就懈怠了,人一尝点甜头就容易忘乎所以,所以我想继续保持学习的习惯。
巫山老妖
2020/02/18
4330
迭代技术方案设计文档规范
规范在团队管理中的意义无需多言,对于开发团队来说,技术方案的设计和执行无疑是日常工作中很重要的一块。编码一定要在思考清楚之后在开始,以免把问题带入线上,或者反复修改造时间、精力的浪费。
程序员架构进阶
2021/02/17
2.8K0
迭代技术方案设计文档规范
我独到的技术见解--如何设计与管理一个前端项目
如果说基础知识的掌握是起跑线,那么使大家之间拉开差距的更多是前端项目开发经验和技能。对于一个项目来说,从框架选型和搭建,到项目维护、工程化和自动化、多人协作等各个方面,都需要我们在参与项目中不断地思考和改进,积累经验。
被删
2024/02/03
5061
我独到的技术见解--如何设计与管理一个前端项目
现代企业架构框架-技术架构
现代企业架构框架: https://mp.weixin.qq.com/s/SlrEu0_t0slijrNZ6DP4Ng
Ryan-Miao
2022/09/23
9630
现代企业架构框架-技术架构
如何写一篇可实施的技术方案?
在日常开发中,老大经常要求我们给出一个完善并合理的技术方案之后才能进行开发。并且要求技术方案一定要细,要重点覆盖监控、异常处理、灰度、降级方案。同时要注重边界处理。最初,我的技术方案写的很粗,也没有理解老大说的边界处理到底是怎么一回事。于是乎,辛辛苦苦写了一周的方案,就会在技术方案评审的时候直接打回重做,甚至多次打回。 不过还好,在经历过几次大项目的方案设计后,我的方案设计越来越完善,直到最后老大非常认可并在组内进行参考。随着我的方案设计逐渐完善,也逐渐发现,不但编码效率越来越高,编码时思维更加清晰,而且方案中的每一个模块都贯穿了整个软件生命周期。
全栈程序员站长
2022/08/26
3.7K0
如何写一篇可实施的技术方案?
【愚公系列】软考高级-架构设计师 109-软件架构演化原则
软件架构演化原则是指在软件架构设计和演化过程中应该遵循的一些指导性原则和规范,以确保软件系统在不断变化和迭代的过程中保持稳健、可维护和可扩展。
愚公搬代码
2024/08/15
2200
前端工程师,要学会像架构师一样思考
👆点击“博文视点Broadview”,获取更多书讯 透过工程基建,架构有迹可循。 前端开发是一个庞大的体系,纷繁复杂的知识点铸成了一张信息密度极高的图谱。在开发过程中,一行代码就可能使宿主引擎陷入性能瓶颈;团队中的代码量呈几何级数式增长,可能愈发尾大不掉,掣肘业务的发展。这些技术环节,或宏观或微观,都与工程化基建、架构设计息息相关。 如何打造一个顺滑的工程化流程,为研发效率不断助力?如何建设一个稳定可靠的基础设施,为业务产出保驾护航?对于这些问题,我在多年的工作中反复思考、不断实践,如今也有了一些经验和感
博文视点Broadview
2022/08/26
4620
前端工程师,要学会像架构师一样思考
如何解决技术债
基本定义,关于技术债的定义,维基百科的解释是:由于现在选择简单(有限)解决方案而不是使用需要更长时间的更好方法而导致的额外返工的隐含成本。
纵情向前的强仔
2023/11/05
4581
如何写好技术方案
对于开发同学,通过写技术方案,把需求和实现提前梳理一遍,减少等到编码阶段才发现前期考虑不全导致返工的情况;并且写好技术方案再编码,使得编码时思维更加清晰,提高编码效率和质量。
全栈程序员站长
2022/08/31
1.3K0
如何写好技术方案
【愚公系列】《AIGC辅助软件开发》011-AI辅助编写技术文档:技术文档
今日推荐:Go Mongox 开源库设计分享:简化 MongoDB 开发的最佳实践
愚公搬代码
2024/11/29
2020
鹅厂万人热议|如何理解业务系统的复杂性?
👉腾小云导读 业务系统复杂性一直是令开发者头痛的问题。复杂的不是增加一个需求需要耗费多少时间,而是在增加一个需求后带来的蝴蝶效应:其它功能会不会受到影响、要如何去找到这些影响,最终如何实现系统正常运行......功能之间隐秘增加的耦合、不可避免的代码腐化在导致业务复杂性增加。大家都在说的软件开发提效到底在提什么?程序员日常工作中应该如何提升开发效率?敏捷开发、瀑布流式开发孰是孰非?欢迎阅读。 👉看目录,点收藏 1 业务背景与目标 2 软件开发提效 3 业务系统复杂的根本原因     3.1 功能之间隐蔽增加
腾讯云开发者
2023/04/26
13.2K1
鹅厂万人热议|如何理解业务系统的复杂性?
推荐阅读
相关推荐
从「多端重复开发」到「一处写处处跑」,我重构了项目架构
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档