- 博客(72)
- 收藏
- 关注
原创 Vibe Coding 一年后,我开始担心的不是 AI 写错代码
过去一年,我几乎把能交给 AI 的开发工作都交给了 AI。不是偶尔让它补一个方法,也不是只让它写单测,而是真正把它当成主要开发入口:读代码、改接口、补表结构、重构模块、排查异常、分析日志,甚至一个功能到底应该落在哪个模块里,我也会先让模型把整个仓库看一遍,再给出方案。模型能力越来越强以后,这种变化非常明显。以前需要我自己在 IDE 里来回跳几十个文件才能建立的上下文,现在它几分钟就能整理出来;一个跨多个模块的改动,也可以连着调用链、数据结构和测试一起改掉。
2026-10-28 11:07:03
269
原创 Windows Chrome 数据搬到 D/F 盘,所有软件打开都用同一套浏览器
不要删除 F 盘真正存数据的文件夹(本例是不要删除 C 盘新建的User Data联接。它是 Chrome 找到 F 盘数据的入口。Chrome 程序本身仍可能安装在 C 盘;这里迁移的是用户数据,不是软件安装位置。只有使用 Chrome 默认数据目录的程序才会走这个联接;软件若指定独立目录,或使用内置浏览器,则不受影响。把 Chrome 数据放到其他盘,再让 C 盘默认目录指向它。
2026-10-15 17:30:50
203
原创 如果 AI 比工程师聪明 100 倍,未来还需要工程师吗?
人的工作不再是“怎么写”,而是定义这些 Agent 能做什么、不能做什么,失败时怎么恢复,以及什么情况下必须升级到人工决策。未来工程师留下来的价值,可能不是因为他比 AI 更聪明,而是因为他能够理解 AI 的决策,并且拥有对这个决策负责的权限。真正值得想象的是:如果未来 AI 不只是会写代码,而是比今天聪明 100 倍,能够自己读完整代码库、理解业务、做架构设计、跑测试、分析监控、处理故障,甚至让不同 Agent 相互 Review,那么“架构师不会被替代,因为架构需要经验”这句话还成立吗?
2026-09-16 17:32:22
101
原创 真正让 Agent 能上线的,不是模型,而是 Harness
很多 Agent Demo 看起来都很完整。模型接收用户目标,分析上下文,选择 Tool,然后调用后台接口。只要模型选对了工具,整个链路就像已经成立。比如用户说:帮我把这张订单退掉。Demo 到这里通常已经结束了。但真正进入生产环境以后,我越来越觉得,决定这个系统能不能上线的,根本不是模型会不会调用这个 Tool,而是模型提出“我要退款”之后,这中间那一层,我更愿意叫它 Harness。它不是一个新的模型,也不是一套花哨的 Agent 框架。
2026-08-30 11:14:35
302
原创 Agent 越聪明,后台系统越需要确定性
很多人第一次做 Agent,都会被它“会自己想办法”这件事吸引。以前我们写后台,流程基本是确定的。用户点了“取消订单”,前端调,后台校验状态,能取消就取消,不能取消就返回原因。路径虽然不一定短,但开发者大体知道程序接下来会走到哪里。Agent 不一样。用户只说一句:这个订单我不想要了,你帮我处理一下。模型需要自己理解“处理一下”是什么意思。订单没付款,可能直接关闭;已经付款但没发货,可能取消订单并发起退款;已经发货,就不能再走取消,而应该进入售后。模型会查询订单、分析状态、选择工具,然后继续执行。
2026-08-14 15:07:18
347
原创 Tool 不是函数,而是企业的软件能力
很多 Agent 项目做到 Tool 这一层,代码会突然变得很简单。模型识别用户意图,选择一个函数,然后把参数填进去。开发者只需要写几个注解,Agent 就可以查询订单、取消订单、申请退款,甚至修改地址。从代码上看,这几乎没有什么值得讨论的地方。Tool 不过是一个可以被大模型调用的方法,输入是结构化参数,输出是一段执行结果。也正因为如此,很多团队会把 Tool 设计当成一项接入工作:把现有接口包装一下,加上名称、描述和参数定义,然后交给 Agent。这种做法在查询类场景里通常没有问题。
2026-07-28 14:33:45
325
原创 真正难的不是 Agent,而是 Workflow
很多 Agent Demo 都有一种非常顺滑的感觉。用户说一句话,模型理解目标,拆解步骤,然后依次调用工具。查询、判断、执行,最后返回结果。整个过程像一段比普通代码更聪明的函数调用。例如,用户说:帮我订一张明天下午去上海的高铁票,二等座,价格无所谓。如果只是演示,这个流程已经足够完整。模型理解了“明天下午”,知道目的地是上海,也知道二等座是一项约束。它还能在多个车次中做选择,甚至向用户解释为什么推荐某一班。这正是 Agent 最吸引人的地方。
2026-07-18 22:01:18
309
原创 我越来越不相信,一个 Agent 就能解决所有业务
真正决定一个 AI 应用能不能走到生产环境的,从来不是 Agent 有多聪明,而是它背后的后台系统,到底是不是一个足够可靠的基础设施。而下一次,当我们开始讨论 MCP、Tool、Workflow,甚至 Multi-Agent 的时候,我发现自己已经很少先看模型了。慢慢地,我们发现,所谓的 Tool,其实已经不像一个简单的方法,而更像一个完整的业务系统。我想把昨天买的耳机退掉,如果不能退,就帮我申请售后,如果售后也不行,就联系客服。用户输入一句话,Agent 理解意图,然后调用几个 Tool,事情就结束了。
2026-06-26 15:36:57
250
原创 为什么很多架构师,最后都开始反对CQRS?
这些年看过很多架构演进。会发现一个特别有意思的规律。初级工程师喜欢问:哪个方案最好?资深工程师更喜欢问:这个方案的代价是什么?CQRS 当然有价值。甚至在某些场景里非常强大。但它从来不是银弹。它解决的问题越高级。引入的复杂度也越高。所以真正成熟的团队。最后关注的往往不是:能不能上 CQRS。而是:这个业务,真的值得付出 CQRS 的成本吗?
2026-06-15 11:50:08
202
原创 为什么很多微服务系统,最后都在偷偷“合并”?
过去几年最大的变化之一。不是微服务失败了。而是大家终于开始理性看待微服务。微服务当然有价值。但它不是银弹。更不是技术先进的象征。很多团队最后重新合并服务。也不是因为技术倒退。而是因为:他们终于发现。真正困难的从来不是怎么拆。而是:怎么控制复杂度。而控制复杂度这件事。远比选择单体还是微服务重要得多。
2026-06-05 20:55:14
198
原创 为什么很多公司最后放弃了 TCC,转向 Saga?
很多人学分布式事务的时候,总想找到:终极正确方案。但真实世界里的大型系统,从来没有银弹。TCC 不是错。Saga 也不是更高级。它们本质上只是:不同阶段、不同业务下的取舍。而真正成熟的架构师,最后拼的也不是:会多少技术名词。而是:能不能理解真实系统里的复杂性,到底来自哪里。
2026-05-15 17:38:43
376
原创 真正的大厂系统,靠的不是“不出错”,而是“出错也能活”
但真实世界里,还有一个更残酷的问题:系统一定会出错。数据库会超时。MQ 会丢消息。第三方支付会抽风。网络会抖。服务会雪崩。真正成熟的系统,从来不是“永远正确”。而是:即使局部出问题,系统依然能慢慢恢复。
2026-05-06 16:57:24
340
原创 订单系统到底该怎么建模(五):高并发与秒杀场景下的订单系统设计
你必须承认一件事:系统不是无限吞吐的。QPS 限流熔断降级否则再好的设计也会被打死。
2026-04-22 17:47:44
357
原创 订单系统到底该怎么建模(四):微服务拆分与聚合边界的终极实践
从单体到微服务,不是技术升级,而是边界能力升级。如果你走到这一步,其实已经具备系统设计能力了。
2026-04-15 17:53:46
338
原创 订单系统到底该怎么建模(三):从 DDD 到代码落地,不再是“画图游戏”
前两篇我们聊了两件事:第一篇,是“你到底在建什么模型”第二篇,是“这些模型之间的边界怎么划”如果你认真思考过,其实你已经完成了 70% 的设计工作。但很多人会卡在最后一步:模型是有了,但代码一写,又回到了 Controller + Service + DAO 的老路。这一篇,我们就把最后这一步补上:怎么把 DDD 真正落地到代码结构,而不是停留在 PPT 上。
2026-04-07 12:19:16
220
原创 订单系统到底该怎么建模(二):聚合边界,比你想的重要得多
很多人一上来就问:Order 要不要做聚合?Payment 要不要?其实这个问题问反了。你应该先问的是:哪些数据,必须在同一个事务里保持一致?这句话非常关键,后面所有判断都围绕它展开。
2026-03-30 21:32:25
355
原创 订单系统到底该怎么建模:从 DDD 开始
做后端的,基本都绕不开订单系统。刚开始大家都觉得这个东西不复杂:下单、支付、发货、完成,流程很清晰。但只要真的做过线上系统,很快就会发现,订单系统根本不是“建一张表 + 写几个接口”这么简单。很多人第一反应是上状态机、分布式事务、补偿机制。但如果订单模型一开始就是错的,这些东西只是“止痛药”。这篇文章只讲一个问题:订单系统,到底该怎么建模?
2026-03-24 19:18:25
249
原创 KMP算法
KMP(Knuth-Morris-Pratt)算法是一种用于在文本字符串中查找模式(子字符串)位置的高效字符串匹配算法。与传统的暴力匹配算法相比,KMP算法通过利用已经匹配过的信息来避免重复比较,从而提高了匹配效率。从上面的例子可以看出,KMP能大大加快我们匹配时移动的速度,解决了字符串匹配的效率问题。很容易理解,如果我们暴力法的话,此时就需要从第二个字符,从头开始继续比较,效率很低。知道概念之后,我们可以利用前后缀,来计算模式P的部分匹配表(LPS array)A 对应 A,匹配。A 对应 A,匹配。
2024-09-01 16:44:10
836
原创 排序算法--堆排序
堆排序是一种利用堆数据结构实现的排序算法。首先,它将待排序的数组构建成一个大顶堆或小顶堆。然后,通过不断将堆顶元素(最大或最小)与末尾元素交换并重新调整堆,使得数组逐渐有序。
2024-08-29 07:59:50
484
原创 Spring 启动详解
Springboot启动流程方法入口: org.springframework.boot.SpringApplication#run(java.lang.String…)StopWatch 开启,公开总运行时间和每个命名任务的运行时间getRunListeners(args) : 获取SpringApplicationRunListener 监听者prepareEnvironment(): 准备环境,并发送环境准备事件给相关listeners,这时候有ConfigFileApplicationLi
2021-04-20 15:16:29
390
原创 ubuntu 下启用ipv6
安装Teredo隧道客户端sudo apt-get install miredosudo miredo用ifconfig 确定是否安装正确查看teredo服务状态sudo systemctl status miredo.service 测试方法:ping6 ipv6.google.com或者 访问 http://test-ipv6.com/ 网站注意点以下只是一些注意点,可能不需要更改也可以访问,按需修改:1.更改miredo配置文件sudo vim /etc/miredo
2020-09-28 11:34:03
2427
原创 mybatis自动生成代码工具,字段注释
1. 配置工具包maven依赖<dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.2</version></dependency><build> <plugins>
2020-08-03 14:54:00
1350
原创 RSA非对称加密
起源最开始,密码学都是基于对称密钥,也就是发送者使用特定密钥加密信息,而接收者使用相同密钥解密。这就造成了一个问题,如果需要和很多人进行通信,那么就要跟每个人都有一对密钥,保管很多不同的钥匙,非常难以管理。RSA就诞生了,它是非对称加密,有不同的加密密钥与解密密钥。它原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥使用有两种使用方式:公钥加密、私钥解密假设B有一对公钥私钥,公钥公开给所有人,A要给B发送一段信息,那么使用B的公钥加
2020-07-13 14:32:57
377
原创 缓存穿透、缓存击穿、缓存雪崩
redis作为基于内存的数据库,并且提供一定的持久化功能,被我们广泛用于缓存,加锁等场景中,作为中间件用于解决数据库读写慢等问题。但是引入redis又有可能出现缓存穿透,缓存击穿,缓存雪崩等问题。缓存穿透描述: 某个key对应的数据在数据源并不存在,每次针对此key的请求都会到数据库,从而可能造成数据库压力过大,压垮数据库。比如请求伪造一个缓存中可能不存在的id ,例如负数,uuid 等解决方法:布隆过滤器:布隆过滤器能实现判断一定不存在的数据,将所有可能存在的数据哈希到一个足够大的b
2020-06-21 23:04:37
207
原创 uefi引导windows + linux双系统安装
最近突然想玩一玩linux系统,所以选择安装windows + ubuntu 双系统,因为这是第一次安装,所以这篇博客记录一下安装过程。我就按照官网已经有教程来尝试吧先确定安装要准备好的条件要安装系统首先需要下载镜像, 下载网址:官网下载系统镜像,也可以点击选择替代版本找到所需要的版本,这里我选择ubuntu16.04这里我试了一下,下载特别慢,还是去国内镜像网站下载,...
2020-03-28 14:51:35
1351
原创 excel导出加密
今天需要写一个excel导出加密,具体实现方法是先将文件导出,再获取文件,加密后导出成新的文件,删除或替换原文件。依赖包poi 一定要注意最好是3.17,我之前用的是4.1.0打开会显示文件损坏,还没找到原因。加密代码如下,参考用的是:https://poi.apache.org/encryption.htmlXML-based formats - Decryption/** ...
2020-02-20 21:07:32
1591
原创 MultipartEntityBuilder 中文乱码,File转MultipartFile
将file先转为fileItem再转为MultipartFileFile file = new File("*****");DiskFileItem fileItem = new DiskFileItem("file", "text/plain", false, file.getName(), (int) file.length() , file.getParentFile()); ...
2020-02-20 16:18:04
885
原创 java8中map排序问题及方法使用
Map<String, List<String>> itemId2userIds = Maps.newHashMap();List<String> sortItemIds = itemId2userIds.entrySet().stream().sorted(Comparator.comparingInt(s -> s.getValue().size(...
2019-12-29 23:51:28
750
原创 postman请求传参为Boolean布尔值
今天使用postman调用接口时,传参为Boolean时遇到了问题:使用传输方式:{ "flag": true, "key": "bonus_gray", "secret": ".."}方法:public String markSwitch(Boolean flag, String key, String secret) {...}报错信息:java.lang.Runtime...
2019-12-04 11:12:28
10040
原创 linux 常用命令
目录:cd:变换目录pwd:显示目前的目录mkdir:创建一个新的目录rmdir:删除一个空的目录. : 代表此层目录… : 代表上一层目录– : 代表前一个工作目录~ : 代表『目前使用者身份』所在的家目录~account : 代表 account 这个使用者的家目录(account是个帐号名称)文件查看:cat 由第一行...
2019-11-30 23:13:27
182
原创 spring线程池ThreadPoolTaskExecutor
概述多线程编程时,频繁的创建线程和销毁进程会降低系统运行的效率,也不好控制容易出错,所以线程池产生,ThreadPoolTaskExecutor是spring中的线程池技术,它主要是使用jdk中的ThreadPoolExecutor进行实现。通常使用线程池是为了提高系统效率和吞吐量,做一些异步操作ThreadPoolExecutor的构造方法public ThreadPoolExecutor...
2019-10-16 18:45:04
541
1
原创 sql 相关问题记录
本篇博客主要记录平时写代码过程中的sql语句或者碰到的问题insert重复键问题有三种方法:INSERT IGNORE INTO: 如果有条目匹配unique key或primary key,忽略不插入注意点:如果出现问题,MySQL将不会显示任何错误,因此无法处理错误,自动增量键仍会增加。INSERT REPLACE INTO:替换条目,如果有条目匹配unique key或prima...
2019-09-19 17:50:37
259
原创 n叉树的遍历
前序遍历: 先遍历根节点 再遍历根节点1,3,5,6,2,4后序遍历: 先遍历根节点 再遍历子节点5,6,3,2,4,1java递归遍历方法private void preorder(Node root) { if (root == null) return; // 此处前序遍历 for (Node node : root.children) { ...
2019-08-29 16:56:08
193
原创 redisTemplate常用方法记录
我们平时使用redis有以下几种用途:缓存 public void set(String key, Object object, int expireSecond) { ValueOperations<String, Object> ops = redisTemplate.opsForValue(); ops.set(key, object, expir...
2019-08-21 20:51:47
289
原创 java8 stream 记录
常用方法filter(T -> boolean) 保留 boolean 为 true 的元素distinct() 去重sorted(Comparator.comparing()) / sorted((T, T) -> int) 排序map(T -> R) 将流中的每一个元素 T 映射为 R(类似类型转换)limit(long n) 返回前 n 个元素skip...
2019-07-25 20:06:02
249
原创 grafana
简介Grafana是一个功能齐全的度量仪表盘和图形编辑器工具,他一般是和一些时序数据库进行配合来展示数据。mac下用brew安装brew updatebrew install grafana安装完成后运行grafana,默认端口3000// startbrew services start grafana// stopbrew services stop grafana然后就可...
2019-07-03 17:30:48
967
原创 二叉搜索树出现最多的数
二叉搜索树它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树中序遍历中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。若二叉树为空则结束返回,否则:(1)中序遍历左子树(2)访问根结点(3)中序遍历右子树中序遍历结果...
2019-06-28 16:03:54
430
原创 mac 安装redis
安装brew进入 https://brew.sh/ 官网, 按照官网上面命令。等待安装好之后用brew命令安装redisbrew install redis安装成功配置文件路径: /usr/local/etc/redis.conf在这里插入图片描述...
2019-06-27 13:39:29
189
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅