标签归档:团队管理

带团队的进阶:从解决问题到发现问题

好久没有写团队管理的文章了。今天写一下最近在思考到的一个问题。

我有一个习惯是会经常检查自己的日程,看看时间花在哪里了。

我会发现很多的时间都是在解决问题,不管是架构的问题,还是需求的问题,还是人的问题。你会发现自己很忙,也很充实,觉得自己发挥了作用。

我们一直讲 XXX左移,如测试左移,需求左移。问题也需要左移。

如果我们正在忙的这些事情下个月还会以相似的形式发生,思考一下我今天到底解决了什么问题?

从接到一个明确任务开始,延伸到问题尚未被准确描述的时候。

题目从哪里来

工程师接到一个任务,通常会先考虑约束。

吞吐量要达到多少,延迟要控制到什么范围,需要兼容哪些调用方,什么时候上线。约束越清楚,技术讨论越容易收敛。方案可以比较,工作可以拆分,结果也有验收标准。

进入管理岗位以后,麻烦在于:这些约束本身,也需要被检查。

假设业务提出,要把某个接口的响应时间减半。团队可以研究索引、缓存、并发和计算过程,也可以重新分配机器资源。这些工作都有工程价值。

但我会先追问:用户究竟在等待什么?

如果用户完成任务要经过多个环节,这个接口只占很小一部分时间,那么局部优化可能无法改变使用体验。如果等待主要发生在人工审核阶段,继续压缩服务端耗时,投入方向就需要调整。如果响应已经足够快,用户仍然反复提交,我们还需要检查状态反馈和操作流程。

这里没有贬低性能优化的重要性。问题在于,团队拿到的技术指标,是否足以代表想要改善的结果。

我经常和业务同学、商务同学以及其它提需求的人,你讲需求,不要讲方案。 因为很多人来把自己的方案当需求。

要求他们描述:谁遇到了什么困难,发生在什么条件下,造成了什么损失,现有证据是什么。

先不要写方案。

管理者需要对任务的来源负责。 方案评审只能检查给定题目下的解法,无法自动纠正题目本身。

扁鹊的难题

《鹖冠子·世贤》里,扁鹊评价兄弟三人的医术,将长兄排在最前,中兄其次,自己居后。长兄在疾病尚未显形时处理,中兄在病情轻微时处理,扁鹊的治疗动作更显著,名声也传得更远。

引用这个故事,我想表达的是其中的评价问题。

问题严重以后,损失是可见的,处理动作也是可见的。系统恢复了,业务继续运行了,参与者很容易理解这项工作的价值。

提前处理则有一个问题:我们无法直接观察那个没有发生的结果。

一个团队说,经过架构调整,避免了一次严重故障。这个说法可能成立,也可能只是把一种担忧包装成了成绩。没有发生故障,可能与改造有关,也可能因为流量没有达到预期,或者相关路径根本没有被触发。

「预防很重要」,但不会接受任何预防性投入。

假设有人提出,某项依赖存在单点风险,需要增加冗余。我希望看到的是:这个依赖失效后会影响哪些功能,现有替代路径是否可用,恢复需要什么条件,团队通过什么方式验证过。

随后才讨论增加冗余的成本,包括建设、切换、演练和持续维护。

故事中的医者似乎能够准确识别尚未显形的疾病。技术管理没有这种确定性。我们面对的是不完整的信息、会变化的业务,以及随时可能被新证据推翻的判断。

因此,观察到了什么,推测了什么,准备如何验证,判断错误时损失有多大。

发现得早,只有在判断质量和处理成本都合适的时候,才值得投入。

把症状写清

我们常常看到当一个问题刚被提出时,责任归属就已经确定了。这是不对的。

项目延期,于是执行力不足;线上出错,于是质量意识不够;评审反复,于是技术能力欠缺。这些解释很容易进入管理讨论,因为它们足够简短,也容易对应到熟悉的动作:催进度、加审核、做培训。

但它们经常缺少可以验证的内容。

以延期为例,我会先把工作过程拆开:需求什么时候达到可开发状态,编码用了多久,等待联调用了多久,返工发生在哪个阶段,验收条件是否改变过。

假设一个任务总共经历了两周,其中多数时间在等待依赖方确认接口。此时要求开发人员提高编码效率,无法覆盖主要损失。继续增加进度会议,还会占用原本可以用于协调和实现的时间。

不过,看到等待时间很长,也不能立即宣布「跨团队协作有问题」。

等待可能来自接口定义不清,也可能来自对方没有资源,还可能因为我们过早启动了一个条件尚未具备的任务。几种情况需要不同的处理方式。统一加一个协调角色,可能只会多出一次信息转述。

可以使用如下的逻辑:已经观察到的事实,基于事实形成的解释,以及准备采取的动作。

例如,几个任务都在同一个依赖环节停留较久,这是事实;对方资源不足,这是待验证的解释;调整双方排期,是一种候选动作。把它们写在一起,会让后面的讨论默认接受前面的推测。

问题描述越接近可观察的行为,团队越容易讨论具体改动。把大量精力花在解释一个人「为什么不够负责」上,通常得不到能够验收的方案。

寻找提前信号

等到事故发生再分析,证据往往比较集中。寻找早期问题,面对的信号要模糊得多。

我会优先关注那些暂时没有形成损失,却持续依赖额外劳动才能维持的环节。

例如,告警频繁发生需要开发介入排查;每次发布都需要某个人手工确认;某类数据每天都要补一次;一个模块只有固定的人敢修改;项目能按时交付,但前提是临时取消测试或压缩验收。

这些现象还不足以证明系统即将失控,但值得进一步检查。因为当前结果里,包含了没有被正式记录的人工投入。

如果只看交付是否完成、服务是否可用,我就无法知道团队为维持这些结果付出了多少补偿性劳动。

我会让团队用较低成本记录几类信息:重复的人工操作、等待外部决定的时间、计划外的工作,以及必须依赖特定人员才能完成的事项。记录的目的,是找到重复出现的位置,不追求把每个人的一天切成几十个时间片。

粒度过细,记录会变成负担,数据也容易围绕考核要求失真。

技术系统的观察也需要类似的取舍。我不会因为担心遗漏,就要求所有路径全量记录详细日志。采样比例、保存时间、字段数量和查询需求,都需要对应到具体诊断问题,并给采集开销和存储费用设预算。

如果新增一组数据无法回答任何决策问题,我倾向于先不采集。

告警同样需要说明后续动作。某个指标越界以后,谁要介入,要判断什么,允许等待多久?回答不了这些问题的告警,我会先把它放进观察范围,避免直接打断值班人员。

提前发现需要足够的信息,却不能靠无限增加信息量完成。可以从几个高损失场景倒推:在结果恶化之前,我们有没有机会看到变化?现有信息能否区分不同原因?缺少的那部分,怎样以最小代价补上?

追问到哪一层

发现重复问题以后,很容易进入另一个极端:不停追问原因,直到得到一个足够宏大的解释。

一次发布失败,可以追到测试不足;测试不足,可以追到排期紧张;排期紧张,可以追到业务压力;最后写成「组织需要加强质量文化」。

讨论完成了,下一次发布怎么做,仍然没有答案。

建议把分析停在当前能够改变、能够验证的层次,同时记录更上层的约束。

假设某次故障涉及配置变更。恢复服务后,我希望继续弄清楚:配置是否经过校验,发布前能否发现异常,变更是否可以独立回退,为什么已有检查没有覆盖这条路径。

如果缺少校验,就讨论怎样增加校验。如果具备校验能力,却因为发布时间紧张被跳过,就需要检查绕过条件和批准权限。再往上,若每次承诺交付时都默认压缩验证时间,排期方式也要进入改进范围。

这几个层次可以同时存在。没有必要强行选出唯一的「根因」。

我更关心哪一项改动能切断已知的失败路径,哪一项能缩短恢复时间,以及哪些约束暂时只能接受。

增加发布审核,是一种常见选择,但我会谨慎使用。它需要持续占用审核者时间,也会让发布等待另一个人的判断。如果某类错误可以通过确定性检查识别,我会优先评估自动校验;如果必须依赖业务背景判断,人工审核才有对应价值。

自动化是一种常见的策略,但是要考虑成本。一个发生频率很低、每次处理只需少量时间的例外,未必值得建设复杂流程。反过来,高频且规则稳定的操作,长期依赖人工检查,我会要求说明理由。

分析问题的深度,应当服务于干预选择。继续追问已经无法改变行动时,我会停止扩展讨论,把精力转向验证。

问题也要排期

发现问题的能力提高以后,待办事项很可能先变多。

代码有债,流程有缺口,人员有依赖,业务假设也有风险。如果每一个发现都必须立即解决,团队会同时启动大量改善工作,原本的交付计划也失去可信度。

管理者需要对「暂时不处理」承担责任。

判断一个问题是否进入排期,我会看几件事:已经造成了什么损失,未来损失可能如何扩大,判断依据有多可靠,处理成本是多少,以及推迟以后是否会失去调整空间。

简单来说就问一个问题:不做什么怎么样,做要多少成本? 这也算是两个问题吧。

假设两项改造都能减少一定维护工作。其中一项随时可以做,另一项涉及即将被多个团队依赖的接口约定。后者一旦扩散,迁移就需要更多参与者配合。我可能优先处理后者,即使它眼前节省的时间更少。

但我不会把这些因素全部塞进一个精确分数,然后按小数点排序。概率、影响和工作量里包含大量估计,算式不能消除不确定性。

对于信息不足的问题,我会单独安排验证工作。

例如,先花一个有限时间窗口检查实际调用情况、做一次容量实验,或者回放一批历史任务。验证结束后,再决定是否启动完整改造。验证任务需要有结束条件,不能以「持续调研」的形式长期占用人力。

我也会区分两种决定:允许风险暂时存在,以及承诺在某个时间解决。前者需要记录接受风险的人、接受范围和重新检查的条件。不能把所有暂缓事项都放进一个没有期限的技术债列表,等下一次出事再说「早就提过」。

有限的资源只能处理有限的问题。管理者的工作包含排序、延后和拒绝,不能只提供一份越来越长的风险清单。

先做有限验证

提前发现的问题,往往还没有足够证据支持大规模改造。我们需要优先寻找能改变判断的小实验。

假设团队认为,交付慢主要来自公共组件不好用。直接重建组件库,投入很大,验证周期也长。可以先选一类重复任务,调整其中一个高频接口,再比较接入步骤、返工次数和总耗时。

这个实验不需要证明新方案在所有场景都更好。它需要回答:当前识别出的障碍,是否确实影响了交付;移除障碍以后,预期变化有没有出现。

实验设计里,我们可以要特别检查比较条件。

两次任务的复杂度是否接近,参与者是否不同,是否有额外辅导,新方案是否获得了旧方案没有的资源。如果这些条件发生变化,就要缩小结论的范围。

如果测试任务都是规则清楚、信息完整的样本,结论也只能覆盖这部分任务。遇到资料缺失、规则冲突或无法判断的情况,系统怎样退出,谁来接手,都要进入验证范围。

有限实验也有局限。它可能遗漏低频问题,额外受到团队关注,或者无法覆盖规模扩大后的协作成本。因此,通过一次实验以后,我会继续限制推广范围,保留回退条件。

我愿意为这些步骤支付一些时间。相较于一次性更换完整流程,分阶段验证让我有机会在投入扩大之前修正判断。

授权与介入

发现问题容易让管理者产生一种冲动:既然我已经看到了,亲自处理应该最快。

在紧急情况下,这可能是合适的选择。但如果每一次复杂问题最后都回到我这里,我就需要检查自己的介入方式。

我会区分三个环节:识别风险、作出决定、执行处理。它们可以由不同的人负责。

管理者发现某个发布环节存在风险,可以要求补充证据、确定负责人和完成期限。除非风险已经超过团队当前能力,或者需要跨越现有权限,否则没有必要接管全部实现。

授权时,我需要交代的是目标、约束、可使用的资源,以及什么情况下必须升级。对于实现细节,我会留出空间。

这里存在实际代价。团队选出的方案可能与我的习惯不同,局部实现也可能没有我亲自处理得快。如果每次出现这种差异,我就收回任务,成员很难积累完整判断的经验。

但授权也不能变成不检查。

我会根据风险安排检查点。可以轻易撤销的局部改动,允许负责人快速推进;涉及数据破坏、跨团队承诺或难以回退的迁移,需要更早检查方案和前提。检查频率随风险变化,避免所有任务都接受相同强度的管理。

我也需要亲自参与一部分现场工作,例如阅读一次故障时间线,跟进一个长期受阻的任务,或者检查一次改造的实际使用情况。

如果信息只来自层层整理后的汇报,我很难判断哪些成本被省略了。亲自接触现场,是为了校准判断;后续仍然要让明确的负责人完成处理和验收。

发现问题之后,我还欠团队一个决定:谁负责、投入多少、何时检查,以及哪些事情因此不做。

让风险能上来

如果我希望团队提前报告问题,就需要检查自己怎样回应坏消息。

成员提出风险以后,立刻被要求证明一定会出事;承认进度存在不确定性以后,被评价为缺乏担当;发现历史缺陷以后,首先被追问为什么之前没有发现。面对这些回应,一个人有理由等证据更充分以后再开口。

等到证据充分,调整空间可能已经缩小。

我会允许风险报告保留不确定性,但要求表达具体:观察到了什么,可能影响什么,还缺少哪些信息,希望获得什么支持。

「这个项目肯定要延期」和「关键依赖尚未确认,如果本周无法完成,我们需要调整后续联调安排」,包含的信息量不同。后一种表达让管理者可以作出决定,也允许后续事实修正判断。

对于善意提出、最终没有发生的风险,我不会仅凭结果认定提出者判断失误。我会回看当时的信息是否足以支持担忧,验证动作是否合理,以及是否因为提前处理才没有继续恶化。

同样,我也不会奖励没有证据的持续悲观。风险提出以后,需要有人补充信息、缩小范围,必要时撤回判断。只负责提醒所有可能性,却不参与验证,会把筛选成本转移给整个团队。

预防性工作的评价也需要证据。

我会看风险路径有没有被验证,改造是否覆盖了它,回退或恢复是否经过检查,后续维护责任是否落实。至于「避免了多少损失」,没有足够依据就不写一个夸张数字。

对于重复的人工劳动,可以比较前后的处理次数和时间;对于恢复能力,可以记录演练中实际完成的操作与耗时;对于协作改善,可以检查等待和返工有没有变化。评价应当尽量落在能够复查的记录上。

这样做会增加一些记录成本。我愿意保留与决策和验收有关的部分,不要求团队为每项改善制作完整汇报材料。

检查已经完成的

还有一类问题,很容易被技术管理忽略:任务完成了,但投入没有产生预期结果。

系统按时上线,功能通过验收,接口符合设计,团队也没有犯明显错误。几个月以后,使用量很低,原有人工流程仍在继续,新系统还多了一份维护责任。

如果我的检查到上线就结束,这类问题不会进入视野。

我会在立项时约定一次投入后的复查。具体检查什么,取决于项目要解决的问题:人工步骤是否减少,用户是否完成了原来难以完成的任务,业务是否真的采用了新流程,旧系统是否按计划退出。

不能用「已经上线」替代这些问题的回答。

如果结果没有出现,我需要重新检查原来的假设。也许我们识别错了障碍,也许方案只处理了一小部分,也许业务条件已经发生变化。继续增加功能之前,先确认追加投入还有没有依据。

停止项目在这里也是一种需要认真评估的选择。它涉及已有投入、人员安排和承诺调整,处理起来往往比批准下一期更麻烦。但维护一个缺少使用理由的系统,同样会持续消耗资源。

发现问题因此也包括检查团队正在解决的问题是否仍然存在,解决方式是否仍然适用,以及目标是否已经改变。

这会改变我安排时间的方式。

我仍然需要参与故障处理,理解技术细节,对交付结果负责。同时,我会固定留出时间检查重复劳动、尚未验证的判断和上线后的实际结果。对于已经暴露的问题,要求处理闭环;对于只有迹象的问题,安排有限验证;对于暂时接受的问题,留下重新检查的条件。

我也会定期回看自己提出的问题。有多少得到了证据支持,有多少被否定,哪些因为迟迟没有决定而继续消耗团队,哪些处理动作带来了新的负担。

否则,所谓发现问题,很容易变成管理者不断向团队追加任务。

从解决问题到发现问题,对我意味着工作范围扩大了:需要参与定义,需要作出取舍,还需要在结果出现以后检查当初的判断。问题提前进入视野,只是给了我们更多处理空间。这个空间有没有被用好,最终仍然要回到具体的行动和结果上。

以上。

从领域驱动设计(DDD)到技术团队管理的 6 点思考

领域驱动设计(Domain-Driven Design, DDD)是一种软件开发方法,由 Eric Evans 在 2003 年出版的同名著作《领域驱动设计:软件核心复杂性应对之道》中提出。DDD 的核心思想是,相比技术实现,业务领域知识对软件项目的成功更为关键。因此,开发团队应该将主要精力投入到理解和建模业务领域,并以此指导软件设计和开发。

DDD 主要解决以下问题:

  1. 业务复杂性:现实世界的业务领域往往非常复杂,涉及各种业务实体、业务规则和业务流程。领域建模通过将复杂的业务领域划分为若干个界限清晰的子领域,并提炼出每个子领域的核心概念和关系,来管理和应对业务复杂性

  2. 沟通鸿沟:业务专家和技术团队往往使用不同的语言和思维方式,导致沟通障碍和理解偏差。领域建模强调建立一种团队共享的统一语言,通过将业务概念和规则显式地表达在领域模型中,促进业务和技术之间的有效沟通。

  3. 软件弹性:随着业务的不断发展和变化,软件系统也需要随之演进。但是,如果软件设计没有准确反映业务领域,后续的变更就会变得困难和混乱。DDD 通过识别出领域中的不变量和变化点,并使用合适的设计模式和架构风格来封装和管理变化,提高软件的弹性和可维护性。

为了解决这些问题,DDD 提出了一系列原则和实践,包括:

  • 界限上下文:将复杂的业务领域划分为多个界限明确的上下文,每个上下文对应一个特定的业务语境。
  • 统一语言:在每个界限上下文中,开发团队和领域专家应该使用同一套语言来描述业务概念和规则。
  • 领域模型:通过分析业务领域,提炼出核心的业务概念、业务规则和业务逻辑,并用对象模型来表示。
  • 分层架构:将软件系统划分为用户界面、应用层、领域层和基础设施层,并确保依赖关系始终朝向领域层。

DDD 的发展历程大致如下:

  • 20 世纪 90 年代,随着面向对象分析与设计(OOAD)的兴起,人们开始关注如何将现实世界的业务概念映射到软件对象中。
  • 2003 年,Eric Evans 出版了《领域驱动设计》一书,系统地阐述了领域建模的原则和实践,标志着 DDD(Domain-Driven Design)的诞生。
  • 此后,DDD 逐渐受到业界的广泛关注和应用。一些知名的 DDD 实践者,如Vaughn Vernon、Udi Dahan 等,通过著作和演讲进一步丰富和发展了 DDD 的理论体系。2014年,Vernon 出版了《实现领域驱动设计》一书,详细阐述了 DDD 在架构设计、领域建模、代码实现等方面的最佳实践,成为 DDD 实践者的重要参考。
  • 近年来,随着微服务架构的兴起,DDD 在微服务设计中得到了广泛应用。一些新的概念和模式,如事件风暴、限界上下文、命令查询职责分离(CQRS)等,进一步扩展了 DDD 的实践边界。

近年来,DDD 持续受到关注,并在实践中不断发展:

  1. 事件风暴(Event Storming):由Alberto Brandolini提出,通过识别领域事件来快速建立领域模型,加速了DDD的建模过程。
  2. CQRS和事件溯源(Event Sourcing):将领域模型的读写职责分离,并将所有的状态变更记录为事件,提高了系统的性能和扩展性。
  3. 领域故事(Domain Story):将用户故事(User Story)提升到业务领域的层次,用业务语言描述系统的功能需求,加强了业务视角的引入。
  4. 领域驱动的微服务设计:以 DDD 为指导,从业务领域的角度识别和拆分微服务,提高了微服务的内聚性和自治性。

当前,领域建模和DDD 已经成为应对复杂业务系统设计的重要工具和方法论。以下是一些最新的发展趋势:

  1. 结合敏捷实践:DDD 强调在开发过程中持续深化对领域的理解,并通过频繁的反馈和调整来完善领域模型。这与敏捷开发的迭代优化理念高度一致。当前,越来越多的团队尝试将 DDD 与 Scrum、看板等敏捷实践相结合,通过跨职能团队协作、领域故事映射(User Story Mapping)等技术来加速领域建模的过程。

  2. 领域事件驱动:随着 Event Sourcing 和 CQRS 等架构模式的普及,领域事件(Domain Event)成为连接领域模型与技术实现的重要媒介。通过显式定义领域事件,并以事件驱动的方式编排业务流程和数据同步,可以提高系统的扩展性和性能。

  3. 开发工具支持:越来越多的建模工具和开发框架开始提供对DDD的原生支持。例如,EventStorming 工具支持在线协作完成事件风暴;MPS(Meta Programming System)等语言工作台支持以领域特定语言(DSL)的方式直接表达领域模型;Axon、Eventuate等框架提供了事件溯源和CQRS的开箱即用支持。这些工具的成熟,大大降低了DDD的实施门槛。

  4. 企业级应用:DDD 典型地应用于单一企业内部的复杂业务系统。而随着企业数字化转型的深入,DDD 在企业级应用架构中也开始发挥越来越重要的作用。通过运用 DDD 原则,建立清晰的业务领域边界和上下文映射,可以指导企业级应用的领域划分、系统解耦、服务化演进等架构设计工作。

通过上面的内容我们对于领域驱动设计有了一个初步的认知,DDD 为设计和开发复杂业务系统提供了行之有效的指导原则和实践指南。

那从技术团队管理的角度来看,有哪些相似点,又有哪些不同,DDD 的原则及其解决问题的过程对于技术团队管理者来说又有哪些借鉴的地方,对此有如下的 6 点思考:

1 管理复杂度

DDD 的核心在于管理业务复杂性。通过将复杂的业务领域划分为若干个界限清晰的子领域,并在每个子领域中提炼出核心业务概念和业务规则,DDD 帮助我们深入理解业务,并将其转化为可执行的软件模型。这一点对于应对日益复杂的业务需求至关重要。

DDD 面对复杂的业务领域,会进行领域划分,识别出核心域、通用域、支撑域等不同的子领域。通过划分领域边界,我们可以更好地管理复杂性,分而治之,让每个子领域都有明确的职责和边界。同时,领域边界划分也有助于识别领域内的关键概念、业务规则和约束条件。

技术团队管理同样面临复杂性的挑战。随着团队规模的扩大和业务需求的增长,团队内部的沟通协作、技术决策、资源调配等问题日益复杂。

管理者需要采用合适的组织结构和管理实践,将复杂的团队工作划分为可管理的模块,并在模块间建立清晰的职责边界和接口协议。

并且划分团队边界和职责,根据系统架构和业务需求,设计出合理的团队结构和职责分工。每个团队或角色都应该有明确的边界和交付物,避免出现职责交叉或责任真空的情况。通过职责边界划分,团队成员能够专注于自己的工作,提高工作效率和质量。

领域边界划分和团队职责划分的相似之处在于,它们都是为了应对复杂性,通过「分而治之」的方式来管理复杂度。

2 统一语言

DDD 强调在每个界限上下文中建立统一语言,即业务专家和开发团队应该使用同一套语言来描述业务概念和业务规则。统一语言有助于消除业务理解上的歧义,减少需求遗漏和错误理解,提高沟通效率。

在技术团队管理中,统一语言也扮演着类似的角色。团队成员来自不同的背景和专业,彼此之间容易产生理解偏差。技术团队管理者需要在团队内部形成一套统一的技术语言体系,包括架构原则、设计模式、编码规范、质量标准、开发语言等。确保所有人对工作内容有相同的理解。

统一的技术语言有助于提升团队的协作效率,减少技术债,促进知识共享和经验传承。

统一语言在领域建模和技术团队管理中的共通点在于,它们都强调语言的一致性对于沟通效率和工作质量的重要性

本质上是一个成本问题,减少过程中的沟通成本,通过统一语言实现有效协作,正所谓「言语齐,则民聚;言语不齐,则民散」。

业务统一语言强调与领域专家的有效沟通,而技术统一语言更强调团队内部的协作。二者需要相互配合。

3 分层架构的设计

DDD 提出了分层架构的设计原则,即将软件系统划分为用户界面、应用层、领域层和基础设施层,并确保依赖关系始终朝向领域层

分层架构有助于隔离业务逻辑与技术实现,保持领域模型的纯粹性,提高系统的可测试性和可维护性。

技术团队管理同样强调分层管理。随着团队规模的增长,扁平化管理将变得难以为继。管理者需要在团队内部建立起适当的管理层级,并在各层级间合理划分职责和权力。

过于复杂的层级会导致信息传递失真和决策迟滞,而过于扁平的结构又可能让管理失控。管理者需要在二者间寻找平衡。

分层架构是管理复杂性的有效手段。但软件分层架构强调上层依赖下层,而管理分层强调上层指挥下层。

软件分层追求的是关注点分离和依赖最小化,管理分层追求的是指挥与协作的最优化。二者分工不同,但目标一致:通过恰当的分层,让复杂系统变得可控和高效。

4 持续迭代优化

DDD 强调通过持续迭代和反馈来优化领域模型。

这是一个渐进的过程,团队在每个迭代周期中,都要对已有的领域模型进行评估和改进,通过引入新的业务洞见、技术创新等来持续迭代优化模型。这种持续优化的实践,确保了领域模型能够随业务变化而演进,始终保持与业务需求的紧密匹配。

技术团队管理同样需要持续迭代优化。优秀的管理实践并非一蹴而就,而是在持续实践中逐步完善。

管理者需要在每个迭代周期中,评估现有的管理实践,识别可以改进的地方,并基于反馈不断优化。彼得·德鲁克说:「管理的本质不在于知而在于行」。

常规我们会通过定期的回顾总结会议,团队成员分享工作中的经验教训,识别出可以改进的地方,并制定行动计划。当然,不局限于总结会议,可以是沙龙或者其它非正式一些的方式,但是组织逻辑还是要按高效会议的逻辑组织。

通过持续不断的自我优化,团队能够在实践中不断成长,提高工作效率和质量,适应不断变化的技术挑战,始终保持与团队需求的动态匹配。

持续迭代优化是 DDD 和技术团队管理的共同追求。二者都认识到,在复杂多变的环境中,唯有持续改进,才能保持竞争优势。但 DDD 关注的是领域模型的持续优化,技术团队管理关注的是管理实践的持续完善。二者殊途同归:领域驱动为优化指引方向,管理实践为优化提供载体。

5 平衡战术和战略目标

DDD 在战术设计和战略设计间寻求平衡。战术设计关注软件的实现细节,如聚合、实体、值对象等;战略设计关注高层的业务架构,如界限上下文、上下文映射等。

DDD 认为,只有战术与战略协调一致,才能实现业务目标。过度关注战术实现,可能导致偏离业务方向;过度关注战略规划,可能导致落地困难。需要在二者间寻求平衡。

技术团队管理同样需要平衡战术执行和战略规划。战术执行确保团队高质量、高效地完成当前的项目任务,交付满足业务需求的软件产品,关注当下的交付质量和效率,战略规划关注团队成员的能力成长,通过培训、指导等方式提升团队的整体技术实力,关注长期的技术演进和团队发展

管理者需要在二者间权衡取舍:过度关注战术执行,可能会陷入短期主义,积累技术债;过度关注战略规划,可能会脱离现实,导致执行力不足。

优秀的技术团队管理者,需要在战术执行中体现战略意图,在战略规划中考虑战术现实

平衡战术和战略是 DDD 和技术团队管理的共同诉求。二者都强调在理想和现实、当下和未来间寻求平衡。DDD 在战术实现和战略规划间权衡,技术团队管理在短期目标和长期发展间平衡。二者殊途同归:领域驱动为战略导向,技术驱动为战术赋能。

6 聚焦核心价值

DDD 的终极目标,是通过领域建模和设计,让软件聚焦和体现业务的核心价值。通过提炼核心域和通用域,DDD 让团队优先保证核心业务的软件质量和交付效率。

通过聚焦核心领域,我们可以将有限的资源投入到最能体现业务价值的地方,构建出反映企业核心竞争力的领域模型。

同时,对于非核心的通用域和支撑域,我们可以采用购买、外包等方式来降低复杂度,聚焦核心。

技术团队管理需要聚焦团队的核心竞争力。面对有限的资源和无限的需求,管理者需要做出取舍,让团队聚焦最能体现其专业优势和商业价值的领域。

对非核心业务,可以考虑外包或购买现成解决方案;对通用功能,可以考虑复用或使用开源方案。

管理者需要带领团队持续思考:什么是我们的差异化优势?什么是我们的核心竞争力? 并围绕这个核心持续打磨和升级。

聚焦核心价值是 DDD 和技术团队管理的终极诉求。DDD 聚焦领域核心,技术团队管理聚焦团队优势。聚焦价值,体现价值。

7 小结

DDD 提供了一个解析和管理复杂性的思维框架,其核心理念和实践,如持续迭代优化、应对变化和不确定性、平衡战术和战略目标、聚焦核心价值、领域边界划分、分层架构等,都对技术团队管理有深刻启示。

这启示我们以系统性思维审视复杂性,以适应性领导拥抱变化,以持续成长的心态追求卓越,以跨界协作的方式创造价值

正如 Albert Einstein 所言:”复杂的问题不能用产生它的思维方式来解决。” 领域驱动设计给了我们一种突破旧有思维方式的新视角。

技术团队管理的艺术,在于洞察人性,激发潜能。而领域驱动设计的智慧,在于洞察业务本质,拥抱技术变革。二者相互交织,共同指引我们在不确定性中前行。

作为技术管理者:

  • 我们要成为连接业务与技术的「架构师」,引领团队用创新点亮未来;
  • 我们要成为引领变革的「领航员」,带领团队在不确定中破浪前行;
  • 我们更要成为成就他人的「园丁」,营造持续成长的土壤,让每个生命绽放光彩。

以匠心,以爱心,以卓越之心

以上

成熟管理者眼中的「异类」

在技术团队的管理中,我们常常会遇到一些与众不同的人,他们或许观点独特、行事风格特立独行,或许不擅社交、不善表达。作为管理者,应该如何看待和对待这些「异类」员工?

所谓的「异类」只是站在我们的角度来看的,根据员工的行为表现和团队影响,大致可以分以下的 5 类:

  1. 特立独行型:这类「异类」员工往往有自己独特的工作方式和处事风格,不太愿意随大流,喜欢标新立异。他们通常有很强的独立思考能力和创新意识,能够给团队带来新的视角和思路。但同时,他们也可能不太擅长团队协作。
  2. 专业领域型:这类「异类」员工在某一专业领域有极高的造诣,是团队的领域专家。他们对自己的专业领域有极高的要求和热情投入,但可能对团队的其他事务不太感兴趣。
  3. 性格气质型:这类「异类」员工的个性比较鲜明,可能是性格孤僻、不善言辞,也可能是个性张扬、言语犀利。他们在团队中可能显得格格不入,容易产生误解和矛盾。
  4. 行为习惯型:这类「异类」员工在工作中可能有一些特殊的行为习惯,比如工作时间特立独行、沟通方式比较直接等。这些习惯可能与团队的工作节奏和沟通方式不太一致,容易引起不适。管理者需要通过交流和反馈,帮助他们认识到自己的行为对团队的影响,并逐步进行调整。
  5. 价值观念型:这类「异类」员工的价值观念与团队的主流价值观存在一定差异,这种差异可能体现在工作态度、职业操守等方面。

以上分类并非互斥,一个「异类」员工可能同时具有多个类型的特征。

以上类型的同学我们都有可能遇到,特别是技术团队管理过程中尤为明显,那作为一名成熟的管理者,应该怎么做呢? 首先需要拥有一颗开放和包容的心,说起来容易,但做起来挺难的,因为这是与人性在拉扯。

人,生而不同,每个人都是独特的个体,都有自己的优缺点和特质。「异类」员工的存在,恰恰体现了团队的多元化,他们为团队注入了不同的思想和视角。对于他们的特质,我们应该予以尊重和欣赏,而不是简单地把他们定义为「问题员工」。

但同时,管理者也需要有原则和底线。团队协作时,如果「异类」员工的言行举止严重影响了团队的正常运转,对业务目标的达成造成负面影响,那么我们就有必要及时干预。这就要求我们要事先厘清团队的规则和红线,并且要把对员工的要求心中有数,这是我们应尽的职责。

那红线是什么?我理解红线包括以下 5 个:

  1. 价值观红线:违背公司的核心价值观,持有与公司文化完全相悖的价值理念。
  2. 原则红线:违背基本的职业操守和个人品德,如欺诈、泄密、剽窃等。
  3. 规则红线:严重违反公司和团队的规章制度,屡教不改,对团队秩序造成恶劣影响。
  4. 绩效红线:工作严重不达标,绩效长期低下,且没有改进的意愿和行动。
  5. 行为红线:言行举止严重影响团队氛围,或者影响团队的整体执行力,或给公司声誉造成负面影响。

作为管理者,需要全面了解每一个「异类」员工的特点,因人而异地进行管理和引导,发挥他们的优势,帮助他们克服弱点,让他们在团队中找到合适的位置,为团队创造更大的价值。同时,也要持续塑造团队文化,营造包容、开放、互信的团队氛围,让「异类」员工感受到团队的温暖和力量,愿意与团队共同成长。

在面对这些同学时,我们先厘清是不是我们的胸怀问题,看看是否是我们的胸怀不够开阔,是否没有给予员工足够的包容和理解;有没有把规则讲在前面,有没有把要求讲在前面?有没有给员工改进的机会和空间?如果确定不是胸怀问题,规则和要求都讲了,并判断他确实改不了,那就需要处理了。

在处理「异类」员工时,我们需要区分两种情况:

一个是是否是触了红线,是否是不能原谅的,那是就只有一条路了,离开这个公司,这里对大家都负责任的做法。

另一个是没有触及红线,只是理念的不一致,或者你们之间无法合作,在认知上无法达成一致,但是其人确实有能力,只是和你不太匹配,那么建议转岗或者换个地方试试。

不同的环境、不同的领导风格,可能更能激发员工的潜力。调岗也能让员工获得新的成长机会,开阔视野。

这些处理过程中,我们都需要与员工充分沟通,了解员工的想法,对员工的能力和特点有全面的认识。调岗决不能成为管理者推卸责任、逃避问题的借口。如果调岗后问题仍然存在,管理者就需要反思是否是自身的管理方式出了问题,是否给了员工足够的支持和指导。

在团队管理过程中遇到「异类」员工是一件正常的事情,也是一个管理者成熟的必经之路。

本着善良之心,做周全之举,事不过三