为什么你接手的代码总是屎山成堆?

red and white heart shaped cake

经常在论坛里看见到一些吐槽:自己接手的代码里屎山成堆,没得选,只能基于屎山进一步维护。

但为什么会是这样?

本质上是从老板的视角来看和从工程师的视角来看问题不同。工程师作为具体的执行者,希望每件事都尽善尽美,提升自身的价值,打造完美的产品。

而作为老板,往往面临的是资源有限,能做的事情又足够多,这个时候需要选择 ROI 更高的事情来做,很容易在不断解决客户问题过程中,累计历史债务。

当然, 我们可以通过一些管理手段来降低历史债务累计的手段:

  • 招募更加优秀的工程师:优秀的工程师往往有着更好的代码品味,叠屎山的速度会更慢一些。
  • 引入 CR 的流程:CR 的流程比单个人开发出现风险的概率更低。
  • 接入自动化测试等手段:自动化测试让屎山降低的过程中,风险逐渐降低。

此外,在解决屎山的时候,同样需要选择,如何解决屎山,以获得最高的效益。

选择,无处不在。

如何对抗信息过载?

Info arrow signage

作为一个追求饱和式信息辅助决策的人,我最常遇见的问题就是信息太多。大量的信息源,造成接收到的信息远超他人。

但一个人的信息消费量终归是有限的,我始终是无法消费所有的信息的。所以, 我借助一些方法来调整自己的信息源,提升自己的信息消费效率。

1. 通过 RSS ,而非推荐来消费内容。

用 RSS 对抗算法推荐中我提到,我看论坛也不是使用网页浏览,而是选择使用 RSS 的方式来阅读。核心的原因便是 RSS 的阅读方式,可以让我同时看到几十条帖子,这样我就可以只关注我自己的最在乎的内容。

同时 RSS 的阅读界面相比于论坛、智能推荐系统,干扰项更少、内容密度更大,可以让我更好的完成信息的快速阅读、过滤、阅读。

d2b5ca33bd970f64a6301fa75ae2eb22 11
我在 InoReader 看 V2ex

2. 借助过滤器优化 RSS 中的 Item

我一直续费 InoReader 的原因是 InoReader 为我提供了信息过滤的功能,我可以设定我不感兴趣的关键词,并将对应的关键词内容过滤掉,从而只看我感兴趣的内容。(这样可能会造成信息茧房,不过我过滤的关键词往往是有特定的原因,比如我不求职,就可以把所有和求职相关的帖子过滤掉,这种茧房是可预期的)。

3. [待实现] 基于信源评分,取消和新增信源

现有的系统可以很好的实现信息的阅读和过滤,但我一直觉得还差一个功能:对信源进行信噪比评分,对于评分低于某个数值的,视为该信源无价值,重新review 是否要停止订阅该信源。

理想情况下,应该基于某个信源被过滤掉的条目除以同一时间段所有条目得出噪音占比,对噪音占比高的信源进行过滤即可。

饱和式信息辅助决策

Info arrow signage

在看《流浪地球》的时候,有个词挺有意思:「饱和式救援」,讲的是同时安排多个团队去解决一个问题,这样的冗余操作可以在极端情况下提升目标达成的可能性。毕竟有多个备份总要有一个可以达成目标。

回过头看我自己的决策习惯,我是一个追求饱和式信息来辅助决策的人。我习惯性的收集尽可能多的上下文,并基于自己收到的上下文来做决策,以图达成最优解的选择。

当然,没有人能做出绝对的最优解,我们都有自己的可见的上下文范围和不可见的上下文范围。我们终究没有全局之眼,我们无法达成绝对的最优解。

此外,饱和式信息辅助决策的另外一个问题是,比较容易陷入到无尽的上下文收集当中,必须要给自己一个明确的时间限制,才能确保自己不至于不停的收集上下文,而忘记了更重要的是决策(毕竟没有什么是“准备好了”的时候)。

用 RSS 对抗算法推荐

person holding black iPad

我看 V2ex 之类的论坛的方法和大部分人不太一样,我并不会常去网站上看相关的内容,更多是通过 RSS 来完成对论坛的阅读。

主要的原因是直接浏览网页虽然体验可能最好,但会让你不自觉的陷入到事情的讨论当中,而 RSS 的阅读方式,则可以让我快速的浏览文章的标题,判断这个内容我是否感兴趣,再点进帖子内容查看,十分有效的提升了我阅读的效率。

RSS 阅读给我带来的另外的好处,便是上帝视角。

通过 RSS 阅读帖子,我看到了同一个论坛的同一时刻,大家对于同一个问题的看法可能是截然不同的,清晰而深刻的感受到了世界的参差。

挺好

大厂叙事

woman in black jacket sitting on chair

在 V2ex 看到一篇帖子,吐槽微信小程序不够好用,原话是“小程序发布这么多年了,调试器也还都是抄的 chromium ,怎么还是一坨屎一样,开发者就活该不配被当人看吗?

从用户的视角来看,这么当然是合理的,体验差的点是值得被修复的。不过,在大厂的叙事中,这可能是不够的。

作为一个曾经在 TOP 大厂待过的人,我深知大厂的叙事逻辑 —— 凡事看 ROI,以及做最重要的事情

以小程序开发者工具为例,他体验不好的点是有非常多的,开发者的数量远大于研发团队的数量,所以会有大量的任务值得、等待被解决。但终归人手有限,开发团队只能选择其中一部分事情能做。

这个时候做事就会自然而然推向最重要(比如老板们能关注到的)、ROI 最高的(用户反馈最多、对销售产生最大价值的)。这种方式让大厂的资源可以更集中的被利用在那些大事上,帮助大厂们在做重要的事情快速推进。当然, 也会让每一个个体都有可能成为被忽略的数字,毕竟,单个个体的声音太过渺小。

大厂叙事在做满足 80% 的需求的时候,是很有效的,因为他解决了大数的问题。但还有 20% 的需求是无法被满足的,资源总是不丰富的,这 20%,就是留给独立开发者、小公司的空间。

将小事做出彩

black flat screen computer monitor

在逛 V2ex 的时候,看到一个帖子,大体上是说自己工作 7 年,没有什么技术进步,顺便聊一下自己的看法。

做为公司中的职工,我们每个人都有两面:

  • 一面,是公司雇佣我们时所判定的当下面,当下面决定了我们此刻的工种、工作,决定了我们当下的薪资。这也是很多时候我们在做的事情。
  • 另一面,是公司预期我们可以做到的事情,是未来面,未来面决定了我们能否进一步的涨薪、在这个公司继续的任职下去。

公司作为一个盈利机构,主要的任务还是赚钱,所以,我们的工作当中可能大部分时间和精力都在做当下面的事情。而我们作为个体,如果希望自己得到成长,则必须投注精力到未来面当中,才能让自我感到提升,让收入得到提升。

时间上的冲突,让我们无法有充足的时间投入到未来面,而我们又希望得到提升, 就需要从当下面中寻找机会,做既可以满足当下面同时又可以投注到未来面当中的事情。而想要达成这样的目标,我们不能仅仅是 —— 完成自己的工作 。

我们还可以做的是:

  1. 在完成自己的工作之后,复盘自己的做法, 评估是否有优化的空间。
  2. 梳理自己工作过程中遇到的问题和解决办法,提升工作效率。

这样的方法和方式还有很多,如果你不知道什么事情是能够帮你投注未来面的,就以终为始,问问自己,假设未来我还要做这样一件事,什么样的事情可以帮助到我自己?

如果新冠能复阳…

red and white flower petals

最近打了第三针疫苗,突然想起来了一个事情,之前有说过,新冠疫苗是无法防止你感染的,只是能够防止你重症。这和我们以前理解的疫苗不同的。

之所以不同,主要是因为新冠病毒的变种非常多,同时可能会有多个毒株流行。这些毒株之间虽然有亲缘关系,但又不完全相同,很有可能其特征有所不同,导致我们身体的免疫系统并不能很好的识别到不同分支的新冠病毒。

而这种不同,就造成了人是有可能感染新冠病毒痊愈之后,再次感染其他毒株的。而我们所注射的疫苗,也只能为我们提供一定特征的灭活病毒,我们终究还是有可能感染这个特征以外的新冠病毒的。

😮‍💨,难。

总结和复盘,是给你成长的机会

summary

在学生时代,我总是很讨厌考试。因为自己考的不好,所以总是挨批评。

到了工作以后,也有一些反感“总结”、“复盘”,仿佛这些总结和复盘是另外一种形式的考试。

但当你仔细想想,「假设」考试是为了你好;总结和复盘也是为了你好,

我们就会发现「考试」其实是为了帮助我们明确自己当前所在的水位,明确这个水位以后,我们好有针对性的去学习和提升。

而总结和复盘也类似,其实是为了帮助我们做好上一段工作中的分析,从而为下一段工作提供燃料,让我们更近一步的好好工作。

当然,你可能会提出:这个前提不一定成立呀?

没错,从他人的视角来看的时候,这个前提不一定成立。但当复盘和总结的发起人是我们自己时,我们的立场和前提是明确的,我们无需为他人复盘、无需为他人总结,我们只需要为自己而学习。

执行 rpi-update 提示Make sure you have ca-certificates installed and that the time is set correctly 怎么处理?

9e6a931fa940bc97a9753cbfa3f2a954

我在尝试执行 rpi-update 给自己的树莓派做固件升级时,提示了如下报错。

Make sure you have ca-certificates installed and that the time is set correctly
Code language: JavaScript (javascript)

经过研究,发现是因为 rpi-update 的自更新域名被国内封禁了(挂载 github content 上),导致无法通过自检,只能跳过自检来更新。执行如下命令,即可跳过自检完成更新。

UPDATE_SELF=0 rpi-update

树莓派开启密钥登录

9e6a931fa940bc97a9753cbfa3f2a954

由于树莓派跑内网,再加上这个树莓派算得上是我的实验机器。因此便打算直接使用 root 来完成日常操作,懒得在 pi 和 root 用户之间切换了。而 root 登录,我又不希望使用密码登录(以我的懒散的性子,可能会设置一个比较短的密码),便为树莓派配置了密钥登录。

先使用 pi 登录到树莓派上,并切换至 root 用户。在 root 用户下,将我本地公钥复制,并放在 ~/.ssh/authorized_keys 当中,保存并退出。

接下来,就可以在本地以 ssh root@ip 的方式直接登录树莓派了。为了简化这个ssh命令,我还配置了 SSH Config 的别名,来简化我的登录命令(具体可参考 如何用 SSH Config 来优化你的 SSH 连接?

d2b5ca33bd970f64a6301fa75ae2eb22 2

树莓派切换清华源镜像

9e6a931fa940bc97a9753cbfa3f2a954

树莓派的官方源在海外,国内访问时速度难免不理想。再加上软件更新又是一个常态化的工作,所以我就希望将其切换成国内源,以加速软件更新的速度。

d2b5ca33bd970f64a6301fa75ae2eb22 10

玩 Linux 的,更换源简直再正常不过了。

修改 /etc/apt/sources.list 文件,将其中内容替换为如下内容,即可完成源的替换。

deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ bullseye main non-free contrib rpi
# deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ bullseye main non-free contrib rpi
Code language: PHP (php)

替换完成后,记得执行一次 apt update ,来更新掉本地的 APT 缓存。

使用 glean 插件优化你的 React 项目

9a1f326b911de6c1629837f3b57551e5

React 相比于 Vue 的好处是你可以相对轻松的将一个组件抽离出来,这使得开发者可以根据自己的需要进行抽象。

但手动抽象组件还是相对较麻烦,于是我便搜索有没有一些方便的插件,可以帮助我更好快的完成组件的抽象。于是乎便找到了 Wix 出的 glean 插件。

glean 插件可以将任意层级的组件抽出为一个全新的函数,并在之前的位置引用你的函数,因此,你可以先非常快的构建出一个完整的 UI 界面,再基于这个界面,进行不同层次的抽象。或者是在开发界面时,随时根据需要来完成界面的抽象。

tz4sh
官方提供的 Demo

在实际使用过程中,你可以将 glean 插件提供的命令设置为快捷方式,从而实现更快的抽象组件,或者是点击组件前的黄色小灯泡💡来完成组件的抽象。

d2b5ca33bd970f64a6301fa75ae2eb22 9
黄色小灯泡

Kindle 的一个小技巧 —— 保持常亮

turned-on Kindle tablet

Kindle 无法设置熄屏时间,所以隔一段时间, Kindle 就会自动进入到熄屏状态。而如果你希望保持 Kindle 保持常亮(比如在下载电子书的时候),则可以在 Kindle 的搜索框中输入 ~ds ,并按下回车,即可开启 Kindle 的常亮模式。

在 Kindle 的常亮模式下,你无法关闭屏幕(甚至是物理按钮都没用),如果希望恢复正常,则必须进入「设置」—「设备选项」—「重启」,才能将 Kindle 恢复到会自动关闭屏幕(且可被关机)的状态。

使用 Obsidian 的 CSS 代码片段优化你的 Obsidian 体验

obsidian

我最在研究使用 Obsidian,期间更换了不少的主题,但都不尽如人意,主要的原因便是行高度。大部分主题的行高都是面向英文设计,对于中文场景下的方块字,会使得整个页面的拥挤度极大, 非常容易让你感受到挤压感。

因此,我决定使用 Obsidian 自带的 CSS 代码片段功能来优化我的体验。CSS 代码片段可以在你自己的存储库内存储一些 CSS 样式,并生效在你的 Obsidian 当中,从而为你带来优化界面的可能。

打开 Obsidian 设置,进入「外观」—「CSS 代码片段」,可以看到这里的配置。默认情况下,是没有任何配置的。你可以点击右上角的打开目录的 Icon ,进入到 CSS 存储目录,创建对应的 CSS 文件。创建完成后,回到 Obsidian 中启用这个 CSS 就可以达成你的效果了。

d2b5ca33bd970f64a6301fa75ae2eb22 6

实务

以我自己为例,这是我使用的 Obuntu 主题的默认行高,看起来不算特别差,但总感觉行与行之间的距离太近,让人略感压抑。

d2b5ca33bd970f64a6301fa75ae2eb22 5
摘录

于是,我便在刚刚说的 CSS Snippet 文件夹下新建了一个 line-height.css 文件,并在其中添加如下代码,并在设置中生效。

// 以下代码仅用作演示
*{
  line-height: 2 !important;
}
Code language: JavaScript (javascript)

Obsidian 的 UI 中的文字就会变得更易于查看了,这样就达成了我的目标。不过,我上面写的 CSS 非常的粗糙,是对所有的文字都进行了修改(包括那些本来不应该修改的),所以在真实场景下使用,还是需要自行 Debug 来进行修改。

d2b5ca33bd970f64a6301fa75ae2eb22 8

参考

2022 年 10 月月度总结

summary

Objective 1:持续获取现金流,并构建未来收益的现金牛

KR1:投资收益达到 20000 元

10 月份略有波动,但整体来说,收益不达预期。感觉需要搞更多的现金进入到投资当中,才能符合预期。

KR2 :单篇稿费突破 6000 元

无变化

KR3 :达成年度预算,支出不超预算

没啥变化,封控…疫情…大概率超预算,但应该还好。

KR4 :构建软件类现金牛业务,预期产生收益 10000 元人民币

暂无进展

Objective 2:提升生活基础设施,构建未来生活好基础

KR1:前往 6 个城市旅行

天津疫情封控。难。

KR2:进行 20 次文娱活动

没有进行啥文娱活动。不过报名了美国 AHA 协会的培训,考了个 CPR 的证书。以后万一在街上碰到了心脏骤停的人,可以帮忙施救了。

KR3:借助智能化设备,缩减在家务相关事务上耗费的时间

购买了小米音箱,把之前众筹的小米自动窗帘设备配置起来了。可以实现每天自动开关窗帘了!挺好。

Objective 3 :开拓视野,打造多元行业人才

KR1:写 15 篇书评

暂无进展

KR2:输出关于 API 的 Newsletter 12 封

10月写了两封,完整的目录见:竹白

KR3 :完成计划中的三本图书的写作

暂无进展。

树莓派镜像烧录后无法使用 SSH 的问题 Debug

9e6a931fa940bc97a9753cbfa3f2a954

最近开始玩树莓派,使用官方的树莓派镜像烧录器烧录了一个镜像到系统中。

但烧录成功后发现却无法通过 SSH 登录。但我记得自己明明是在配置时设置了「开启 SSH 服务」。

d2b5ca33bd970f64a6301fa75ae2eb22 1

经过网上搜索发现,原来这个配置并没有什么卵用。你配置完成后,需要在 TF 卡的根目录创建一个 ssh 文件夹,来开启 SSH 功能。

d2b5ca33bd970f64a6301fa75ae2eb22 4

“宗族化”与“城市化”

people standing on shore during golden hour

和堂弟相对长期的生活了一段时间后,我对于城市里的孩子和村里出来的孩子又有了新的认识 — 边界感不同。

在我看来,这种边界感的不同,是来自于各自生长的环境:

  • 城市化:城市里的孩子们往往是散居、各自独立的生活状态。家庭成员只有自己、爸爸和妈妈。周围虽然也有邻居,但往往只会在外面玩,游玩结束后,各回各家,各找各妈。
  • 宗族化:村里的孩子们由于历史的原因,经常会出现一个村子里很多户之间都有一定的宗亲关系。各家孩子可能会一起到一个孩子家里玩,甚至是吃住在这个孩子家中。

这种城市化和宗族化的差异,致使城里的孩子会更加的明确「你」和「我」的边界,「我」会维护好自己的边界,尽量不进入到「你」的边界中。这种边界感,在城市这种陌生人社会当中,如鱼得水。

而村里的孩子在村里的时候,并不会有特别强的这种边界感,初次到城市当中生活时,会更容易碰壁,并因此碰壁之后缩小到一个更小的边界范围。在这个边界范围里,继续自己没有边界感的状态。

城市化不一定是好事,因为其中隐含了「我不完全信任你」的含义;宗族化也不一定是好事,因为在默认社会下,不加选择的信任,会导致我们受到欺骗。

在我看来,一个孩子需要接受城市化的教育,也需要接受宗族化的生活,这样才能在保护好自己的前提下,尽可能多的向外释放善意,开放自己。

为什么国内的大公司普遍在北京设立分部

red and white temple under blue sky during daytime

最近在研究美国的互联网公司的时候,发现一个很有意思的事情,美国的互联网公司并不会像国内的互联网公司这样,扎堆在首府开设分部。举个例子来说,你会发现,白宫所在地并没有什么大型的企业。

如果进一步研究的话,你会发现,欧洲的很多互联网企业/软件公司也是分布在全国各个地方的。

这是一个很有意思的区别:为什么中国的互联网公司,甚至是各行各业的公司都要在北京设立分部?

我自己猜测的一个原因是中国的这种体制决定的。

中国是社会主义国家,在政治和管理方面,政府会有较强的管控的欲望和权力。这导致一个行业的兴衰可能不仅仅是看市场,还要看政府的政策(教培行业就是个例子)。在这种情况下,对于风险更加敏感的大公司自然会在北京安排相应分部,以便于 GR 团队(Government Relationship)和政府相关部门沟通,以便了解政府相关安排和动态,提前规避可能的风险。

而海外虽然政府也有影响,但远达不到中国这种程度,所以企业可以分部的更加的均匀,不需要在首府呆着。

这种模式下带来的,是中国的一线城市和三四线城市的两极分化极为严重。一线城市繁荣无比,三四线城市则萧条无比。

想了想,感觉无解。