YI FANG
目录

INDEX / FULL TEXT

搜索

按标题、摘要和主题标签查找文章。

过了斩杀线,还没过验收线:DeepSeek V4-Flash 正式版发布随想

从 7 月 31 日 API 更新日志里的一行字说起:模型的性价比斩杀线被大幅前移,工程级的验收线却不会自己移动。

#大模型 #Agent #AI 编程 #工程判断

如何让 AI 编程 Agent 在真实仓库里交付

以一次失败任务批量重试为例,拆解 Agent 如何理解仓库、约束变更、处理跨层语义,并用可复核证据完成交付。

#AI 编程 #Agent #全栈开发 #软件工程

AI 时代,工程判断比代码产量更稀缺

从一次任务状态模型演进谈起:当实现方案可以快速生成,架构师更需要判断语义、影响半径、可逆性和验证成本。

#AI 编程 #工程判断 #软件架构 #技术决策

架构债务不是旧代码,而是被推迟的系统决定

以任务状态模型为例,说明怎样识别债务利息、设置偿还触发器,并通过双算和影子读取完成可回退迁移。

#架构债务 #系统设计 #渐进式迁移

人工审批不是弹窗:高风险 Agent 操作的事务边界

从一次批量策略变更出发,设计绑定 planHash 的审批协议,并处理状态漂移、重复执行、结果未知、补偿与审计。

#Human in the Loop #AI Agent #事务 #安全

资深工程师的产出,不应该只存在于代码仓库

从一次配置缺失导致的发布事故谈起:资深工程师如何把修复、反馈、恢复路径和团队判断沉淀成可复用能力。

#高级工程师 #软件架构 #技术领导力 #工程效能

AI 功能怎么发布:把 Evals 做成真正的门禁

固定回归集、权限与对抗用例、影子流量、小流量发布和线上预算逐层放行,模型或提示变化不再靠演示验收。

#Evals #AI 工程 #发布 #可观测性

上下文工程:让 Agent 知道足够多,但不要知道一切

Agent 的能力上限不仅由模型决定,还由信息如何选择、压缩、分层和在任务之间流动决定。

#上下文工程 #AI Agent #RAG #系统架构

编码 Agent 的沙箱:仓库、网络、密钥和资源分别设边界

让 Agent 在真实仓库执行之前,先把允许路径、临时工作树、网络白名单、秘密代理、资源预算和交付证据写进任务契约。

#Coding Agent #沙箱 #安全 #软件工程

AI 辅助编程之后,代码评审要看什么

生成速度提高后,稀缺资源从输入代码变成验证意图、边界与系统影响的能力。

#AI 编程 #代码评审 #工程质量

流式 AI 界面不是 append 文本:事件协议与状态恢复

把 token、工具调用、审批、引用、错误和完成统一成带序号的事件流,页面才能重连、去重并正确表达 Agent 阶段。

#AI 产品 #流式协议 #React #状态机

产品架构与技术架构应该共享同一张问题地图

如果产品按页面拆需求、技术按服务拆系统,两张地图之间的空隙最终会变成协作成本。

#产品架构 #系统设计 #团队协作

海外 ToC 产品中的前端不是一个页面层

当产品面对不同地区、设备与网络条件,前端架构必须同时处理增长、可靠性和体验一致性。

#海外 ToC #前端架构 #国际化

不要把生产密钥交给模型:AI 工具调用的权限网关

模型只提出结构化意图,网关负责 Schema、策略、审批、幂等、短期凭证和审计,把不确定推理隔离在确定性边界外。

#AI Agent #工具调用 #安全 #系统架构

创业阶段的技术决策:先管理不可逆性

资源有限时,架构的职责不是预测全部未来,而是识别哪些错误会昂贵到无法回头。

#CTO #创业 #技术决策

RAG 评估别再问‘感觉怎么样’:从 120 个真实问题开始

把客服与研究任务整理成可复跑数据集,分别衡量检索召回、权限、引用一致性、回答正确性和合理拒答。

#RAG #Evals #AI 工程 #检索

两周交付 AI MVP:速度来自主动缩小系统

短周期不是把完整产品做得粗糙,而是选择一条能验证核心价值、又保留真实约束的最短路径。

#MVP #AI 产品 #创业 #工程管理

多 Agent 系统:协作之前先建立控制面

多个 Agent 不会因为角色名称不同就自动协作。可靠系统需要任务状态、上下文边界、预算和可恢复执行。

#AI Agent #多 Agent #工作流 #系统架构

AI 产品的起点不是模型能力

模型能生成什么只是供给,产品要回答的是谁愿意在什么任务里持续依赖它。

#AI 产品 #产品设计 #大模型

经验年限不等于资深

资深工程师的区别,不在见过多少工具,而在能否识别关键问题、承担后果并提升整个系统。

#职业成长 #工程判断 #技术管理

ADR 怎么写才有人看:记录判断,不记录会议流水账

一次重复争论技术选型后,我们用上下文、备选、后果和复审条件保存决定,并把 ADR 连接到代码与指标。

#ADR #架构决策 #技术管理 #文档

技术负责人的边界:不要成为团队的同步阻塞点

负责结果不等于亲自决定一切。更重要的是建立判断标准,让团队可以独立推进。

#技术管理 #团队协作 #架构

requestId 到了消息队列就断了:异步链路的 Trace Context

一次 API 成功但后台任务失败的排查,推动我们让 traceparent 穿过 HTTP、队列和 Worker,并区分追踪与业务关联 ID。

#分布式追踪 #OpenTelemetry #消息队列 #可观测性

差量更新的收益与代价

只更新变化部分可以减少工作,也会引入缓存、一致性与失效判断的新复杂度。

#性能 #算法 #前端架构

可观测性不是做一块 Grafana 大屏

指标、日志和追踪只有围绕可回答的问题组织,才会在故障发生时产生价值。

#可观测性 #Prometheus #系统稳定性

告警为什么总在半夜吵醒错误的人:从 SLO 到 Runbook

把 CPU 阈值告警改成多窗口错误预算燃烧率,并让每条告警携带用户影响、负责人和可执行恢复步骤。

#SLO #告警 #可观测性 #可靠性

Node.js 优雅退出:先停止接单,再归还资源

Kubernetes 发出 SIGTERM 后,HTTP、队列、数据库和日志应该按什么顺序关闭,才能避免 502、重复任务和丢日志。

#Node.js #Kubernetes #优雅退出 #可靠性

十万级数据渲染:不要让 DOM 承担数据仓库的工作

海量表格与图表的优化,需要把数据获取、计算、布局和绘制分开测量,而不是只加虚拟列表。

#大数据渲染 #Web Worker #性能 #虚拟列表

把十万行计算移进 Web Worker:真正难的是传输与取消

主线程卡顿不是把函数搬进 Worker 就结束了。任务协议、Transferable、过期结果和内存峰值决定最终体验。

#Web Worker #性能 #大数据 #并发

正确使用 CocoaPods 国内源:先分清三段网络链路

安装 CocoaPods 慢、解析 Specs 慢和下载依赖慢是三个问题。先判断命令卡在哪里,再决定是否切换 RubyGems、CDN 或 Git 镜像。

#CocoaPods #Flutter #iOS #工程环境

低代码 BI 引擎:配置能力的边界在哪里

可配置报表不是把组件属性搬进表单,而是建立数据、视觉、交互与运行时之间稳定的中间模型。

#低代码 #BI #前端架构 #数据可视化

低代码配置升级:Schema 迁移不能散落在组件里

历史报表跨过多个版本后,我们用单向迁移、语义校验、黄金样例和失败隔离建立可回放的配置升级管线。

#低代码 #Schema #数据迁移 #TypeScript

多图表页面为什么需要请求调度

当几十个组件同时请求数据,问题不再属于单个组件,而属于页面级资源分配。

#数据可视化 #性能 #请求调度

Node.js 内存泄漏:一次从监控到句柄引用链的排查

真实故障中,怎样把持续上涨的 heapUsed 收敛到 Bull 队列留下的 TCP、Socket 与 EventEmitter,并用多份堆快照完成证据闭环。

#Node.js #内存泄漏 #可观测性 #故障排查

内部平台也有用户体验

工程师不会因为是内部用户,就天然理解混乱的流程、晦涩的错误和没有反馈的操作。

#平台工程 #UI/UX #研发效能

CI 构建一次、部署多次:不可变产物如何让回滚可信

同一提交在预发和生产构建出不同结果后,我们把源码、依赖、制品、SBOM 和部署记录串成可验证链路。

#CI/CD #制品 #供应链安全 #发布

RBAC 不只是用户、角色、权限三张表

权限真正困难的部分,是资源范围、组织关系和业务动作如何共同决定一次访问。

#RBAC #系统设计 #安全

tenantId 不是一个普通筛选条件:多租户隔离的五层防线

一次漏写 WHERE tenant_id 的险情后,我们把租户上下文从认证一直传到数据库策略,并为跨租户操作建立单独通道。

#多租户 #安全 #数据库 #系统设计

把 CI/CD 当作团队产品

流水线不只是 YAML 文件,它有用户、反馈、失败体验和持续演进的成本。

#CI/CD #DevOps #研发效能

审计日志怎么写,才能回答‘谁改了什么’

普通运行日志无法解释一次权限变更。通过主体、资源、动作、前后差异和 requestId 建立可查询且不可随意修改的审计证据。

#审计日志 #安全 #内部平台 #数据模型

异步任务可靠性的四个问题

队列只能保存任务,可靠性来自幂等、状态、重试和人工恢复共同构成的闭环。

#Node.js #消息队列 #可靠性

消息至少会来两次:异步消费者的幂等边界

一次队列超时重投导致重复通知,让我把 messageId、业务写入和 ACK 放进可解释的事务流程。

#消息队列 #幂等 #异步任务 #数据库

把研发流程做成产品:一个内部平台的起点

连接代码、构建、项目与通知系统时,最难的不是接口数量,而是定义谁拥有流程状态。

#Node.js #React #研发效能 #平台工程

从完成页面到理解系统

工程师能力的变化,常发生在开始为上下游结果负责,而不只为自己这一层负责时。

#系统思维 #职业成长 #架构

回滚要在发布之前设计:一次可逆部署的时序

从覆盖服务器目录改成不可变产物、渐进切流量和自动停止,回滚才从应急命令变成经过演练的正常路径。

#发布 #回滚 #CI/CD #可靠性

性能不是分数,而是一份持续预算

从 QPS、首屏到交互流畅度,性能只有被放进业务链路和发布流程,才不会在下一次迭代中消失。

#性能 #SSR #工程体系

内部平台为什么需要控制面:不要让页面直接遥控脚本

从一个能触发构建的按钮,演进到有状态机、租约、权限、产物和恢复入口的任务控制面。

#内部平台 #任务编排 #Node.js #系统设计

JSBridge 的本质是一份跨端协议

WebView 与原生端的通信不能只靠函数名约定,它需要版本、错误与能力协商。

#JSBridge #跨端 #架构

重构 SSR:性能问题首先是系统问题

从单页优化走向服务端渲染链路,真正的瓶颈往往不在某一行代码,而在缓存、流量与降级策略的组合。

#SSR #Nuxt.js #性能 #架构

功能开关不是一个 if:一次分阶段发布的完整设计

为了降低播放器重构风险,我们把稳定分桶、指标对照、自动停止和过期开关清理做成同一条发布流程。

#Feature Flag #灰度发布 #可观测性 #工程管理

跨端复用,先明确不能复用什么

Web、H5 与小程序共享业务,却拥有不同运行环境;复用率不是越高越好。

#跨端 #小程序 #架构

WebView 登录态怎么传:不要把长期 token 交给 H5

一次把 App token 拼进 URL 的方案,暴露了日志泄漏、过期与多端不一致问题。最终用能力白名单和短期会话划清边界。

#WebView #认证 #JSBridge #安全

规范的价值,是减少无意义的决定

代码规范、提交格式和目录约定不负责提升上限,它们负责让团队把注意力留给真正的问题。

#前端工程化 #团队协作 #代码质量

缓存同时过期之后:一次 SSR 回源风暴的处理

热门页面缓存到期时,请求一起打到上游。通过 stale-while-revalidate、单飞锁和随机抖动把尖峰变成可控刷新。

#缓存 #SSR #Node.js #可靠性

离开熟悉业务之前,先带走方法

项目经验会过期,解决问题时形成的观察、验证与协作方法更值得沉淀。

#职业成长 #工程方法 #复盘

一块大屏发出 47 个请求之后:给查询和渲染设预算

监控大屏组件越加越慢,我把首屏、查询、数据量和刷新频率变成可计算预算,并追踪每个超预算项。

#性能 #监控大屏 #请求调度 #数据可视化

监控界面如何处理信息密度

密集并不等于混乱。业务工具需要的是可扫描的层级,而不是更多留白或更多颜色。

#UI/UX #监控系统 #信息架构

前端也需要可观测性

用户说页面卡住时,我们需要的不只是复现运气,而是一条能还原现场的证据链。

#可观测性 #性能 #前端工程化

只有错误堆栈还不够:给前端异常补一条用户动作时间线

一个无法复现的筛选崩溃,让我用有限 Breadcrumb 记录路由、请求和状态转移,并学会控制隐私与噪声。

#前端监控 #可观测性 #隐私 #故障排查

图表是一种语言,不是一种装饰

可视化的起点不是选择折线图或柱状图,而是明确读者需要比较、定位还是解释什么。

#数据可视化 #ECharts #产品设计

图表画错了,但代码没有报错:可视化前的数据管线

一张趋势图把缺失值连成增长,让我开始在图表库之前建立字段校验、口径转换和视觉编码管线。

#数据可视化 #数据质量 #TypeScript #前端架构

前后端联调反复返工后,我开始认真写接口契约

字段表解决不了分页、错误、幂等和兼容问题。一次反复联调让我把接口契约扩展成可以共同验证的边界。

#API #契约测试 #前后端协作 #系统设计

组件边界不等于视觉边界

把每个方框都做成组件,只会得到更分散的耦合;边界应跟随变化原因。

#Vue #组件设计 #前端架构

第一次线上白屏:先恢复页面,再保住证据

一次 HTML 与静态资源版本错配导致的白屏,让我第一次完整经历发现、回滚、缓存处理和发布复盘。

#线上故障 #发布 #前端监控 #缓存

第一份生产代码教会我的事

能运行的代码进入真实业务后,会立即遇到数据、环境和协作带来的第二重复杂度。

#工程实践 #前端 #职业成长

复杂表单不是一组输入框:把提交过程画成状态机

一个重复提交和旧校验覆盖新输入的表单,迫使我把 editing、validating、submitting 与 failed 写成明确状态。

#TypeScript #状态机 #表单 #前端工程

界面复杂度,首先是状态复杂度

当页面开始失控,与其继续补事件处理,不如先列出系统到底允许哪些状态。

#前端 #状态管理 #JavaScript

第一次解决 Git 冲突:不要只让文件变绿

一次两个人同时修改导航栏的冲突,让我明白合并不是删除标记,而是重新确认双方意图和可运行结果。

#Git #协作 #代码评审 #工程实践

为什么我选择前端

前端的价值不只是还原界面,而是在不确定的需求与确定的机器规则之间建立连接。

#前端 #职业选择 #产品

第一次用 Network 面板拆开一个慢请求

页面打开要四秒,真正慢的却不是 JavaScript。把排队、DNS、建连、TTFB 和下载拆开后,我第一次看见 HTTP 请求的完整生命周期。

#HTTP #浏览器 #性能 #调试

浏览器里的第一张完整页面

页面能显示只是开始,结构、样式与行为各自承担什么,决定了代码能走多远。

#JavaScript #HTML #CSS

一次点击执行两遍:我怎样弄懂 DOM 事件传播

一个列表按钮触发两次删除,让我第一次沿着捕获、目标和冒泡阶段理解浏览器,而不是继续堆 stopPropagation。

#JavaScript #DOM #浏览器 #调试

第一个真正有用的小工具:批量改名前先生成计划

为了整理课程资料写了一个批量改名工具,也第一次碰到覆盖、冲突、半成功和回滚这些真实文件操作问题。

#Java #CLI #文件系统 #工程实践

第一次真正理解抽象

抽象不是把名字改得更高级,而是找到变化与不变之间那条可靠的边界。

#Java #抽象 #设计

用 Java 写零件清单:数据模型从现实约束里长出来

把机械专业熟悉的零件清单写成程序后,我第一次发现,类不是名词翻译器,真正重要的是单位、精度和不变量。

#Java #数据模型 #领域建模 #学习记录

第一次学会调试:先让错误稳定地发生

从一个时好时坏的 Java 成绩统计程序开始,我第一次理解:调试不是盯着代码猜,而是把现象变成可重复实验。

#Java #调试 #测试 #学习记录

从机械图纸到第一段 Java 程序

编程最早教给我的不是语法,而是如何把一个含混的问题拆成可以执行的步骤。

#Java #学习方法 #工程思维