0%

迟来的 2022 年终总结

2023 年元旦至今已经过了半个月,这个略显无聊的夜晚,我突然想起了自己已经许久没有更新的博客。

先说一些与工作无关的事情吧。

上一次发布文章还是 7 月,之后的几个月里,追番成为了我的日常。
每天回到家中,打开电脑的第一件事就是去蜜柑看一看有没有订阅的番剧更新,追完了夏季和秋季两个季度的动画,有《孤独摇滚》这样给了我许多欢笑和感动的作品,也有《恋爱FLOPS》这样故事发展毫不意外又充满惊喜的作品,2023 年冬季,我也会继续追番的。

除了动画外,我的另一项主要娱乐方式 —— 视觉小说,进展则不是很顺利。
之前就在游玩的《樱花萌放》由于作者的“啰嗦”,至今仍然没有开启最后一条线路,也尝试开坑了很多新作或者 FD 作品,比如《苍之彼方的四重奏 EXTRA 1》,然而几乎都没有玩多久便不再打开了。
哪怕是短篇的《星之终途》也被我一拖再拖。
唯一一部从头读到尾的作品是 12 月在 NS 上发售的《魔法使之夜》重制版,有珠的主题曲成为了我那个月循环最多的音乐,它总能将我的意识带到山上的洋馆中,使我的精神得到放松。

游戏方面,除了《魔法使之夜》外,我通关了迟了 3 个月才拿到的《异度神剑 3》,花了 170 多小时探索那个对我来说广阔又陌生的世界,另外每过几天就会和朋友相约在《Splatoon 3》里一起给熊老板打工。

还有手游的部分,我自己也总是吐槽“给手游氪金实在是没什么收益,感觉掉入了陷阱”,然而消费带来的快乐确实让人难以拒绝,只好一边骂自己一边给游戏公司送钱了。
与以往不同的地方是我还在玩的手机游戏中已经没有在大陆运营的了,大概是一次次的和谐让我失望了吧,另一方面,afk 类型的游戏取代了其他类型成为了我的新选择,这类游戏通常每天只需要花费不到 10 分钟的时间,偶尔也会让我思考“玩它们的意义到底是什么?”。
我还知道了“韩游剧情通常比较黑暗,喜欢发刀”的说法,然而《蔚蓝档案》似乎并不是这样,新的一年,也要做个好老师!

年底的时候,到处都在传各种各样的“年度总结”,有 Bilibili 的,网易云音乐的,然而我已经基本不在 Bilibili 观看动画,也不再在网易云听歌了。

说到 2022 不得不提的一件事,应该是中国大陆终于决定放开对新冠疫情的管制吧。
我见到许多疫情期间从不戴口罩的人在“二十条”公布后即使在室外通风处依然戴着口罩,见到他们严防死守最终还是发了高烧,见到他们在 SNS 上说自己“疼得想死”,“说不出话”,见到他们把止痛药、退烧药、检测盒一扫而空……

从头到尾,我觉得自己好像一个局外人,在天空中 —— 或是更遥远的什么地方,只是看着,就好像这些事情与我无关。
我也想过如果自己被感染了会怎么样,却始终想不出个结果。
再次回想起来,只觉得空洞,好像全身的力气被抽走一样。

写下这些字的前几天,我对自己的精神状态有了更进一步的理解,确认了自己依然是一个乐观、积极的人,我想这对我来说是一件好事。

再说说和开发的工作有关的事情吧。

应该是几个月前,碰到了一家很有趣的公司,他们的面试没有八股文和算法题,只是对着简历中写的项目经历和我聊天。
连续几场面试,我们聊了一些不容易注意到的语法细节,聊了系统设计,聊了抽象和过度抽象如何界定……
对方甚至点开了我写在简历上的博客地址,和我讨论了我写的文章,这是我把博客地址写在简历上后第一次明确有“被人看见”的经历。

我那时并没有刻意去准备面试,如果对方像字节那样考我一些八股或算法题,我其实没有信心能答上来,但关于软件设计的话题恰恰是我过去一年都在努力钻研的内容,所以聊得很开心。

虽然他们最终没有再给我回复,但我认为这是一件值得记下来的事。

前不久,因为需要在 vscode 中使用 markdown 编辑一个包含中文的表格,我把编辑器的字体换成了中文等宽,并首次得知 Noto Sans 是 Google 发表的字体。
中文的等宽字体其实算不上好看,但对于需要使用 markdown 编辑表格的人来说却非常有用,毕竟只有这种字体可以让表格对齐。

最近在公司开发的项目都使用 Go 语言,我好像也逐渐习惯了静态类型系统。
如果之前和人说我有一年以上的 Go 语言开发经验是有吹的成分,那么现在这句话已经变成事实了吧。

探索 DDD 的过程中,我试着用存储库分离了领域模型和 ORM 模型,然而在写《数据映射器》那篇文章的时候,我对于这种抽象的意义认知其实还不清晰,让我的理解更进一步的是《架构整洁之道》,里面提到“系统各部分之间的依赖关系不能构成环”,而打破循环依赖的手段就是 DIP ,依赖反转,这句话成为了一块很大的拼图,填补了我对 DDD 中分层架构的理解。

将存储库留在领域层,而将具体实现放置在基础设施中,持久化方式的变更并不会影响到系统中的业务逻辑,实际编写代码时,可以使用依赖注入的技巧来处理复杂的依赖关系。

在一次和做 Java 开发的朋友的聊天中,我们谈到 Spring 依赖注入的注解,我突然意识到 DI 其实是一件能够自动化的事情,几经波折后找到了 Google 开发的 wire ,极大提升了我的开发体验。

Repository 和 DI 工具使我能够轻松应对许多项目,但仍有一些场景让我感觉束手束脚,具体来说是需要在模型方法中和存储库交互的情况,毕竟我不能把存储库“注入”到模型中去。

大概在 12 月的某一天,我开始尝试挑战 Registry 模式,将原本被分散注入到各个 Repository 和 Service 中的模块统统放进一个叫做 Registry 的对象中,让它作为一个单例存在。
我发现不但之前的功能都可以实现,我还能够在领域模型这样无法注入实例的地方调用我想要的存储库和服务。这一进展让我可以把更多和模型相关的操作放在模型的方法而不是一个单独的服务中实现,同时让我可以灵活的使用懒加载来避免不需要的远程调用,我也开始在存储库的实现中适当加入缓存来提升性能,当然这一切对于存储库的使用者来说都是不可见也不需要关心的,我想这是一个很能体现出“抽象”的魅力的地方。

关于 Registry 和 DI 这些话题,其实都可以单独拿出来写一下相关的文章,不过这些东西就放在之后吧(拖延症)。

虽然被人吐槽说我的 Go 代码“写得像 Java”,但我想这并不是什么坏事,因为我已经在几次迭代中切实感受到了这样做的好处,而 Java 体系本身就是一个非常成熟的企业级应用开发体系,值得我学习。

我确实也做了一些反思:相较于 Java 来说,Go 语言开发有什么自己的特点吗?

我的答案是函数,新出现的语言都很重视函数,Go 语言没有静态方法和构造方法,因为函数完全可以胜任这部分工作。
设计模式中的工厂方法在这些新语言中也没有存在的必要,因为一个用于创建对象的函数可以做到相同的事。

另一个不同于 Java 的地方是函数式编程,严格来说是允许将函数作为参数传递,这使得语言的灵活性被极大增强了,但我在使用这些特性时比较克制,因为我发现乱用新特性很容易导致代码无法测试,而我在评价代码好坏时的原则之一是“无法测试的代码一定不是好代码”。

说到测试,公司内并没有要求开发人员编写测试,测试部门的同事也不会使用自动化测试,这实在是一件遗憾的事,践行 TDD 一年多的时间了,如今我可以说测试用例就是我对自己代码信心的来源,如果不是这些用例支撑着我,恐怕我早就和其他人一样陷入无尽的 bug 修复工作中不能自拔了,更别提花时间去提升自己了。

希望 2023 年的自己可以过得更加自由,更让自己满意吧。

顺便一提写这篇文章的时候我使用的背景音乐是 A 叔的 200 万粉丝特别企划 ,希望读到这里的你不要错过。