程序员怎样才能懂业务?

0 阅读29分钟

从大概十几年前开始,就经常听到一句话,就是"程序员不能光懂技术,要懂业务"。无论是老板还是程序员自己,都天天把这句话挂在嘴边。尤其是现在到了AI可以生成高质量代码的时代,"懂业务"似乎更成了程序员保住饭碗的护身符。但到底怎样才能算是"懂业务"?却几乎没见有人正经讨论过。于是,就感觉"懂业务"这件事成了玄学,说的越多就越空洞,甚至听得我都反胃了。

于是,我便想按照自己的工作经历和理解,结合软件工程,尤其是领域驱动设计(DDD),来写一下关于"懂业务"这件事的个人理解。

明确业务的分类

懂业务的第一步,是要知道在一个公司中,业务存在多种类型,而且并非所有业务都同等重要。分类的目的很简单:搞清楚什么事情需要自己做,什么事情不需要自己做,如果需要自己做,那又需要做到什么程度。

这听起来简单,但现实中很多团队恰恰在这一点上犯错。很多团队在非核心业务上投入过多,却在真正的核心业务上投入不足。他们以为这样做节省了成本,或者是彰显了“技术氛围”,实际上却是把宝贵的时间和精力浪费在了不该自己做的事情上。

在DDD中,Eric Evans将业务领域分为三类,这个分类正是为了帮助我们做出正确的投入决策。

核心领域

核心领域是企业的核心竞争力所在,是真正能让公司在市场上脱颖而出的部分。比如对于电商平台来说,推荐算法、定价策略可能是核心领域;对于金融系统来说,风控模型、交易撮合引擎是核心领域。

这是必须自己做,而且要做到极致的部分。

程序员"懂业务"最重要的就是懂核心领域。这不仅仅是知道功能怎么实现,而是要理解:

  • 为什么要这样设计?
  • 这个设计解决了什么业务问题?
  • 有没有更好的方案?
  • 这个功能对业务指标有什么影响?

核心领域往往需要投入最多的精力去建模、去优化、去创新。这里的代码质量、架构设计、性能优化都直接影响公司的竞争力。在这里省时间、省精力,就是在削弱自己的竞争力。

通用领域

通用领域是那些所有公司都需要,但不构成竞争优势的部分。比如用户认证、权限管理、日志系统等。这些功能很重要,但做得再好也不会让你的产品比竞争对手更有优势。

这是不需要自己做,或者只需要做到"够用"的部分。

对于通用领域,"懂业务"的体现是知道什么时候该用现成的方案。不要重复造轮子,用成熟的开源框架或第三方服务往往是更明智的选择。把时间和精力省下来,投入到核心领域。

支撑领域

支撑领域介于核心和通用之间,是为了支撑核心业务而存在的。比如内部的工单系统、客服管理系统、数据报表系统、审批流程系统等。这些系统对业务运作很重要,但不是核心竞争力。

这是需要自己做,但要控制投入程度的部分。

支撑领域的一个重要特征是:往往可以通过外包或者在现有软件的基础上二次开发。比如很多公司的内部管理系统,可以基于钉钉、飞书等平台进行定制开发,而不需要从零开始。

对支撑领域的理解,体现在能够把它做得"刚刚好"——既不过度设计浪费资源,也不敷衍了事影响核心业务。要知道哪些地方可以简化,哪些地方必须严谨。

关键是要识别出:这个系统是不是可以用现成的方案加上适当的定制来解决?如果答案是肯定的,那就不要投入太多资源去自研。把精力留给真正的核心领域。

创建领域模型

真正"懂业务"的标志,是能够将业务概念转化为清晰的领域模型。但这个过程远比很多人想象的要复杂,它不是简单的数据库表设计,也不是程序员关起门来就能完成的。

明确谁是领域专家

创建领域模型的第一步,是找到真正的领域专家。这听起来简单,但实际上很多项目在这一步就走偏了。

领域专家不一定是产品经理和项目经理,也不一定是老板。真正的领域专家是那些深入理解业务运作、知道各种边界情况、能够解释"为什么要这样做"的人。可能是一线的业务人员、资深的运营、甚至是客服主管。

找错了领域专家,后面的所有工作都会建立在错误的理解之上。所以在开始建模之前,先问问自己:我在和谁讨论业务?他们真的了解这个领域吗?

将隐性知识显性化

领域专家脑子里有大量的知识,但这些知识往往是隐性的——他们知道怎么做,但说不清楚为什么这样做,也很难系统地表达出来。

程序员的重要工作之一,就是通过提问、观察、讨论,把这些隐性知识挖掘出来,并将其概念化。比如:

  • 领域专家说"这个订单需要审核",你要问:"什么样的订单需要审核?审核的标准是什么?谁来审核?审核不通过怎么办?"
  • 领域专家说"这个价格是动态的",你要问:"动态是怎么动态的?基于什么因素?多久更新一次?有没有上下限?"

通过这样的追问,你会发现很多业务规则其实是有明确逻辑的,只是领域专家习以为常,没有明确表达出来。把这些规则提炼成清晰的概念,就是领域建模的基础。

通过场景让概念互动

光有概念还不够,还要让这些概念在实际场景中互动起来。这就是DDD强调的"场景驱动"(Scenario-Driven)。

不要问"订单有哪些属性",而要问"用户下单的完整流程是什么"。在这个流程中,你会看到订单、商品、库存、支付、物流等概念是如何互动的,它们之间的关系是什么,哪些操作会触发哪些变化。

通过场景来建模,能够避免设计出一堆孤立的数据结构,好的领域模型应该能够非常自然地表达业务流程。

快速落实到原型

过去,将领域模型落实到可运行的原型是一件很费时的事情。但现在有了AI辅助编程,这个过程可以大大加速。

你可以和领域专家讨论完一个概念后,立即用AI生成一个简单的原型,包括基本的数据结构、业务逻辑、简单的界面。然后让领域专家实际操作这个原型,看看是不是符合他们的预期。

这种快速反馈循环非常重要。因为很多时候,你们在口头上达成了共识,但面对实际的原型时,却发现理解完全不一样。领域专家可能会说:"哦不对,我说的不是这个意思",或者"这里还缺了一个步骤"。

原型不需要完美,甚至可以很粗糙,但它必须能够让领域专家"看到"和"摸到"你们讨论的概念。这比任何文档都更有效。

反复沟通确认

创建领域模型不是一次性的工作,而是一个反复迭代的过程。你需要和领域专家保持持续的沟通,原因有几个:

口头共识与实际理解的差异:就像前面说的,你以为你们达成了共识,但实际上可能理解完全不同。只有通过原型、通过实际的代码,才能暴露这些差异。

知识的渐进式释放:领域专家不会一次就把脑袋里的知识全讲出来。他们会先讲主流程,然后在你追问或者展示原型时,才会想起来"哦对了,还有这种情况"。这是正常的,因为人的记忆和表达本来就是这样工作的。

未曾思考过的逻辑:很多逻辑领域专家自己也没有想过,尤其是各种异常路径的处理。比如"如果用户支付成功但是库存不足怎么办?""如果物流信息一直没有更新怎么办?"这些问题可能在实际业务中很少发生,领域专家从来没有系统地思考过,需要你们一起讨论出合理的处理方案。

所以,不要期望一次讨论就能搞定领域模型。保持开放的心态,随时准备调整和重构。

划分上下文边界——真正展现设计功底的时刻

如果说前面的工作是"理解业务",那么划分上下文边界(Bounded Context)就是"设计业务"。这是DDD中最难也最重要的部分,也是真正体现程序员设计功底的地方。

业务的混沌与软件的秩序

多数时候,业务的上下文边界都是混为一团的。领域专家会说"订单",但在不同的场景下,"订单"的含义可能完全不同:

  • 在下单场景中,订单关注的是商品、价格、优惠券
  • 在支付场景中,订单关注的是支付方式、支付状态、交易流水
  • 在物流场景中,订单关注的是收货地址、配送方式、物流状态
  • 在售后场景中,订单关注的是退款原因、退货流程、客服记录

如果把这些都塞进一个"订单"对象,你会得到一个巨大的、职责不清的上帝类。但要落实到软件的业务逻辑中,必须是井井有条的模块。这就需要划分上下文边界,在不同的上下文中,"订单"可能是不同的模型。

影响上下文边界的多重因素

划分上下文边界不是纯粹的技术问题,而是需要平衡多种因素:

  • 逻辑因素:哪些概念在逻辑上是紧密相关的?哪些是相对独立的?
  • 变化频率:哪些部分经常变化?哪些部分相对稳定?变化频繁的部分应该隔离开来。
  • 团队组织:不同的团队负责不同的业务模块,上下文边界最好和团队边界对齐,否则会带来大量的沟通成本。
  • 技术约束:有些部分可能需要特殊的技术方案(比如高并发、实时性),这也会影响上下文的划分。

关键是要平衡这些因素,并始终聚焦于要解决的最终问题。不要为了"完美的设计"而过度拆分,也不要为了"简单"而把所有东西混在一起。

上下文的粒度(高内聚)

上下文的粒度是一个难题。太粗,职责不清,难以维护;太细,交互复杂,增加系统复杂度。

一个好的上下文应该是职责单一的——它解决一个明确的业务问题,有清晰的边界。但同时又不能过细,不能为了"单一职责"而把一个完整的业务流程拆得支离破碎。

上下文之间的交互(低耦合)

划分了上下文之后,它们之间必然需要交互。如何设计这些交互,决定了系统的耦合度和可维护性。

取得共识:不同上下文对同一个概念可能有不同的理解。比如"用户"在账户上下文中可能只是用户名和密码,在订单上下文中可能包括收货地址和联系方式。这些差异是正常的,关键是要明确各自的定义,避免混淆。

降低耦合:上下文之间的耦合应该降低到最小。关键是彼此不需要了解对方的内部运作,只通过明确的公开接口进行访问。

一个上下文不应该知道另一个上下文内部是如何实现的,不应该依赖对方的数据结构、业务规则或实现细节。它只需要知道"我调用这个接口,会得到什么结果"。

比如订单上下文需要查询库存,它不需要知道库存是存在数据库里还是缓存里,不需要知道库存的计算逻辑,只需要调用库存上下文提供的"查询可用库存"接口。当库存上下文内部重构时,只要接口契约不变,订单上下文完全不受影响。

这种通过明确接口隔离内部实现的方式,才是真正降低耦合的关键。至于通信方式是同步调用、异步消息还是事件驱动,那是另一个层面的技术选择,不是耦合度的决定因素。

考虑未来变化:业务是会变化的,今天的设计可能明天就不适用了。在设计上下文交互时,要考虑未来可能的变化,留出扩展空间。比如今天只有一个支付方式,但未来可能有多个,那么支付上下文的接口就应该设计得足够抽象。

依赖抽象而非具体:这是软件设计的基本原则,在上下文交互中尤其重要。不要让一个上下文依赖另一个上下文的具体实现,而是依赖抽象的接口或契约。这样当某个上下文需要重构或替换时,不会影响到其他上下文。

通过抽象简化问题

好的领域模型不仅仅是对现实的映射,更重要的是通过抽象来简化问题。这方面最经典的例子就是Unix的设计哲学。

将不同的问题归结为同一个概念

Unix的精髓在于"一切皆是文件"。无论是普通文件、目录、设备、网络连接,还是进程间通信,在Unix中都被抽象为"文件"这个统一的概念。这意味着你可以用同样的接口(open、read、write、close)来操作所有这些看似不同的东西。

这种抽象的威力在于:它把无数个具体的问题简化为一个统一的问题。程序员不需要学习十几种不同的API,只需要掌握文件操作这一套接口,就能处理各种场景。

在领域建模中,同样需要这种抽象能力。很多看起来是不同的业务场景,但如果你能抽象出统一的概念,那么很多逻辑就可以复用,系统也会变得更简洁。

关键是要找到那个"本质"——什么是这些看似不同的场景背后共同的东西?这需要深入理解业务,也需要抽象思维能力。

设计可组合的架构

Unix的另一个经典设计是管道(Pipeline)。每个程序只做一件事,但做到极致,然后通过管道把它们组合起来,就能完成复杂的任务。比如:

cat access.log | grep "error" | wc -l

三个简单的程序组合在一起,就能统计日志中错误的数量。这种可组合性让系统既简单又强大。

在领域建模中,同样要追求这种可组合性。不要设计一个巨大的、包罗万象的对象,而是设计一些职责单一、边界清晰的小对象,然后让它们可以灵活组合。

比如在订单处理中,你可以设计:

  • 价格计算器(只负责计算价格)
  • 库存检查器(只负责检查库存)
  • 优惠券验证器(只负责验证优惠券)
  • 订单创建器(组合上面的组件来创建订单)

每个组件都很简单,但组合起来就能处理复杂的业务逻辑。而且当需求变化时,你只需要替换或调整某个组件,而不是重写整个系统。

这种可组合的架构,本质上就是DDD中强调的"聚合"和"值对象"的思想——小而专注的组件,通过清晰的接口组合在一起。

统一语言的落地

领域模型不是程序员自己玩的游戏,它必须落实到整个团队,成为大家共同的语言。这就是DDD中强调的"统一语言"(Ubiquitous Language)。

文档化领域模型

一旦领域模型与领域专家达成共识,就要立即文档化。这个文档不需要很复杂,但必须清晰地定义:

  • 核心概念是什么?
  • 每个概念的含义是什么?
  • 概念之间的关系是什么?
  • 关键的业务规则是什么?

这个文档应该是活的,随着理解的深入不断更新。它不是为了应付检查,而是为了让团队成员(包括新加入的成员)能够快速理解业务。

在所有讨论中使用统一语言

更重要的是,在日常工作中,所有人都要使用这套统一的语言:

  • 产品经理写需求时,用领域模型中的概念
  • 程序员讨论技术方案时,用领域模型中的概念
  • 测试人员写测试用例时,用领域模型中的概念
  • 开会讨论问题时,用领域模型中的概念

不要出现这种情况:产品经理说"订单",程序员理解成"Order对象",运营说的是"工单",结果大家说的根本不是一回事。

统一语言的好处是显而易见的:

  • 减少沟通成本:大家说的是同一种语言,不需要反复解释
  • 避免歧义:每个概念都有明确的定义,不会产生误解
  • 保持代码和业务的一致性:代码中的类名、方法名直接来自业务术语,业务人员看代码也能大致理解

统一语言的建立和维护需要持续的努力,但这是让团队真正"懂业务"的关键。当整个团队都在用同一种语言思考和交流时,效率会大大提升,错误也会大大减少。


创建领域模型是一个复杂的、需要反复迭代的过程。它需要程序员具备技术能力、沟通能力、抽象思维能力,以及对业务的深入理解。但正是这个过程,让程序员真正"懂业务",也让软件能够真正反映业务的本质。

平衡功能性需求和非功能性需求

前面讨论的创建领域模型、划分上下文边界、统一语言等,主要都是围绕功能性需求——也就是"系统要做什么"。在这些问题上,程序员可以和业务领域专家讨论、协作,共同找到最佳方案。

但软件系统除了功能需求,还有大量的非功能性需求——性能、可用性、安全性、可扩展性等等。这些需求往往需要程序员独自面对和决策,因为业务领域专家通常不具备这方面的专业知识。

这时候要认识到一个重要的事实:程序员本身也是领域专家,是计算机科学和软件工程的领域专家。

懂业务不是要程序员放弃技术,变成"业务专家",而是要有机地结合两个领域:业务领域和技术领域。只有这样,才能设计出既满足业务需求,又具备良好技术特性的系统。

程序员需要独自判断的非功能性需求

性能要求:业务人员可能会说"要快",但多快才算快?交易系统的下单接口可能要求毫秒级响应,而后台报表查询慢几秒可能完全可以接受。这需要程序员根据业务场景、用户体验、技术成本来综合判断。

更重要的是,程序员要主动识别性能瓶颈。当业务人员提出"查询用户的所有订单"时,他们可能没有意识到一个用户可能有几万条订单。程序员需要预见到这个问题,并提出分页、索引、缓存等技术方案。

可用性要求:支付系统可能要求99.99%的可用性,但内部管理系统偶尔宕机几分钟可能影响不大。不同的可用性要求意味着完全不同的架构设计和运维成本。

程序员需要根据业务的重要性、影响范围、容错能力来判断:这个系统需要多高的可用性?是否需要做主备切换?是否需要异地多活?这些都是技术决策。

一致性要求:有些业务必须强一致(比如账户余额),有些业务可以最终一致(比如评论数)。业务人员可能只会说"数据要准确",但程序员需要判断:什么时候可以用异步、什么时候必须同步,什么时候可以接受短暂的数据不一致。

这需要深入理解分布式系统的CAP理论、事务的ACID特性等技术知识,同时也要理解业务对一致性的真实需求。

扩展性要求:有些功能未来会频繁变化,需要设计得灵活可扩展;有些功能可能几年都不会改,简单实现就好。过度设计和设计不足都是问题。

程序员需要根据业务的发展趋势、变化频率、技术债务的成本来判断:这里需要多大的扩展性?是否需要引入插件机制?是否需要做配置化?

安全性要求:业务人员可能会说"要保证安全",但具体怎么保证?需要什么级别的加密?如何防止SQL注入、XSS攻击?如何设计权限系统?这些都需要程序员的专业判断。

两个领域的有机结合

真正懂业务的程序员,能够在业务领域和技术领域之间自如切换,找到最佳的平衡点:

  • 当业务需求和技术约束冲突时,能够提出折中方案,或者用技术手段突破约束
  • 当技术方案有多种选择时,能够根据业务优先级做出决策
  • 当业务人员提出不合理的需求时,能够用技术视角指出问题,并提供替代方案
  • 当技术架构需要调整时,能够评估对业务的影响,选择合适的时机

这种结合不是简单的"我懂一点业务,也懂一点技术",而是能够用技术思维去理解业务,用业务思维去指导技术。

比如,当你理解了电商的核心是"提高转化率"这个业务目标后,你就知道首页的加载速度、推荐算法的准确性、支付流程的流畅性都是关键的技术指标。你会主动去优化这些地方,而不是等业务人员来提需求。

再比如,当你设计一个促销系统时,你不仅要实现"满减"、"折扣"这些功能,还要考虑:高并发下如何保证库存不超卖?如何防止恶意刷单?如何设计才能快速支持新的促销类型?这些都需要技术领域的专业知识。

所以,懂业务的程序员,实际上是在两个领域都具备专业能力,并且能够将它们有机结合的人。这才是程序员真正的价值所在。

发挥主动性

主动发现问题

被动地接需求、写代码,永远不可能真正懂业务。懂业务的程序员会主动发现问题,甚至在产品经理提需求之前就能预见到潜在的问题。

发现业务逻辑的矛盾:当产品经理说"用户可以无限次退款"时,懂业务的程序员会问:"如果有人恶意刷退款怎么办?"这不是抬杠,而是帮助完善业务规则。

发现性能瓶颈:当看到"查询用户的所有订单"这个需求时,懂业务的程序员会问:"一个用户最多可能有多少订单?"如果可能有几万条,就要考虑分页、索引、缓存等方案。

发现数据一致性问题:当涉及多个系统的数据同步时,懂业务的程序员会主动考虑:"如果同步失败怎么办?如何保证数据最终一致?"

发现边界情况:业务人员往往只描述正常流程,但懂业务的程序员会主动思考各种异常情况:网络超时、并发冲突、数据异常等。

主动发现问题的能力,来自于对业务的深入理解和对技术的敏感度。这是"懂业务"的高级阶段,也是程序员真正能为业务创造价值的地方。

主动发现机会

懂业务的程序员不仅能发现问题,还能主动发现机会——那些可以通过技术手段大幅提升业务效率的地方。

很多时候,业务人员已经习惯了某种低效的工作方式,他们甚至没有意识到这是可以改进的。而程序员作为技术领域的专家,能够看到这些机会。

发现重复性劳动:当你看到运营人员每天花两个小时手工整理数据、复制粘贴到Excel时,你会想:"这个能不能自动化?"一个简单的脚本或者报表系统,可能就能把两小时的工作缩短到两分钟。

发现可以优化的流程:当你看到客服需要在三个系统之间来回切换才能处理一个工单时,你会想:"能不能做一个统一的工作台?"一个好的界面设计,可能让客服的效率提升50%。

发现可以智能化的决策:当你看到业务人员每天根据经验手工调整价格时,你会想:"这个规则能不能总结出来?能不能用算法自动调整?"一个简单的规则引擎或机器学习模型,可能比人工决策更快更准确。

发现可以提前预警的风险:当你看到团队总是在问题发生后才去处理时,你会想:"能不能提前发现异常?"一个监控系统、一个异常检测算法,可能让团队从被动应对变为主动预防。

发现可以复用的能力:当你看到不同的团队在做类似的事情时,你会想:"这个能不能抽象成通用的服务?"一个共享的基础服务,可能让多个团队都受益。

回到现实

说了这么多关于"懂业务"的方法和思路,但必须面对一个现实:很多时候,程序员不懂业务的根源并不在程序员自己,而在于公司的管理结构。

结构性问题才是根源

分工越细,跨部门沟通就越困难,程序员就越难懂业务。

在很多公司,业务部门、产品部门、技术部门是完全分离的。业务人员负责跑市场、谈客户,产品经理负责写需求文档,程序员负责写代码。每个人都在自己的领域里,彼此之间隔着厚厚的墙。

程序员想了解业务?对不起,业务部门很忙,没时间跟你解释。想和客户聊聊?对不起,这不是你的职责范围。想参与需求讨论?对不起,产品已经定好了,你只管实现就行。

在这种结构下,程序员怎么可能懂业务?

更讽刺的是,越是陷入这种结构性问题的公司,越喜欢高喊"程序员必须懂业务"。他们把结构问题归咎于个人能力,把沟通不畅归咎于程序员"不主动",把需求频繁变更归咎于程序员"理解不到位"。

但实际上,问题的根源在于:他们建立了一个让程序员无法懂业务的结构,然后要求程序员懂业务。这就像把人关在黑屋子里,然后责怪他看不见东西。

层层"传话"的危害

在这种结构下,需求往往是靠层层"传话"传递的:

客户说了一个需求 → 销售理解后转述给业务部门 → 业务部门整理后交给产品经理 → 产品经理写成需求文档给程序员 → 程序员根据文档写代码

每一层传递,都会损失信息,都会产生误解。就像"传话游戏"一样,最后程序员收到的需求,可能已经和客户的原始意图相去甚远。

更糟糕的是,当程序员发现需求有问题时,反馈也要经过同样的链条:

程序员发现问题 → 告诉产品经理 → 产品经理问业务部门 → 业务部门问销售 → 销售问客户 → 然后再原路返回

这个过程可能要花几天甚至几周。而且每一层都可能曲解信息,最后得到的答案可能根本不是程序员想问的问题。

在这种情况下,程序员怎么可能真正理解业务?他们接触到的只是经过多次转述、已经失真的"需求",而不是真实的业务问题。

不要把结构问题当成自己的问题

如果你发现自己很难懂业务,先问问自己:

  • 公司是否允许你直接和业务人员、客户沟通?
  • 你是否能参与需求讨论,而不是只接收需求文档?
  • 你提出的问题和建议,是否能得到认真的回应?
  • 公司是否给你时间去理解业务,而不是只催着你赶工期?

如果这些问题的答案都是否定的,那么问题不在你,而在于公司的结构。

不要因为公司说"程序员必须懂业务",就觉得是自己能力不足。不要因为需求频繁变更,就觉得是自己理解不到位。不要因为做出来的东西不符合预期,就觉得是自己没有"业务思维"。

很多时候,这些都是结构性问题的表现。把结构问题归咎于个人,只会让程序员陷入自我怀疑,而无法真正解决问题。

寻找自己的机会

当然,认清问题的根源,并不意味着就要放弃。如果你无法改变公司的结构,那就为自己寻找机会。

找到自己想深入的领域:不要试图懂所有的业务,而是找到一个你真正感兴趣的领域。可能是金融、可能是游戏、可能是基础设施、可能是自动化运营。选择一个你愿意投入时间去研究的领域。

主动学习和创造:即使公司不给你机会接触业务,你也可以自己学习。读行业报告、研究竞品、关注行业动态。更重要的是,用你学到的知识去创造——做一个自己的项目,哪怕只是一个小工具、一个原型。

在创造的过程中,你会真正理解业务的本质,会遇到真实的问题,会思考如何用技术解决这些问题。这比在公司里被动接需求,要有价值得多。

寻找更好的环境:如果一个公司的结构让你无法成长,那就寻找更好的环境。有些公司确实重视程序员的业务理解,会让程序员参与需求讨论,会鼓励程序员和客户沟通,会给程序员时间去思考和创造。

这样的公司可能不多,但它们确实存在。与其在一个糟糕的结构里消耗自己,不如去寻找一个能让你发挥价值的地方。

最重要的是领域思维

最后我想说,"懂业务"这个说法其实不够准确,更准确的说法应该是"懂领域"。

业务是具体的、多变的。但领域思维是通用的:如何识别核心领域、如何建立领域模型、如何在约束条件下做权衡、如何主动发现问题。

掌握了领域驱动的思维方式,无论到哪个行业、做什么产品,都能快速理解业务本质,建立有效的模型,写出高质量的代码。这才是程序员真正的核心竞争力。

所以,与其焦虑"我不懂业务怎么办",不如从现在开始,用领域驱动的思维方式去理解你手头的工作。即使环境不理想,即使公司结构有问题,你依然可以培养这种思维能力。

而当你真正掌握了这种能力,你会发现,"懂业务"并不是玄学,而是一种可以培养的、可以迁移的能力。无论环境如何变化,这种能力都会是你最宝贵的资产。