读《岩田先生:任天堂传奇社长如是说》

虽然我有 Switch 游戏机, 但我不是游戏的发烧友,对任天堂及其社长岩田聪更不甚了解。前些天听《半拿铁》的《任天堂往事》系列,对任天堂的发展有了一些了解,也听闻岩田聪同时是一个非常出色的程序员,所以开始对岩田聪产生了一些兴趣,于是找到了这本收集了岩田聪说过的话的书,希望能一睹这位天才程序员对管理企业和写程序有哪些独特的见解。

这本书不长,读完后我对岩田聪确实有了更多了解。首先是从他身上学到了一些管理企业的方法。

岩田聪的管理风格非常务实和「接地气」,他讲到他喜欢和员工一对一面谈:
我在与全体员工谈话的过程中,发现了许多“经过面谈才头一回意识到的事情”。就算对方是一向保持着沟通的人,也有在一对一的场合才讲得出口的话。这样说或许不太恰当,但我重新认识到:“假如不制造推心置腹的机会,人是不会敞开心扉的。”
在书的最后有宫本茂和糸井重里谈岩田先生的追忆文章,其中糸井重里回忆说:
虽然是第一次见面,但他的话语让人觉得值得信赖。岩田先生曾回忆说:“第一次见面时我也相当紧张。”但我一点也没看出来。“在已有基础上修改,还是从头做起?”这句话单从字面上看会让人觉得不够谦逊,但岩田先生完全没有居高临下的姿态,而是传递出十分看重对方自由选择的权利的感觉。怎么说呢,原本是我们请他来帮忙,但在技术问题之外,岩田先生工作方式的魅力也令我们深受感触,见面次数越多就越发信赖他。
结合我从前被管理的感受来看,这让我意识到,管理者能给被管理者足够的信任感是非常重要的,而信任感可以来自于谦逊和务实。

岩田聪还对公司的会议规定必须有一位「会议统筹」:
所谓“会议统筹”,就是让会议良性运转的人。如果会议中缺少创意,就负责添加创意;如果创意太多,导致过于发散,就负责归纳总结。简言之,就是会议的指挥。无论什么会议,都必须有一个决心“要在会议上得出答案”的统筹者。
我们在厂里工作过的都知道,很多时候会参加一些没有结论的无用会议,如果每次会议都能指派一个这样的「会议统筹」,相信大家的效率会提高很多。

从岩田聪的谈话中,我感觉岩田聪是一个非常能够洞悉到他人内心感受的人,所以在推进项目的时候,也会非常照顾同事的感受:
世界上许多改革都是运用否定现状的逻辑推行,但这样的做法会让很多人陷入不愉快。因为当下的现状正是许多人的心血、诚意、热情构成的。如果现状由不诚实的东西构成,去否定也无妨,但由诚实的产出构建的现状,不应该被否定。
也许正是这样的性格,才能让岩田聪清楚洞悉玩家的感受,从而做出改变世界的游戏。同时,也是因为他是真正有「给别人带来快乐」的强大 passion:
岩田先生发自内心地喜欢看到大家的笑容。他也将这个目标列入任天堂的经营理念。的确,他是一个希望给世界创造更多快乐的人。并且,他是一个为了实现这个目标不惜舍身奉献的人。他喜欢帮助他人,喜欢钻研各种事物,也喜欢为此而沟通交流的过程。所以说,每周一与宫本先生一起吃午饭的时间,凝聚着岩田先生所喜爱的一切。因为他们一起讨论着游戏创意,说着“我懂了”,试图给自己与玩家都带来笑容。
我一直觉得,能成大事的人,都是那些内心有一种很强大的 passion 的人。我虽然不是资深玩家,很难从游戏中感觉到快乐,但从岩田先生的谈话中,我还是为他的这种 passion 所感动。

如果你本身是一个玩家,可能会对这本书有更深刻的理解。

最后,用岩田先生的话结束这篇读后感:
在我的名片上,我是一名社长。在我的头脑中,我是一名游戏开发者。但在我心里,我是一个玩家。
On my business card,I am a corporate president.In my mind,I am a game developer.But in my heart,I am a gamer.
名刺のうえでは、わたしは社長です。頭のなかでは、わたしはゲーム開発者。しかし、こころのなかでは、わたしはゲーマーです。


via Randy's Blog

Invalid media: image
读 React 18 文档有感

昨天 Sixian 提到了 React 的新版官方文档,之前一直没有去读,今天抽空读了其中 Escape Hatches 的部分,有一些收获,也有一点感想,在这里简单分享一下。

声明:我经常使用 React, 但我不是 React 的专家,我也不再是一个对技术会进行非常深入探究的人了。所以对于 React 最新的一些 API, 可能对某些人来说是老生常谈,但对我来说是新鲜的。所以本文只是简单分享一下我看到的之前不知道的一些 API.

跑两次的 useEffect

开发环境 useEffect 跑两次是故意的,是为了帮助开发者在开发环境中发现你是否正确地给你的 effect 做了 teardown.
The right question isn’t “how to run an Effect once”, but “how to fix my Effect so that it works after remounting”.
如果你的代码因为 useEffect 跑两次所以出问题,很可能你用错了 useEffect.

讨论这样的特性是否是一种傲慢对我来说意义不大,重要的是我理解了其动机。

flushSync API

React 有一个 flushSync API, 可以强制 update DOM. 在以前我们一般是把希望在 DOM 更新后才执行的代码放在一个 setTimeout 里.

如果想重置一个 Component, 直接给它一个新的 key

如果希望某个 component 的 props 被改变的时候做一些重置,应该直接给这个 component 赋一个新的 key, 使 React 直接重建整个 DOM, 而不是用 useEffect 手动做重置工作。

其实以前我也经常这么干,比如 Modal 在关闭和打开后重置里面 Form 的值,我会直接给 Modal 一个新的 key. 一直不知道这是否是一个 best practice, 现在得到了官方认证。

useSyncExternalStore

这是一个我不知道的 Hook, 看起来很适合用于把别的库移植到 React 时使用,而且它对 SSR 非常友好。

一些感想

很多人觉得 React 繁琐,心智负担特别大,我也这么认为。但我一直觉得,这不是 React 本身的问题,而是 JavaScript 的问题。

React 是一个特别函数式编程思维的框架,但很可惜,JavaScript 只是一个半吊子的函数式编程语言,它只是在被设计的时候学了一点 Lisp 的皮毛,也提供了一点点函数式的 API, 但它没有很多真正的函数式编程语言应该有的基本特性,才导致了我们要写额外的代码来解决一些问题。

例如,Memoization 在一些函数式编程语言里是标配,但 JavaScript 里没有,所以你需要给函数手动套一层 React.useCallback.

函数式编程语言里, Immutable 也是标配,而在 JavaScript 里,需要用 Immer 之类的第三方库。

所以这就是为什么在多年前我很看好 ReasonML (现在叫 ReScript) 这个语言,因为它本身就是真正的函数式编程语言(它是基于 OCaml 的 JavaScript 方言),你会发现,用它来写 React 是多么舒服的一件事,因为语言本身就提供了你在 JavaScript 里需要调 API 才能实现的功能。有趣的是,React 在刚开始设计的时候用的就是 OCaml.

成也 JavaScript, 败也 JavaScript.

via Randy's Blog

Invalid media:
image
image
image
image
2023 年终总结: 和自己对话

可在小宇宙收听本文音频版


变化

2023 年初,持续了 3 年的疫情封控结束了,整个社会迎来了一个转变的开端,没人知道会变好还是变更糟糕。随后 3 月,我决定离开微软,我自己也迎来了一个转变的开端,我也不知道会变好还是更糟糕。

我财务自由了吗?如果财务自由有一个绝对值,那么无论是多少,我肯定都没有达到。离职后有很多朋友问过我这个问题,现在刚好可以在博客也跟我的博客读者分享:当我在考虑不工作时,我在思考什么?

1. 如果继续现在的状态,那么 3-5 年内我会有什么不同?

这是我在考虑是否入职微软之前用的同一个方法,是我朋友教我的。当年我觉得如果不入职微软见识见识,我一定会后悔,留在原来的公司也不会有太大的变化。今天即使我已经离职了,但我很感谢我有选择微软,我的收获非常多。所以我运用同一种决策方式来思考,即使我在微软继续工作 10 年,很大可能我得到的只是 title 和薪水的不同,这和我的目标背道而驰。这也引出了我的第二层思考:

2. 我正在做的事和我的长远目标是否对齐?

过去我会担忧和焦虑我达不到目标,后来我醒悟:没有人可以控制结果,只要我正在做的事是朝向我的长远目标就可以了。继续工作显然不是。

3. 没有固定收入怎么生活?

我有一点积蓄,虽然不多。很多人存了钱,买了房子。而我用我的积蓄买一段可以不工作的时间,我觉得还是很值得的。而且我不工作也不是天天躺着什么都不做,只要朝着我的目标在努力,这也算是一笔投资。

幸福之道

离开公司后,我的心情很复杂。我觉得我一直想寻找一个答案,但实际上我连问题是什么都不知道。我想起了年轻时读的《刀锋》,应该像书中的拉里一样去寻找,于是 7 月份我去了泰国,得到了一段出乎意料的佛教哲学之旅

创造

今年的输出比我预期的要更丰富一些。

视频创作

继 2022 年的 Logseq 分享视频,今年又做出了一个超 50,000 播放量的视频《我如何做笔记》

《代码之外 Beyond Code》播客

今年终于和 GeekPlux 一起把盘算了多年的项目真正做了出来,意外地得到了很不错的反响。甚至能在线下聚会的时候听到一些我们的听众表达的感谢。

其实节目的制作形式受到了很多我喜欢的不同的播客节目,我由此也更深刻地感觉到,一个人能做出什么样的东西,很大程度上取决于其接触、输入的东西。只有吸收优秀的东西,才有机会做出优秀的东西。

这跟做产品也很像,如果一个人从来没有体验过真正优秀的产品,那就很难做出优秀的产品。所以我总是鼓励一些朋友,不要因为一个产品要花钱所以不去用它,就算只买一个月,也要去体验一下。

Randynamic Studio

离职后我就计划把我之后做的所有小工具统一到 Randynamic Studio 的名下. 很幸运,它的真正意义上的第一个产品 Notepal 算是非常成功。它没有为我赚巨额的钱,但它解决了很多人的需求,并且这些人愿意为它付费,这是我写在博客首页很多年的一个目标,在今年终于实现了。

多年来我把 Y Combinator 的 slogan 一直放在心中,有很长一段时间我每天睡醒后心里就会自动播放这句话:
Make something people want.
很幸运我朝着这一个目标又迈进了一步。

线下聚会

解除封控后,终于可以参加一些技术圈子的线下聚会了,也有机会见到一些相识多年但从未谋面的网友。

先是参加了佐玩开发者交流会,见到了很多很年轻的后辈,更惊喜的是很多是《代码之外》的听众,他们都说在节目中收获到了很多。在那一瞬间我觉得我做的很多事情都是有意义的。

然后我到杭州找了图拉鼎,见识了数字游民的聚合地「玉鸟集」。在那里还认识了非常多的独立开发者和做产品的人,大家都很有自己的想法,对自己做的事情有自己的理解,有自己的观点,自己的品味。这种类型的朋友是很难在工作的时候遇到的。

总结

2023 是我和自已对话的一年,我开始了解自己想要的是什么,了解自己的情绪,了解自己擅长的是什么,不擅长的是什么,了解自己追求的是什么,等等。在清迈,我学会了倾听内心的声音,我也意识到,在真正了解自己的情况下,做决定似乎没有那么难了。

展望

我其实很希望在 2024 年能做一些 scope 更大的事情,同时也需要找到和我有相同 passion 的人。我一直不称自己为「独立开发者」,一是我觉得我还没达到,二是这也不是我的目标。我的目标一直是两三个有同样追求的人组成一个小 team 做一个美且在商业上可行的产品。

希望自己能往目标再迈进一大步。

via Randy's Blog
复读和命运

冯大辉 Fenng 发了一条 Tweet
对于各位高考过来人,如果成绩只能上二本,要不要复读?
以下是我的想法。

我当时考到的是二本,除了学费贵一点之外,我觉得都挺好的。我个人的浅见是,命运是没有人能预测的,复读和不复读是两个不同的分支。当然这说了等于没说。所以我来试试纸上谈兵一下:

我们假设复读一定能考上一本,那么我们可以把问题简单化为一个博弈:是否用人生的一年时间去换这个一本学历?

我有一个高中同学选择了复读,最后考到了比不复读更好的学校,但是在我对他的理解和我的个人认知里,他复读和不复读,并不会有很大的区别。

在我有限的经验观察里,人和人的距离,一本和二本的差距只占了非常非常小的部分,最重要的是人本身,他是否能客观地认知自己,自己的目标在哪里,想要的生活是什么,追求的东西是哪些。再以此为前提,是否能为了目标去努力地寻找资源,运用自己的主观能动性,去趋向自己的目标。然后在运气来临的时候抓住它。

就像有些人对我的评价,我「只不过是每次赶上了末班车」。我觉得这个评价很正确。我原本是 2018 年的大学毕业生,但我 2015 年就退学了。没有人知道我退学之后是好还是坏,我也不知道,但我们马后炮地回看,当时的时间点退学,让我赶上了互联网发展的「末班车」,如果我等到毕业,在这鼓浪潮开始退去的时候,我这个二本学生,不一定能混到我现在的状态,这辆「末班车」早就跑了。

我的例子不值得效仿,能不能坐上「末班车」,除了时机,还有我早就付出过的那些别人不一定看得到的努力。但我想表达的是,在做选择的时候,不能轻视了「时间」这个非常重要的因素。早一年和晚一年,会认识不同的人(这决定了人脉),会影响你身处在浪潮哪个位置,等等等等。

这个世界就是一连串随机事件的结果,它没有好坏之分,好坏都是靠自己的努力去定义的。如果这位朋友对自己的目标并不明确,那么早一年晚一年,好像也不会有什么本质上的区别,只要自己复读的一年里心理状态可以保持得很好,那复读也不是一个坏选择。

只有在「有目标 + 肯努力」的状态下,才能把人生这张彩票玩成一场能拿一手烂牌打赢的德州扑克。

via Randy's Blog
遗憾最小化框架 —— 如何做决定

对于我来说,我一直认为自己缺少做决策的能力。成年人的生活不像学生时代,所有的题目都有固定答案。所有的选择都不存在绝对的对和错,它只是在人的一生 checkout 了一个新的 branch. 我总是不知道应该如何做决定。

刚好看到了 Jeff Bezos 曾经谈到了自己是如何做决定的,他称之为 Regret Minimization Framwork (遗憾最小化框架) —— 他会想象自己到了 80 岁的时候,是否会认为不做这件事情会让自己遗憾。尽量让人生的遗憾数量最小化。即使当时的选择后来看来是错误的,但也不会后悔尝试过。

我很受启发。想起在 4 年前,我曾经问 Cycle.js 的作者 staltz 一个 问题, 我问他是否也会因为自己做的库没有像 React / Vue 那样火起来而感到气馁。他说他偶尔也会感到气馁,但他一直以来做事遵循一个 guideline:
Ask yourself: in 10 years from now, will you be proud of having done this? ... Do things that your future self will be proud, is my motto for the time being.
记得在一年前决定是否接收微软的 offer 的时候我非常犹豫,因为微软给出的 offer 比其它国内「大厂」给的少非常多。但是我回想起初中的时候,读了很多关于比尔盖茨的传记、微软的创业故事,十分向往。那时候的我没有预料到我将来有一天竟然有机会加入这家公司。也不会想到作为一个大学没有毕业的人竟然也得到了这样的机会。我也咨询了很多朋友我是否应该接受这个机会,他们有的会说其实在微软写的代码甚至没有在国内的公司那么 fancy. 但是我想,在加入了微软之后即使在后来可能发现这未必能得到我想象中的东西,但如果在很多年后回想起来我曾经放弃了这个机会,我一定会后悔没有尝试体验一下在这家公司工作。所以最后我决定接受了这个 offer.

via Randy's Blog
我给自己设立了每月 $20 的开源捐赠预算

Babel 官方最近发布了一篇博客 称 Babel 团队的 funding 已经不够了。一直以来我零碎地捐赠过一些开源项目和个人,在卖贴纸和 T 恤的时候也把大部分的利润捐赠给了 Vue. Babel 这件事让我有了固定每月捐赠一些开源项目的想法。

目前设定的是每月至少 $20 (约 130 多元人民币) 的预算,这样平均至少可以捐赠 4 个不同的项目。我可以在这个预算内根据我的技术栈灵活地选择我对哪些项目进行捐赠。

我个人会选择一些这样的项目进行捐赠:

我在做 side-project 的时候经常会用的项目
项目没有融资背景(例如我非常喜欢 Prisma, 可是它已经有了 $12M 的 A 轮融资)
做了一些我用到的工具的个人开发者

目前我捐赠的项目和个人

EGOIST 在全职做开源的好朋友
chakra-ui 我用 React 写 side-project 必用的 UI component 库
dayjs 我经常会用的 moment.js alternative
react-query 我经常会用的 React 请求库
next-auth 非常好用的 Next.js OAuth 库
Logseq 开源的 Roam Research alternative

你可以在 OpenCollectiveGitHub Sponsor 看到我对哪些项目和个人进行了捐赠。

国内用户捐赠的方法

国内用户捐赠只要具有以下其中一个条件即可:

注册 Paypal 账号和国内银行卡绑定
持有一张 Visa 信用卡

OpenCollective 支持 Paypal 和信用卡,甚至支持银联的信用卡,因此一般国内用户都能很容易通过 OpenCollective 进行捐赠。GitHub sponsor 不支持 Paypal, 需要 Visa.

除了每月固定的捐助,还可以选择一次性的捐助。

我对开源的看法

我从开放的源代码学到了非常宝贵的知识,这些知识帮助我成为了更好的程序员。功利一些来说,我通过使用这些开源项目得到了可以谋生的岗位,这些开源项目竟然是开放和免费的。

有些人认为,做了一个成功开源项目,即使没有钱,也收获了名气。对我个人来说,我确实也通过做开源项目得到了非常多的机会,但是正是自己做过开源项目,才深知维护一个开源项目的成本不是靠「名气」就可以支撑起来的。

关于这个话题,强烈建议收听牛油果烤面包的这一集 Podcast: 《#70. 和Vue.js的创造者尤雨溪聊开源软件》

也可以读一读这本 Working in Public: The Making and Maintenance of Open Source Software, 里面有很多开源软件维护者面临的问题。

我们可以为开源做什么?

根据自己的经济情况,设立一个捐赠预算($1 也很不错),给自己生活中、工作中用到的开源工具进行捐赠。
和我一样写一篇文章介绍你对哪些项目进行了捐赠,鼓励更多的开发者对开源项目捐赠。
贡献有意义的 PR,即使只是文案的修改。

via Randy's Blog
做这个世界的生产者

偶尔看到这篇名叫 Consume less, create more 的文章,是作者从「消费者」转变为「生产者」的心路历程。他每天在巴士上面用 iPhone 写点什么,最终写出了这篇文章。

我从懂事开始就一直觉得自己在这个世界上与众不同,觉得自己的出生一定是背负了某个特殊的使命。后来发现原来每个人年轻的时候都是这么想的,随着年纪渐长,大多数人开始接受自己只是个普通人的事实。我也不例外。

但唯一没有变过的是我没有因为意识到了自己的平凡而停止了试图变得不平凡。其中的一个表现就是我希望在这个世界上,我是作为一个生产者存在的,而不只是一个消费者。

写博客、编程、做音乐都是我的生产,即使我写的博客没有让我成为几十万粉丝的 KOL, 我写的代码没有几万的 star, 唱的歌的观看数只是几百,我还是保持生产,因为对于这个世界,能让我有那么一点与众不同的是我的生产,而不是我的消费。

我讨厌抖音,不是因为它的内容,是因为它默默地把人驯化成了贪婪的信息消费者。如果我什么都不创造,那么我每天看 Hacker News 和别人每天刷抖音没有任何区别。

这个世界的每个人都是消费者,但不是每个人都是生产者。如果你也希望为这个世界留下点什么,就去创造,别担心你创造的是不是垃圾,只要创造了,是一定会有收获的。

via Randy's Blog
Back to Top