如何发现通用的功能模块?

很多人觉得做业务开发没有挑战,实际上,做业务开发也会涉及很多非业务功能的开发,比如我们前面讲到的 ID 生成器、性能计数器、EventBus、DI 容器,以及后面会讲到的限流框架、幂等框架、灰度组件。关键在于,我们要有善于发现、善于抽象的能力,并且具有扎实的设计、开发能力,能够发现这些非业务的、可复用的功能点,并且从业务逻辑中将其解耦抽象出来,设计并开发成独立的功能模块

在我看来,在业务开发中,跟业务无关的通用功能模块,常见的一般有三类:类库(library)、框架(framework)、功能组件(component)等

其中,Google Guava 属于类库,提供一组 API 接口
EventBus、DI容器属于框架,提供骨架代码,能让业务开发人员聚焦在业务开发部分,在预留的扩展点里填充业务代码。 ID
生成器、性能计数器属于功能组件,提供一组具有某一特殊功能的 API 接口,有点类似类库,但更加聚焦和重量级,比如,ID 生成器有可能会依赖
Redis 等外部系统,不像类库那么简单。

前面提到的限流、幂等、灰度,到底是属于框架还是功能组件,我们要视具体情况而定。如果业务代码嵌套在它们里面开发,那就可以称它们为框架。如果它们只是开放 API 接口,供业务系统调用,那就可以称它们为组件。不过,叫什么没有太大关系,不必太深究概念

那我们如何发现项目中的这些通用的功能模块呢?
实际上,不管是类库、框架还是功能组件,这些通用功能模块有两个最大的特点:复用和业务无关。Google Guava 就是一个典型的例子。

如果没有复用场景,那也就没有了抽离出来,设计成独立模块的必要了。如果与业务有关又可复用,大部分情况下会设计成独立的系统(比如微服务),而不是类库、框架或功能组件。所以,如果你负责开发的代码,与业务无关并且可能会被复用,那你就可以考虑将它独立出来,开发成类库、框架、功能组件等通用功能模块

稍微补充一下,我们这里讲的是,在业务开发中,如何发现通用的功能模块。除了业务开发团队之外,很多公司还有一些基础架构团队、架构开发团队,他们除了开发类库、框架、功能组件之外,也会开发一些通用的系统、中间件,比如,Google MapReduce、Kafka 消息中间件、监控系统、分布式调用链追踪系统等。

如何开发通用的功能模块?

当我们发现了通用功能模块的开发需求之后,如何将它设计开发成一个优秀的类库、框架或功能组件呢?

作为通用的类库、框架、功能组件,我们希望开发出来之后,不仅仅是自己项目使用,还能用在其他团队的项目中,甚至可以开源出来供更多人所用,这样才能发挥它更大的价值,构建自己的影响力。所以,对于这些类库、框架、功能组件的开发,我们不能闭门造车,要把它们当作“产品”来开发。这个产品是一个“技术产品”,我们的目标用户是“程序员”,解决的是他们的“开发痛点”。我们要多换位思考,站在用户的角度上,来想他们到底想要什么样的功能

对于一个技术产品来说,尽管 Bug 少、性能好等技术指标至关重要,但是否易用、易集成、易插拔、文档是否全面、是否容易上手等,这些产品素质也非常重要,甚至还能起到决定性作用。往往就是这些很容易忽视、不被重视的东西,会决定一个技术产品是否能在众多的同类中脱颖而出。

具体到 Google Guava,它是一个开发类库,目标用户是 Java 开发工程师,解决用户主要痛点是,相对于 JDK,提供更多的工具类,简化代码编写,比如,它提供了用来判断 null 值的 Preconditions 类;Splitter、Joiner、CharMatcher 字符串处理类;Multisets、Multimaps、Tables 等更丰富的 Collections 类等等。

它的优势有这样几点:第一,由 Google 管理、长期维护,经过充分的单元测试,代码质量有保证;第二,可靠、性能好、高度优化,比如 Google Guava 提供的 Immutable Collections 要比 JDK 的 unmodifiableCollection 性能好;第三,全面、完善的文档,容易上手,学习成本低,你可以去看下它的 Github Wiki。

刚刚讲的是“产品意识”,我们再来讲讲“服务意识”。我经常在团队中说,如果你开发的东西是提供给其他团队用的,你一定要有“服务意识”。对于程序员来说,这点可能比“产品意识”更加欠缺。

首先,从心态上,别的团队使用我们开发出来的技术产品,我们要学会感谢。这点很重要。心态不同了,做起事来就会有微妙的不同。其次,除了写代码,我们还要有抽出大量时间答疑、充当客服角色的心理准备。有了这个心理准备,别的团队的人在问你问题的时候,你也就不会很烦了。

相对于业务代码来说,开发这种被多处复用的通用代码,对代码质量的要求更高些,因为这些项目的影响面更大,一旦出现 bug,会牵连很多系统或其他项目。特别是如果你要把项目开源,影响就更大了。所以,这类项目的代码质量一般都很好,开发这类项目对代码能力的锻炼更有大。这也是我经常推荐别人通过阅读著名开源项目代码、参与开源项目来提高技术的原因。

具体到 Google Guava,它是 Google 员工开发的,单元测试很完善,注释写得很规范,代码写得也很好,可以说是学习 Google 开发经验的一手资料,建议你如果有时间的话,可以认真阅读一下它的代码。

尽管开发这些通用功能模块更加锻炼技术,但我们也不要重复造轮子,能复用的尽量复用。而且,在项目中,如果你想把所有的通用功能都开发为独立的类库、框架、功能组件,这就有点大动干戈了,有可能会得不到领导的支持。毕竟从项目中将这部分通用功能独立出来开发,比起作为项目的一部分来开发,会更加耗时。

所以,权衡一下的话,我建议初期先把这些通用的功能作为项目的一部分来开发。不过,在开发的时候,我们做好模块化工作,将它们尽量跟其他模块划清界限,通过接口、扩展点等松耦合的方式跟其他模式交互。等到时机成熟了,我们再将它从项目中剥离出来。因为之前模块化做的好,耦合程度低,剥离出来的成本也就不会很高

总结

  • 复用和与业务无关就可以考虑开发通用功能模块

参考

81 | 开源实战三(上):借Google Guava学习发现和开发通用功能模块

借Google Guava学习发现和开发通用功能模块相关推荐

  1. Google guava学习

    文章目录 Google guava学习 一.摘要 二.优点 三.maven依赖 四.Guava API使用教程 五.GuavaCache本地内存缓存 六.布隆过滤器 Google guava学习 一. ...

  2. Java类库Google Guava学习

    参考 官网 https://github.com/google/guava Google Guava官方教程(中文版) | 并发编程网 – ifeve.com 一篇让你熟练掌握Google Guava ...

  3. 微擎we7微赞官方通用功能模块插件带XML文件分享

    1.微赞we7模块 - 微商城 微商城是基于当前很受欢迎的微信的一种传媒方式中的一种商业运用,微信的当前的火热是一个商机,基于微信的传播速度,及其简便等优点,为商家提供一个平台,在这个更简便的.方便的 ...

  4. Google Guava学习笔记——基础工具类Joiner的使用

    Guava 中有一些基础的工具类,如下所列: 1,Joiner 类:根据给定的分隔符把字符串连接到一起.MapJoiner 执行相同的操作,但是针对 Map 的 key 和 value. 2,Spli ...

  5. 仿牛客网社区开发--核心功能模块

    1.过滤敏感词 我们想在某个网站上发布一些内容的时候,网站会对我们所发布的内容进行过滤,如果发现我的内容里包含一些色情.暴力等非法词汇,会把这些词汇隐去,即不显示或者打码,那么这种行为就叫过滤敏感词. ...

  6. iOS开发之功能模块--推送之坑问题解决

    不管想不想看我后面再开发中总结的经验,但是很值得推荐一位大神写的关于苹果推送,很多内容哦:http://www.cnblogs.com/qiqibo/category/408304.html 苹果开发 ...

  7. php jquery ajax九宫格抽奖,php+jquery+ajax开发抽奖功能模块下载

    php+jquery+ajax实现抽奖系统模块代码如下: 首页在抽奖前需要将所有人员的参与名单在屏幕上滚动显示,所以就用jquery实现了, 1. 参与名单将放在一个txt文件里面,我将放到 phon ...

  8. mars3dApp开发——“附近”功能模块开发

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.功能场景描述 二.实现过程 1.使用mars3d已经封装好的高德接口 2.根据设施code查询 3.附近点搜索 一.功能 ...

  9. Google Guava:您永远不会知道的5件事

    每个开发人员都可以使用哪些鲜为人知的Google Guava功能? 它是那里最受欢迎的库之一,它是开源的,您可能已经知道了,它来自人们玩Quidditch作为一项真正的运动的地方(至少在The Int ...

最新文章

  1. RESTful_基础知识
  2. 为进阶Linux大佬打牢地基
  3. 题目 2285: [蓝桥杯][2018年第九届真题]螺旋折线(数论+思维)
  4. python交并补_python两个列表求交、并、差
  5. jQuery初识 - jQuery关于节点的相关方法
  6. VS出现目标包.NETFramework的目标包没有安装
  7. python 象棋算法接口_python输出国际象棋棋盘的实例分享
  8. 怎么查微信公众号服务器,微信公众号查询数据库,微信公众号数据库怎么查询?...
  9. mysql new用法_MySQL触发器之 new 和 old 的理解
  10. linux新建数字名字用户,linux 用户、用户组不能是全数字
  11. 保存numpy数组到excel
  12. 从 Quora 的 187 个问题中学习机器学习和NLP
  13. 工程伦理--3.1 遭遇伦理困境
  14. UEFI启动视频详解:启动分析+N项操作实例
  15. 听说你不会用代码换壁纸
  16. linux+nas+私有云软件,自建家庭私有云NAS——磁盘管理系统
  17. Zstack救急实战记录
  18. 华硕灵耀 X 双屏 Pro 评测
  19. 使用Docker打包镜像并发布
  20. 打字机插件 Typeface Animator

热门文章

  1. 用户、话题、评论一网打尽,分享一个最强微博爬虫
  2. Linux环境下Git的安装以及使用
  3. 如何安装python3.8.2_Python 3.8.2详细图文安装教程(附安装包)
  4. 谷歌浏览器software_reporter_tool关闭
  5. linux 循环小时,shell脚本日期遍历(按天按小时)
  6. vc浏览器_自主创业项目推荐,晨兴资本刘芹:我的市场非共识+超配投资原则VC洞见...
  7. python 怎么算l2范数_python之彻底搞懂迭代、可迭代、迭代器的区别(一)
  8. 根据后台返回地址实现图片展示_微信小程序 - 前端接入七牛云上传图片和视频...
  9. winform 的exe为什么移动之后不能使用_C++MyDock配置要求、所需运行库、常见问题 初次使用必看...
  10. c语言中的循环移位函数,C ++中循环移位(旋转)操作的最佳实践