Header logo.
极北人工智障
主页逐年标签自述RSS

2024 年第 11 周

这周末学完了 Dockyard 的教程。

之前学到一半的时候,感觉 Elixir 基本的语法已经熟悉了,Phoenix 的用法大体明白了,于是按捺不住兴奋,开始动手写自己的小项目。

一开始蛮顺利的,毕竟说起来只是一个 CRUD,无非是怎么设计 ERD、怎么画表单什么的。感觉 Ecto 比 Django ORM 好用很多。但是中间在写一个表单的时候,我想让用户输入几个字母之后,自动搜寻数据库里的内容,然后补全。发现互动性太强,普通的 Phoenix 过于静态,不太容易实现。于是把同一个教程里后面 Live View 的部分也学完了。

虽然时间跨度略长,但实际花的小时数倒还不至于很多。


还有就是发现,把所有的事情都列在 Things 里,从「最恐惧」的那一件开始做,做完之后是会快乐的。

有人会说,做完困难的事情之后给自己一些 reward,可以激励自己。但其实解决了困难的事情本身就是 reward 啦。

2024 年第 8 周

收到了德国 Muji 寄来的中性笔,整个过程费死劲了。

瑞典的 Muji 店关了,网店也不给送货。于是圣诞节前在丹麦 Muji 店下单。圣诞节之后发现丹麦人把我的订单取消了,理由是丹麦店不往瑞典卖。气得我从 Temu 买了一大堆中国产的「晨光」牌中性笔,贼便宜,而且咻就送到了。

但一用发现果然不一样。墨水粗粗细细,手划过去就会涂一大片。其实写起来也没问题,然而一比较就觉得很受不了。

到 1 月份发现 Muji 德国店可以发整个欧盟。于是下单。下单的时候发现笔的品名写作「中性笔 0.3 黑色」,但是同一个 SKU 还有一个「颜色」选项,单纯从数据和字段的角度感觉有点乱套。于是发了个邮件说,你这样很乱哎。客服回邮件说会改。隔了几天发现,原来买的 SKU 变成了「不存在」,我的订单也变成了「待处理」。

又隔了几天,发现有了新的 SKU,但品名仍然没有去掉颜色的名字。每个 SKU 的条目还是像原来一样:

1{
2    "name": "中性笔 0.3 黑色",
3    "color": "蓝色"
4}

又又隔了几天,我的订单终于发货了。我收到了「中性笔 0.3 黑色(蓝色)」「中性笔 0.3 黑色(红色)」「中性笔 0.3 黑色(黑色)」若干。

「学东西慢」

前一段时间跟朋友聊天,两人都说「感觉现在学东西好慢啊」。

我一直出于「好玩儿」在学 Elixir 和 Phoenix。之所以产生兴趣是因为看到 Phoenix LiveView 很方便,而且发觉 Elixir 的语法也挺好看的。

印象中自己已经学了很久了,但还没做出什么东西。于是感觉这进度确实贼慢。

从「番茄土豆」的记录里看,最开始是在 4 月初。从时间跨度来看,确实也是花了很久的。

但仔细数了一下番茄的数量,总共有 116 个小时。从时间投入来看,折合成工作日只有 15 个呢。

一开始节奏不规律。比如今天学了一些基础,隔几天再继续的话,再「启动」就需要花一些前置的时间「预热」。可能也是浪费了一些时间。

另一个可能浪费时间的原因是,一开始跟着教程写完范例的 project 之后,并没有立即上手写自己想写的东西。部分原因可能是那个教程里教的东西不够完全。

后来找到的 Dockyard 教程感觉内容很全面,既有阅读材料,每一部分阅读材料也有相应的练习。一开始从这个开始,可能是会节省一些时间的。

1 月中旬决定每天在图书馆待两小时写自己的 project。自那以后,感觉自己的进度确实快多了。一方面是持续规律的投入时间,每次的「预热」成本略低。另一方面是,之前零零碎碎了解的知识,终于成了能跑起来的整体,有了「知道自己在做什么」的感觉。

学习过程中,投入的时间与感受到的回馈不是线性的。而是初期阶段往往感受到不到成效,而一旦脑袋「通」了(比如:零碎的点在头脑里有了结构;或者:通过练习,从纸上谈兵的知识产生了手感和触感),感受到的回报就是超线性的。

「学东西慢」的感觉并不是准确的。

「辞海」

朋友为了给我解释阿拉伯语的词形变化,举例子说:「比如字典」。他想的词是 mo3jam 1,但是我想到的词是 qamus。

现代维吾尔语的词典是 lughet,向上追溯的话也是阿拉伯语,百科全书是 qamus。但按照「阿拉伯语的普通词,其他语言借入的时候逼格会提高」的规律反推,qamus 在阿拉伯语里是「字典」就显得很合理。

我朋友甲感觉 mo3jam 是日常词,qamus 是书面语词。朋友乙一脸「你丫可问住我了」的神情沉吟半天,说 mo3jam 更经常指用阿拉伯语解释阿拉伯语的那种词典。

然而查阅了辞源,发现 qamus 竟然是古希腊词 ōkeanós(海洋)。为什么把开头的 o 扔掉,以及为什么 n 变成了 m 就不知道了。

给另一个朋友炫耀了一番这个小知识(「你瞧你瞧,我知道这么牛逼的冷知识!」)之后,她甩给我一个维基百科的链接,是一个叫 菲茹扎巴迪 2 (1329–1414) 的伊朗人在麦加编的一本阿拉伯语字典,名为 Al-Qamus al-Muhit。似乎是因为这个字典如此著名,以至于它的第一个词成了字典的代名词吧(猜的)。

但让我困惑的是 al-muhit 也是「海洋」的意思。所以这字典的本意难道是「海洋 — 海洋」或者「洋 – 海」?不过我这半瓶醋就别瞎琢磨了,回头脑袋烧短路就麻烦了。

接着又想起《编舟记》里面那本虚构的字典,名叫《大渡海》。以及《辞海》。

这么看来人类的比喻有些就还挺像的。


  1. 这里为什么有个 3 呢?阿拉伯语约定俗成的「短信拼写」是把 ع 写作 3 的。ع 发音约等于法语的 r(如果我没记错的话)。 ↩︎

  2. 全名 Muhammad ibn Ya'qub al-Shirazi al-Firuzabadi,意译的话是「祖籍菲茹扎巴德、生于设拉子穆罕默德,他是亚库卜的儿子」。以及,我发现专有名词加下划线还挺有助于阅读的。 ↩︎

1 月份

1 月份读完了一本瑞典语的小说,遇到生词就划线,每页大概能划 10 到 20 个词,剧情是能跟得上的。自以为也能懂一些微妙的涵义,但这个也没办法量化,更没办法跟别人解释。

倒是打算每页至少查三行、五行的生词,但是到 1 月底才发现 300 页的书大概只查了 80 多页。但是已经迫不及待地开始读下一本小说了,毕竟大脑里总要不停地输入信息,不然就会感觉崩溃。好在常见的词,下一本书里迟早还是会遇到,只要不停地输入,总能学会的。


前段时间了解到了一个叫「领域驱动的设计」(Domain-Driven Design) 的概念,感觉受到了很大的启发。(用中文讲就怪怪的,挠头。)

一开始是看了 YouTube 上的一个视频1,之后又翻了翻一本叫 Domain Modeling Made Functional 2 的书。书只看了开头的几章,后面没细看,因为后面的例子用的是 F#。

上面的视频、书,以及网上读到的文章和例子里,具体的操作手法会有些细微的差异。然而大略地讲,动手写码之前要理解软件是做什么的(废话),而理解「软件是做什么的」之前,更要理解「这个 business 是干什么的」。

捋清楚流程中有多少「实体」 (entities);各个实体会发生什么「事件」(events);某个事件发生后,谁要去做哪些「工作流」 (workflows)。

之后观察这些东西之间有什么联系,然后就会发现联系紧密的东西,形成了 context。

把这些实体、事件、工作流、contexts 都起好名字。不论代码里、文档里,还是日常沟通里,都要用同样的名字。

其实系统不复杂的话,倒也不用照本宣科。然而日常借用这个思路还是有很大帮助的。


Mermaid 是很有用的。3

放在 Markdown 里,用纯文本就可以画流程图、ERD 什么的。VSCode、GitHub、Notion 里都能无痛预览。

1 月份用 Mermaid 画了很多流程图和 ERD,感觉讲事情的时候确实明白了很多。泣血推荐!

做事情是很有用的呢

感觉今年最大的进步是「做事情是有用的」这个念头得到了现实的验证。


YouTube Premium 倒是蛮值得的,平时很多关于写码、做计划之类的视频都是在 YouTube 上看的,略去广告的感觉是很赞的。YouTube Premium 的价格在瑞典和 Spotify 一样多,而且 YouTube 上的音乐和 MV 感觉比 Spotify 还多。虽然推荐算法始终不如 Spotify,但这个价钱是比单买音乐服务更划算的。


第 4 季度的时候决定每天朗读十页瑞典语小说,尽可能每页查几个单词,再把生词出现的句子做成「刻漏字」(cloze) 放进 Anki 里。到现在已经坚持了大概一个月,现在脑子里仿佛对这门语言更有感觉了。

之前一直想这么做,但觉得挺累、挺枯燥的,而且不确定有没有用,就一直没有实际执行。在 YouTube 上看到的两个视频1 2让我蛮有启发的。

核心的思路是学了最基本的语法之后,就大量输入真实的语言材料。随着信息的摄入,大脑就会「识别」出里面的规律和模式 (patterns),假以时日,大脑慢慢就参透了。

之前有一段时间,我每周都会花很多时间练习听写。耳朵确实更灵了,但是一小段话要反复听一个小时,因为没有新的信息和情节,所以很难把兴趣维持下去。

之前总有人说「你学语言就要多和人交流」。这话固然是没错,但是如果只是停留在低层次的「你今天开心吗、你家几口人」之类的对话,没有智力上的刺激感啊。


今年读到的很有帮助的一篇文章是 Superlinear Returns3,让刚刚确信「做事情是有用的」的我大为惊骇。

所谓「做事情是有用的」大概意思是,有投入就有回报。这样的 realization 已经很能鼓舞人了。

但是这篇文章讲的在一个方向走得越远,越能产生超额的回报。这里面的两个机制是「台阶」和「叠加」。在一个领域付出一定的努力、做出一定的成绩后,就可以踏上新的台阶,做规模更大的事情。比如在一个领域学了足够多的「部件」,就更容易理解「系统」是怎么跑的。此外,在甲领域学到的原理,也可以迁移到乙领域去,二者叠加起来也更带劲 (for lack of a better word)。


在学 Elixir 和 Phoenix,感觉是最适合写个人项目的 tech stack 了。

对比前后端分离的结构,通常要前端一个语言、后端一个语言,会精分。传递数据的过程,尤其是如果用 REST API 的话,要两头都验证一遍,怪麻烦的。

如果是内容型的网站,前端如果用 React 或者什么框架,为了让浏览器抓到并 cache 全文,就需要再套一层 SSR 框架。

这样下来就需要:在呈现/渲染层用 React,在预渲染的服务器上跑 Next,在后端跑后端的东西。

那干脆都用 TypeScript 好了啦。但 TypeScript 的问题在于,它更像是一个 linter,难以弥补 JavaScript 的种种变态漏洞。

反正 Elixir 写起来挺舒服的(写 Go 也挺舒服的),而且学 Elixir 的过程中,时常会脑内闪出火花:「哇,原来程序还能这么写!」

第 49 周

最近读到的不错的文章有:

一个独立创造者的五年

这位同学践行了 “Learn to sell. Learn to build. If you can do both, you will be unstoppable.” 的道理,做了一个面向欧洲的电子商务工具。

他的产品从实际开始做,到产品最初上线,只花了三周。实际动手之前,花了好几个月的时间研究市场需求。

之所以确定要实现这个想法,而不是其他想法,是因为很多不错的主意过一段时间就会一闪而过,但这个主意越想越成型。

东西做好之后怎么去卖,是需要学习、试错的。很多人浅尝辄止就觉得「卖东西我可不会」。这种态度就只能说,请您自便了。

现在业务环节里的很多步骤,都是有现成的工具的,尤其是互联网业务。所以作为一个工匠去做东西,很多时候专心做核心业务就行。

有了第一个产品之后,后续的想法就会源源不断。一方面是客户会提新需求,另一方面是实际问题接触得越多,就会想到更多的方法。

另外一个劝退:面向中国的付费内容产品是不行的,因为盗版太多了。

Advice from the CEO of Shopify, Tobias Lütke

Tobi Lütke 颇有工作狂的特质呢。他给别人的建议是:有什么事儿是你白干都乐意,但是别人都是收钱才愿意干的?那就盯准那一件事猛干。

这件事对于 Tobi 来说就是写软件。写软件让他如此快乐,以至于他觉得最快乐的事是工作,「坐在海滩上晒太阳喝 mojito 是一件 dystopian 的事」。