· liyu · life · 11 min read

梦开始的地方:记两次架构设计上的启蒙

回望初入职场时的第一次实习,自己像一块干瘪的海绵在代码与业务的海洋里疯狂汲取养分。从被带教老师一句"你这个东西是在内存中吧"问住,到基因报告入库方案中见识到共享磁盘挂载的妙用,这两次技术评审如何打破了我的学生思维,开启了真正的工程架构认知。

回望初入职场时的第一次实习,自己像一块干瘪的海绵在代码与业务的海洋里疯狂汲取养分。从被带教老师一句"你这个东西是在内存中吧"问住,到基因报告入库方案中见识到共享磁盘挂载的妙用,这两次技术评审如何打破了我的学生思维,开启了真正的工程架构认知。

一、初入江湖的「海绵时代」

翻看相册里在北京拍下的几张照片,其中一张是初雪过后,从公司的窗边俯瞰国贸立交桥。高架桥上车流不息,桥下与绿化带里还依稀铺着洁白的残雪。站在繁华的 CBD 钢铁与玻璃丛林之下,思绪忽然穿透时光,回到了多年前我刚走出校园、开始第一次实习的日子。

初雪后的北京:从公司窗边俯瞰国贸立交桥与车流

那时的自己,就像一块被丢进温水里的干燥海绵,对周围的一切技术细节和工程体系都充满着极度的好奇与饥饿感。每天穿行在工位与会议室之间,不管是 Java 并发、Spring 框架底层,还是线上运维的命令脚本,我都拼命地看、拼命地记。

在那个充满初生牛犊之气的阶段,有两次印象极为深刻的技术方案评审(Tech Review),彻底击碎了我狭隘的「学生代码思维」,成为我真正理解现代软件工程架构的启蒙时刻。


二、第一击:「你这个东西,是在内存中吧?」

那是我参加的第一次正规技术方案评审。

会议室里坐着我的带教老师和组内几位资深研发。轮到我汇报时,我兴致勃勃地讲解着自己设计的模块方案。

为了在 Java 程序中实现全局状态的一致性、保证定时与异步任务能够平稳有序地执行,我在方案里设计了一个核心数据结构——在 JVM 进程内部维护一个全局 Map<Key, Value>

我滔滔不绝地讲着 Key 应该设计成什么格式、Value 存哪些上下文状态、如何通过读写这个 Map 来控制任务的生命周期……具体的业务细节如今已经模糊,但我清晰地记得自己当时对这个「精妙结构」充满着自信。

讲到一半,带教老师忽然打断了我,语气平和地问了一句:

“你这个东西……是在内存中吧?”

我整个人一下子愣住了,脑子短路了半秒,下意识地回答:

“……啊,是的。”

带教老师微微笑了笑,接着点出了几个直击灵魂的问题:

  • “如果这台服务器重启了,或者发布新版本重新部署了,这个 Map 里的状态会怎样?”
  • “如果线上流量增长,微服务部署了 5 个 Pod 实例,每个实例各自在内存里维护自己的 Map,谁来保证全局状态一致?”
  • “如果任务执行异常导致 JVM OOM(内存溢出)崩溃,未完成的任务如何恢复现场?”

那一瞬间,我仿佛被当头泼了一盆冷水。

在学校做课设或者写单机 Demo 时,HashMapConcurrentHashMap 是我们解决状态暂存的万能法宝;但在真正的分布式生产环境中:

  • 单机内存是脆弱、易失(Volatile)且孤立的;
  • 状态的持久化(Persistence)、故障恢复(Failover)与多实例共享(Distributed State),才是每一个架构设计者必须首先考量的第一准则。

那是我第一次真切感受到:技术方案评审不是看你把代码写得多花哨,而是用最挑剔的工程视角,去推演系统在极端与异常情况下的生存能力。


三、第二击:从 SFTP 轮询到共享磁盘空间

如果说第一次评审让我认识到了「内存的边界」,那么第二次评审则让我见识到了「基础设施维度的降维打击」。

那是我第一次独立负责一个端到端的业务项目——基因检测报告的结构化入库系统

上游的测序仪和分析平台会生成原始的基因检测结果文件,存放在内网的专用服务器上。我的任务是把这些大文件拉取下来,解析其中的生物信息字段,最终结构化存入业务数据库。

在当时我的知识框架里,跨服务器传输文件最标准的方式就是网络传输。于是我在技术方案里写了详尽的流程:

  1. 在 Java 后台集成 JSch / SSH 库,建立与远端服务器的 SFTP 连接池
  2. 配置定时轮询机制,检查远端目录是否有新文件生成;
  3. 捕获网络超时、断点续传、文件下载完成校验……

方案评审时,我本以为这次考虑得足够周全,各种网络重试和异常处理都画了详尽的流程图。

带教老师听完后,给出了一个让我完全意想不到的方案:

“为什么要让业务程序去扛复杂的 SFTP 连接和网络重试呢?让运维同事在两台服务器之间挂载一块共享网络磁盘(NFS / 共享存储空间),你的程序直接把它当成宿主机本地目录 FileChannel 读写就好了。”

听到这个方案的一刹那,我久久没有回过神来。

我此前的思维被牢牢禁锢在**「应用层开发」的盒子里——总想着怎么在代码里写更多的逻辑、加更多的连接池来解决问题。而带教老师却站在「系统与运维基础设施」**的高度,轻轻用一行挂载配置,就把网络连接管理、鉴权、传输协议开销从业务代码中完全剥离了出去!

程序不仅变得极简、可靠,读写性能还直接享受到了操作系统内核级 Page Cache 的优化。


四、回望:走出代码盒子的架构体感

很多年过去了,现在每当我主导系统的架构设计或参与年轻同学的方案评审时,这两次经历依然会像警钟一样在脑海里回响。

它们教会了我两个极其朴素却受益终身的工程常识:

                     真正的工程架构认知
┌───────────────────────────────────────────────────────────┐
│ 1. 跨越内存视角 ➔ 关注数据生命周期、持久化边界与集群多实例一致性 │
│ 2. 跨越代码视角 ➔ 善用操作系统、网络拓扑与存储基础设施的系统之力 │
└───────────────────────────────────────────────────────────┘
  1. 写代码关注的是逻辑正确性,做架构关注的是边界与妥协。 每一个放进内存的对象、每一条跨越网络的数据流,都必须经得起集群扩容与节点宕机的拷打。
  2. 最好的代码是不需要写代码。 善于借助操作系统、共享存储、消息中间件等成熟的基础设施,往往比在业务层手搓一套脆弱的协议更优雅、更健壮。

暮色晚霞中耸立的中信大厦与 CBD 天际线

📷 拍摄信息:佳能 R100 (55-210mm) · 摄于北京景山公园

五、结语:梦开始的地方

快离开北京时,在公司楼下仰拍中央广播电视总台建筑与远方的中信大厦

上面这张照片,是我快离开北京时在公司楼下仰拍的。

冬日晴空澄澈万里,中央广播电视总台标志性的建筑轮廓与远方直插云霄的中信大厦交相辉映,高架桥上的车流奔涌向前方。

离开北京时,我带走的不仅是写在简历里的项目经验,更是那段被良师益友点化后、深深烙印在脑海里的工程架构体感。高楼不是一天建成的,一个工程师的成长也绝非朝夕之功,它正是由那一次次脸红心跳的方案推演、一个个深夜排查的线上告警、以及一位位倾囊相授的师长所共同雕刻出来的。

由衷感谢那段像海绵一样疯狂吸收养分的初生岁月。愿我们无论走得多远,都依然保留着初入江湖时的谦逊、敏锐与热忱。

Share:
Back to Blog

Related Posts

View All Posts »
你好,世界:我为什么要写博客

你好,世界:我为什么要写博客

作为一个软件工程研究生,我决定开始记录自己的技术探索和思考。这篇文章聊聊我为什么选择写博客,以及我希望在这里分享什么。

AI 大模型 Ragent 项目:长会话 Token 爆炸?会话摘要压缩策略与水位线机制深度解析
阶段 1 进阶:摘要压缩算法

AI 大模型 Ragent 项目:长会话 Token 爆炸?会话摘要压缩策略与水位线机制深度解析

当多轮对话聊到 30 甚至 50 轮,滑动窗口滑走了开头的关键约束、全量保留又会挤爆 Token 上下文,RAG 系统该如何破局?深入剖析 Ragent 记忆系统中的增量摘要压缩算法、lastMessageId 水位线推进机制、攒批压缩优化(summaryBatchSize)、Prompt 绝对禁止记录答案的设计哲学以及 Redisson 分布式锁防重实践。