--- title: 总得给自己留下点什么 slug: leave-some-by-myself date: 2017-12-13 18:41:55 updated: 2021-11-23 18:15:12 tags: - 思考 - 代码 category: 杂思 cover: /images/2019/05/2019050902332168.jpg summary: 网易云音乐一直是一个值得吐槽的地方,比如,它常常会认为你懂五国语言,动不动给你日推一些稀奇古怪的歌曲。因为我会日语,所以日推的大部分都是日文歌,还可以接受网易云音乐一直是一个值得吐槽的地方,比如,它常常会认为你懂五国语言,动不动给你日推一些稀奇古怪的歌曲。因为我会日语,所以日推的大部分都是日文歌,还可以接受。但最近网易云音乐开始变本加厉,给我日推俄文歌,这实在是不能接受。 --- ![黄昏少女](/images/2019/05/2019050902252161.jpg) 网易云音乐一直是一个值得吐槽的地方,比如,它常常会认为你懂五国语言,动不动给你日推一些稀奇古怪的歌曲。因为我会日语,所以日推的大部分都是日文歌,还可以接受。但最近网易云音乐开始变本加厉,给我日推俄文歌,这实在是不能接受。 一般我熬夜时,都喜欢开着网易云音乐听歌,不是说我多喜欢音乐,而是为了防困。精力专注的时候,歌曲就像是一种微噪音,你根本感知不到。有时也会听到一些不错的歌曲,下载收藏。 周一时听到一首名为 **[「PLANET」](http://music.163.com/#/song?id=812400)** 的歌曲,前奏就十分抓耳,当时就立刻点击下载,可惜这歌竟然要付费。生在天朝,仗着自己从事 IT 相关的工作,最大的好处便是能免费搞到一些数字出版物。但我在谷歌、百度上查找甚久,竟找不到此曲的 320 Kbps 版本,不禁有些沮丧。 在网易的「チーズ牛丼」(沙拉牛肉)上找到一篇关于「PLANET」的创作组合**「ラムジ」**的[介绍](http://music.163.com/#/topic?id=17639053)。 22 岁的山下佑树在过生日的时候,只因想要唱点什么东西来到东京,和报复不得施展的井上慎二郎桑如童话般在雨中相遇,并开始了长达 8 年的演艺事业。 >当時、井上慎二郎に初めて出会ったとき、雨に濡れて震える子羊のような容姿だった為、当時の山下のイメージから羊を連想し、アニメの子羊キャラクターからラムジと命名。 > >当时山下佑树遇到井上慎二郎,看到他被雨淋湿的姿态,联想到了动画《ラムヂーちゃん》里“子羊”这一角色,因决定采用ラムジ这一名字为组合名。 一切都是那么巧合、随性,连乐队名都是以上面这么哭笑不得的[缘由][wikipedia-link]命名。然而,不是每个梦想都能瓜熟蒂落,ラムジ在 12 年便[宣布 13 年解散][oricon]。我翻遍他们为数不多的专辑、单曲,喜欢上的,也只有那首「PLANET」。 可我还是不死心,我能感受到歌曲里那种热情和呼唤,那种渴望展露头角被大众所关注认识的心情。因为现在的我和当时的主唱山下佑树年龄相近,我更能感受到山下先生的期盼与绝望,两种矛盾心情交织下的悲伤心境。我翻遍脸书、推特、所有我所知道的社交网络,却没有找到任何关于山下佑树的信息。他随着ラムジ的解散,消失在大众眼里。即使是推特上,也很少有人提起。 可是我还记得,就和他们的歌还在被人听被人唱一样,我还记得这么一个乐队,如流星般存在过。 --- 前些天翻推特,看到有人说,大部分代码的存活时间只有 5 年不到。回想自己目前接手过的很多老项目,的确如此,在 OneAPM 上班的时候,兄弟部门的系统,一年重写了 2 次。自己维护的系统,也因个人的审美变化,在一年内留下了 3 种不同风格的代码。 如果说乐队的解散,还能留下当时传唱的歌曲,那么程序的重写,可能就是彻彻底底的消失。那么,作为程序员,我们还能留下什么呢? **我想,只有编程思想吧。** 记得 4 个月前带小弟写的 [SQL Generator](https://github.com/byWeaponLin/sql-generator)。核心的思想便是对当时业务 DSL 的抽象封装,还有函数式的变换思想。即使后面这部分代码废弃,我想它的定义还是能好好传递给每个维护过它的人吧。这个设计思路再精进,便是在[Language Implementation Patterns](https://pragprog.com/book/tpdsl/language-implementation-patterns) 里面提到的解析与生成的两种形态,虽然SQL Generator 独立于底层的解析器开发,但是最后二者的抽象结构,是惊人的一致的。 同样的说法可以应用于程序设计的很多地方,比如说单元测试。我以前一直不知道什么是测试,怎么写测试。后面有意识地学习模仿后发现,单测无非也就是三大步。构造测试对象、测试数据,调用方法,断言。 测试对象有些可能是 Mock 的接口,但一定不能是 Mock Static 的对象,存在的话说明你的代码抽象存在问题。测试数据,也叫样本,关键在于能命中边界条件。而断言,无非就是各种 `true` `false` `equals` 的判断,hamcrest 之类得无非是简化了判断过程而已,但切记慎用 Mock 里面的 `verify` 做断言。 所以说,测试代码,再怎么变,逃离不了上面的编程方法,即使是别的编程语言,亦是如此。我很费解的是,在苏宁,看到我的同事写测试的时候,写的是一个 `main` 方法,用 `System.out.print` 输出结果人肉判断。因为上线有单测覆盖率要求,竟写出了针对实体 `Getter` `Setter` 方法的测试代码。这种测试代码,有存在的意义么? 有时我觉得,编程就是一种体力活,想好了怎么设计,后面的编码加测试,纯粹是一种[肝][moegirl]的状态。有时候又觉得很多代码纯粹是套路(模板代码),只是因为某些需要不得不这么写。正如标题所言,总得给自己留下点什么。我希望给自己留下的,是那些有意思的设计思路,而不是那些**「垃圾代码」**。 ![我的英雄学院](/images/2019/05/2019050902332168.jpg) [wikipedia-link]: https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%A0%E3%82%B8_(%E6%AD%8C%E6%89%8B) [oricon]: https://www.oricon.co.jp/news/2020043/full/ [moegirl]: https://zh.moegirl.org/%E7%88%86%E8%82%9D