一个机械工程师也谈谈对数据和领域建模的理解

前言:最近jBeanBox项目收尾,感觉用Java初始化块来代替Spring的XML配置这种模式挺好的,手中有了这把锤子,于是看什么都象钉子,这不,又看上了Hibernate, SSH三兄弟,紧跟在Spring后面,也是用XML或Annotation配置,配置也是固定的,不能在运行期动态生成和修改,好了,钉子就是它了。新项目名字都想好了,就叫jSQLBox,用来代替Hibernate。对了,顺便看看Hibernate还有什么其它毛病没有? 可是找来找去,没发现什么缺点,除了太复杂之外,想不出有什么问题。如果只是为了给Hibernate增加一个配置方式而重新发明一遍轮子,岂不是很可笑了,不行,一定要找出点毛病来,没病也得挑出病来。于是左看右看,也不知是我眼花了还是看的时间太长了,现在越看越觉得Hibernate象是一个过度设计的例子。于是本吐槽文诞生了,Hibernate的铁杆拥趸们可以不用看了,因为本文的目的就是贬低Hibernate,借以抬高这个八字还没一撇的jSQLBox。

开始前,先澄清一下"领域逻辑"和"领域模型"这两个词的区别,"领域逻辑"表示企业的内在业务规律,与是否使用了软件无关,这一点应该没什么疑问。 "领域模型"从中文字面理解应该是一个企业的业务模型,与软件术语无关,但是这个词在Martin的《企业架构》书中被转换成另一个含义,就是建立在面象对象基础上的概念模型,模型本身包含数据和行为,这与软件工程中的对象模型概念恰好一一对应,于是"领域模型"往往和"对象模型"等价,并且由面象对象软件来实现。 "领域模型"不是本文讨论的重点。但是笔者的观点是企业应用恰恰是 "领域模型"不能发挥作用的场合,这属于个人观点,如有不同意见请先别拍砖,听听我的理由:1)当一个问题复杂到用表格不能处理,必须借助面象对象模型来实现的地步时,通常已经非常复杂或冗长,已超出了人能理解和操纵的范围,适合计算机处理;而企业逻辑通常和人、钱、物打交道,逻辑简单,是能被企业中的业务专家理解和解释的,用复杂的模型来解决本质上很简单的问题是把问题复杂化。企业业务专家的头脑中基本没有对象、继承这些概念,他们的头脑中通常是一张张数据表,典型的代表就是企业会计,和他们谈面象对象是对牛弹琴。来到哪个国家,就要说哪个国家的语言,这才好交流。2)解决复杂问题的面象对象模型通常不是并发访问的,因为业务本身的复杂性使得并发访问编程难度极大,也就是说当你想解决的问题越来复杂时,业务本身的并发限制就越来越高,就越来越不能被称作企业应用3)面象对象模型通常用树或图结构来表示,往往必须用专用格式来保存,很难用统一的格式来存储,例如Office文档、三维制图、电路排版软件、网页文档等,它们各自有自已的专有文件格式,虽然有XML之类的通用格式,但显然XML是一种树结构而不是可以放进数据库的表结构。个别情况下,对象模型本身就是持久层,如电路板布线图,打印出来就可以用于生产排版。当一个面象对象模型可以用O-R工具来映射成数据库表保存时,只能说明这个模型太简单了,简单到可以直接用少数表格来表达了。4)面象对象模型是随着计算机技术进展才出现的,最常见的应用场合是在计算机帮助下可以建立以往人力不能建立的复杂模型,建模经常是工作的全部或重点;而企业应用建模本身不是重点,因为企业逻辑在面象对象概念提出之前已经存在,软件只是对企业逻辑进行表达和梳理,帮助企业逻辑更好地运作而产生效益。综上而言,用面象对象这个工具来处理企业应用,很可能是杀鸡用牛刀了,牛刀能不能杀鸡? 当然能,但是要练好牛刀很难,让一个开发团队都练好,更难。
在"领域模型"和"领域建模"出现之前,企业应用软件开始编制前,也是要建模的,这通常表示为互相关联的表格,并辅之以文字或图形、线条等来表达这些表格之间的关系,这就是传统的E-R模型(即通常说的”数据建模”)。本文以图1来说明一种基于数据(表)建立企业逻辑模型的优点,(如因转载原因不可见,请打开此图所在网页: https://github.com/drinkjava2/jSQLBox图片文件名为p1.png,因为下文都是基于此图展开讨论)

[img]http://dl2.iteye.com/upload/attachment/0120/1751/e525fbd5-9631-31c9-b38e-140043854e79.png[/img]

这是我两年前做的一个给公司内部使用的小型MRP程序中提取的数据库建模局部截图,它建立在E-R图基础上,但略有不同,E-R图常见的键关联线没有了,CRUD方法也不会出现在上图,因为不仅太小儿科了,而且干拢了真正的企业逻辑。取而代之的是添上了反映业务逻辑的线条(原图全是黑线,为了讲解本例加粗并上色)。上图线条表示各个字段间的约束或驱动关系,每根线条我称其为领域逻辑线,因为它具有与编程语言无关,与界面无关,只反映业务逻辑,比较稳定的特点,这个例子比较简单,只有数据的驱动关系线,没有约束、检查关系线,也没有用到角色(数据可以驱动角色,角色也可以驱动数据,例如一个标记字段驱动一个审核角色,审核完后又驱动这个字段,然后这个字段又开始驱动下一下审核角色…,日期也可以作为一个驱动的来源,等等)
这里只解说一个业务:收货并销单:
这是一个小企业,业务比较简单,库管收货后稍作检查,立即入库和销订单,以下演示从收到1个部件号为”001”的部件的入库流程,以下伪程序脚本,包含在一个事务中(看不懂没关系,只知道有很多步骤,一个步骤对应一种颜色的线就行了):
第1步(红色字): 订单收货记录表(POReceiveing)收货1件(ReciveQTY =1)
第2步(蓝线): 订单明细表(PODetail)收货数加1 (Received = Received +ReceivedQTY)
第3步(紫线): 更新未交订单数量=订单数-收货数(BackOrder =POQty-Received)
第4步(蓝线): 更新库存表(Part)未交货数(PendingPOs =selectsum(backorder ) from PODetail where PartID=”001”)
第5步(绿线):更新可用库存数=当前库存数-预订数+未交货数(StockAvailible=TotalCurrentStock-StockOnHold+PendingPOs)
第6步(橙线):更新库存短缺数=安全库存数-可用库存数(Shortage=SafetyStockLevel-StockAvailible)
第7步(红线):更改当前实际库存数 (TotalCurrentStock= TotalCurrentStock+ ReceivedQTY)
第8 步(黄线和青线):新增一条库存变动记录 (oldQTY=上次库存数,newQTY=TotalCurrentStock,变动数量ChangedQTY=NewQTY-OldQTY)
第9步(绿线)同第5步
第10步(橙线)同第6步
以上是一个完整的收货并销单的操作,这是一个典型的(臭名昭著的)事务脚本式操作,UI调用Service, Service里用10个步骤直接操作数据库并打包在一个事务里,见图2。

[img]http://dl2.iteye.com/upload/attachment/0120/1753/b0c7d8b3-ec8b-32cb-8faf-eb28a9eba9ee.png[/img]

数据建模+事务脚本模式的优点有:
1)实现上,领域逻辑和事务脚本一一对应,技术简单成熟,非常利于领域逻辑到实际代码和单元测试的转化,开发快,项目成功率高,即便是很烂的数据库设计(例如图1中库存表和部件号表共用一张表且承担了需求分析的重任) 和怪异的客户需求(我上一个项目是先发货出厂,再将流水线上的货收入库),只要领域逻辑线条都划上去了,一根不缺,能够自圆其说,不出现循环调用等业务逻辑错误,项目就不大可能失败(外部因素除外)。
2)没有什么高深的理论,就是一张张表格,便于和业务人员交流,表格和线条是业务人员能理解的语言。我公司机械设计部门经理(他是MRP需求提出人)将图1(全图)打印在A3纸上贴在墙上研究,他看懂了整个流程。

事务脚本模式的缺点有:
1) Service太厚重,所有逻辑放在同一个事务脚本中,不同需求所对应脚本有可能存在重复代码,不利于维护。
2) 对数据库有重复读写现象,加大数据库负担。
3) 单元测试必须依赖数据库。
4) 当领域逻辑非常复杂时,或数据库设计人员对业务不精通或对表格、字段设计不合理,上图中的线条可能非常多且杂乱。另一个极端是,程序员根本就不知道使用绘图工具,很难掌握复杂的领域逻辑关系。事实上,目前建立在事务脚本基础上的很多项目,可能根本就没有类似图1的领域逻辑模型,拿到需求,直接开工裸奔了,这简直是在跟维护人员开玩笑。作为一个机械工程师,设计的第一步就是总装草图,图纸的归档也是以总装图为纲。如果我设计的仪器没有总装图,第二天就得卷铺盖回家了。所以,如果我是软件项目经理,第一件事就是让程序员去学AutoCAD,做软件的为什么不能学学做机械的画个总装图呢? 太复杂A3纸画不下可能用A2纸,再画不下还可以用1号、0号图纸。Google一下”领域模型图”,出来的大多是一个个孤伶伶的小方块,之间用一两根反映一对多,多对一之类的线单薄地连系着,在一个机械工程师的眼里,这种图太简单了,和小孩玩具似的,没有什么实用价值,反映不出复杂的多表业务装配关系,和只有单薄的键关联线的E-R图基本就是一路货色。UML有许多种图形,但能拿出来和机械的总装图概念相比,能够反映模块间装配细节的,还真没有。

对于事务脚本缺点的四个缺点,下面我们逐一分析:
1)Service所有逻辑放在同一个脚本事务中,多个不同脚本间存在重复代码。如果是业务本身重复了,在逻辑图中就可以看出来同一个位置有两根线,如果确认这两根线代表了相同的业务逻辑(AutoCAD可以无级放大,在线上可以加小号的文字或图形说明),直接删除其中一根线即可。一些数据访问代码之类的重复,可以将这些底层代码放在公共子程序中。上例中的脚本一共有10步,基本上对应10个子过程调用。对于业务上上永远绑定在一起的逻辑,可以将它们打包在一起,如上例中当前库存数的变动,将总是触发绿、橙、黄、青四色线条,则可以将这四个子过程打包成一个,这样在Service中总的脚本数将减少。上例是用Delphi做的,实际编程中也是这样实践的。对于Java来说原理一样,只不过通常利用Spring的声明式服务,将公共子程序移到了单例Service类中,单例就等于全局静态方法,自已不能有局部变量保持状态,所有参数放在方法参数里传进来。配成单例的唯一目的就是为了在创建时利用Spring生成代理单例,从而实现声明式事务而已。静态方法很难在运行期知道方法的名字,除非用编译期预处理的方式,否则不能根据方法名在事务上做花样。基于事务脚本的程序,方法就代表了业务逻辑,是一等公民。至于方法放在哪个类里,并不太重要。因为在总装图里,代表业务的那根线条始终在那个固定的位置。可能会变化的企业逻辑,可以放在单独的service中,固定的逻辑,不需要考虑重构的,可以写死成数据集的属性方法或service的子方法,当其它业务逻辑访问数据集属性或service时自动触发子方法,这样可以减少事务中重复脚本数量,通过以上优化,10步脚本最终可以简化成2个脚本,其余的脚本将自动被触发。当然这是比较理想的业务之间存在固定的联动关系,实际中是否允许自动触发要视业务本身的松紧藕合来定。
2) 对数据库可能有重复读写现象(例如上例中9、10与5、6重复了),加大数据库负担 (我瞎估计大约在2~10倍之间) ,这是个难点,不太好克服。如果不较真的话,可以无视,因为这是一个性能问题,现在的电脑足够快了,通常性能不是问题,如果真成了问题,还可以用钱来解决。钱能解决的问题对于软件业来说就不是问题。但是如果钱少,又要较真的话,或手工在事务脚本里维护一个业务数据缓存,但会造成子程序反向依赖于上层脚本的严重问题;或使用类似于Hibernate之类的具有一级缓存的,具有脏数据检查功能的ORM或Active Record工具,同一事务中对数据库的访问先从一级缓存中找,从而实现跨越多个子过程的透明持久化(如果Hibernate只能选一个优点,我会投透明持久化这一票,透明持久化的本质是减轻数据库压力)。如果找不到合适的透明持久化工具,可以暂时用Hibernate代替。但个人不是太喜欢Hibernate,因为太复杂了,而且容易被误用成面向对象建模,不符合本文提倡的面向数据库建模的思路,即然都沦落到了下嫁数据库表格的地步,还与对象打得火热,也不想想对象的数据结构可能和表结构不匹配。大多数面向对象软件用户从不花时间考虑如何存储的问题,只有Hibernate是个特例,使用者不仅要考虑,还必须是专家,因为这是企业应用。不仅需要了解每个数据表字段对应哪个对象属性,同时也要了解每个字段对应哪个业务属性,必要时要调用原生SQL。我构想中的JSQLBox工具应该和Hibernate极为相似,具有它的大部分功能但是去除对象的关联这块,只需要面向数据库而不用考虑面向对象,设计上基于ActiveRecord,这样Dao可以成为ActiveRecord的属性,Session(等同数据库连接)在Spring或jBeanBox(此处纯属广告)的声明事务中注入Dao,不再需要显示获取和注入DAO和Session,脚本中甚至可以直接调用ActiveRecord类的CRUD方法,对简化编程非常有效。 目前已经有很多ActiveRecord工具与上述描述功能类似,但是剔去对象关联不谈,总体功能上反倒都不如Hibernate好用,主要体现在不支持setter方法名重构、缺少透明持久化、原生SQL包装不好或是重新发明另一套SQL语法,当然Hibernate的强势使得它们不流行从而缺少开发者也是一个因素。顺便提一下,面象对象模型和基于ActiveRecord的面向数据表模型,都可以模拟复杂的数据结构,这是它们能解决复杂问题的根本,数据库表也可以表达图、树等结构。如果对象和数据库结构不匹配,就成了麻烦的根源。但是如果对象和数据库结构设计成一模一样,那我要你对象干什么? 绕个弯回来一看,哦,领域建模和数据库建模画出了两张一样的模型图!不同于Hibernate的POJO对象,ActiveRecord模式占用了宝贵的Java单继承,但是ActiveRecord本身就是数据库的一部分,从静态结构来说,数据库本身就可以表达任意结构的数据结构,从动态来说,业务逻辑线就代表了方法,面向数据库建模同时已经具备了数据结构和方法两大编程要素了,这和面象对象模型是相通的,所以有了ActiveRecord就不再需要重复面象对象建模了,使用面象对象时语法糖多一点(对象设定关联后,不用手工来加载),但是业务模型本质是一样的(也必须一样)。至于面象对象的另一要素“封装”,在企业应用中就是个笑话,企业逻辑的代名词就是“不讲道理的,存在即合理的逻辑”,任何不相干的属性,在下一个需求变更中都有可能发生关联,每一笔发货之前可能发生更改部件号和电话号码这种不常见的关联(地下工厂?),也可能关联计算厂长外甥去年这个月收入这种匪夷所思的需求。所以,忘了封装这码事吧。当然,如果你能拍板,把外甥开除是干净利落得到一个漂亮模型的好方法,可你只是个敲码工,总不好意思对厂长说“把外甥开除吧,这样我编程序会容易一些”,所以还是老老实实地实现这些怪异的需求,就把数据表的每个字段都当成public的就好了。
3) 单元测试必须依赖数据库。测试时每次清空数据库填充数据,可能有点麻烦,但个人认为这是个可以忍受的小问题,可以无视。但即然有这个问题,那就顺便提一下。如果使用跨数据库的工具(如Hibernate或想象中的八字没一撇的jSQLBox)来填充数据是可以做到测试代码不依赖于特定数据库的(原生SQL除外,但原生SQL本身也是易移植的)。Mock数据库倒象是个反模式。

4) 领域逻辑非常复杂时,类似于图1的领域逻辑图会很大(真有可能用到0号图纸),且很复杂,从而很难读懂和检查错误。这个问题的解决我有几个思路,或者说是猜测,因为我只是个画图的,编软件纯属客串,没碰到过复杂的业务模型:
第一种可能:领域逻辑图的设计人员有问题,更换一个对业务更熟悉的数据库设计人员即可以加以优化。
第二种可能:同时具备规模非常大(即数据库表格很多)且非常复杂(表格间关联关系象蜘蛛网一样纵横交错,见图3)的领域逻辑根本就不存在或根本就是个错误的假想中的业务设计,因为企业模型是和人打交道的,太复杂的逻辑不光是设计人员设计不出来,使用它的人也会无法理解,所以不用担心领域逻辑图会复杂到不能设计出来和不能读懂,一个好的业务逻辑体现在图纸上也必然具有高内聚,低耦合的特性,见图4。

[img]http://dl2.iteye.com/upload/attachment/0120/1759/f6666ca4-069e-3b7d-a00b-383b4e184a93.png[/img]

这不是巧合,这和人脑处理问题的方式有关,人脑不习惯处理一堆乱麻的信息,人类社会早就把具有紧密关联的事物划在一起以方便处理,这是这个社会运作的基本道理,是已经存在的事实现状,我们只需要乐享其成就行了。(很多ERP实施失败的原因就在于模型虽然完美,但是太复杂了,超过了使用者在有限的培训时间里能理解的极限;或是将本来是松耦合的模块作了太多关联,严丝合扣,导致一个部门的停顿会使得整个系统停摆。) 请记住一个关键(重要事情说几遍来着):企业应用是所有软件类别中比较简单低等的一类,它必须简单到被业务人员提出和使用,必须简单到能很快被业务外行的程序员理解。
第三种可能是:表格多且表间连线又多又复杂的企业应用确实存在(虽然怀疑这点),那么可以参考集成电路排版,利用一个类似电子板自动布线软件(这个倒是真正面向对象的了)来代替AutoCAD手工布线,把线布置得规距平整,线上可以附注解,可以帮助设计和阅图人员更容易读懂图,这里布线成了重点,目前一些工具如Rose或PowerDesigner之类的,可能已经已有此功能,也可能没有,我不是太熟悉。甚至有可能利用软件来自动生成所有子程序名称,单元测试过程名称,从总体架构上把软件粗略搭出个草稿出来,因为基于数据库表设计的模型是接地气的,表模型即等于数据库表,线条即等于方法名(驱动方法、约束方法等),而且我猜规模越大、线条越多的结构图,单个方法反而越简单,道理同上,因为符合人们处理事物的方式,看看集成电路上成千上万个晶体管就知道了,越是复杂的芯片数量越少,越是简单的芯片数量越多。

综上所述,基于数据建模的事务脚本优点很多,缺点有一些但还是有办法改进,相比于问题重重,甚至有些疑问连专家都讲不清的领域建模来说,数据建模+事务脚本无疑应是以完工为第一目标的程序员的首选。至于可维护性,如果能做到始终保持代码和数据模型线图大体一致,可维护性也是很好的,不管再复杂,线条多少,哪怕一天复制粘贴一万行代码,如果概念上清晰就不容易出错,可维护性不见得与代码行数相关。另外说一下,数据建模并不完全排斥面象对象,在某些局部场合例如 BOM的展开计算,可以将BOM表读入内存后转为对象树结构以方便操作,这是局部利用,但整个系统没必要全改成对象,还是以数据建模为主。实际上ActiveRecord也是一种对象,只不过是一种和数据库表格行一对一的贫血的对象而已,即使把业务逻辑方法写进去等待自动触发,它还是贫血的,因为逻辑方法只属于总装图或局部总装图,不属于哪个数据表,要随时做好把方法删除、修改、移出去的心理准备,原因只有一个:因为这是不讲理的企业应用。另一方面数据建模与对象建模是相通的,可以看成是对象建模的初版。如果方法与模型紧密结合,可以写在模型方法里,或是几个模型之间关系紧密且没有属性直接与外界关联,可以打包成一个对象来管理,则数据建模自然进化为对象建模。对象建模随着业务需求的复杂化和不讲理化,私有字段不得不与外界产生关联,也有可能会退化为单纯贫血的数据模型。这里对业务的熟悉程度和对业务变动可能性的预测是关键,如果对业务不熟,为了提高项目成功率,可以从数据建模开始,在建模和优化(甚至原型的运行和反馈)过程中归纳出业务规律,正确的业务模型不是从天上掉下来,而是对总装图的逐步优化得来的。但如果对业务了然于胸,且精通面象对象技术,可能头脑中自然就能形成一幅高内聚,低耦合的业务逻辑图,从而一开始就采用对象模型,自顶向下地细化,但缺点有:1)对此人的业务水平要求极高 2)没有总装图的帮忙,很难做到不遗漏复杂的企业逻辑 3)对象建模有可能与数据库模型结构相差太远,业务无理化后往贫血模型退化的难度相当大。

以上内容纯属个人见解,如有不同见解者,请试举一实例来反驳,有哪个企业应用不能用数据建模(加上领域逻辑线)的方式来表示业务逻辑,而必须用领域建模来表示的? 或是用了领域建模之后,不能用数据建模方式来表达的? 或是使用领域建模在建模速度和项目完成时间,远远快于用数据建模的方式来实现的? (这里先不谈可维护性,因为目前大多数事务脚本项目都没有我所说的这种总装图,这是不才两年前才发明的,如有雷同将是纯属巧合了。)
AI时代测试工程师的进化:从代码验证者到质量赋能者 在软件工程领域,自动化测试与质量保障体系是确保软件可靠性的核心技术。其原理在于通过系统化的验证手段,覆盖功能、性能、安全等多维度质量属性,从而在软件交付前发现潜在缺陷。随着AI编程助手(如代码生成模型)的普及,软件开发的生产力范式正在发生转移。这些工具能够高效完成模式化编码任务,但其在复杂业务逻辑理解、非功能性需求满足及系统性风险识别方面存在固有局限。这为测试工程师创造了新的技术价值:从执行重复用例转向设计智能质量策略、构建AI增强型测试工作流,并成为复杂系统与业务逻辑的关键守护者。通过掌握测试开发、领域建 阅读详情

相关推荐

用韩剧《Start-Up》做AI领域建模:场景反向工程实战指南

在AI工程实践中,‘领域建模’是连接业务需求与技术实现的核心能力,其本质在于从真实场景中抽象出可计算的结构化逻辑。传统教学常困于数据干净但脱离语境的‘Hello World陷阱’,而影视作品如韩剧《Start-Up》恰恰提供了经专业提纯、文化嵌入、节奏严整的高保真需求现场——它天然承载着产品定义、技术选型、合规适配与团队协作的完整决策链。通过场景反向工程(Scenario Reverse Engineering)方法,工程师可将剧中人物动线、白板草图、API调试过程等叙事元素,映射为UML用例图、PRD需求

weixin_33713503的博客 408

DDD领域驱动(四)——之领域建模

前边两篇,我们讲述为什么用DDD?DDD如何做好需求梳理?DDD如何在系统的层面拆分为粗细粒度合适微服务,以及微服务的架构划分。也就是我们经常说的自顶向下的拆分,现在我们将要做的功能具体拆分到具体的服务上了,也有了菱形架构、四边形架构等骨架,那么接下来就需要我们进行领域的建模了,也就是传统软件设计中的详细设计了。先看下,这个阶段的重要点: 好,先说一下,我们传统的软件详细设计都是怎么做的?ER图进行业务抽象建模,根据ER图进行数据设计,功能流程图、时序图,数据流图,类图、状态图等通过抽象分析设计表、流

学会改变自己——才能突破 6457

GLM-5如何实现工程级AI编程:从需求理解到PDF设计文档生成

在现代前端与全栈开发中,'工程化AI编程'正从概念走向落地——它指的不是简单代码补全,而是模型对系统约束、技术选型、持久化方案及跨平台兼容性的深度建模能力。其核心原理在于将软件开发过程解耦为领域建模、约束映射与接口契约三层推理链,从而支撑真实可交付产物(如300KB结构化PDF设计文档、IndexedDB事务方案、Web Worker图像隔离策略)的自动生成。这种能力显著提升原型验证效率、降低技术债风险,并已在微信读书EPUB解析、美图秀秀滤镜加速、AI大富翁事件溯源等典型Web应用场景中完成闭环验证。GL

all00747的博客 446

java架构-领域模型

什么是领域驱动设计?[面试6.0] 领域驱动设计(DDD,Domain-Driven Design),在软件开发前,通常需要进行大量的业务知识需要梳理,然后才到软件设计的层面,最后才是开发,而在业务知识梳理的过程中,我们必然会形成某个领域知识,根据领域知识来一步步驱动软件设计,这就是领域驱动设计的基本概念 为什么要用领域驱动模型?[面试6.0] 统一思想: 拥有统一语言,使得业务,产品,开发对问题的认知可得到统一边界分离: 限界上下文用来区分业务边界,使得业务更加清晰明确分工: 可以明确定义领域并形成

阳光码术-Java面试宝典 1251

软件研发黑盒验收时代:AI驱动下的质量保障与工程师转型

软件测试中的白盒与黑盒方法是保障软件质量的核心概念。白盒测试关注代码内部逻辑与实现细节,而黑盒测试则聚焦于输入输出是否符合预期,强调结果导向。随着AI大模型和自动化测试技术的突破,软件研发的验收范式正从过程可见向结果验证演进。这一转变的技术价值在于提升研发效能与业务敏捷性,通过智能测试用例生成、视觉回归测试等AI驱动手段,构建强大的自动化验证网络。在实际应用场景中,工程师的角色从代码实现者转向架构设计者与验证定义者,更专注于系统架构、复杂问题拆解及人机协作流程设计。在此背景下,软件研发正步入以功能达成为核心

weixin_29314405的博客 301

领域模型代码示例

领域模型代码示例

java DDD领域分层架构设计思想

优点:相比于三层方式,更关注领域服务,即业务核心逻辑的划分、收敛缺点:分层复杂, 如果业务逻辑简单没有必要适应场景:业务复杂的业务

感冒石头的博客 2881

机械工程设计分析和MATLAB应用(第二版)

这个资源可提供机械工程设计中的带传动、凸轮设计、弹簧设计、齿轮传动设计等常见的机械设计程序代码,另有优化设计的部分内容。

一文教你认清领域模型和数据模型

依稀记得我第一次设计一个系统的时候,画了一堆UML图,面对Class Diagram(其实就是领域模型),纠结了好久,不知道如何落地。因为,如果按照这个类图去落数据库的话,看起来很奇怪,有点繁琐。可是不按照这个类图落库的话,又不知道这个类图画了有什么用。 现在回想起来,我当时的纠结源自于我对领域模型和数据模型这两个重要概念的不清楚。最近,我发现对这两个概念的混淆不是个例,而是非常普遍的现象。其结果就是,小到会影响一些模块设计的不合理性,大到会影响像业务中台这样重大技术决策,因为如果底层的逻辑、概念、理论基础

我的新书《代码精进之路:从码农到工匠》 1万+

Java领域模型驱动设计案例

什么是领域(Domain)? 我们所做的软件系统的目的都是来解决一系列问题,例如做一个电商系统来在线销售自己企业的产品;做一个灰度发布平台来提升服务的质量和稳定性。任何一个系统都会属于某个特定的领域,例如: 论坛是一个领域:要做一个论坛,那这个论坛的核心业务是确定的:比如用户发帖、回帖等核心基本功能; 电商系统是一个领域:只要是电商领域的系统,那核心业务就是:商品浏览、购物车、下单、减库存、付款交易等核心环节; 同一个领域的系统都具有相同的核心业务,因为他们要解决的问题的本质是类似的。因此可以推断:一个领域本质上可以理解为一个 问题域 。只要确定了系统所属的领域,那么这个系统的核心业务,即要解决的关键问题就基本确定了。通常我们说,要成为一个领域的专家,必须要在这个领域深入研究很多年才行,只有这样才会遇到非常多的该领域的问题,积累了丰富的经验。

python中frida的安装+frida-server(雷电模拟器)保姆级安装教程

frida的安装,安卓逆向,adb

2301_80224944的博客 4583

当代码遇见智慧:测试工程师的进化之路

AI正在重塑软件测试行业,自动化率已达73%,但并非取代测试工程师,而是改变工作模式。AI提升了测试效率(用例生成效率提升170%),将测试人员从重复劳动中解放出来,转向更高价值的战略工作。未来测试工程师的核心竞争力在于:1)业务深度洞察(如金融安全、医疗伦理等场景理解);2)质量文化塑造(用户体验感知);3)AI模型训练与校准。行业建议测试人员转型为"风险洞察者",掌握Prompt工程等新技能,建立人机协同评审机制。AI消除了执行鸿沟,却凸显了人类在复杂业务理解和用户价值守护方面的不可

2501_94471289的博客 487

机器视觉--线扫相机触发:从原理到选型,构建高效成像方案

本文深入解析线扫相机触发技术,从硬件编码器触发到软件触发方案,提供详细的性能对比和选型指南。通过实际案例展示如何构建高效成像方案,特别适合机器视觉领域需要精准控制的应用场景,如工业检测和自动化生产线。

weixin_42531886的博客 418

SysML v2:为什么这是系统工程师的“建模瑞士军刀“?[特殊字符]

想象一下,你正在设计一个复杂的航天器系统,需要同时处理机械结构、电子系统、软件控制和热管理。传统的建模工具让你在不同工具间来回切换,数据一致性?不存在的!这就是SysML v2要解决的痛点——为复杂系统工程提供一体化建模方案。 ## 从"拼凑工具"到"统一语言"的进化之旅 曾经,系统工程师的工作台是这样的:机械工程师用CAD,电气工程师用EDA,软件工程师用UML,每个人都在自己的"方言"里工

gitblog_00288的博客 71

Java开发者必备:Ollama4j客户端库全面指南与实战

在AI应用开发领域,本地部署大型语言模型(LLM)已成为降低成本和提升隐私安全的重要趋势。其核心原理是通过REST API与模型服务器交互,实现文本生成、对话和语义理解等功能。这一技术为Java生态系统带来了显著的工程价值,使开发者能够便捷地将AI能力集成到企业级应用中。Ollama4j作为一款专为Java设计的轻量级客户端库,通过封装底层HTTP通信和JSON处理,提供了类型安全、面向对象的API,极大地简化了与Ollama服务器的交互。它全面支持流式生成、多轮对话、嵌入向量计算以及高级的**工具调用**

weixin_28295799的博客 438

Python爬虫实战:5分钟搞定Web of Science文献批量导出与解析(附完整代码)

本文提供了一套利用Python爬虫技术,快速实现Web of Science文献批量提取与解析的完整方案。通过解析官方导出的HTML文件,结合BeautifulSoup和pandas库,可将文献数据自动转换为结构化的Excel/CSV表格,帮助科研人员高效管理文献信息,节省大量手动整理时间。

weixin_29050513的博客 1168

程序员的设计主权:用契约思维掌控需求变更

软件设计主权是指开发者通过定义稳定的技术契约(如领域模型、能力接口、配置规范)来主导系统演化的节奏与边界。其核心原理在于分离‘不变的骨架’(如状态机、数据一致性规则)与‘可变的血肉’(如UI样式、业务参数),借助IoC、ADR、领域建模等手段实现弹性扩展。这种思维不仅提升应对需求变更的确定性与响应速度,更将开发角色从被动实现者升维为规则制定者。典型应用场景包括支付渠道接入、营销活动配置化、遗留系统渐进重构等。本文聚焦于如何在真实项目中落地契约驱动的设计主权,尤其结合领域建模与控制反转两大热词,构建可演进、可

dejz8829的专栏 416

英飞凌TC3xx的GTM模块到底有多强?从PWM生成到电机驱动,一篇讲透车载定时器核心

本文深入解析英飞凌TC3xx系列中的GTM模块在汽车电子领域的强大功能,从PWM生成到电机驱动的全链路设计。通过模块化架构和硬件级解决方案,GTM显著提升系统精度和响应速度,适用于电机控制、电源管理等复杂场景。文章结合实战经验,详细拆解GTM的技术实现和性能优势。

weixin_27741699的博客 204

AI 时代还需要招程序员吗?用人逻辑变了,但答案不是“不招“

两个中小公司老板在同一个季度做了相反的决定。一位把技术团队从六人裁到两人,理由是"AI 都能写代码了,留两个维护就行";另一位逆势招了两名资深工程师,理由是"别人都在裁,现在捡漏便宜"。半年后第一位老板的麻烦来了:剩下两人每天忙着用 AI 生成代码,但没人有能力判断这些代码该不该合入,积压的线上问题开始追不上;第二位老板的账单变厚了,但两个新人的产出确实撑起了新产品线。两个决定哪个更对?这篇文章不急着给答案,先把"AI 替代程序员"这个命题拆开看。

xujinxing的博客 736

信号处理算法:自适应滤波_(8).自适应陷波器

自适应陷波器是一种强大的工具,广泛应用于电力系统、通信系统和生物医学信号处理等领域。通过自适应调整滤波器的参数,自适应陷波器可以在特定频率处形成陷波,从而有效地抑制噪声或干扰信号。常见的自适应算法包括LMS和RLS,它们各有优缺点,可以根据实际需求选择合适的算法。

2401_87715305的博客 1371

2026年国赛C题微网与外部电网电力调控策略 (三):问题三、问题四滚动预测、实时电价与结果核验

专栏内定期更新ABCDE五题详细思路、代码(含运行结果图)和讲解视频-(11号之前半价):问题三看起来只是多给了一个光伏预报附件,实质上它改变了整道题的信息结构:问题四则是在问题二、问题三之上替换价格来源。问题4-2相当于“确定性计划+实时电价”,问题4-3相当于“滚动预测+实时电价”。物理模型完全不变,改变的是价格序列和费用口径。本文先给出核心结果:从结果看,问题3比问题2多约164.21万元,问题4-3比问题4-2多约168.79万元。主要增量不是“储能没有工作”,而是预测误差、计划偏差和紧急购电造成的

YOLO 344

AI时代开发者转型指南:技能重构与实战路线

在AI技术快速发展的当下,软件开发领域正经历深刻变革。传统编程技能如CRUD开发正被AI自动化取代,而AI协同开发、领域建模等复合能力成为新刚需。理解计算机原理和算法思维仍是技术纵深防御的基础,但开发者需要掌握prompt工程、自动化测试等AI工具链。通过12周系统训练,可将AI编码效率提升3-5倍,聚焦复杂逻辑设计和业务理解这些AI难以替代的领域。建立包含知识管理、云实验环境的持续学习系统,保持60%以上的不可替代性指数,是应对职业变革的关键策略。

weixin_28694169的博客 297

【git】win 10 / win 11:git 首次拉取云效平台代码详细教程

git 首次拉取云效平台代码详细教程:Git 生成 SSH 公钥、云效工作台添加 SSH 公钥、git 使用 SSH / HTTP 链接拉取云效代码

顾三殇 —— 博客空间(软件测试) 4218

阿里有php的研发团队么,【阿里巴巴】阿里集团-MMC技术部-研发工程师JAVA

职位:阿里集团-MMC技术部-研发工程师JAVA-阿里巴巴【岗位职责】如果你想了解JAVA开发在阿里巴巴互联网生态系统中无与伦比的应用广度与深度; 如果你对基础技术感兴趣,你可以参与基础软件的设计、开发和维护,如分布式文件系统、缓存系统、Key/Value存储系统、数据库、Linux操作系统和Java优化等; 如果你热衷于高性能分布式技术,你可以参与高性能分布式服务端程序的系统设计,为阿里巴巴的产...

weixin_39968266的博客 208

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Agent时代软件工程基础该学什么:从编码到系统构建

随着大语言模型与智能体(Agent)的发展,机械性、模式化的编码工作逐渐被自动化工具接管。这一变化并非让软件工程基础失效,而是推动其向“上游”转移——从强调“写代码”转向强调“定义问题”“拆解任务”与“验证结果”。传统的数据结构、算法、网络与系统原理依然是判断Agent产出质量的地基,但在此基础上,工程师需要新增Prompt工程、任务编排、领域建模、可观测性设计等能力。这些能力共同构成Agent时代新的基本功,不仅适用于个体开发者提升协作效率,也指导技术团队重构能力模型与招聘标准。通过理解Agent的认知局

weixin_34378767的博客 308

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: 用jBeanBox替换Spring内核实现无XML配置的声明式事务服务
下一篇: 一个机械工程师也谈谈对数据和领域建模的理解
Drinkjava2
博客等级 码龄11年 9粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值