程序员到架构师,该学习如何说话

文章目录

  • 前言
  • 一、举一个例子
  • 二、程序员如何学习说话
  • 总结


前言

通常,程序员可以根据自己对问题的理解来编写代码。只要他们定义了清晰的输入和输出接口,并且能够通过预设的测试数据使程序顺利运行,开发工作就可以说是完成了一大部分。然而,在与产品经理或用户沟通时,我们经常发现,基于编程的术语和概念对于非技术人员来说是很难理解的,特别是当涉及到代码循环、数据库结构等专业词汇时。

因此,在软件开发过程中,如何有效地将项目成员的心智模型转化为业务领域的深层术语和关系,从而确保业务模型与开发活动之间更紧密的整合,是对程序员在其职业生涯中需要达到的一个更高的水平。这不仅有助于提高沟通效率,还能确保最终产品更好地满足业务需求。


一、举一个例子

以下例子来自于《领域驱动设计》一书,内容非常经典。
用户提了一个货物更改通关航道的需求,在开发过程中,开发人员需要和用户基于该需求进行业务确认:

第一种沟通方式:

用户: 那么,当更改 通关 地点时,需要重新制定整个路线计划啰。
开发人员: 是的。我们将从货运表 (shipmenttable) 中删除所有与该货物id相关联的行,然后将出发地、目的地和新的通关 地点传递给RoutigService,它会重新填充货运表。Cargo中必须设立一个布尔值,用于指示货运表中是否有数据。
用户: 删除行?好,就按你说的做。但是,如果先前根本没有指定 通关 地点,也需要这么做吗?
开发人员: 是的,无论何时更改了出发地、目的地或清关地点(或是第一次输入),都将检查是否已经有货运数据,如果有,则删除它们,然后由RoutingService重新生成数据。
用户: 当然,如果原有的通关 数据碰巧是正确的,我们就不需要这样做了。
开发人员: 哦,没问题。但让RoutingService每次重新加载或却载数据会更容易些。
用户: 是的,但为新航线制定所有支持计划的工作量很大,因此,除非非改不可,我们一般不想更改航线。
开发人员: 哦,好的,当第一次输入通关地点时,我们需要查询表格,找到以前的通关 地点,然后与新的通关 地点进行比较,从而判断是否需要重做。
用户: 这个处理不必考虑出发地和目的地,因为航线在此总要变更。
开发人员: 好的,我明白了。

第二种沟通方式:

用户: 那么,当更改通关 地点时,需要重新制定整个路线计划啰。
开发人员: 是的。当更改RouteSpecification(路线说明)的任意属性时,都将删除原有的Itinerary(航线),并要求Routing Service(路线服务)基于新的Route Specification生成一个新的Itinerary.
用户: 如果先前根本没有指定通关 地点,也需要这么做吗?
开发人员: 是的,无论何时更改了RouteSpec的任何属性,都将重新生成Itinerary。这也包括第一次输入某些属性。
用户: 当然,如果原有的通关 数据碰巧是正确的,我们就不需要这样做了.
开发人员 :哦,没问题。但让RoutingService每次重新生成一个Itinerary会更容易些。
用户: 是的,但为新航线制定所有支持计划的工作量很大,因此,除非非改不可,我们一般不想更改路线。
开发人员: 哦。那么需要在RouteSpecification添加一些功能。这样,当更改RouteSpecification中的属性时,查看Itinerary是否仍满足Specifcation。如果不满足,则需要由Routing Service重新生成Itinerary。
用户: 这一点不必考虑出发地和目的地,因为Itimerary在此总是要变更的。
开发人员: 好的,但每次只做比较就简单多了。只有当不满足RouteSpecification时,才重新生成Itinerary。

在比较两段对话时,我们可以观察到尽管双方在沟通的内容和目的上有着共同点,在第一段对话中,参与者不得不频繁地针对应用程序的具体特性以及那些含糊不清的表达进行澄清和解释。而第二段话采用了贴近业务模型的术语,这使得讨论过程更为流畅和直接。这种基于业务领域模型导向的语言不仅减少了对技术细节的依赖,也使得非技术背景的参与者能够更容易理解和参与进来,从而提升了整体沟通的效率和效果。

二、程序员如何学习说话

在程序员与产品经理、用户等非技术角色进行交流时,他们往往不会直接采用领域模型的专业语言,而是使用一种混合了描述性和功能性术语的语言,有时甚至夹杂着从对方那里学来的业务术语。这就像是一门独特的混合语,只有参与者才能理解。

如何将这种混合语,抽象成大家都能理解的团队语言,一个比较好的方法就是多听,多说,多想。即通过对话来进行探索,尝试从谈话中捕捉并比较提及的模型变化和结构。这就像是一场侦探游戏,参与者通过对话来寻找线索,逐渐揭示出业务模型的真相。

想象一下,我们有三种不同层次的描述:

  • 技术性描述:“如果我们向Routing Service提供出发地、目的地和到达时间,就可以查询货物的停靠地点,然后将这些信息存储到数据库中。”
  • 具体但冗长的描述:“我们需要将出发地和目的地等信息输入到Routing Service中,然后我们会得到一个行程(Itinerary),其中包含了我们需要的所有信息。”
  • 简洁的描述:“Routing Service根据路线规范(Route Specification)查找满足条件的行程(Itinerary)。”

在程序员向架构师的进阶之路上,“说话”的艺术是一个关键的里程碑。这不仅涉及到技术知识的深度和广度,更是一种思维方式和沟通能力的升华,这涉及到如何将这些知识以一种清晰、准确且易于理解的方式传达给他人。在这个过程中,抽象思维的培养是至关重要的。

  • 低层次的描述:在最初阶段,程序员往往专注于代码的细节和实现,他们的描述充满了具体的技术术语和细节。这种描述对于机器和具体实现是友好的,但对于非技术人员或高层次的决策者来说,可能难以理解。

  • 中等层次的描述:随着经验的积累,程序员开始学会从更高的层次来看待问题。他们能够将复杂的系统分解为简单的模块,并使用更通用的术语来描述这些模块的功能和交互。这种描述更适合与团队成员和非技术人员沟通。

  • 高层次的描述:当程序员达到架构师的层次时,他们能够从更高的视角来看待整个系统。通过找到一个平衡点,既能抽象到足够的高度,又不丢失关键的细节。这需要深厚的技术背景,以及对业务和用户需求的深入理解。通过使用比喻、模型和图表等工具,架构师可以将复杂的系统简化为几个关键的概念,从而更容易地传达给不同的听众。


总结

在程序员向架构师的转型过程中,学习“说话”即学习沟通和表达,是一个不可或缺的环节。有效的沟通不仅能够确保项目的顺利进行,还能够提升团队的协作效率:

  1. 理解业务模型:在软件开发中,模型是现实的抽象,它帮助我们理解和设计复杂的系统。模型之间的关系定义了系统中各个组件如何相互作用,这些关系构成了所有语言共有的组合规则。词汇和短语的含义则直接反映了模型的语义,它们是我们描述系统的关键。

  2. 使用基于模型的语言:作为开发人员,我们应该使用基于模型的语言来描述系统中的构件、任务和功能。这种语言应该包含足够的细节,以便清晰地传达设计意图和业务需求。例如,使用UML图来描述类之间的关系,或者使用领域特定语言(DSL)来表达业务逻辑。

  3. 共同语言的建立:这个模型不应该仅仅是开发人员的私有语言,而应该成为开发人员和产品经理、用户之间交流的共同语言。这样可以确保所有人对项目的理解都在同一频道上。

  4. 广泛使用促进理解:这种基于模型的语言的使用越广泛,团队成员之间的理解和沟通就会越顺畅。这不仅减少了误解和混淆的可能性,还提高了决策的效率和准确性。

  5. 持续学习和实践:作为程序员,除了跟项目组成员沟通之外,还可以通过参加沙龙、研讨会,阅读相关书籍等方式来持续学习和实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/569277.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue项目启动npm install和npm run serve时出现错误Failed to resolve loader:node-sass

1.常见问题 问题1:当执行npm run serve时,出现Failed to resolve loader: node-sass,You may need to install it 解决方法: npm install node-sass4.14.1问题2:当执行npm run serve时,出现以下错误 Fa…

ADC内部运行原理

1以一个简单的外置ADC为例讲解 1在外部由地址锁存和译码经行去控制通道选择开关//去控制外部那一条IO口输入,输入到比较器 2逐次逼近寄存器SAR每次从三态锁存缓冲器读取值在由DAC(数模转换成模拟电压)在输入到比较器当io信号和DAC信号几乎一样…

JWT原理解析

一、概述 虽然现在很多的开发框架会支持JWT的使用,但是对JWT还是没有一个详细的了解,有很多疑惑: JWT比之前的session或者token有什么好处?JWT的构成元素是什么?JWT从生成到使用的详细流程? 二、 JWT 2…

华为数通方向HCIP-DataCom H12-821题库(多选题:321-340)

第321题 关于OSPF的命令描述,不正确的是: A、stub区域和totally stub区域配置了no-summary参数 B、OSPFv2和OSPF v3配置接口命令的区别是OSPF V2可以使用network命令,而OSPFv3直接 C、在接口上使能stubrouter命令用来配置次路由器为stub路由器,stub路由器可以与非stub路由 …

AUTOSAR-COMStack-003_SignalGroup如何发送接收

1. Ref Ref.1 AUTOSAR_RS_Main.pdf Ref.1 AUTOSAR_RS_Features.pdf Ref.2 AUTOSAR_SRS_COM.pdf Ref.3 AUTOSAR_SWS_COM.pdf 2. 为什么要使用Signal Group? 2.1 Traceabilty [RS_PO_00004] AUTOSAR shall define an open architecture for automotive software.…

debian和ubuntu的核心系统和系统命令的区别

Debian和Ubuntu虽然有很深的渊源,都是基于Debian的发行版,但它们在核心系统和系统命令上还是有一些差别的。以下是一些主要的不同之处: 1. 发布周期: - Debian: Debian项目采用滚动发布模型,持续更新&a…

【数据结构(邓俊辉)学习笔记】向量03——无序向量

文章目录 0.概述1.元素访问2.置乱器3.判等器与比较器4.无序查找4.1 判等器4.2 顺序查找4.3 实现4.4 复杂度 5. 插入5.1 算法实现5.2 复杂度分析 6. 删除6.1 区间删除6.2 单元删除6.3 复杂度 7. 唯一化7.1 实现7.2 正确性7.3 复杂度 8. 遍历8.1 实现8.2 复杂度 9. 总结 0.概述 …

vue3引入图片 无法使用require, vue3+vite构建项目使用require引入包出现问题需要用newURL来动态引入图片等静态资源

在vue3中 require引入图片的本地资源报错Uncaught (in promise) ReferenceError: require is not defined <template> <img :src"imageSrc" alt"My Image"> </template> <script> import imageSrc from /assets/image.png; export…

多媒体技术如何为地震体验馆增添更多真实元素?

近年来&#xff0c;为提升公众安全意识&#xff0c;众多体验式科普展馆纷纷崭露头角&#xff0c;其中地震体验馆尤为引人瞩目&#xff0c;成为学校安全教育的热门场景&#xff0c;接下来&#xff0c;我们就深入探索一下&#xff0c;这种运用了多媒体技术的地震体验馆&#xff0…

有哪些好用的电商API接口(京东|天猫|淘宝商品详情数据接口)

此API目前支持以下基本接口&#xff1a; 如何获取此API测试权限&#xff1f; item_get 获得淘宝商品详情item_get_pro 获得淘宝商品详情高级版item_review 获得淘宝商品评论item_fee 获得淘宝商品快递费用item_password 获得淘口令真实urlitem_list_updown 批量获得淘宝商品上…

云计算中的过度授权:安全隐患与应对策略

云计算凭借其弹性、可扩展等优势&#xff0c;已经成为诸多企业组织拓展业务的重要基础设施之一。然而&#xff0c;与传统IT架构相比&#xff0c;云计算环境的安全管理也面临着新的挑战。过度授权 (Overprivileging) 便是云安全领域亟待解决的主要问题之一&#xff0c;本文将带领…

开源模型应用落地-LangChain高阶-知识图谱助力记忆增强

一、前言 通过langchain框架调用本地模型&#xff0c;使得用户可以直接提出问题或发送指令&#xff0c;而无需担心具体的步骤或流程。langchain会自动将任务分解为多个子任务&#xff0c;并将它们传递给适合的语言模型进行处理。 本篇通过使用 ConversationKGMemory 组件&#…

MySQL简解

文章目录 1. MySQL框架2. 执行流程2.1. 连接池&#xff1a;2.2. SQL 前端(SEVER)2.2.0. 查询缓存2.2.1. SQL 接口2.2.2. SQL 解析器2.2.3. SQL 执行器2.2.4. INNODB 中读写操作 2.3. 数据的保存形式 3.其他重要概念3.1. 索引3.1.1. 简单概念3.1.2. 索引优化&#xff1a;1. Usin…

【复现代码——环境配置】

目录 一、复现代码举例二、创建环境——选择一个Python版本2.1 创建基本环境2.1.1 基于AutoDL2.1.2 基于PyCharm 2.2 终端激活环境2.3 退出环境2.4 删除环境 三、PyTorch安装3.1 查看cuda3.2 安装PyTorch 四、其他依赖安装4.1 tensorboardX4.2 matplotlib4.3 medpy4.4 visdom4.…

stable-diffusion-webui安装与使用过程中的遇到的error合集

stable-diffusion-webui1.9.2踩坑安装 1. 安装过程1.1 stable-diffusion-webui1.2 在win11或win10系统安装&#xff0c;需修改两个启动脚本1.2.1 修改webui-user.bat1.2.2 修改webui.bat 1.3 双击 webui-user.bat 启动脚本1.3.1 no module xformers. Processing without on fre…

实体书营销:“三三裂变”,实操细节分享……

实体书营销:“三三裂变”,实操细节分享 一、实验结果 “三三裂变”的实验,结果比较好。就是我们大概有300人报名,但实际行动的只有109人,大概有103人都完成了三个人的目标,也就是说我们通过109人裂变了475人,利润率是1:4.5左右,整个裂变的效率还是可以的,也就是说: …

阿赵UE学习笔记——30、HUD简单介绍

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎&#xff0c;这次来学习一下HUD的基础使用。 一、 什么是HUD HUD(Head-Up Display)&#xff0c;也就是俗称的抬头显示。很多其他领域里面有用到这个术语&#xff0c;比如开车的朋友可能会接触过&#xf…

后端工程师——Java工程师岗位要求

在国内,Java 程序员是后端开发工程师中最大的一部分群体,其市场需求量也是居高不下,C++ 程序员也是热门岗位之一,此二者的比较也常是热点话题,例如新学者常困惑的问题之一 —— 后端开发学 Java 好还是学 C++ 好。读完本文后,我们可以从自身情况、未来的发展,岗位需求量…

适用于手机蓝牙的热敏晶体FA1612AS

EPSON推出的一款1612小尺寸无源热敏晶体:FA1612AS。FA1612AS的额定频率为38.4Mhz的晶体单元&#xff0c;采用无铅材料&#xff0c;符合ROHS标准&#xff0c;内置热敏电阻&#xff0c;可用于移动电话&#xff0c;蓝牙等。热敏晶体FA1612AS的产品特性:额定频率:38.4MHZ外部尺寸规…

上海亚商投顾:沪指缩量调整 有色、煤炭等周期股集体大跌

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日缩量调整&#xff0c;午后一度跌近1%&#xff0c;黄白二线走势分化&#xff0c;微盘股指数涨超3%。军…