kenttanl / kenttanl.github.io

个人博客,http://kentt.top/
https://kenttanl.github.io/
MIT License
0 stars 0 forks source link

一些杂乱的感悟 #9

Open kenttanl opened 3 years ago

kenttanl commented 3 years ago
kenttanl commented 3 years ago

Spring 的作用

过往在提到 Spring 的作用时,听到最多的关键词是“控制反转(IoC)”、“依赖注入(DI)”等,比如“通过将对象的周期或依赖交给容器管理,以降低代码之间的耦合度”。或者你可能很难通过一句话来概述 Spring 的作用,因为除了 Spring 核心之外,还有很多其它的包,可参考:https://spring.io/projects/spring-framework

过去我一直尝试如何通过一句话来简要的概括 Spring 的作用,“控制反转”、“依赖注入”、“解耦”?我觉得这些都不够准确或者全面,它们更像是从一个开发者的角度来阐述问题。所以我尝试从一个设计者的角度来思考 Spring 的作用是什么?

让开发更简单。

这就够了。使用控制反转、依赖注入是因为它能够让开发更简单,让你不必再去过多的关注对象的创建和注入等。基于“简单”这个关键词再去看 Spring 的其它工具就很好理解了,比如 Spring-Data: 为数据提供一个熟悉且一致的编程模型,它让数据的使用更简单;Spring RestTemplate/KafkaTemplate etc.:通过屏蔽底层繁琐的细节,为使用者提供一个简单的统一的 API;以至于再向后发展的 Spring-boot,通过屏蔽各种包的版本的管理,以及一些繁琐的配置,让项目的创建与管理更加简单。

最后通过这几年的开发,我逐渐明白,看一个框架或工具的核心价值,应该尝试从它的设计角度出发,去思考它能够为用户带来什么样的价值。所有的模式或者技术都不过是它的一种实现方式,如果有一天能够有比控制反转更好的实现方式,我相信 Spring 的开发者也一定会选择替换它的。

kenttanl commented 3 years ago

系统的核心价值

之前看过一个斯坦福的开源课程,讲的是 Java 开发的一些基础知识。整个课程特别轻松,以至于即使是全英文只能靠字幕我却仍未觉得乏味,至今仍然让我记忆忧新的是他的授课模式是从一个简单的机器人游戏开始,同学们可以通过已经封装好的包来简单的调用一些方法,便可实现人物的移动或其它动作。这和其它很多课程从一开始就照着语法开始讲解有很大的区别。

所以为什么通过一些示例来学习会比直接从语法开始学习更能让我产生兴趣呢?我觉得很关键的一点是,通过示例能够让我知道我的目标是什么,知道缺少什么,或者做成什么样才算合格的,而照着课本从语法开始学习可能会因为没有目标而感到乏味。

....

kenttanl commented 3 years ago

为什么系统设计中边界很重要

公司引入了无人货架,为数不多的商品通过隔板将不同类目的商品分开在了不同的层次,这使得我们在搜索自己想要的商品时可以快速的缩小范围,因为如果只是将它们全部堆在一起,那么搜索商品的成本势必会有所增加。

image

如果将这类问题反映到系统设计中,那么这些隔板所代表的含义便是系统中的边界。通过功能的职责种类、更新频率、重要程度等将它们放到不同的模块中,并通过不断的设计优化以形成一个边界清晰的系统,最终形成一个易于开发、维护和使用的系统。或者再细节到开发过程中,一个小功能的类设计,通过划分出职责清晰的不同的 class、method,并通过清晰合理有序的方式来结合使用,仍然会是对开发或维护特别有益的事情。一个分类有序的图书管书架势必比一个分类混乱的书架更容易让你找到你需要的书籍,同样的一个分类有序的系统也势必会比一个分类混乱的系统更容易被开发与维护。

所以边界为什么很重要,第一方面是因为它能让我们在关注一个功能或问题时,能够缩小查找的范围,比如光标无法移动,首先想到的是鼠标是不是有问题,而不是键盘是不是有问题,因为移动光标的功能已经处于键盘所提供的功能的边界之外。

第二个方面我觉得是边界的契约精神,如果说光标移动、左右键点击是一个功能合集,那么处于这个功能合集中的鼠标就必须保证它所提供功能的正确性,它不必关注这个合集之外的功能是否正确,同时操作系统也不必关注鼠标的具体实现,于是操作系统和鼠标之间只需要通过一组事先约定的接口来相互调用即可。

kenttanl commented 3 years ago

编程是一项结构性的社会创造

这是我瞎想的一个名字,但是我觉得里面有两个词能够表达编程的一些核心或有趣的信息:“结构性”与“社会创造”。

结构性在开发中比较熟悉的代表应该是“面向对象编程”,通过将需求抽象化,并转变成一系列的对象,然后再组装结合起来以实现具体的功能。或者严格的讲,开发本身就是一项工程化的事情,它是有结构与层次的,尤其是大的项目中,清晰有序的结构与层次能够让开发更快的理解整个系统,同时也能便于后期的维护与扩展,所以我认为作为一个开发者,能够将问题抽象化并转变成一个富有结构性的解决方案是一种需要持续关注的能力。

那么社会创造又是什么意思呢?我认为在将问题抽象化的过程中,如果能够将它们与社会中已经存在一些逻辑原理结合起来,能够更利于开发者的理解。比如 Redis 的哨兵,即使你对 Redis 不了解,那么也应该知道它或许与监控有关;更多的像 linux 中的管道,Flink 中的流、窗口、水位线等,它们通过将现实中的一些概念与逻辑映射到系统中,实现了一种非常巧妙并易于理解的系统结构。所以我说编程也是一项社会创造,是因为我认为在实际的开发设计中,我们是能够将社会中的一些概念映射到系统中的。

kenttanl commented 3 years ago

系统复杂性

有的时候一个系统看起来很复杂很高大上,极有可能是因为开发在设计时,将一个简单的问题给设计成了复杂的模样,或者没有将一个复杂的问题设计成简单的模样。我觉得好的系统一定是能够将复杂的场景通过分解并降维成简单的模块组成,好的设计亦是如此,或许这就是架构师为何很重要的原因吧。

kenttanl commented 3 years ago

反分工

在罗辑思维听到一个很有意思的概念:反分工,大概意思就是在工作分工逐渐细化的过程中,负责某一个细分领域的工作的人能够反向的从更高角度去思考问题(详细:https://www.ljsw.io/knowl/article/BC.html)。

举个开发过程中的例子:作为开发,如果你接受了来自项目负责人的工作分工,那么如果你能够在原本仅仅是功能实现的过程中去从项目管理或系统架构的角度去思考如何做开发,以使得功能的实现能够更符合项目的发展,或者能够在开发的过程中去思考功能是否有什么可以改进的地方等等,我觉得这都是反分工的一种体现。

玩 DOTA 类游戏的时候,讲究既要注重细节也要有大局观,细节是角色的具体分工的表现,大局观则是从全局战略性的角度去思考的一种反分工的体现。

分工是被动接受,反分工是主动发现;分工是职责,反分工是兴趣;

kenttanl commented 3 years ago

黑盒子设计

image

像图中的电脑主机一样,使用的时候我们只需要关注它所暴露出来的功能即可,当我们需要购买一副耳机时,也只需要关注它是否和主机的接口一致,而不必关注主机内是如何实现音频通信的,于是电脑主机内部的实现对于普通的使用者而言便是一个黑盒子。

...

kenttanl commented 3 years ago

Cloudera Manager 中的 Concerning 的意思应该被翻译为“令人担忧的”,而谷歌翻译中在中文的翻译中没有找到这个意思,只能在英文的定义中找到(参见:Concerning 的谷歌翻译结果),困扰多年的迷惑终于明白为何要使用这个单词了

kenttanl commented 3 years ago

控制风险影响范围

什么样的项目能算得上是一个好的项目?

从我刚学习编程时就一直再思考这个问题。刚开始我认为有一个好的层次结构、设计良好以及可读性良好的项目算是一个好的项目,所以那时候比较专注于设计模式、三层架构、代码规范等方面的一些学习。后来开始参与一些自主研发的产品时,做出了比较复杂但是却鲜有被用户使用的功能时,就觉得好的项目一定是有价值并且足够简洁的。再然后接触到分布式项目,开始对系统的好坏有了更多的评判标准,比如系统的架构是否能够支撑当前业务并足够简洁、引入的组件是否足够精简、可靠性与可用性如何等等。最后当我给美国老大说我们是做研发的时候,她说我的格局小了,我们是做服务,是做产品,是最终会销把产品销售给用户,并为他们服务的一个团队,这个时候,就觉得好的项目本质上还是得价值优先的,不过这是从产品的方面来看。

回归到技术层面和开始的问题,在接触过一些运维工作,比如 hadoop 集群以及一些分布式项目的运维之后,对于一个好的项目又新增了一个评判标准:发生异常时,是否能够有效的控制其受影响范围。如果服务 A 的异常,直接导致了依赖其的服务 B、C、D 全部崩溃,那么它的被影响范围无疑是巨大的,而如果服务 B、C、D 在感知到服务 A 的异常后能够暂时绕过、或者通过其它方式来处理此异常,并尽可能不影响到其它未依赖服务 A 的功能,那么我认为它的受影响范围是相对较小的。

kenttanl commented 1 year ago

领域模型

在业务复杂、多人协作、跨多个域/团队的背景下,领域模型的系统中作用逐渐凸显,除了统一语言、方便防腐的基本作用外,总结几个其它作用如下:

  1. 提供跨域沟通效率: 🌰通过理解 PaaS 域的系统模型,SaaS 域同学可快速理解业务对接方案,有效屏蔽其内部实现细节;
  2. 高内聚、低耦合: 模块内核心功能针对模型进行核心功能实现(避免DTO/VO/BO交织转换,统一通过Model进行转换),不同模块之间通过消息/聚合根进行功能串联;
  3. 降低冗余度: 针对不同模型进行不同的模版订制(模板设计模式),每一个命令/接口关注核心业务的实现,减少对模型的读取、持久化、并发安全等基础控制的重复实现;