#Java
#Scala
#Functional Programming
#Architecture 背景
在日常的业务开发中,HTTP 客户端的封装可以说是最为常见的基础模块,无论是调用第三方 API 服务、对接内部微服务还是抓取外部数据,几乎每一个项目中都能看到类似于 HttpUtils 或 HttpClientWrapper 的身影。然而看似简单的网络请求,在不同的经验层级与架构范式下,写出来的代码质量与设计哲学却有着天壤之别。很多初级的封装仅仅停留在‘把功能调通’的阶段,忽略了底层 TCP 连接池、资源生命周期管理以及超时控制,为线上高并发场景埋下了严重的性能与稳定性隐患。
本文将以一个普通的 HTTP 客户端封装为例一步步演进重构,探讨如何写出完善严谨的代码,并借此梳理软件架构设计与编程范式的变迁。
第一次封装
在一些祖传项目或是更早的基于 JDK 1.7 以及后来的 JDK 8 项目中经常可以看到 Apache HttpClient 类库的身影,以下参考的 HttpUtils 可能是某个项目上默默工作的最为平凡的封装。
#架构
#编程
#设计模式 最近在维护一套缺乏完善架构设计的老项目,可以说这个项目完全精准地走在了最佳实践的对立面。
佶屈聱牙 TODO。
各自为战 TODO。
盲人摸象 。
如何设计一个好的系统
#致谢
#感言
#毕业 溯昔己丑之岁,余负笈南行,初入建康。彼弱冠之年,怀瓌意于胸中,搦翰藻于座右。朝览图志,夕探玄微,虽少灵犀顿悟之敏,亦长存守拙耕耘之志,遂获金马之赏,连取国奖之荣。
及至身入职场,长居秦淮之滨,亦暂寓钱塘之畔。感领导之厚望,委余以重任,策余以精诚。职守之间,虽案牍劳形,然得托以枢要,益广见闻。市井虽繁,不乱求知之志;案牍虽冗,未损问道之心。余既承数理之严谨,复以敏求之心,续修法学之庄严,不囿一隅之见,兼采众长之华;如攀崇岳以尽收群峰,如涉深川以汇纳百流。
余常自忖:学如逆水,不进则退;知如长河,无尽则竭。虽兼修文理,稍涉堂奥,然宇宙浩瀚,所得不过沧海一粟。处信息之变局,察科技之日新,是以余不甘平庸之志,欲穷微言之义。由是机缘汇聚,迨至癸卯之岁,复入黉宫,遂研求之志。历春秋三载,究天人之理,察图像之精,以求通达之境,不负晨昏之勤。
然余之微功,半由内助。感吾妻贤淑,操持井臼,每余潜心简编,内子独理家政,备极辛勤。外事虽繁,赖贤内以克成;内顾无忧,遂远志而得骋。又念幼子及长,若朝露含曦,实吾志之所寄,力之所源。家室之和,如兰之馨,感佩五内,莫敢遑息。
夫处穷达之变,不忧风霜之厉;守方寸之诚,莫废耕耘之功。虽困于幽壑,志犹在乎青云;纵处于沉潜,心不弃乎奋强。譬若经冬之木,外见凋枯,然及至春雷震响,阳和方启,终得勃勃竞发,吐蕊争荣。
呜呼!大雅之情,难以翰墨穷尽;提携之德,未遑简牍备载。凡所感念,皆铭肺腑。前路漫漫,余当潜心克己,笃志自强,庶几无愧于初,有冀于后。
本篇原本是作为附录在毕业论文的致谢,但答辩老师建议还是写一篇更为常规文本,因此将原本致谢放在这里以作纪念。
#年终总结
#总结
#读书 目前来看除夕夜写年终总结确实是一个不错的时间节点,一方面正好是完整的一个农历年,另一方面来说当是守岁。
工作 今年工作上有一些调整,先是年中的时候参与到智能体的一个项目中接着又是产品线调整进入一个新的业务。目前国内智能体平台普通在易用性上都不太行,又由于是“新技术”(或者说新产品)在稳定性上面相对于主流开源平台还是有不小差距的,比较典型的两个问题,一个是在开发上线过程中模型被修改竟然无法定位到具体原因,另一个则是开发过程中经常发现之前调试或已上线功能不可用。对于国内这些智能体开发平台来说真正可用还需要一定时间。
另外就是对于新业务和新团队,一方面有很多业务知识需要补充,又是需要高频学习的阶段;另一方面是管理的混乱,只从技术角度去说的话一方面是系统没有经过良好的设计,只是一味实现需求,至于对既有业务系统影响以及后续扩展和可维护性上面存在比较大的欠缺。
学习 今年最大的遗憾就是没有按期完成小论文,先是和导师沟通在国庆把初稿投出去,然后中间实验不是很顺利一直拖到了元旦,再然后是元旦期间又因为在论文内容和公式推导细节上进展缓慢。在终于把初稿投出去后就是和编辑那边相互卷了,审稿人无论是一轮还是二轮给的意见都很专业也不太好回复。网上看了相关讨论说是可以向编辑申请延期,但我始终觉着如果一件事情不能在今天完成那么明天也将完不成,所以宁愿在春节期间修改也没有向编辑申请延期。当然编辑在最后一个工作日也友善地发邮件过来询问是否有困难和已经开始修改稿件,在回邮件中礼貌地表达感谢并表示由于春节原因可能有一些影响但会赶在 DDL 之前完成相关补充实验和论文修改。
关于学习这方面只能说但愿顺利吧。
技术 Rust! Rust! Rust! 如果说去年是学习Rust的一年那么今年应该说是实践的一年。目前在工作之外的一些代码都尽可能地用Rust来写了,同时针对工作上的一些代码也会思考如果用Rust该如何实现,从代码量上来说 Rust 相关代码算是稳步增长。
LaTeX 暂且把 LaTeX 勉强归为技术这块。其实一直都有想法好好学习下 LaTeX,但毕竟工作中基本没有用到,就算是写文档 Word 也可以说覆盖了 99% 的场景。今年以来由于要完成论文终于强迫自己好好学了下 LaTeX的语法,同时为了更好地掌握相关语法和排版一些手册和笔记也迫使自己使用 LaTeX 来完成。其实真的花点心思熟练下一些常用的 Package,LaTeX 还是很好掌握的而且制作出来的 PDF 排版相比使用 Word 生成的在视觉方面强出不少,当然 TikZ 另当别论。
Gleam 如果说让我选一门编程语言作为下一门语言的话,我想那么一定是 Erlang,但不得不说其学习门槛过于陡峭。好在现在有了 Gleam,作为一门运行在 Erlang 虚拟机上的静态类型语言,它既有 Rust 的安全感,又有 Elixir 的高并发能力,同时语法也没有那么怪异。目前 Gleam 的问题是还比较小众,即便是相对 Elixir 来说也过于小众了,但好的方面是 Gleam 在 2024 年就发布了 1.0 版本并且有一个完善工具链(LSP 插件、包管理器、格式化工具)、有稳定的发布周期和积极活跃的社区。
Java 本来不太想写 Java 这块的,但考虑到今年发布了 JDK 25 还是稍微说两句,现在 Java 迭代越来越快的同时带来的特性也越加丰富,同时也在积极现代化,吸收其他语言特性,这一方面蚕食 Scala 的,另一方面也给 Kotlin 带来挑战。最后说一句对于项目上已经切换到 JDK 21 的系统来说建议尽快切换到 JDK 25,其带来的 Scoped Values 和 结构化并发 解决了虚拟线程下 ThreadLocal 变量不可靠的问题,使得现代并发编程变得更安全高效且更易维护。
#年终总结
#总结
#读书
#技术负责人 今天是 除夕, 决定花时间写一下 2024 年总结, 既是对过去一年工作的回顾,也是对自我的不断完善. 2023 年因各种因素没有做年终总结, 后续还是要严格敦促自己.
工作 今年工作重心上有一些调整, 除了继续延续 23 年研发项目外更多地处理一些研发外围的工作, 既有 研发流程 又有 总结汇报 类的工作. 从研发角度考虑,流程应当尽可能服务于研发工作, 使研发更顺畅工作更顺利否则就会形成 枷锁 和 镣铐, 不仅徒有形式同时还加重一线人员负担. 另外就是对于 口号 和 方法论 颇有感触, 在具体实施过程中存在定位问题和解决问题四象限, 如果能做到定位问题的同时解决问题这个维度是最优的, 但往往迫于人员能力和时间要求一线同学只能靠蛮力硬推, 这样长期下来技术债越堆越高最终成为万年屎山. 而方法论则是大前提抑或是最为重要或最不重要 的一环, 对于路径明确的问题方法论已内化在各个环节之中, 对于没有很好的解决思路或是完全陌生的领域方法论就会显得尤为重要.
回头来说从一线抽出部分精力后终于有时间做一些基础架构和全局整体相关的事情, 下半年原计划做两场以上技术分享,但因年底汇报和一些紧急需求最终搁浅; 另一个就是项目上需针对性地进行性能优化, 初期给了一些优化方案但实施起来研发同学优化的并不是很到位问题也较多, 最终以封装二方包的形式给了一套较为可靠的解决方案, 从而尽可能解放一线人员的心智负担, 提升代码质量.
学习 今年在模式识别遇到了一些问题, 主要是平时工作太忙没课程顾得上期末这段时间也没有较大段的时间可以集中精力, 毫无疑问地挂科了. 不过万幸补考顺利通过也算收获了迄今为止唯一一次挂科, 不知是算学习生涯上的完整还是不完整.
读书 首先值得介绍的是今年阅读了三本关于 DuckDB 相关的书籍 DuckDB in Action, DuckDB: Up and Running 和 Getting Started with DuckDB. DuckDB 是一个主要面向嵌入式系统的 OLAP 开源列式数据库, 简而言之就是补齐 SQLite 在数据分析方面的生态位.