自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

软件工程探索之旅

跨越'知道'和'做到'之间的鸿沟,探索软件工程的奥秘

  • 博客(305)
  • 收藏
  • 关注

原创 【项目经验】Redis Sentinel从工程中下线并对业务迁移-进行中

某天,接到DBA通知,Redis sentinel 只支持到3.2.X,各组要将工程中的Redis sentinel引用改为Redis cluster... 有的工程引用了两种模式,有的只引入了Redis sentinel ,还和其他组有共同使用的key ,怎么办呢?? ... 结尾有彩蛋

2024-03-13 22:45:33 1486

原创 JVM和JVM内存管理

以上是从内存管理的角度对jvm进行的知识框架梳理,以后在工作中还要多多使用,多多体会。同时,结合已有的工作经验,我更加深刻的认识到,有些时候因为对原理的不了解,研发过程中的一些不经意的"小操作",都可能引起巨大风暴:大量没有被引用的类文件,如果被加载到jvm中,在metaSpaceSize设置的少时,有可能引起OutofMemoryError:Metaspace错误;队列长度设置不当,很有可能导致内存溢出;完善的内存监控系统可以使我们的系统如虎添翼。

2024-03-09 21:48:19 951

原创 数据库事务问题整理-MySQL

对MySQL事务的重新认识,包括事务的概念,事务解决的问题,MySQL innodb存储引擎中为了解决隔离性问题的MVCC机制

2024-02-29 17:07:11 891

原创 分布式一致性软件-zookeeper

在我们进行软件开发过程中,为了实现某个功能可能借助多个软件,如存储数据的数据库软件:MySQL,Redis;消息中间件:rocketMq,kafka等。那么在分布式系统中,如果想实现数据一致性,可以借助哪些软件呢?答:分布式一致性软件。

2024-02-25 20:36:07 1587

原创 Redis-内存管理

Redis是基于内存存储的,非关系型,键值对数据库。因此,对Redis来说,内存空间的管理至关重要。那Redis是如何内存管理的呢?

2024-02-21 13:50:12 899

原创 rocketMq-broker-PullMessageProcessor 的完整生命周期和设计思想

很多文章直接讲了processRequest方法的执行内容,并没有讲清楚PullMessageProcessor的生命周期,以及是如何被通知要进行消息拉取的。在这篇文章中,我们将对其进行梳理,并学习其中的设计思想。

2024-02-20 11:47:34 1221

原创 【算法】Java-二叉树的右视图(BFS、DFS两种解法)

这道题的解法有很多,分享这两种解法的原因是在做这道题时,我感受到了自己的一点点质变。方法一,对队列的熟练应用。方法二,深度理解了递归的过程,后面还要继续应用,继续体会。学习算法增加了我看问题的视角,经常感叹“原来可以这样”,“居然还能这样”,“这人想的真好”之类。但我们知道“知道”和“做到”之间,有一条“鸿沟”,用新的“知道”的方法解出题的感觉真是太棒了,我做到了!当然,过程非常不容易,经常有些题目都看不懂,或者别人的思路理解不了。这时候,我们要想想,这道题难度是不是太大了,如果太大,要降低难度;

2024-01-14 19:09:44 1705 3

原创 Java字节码分析快速入门/字节码执行分析(一)

我们知道,计算机直接使用的程序语言语句是机器指令码,又称机器码/代码。但在Java开发过程中,Java源码先被编译成了字节码,然后才解释称机器码运行。这是为什么呢? 字节码是什么呢?

2023-06-28 20:48:31 1747

原创 [Java基础]面向对象

在这篇文章中,我们将学习面向对象的思想,并学习如何使用面向对象思想编程。包括关于对象和类,类之间的关系,引用,对象的创建和使用,构造函数,内存解析等内容。

2023-06-09 17:37:44 943

原创 [Java基础]面向对象-内存解析

这篇文章,将为大家讲解,Java代码执行过程中,内存空间占用的情况,图文并茂,值得一看。

2023-06-09 15:08:05 773 3

原创 【Spring源码阅读】IOC容器的依赖注入

从代码中我们看到一个整体的框架,getBean是依赖注入的入口,下面我们将通过createBean方法了解注入的整个实现过程。在这个过程中,会根据BeanDefinition的要求生成Bean对象,同时对Bean初始化。SpringIOC容器的依赖注入发生在用户第一次向IOC容器获取Bean时。除在BeanDefinition中设置lazy-init属性让容器完成bean的预实例化。所以这篇文章,我们将从getBean()方法入手分析SpringIOC容器依赖注入的过程。

2023-03-10 17:46:44 247

原创 Spring源码阅读-IOC容器初始化过程

BeanDefinition 就是POJO对象在IOC容器中的抽象。通过BeanDefinition 这个数据结构,使IOC容器能够方便的对POJO对象也就是Bean进行管理。将BeanDefinition 注册到hashmap中,也就是一个IOC容器中。Spring IOC容器的初始化过程:Resource定位,BeanDefinition载入,向IOC容器注册BeanDefinition。整个过程由refresh()方法触发,三个过程由不同的模块完成,使用户更加灵活的对这三个过程剪裁和扩展。

2023-03-05 23:13:28 467

原创 【设计模式】策略模式在Java工程中应用

策略模式帮助我们把相似的算法抽象,使用上下文管理抽象类的具体实现,每次新增算法时,只需新增具体实现。使我们的代码轻松解耦,符合开闭原则,极大的缩小了影响范围。是成为一名优秀工程师的必修课!

2023-02-26 23:56:38 1255 2

原创 Spring-依赖控制反转和IOC容器

什么是依赖控制反转和IOC容器?什么是Spring设计的核心?

2023-02-12 23:44:25 335

原创 rocketmq源码打包

以上就是对rocketMq source 源码打包的过程,供大家参考。

2023-02-03 15:02:22 1157 1

原创 Zookeeper-应用-分布式锁以及和Redis实现对比

分布式锁是控制分布式系统之间同步访问共享资源的一种方式。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要通过一些互斥手段来防止彼此之间的干扰,以保证一致性,在这种情况下,就需要使用分布式锁了。前面我们分享过了使用Redis实现分布式锁。这篇文章中,我们聊一下使用ZooKeeper如何实现分布式锁......

2022-06-17 17:56:37 759

原创 ZooKeeper-集群-ZAB协议与数据同步

在前面两篇文章中,我们认识了什么是ZooKeeper,ZooKeeper有哪些功能,ZooKeeper集群,ZooKeeper集群中的选举机制。那么在ZooKeeper集群中,数据是如何在节点间同步的呢?数据同步过程中又会产生哪些问题又是如何解决的呢?......

2022-06-03 00:16:29 819

原创 Redis-作为缓存可能遇到的问题

Redis作为缓存,不是存进去就万事大吉了,还要根据调用场景,缓存的内容,请求方式,QPS,合理设置过期时间等采取预防措施。

2022-05-28 23:35:37 449 1

原创 【设计模式】策略模式与spring结合

       在上一篇《【设计模式】策略模式》中,我们讲解了策略模式的基本概念和用法。策略模式是符合“开闭原则”的典型案例,但在上一篇文章中,我们发现,如果想调用其他的策略,虽然不用修改核心业务代码,但需要修改客户端代码。我们说,将策略的选择放在功能页面,当用户选择时,向后端传入策略,从数据库字典表中获取该策略对应的类的名字,再通过反射,获得对应的策略类。但如果不修改数据库,还有没有别的方法?当然...

2018-09-11 19:32:21 736 1

原创 依赖倒置原则(DIP)系统化总结

本文系统解析依赖倒置原则(DIP),厘清“依赖”为编译期静态类型关系,而非运行时调用。强调高层应依赖抽象,低层依赖抽象,核心是静态依赖箭头倒置。通过底盘-轮胎与线程框架案例,揭示DIP在JDK、UML及SOLID中的体现。辨析DIP、IoC、DI三者正交关系:DIP关注依赖方向,IoC关注控制反转,DI是其实现手段。指出常见“伪DIP”陷阱——接口由低层定义,导致高层被动适配。强调正确做法:接口应由高层(调用方)定义,描述其所需能力,实现方遵循契约。最终实现从“模糊理解”到“系统化构建”的跃迁。

2026-10-16 17:33:46 290

原创 LangChain 系统化学习入门

本文系统解析LangChain的5W2H框架,阐明其作为大模型应用编排层的核心作用。通过对比Spring框架,揭示其组件化、数据流驱动的架构设计;结合Java故障诊断RAGDemo案例,展示如何利用LCEL实现查询改写、向量检索与LLM生成的链式编排。强调开发难点已从编码转向应对模型不确定性,核心在于构建稳定可靠的AI业务系统。

2026-10-14 16:30:35 220

原创 大语言模型应用开发全景地图

本文构建了一张大模型应用开发的分层地图,从基座层(LLM)到交付层逐层解析:基座层提供语义推理能力;编排层(如LangChain、LangGraph)实现组件化与流程编排;业务能力层(RAG、Agent、Tool等)定义具体AI功能;交付层则以CLI、Web服务或系统内嵌形式对外输出。各层自下而上依赖,同层可协作,共同支撑AI应用工程化落地。

2026-10-14 14:18:49 176 1

原创 从三门问题看概率本质

三门问题揭示了概率的本质:并非事物固有,而是信息差的体现。主持人知情时,其确定性剔除错误选项,使换门胜率升至2/3;若主持人盲开,则概率均等为1/2。关键在于区分“有效筛选”与“随机试错”。人生决策亦如此——不靠直觉看选项数量,而应审视信息来源与筛选逻辑,用理性重构概率权重,破除锚定,实现认知跃迁。

2026-09-18 17:59:24 280

原创 【设计模式】装饰模式(四):框架源码实战——从 Java I/O 到 Spring 到 MyBatis

本文通过Java I/O、Spring HttpServletRequestWrapper和MyBatis缓存三个经典案例,深入解析装饰模式的实战应用。揭示其核心思想:不修改原类,动态叠加功能,实现“开闭原则”。Java I/O展现完全透明的装饰链;Spring Wrapper体现半透明妥协——部分方法需强转;MyBatis缓存则实现框架级自动化组装。三者对比凸显装饰模式在灵活性、可扩展性与工程权衡中的价值。文章总结出“3秒识别法”与使用信号,强调装饰模式适用于可选、可叠加、运行时动态增强的场景。

2026-09-17 16:48:12 331 1

原创 【设计模式】装饰模式(三):从装饰模式看 Java 与面向对象设计(原理篇)

装饰模式通过“同接口继承+聚合关联+方法重写委托”,实现对对象的动态功能扩展。其核心在于:调用方透明(无需修改代码)、不改变核心类(零侵入)、运行时动态组合(灵活配置)。本质是利用多态与委托链,让装饰器层层嵌套,既保持接口统一,又实现功能叠加,完美契合开闭原则,是应对“动态加功能”场景的优雅解法。

2026-09-15 20:48:03 257

原创 【设计模式】装饰模式(二):认识装饰模式

装饰模式通过动态组合方式为对象添加职责,核心在于“运行期决定”而非“编译期继承”。以小明穿搭为例,基础功能(短裤+背心)与附加行为(外套、衬衣等)分离,实现透明性、开闭原则与灵活组合。关键机制包括:统一接口、聚合被装饰类、递归调用。相比继承和if-else,装饰模式避免代码爆炸,支持配置化扩展,是实现“动态加功能”的优雅方案。

2026-09-14 21:31:36 349

原创 【设计模式】装饰模式(一)实战:从计费系统的“动态加功能“说起

本文以计费系统中“动态加规则”需求为切入点,对比条件判断与继承模式的局限,提出用装饰模式解决功能灵活组合问题。通过将核心逻辑与装饰逻辑分离,实现零代码修改下按需组装不同计费流程,支持顺序自由调整、功能复用与可扩展性。关键在于统一接口、抽象装饰器持有接口引用,运行时通过多态动态绑定,使功能如“穿衣”般自由穿脱,真正实现开闭原则。

2026-09-12 20:53:03 319

原创 成长看得见:从科学到亲身验证

“成长看得见”本质是通过可测量的进步打破认知盲区,实现自我效能感的跃迁。作者在米老师指导下,从盲目模仿音标转向基于物理原理的推导学习,构建了体系化认知框架。这一转变使模糊的努力变为可验证的进展,正反馈机制激活持续成长动力。当个体清晰看见“我在哪、进步多快”,便产生“我能行”的信念,进而驱动主动前行——成长因此从被动接受变为自我驱动。

2026-09-11 08:59:51 308 1

原创 Agent 是什么?从 RAG 的局限到自主决策

本文以“红烧肉”类比,深入浅出解析RAG与Agent的本质区别:RAG解决知识缺失,但仅能执行固定流程;而Agent核心在于自主决策,通过ReAct等模式实现“思考→行动→观察”的动态循环。文章从宏观(为何需要Agent)、中观(Agent类型谱系)到微观(工作机制)三层拆解,指出Agent是LLM+工具+自主控制流的结合体,适用于复杂、不确定任务。最终强调:真实场景中,Agent常与Workflow混合使用,平衡灵活性与可控性。

2026-09-10 18:01:02 191

原创 一顿红烧肉,搞懂 RAG:从零拆解检索增强生成的两大阶段

本文通过“红烧肉配红酒”的生活故事,生动类比RAG技术原理:用户提问如点菜,大模型似厨师,而RAG则如助理——提前整理知识库(索引构建),实时检索相关资料并辅助生成答案。全篇拆解RAG两大阶段:离线索引构建(文档分块、向量化、存入向量库)与在线问答(问题向量化、语义检索、上下文组装、LLM生成)。附泳道流程图与避坑要点,帮助初学者系统掌握RAG核心机制。

2026-09-10 10:46:48 271

原创 【设计模式】-命令模式学习(三)-思考三道题

本文通过三道自检题探讨命令模式的设计要点:1)Command用抽象类因需共享字段,Cook用接口仅定义契约;2)职责划分上,Dispatch应保持"薄转发层",队列管理更适合由NotifierImpl处理;3)扩展性上,采用"数据驱动"方案只需修改配置文件,无需改动代码,通过配置映射实现新增菜品功能。文章强调设计选择应基于具体场景,变化应转移到合适位置,体现"没有对错,只有选择"的设计哲学。

2026-08-18 17:26:43 217

原创 【设计模式】-命令模式学习(二)-没有绝对

本文探讨了命令模式在餐厅点餐系统中的实践应用,重点分析了服务员角色职责的变化。传统点单模式下,服务员需承担接单、分单、通知等多项职责;而扫码点单系统则解耦了这些功能,使服务员回归纯服务角色。通过引入Dispatch调度中心和INotifier通知接口,实现了依赖倒置和职责分离,同时保持了命令模式的核心优势——命令队列管理。文章强调设计原则应结合实际场景灵活应用,没有绝对正确的设计,关键在于理解不同选择背后的考量。最后通过完整类图和代码演示了扫码点餐系统的实现方式。

2026-08-11 21:30:58 301

原创 【设计模式】-命令模式学习(一)

本文通过烧烤店点餐的案例,生动讲解了命令模式的设计与实现。作者将服务员、厨师和顾客分别对应到命令模式中的Invoker、Receiver和Client角色,用Java代码实现了点餐、记录和烹饪的完整流程。重点分析了命令模式通过封装请求为对象,实现客户与执行者的解耦,支持请求排队和撤销操作的特点。文中还探讨了设计过程中的思考,如如何正确分配职责、类图设计等,最后提出两个待解决的问题:服务员职责是否单一以及错误处理机制,为后续文章留下伏笔。(149字)

2026-08-08 18:04:48 320

原创 2026半年总结

这篇2026年半年总结以学习成长为核心,主要分享了三点收获:1.学会"确认完成"的心理机制,通过科学解释未完成任务对大脑的持续占用,建立及时闭环的习惯;2.掌握高效学习方法,包括提问技巧、解构思维和分门别类,结合神经科学原理说明重复学习的重要性;3.技术之外的成长,如与家人相处时换位思考,以及通过禅师故事领悟自我和解。文章记录了从被动学习到主动思考的转变过程,展现了认知方式和工作习惯的系统性升级,最终实现更轻松高效的学习状态。

2026-07-31 21:29:29 267 3

原创 英语学习记

本文总结了英语音标学习过程中提炼的四个高效学习方法(分类法、迁移法、起点法、组合法),并演示如何迁移应用到计算机领域。以Java泛型为例,通过分类构建类型边界(extends/super)、迁移普通变量与泛型变量的区别、以使用场景为起点串联知识点、组合基础语法形成新概念等方式,验证了方法的普适性。最后提出知识体系的建构策略:多维度拆解(基础构成/类型约束/语言演进)后交叉重组,形成立体认知。强调学习要注重实践验证、规律总结和知识溯源,最终实现"成长看得见"的良性循环。

2026-07-25 11:50:08 252 2

原创 Java泛型:类型参数<T>与通配符?

本文深入解析Java泛型中的类型参数<T>与通配符?的核心区别与应用场景,并结合实例进行了深入讲解。如果你也不会,点进来了解一下吧

2026-07-11 17:33:55 340

原创 再学面向对象

本文通过重温Java面向对象编程课程,以"开车去新疆"为例生动阐释了面向对象的核心思想。文章首先对比了面向过程与面向对象两种实现方式的差异,强调面向对象通过封装细节(如车.go()方法)提高了代码复用性。重点讲解了类和对象的概念,提出从静态属性(成员变量)和动态行为(方法)两个维度分析类的设计,并系统梳理了UML中6种类间关系(泛化、实现、组合、聚合、关联、依赖)。最后通过三步分析法(找名词对象→区分静态/动态→确定类关系)完整实现了"开车去新疆"的面向对象设计。

2026-07-07 11:11:34 199 1

原创 Java抽象类与接口:从概念辨析到实战选择的深度指南

本文对比了Java中抽象类和接口的区别与应用场景。抽象类用于复用共享代码和状态,强调"是什么"(is-a关系);接口用于定义能力契约,支持解耦和多实现,强调"能做什么"(can-do关系)。通过数据访问层设计案例,展示了接口定义规范、抽象类提取公共逻辑的最佳实践,体现了抽象隔离变化、接口解耦模块的核心思想。

2026-06-23 17:04:29 381

原创 抽象与接口:从公理到计算机学科全链路

本文探讨了抽象与接口在计算机科学中的本质及其理论依据。基于软件工程的两大公理——"软件唯一不变的是变化"和"复杂系统必须分层解耦",文章系统推导出抽象是将变化剥离形成可复用稳定层的手段,而接口则是跨模块稳定契约和解耦的载体。最后,文章揭示了抽象与接口在整个计算机学科中的贯穿性作用,从硬件层到业务架构层,每一级抽象都在复用下层能力并重新封装,形成应对系统变化的解决方案。

2026-06-22 21:08:06 397

原创 依赖倒置原则(DIP)终极指南:从官方定义到实战拆解,彻底告别“高内聚低耦合“的模糊理解

本文深入解析依赖倒置原则(DIP),从其两条核心断言出发:"高层模块不该依赖低层模块,两者都应依赖抽象"和"抽象不依赖细节,细节依赖抽象"。通过领导与下属的生动比喻,说明直接依赖导致的问题,并指出引入"通知部门"(抽象层)是实现解耦的关键。文章提供了代码示例对比依赖倒置前后的实现差异,强调DIP能提高扩展性和复用性。最后给出5步自查清单,帮助判断代码是否遵循DIP,并分析通知系统中DIP的体现。核心在于通过抽象层打破循环依赖,但需权衡引入的复杂度。

2026-06-12 11:39:14 271 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除