所谓道,就是事物的基础和本质,是一种思想和理论,是不易改变的部分。所谓术,就是具体实现的方法和手段,是一种实践的过程,是容易改变的部分。在科学发展的过程中,一般都是先从术开始,开始解决某一个具体的问题,从研究这个具体问题所用的方法,研究这个问题后背的本质,从而推导出一些基础理论和思想,再有这个基础理论,应用到实践,交替的发展。

之所以说这个话题,主要是在回顾这些年自己的技术生涯中存在的问题以及思考如何再进一步提高我们的技术水平。个人觉得学习的过程应该是和科学的发展规律是类似的,先从解决一系列具体的问题入手,在思考这些问题后背的本质是要解决哪些基础问题,在抽象出来这些问题背后的本质,进而思考这一类问题的本质解决思路应用到实践过程中,从一个先具体——>抽象——>泛华的过程。

一个技术人员想要成长,前期是肯定要不断学习应用技术,思考对于特定问题的解决方案,能够有效的解决技术中的难题,当自己的术积累到一定的阶段的时候,想要再有突破,就必须提高自己的道,透过自己在术上的积累,完成道的提升。从道和术的关系来看,术是一中思维的具体化,而道是思维的抽象化,从具体化上升到抽象化,需要主动思考,积极总结,把具体化的事务中不变性和易变性进行区分,找到不变的部分,这些才是本质。在很长一段时间内,我都过分追求所谓的术,喜欢不断的看新的技术,学习新的业务,通过各种项目来锻炼自己的能力,但是缺乏对其背后原理的分析,在短时间内,你会发现感觉你能力提升很快,但如果长期如此,就会遇到瓶颈,因为你积累的永远是术,而非道也。

上面说的比较抽象,可以从一个具体的例子来说明如何从一个具体的问题背后提出这个问题的本质是什么,以及有解决这个本质的问题有哪些实际的方案,这个例子也是当初我在工作中遇到,当初由于能力原因,没有设计出来一个很好的扩展性很强的架构方案。

具体场景:某公司提供了一个产品,这个产品主要是解决企业用户通过我们的服务批量付款到指定的银行卡里面,我们约定了一个打款的文件格式,客户通过http post 的方式上传文件到公司指定的URL。而打款文件里面主要是有客户姓名,卡号,金额三列,其他的不是重点,这里不不描述了。

从这个应用场景来看,用程序来实现这个功能非常简单,通过一个web服务器端程序,下图描述了这种简单方案的实现方式

问题一:协议版本与关注点分离

接下来,我们就面临问题了,对于大多数企业客户,都比较好说话,都挺配合我们的,但是对于一些国企,比较牛逼的客户,觉得你们的功能不够好啊,我想在文件里面追加一列手机号,希望在打款完成的同时,短信通知用户。这个说实在的比较合理,谁叫别人是大爷了,只有改了。最简单的方案就是在解析文件的时候,增加一列好了,数据也增加一个字段。后来,大家就知道了,还有一些客户也有其他的特殊需求,比如发邮件通知,收费需求等等,我们的方案就是文件不断的加列,数据里面不断的加字段。

现在的问题有两个:1 如何应对约定文件格式经常变化的问题 , 2 如何解决客户的特殊需求

对于第一个问题,从表象来看,是文件格式定义的不具有扩展性,在现实生活中,我们也会遇到这样的问题,比如我们去银行办理业务需要签约,签约内容随着时间的不同,也会发生变化,而银行每次签约就会把签约的协议版本记录下来,每一份不同的协议都有一个版本。对于这里的打款文件,其实就是一份协议,我们简称数据协议,那么问题就转化为如何面对协议内容发生变化。在计算机世界,协议可能是应用最广泛的词之一了,当然可以从这里找到答案,从我们最熟悉的http协议看来,就是约定协议号。在商户上传文件的时候,说明这个协议的版本号,我们根据版本号的不同,对文件解析处理也就不一样。

从这个问题来看,如果把文本内容进行抽象,就是一种数据协议。任何通信的双方交互数据交互都需要约定数据协议和其版本,这样在协议发生改变的时候,可以更有效的对系统进行扩展。在计算机世界,协议可是太多了,比如ftp,http,smtp等等,每个协议肯定都有其对应的版本号。

对于第二个问题,主要是就是在变与不变进行隔离,对于功能点,核心的需求,也就是不变的需求,就是打款,姓名,卡号,金额是必要属性,而邮箱,手机号是增值服务,这个是扩展性属性,在数据持久化的时候,不变的属性和易变的属性要分开保存。在设计模式中,模板模式就是一个比较好的例子,不变逻辑的抽象出来,易变的逻辑让子类实现。

问题二:渠道以及通信方式

随着产品的发展,我们的接入的商户越来越多,有一些商户IT系统比较弱,或者说根本都没有,拿怎么办,我们只能在自己的网站开发一个功能,让商户登陆到我们的系统中,自己上传文件。后来,恶梦越来也多,有一些商户觉得http post 不安全,打算用socket方式传入文件流。我们只能不断的修改现有的系统,满足其要求。

在这个问题中,我们面临的就是一个渠道,在刚开始涉及系统的时候,没有考虑到渠道这个属性。其实通过http上传文件,就是我们产品销售的一个渠道。在现实世界中,如果一个厂商要卖产品的话,肯定是通过一定的渠道把产品卖出去,比如通过代理商卖,开网店卖,开直营店,还有骗子最喜欢的电视购物等等。在上面需求里面,缺乏渠道的建设,没有把渠道这一层抽象出来。

对于渠道这个概念,可以再次引申出 渠道类型以及渠道的通信方式,对于上面问题,可以凯利以下几个渠道 系统直连渠道,网站渠道,邮件渠道。

系统直连渠道:具体的通信方式可以包含 http方式,socket方式,ftp方式,webserivce

对于网站渠道:通信方式就是web

对于邮件渠道:通信方式就email

对于不同通信方式,涉及到的数据格式不一样,还需要进行格式转化,对于socket和webservcie方式,需要把接收到的数据格式转化为约定的文本文件格式。这里就需要数据适配层。

在系统应用架构上,需要抽象出渠道层,在渠道层包含各个通信方式的处理逻辑,还需要一个数据适配层,把不同类型的数据转化为标准的文件格式。对架构可以进行一下转化。

以上两个问题,在我们的系统设计中经常回遇到,其实里面所设计到的问题就是,对于两个通信的双方,以何种渠道和通信方式,通过约定的协议进行通信的过程,这个思想,可以在很多场景下都使用。比如 CPU 和 内存之间的通信,网络客户端和网站服务器的通信等等,其中涉及到抽象概念都是比较类似的。

在技术的学习中,我们就是通过这种思考,要不断找寻技术中共通的本质。很多时候,提出问题比解决问题更重要,在看一门新技术的时候,我们要多对其中的原理的进行研究,而不是仅仅学习其应用,能够知道这个技术存在的问题以及其优势。在业务的学习上也是如此,至少我现在不是很喜欢去追求新的业务,也不喜欢把研究业务细节是如何实现的,而是更喜欢思考这些业务之间有哪些关联关系,业务中变化的部分与业务中不变的部分,思考那些有共同点。

还是中国古人一句话说的对,学而不思则罔,思而不学则殆。学而不思无道,思而不学无术。只有道术结合,才是能为强者。

GodIsCoder 
博客园blog地址:http://www.cnblogs.com/aigongsi/ 
独立Blog: God Is Coder 
个人网站: iphone发码网 
本人版权归作者和博客园所有,欢迎转载,转载请注明出处

转载于:https://www.cnblogs.com/svennee/p/4220988.html

道与术 渠道以及通信方式的架构设计相关推荐

  1. 高能分享,直击华坤道威(Fuzer)调度系统架构设计专题线上技术讨论沙龙

    从「鲜为人知」的专业名词,到 2006 年的精准定义,再到如今全面上云时代的「百花齐放」,云计算的发展趟过蛮荒之地,已形成极具规模.高可靠性.通用性的服务,而开源是创新的基础,也是这一场技术革命中的重 ...

  2. Atitit保证架构超前性 前瞻性 目录 第一章 简单抽象原则 道和术的区别 1 第一节 原则 kiss 1 第二节 提升到层次哲学层次 1 第三节 命名也要通用抽象 隐藏细节 1 第二章 通用性原

    Atitit保证架构超前性 前瞻性 目录 第一章 简单抽象原则 道和术的区别 第一节 原则 kiss 第二节 提升到层次哲学层次 第三节 命名也要通用抽象 隐藏细节 第二章 通用性原则  扩展性 第一 ...

  3. 顶级业务架构设计的“道”与“术”,醍醐灌顶!

    与智者为伍,足以睥睨天下. 架构的本质就是对系统进行有序化地重构,以满足当前业务的发展需求,同时能够实现快速扩展.而顶级业务架构师交付的解决方案既能拯救当下,提质增效,还能前瞻未来,护航发展. 向顶级 ...

  4. 架构的道与术-软件架构设计

    何为道,何为术 方法论,即是架构的道. 具体来说,对于技术问题,主要指高并发.高可用和一致性方面: 对于业务问题,主要指业务的需求分析和业务建模.这些方法论来自大量的业务系统实践,并在实践的基础上进行 ...

  5. 读书 | 数字化转型的道与术(上)

    [数字化转型]| 作者 / Edison Zhou 这是EdisonTalk的第312篇学习总结 最近在阅读钟华老师的新作<数字化转型的道与术>,记录和总结了一些学习笔记和感想,整理成文分 ...

  6. 软件测试的“道”与“术” - 软件测试新观察(转载崔启亮的文章)

    软件质量是指软件的功能和性能满足用户需求和期望的程度.随着IT技术在各个行业的广泛深入地应用,软件质量成为普遍重视的因素.如何有效地提高软件质量,增强软件产品的竞争力,是软件企业管理和技术人员共同面对 ...

  7. 产业区块链的“道”与“术”:区块链技术的价值解读

    本文作者:章昱昕 巴比特产业区块链高级专家 "外行看热闹,内行看门道",自2019年10月24日国家层面组织区块链学习以来,市场上关于区块链技术的产业应用讨论就不绝于耳.但是浮于表 ...

  8. 读书 | 数字化转型的道与术(下)

    [数字化转型]| 作者 / Edison Zhou 这是EdisonTalk的第313篇学习总结 最近在阅读钟华老师的新作<数字化转型的道与术>,记录和总结了一些学习笔记和感想,整理成文分 ...

  9. 程序人生 ---- 道与术的一点杂谈

    最近突然有两个学弟通过CSDN 上10年前我做的课程设计联系上了我,我很惊讶,<RS-232串口通信>这个课程设计[注1]能够在十年后还发光发热.然后学弟还不会...我一开始还以为他是考古 ...

最新文章

  1. python 跳出两层循环,跳出多层循环
  2. java.lang.date_无法将java.lang.String类型的值转换为必需类型java.util.Date
  3. Design Pattern - Iterator(C#)
  4. Java 捕获 mybatis异常_3 springboot集成mybatis和全局异常捕获
  5. 《深入理解分布式事务》第三章 Spring 事务的实现原理
  6. Git 基础 —— 配置与日志信息
  7. Sublime Text各种插件使用方法
  8. Java NIO框架 Mina、Netty、Grizzly
  9. 【python文本分析】——基于股评文本的情绪分析
  10. 【LeetCode-SQL】1384. 按年度列出销售总额
  11. 3D图库框架范围与示例
  12. 如何在linux系统中设置定时任务?
  13. VoIP之Wireshark使用
  14. Chrome浏览器最常用的快捷键
  15. 后端学习关卡三习题归纳及问题解决1
  16. 芝加哥大学计算机专业排名,芝加哥大学计算机科学硕士排名第33(2020年TFE Times排名)...
  17. 基于逻辑回归算法的心脏病不平衡数据分类代码实现
  18. DirectCompute开启Windows7 GPU运算大门
  19. 理光 java,理光打印机驱动安装步骤,以及如何设置打印机的IP地址
  20. 计算机四级 网络工程师 考过指南,2015计算机四级考试报考指南:考试简介

热门文章

  1. echarts南丁格尔玫瑰图每块单独设置颜色
  2. 关于uni-app隐藏安卓虚拟键
  3. 海南楼市充斥着传说 投机者必将自食其果
  4. PDF文件怎么编辑,如何删除其中一页
  5. 如何解决apt-get中Unmet dependencies问题
  6. 操作系统4小时速成:内存管理,程序执行过程,扩充内存,连续分配,非连续分配,虚拟内存,页面替换算法
  7. If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
  8. 2019乌鲁木齐·丝绸之路冰雪马拉松天山脚下鸣枪开跑
  9. python语言是干什么的-python语言可以干什么
  10. grabber.start()获取摄像头数据异常