跳至主要内容

工程里的抽象是什么意思:好的抽象降低理解成本,坏的抽象隐藏问题

工程里的抽象是什么意思:好的抽象降低理解成本,坏的抽象隐藏问题

摘要

工程里的抽象,不是把代码写得更高级,也不是制造更多层级。好的抽象会把稳定的规则提出来,让人少关心重复细节;坏的抽象则把真正重要的差异藏起来,让问题更难定位。判断一个抽象是否有价值,关键不在它看起来是否优雅,而在它是否降低理解成本、修改成本和协作成本。

抽象到底在抽掉什么

抽象这个词容易被说得很玄。放到工程里,它其实很朴素:把一组相似问题背后的共同部分提出来,让使用者不用每次都面对全部细节。

例如,一个支付流程可能涉及订单、库存、优惠、风控、通知和对账。抽象不是把这些复杂性抹掉,而是把稳定的接口和不稳定的实现分开。调用者只需要知道如何发起支付、如何接收结果,底层实现可以继续演进。

抽象抽掉的不是现实复杂性,而是调用者暂时不必关心的细节。

好抽象让变化有位置

工程系统一定会变化。需求会变,依赖会变,规模会变,团队也会变。好抽象的价值,是让变化有一个比较清楚的位置。

如果每次改一个规则,都要在十几个地方找相似代码,说明抽象不足。如果一个规则变化只需要修改一个清楚的模块,其他地方仍然保持稳定,说明抽象开始发挥作用。

所以抽象不是为了让代码看起来简洁,而是为了让未来的变化不至于到处扩散。

坏抽象会隐藏真正差异

坏抽象最常见的问题,是把表面相似的东西强行合并。

两个流程都叫“审批”,但一个是财务审批,一个是内容审核。它们的状态、风险、权限和失败处理可能完全不同。如果只因为名字相似就抽成同一个通用审批模块,后面每加一个需求都要塞参数、加分支、绕逻辑。

这样的抽象表面上减少了重复,实际上增加了理解成本。因为人必须先理解那个“通用层”到底如何兼容各种例外,才能处理一个具体问题。

不要过早抽象

很多工程师喜欢在第二次看到相似代码时就抽象。但两段代码相似,并不代表它们会以同样方式变化。

更稳的做法,是先允许少量重复,观察变化方向。等你看清楚哪些部分稳定、哪些部分经常变化,再抽象会更可靠。

过早抽象的问题在于,它把尚未理解的差异提前固定下来。后续需求一来,代码就开始反复绕过自己创建的结构。

一个实用判断:删掉抽象会怎样

判断一个抽象是否有价值,可以做一个简单实验:如果把这个抽象删掉,系统会更清楚还是更混乱?

如果删掉后只是多了几行重复代码,但业务含义更明显,说明原来的抽象可能并不值得。如果删掉后规则散落各处、修改成本显著上升,说明这个抽象确实承担了职责。

抽象的价值不能只看代码行数。减少代码行数有时是好事,有时只是把复杂性压进了更难理解的地方。

抽象也需要命名

好的抽象离不开好的命名。一个名字如果不能让人理解它代表的边界,抽象就会变成迷宫入口。

比如 `Manager`、`Helper`、`CommonUtil` 这类名字,往往意味着职责还没有说清楚。它们什么都能装,最后就什么都不好理解。

命名不是表面功夫。命名是在回答:这个东西负责什么,不负责什么,别人应该怎样使用它。

产品和工程都需要抽象能力

抽象不只属于代码。产品设计也需要抽象。

把用户需求整理成场景,把复杂流程整理成状态,把多个功能背后的共同任务识别出来,本质上也是抽象。一个产品如果没有抽象能力,就会不断堆功能;一个系统如果没有抽象能力,就会不断堆特殊情况。

好的抽象让团队不只是解决眼前问题,还能看见一类问题。

结论

工程里的抽象,是为了让复杂性被放在合适的位置。它不是越多越好,也不是越早越好。好的抽象让变化更可控,让协作更清楚;坏的抽象则把差异藏起来,制造新的理解成本。真正成熟的工程判断,是知道什么时候抽象,也知道什么时候保留具体。

延伸阅读

评论

此博客中的热门博文

尝试解构一段幽默

  天龙八部里有这么一段情节: 乌老大脸上肌肉牵搐,又“啊啊”了几声,突然指着虚竹骂道:“臭贼秃,瘟和尚,你十八代祖宗男的都是乌龟,女的都是娼妓,你日后绝子绝孙,生下儿子没屁股,生下女儿来三条胳臂四条腿……”越骂越奇,口沫横飞,当真愤怒已极,骂到后来牵动伤口,太过疼痛,这才住口。 虚竹叹道:“我是和尚,自然绝子绝孙,既然绝子绝孙了,有什么没屁股没胳臂的?”

《微信公开课》上张小龙的公开演讲

 微信是一款现象级的互联网产品,至少以互联网产品普遍的生命周期看来,微信是一款跨越了生命周期的互联网产品。要想理解微信在产品实践的一些观念,最好的方法莫过于直接和他们对话,阅读他们的书就是一种最直接的精神交流。 前几年流传着一本奇书《微信背后的产品观》,互联网产品从业者都给出了极高的评价,书里的内容大致上来自于 2012 年微信团队内部的一次分享会。而在现在,微信依然是一个具有生命力和健康生态的互联网产品,我们又该用什么方式来继续更新对微信的认识呢? 我的方法是:从微信张小龙过去几年的公开课中学习微信的产品观

你日常爱用的词语,竟有这么多在压抑自我!为什么“夹带私货”是一种很愚蠢的说法?所谓“精致利己主义者”其实很粗糙|心理|哲学|历史|自我成长