写代码犹如写文章: “大师级程序员把系统当故事来说,而不是当作程序来写” | 如何架构设计复杂业务系统? 如何写复杂业务代码?

写代码犹如写文章: “大师级程序员把系统当故事来说,而不是当作程序来写” | 如何架构设计复杂业务系统? 如何写复杂业务代码?

Kotlin 开发者社区 程序员

 

 

“大师级程序员把系统当故事来说,而不是当作程序来写”算法

 

写代码犹如写文章

 

 

好的代码应该如好文章同样表达思想,被人读懂。数据库

 

中心思想: 突出明确编程

 

程序是开发者用编程语言写成的一本书,首先应该是记录开发者对业务需求分析、系统分析,最终用软件实现所思所想的知识的记录与传承。而后再是完成程序放在服务器上运行。后端

 

目录:脉络清晰设计模式

 

书有目录,目录是书中知识的高度提炼和浓缩,具备极强的归纳性,经过阅读目录能提纲挈领地了解全书的主旨和各部份内容,阅读目录能够从总体上把握全书的结构布局,清楚地了解全书各章节及章节与章节之间的逻辑关系,进而能体察做者写做该书的思想和行文脉络。服务器

 

程序有架构设计,软件架构不只显示了软件需求和软件结构之间的对应关系,并且指定了整个软件系统的组织和拓扑结构,提供了一些设计决策的基本原理。数据结构

 

一个项目的软件代码是项目业务逻辑的具体描述,是公司全体开发者共同智慧的结晶。应该如书同样结构清晰能够被人读懂,项目团队的老人写的代码可以被新人按照清晰的目录(系统架构)读懂是项目可维护的基础。一个项目源码随着业务变化、需求增长原有代码可维护、可扩展他就是好的源码。架构

 

这些都是常识性的东西,但实际项目中总会有项目在作这推翻原代码重写新版本的需求,也有新人看着老人写的类代码心里一万只羊驼路过,不知道这个类究竟是完成什么工做,也不知道类中的某个方法究竟是要返回什么结果,由于你发现那些很差的代码一个方法居然会根据传入参数返回不一样类型的值。这样的代码不是要告诉别人本身的想法,而是要别人猜本身的想法。框架

 

至于如何让别人读懂本身的代码其实具体到细节仍是有许多须要注意的,毕竟编程语言不是天然语言,变量命名、注释、分层等等,各位新手朋友们具体在应用中体会吧。

 

做为一个开发者,项目进入编码环节以前,所制定的一切规则均可以叫作软件架构,代码分层、设计模式,每个类的职责,对其的理解与应用是构成了代码实现的总体脉络。进入编码环节以后,合理的代码分层,即将不一样的代码放到合适的层,类的单一职责原则像极了一篇文章的中心思想,方法的单一职责原则也像极了文章的段落,一个是文章中最基本的单位。内容上它具备一个相对完整的意思,在文章中用于体现做者的思路发展或全篇文章的层次。

 

其实写书是要难于写代码的,由于每本书的章节目录都不一样,而软件架构设计是能够同样或者大致同样的,不一样的只是具体业务需求实现的代码有差别,咱们知道有些函数、类都是能够复用的,甚至咱们能够肆无忌惮的参考别人的代码应用到本身的coding中,这自己就给写代码下降了难度,若是抛去如何使用框架、扩展包等等,咱们编码所做的主要工做就只剩下具体业务逻辑的书写,而这部分coding若是细算实际上占整个项目的比例并不高,业务逻辑代码的编写在实际开发中占的比例并不高,软件架构设计的不合理,编码中不遵循架构既定的原则,都会致使大量的时间都耗费在了已写代码的维护与重构上了。

 

软件架构师能够经过出色的系统分析来构建可演进的软件架构,就像给一本书制定大纲,按照其内容设定章节目录,软件工程师则经过良好的设计和编程风格来完成任务。软件架构、设计原则自己都是为了更好的服务于代码的可维护、可扩展性,不然也不会牺牲代码运行效率而被普遍接受与运用。

 

优雅的代码风格:

 

代码简单:不隐藏设计者的意图,抽象干净利落,控制语句直截了当。

 

接口清晰:类型接口表现力直白,字面表达含义,API 相互呼应以加强可测试性。

 

依赖项少:依赖关系越少越好,依赖少证实内聚程度高,低耦合利于自动测试,便于重构。

 

没有重复:重复代码意味着某些概念或想法没有在代码中良好的体现,及时重构消除重复。

 

解耦分层:代码分层清晰,隔离明确,减小间接依赖,划清名空间,理清目录。

 

性能最优:局部代码性能调至最优,减小后期因性能问题修改代码的机会。

 

自动测试:测试与产品代码同等重要,自动测试覆盖 80% 的代码,剩余 20% 选择性测试。

 

https://baijiahao.baidu.com/s?id=1639149189737005850

 

如何才能写出整洁代码?

 

如何才能写出整洁代码呢?总的原则无非是KISS(Keep It Simple Stupid):让代码简单直接,让阅读者能够很容易地看出设计者的意图。<代码整洁之道> 这本书中给出了不少方法与规范,遵循这些规则能够帮你写出更加的整洁代码。

第一章 整洁代码

1,整洁代码力求集中,每一个函数、每一个类和每一个模块都全神贯注于一件事。

2,整洁代码简单直接,从不隐藏设计者的意图。

3,整洁代码应当有单元测试和验收测试。它使用有意义的命名,代码经过其字面表达含义。

4,消除重复代码,提升代码表达力。

5,时时保持代码整洁。

 

第二章 有意义的命名

1,使用体现本意的命名能让人更容易理解和修改代码。

2,编程原本就是一种社会活动。

3,尽力写出易于理解的代码

 

第三章 函数

1,一个函数应该只作一件事(高内聚),无反作用。

2,自顶向下阅读代码,如同是在阅读报刊文章。

3,长而具备描述性的函数名称,好过描述性的长注释。

4,少用输出参数。

5,拒绝boolean型标识参数。

例:CopyUtil.copyToDB(isWorkDB) --> CopyUtil.copyToWorkDB(), CopyUtil.copyToLiveDB()

6,使用异常代替返回错误码,错误处理代码就能从主路径代码中分离出来获得简化。

7,写代码很像是写文章。先想怎么写就怎么写,而后再打磨:分解函数、修更名称、消除重复。

8,编程实际上是一门语言设计艺术,大师级程序员把程序系统当作故事来说。使用准确、清晰、富有表达力的代码来帮助你讲故事。

 

第四章 注释

1,别给糟糕的代码加注释----重写吧。

2,把力气花在写清楚明白的代码上,直接保证无需编写注释。

3,好的注释:

法律信息

提供信息

解释意图

警示

TODO注释

 

第五章 格式

1,代码格式很重要。代码格式关乎沟通,而沟通是专业开发者的头等大事。

2,向报纸格式学习代码编写。

 

第六章 对象和数据结构

1,对象把数据隐藏于抽象以后,只提供操做数据的函数。

数据结构暴露其数据,没有提供有意义的函数。

2,The Law of Demeter:模块不该去了解它所操做的对象内部细节。

 

第七章 错误处理

1, 使用异常而非返回错误码.

2, try-catch-finally, log出错信息.

3, 不要返回null,不要传递null。

NULL Object模式, 例:Collections.emptyList();

 

第十章 类

1,自顶向下原则:让程序读起来就像是一篇报纸文章。

2,method能够是protected,以便于单元测试。

3,SRP:类或模块应有且仅有一个加以修改的缘由。类名应准确描述其职责。高内聚。

4,开放闭合原则OCP、依赖倒置原则DIP

5,变量名、方法名、类名都是给代码添加注释的一种手段。

 

第十二章 迭代前进

1, 紧耦合的代码难以编写单元测试。

2,单元测试消除了对清理代码会破坏代码的恐惧。

3,写出本身能理解的代码很容易,软件项目的主要成本在于长期维护。

4,代码应当清晰表达其做者的意图;测试代码能够经过实例起到文档做用。

 

第十四章 逐步改进

1,编程是一种技艺。要编写整洁代码,必须先容忍脏代码,而后清理!

2,写出好文章就是一个逐步改进的过程。

 

相关阅读:

《重构--改善既有代码的设计》

《代码大全》

《敏捷软件开发》

 

https://book.douban.com/review/5199308/

 

 

 

复杂业务设计与代码开发

 

凭借一句话得到图灵奖的Pascal之父——Nicklaus Wirth让他得到图灵奖的这句话就是他提出的著名公式:

 

“算法+数据结构=程序”

 

 这个公式对计算机科学的影响程度足以相似物理学中爱因斯坦的“E=mc^2”——一个公式展现出了程序的本质。

 

 

首先分析数据结构,也就是一般意义上的表结构。最重要的是区分是否是同一种需求,若是不是,数据结构要尽可能分开。数据结构打好一个很好的基础,上层的接口设计就会顺畅不少。

 

其次是定义内部接口,越复杂的功能,对于外界的接口定义每每越容易,而内部的接口设计每每最容易被忽略。作到如下几点,写起代码来就能更加驾轻就熟。

 

第一,根据对外提供的接口list,列出本身的内部接口list。由于对外接口每每承载着模块的大部分功能,这样能作到简单而有依据。

 

第二,检查内部接口list,真正的作到接口方法功能单一。不要怕内部接口过多,若是实在过多,能够等到写完代码以后再去压缩,由于功能已经完成,因此压缩起来比刚开始设计起来要简单。

 

第三,对于接口参数和返回值的定义要简洁,不要过分利用一个“万能的参数”,多生成几个专用的VO。好比:内部接口参数返回值不用过分使用数据库VO。

 

 

最后是代码阶段。

 

减小引用的传递,避免方法层级过深。

 

不改变引用所指向对象里的值,不然使用的时候不知道以前被改变过而容易踩坑。

 

控制对象或者参数的使用“边界”,一个对象的范围每每仅在提供方和调用方使用,不要在除了这两个地方以外使用。

 

减小静态方法的使用,静态的每每表明着全局的意思。

 

内部数据和接口定义这一块是最容易给本身留“坑”的地方,只有内部的接口设计好了,本身对于业务的理解越深入,业务变更的时候本身越主动。

 

做为一名开发人员,要养成分析需求的习惯,不要一有需求,就想着用懒省事的方法解决,若是没有真的理解需求,而用最少的代码凑合着解决了问题,后续维护起来就会有很大的麻烦。

 

https://blog.csdn.net/a811671856/article/details/51881041

 

如何书写易于维护的代码

 

 

一、流式布局,减小if  else for,增长代码美观度,看起来代码是顺序的

二、数据预处理,入参就是函数能用的数据

三、函数行数控制,越短越好

四、函数职责单一,能拆分则拆分。ifsle for能够放到单一函数内部

五、函数名称简洁

 

 

阿里高级技术专家方法论:如何写复杂业务代码?

 

简介: 面对复杂的业务场景,如何在架构和代码层面进行应对,是一个课题。

业务背景

简单的介绍下业务背景,零售通是给线下小店供货的B2B模式,咱们但愿经过数字化重构传统供应链渠道,提高供应链效率,为新零售助力。阿里在中间是一个平台角色,提供的是Bsbc中的service的功能。

 

商品力是零售通的核心所在,一个商品在零售通的生命周期以下图所示:

 

在上图中红框标识的是一个运营操做的“上架”动做,这是很是关键的业务操做。上架以后,商品就能在零售通上面对小店进行销售了。由于上架操做很是关键,因此也是商品域中最复杂的业务之一,涉及不少的数据校验和关联操做。
针对上架,一个简化的业务流程以下所示:

 

过程分解

像这么复杂的业务,我想应该没有人会写在一个service方法中吧。一个类解决不了,那就分治吧。

说实话,能想到分而治之的工程师,已经作的不错了,至少比没有分治思惟要好不少。我也见过复杂程度至关的业务,连分解都没有,就是一堆方法和类的堆砌。

不过,这里存在一个问题:即不少同窗过分的依赖工具或是辅助手段来实现分解。好比在咱们的商品域中,相似的分解手段至少有3套以上,有自制的流程引擎,有依赖于数据库配置的流程处理:

 

本质上来说,这些辅助手段作的都是一个pipeline的处理流程,没有其它。所以,我建议此处最好保持KISS(Keep It Simple and Stupid),即最好是什么工具都不要用,次之是用一个极简的Pipeline模式,最差是使用像流程引擎这样的重方法。

除非你的应用有极强的流程可视化和编排的诉求,不然我很是不推荐使用流程引擎等工具。第一,它会引入额外的复杂度,特别是那些须要持久化状态的流程引擎;第二,它会割裂代码,致使阅读代码的不畅。大胆断言一下,全天下估计80%对流程引擎的使用都是得不偿失的。

回到商品上架的问题,这里问题核心是工具吗?是设计模式带来的代码灵活性吗?显然不是,问题的核心应该是如何分解问题和抽象问题,知道金字塔原理的应该知道,此处,咱们可使用结构化分解将问题解构成一个有层级的金字塔结构:

 

按照这种分解写的代码,就像一本书,目录和内容清晰明了。

以商品上架为例,程序的入口是一个上架命令(OnSaleCommand), 它由三个阶段(Phase)组成。

 
  1. @Command

  2. public class OnSaleNormalItemCmdExe {

  3.  

  4. @Resource

  5. private OnSaleContextInitPhase onSaleContextInitPhase;

  6. @Resource

  7. private OnSaleDataCheckPhase onSaleDataCheckPhase;

  8. @Resource

  9. private OnSaleProcessPhase onSaleProcessPhase;

  10.  

  11. @Override

  12. public Response execute(OnSaleNormalItemCmd cmd) {

  13.  

  14. OnSaleContext onSaleContext = init(cmd);

  15.  

  16. checkData(onSaleContext);

  17.  

  18. process(onSaleContext);

  19.  

  20. return Response.buildSuccess();

  21. }

  22.  

  23. private OnSaleContext init(OnSaleNormalItemCmd cmd) {

  24. return onSaleContextInitPhase.init(cmd);

  25. }

  26.  

  27. private void checkData(OnSaleContext onSaleContext) {

  28. onSaleDataCheckPhase.check(onSaleContext);

  29. }

  30.  

  31. private void process(OnSaleContext onSaleContext) {

  32. onSaleProcessPhase.process(onSaleContext);

  33. }

  34. }

每一个Phase又能够拆解成多个步骤(Step),以OnSaleProcessPhase为例,它是由一系列Step组成的:

 
  1. @Phase

  2. public class OnSaleProcessPhase {

  3.  

  4. @Resource

  5. private PublishOfferStep publishOfferStep;

  6. @Resource

  7. private BackOfferBindStep backOfferBindStep;

  8. //省略其它step

  9.  

  10. public void process(OnSaleContext onSaleContext){

  11. SupplierItem supplierItem = onSaleContext.getSupplierItem();

  12.  

  13. // 生成OfferGroupNo

  14. generateOfferGroupNo(supplierItem);

  15.  

  16. // 发布商品

  17. publishOffer(supplierItem);

  18.  

  19. // 先后端库存绑定 backoffer域

  20. bindBackOfferStock(supplierItem);

  21.  

  22. // 同步库存路由 backoffer域

  23. syncStockRoute(supplierItem);

  24.  

  25. // 设置虚拟商品拓展字段

  26. setVirtualProductExtension(supplierItem);

  27.  

  28. // 发货保障打标 offer域

  29. markSendProtection(supplierItem);

  30.  

  31. // 记录变动内容ChangeDetail

  32. recordChangeDetail(supplierItem);

  33.  

  34. // 同步供货价到BackOffer

  35. syncSupplyPriceToBackOffer(supplierItem);

  36.  

  37. // 若是是组合商品打标,写扩展信息

  38. setCombineProductExtension(supplierItem);

  39.  

  40. // 去售罄标

  41. removeSellOutTag(offerId);

  42.  

  43. // 发送领域事件

  44. fireDomainEvent(supplierItem);

  45.  

  46. // 关闭关联的待办事项

  47. closeIssues(supplierItem);

  48. }

  49. }

看到了吗,这就是商品上架这个复杂业务的业务流程。须要流程引擎吗?不须要,须要设计模式支撑吗?也不须要。对于这种业务流程的表达,简单朴素的组合方法模式(Composed Method)是再合适不过的了。

所以,在作过程分解的时候,我建议工程师不要把太多精力放在工具上,放在设计模式带来的灵活性上。而是应该多花时间在对问题分析,结构化分解,最后经过合理的抽象,造成合适的阶段(Phase)和步骤(Step)上。

 

过程分解后的两个问题

的确,使用过程分解以后的代码,已经比之前的代码更清晰、更容易维护了。不过,还有两个问题值得咱们去关注一下:

领域知识被割裂肢解

什么叫被肢解?由于咱们到目前为止作的都是过程化拆解,致使没有一个聚合领域知识的地方。每一个Use Case的代码只关心本身的处理流程,知识没有沉淀。

相同的业务逻辑会在多个Use Case中被重复实现,致使代码重复度高,即便有复用,最多也就是抽取一个util,代码对业务语义的表达能力很弱,从而影响代码的可读性和可理解性。

代码的业务表达能力缺失

试想下,在过程式的代码中,所作的事情无外乎就是取数据--作计算--存数据,在这种状况下,要如何经过代码显性化的表达咱们的业务呢?说实话,很难作到,由于咱们缺失了模型,以及模型之间的关系。脱离模型的业务表达,是缺乏韵律和灵魂的。

举个例子,在上架过程当中,有一个校验是检查库存的,其中对于组合品(CombineBackOffer)其库存的处理会和普通品不同。原来的代码是这么写的:

 
  1. boolean isCombineProduct = supplierItem.getSign().isCombProductQuote();

  2.  

  3. // supplier.usc warehouse needn't check

  4. if (WarehouseTypeEnum.isAliWarehouse(supplierItem.getWarehouseType())) {

  5. // quote warehosue check

  6. if (CollectionUtil.isEmpty(supplierItem.getWarehouseIdList()) && !isCombineProduct) {

  7. throw ExceptionFactory.makeFault(ServiceExceptionCode.SYSTEM_ERROR, "亲,不能发布Offer,请联系仓配运营人员,创建品仓关系!");

  8. }

  9. // inventory amount check

  10. Long sellableAmount = 0L;

  11. if (!isCombineProduct) {

  12. sellableAmount = normalBiz.acquireSellableAmount(supplierItem.getBackOfferId(), supplierItem.getWarehouseIdList());

  13. } else {

  14. //组套商品

  15. OfferModel backOffer = backOfferQueryService.getBackOffer(supplierItem.getBackOfferId());

  16. if (backOffer != null) {

  17. sellableAmount = backOffer.getOffer().getTradeModel().getTradeCondition().getAmountOnSale();

  18. }

  19. }

  20. if (sellableAmount < 1) {

  21. throw ExceptionFactory.makeFault(ServiceExceptionCode.SYSTEM_ERROR, "亲,实仓库存必须大于0才能发布,请确认已补货.\r[id:" + supplierItem.getId() + "]");

  22. }

  23. }

然而,若是咱们在系统中引入领域模型以后,其代码会简化为以下:

 
  1. return;

  2. }

  3.  

  4. if (backOffer.isNonInWarehouse()){

  5. throw new BizException("亲,不能发布Offer,请联系仓配运营人员,创建品仓关系!");

  6. }

  7.  

  8. if (backOffer.getStockAmount() < 1){

  9. throw new BizException("亲,实仓库存必须大于0才能发布,请确认已补货.\r[id:" + backOffer.getSupplierItem().getCspuCode() + "]");

  10. }

有没有发现,使用模型的表达要清晰易懂不少,并且也不须要作关于组合品的判断了,由于咱们在系统中引入了更加贴近现实的对象模型(CombineBackOffer继承BackOffer),经过对象的多态能够消除咱们代码中的大部分的if-else。

 

过程分解+对象模型

经过上面的案例,咱们能够看到有过程分解要好于没有分解,过程分解+对象模型要好于仅仅是过程分解。对于商品上架这个case,若是采用过程分解+对象模型的方式,最终咱们会获得一个以下的系统结构:

 

写复杂业务的方法论

经过上面案例的讲解,我想说,我已经交代了复杂业务代码要怎么写:即自上而下的结构化分解+自下而上的面向对象分析。

接下来,让咱们把上面的案例进行进一步的提炼,造成一个可落地的方法论,从而能够泛化到更多的复杂业务场景。

上下结合

所谓上下结合,是指咱们要结合自上而下的过程分解和自下而上的对象建模,螺旋式的构建咱们的应用系统。这是一个动态的过程,两个步骤能够交替进行、也能够同时进行。

这两个步骤是相辅相成的,上面的分析能够帮助咱们更好的理清模型之间的关系,而下面的模型表达能够提高咱们代码的复用度和业务语义表达能力。

其过程以下图所示:

 

使用这种上下结合的方式,咱们就有可能在面对任何复杂的业务场景,都能写出干净整洁、易维护的代码。

能力下沉

通常来讲实践DDD有两个过程:

套概念阶段:了解了一些DDD的概念,而后在代码中“使用”Aggregation Root,Bounded Context,Repository等等这些概念。更进一步,也会使用必定的分层策略。然而这种作法通常对复杂度的治理并无多大做用。

融会贯通阶段:术语已经再也不重要,理解DDD的本质是统一语言、边界划分和面向对象分析的方法。

大致上而言,我大概是在1.7的阶段,由于有一个问题一直在困扰我,就是哪些能力应该放在Domain层,是否是按照传统的作法,将全部的业务都收拢到Domain上,这样作合理吗?说实话,这个问题我一直没有想清楚。

由于在现实业务中,不少的功能都是用例特有的(Use case specific)的,若是“盲目”的使用Domain收拢业务并不见得能带来多大的益处。相反,这种收拢会致使Domain层的膨胀过厚,不够纯粹,反而会影响复用性和表达能力。

鉴于此,我最近的思考是咱们应该采用能力下沉的策略。

所谓的能力下沉,是指咱们不强求一次就能设计出Domain的能力,也不须要强制要求把全部的业务功能都放到Domain层,而是采用实用主义的态度,即只对那些须要在多个场景中须要被复用的能力进行抽象下沉,而不须要复用的,就暂时放在App层的Use Case里就行了。

注:Use Case是《架构整洁之道》里面的术语,简单理解就是响应一个Request的处理过程。

经过实践,我发现这种按部就班的能力下沉策略,应该是一种更符合实际、更敏捷的方法。由于咱们认可模型不是一次性设计出来的,而是迭代演化出来的。

下沉的过程以下图所示,假设两个use case中,咱们发现uc1的step3和uc2的step1有相似的功能,咱们就能够考虑让其下沉到Domain层,从而增长代码的复用性。

 

指导下沉有两个关键指标:

  • 复用性

  • 内聚性

复用性是告诉咱们When(何时该下沉了),即有重复代码的时候。内聚性是告诉咱们How(要下沉到哪里),功能有没有内聚到恰当的实体上,有没有放到合适的层次上(由于Domain层的能力也是有两个层次的,一个是Domain Service这是相对比较粗的粒度,另外一个是Domain的Model这个是最细粒度的复用)。

好比,在咱们的商品域,常常须要判断一个商品是否是最小单位,是否是中包商品。像这种能力就很是有必要直接挂载在Model上。

 
  1. public class CSPU {

  2. private String code;

  3. private String baseCode;

  4. //省略其它属性

  5.  

  6. /**

  7. * 单品是否为最小单位。

  8. *

  9. */

  10. public boolean isMinimumUnit(){

  11. return StringUtils.equals(code, baseCode);

  12. }

  13.  

  14. /**

  15. * 针对中包的特殊处理

  16. *

  17. */

  18. public boolean isMidPackage(){

  19. return StringUtils.equals(code, midPackageCode);

  20. }

  21. }

以前,由于老系统中没有领域模型,没有CSPU这个实体。你会发现像判断单品是否为最小单位的逻辑是以StringUtils.equals(code, baseCode)的形式散落在代码的各个角落。这种代码的可理解性是可想而知的,至少我在第一眼看到这个代码的时候,是彻底不知道什么意思。

业务技术要怎么作

写到这里,我想顺便回答一下不少业务技术同窗的困惑,也是我以前的困惑:即业务技术究竟是在作业务,仍是作技术?业务技术的技术性体如今哪里?

经过上面的案例,咱们能够看到业务所面临的复杂性并不亚于底层技术,要想写好业务代码也不是一件容易的事情。业务技术和底层技术人员惟一的区别是他们所面临的问题域不同。

业务技术面对的问题域变化更多、面对的人更加庞杂。而底层技术面对的问题域更加稳定、但对技术的要求更加深。好比,若是你须要去开发Pandora,你就要对Classloader有更加深刻的了解才行。

可是,无论是业务技术仍是底层技术人员,有一些思惟和能力都是共通的。好比,分解问题的能力,抽象思惟,结构化思惟等等。

 

用个人话说就是:“作很差业务开发的,也作很差技术底层开发,反之亦然。业务开发一点都不简单,只是咱们不少人把它作“简单”了。

所以,若是从变化的角度来看,业务技术的难度一点不逊色于底层技术,其面临的挑战甚至更大。所以,我想对广大的从事业务技术开发的同窗说:沉下心来,夯实本身的基础技术能力、OO能力、建模能力... 不断提高抽象思惟、结构化思惟、思辨思惟... 持续学习精进,写好代码。咱们能够在业务技术岗作的很”技术“!。

后记

这篇文章是我最近思考的一些总结,大部分思想是继承自我原来写的COLA架构,该架构已经开源,目前在集团内外都有比较普遍的使用。

这一篇主要是在COLA的基础上,针对复杂业务场景,作了进一步的架构落地。我的感受能够做为COLA的最佳实践来使用。

另外,本文讨论的问题之大和篇幅之短是不成正比的。缘由是我假定你已经了解了一些DDD和应用架构的基础知识。若是以为在理解上有困难,我建议能够先看下《领域驱动设计》和《架构整洁之道》这两本书。

若是没有那么多时间,也能够快速浏览下我以前的两篇文章应用架构之道 和 领域建模去知晓一下我以前的思想脉络。

 

原文连接:https://developer.aliyun.com/article/714221

做者:从码农到工匠

 


Kotlin 开发者社区

 

国内第一Kotlin 开发者社区公众号,主要分享 Kotlin  / Java、Spring Boot、Android、React.js/Node.js、函数式编程、架构设计等相关主题。