<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/feed.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Airing 的博客</title><description>Airing - INFJ | Blogger | Full-stack engineer | SG</description><link>https://ursb.me/</link><language>zh-cn</language><item><title>当 AI 拿走一切之后</title><link>https://ursb.me/posts/after-ai-takes-everything/</link><guid isPermaLink="true">https://ursb.me/posts/after-ai-takes-everything/</guid><description>从三位读者的困惑出发，探讨 AI 逐步取代执行环节后人类还剩下什么，提出判断力、品味与推演三种难以被替代的能力，并反思认知外包对个体主体性的侵蚀。</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近一个月我陆续收到了三封咨询来信，来信的是三位素未谋面的软件研发，或是基础架构的前端或是数据部分的运维，但这三封信其实困惑其实是同一个问题。&lt;/p&gt;
&lt;p&gt;第一封信问我：“你觉得我们以后，全部都会交给 AI 做吗？如果是，code review 这些，还需要人吗？”&lt;/p&gt;
&lt;p&gt;我的回答是：很快。年底或明年，最迟后年。&lt;/p&gt;
&lt;p&gt;第二封信问得更直接：“未来我们的工作，是不是就是在建 AI，然后让它代替自己？”&lt;/p&gt;
&lt;p&gt;第三封信最长。写信的人罗列了他拥抱 AI 编程的全部理由——更少的返工、更少的沟通、更高的产出——然后在信的结尾承认：照这样走下去，自己的成长怎么办，他没有想清楚。&lt;/p&gt;
&lt;p&gt;这三个问题，本质上是同一个问题。浅显来看是一个工程问题，是一个职业规划问题，但其实本质上是一个存在问题：当执行被机器全面接管之后，人站在哪里？或者问得更彻底一些——&lt;strong&gt;当 AI 拿走一切它能拿走的，我们还剩下什么？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我在回信里给了一些零散的回答，但我知道那不够。这个问题值得一个更完整的回答，于是有了这篇文章。这是一个共性问题，也是我最近时常在思考的问题，现在把我的想法记录下来，或许可以帮助同样有此困惑的同学。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;一、珍妮机&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;青山遮不住，毕竟东流去。——辛弃疾《菩萨蛮·书江西造口壁》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;两百多年前的英国，一台叫珍妮机的纺纱机问世了，一个人能顶上从前好几个人的活。纱线便宜了下来，而那些靠一双手、一架旧纺车过日子的纺纱工，生计在很短的时间里就垮了。&lt;/p&gt;
&lt;p&gt;后来，有人在夜里去砸毁机器，史称卢德运动。人们常把这些人当作仇视技术的蠢人，其实是误读——他们要砸的从来不是机器本身，而是自己在机器面前那个突然变得一文不值的位置。他们不是看不懂技术，恰恰相反，他们比谁都更早看懂了正在发生的事。&lt;/p&gt;
&lt;p&gt;美团宣布裁员 30%-50% 的那一天，朋友微信问我怎么办，我回复了一句话：我们不应该成为被珍妮机取代的女工，而应该是那一批高效使用珍妮机的人。&lt;/p&gt;
&lt;p&gt;这句话他可能记了很久。但今天我想对它做一个修正——它只说对了一半。&lt;/p&gt;
&lt;p&gt;因为历史的下一页是这样写的：操作珍妮机的熟练工也没能安稳多久，更快的机器很快被造了出来，珍妮机连同它娴熟的操作工一起被送进了博物馆。每一台机器，都在等待下一台机器 —— “去学会使用新机器”，这种手段从来只是缓刑，不是赦免。&lt;/p&gt;
&lt;p&gt;所以真正的问题不是“会不会用 AI”。今天会用 AI 的人，相对于不会用的人确实握有优势，但这个优势的半衰期，可能只有一两年，甚至在第一梯队最多只有 1-2 个月。因为模型的压制越来越强，留给我们探索和适应的窗口期越来越短，每次新一代模型放出来，必然又是一轮范式的刷新——你今天苦心搭建的工作流、总结的提示词技巧、沉淀的工程方案，都可能在一夜之间变成珍妮机。&lt;/p&gt;
&lt;p&gt;对此，我的方法只有一个，我把它称为&lt;strong&gt;终态思维&lt;/strong&gt;：即，不要在中间态的问题上消耗自己，直接以终局为前提去思考和行动。&lt;/p&gt;
&lt;p&gt;举个例子，前段时间，我和几位同行认真争论过一个问题：AI 写的代码越来越多，工程师还需要逐行理解这些代码吗？这个问题有很多解法——更好的文档、更好的可视化、强制的代码讲解会。但在终态视角下，它根本不是核心问题：当意图可以直接而可靠地变成系统，“人逐行理解中间产物”这件事本身就会失去意义，就像今天没有人要求工程师逐行理解编译器生成的汇编。被一个注定消失的问题困住，是这个时代最隐蔽的浪费。&lt;/p&gt;
&lt;p&gt;终态是什么样子？我的判断很简单，简单到只有一句话：PRD 即 Code，或者泛化些 —— 意图即实现。一份足够清晰的意图表达，直接落地为可运行的实现，中间所有的冗余环节——排期、联调、交叉评审、来回翻译——都会消失。从我的认知来看，这件事不在十年后，它在今年之内就完全可以实现。就如同前几天的 Fable 5，相信体验到的同学很了解它与 Opus 4.8 的差距，它自信且强大，甚至一度怀疑我跟他对话问的问题是不是太蠢了。&lt;/p&gt;
&lt;p&gt;由此可以得出终态思维的第一条推论，它冷峻但诚实：&lt;strong&gt;凡是站在意图与实现之间的环节，都默认会消失。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;剩下的问题是：人往哪里站？&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;二、瓶颈移到了人这里&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;取法于上，仅得为中；取法于中，故为其下。——李世民《帝范》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;先讲我自己身上的变化。&lt;/p&gt;
&lt;p&gt;过去这一年，我把工作里能交出去的环节，一段一段地交给了 AI：方案是它写的，代码是它写的，文档和评审意见的初稿，也是它写的。一个晚上能并行推进的事情，放在两年前要排上一个季度。按理说我应该闲下来了，但事实恰恰相反——我比以往任何时候都忙，只是忙的内容变了：我几乎不再亲手生产任何东西，我整天都在验收它生产的东西。&lt;/p&gt;
&lt;p&gt;这就是终态流程的雏形。在那里，人需要做的事情只剩下两件：&lt;strong&gt;评审方案，验证结果。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;请注意这两件事的共同点：它们都不是生产，它们是把关。&lt;/p&gt;
&lt;p&gt;九十年前，《摩登时代》里的卓别林在传送带前拧螺丝，他跟不上传送带的速度，被卷进齿轮。那个画面之所以成为经典，是因为它精准地刻画了工业时代人的处境：机器定节奏，人追赶机器。九十年后，传送带换了一个方向——现在是机器在生产，人在质检。AI 的生产速度几乎是无限的，启动一个新任务的成本趋近于零；但验证它产出的成本一分没少，因为验证需要人介入。于是，人类历史上第一次，&lt;strong&gt;生产的瓶颈从机器一侧，整体移到了人这一侧。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个转移带来一个安静而致命的推论：你可以并发 6-7 个 session，在不同的 worktree 里舞蹈，疯狂上下文切换，优雅地并发多任务。但你会发现，在这条新的流水线上，如果你想提高进一步自己的吞吐速度，只有一个办法——&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;降低你自己的标准。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;少看一行代码，少推一步逻辑，少问一个为什么，在心里那个“算了，大概没问题”的声音出现时点头放行。这么推演的话，基本可以预言，未来几年里，几乎所有工程质量的滑坡都不是因为某个人偷懒，而是结构性的：当生产无限快，验证的标准就成了系统里唯一可压缩的变量，而压缩它的激励无处不在——老板的预期、同行的速度、绩效的鞭子，都在劝你松手。&lt;/p&gt;
&lt;p&gt;但请想清楚松手意味着什么。你之所以还站在验证这个环节上没有被优化掉，恰恰是因为你的标准比机器高。一个不断降低标准的把关人，是在亲手论证自己的可替代性。在这件事上我的态度从来没有变过：效率慢一点，没有关系；标准，一寸都不能让。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;三、消失的壁垒&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;无恃其不来，恃吾有以待也。——《孙子兵法·九变》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;可问题还有更靠前的一层：并不是每个人，都有资格安稳地退守到把关这个位置。有些岗位，会比别的更早被水淹没——连退守的机会都没有。&lt;/p&gt;
&lt;p&gt;在我们这个行业内部，最先感到水温变化的，我认为应该就是前端工程师。&lt;/p&gt;
&lt;p&gt;这不是因为前端不重要，而是因为前端的处境特殊。前端是整条研发链路的枢纽：上游对接产品和设计，下游对接服务端，旁边还要交付给测试——它是连通岗位最多的那个岗位，像一台路由器。但与此同时，它的护城河最浅：单页面的技术复杂度有限；写坏了，影响面只有自己这一页，不会波及别的系统；哪怕烂到没法维护，推倒重写的成本也很低。&lt;/p&gt;
&lt;p&gt;门槛相对较低（非基础架构，仅针对普通业务），影响面小，可重写——这三个特征叠加，意味着没有壁垒。于是整个行业都在眼睁睁看着所有人涌进这个门槛最低的房间：设计师不再交设计稿，直接 D2C 交 HTML，而且写得比一些工程师还好；测试工程师在成建制地转前端；服务端工程师顺手把页面写了；甚至完全不会写代码的人，靠着 AI 接下了人生第一单外包。&lt;/p&gt;
&lt;p&gt;但请不要把这一节读成一个关于前端的故事。它是一个关于&lt;strong&gt;壁垒&lt;/strong&gt;的故事，适用于任何行业、任何岗位。你只需要问自己两个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;你的工作中有多大比例，本质上是&lt;strong&gt;信息的搬运和格式的转换&lt;/strong&gt;？把需求翻译成代码，把数据翻译成报表，把政策翻译成幻灯片，把甲方的话翻译给乙方——所有以“在两个领域之间传话”为生的位置，都站在水位上涨最快的滩涂上。因为大语言模型，恰恰就是为格式转换而生的机器。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;你做砸了，代价有多大？代价越小的工作，越容易被允许交给机器试错；而一旦机器被允许试错，它的迭代速度就会碾压所有人类。反过来，那些做砸了代价巨大的领域——系统架构、高性能、影响千万用户的底层质量——机器暂时还进不去，不是因为它不够聪明，而是因为没有人敢让它试 —— 比如支付，比如交易，比如金融，比如大型客户端，比如基础架构容器等等。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;想明白这两个问题，出路其实就显形了，方向有两个：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;往深处走。&lt;/strong&gt; 把自己从页面的作者变成系统的守护者，去那些做砸了代价巨大的地方：性能、架构、质量、稳定性。我在回信里给那几位前端朋友的建议是：去接一些服务端的需求，小的需求干脆一个人全栈做完——不是为了多学一门技术，而是为了把自己的认知从单点拉成纵深。岗位的边界正在碎裂，未来需要的不是某一端的工程师，而是能对整个系统负责的人。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;往新处走。&lt;/strong&gt; 去做那些还没有人做过的、能让别人的工作流依赖你的东西。这里我要说一条重要的戒律：&lt;strong&gt;不做烧 token 就能得到的东西。&lt;/strong&gt; 任何一个别人已经做出来、你可以让 AI 照着抄一份的工程产品——再多做一个评审机器人、再造一个流程工具——都不值得投入你的精力，因为它的获取成本已经趋近于零。值得做的是范式层面的探索：那些做成之后，别人的工作方式会因此改变的事情。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最后说窗口期。一年前，大家的认知是“把 AI 当实习生用”还是一个稳妥的策略，即你定方向，它干粗活，你来把关。但模型升级的窗口一次比一次短，今天的 AI 在很多方面已经可以做导师而不是实习生了。把 AI 当实习生的人还能舒服一两年；一两年之后，真正的问题会变成：&lt;strong&gt;当它比你强的时候，你还能为这段协作贡献什么？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个问题，下一节回答。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;四、三样拿不走的东西&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;君子不器。——《论语·为政》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果执行环节注定要交出去，我们还剩下什么？&lt;/p&gt;
&lt;p&gt;我想先说清楚这个问题的性质，它听起来像一句哀叹，其实是一道提纯的工序。米开朗基罗说，雕像本来就在大理石里，他只是把多余的部分凿掉。AI 时代正在对每一个职业做同样的事情：它拿走的那些——重复的执行、格式的转换、熟练的搬运——&lt;strong&gt;其实从来都不是“我们”，只是我们用来交换薪水的时间&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;当这些东西一层层剥落之后，剩下的那个拿不走的部分，才是一个人真正的轮廓。换句话说：&lt;strong&gt;剩下的，才弥足珍贵——而且越是剩到最后，越珍贵。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;过去，它们被海量的执行工作所遮蔽，廉价得几乎无人在意；现在遮蔽物被整层撤走，它们第一次被整个儿摆到光线底下。&lt;/p&gt;
&lt;p&gt;在三封回信里，我反复写的是同样三件东西。它们不是技能——技能是“器”，器会过时，珍妮机的操作技巧再娴熟，也跟着珍妮机一起进了博物馆。这三件东西在器之上，而且我有相当的把握说，它们不可替代的原因不是机器暂时不够强，而是由这一代 AI 的技术结构决定的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一件，判断力。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI 是有史以来最强大的答题机器，但它不出题。你告诉它做什么，它就做什么——而“做什么”本身，是人的事。&lt;/p&gt;
&lt;p&gt;很多人以为 AI 拉平了人与人的差距，我的看法恰好相反：它会放大差距。做一个思想实验：假设所有人的提示词水平都登峰造极，每个人都只需要一句话就能让 AI 把事情做成——人和人的产出依然天差地别，因为你们让 AI 做的&lt;strong&gt;事情&lt;/strong&gt;不一样。选对问题的人，拿到的是十倍的产出；选错问题的人，只是以十倍的速度做着错的事。过去，执行能力可以掩盖判断力的平庸，因为执行本身就消耗掉了大部分时间；现在执行趋近于免费，判断力第一次被裸露在结果里，无处藏身。&lt;/p&gt;
&lt;p&gt;判断力没有速成的办法，但有笨办法：把手上所有的事情摊开，亲手排一遍优先级，然后逼问自己为什么是这个顺序——这件事凭什么排在那件事前面？它对业务的价值是什么？不做它的代价是什么？这些问题的答案，来自你对业务的体感和对技术的认知，而这两样东西，恰好也都只能亲自获得。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二件，品味。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI 的输出是预训练的产物。不加调教，所有人从它那里拿到的都是同一个东西：一个 80 分的均值——功能正确，面目模糊，正确得千篇一律。&lt;/p&gt;
&lt;p&gt;让结果从 80 分的均值，走向某个具体的、带着签名感的 95 分，是人注入的品味。&lt;/p&gt;
&lt;p&gt;讲一件真事。一位完全不会写代码的朋友，靠 AI 接下了人生第一单外包。页面做出来了，能跑，客户也验收了——但我看了一眼她的技术方案，一塌糊涂：能运行，不可维护，没有结构，走一步算一步。我没有替她写一行代码，只对 AI 多说了两句话：服务端应该用什么方案，应该部署在哪里。就这两句，整个项目的方向立刻就正了，AI 顺着这两句话自己完成了重构。&lt;/p&gt;
&lt;p&gt;功能是一样的功能，差别在哪里？差别就在那两句话里。那两句话，是品味。&lt;/p&gt;
&lt;p&gt;哲学家波兰尼有一个著名的论断：“我们所知道的，多于我们所能言传的。”品味是典型的默会知识：它写不进提示词模板，没法被一次性转移给机器，因为它不是一组规则，而是在亲手做事的千百次反馈里、在无数次“这样不对、那样才对”的灼烧中长出来的东西。&lt;/p&gt;
&lt;p&gt;《庄子》里的庖丁说：“臣之所好者道也，进乎技矣。”技，可以交给机器；道，暂时还不行——而且越是技被交出去，道的稀缺性越高。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三件，推演。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI 是概率的造物，因此它给你的材料永远丰盛、相关、看起来头头是道——但“看起来有逻辑”和“逻辑坚实”之间，隔着一条必须由人亲自走过的路。&lt;/p&gt;
&lt;p&gt;AI 做加法，人必须做减法。它一秒钟能给你十个理由、二十条参考、五种方案，而人的工作是在这片丰盛的相关性里，找到那个最坚实的点，然后亲手把逻辑链一环一环重新推出来：如果走这条路，第一步会发生什么？卡点会出现在哪里？那个卡点是本质的，还是工程的？——在脑海里把这座逻辑大厦亲手搭一遍，搭不起来的方案，落地后一定塌。&lt;/p&gt;
&lt;p&gt;来信的朋友里，有一位说自己习惯用纸和笔。在让 AI 出方案之前，她会先在纸上推演：如果上游直接给我们代码，我们怎么运行它？会遇到什么问题？这个问题是怎么产生的？我特别珍视这个习惯，因为推演的过程，就是&lt;strong&gt;知识所有权&lt;/strong&gt;的来源。&lt;/p&gt;
&lt;p&gt;AI 可以在一瞬间把整座大厦的图纸塞给你，但如果那条逻辑链不是你亲手搭的，那个知识就不是你的——它寄存在你的脑子里，却无法迁移到下一个问题上。下一次，换一个场景，你还是只能再去问 AI。&lt;/p&gt;
&lt;p&gt;王阳明说：“未有知而不行者。知而不行，只是未知。”五百年前的这句话，在 AI 时代获得了一个意外精确的注脚：不经由你自己的推演和行动得来的认知，无论看起来多么完整，都只是寄存在你脑中的、别人的话。&lt;/p&gt;
&lt;p&gt;说完这三件东西，我必须诚实地面对一个矛盾，因为其中一位来信的朋友，把它直白地写了出来：“如果以后我们更少写代码、只做评审，这些能力很难练出来，怎么办？”&lt;/p&gt;
&lt;p&gt;她说得对，判断力、品味、推演，这三样东西全部来自亲手做事——而我们正在把“亲手做事”交给 AI。用进废退，这是一个真实的、结构性的矛盾，我不打算用漂亮话把它糊弄过去：&lt;strong&gt;这个矛盾，我没有完整的答案。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;但她在信里说，自己已经摸索出了一个办法。我认为那是目前最好的局部解：&lt;strong&gt;不要立刻把问题丢给 AI。&lt;/strong&gt; 先自己把逻辑链推一遍，哪怕粗糙，形成一个高层次的想法——我要什么、分几块、关键的依赖在哪里——然后再把这个想法交给 AI 去展开、细化、执行。这样既保住了思考的过程，又借到了机器的速度，而且因为你心里有图纸，验收反而更快。她说这是从我的&lt;a href=&quot;https://ursb.me/posts/weekly-31&quot;&gt;《月刊（第31期）：基于 Claude 的阅读流》&lt;/a&gt; 领悟出来的方法，虽然很慢，但不会丢掉自己。&lt;/p&gt;
&lt;p&gt;慢一点，没有关系。被时代的浪推着走的时候，慢，有时候是一种纪律。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;五、在场，或主体性&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;人是一根会思考的芦苇。——帕斯卡《思想录》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;判断力、品味、推演，说到底仍是三种能力——是帮你把活干得更漂亮的“术”。但在这些能力的下面，还垫着一个更根本、也更容易被忽略的问题。它无关你能不能把活干好，而关乎你这个人，在整件事里究竟还在不在。&lt;/p&gt;
&lt;p&gt;把视线从工程上抬起来一些。&lt;/p&gt;
&lt;p&gt;柏拉图在《斐德罗篇》里记了一个埃及传说，传说里，发明文字的神——图特，把文字献给法老塔穆斯，并汇报说这项发明将让埃及人更有智慧、记忆更好。法老拒绝了，他说：“恰恰相反，这项发明会在学会它的人灵魂里种下遗忘——他们将依赖外在的刻痕，不再亲自记忆；他们将听闻许多事物，却没有真正学到；他们将显得无所不知，实则一无所知。”&lt;/p&gt;
&lt;p&gt;两千四百年来，每一次认知技术的革命，塔穆斯的幽灵都会被重新唤起：&lt;strong&gt;文字会杀死记忆，印刷会杀死权威，搜索引擎会杀死学习。而每一次，这种担忧事后看都像是过虑&lt;/strong&gt; —— &lt;strong&gt;我们外包了记忆，却腾出脑力长出了更复杂的思想；我们外包了检索，却在更高的地方建起了知识的体系&lt;/strong&gt;。技术悲观主义者，似乎从来没有赢过。&lt;/p&gt;
&lt;p&gt;那么这一次有什么不同？&lt;/p&gt;
&lt;p&gt;不同在于外包之物的层级 —— 文字外包的是记忆，印刷外包的是复制，搜索外包的是检索 —— 它们交出去的，都是思考的&lt;strong&gt;原材料&lt;/strong&gt;。而这一次，人类历史上第一次，我们可以把&lt;strong&gt;思考本身外包出去&lt;/strong&gt; ：推理、权衡、判断，那个塔穆斯所担心的灵魂里最后没有被让渡的部分。&lt;/p&gt;
&lt;p&gt;前几次革命腾出的脑力，都流向了更高层的认知活动；这一次，更高层的上面是什么，没有人知道。&lt;/p&gt;
&lt;p&gt;我见过主体性流失的样子，它一点也不戏剧化，甚至毫无声响：一个问题抛过来，人不再先想，而是顺手转发给 AI；AI 给出答案，人截图转发给提问者。一来一回，这个人在整条链路里的功能，是一根网线。线上出了 bug，上级问怎么回事，他说：不知道，是 AI 写的。&lt;/p&gt;
&lt;p&gt;——在这一刻被取代的，不是他的岗位，而是他的在场（还有可能是他的工作）。他还坐在工位上，但他已经不在了。&lt;/p&gt;
&lt;p&gt;马克思在分析异化劳动时说过，工人“在自己的劳动中不是肯定自己，而是否定自己”。 &lt;strong&gt;异化的可怕之处，从来不在于工人最终失去了工作，而在于早在失业之前，劳动就已经变成了与他无关的东西。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;珍妮机时代的纺纱女工，先失去与劳动的关系，再失去劳动本身。&lt;/p&gt;
&lt;p&gt;今天的版本，是认知的异化： &lt;strong&gt;在被 AI 替代之前，人先把自己活成了不需要主体性的样子。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这才是真正的危险——福柯早就提醒过，规训从来不需要看守，我们会主动把自己修剪成流程需要的形状。海德格尔说得更冷：“技术真正的危险，从来不是机器伤害了人，而是人开始把自己也理解为一种待优化的资源。”&lt;/p&gt;
&lt;p&gt;但我想说的，不是悲观的那一面。恰恰相反。&lt;/p&gt;
&lt;p&gt;一件事情，在大多数时候是没有确定性答案的。&lt;strong&gt;认知不是从天上掉下来的，它是靠人不断推演、争论、交流，一点一点磨出来的——这个过程不能省略，因为这个过程就是人本身&lt;/strong&gt;。如果认知直接由 AI 给到，且不论它是否全面、是否带着批判性，单是中间那段思考的缺席，就足以让主体性一寸一寸地退场，最后沦为珍妮机前面那个等待被淘汰的身影。&lt;/p&gt;
&lt;p&gt;AI 无法替代人去感知和体会这个世界——这不是一句打气的话，它有结构上的根据。我曾在一篇谈 AI 心理疗愈的文章里写过：人类的认知不仅仅是信息的处理，而是一种通过感官与情感交织而成的体验；我们通过身体感知现实世界，通过情感去赋予事物意义。AI 在处理信息、生成文本上无与伦比，但它缺的恰恰是这个体验的维度——它能处理数据，却无法体验数据所代表的那个真实世界。一句话：&lt;strong&gt;AI 的理解是一种工具性的理解，而非存在性的理解。&lt;/strong&gt; 它可以协助我们理解人类境遇的某些侧面，却无法替代我们经由亲身体验和内心反思所获得的洞察。正如一幅画可以模仿自然，却永远无法成为自然本身。&lt;/p&gt;
&lt;p&gt;所以逻辑的推演、发散的联想、对业务的体感、对未知事物的探索欲——这些不是简历上的技能项，它们是主体性的器官。我的看法是：&lt;strong&gt;人的思维在 AI 时代不应该被消磨，反而应该被放大。&lt;/strong&gt; AI 接管的是确定性的部分，而人本来就应该住在不确定性里——那里才是判断力、品味和推演的居所，也是“何以为人”这个问题的答案所在。&lt;/p&gt;
&lt;p&gt;帕斯卡说，人是一根会思考的芦苇，宇宙无需武装就能碾碎他；但人依然比碾碎他的东西高贵，因为人知道自己会死，而宇宙对此一无所知。在 AI 时代，这句话有了一个新的读法：模型可以在几乎一切任务上超过我们，但知道自己在做什么、为什么做、做成之后世界会有什么不同的，依然只有这根芦苇。&lt;/p&gt;
&lt;p&gt;芦苇的全部尊严在于思想。请不要亲手把它交出去。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;六、价值感的锚点&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;决定我们自己的，不是「航行本身」，而是我们「赋予航行的意义」。——&lt;a href=&quot;https://ursb.me/posts/life&quot;&gt;《谈谈存在的价值与人生体验》&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;前文的推演是一条不断向内的路：从岗位，到能力，到主体性，一层比一层更深。现在，我们终于走到了最里面那间屋子——那里坐着所有焦虑真正的源头，我想这个问题我在多年前的 &lt;a href=&quot;https://ursb.me/posts/life&quot;&gt;《谈谈存在的价值与人生体验》&lt;/a&gt; 已经回答过了。&lt;/p&gt;
&lt;p&gt;岗位的危险、能力的修炼、主体性的存亡，所有这些焦虑收拢到一处，指向的都是同一件事：&lt;strong&gt;我们害怕失去价值感。&lt;/strong&gt; 害怕有一天醒来，发现自己对这个世界不再有用。被裁员只是这种恐惧的外壳，内核是更古老的东西——一个人最深的恐惧，从来不是没有工作，而是怀疑自己不再值得。&lt;/p&gt;
&lt;p&gt;但价值感这个东西，从来不是世界发给你的，是你自己锚定的。&lt;/p&gt;
&lt;p&gt;很多年前，我写过一篇 &lt;a href=&quot;https://ursb.me/posts/life&quot;&gt;《谈谈存在的价值与人生体验》&lt;/a&gt;，那时 AI 还和我的生活毫无关系。我在里面写：人生本是没有目的的，我们偶然地来，偶然地离去，没有哪条法则规定我们必须做什么。纵然如此，我们也要载着这无意义的生命勇敢地驾船航行——“这次航行没有终点，但在茫茫大海中，我们不断地为这次航行锚定航标。”决定我们是谁的，从来不是航行本身，而是我们赋予航行的意义。&lt;strong&gt;存在先于本质，我们是先有了存在，再去探寻意义、给存在赋予意义。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我没有想到，多年之后，这段写给人生的话，会精确地命中一个技术问题。&lt;/p&gt;
&lt;p&gt;因为意义是后赋予的，是你给自己锚定的航标，所以锚定就藏着一个古老的陷阱：如果你把全部的意义感，只系在一个外部的、单一的反馈上，那么一旦那个反馈断掉，整座意义大厦会在一夜之间坍塌成幻灭。我当年举的例子是工作狂——把意义感全押在绩效和老板的认可上，反馈一旦中断，热情熄灭，自我怀疑长驱直入。&lt;/p&gt;
&lt;p&gt;AI 时代所做的，不过是把这个古老的脆弱性，以前所未有的规模和速度，兑现给了所有人看。&lt;/p&gt;
&lt;p&gt;如果你的价值感，恰好锚定在“我能写代码”“我能快速执行”“我比别人交付得更多”上——那么请认清一件残酷的事：你把锚抛进了一片正在退潮的海。那个锚点本身没有错，它只是不再属于你了——它属于机器，而机器正以肉眼可见的速度把它收回去。我在那篇旧文里还写过一句话，今天读来几乎像预言：“越是事事都想做到最好，越是达不到完整，人生就变成了空洞的碎片。”——在每件事都标着 P0、疲于奔命的冲刺里，在“把省下来的时间再塞进更多需求”的惯性里，价值感不是在累积，是在被一点点稀释。&lt;/p&gt;
&lt;p&gt;那么，价值感真正稳固的锚点，在哪里？就在 AI 拿不走的那个地方。&lt;/p&gt;
&lt;p&gt;AI 能处理整个世界，却不能体验这个世界（推荐阅读我的旧文：&lt;a href=&quot;https://ursb.me/posts/weekly-28&quot;&gt;《月刊（第28期）：AI 没有体验世界的能力》&lt;/a&gt;）；它能模拟一切意义，却不能真正赋予意义——因为赋予意义，需要一个真实地活着、真实地感受、真实地在乎的主体在场。这恰恰是价值感唯一靠得住的源头：&lt;strong&gt;它不来自“你有用”，而来自“你能感知、能在乎、能为你所做的事赋予一个只属于你的意义”。&lt;/strong&gt; 前者是市场给你的报价，会随技术涨落；后者是你本身的价值，无人能够夺走——除非你自己先把这两者搞混。&lt;/p&gt;
&lt;p&gt;很多年前在人生低谷里，我曾把这件事写成一句近乎固执的话送给自己：无论有没有外在的那些东西，都要相信自己是 100% 的珍贵，我永远拥有自己的价值，没有条件。今天，我想把这句话重新送给每一个在 AI 面前感到自己正在贬值的人。AI 拉低的是你的报价，动不了你的价值。&lt;/p&gt;
&lt;p&gt;所以，当 AI 拿走一切之后，剩下的那个东西，根本不是退而求其次的避难所——它是价值感本来就该待的地方。AI 像一场退潮，把我们这些年随手抛下的、其实并不牢靠的外部锚点——职级、产出、被需要的感觉——一个个冲走，逼着我们游回那个唯一不会被冲走的圆心。&lt;/p&gt;
&lt;p&gt;我在旧文里给过这个圆心一个定义：&lt;strong&gt;我们存在的价值就是确定了这个圆心，而活着的意义，就是为了扩大这个边界。&lt;/strong&gt; 圆心是你之为你，边界是你用一生去体验、去感知、去赋予意义的那个世界。AI 可以无限逼近边界，却永远到不了那个圆心——因为圆心处坐着的，是一个会死、会爱、会在深夜里追问意义的人。&lt;/p&gt;
&lt;p&gt;把价值感从被 AI 需要里赎回来。这是这个时代交给每个人的、最隐蔽也最要紧的功课。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;七、风起于青蘋之末&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;夫风生于地，起于青蘋之末。——宋玉《风赋》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;回到那三封来信，回到开头那个问题。&lt;/p&gt;
&lt;p&gt;这一年，熟悉我的朋友都说我激进：方案交给 AI，编码交给 AI，评审的初稿交给 AI，下一步连测试也准备交出去。但很少有人理解，提效从来不是目的。如果 AI 的全部意义是让一个人顶四个人用，不停地堆工作量——那然后呢？那只是把自己改装成一台更便宜的珍妮机，在被取代之前替资产负债表多省两年钱。&lt;strong&gt;拼效率，人永远拼不过机器。&lt;/strong&gt; 这条路的尽头清清楚楚地写着 5 个字：必然被取代。&lt;/p&gt;
&lt;p&gt;激进的真正目的只有一个：&lt;strong&gt;在大趋势落地之前，不断为自己找到新的落脚点。&lt;/strong&gt; 用 AI 省下来的所有时间，必须流向成长和探索，而不是更多的需求——这是我给自己立下的纪律，也是我在每一封回信里都会重复的话：效率的红利如果全部被工作量吃掉，那这场变革对个体而言就毫无意义。&lt;/p&gt;
&lt;p&gt;在我设想的终态流程里，工程师的位置有两个，缺一不可。&lt;/p&gt;
&lt;p&gt;一面是 &lt;strong&gt;Infra&lt;/strong&gt;：去建造让 AI 工作的世界。知识如何沉淀、上下文如何流动、agent 如何协作、范式如何更新——这个世界不会自己长出来，它需要工程师去搭建。这是把工程师“理解系统、构建系统”的天赋，从业务代码迁移到更高的一层。&lt;/p&gt;
&lt;p&gt;另一面是&lt;strong&gt;守门人&lt;/strong&gt;：在意图奔向实现的洪流中，担任质量与大局的最后一道关口——以判断力选择值得做的问题，以品味设定结果的标准，以推演守住方案的逻辑。这是工程师特有的属性，我们要做的不是抛弃它，而是把它发挥到极致，然后适配进未来的流程里。&lt;/p&gt;
&lt;p&gt;写到最后，我想再回到那些在夜里砸毁机器的卢德工人。&lt;/p&gt;
&lt;p&gt;他们真正的悲剧，不是砸错了对象——机器确实碾过了他们的生计，他们的愤怒值得两百年后的我们尊重。真正的悲剧在于，站在那个时刻，他们能看见的唯一选项就是砸：他们看得见自己正在&lt;strong&gt;失去&lt;/strong&gt;什么，却看不见自己可以去&lt;strong&gt;成为&lt;/strong&gt;什么。这不怪他们，在那个年代，没有人看得见。&lt;/p&gt;
&lt;p&gt;但我们和他们不同。这是这一代人独有的、近乎苛刻的幸运：变革以年为单位发生，快到足以让一个人在自己的职业生涯里亲眼看见终态，也快到不给任何人留下再等等看的余地。我们是历史上第一批可以&lt;strong&gt;带着终局感参与变革&lt;/strong&gt;的普通人。&lt;/p&gt;
&lt;p&gt;所以，该何去何从？&lt;/p&gt;
&lt;p&gt;回到第一封信里的那个问题：“我们以后，全部都会交给 AI 做吗？”&lt;/p&gt;
&lt;p&gt;会的。而且比大多数人预期的更快。&lt;/p&gt;
&lt;p&gt;但这个问题的答案，其实不取决于 AI，而取决于那一天到来时，你站在哪里：是站在流水线的末端，用不断降低的标准为机器的产出盖章，等着连盖章也被优化掉；还是站到更上游去——出题的地方、定标准的地方、守逻辑的地方、建造世界的地方。&lt;/p&gt;
&lt;p&gt;而无论你选择站在哪里，都请记住这场变革的另一面。它是一场盛大的减法，可它减去的，从来不是我们身上最珍贵的东西——只是那些长久以来遮蔽着珍贵之物的执行与重复。&lt;/p&gt;
&lt;p&gt;潮水退去，沙滩上裸露出来的，是一直都在、只是从前被无尽的忙碌所淹没的东西： &lt;strong&gt;你的判断，你的品味，你亲手推过的逻辑，你对这个世界的感知与好奇。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所以，“我们还剩下什么”这个问题，不必再用忧虑的语气去问了。剩下的，才弥足珍贵。剩下的，才是我们。&lt;/p&gt;
&lt;p&gt;风起于青蘋之末。大势从来不是一个从天而降的庞然大物，它由无数个体此时此刻的选择汇聚而成。你今天决定先在纸上把逻辑链推一遍再打开对话框，决定不为速度降低自己的标准，决定把省下来的时间投进一次没有人做过的探索——这些微小的决定，本身就是大势的一部分。&lt;/p&gt;
&lt;p&gt;我们不是被大势所趋的个体。&lt;/p&gt;
&lt;p&gt;风起于青蘋之末，&lt;strong&gt;我们应该是大势本身&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;向前跑，别回头。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;谢谢那三位来信的朋友。这篇文章里的大部分思考，不是我一个人想出来的，是在和你们的来回通信中推演出来的——而这件事本身，恰好就是本文想说的全部。&lt;/p&gt;
&lt;p&gt;愿你在机器的轰鸣里，始终听得见自己的声音。&lt;/p&gt;
&lt;p&gt;于 2026 年 6 月 12 日深夜。&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=after-ai-takes-everything&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>essays</category></item><item><title>月刊（第35期）：我和 Claude 老师 Vibe Coding 的周末</title><link>https://ursb.me/posts/weekly-35/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-35/</guid><description>记录六个周末疯狂Vibe Coding的成果：博客新增运动与摄影模块及漫画流水线、记账App MoneyWise多端上架、写出14篇沉浸式技术长文、自制编程语言Penelope，以及正在打造的活的像素世界与3D禅意游戏。</description><pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本篇是对二〇二六年四月至五月的记录与思考。&lt;/p&gt;
&lt;h2&gt;周末的 Vibe Coding&lt;/h2&gt;
&lt;p&gt;最近一个月疯狂 VIBE，一共花了 Claude Code 257 亿 Token：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/tokens-stats.webp&quot; alt=&quot;Claude Code token 用量&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这些 Token 基本都是在 6 个周末消耗的，因为也只有周末有时间瞎搞（不然一个 20x 的号只够我用 3 天的）。&lt;/p&gt;
&lt;p&gt;我一般会启 7 个以上的长任务让 Claude Code 跑，也不是一直坐在电脑前 —— 我三星小折叠手机在这个时候就很好用，我可以在任意地方拿着手机一边刷视频、一边盯着这几个任务的进度。一旦有 Agent 停下来了，手机第一时间能发现，并操作 —— 语音输入让它们接着干，一刻也不能停（无情的资本家）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/multitask-phone.webp&quot; alt=&quot;手机上多任务管理 Claude Code&quot; /&gt;&lt;/p&gt;
&lt;p&gt;那这一个多月以来的周末（我数了下也就 6 个周末），做了哪些好玩的东西呢？&lt;/p&gt;
&lt;p&gt;在这篇文章里分享给你们。&lt;/p&gt;
&lt;h2&gt;一些小玩具&lt;/h2&gt;
&lt;p&gt;给&lt;a href=&quot;https://ursb.me/&quot;&gt;博客&lt;/a&gt;润色了下，支持了下多语言，另外做了下这些模块：&lt;/p&gt;
&lt;p&gt;运动记录：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/mod-workouts.webp&quot; alt=&quot;运动记录模块&quot; /&gt;&lt;/p&gt;
&lt;p&gt;摄影墙：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/mod-photos.webp&quot; alt=&quot;摄影墙模块&quot; /&gt;&lt;/p&gt;
&lt;p&gt;以及漫画流水线：搭建了一个 workspace，固定了我的形象和漫画风格，于是只要每天对 Agent 说一句话（也可以配上一些图片，会风格化脱敏处理），他就能自动生成四格漫画并发布 ——&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/mod-comics.webp&quot; alt=&quot;漫画流水线&quot; /&gt;&lt;/p&gt;
&lt;p&gt;分享做的也不错：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/comics-share-1.webp&quot; alt=&quot;漫画分享 1&quot; /&gt;
&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/comics-share-2.webp&quot; alt=&quot;漫画分享 2&quot; /&gt;
&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/comics-share-3.webp&quot; alt=&quot;漫画分享 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;还补充了下埋点， 目前一个月大概只有 1 万 PV：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/umami-pv.webp&quot; alt=&quot;Umami PV 统计&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;App&lt;/h2&gt;
&lt;p&gt;上期周刊说的理财 App，后来做了一些完善 —— 集成了 AI 语音录账单、OCR 拍小票、持仓录入与分析，以及调试了很久的家庭共享账单能力。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/moneywise-app.webp&quot; alt=&quot;MoneyWise 主界面&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最终 MoneyWise 上架了 iOS、Android、macOS，以及完全替代了我之前付费多年的 MoneyWiz 了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/moneywise-stores.webp&quot; alt=&quot;MoneyWise 上架&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这个 App 从开发到上架没用多少时间，从设计、到开发、到运维、到上架的物料准备，全都是 Claude 老师帮我完成的。&lt;/p&gt;
&lt;h2&gt;深度文章 x14 篇&lt;/h2&gt;
&lt;p&gt;这段时间一共新增了 14 篇沉浸式技术长文，每篇都是深度的百科全书系列，配了很多可视化的表达与学习互动，发现通过这种方式深入学习非常高效：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/chromium-renderer/&quot;&gt;字节码到像素的一生 — Chromium 渲染流水线全景&lt;/a&gt;：这个是 2022 年当年耗时一个月写的文章，当时写这篇文章我要把工程运行起来一行行断点，手绘逻辑链路 —— 但现在不需要了，Claude 一天就帮我把原来的文章做了更优秀的可视化表达，讲解也更深入了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/immersive-chromium.webp&quot; alt=&quot;Chromium 渲染流水线沉浸式文章&quot; /&gt;&lt;/p&gt;
&lt;p&gt;还有另外 13 篇，也是边写边学，学习效率 max，产出也 max：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/jank-stutter/&quot;&gt;测量「流畅」 — 从 FrameTime 到 Stutter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/v8-fast-js/&quot;&gt;JS 极致性能优化 — V8 优化原理与一段热点函数的重生&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/image-formats/&quot;&gt;沉积的像素 — 50+ 图片格式全谱百科&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/http3/&quot;&gt;一次请求的一生 — HTTP/3 协议全景&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/webassembly/&quot;&gt;从 Rust 到 SIMD — WebAssembly 的一生&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/quickjs/&quot;&gt;一行 JS 的一生 — QuickJS 源码详解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/react-internals/&quot;&gt;一次 setState 的一生 — React 渲染流水线全景&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/helio/&quot;&gt;Helio：高性能小游戏容器的进化之路&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/gc/&quot;&gt;一段内存的多重死亡 — 11 个 GC 家族的家谱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/webgpu/&quot;&gt;一次 dispatch 的八重翻译 — WebGPU 全栈源码深读&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/css-engine/&quot;&gt;一段 CSS 的一生 — Chromium 样式引擎全景&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/llm-inference-life/&quot;&gt;一次 LLM 推理的一生&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/tls-handshake/&quot;&gt;一次 TLS 握手的一生 — TLS 1.3 协议全景&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;甚至 GC 那篇文章 Claude 还帮我做了个 3D 的游戏，通过游戏来讲解各种 GC 策略的区别：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/gc-game-1.jpg&quot; alt=&quot;GC 3D 游戏 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/gc-game-2.jpg&quot; alt=&quot;GC 3D 游戏 2&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;自制编程语言 —— &lt;a href=&quot;https://penelope.ursb.me/&quot;&gt;Penelope&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在荷马的史诗里，珀涅罗珀等了奥德修斯整整二十年。她每天纺织一件寿衣，每夜把白天的进度悄悄拆掉——她不是不能选，是不愿意选。她在等一个还没回来的人。&lt;/p&gt;
&lt;p&gt;这个故事在 Claude 脑子里转了很久之后，推荐我把它做成了一门编程语言。&lt;/p&gt;
&lt;p&gt;写代码的人大概都熟悉这种处境：你写下的程序，是一个没有耐心等待的东西。一个进程一旦中断，它脑子里所有的东西——栈、变量、走到了哪一行——就全部消失了。要让程序挺过等待，我们就在外面套一圈支架：checkpoint 文件、消息队列、幂等键、重试逻辑、Temporal/Inngest 这些 durable execution 框架。它们是有效的，但它们也都在向程序员索取同一件代价——你必须把我想做的事翻译成框架允许我说的话，把代码切成 activity、step、await 一段一段。&lt;/p&gt;
&lt;p&gt;Penelope 想做的事很朴素——把这些东西收回到语言里面。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;let x = 10;
let y = pause;          // 进程在这里退出，状态写到磁盘
print(to_str(x + y));   // 一小时后、一周后、一年后，另一个进程接着跑，打印 15
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;没有 await，没有 checkpoint，没有装饰器。就一个 pause 关键字，和 let 平起平坐。它背后只有一句公理——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;执行即数据。一个运行中的程序，本身是一个值。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;支持自实现的字节码 + VM 执行，也支持了调试器和 LSP、VSCode 插件，为了性能机制还支持了 JIT 和 WASM 后端；基于这些甚至还实现了自举 —— 新版本的 lexer、parser、compiler 目前都用 Penelope 自己写了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/penelope-site.webp&quot; alt=&quot;Penelope 语言官网&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Penelope 将 pause 作为一等表达式，把一个工程问题，重新还原成一个语义问题。&lt;/p&gt;
&lt;p&gt;在这个过程中不仅巩固了自己的编程基础，其实还发现 Claude 老师的推理能力很强：推演能力够强的时候，或许更高阶的用法可能是去做减法——往回逼到那个最 solid 的基点，再反过来和它一起往上推、做加法。这样摄取的知识价值密度更高，也更牢固。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/penelope-axiom.webp&quot; alt=&quot;Penelope 公理推导&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;活的星露谷&lt;/h2&gt;
&lt;p&gt;这个项目的起因是我给博客做了多语言适配，以及同时在线人数统计的功能，发现博客来访的外国友人挺多的，有些友人也很乐于评论，因此博客也一直有访问量 —— 甚至有几天免费版的 supabase 都扛不住了：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/supabase-limit.webp&quot; alt=&quot;Supabase 限额告警&quot; /&gt;&lt;/p&gt;
&lt;p&gt;于是想到我要不要直接做个游戏，用小动物的形象展示下访客，让大家都在一个房间里互动，有点世界大同的感觉：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/world-idea.webp&quot; alt=&quot;小世界初稿&quot; /&gt;&lt;/p&gt;
&lt;p&gt;因为 image2 效果很好，又斥巨资买了 codex，让 Claude Code 和 Codex 强强联手给我做游戏：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/codex-claude.webp&quot; alt=&quot;Claude Code 和 Codex 强强联合&quot; /&gt;&lt;/p&gt;
&lt;p&gt;小游戏越做越大，每个 NPC 不仅接入了 AI，还参考 OpenClaw 的架构设计了 SOUL 和独立的记忆系统，如果注册了还会为你存储专属的记忆，并偶尔主动发邮件问候你，就类似一个活的星露谷：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/npc-soul.webp&quot; alt=&quot;NPC SOUL 记忆系统&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这一切还挺有意思的，迸发而出的创意源源不断。例如现在在搭建我乱七八糟的作品展，改了好几版一直不满意：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/gallery-exhibit.webp&quot; alt=&quot;作品展画廊&quot; /&gt;&lt;/p&gt;
&lt;p&gt;2D 小世界的链接先不放出来啦，因为还有很多需要我这个创世神来完善的地方。&lt;/p&gt;
&lt;h2&gt;3D 游戏的探索&lt;/h2&gt;
&lt;p&gt;如果上面是 2D 游戏的探索，那接下来是的 3D 游戏的探索。除了前面说的 GC 游戏，其实还做了个 3D 的禅意小世界：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/zen-world.jpg&quot; alt=&quot;3D 禅意小世界&quot; /&gt;&lt;/p&gt;
&lt;p&gt;目前还在打磨，但是以及可以初步看看效果了：&lt;a href=&quot;https://ursb.me/world/&quot;&gt;https://ursb.me/world/&lt;/a&gt;。可以播一些白噪音，设置专注的番茄钟等等，里面做了一些微风的动效，还是挺有意境的。&lt;/p&gt;
&lt;p&gt;做 3D 游戏的时候其实走了很多弯路，比如想做这个&quot;树下静谈&quot;的场景，搞了很久才只有这个效果：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/tree-chat-fail.webp&quot; alt=&quot;树下静谈早期效果&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Avatar 这块废了我不少时间和金钱，扩散模型生成的效果和抽盲盒似的，一直不满意。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/avatar-diffusion.webp&quot; alt=&quot;Avatar 扩散模型尝试&quot; /&gt;&lt;/p&gt;
&lt;p&gt;但如果直接让编码模型做去美术资产，那就这样了：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/code-art.webp&quot; alt=&quot;编码模型生成美术资产&quot; /&gt;&lt;/p&gt;
&lt;p&gt;后面想做的其实还有很多很多，留着之后有机会再分享吧！&lt;/p&gt;
&lt;h2&gt;🌺 生活点滴&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;⛰️ 麦里芝徒步&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ursb.me/workouts/521415AA-9098-4F05-96D8-AF11B5893821/&quot;&gt;https://ursb.me/workouts/521415AA-9098-4F05-96D8-AF11B5893821/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/macritchie.webp&quot; alt=&quot;麦里芝徒步&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🗡️ 圣剑 + 麦克风&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;组了个圣剑麦克风：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/mic-sword.webp&quot; alt=&quot;圣剑麦克风&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;⌨️ ZSA Voyager + Navigator + ZSA Moonlander&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;最近舍弃了我用了十几年的 HHKB 系列，买了个 ZSA Voyager + Navigator，分体键盘上手了两周我才勉强能够打字……但习惯之后用起来真的很爽，于是又买了个 ZSA Moonlander。&lt;/p&gt;
&lt;p&gt;我桌面有点乱，这期先配个网图吧，大概长这样子：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/zsa-voyager.webp&quot; alt=&quot;ZSA 分体键盘&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🎮 洛克王国&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;最近沉迷洛克王国，抓了个炫彩粉色的异色雪影娃娃：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/rock-kingdom.webp&quot; alt=&quot;洛克王国异色雪影娃娃&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;🎬 书影音&lt;/h2&gt;
&lt;p&gt;以下是本周期的书影音记录。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;看过：剧集 |《夺命许愿》| ★★★★★&lt;/li&gt;
&lt;li&gt;看过：剧集 |《非常律师禹英禑》| ★★★★★ | 二刷&lt;/li&gt;
&lt;li&gt;看过：电影 |《杀木地》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看过：剧集 |《黑袍纠察队 5》| ★★★☆☆，烂尾了。&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-35&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>月刊（第34期）：创造的快乐</title><link>https://ursb.me/posts/weekly-34/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-34/</guid><description>记录用Claude Code在一个月内快速创造多个项目的过程：两天重建博客、两小时做出记账App、翻新个人主页，并反思AI时代创造的乐趣如何被放大而非削弱。</description><pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本篇是对二〇二六年三月的记录与思考。&lt;/p&gt;
&lt;p&gt;十几年前刚接触编程的时候，我经常写到凌晨两三点忘记时间，看着指尖将脑海里的想法一点点具象化。在&lt;a href=&quot;https://ursb.me/posts/weekly-24/&quot;&gt;《月刊（第24期）：十年编程之路》&lt;/a&gt;中我写过：“那段时间的每个深夜里，满怀激动地开发着游戏，这种心情哪怕是现在回忆起来也仍未有任何衰减。现在想来，那恐怕就是最纯粹的热爱吧。”&lt;/p&gt;
&lt;p&gt;工作多年之后，这种纯粹的创造快感其实是在慢慢衰减的——更多的时间花在了协作、流程和工程复杂度上，真正从零构建一个东西的机会越来越少。直到最近，Opus 4.6 让我重新找回了这种久违的感觉。Claude Code 成了我每天下班后的快乐源泉，可惜 Claude Max 完全不够用，一个窗口期基本 40 分钟就会耗尽，然后我会掐着 5 小时倒计时等窗口期重置，继续创造。&lt;/p&gt;
&lt;p&gt;这个月用它做了一些项目，在这里分享一下过程和感受。&lt;/p&gt;
&lt;h2&gt;新博客&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;创造一个博客平台，用时：周末 2 天。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;博客又迭代了，这是自 2014 年以来的第五个大版本了：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;博客演变史在&lt;a href=&quot;https://ursb.me/posts/weekly-4/&quot;&gt;《周刊（第4期）：个人博客演变史》&lt;/a&gt;里有详细记录，这里仅列一下各个阶段的技术演进和 UI 变化。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;2014 年：Wordpress&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2015 年：Hexo&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;找不到图了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2017 年：Typecho&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/image%201.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;中途还单独开过一个周刊的站点，后来在 2023 年一起合并到新博客里了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/image%202.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2023 年：Typlog&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/CleanShot%202026-04-05%20at%2016.26.14@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2026 年：Astro&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;新博客做成了杂志风：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/CleanShot%202026-04-05%20at%2016.10.54@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;支持展示我的动态日历：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/CleanShot%202026-04-05%20at%2016.11.03@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;还可以结合 AI Chat + Skills 直接输出交互式学习笔记，适合 AI 共创一些学习类的文章：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/CleanShot%202026-04-05%20at%2016.11.13@2x.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/CleanShot%202026-04-05%20at%2016.13.01@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;埋了很多小彩蛋，比如侧边栏评论：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/CleanShot%202026-04-05%20at%2016.13.33@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;全站用了周末两天的时间 Vibe Coding 出来的静态博客，用 GitHub Actions 预构建注入数据，但在很多细节之处还是用了 Serverless Functions 来做动态更新，比如点赞、评论、浏览量数据等等。&lt;/p&gt;
&lt;p&gt;要是以前，这样一个博客系统得做几个月，索性就直接订阅博客平台的服务，但想用好看的主题、加想要的功能还得处处受限。现在只要自己有想法，AI 就能帮你实现 —— &lt;strong&gt;软件的壁垒正在从工程复杂度转向创造力本身&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;记账软件&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;0-1 完成一个 iOS App，用时：2 小时。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我用两个小时，从零完成了个记账软件 App 的 MVP。因为一直想要一个有着 Copilot Money 设计风格的，但是又有着 MoneyWiz 支持多币种、持仓追踪、预算管理的记账软件，此外还要支持语音录入 + 实时分析的 AI 持仓讨论，且支持多平。但很可惜，一直没有找到 —— 要颜值没功能，要功能则不便捷，尤其是海外市场，多币种一直是刚需。&lt;/p&gt;
&lt;p&gt;那就自己做一个呗：产品构思、UI 设计、开发、测试全链路由 Agent 闭环实现。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步：Claude Code + Pencil 进行设计&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个环节需要先定义设计系统和设计规范，然后描述产品功能，让多个 Agent 同时帮你设计软件界面，最后对话微调。这个过程中，你可以看到你自己脑海中的产品快速具象化。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/Pasted%202026-04-05-16-03-39.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二步：Claude Code + Superpowers ，通过对话完善产品设计&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这一步主要是看看功能是否自闭环，User Flow 是否有遗漏，产品设计是否仍有改善的地方。前两步是整个流程的最重要的部分，因此总计花费 1.5h。只有设计得好，后面的落地才不会有偏差。&lt;/p&gt;
&lt;p&gt;同时，这个沟通的过程其实是非常快乐的，如同自己只有一个产品雏形，但你却有一个行业经验丰富的朋友帮你把幼稚的想法不断完善，打磨成工业级的成品，这个过程中你会体验到无数次“哦，对对，我想要的就是这个”的 “aha moment”。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三步：多 Agent 并行开发&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;之后就直接进入开发阶段，这个环节 Agent 会帮你写好 spec，你自己确认技术栈没问题之后直接要求进入多 Agent 并行开发即可。整个过程依照项目复杂度进行，不需要强调自测（配好 mcp 之后它会自己测的），中途无人为进入干扰，一把梭输出。你只需要喝茶等待即可。因为前置对话用了很多精力，这个时候 Agent 有了足够的信息。&lt;/p&gt;
&lt;p&gt;最后效果很棒，UI 还原度非常高。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/Pasted%202026-04-05-16-03-39%201.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/Pasted%202026-04-05-16-03-39%202.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;AI 会进行自测：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/Pasted%202026-04-05-16-03-39%203.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后合入发布即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/Pasted%202026-04-05-16-03-39.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果是以前，从零做到这个程度需要一个设计一个研发，两个人估计得做一个月。&lt;/p&gt;
&lt;p&gt;但现在，只需要一个人，2 小时就可以了。&lt;/p&gt;
&lt;h2&gt;新个人主页&lt;/h2&gt;
&lt;p&gt;老版本是这样的，很朴素：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/image%203.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;新版本改成了这样：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/CleanShot%202026-04-05%20at%2016.14.39@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;有一些新的特性可以去探索： → &lt;a href=&quot;https://ursb.me&quot;&gt;ursb.me&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI Chat（目前还没调教得很好）&lt;/li&gt;
&lt;li&gt;实时听歌状态同步&lt;/li&gt;
&lt;li&gt;情绪数据、健身数据同步&lt;/li&gt;
&lt;li&gt;书签、Channel、博客、笔记更新同步&lt;/li&gt;
&lt;li&gt;Vibe Coding 数据同步&lt;/li&gt;
&lt;li&gt;还有很多小彩蛋&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;其他项目&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://htyl.ursb.me/&quot;&gt;How to Train Your LLM&lt;/a&gt;&lt;/strong&gt;：一个交互式小游戏，通过玩的方式了解 LLM 的基础知识。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://claude-101.ursb.me/&quot;&gt;Claude-101&lt;/a&gt;&lt;/strong&gt;：交互式学习项目，结合了之前 2.1.88 泄露的源码进行分析。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linear 工作流&lt;/strong&gt;：尝试用 Linear 给 Agent 分配任务、记录任务进度和总结。给 Agent 派活这件事 Slock、Multica 等新兴软件都可以做到，不算新奇，但结合 Linear 的项目管理能力体验更完整。部署侧除了 Codex，还自己搭了 Cynus 跑 Claude Code 和 Gemini。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;回头看这个月做的这些东西，其实没有一个是必须做的——博客用 Typlog 也能继续写，记账有现成的 App 可以下载，个人主页不改也不影响什么。但我还是忍不住去做了，而且做的时候异常快乐。&lt;/p&gt;
&lt;p&gt;我一直觉得，创造的乐趣本质上是一种 &lt;em&gt;“我可以对这个世界产生影响”&lt;/em&gt; 的确认。婴儿发现自己推一下玩具它就会动，会开心得手舞足蹈——我们写代码、搭系统、做产品的时候，内心深处的驱动力其实和那个婴儿没有什么不同。&lt;/p&gt;
&lt;p&gt;AI 没有削弱这种乐趣，反而放大了它。以前受限于工程能力和时间成本，很多想法只能停留在脑海里；现在从构思到落地的路径被极大缩短，想法可以在几个小时内变成可以触摸的东西。这意味着我们能更频繁地经历那个打开软件界面的那一刻，更频繁地体验到创造带来的欣喜。&lt;/p&gt;
&lt;p&gt;当然，工具终究是工具。真正让人快乐的从来不是工具本身，而是你脑海中有一个想要实现的东西，然后你把它做出来了。AI 让&lt;em&gt;做出来&lt;/em&gt;这件事变得更容易了，但&lt;em&gt;想要做&lt;/em&gt;这件事，永远只能来自你自己。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;保持想要创造的冲动，这大概是对抗倦怠最好的方式。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;🌺 生活点滴&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;✈️ 上海&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个月因为工作原因，短暂去了上海，但时间很紧所以没有约朋友见面。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/2026-04-05%2016.58.17.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/2026-04-05%2016.58.22.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🤖 新眼镜&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/telegram-cloud-photo-size-5-6174856430171655762-y.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这眼镜连上 OpenClaw 效果挺不错的，实现了 24/7 的随叫随到助理。给 Mac Mini 上的 OpenClaw 开个服务，用 Tailscale 可以连上。&lt;/p&gt;
&lt;p&gt;同时对话字幕功能对我也非常实用，和同事的英文交流几乎无障碍了，之前主要是语速快的时候听不懂；此外，发现翻译功能中译英也很实用，方便日常英语口语学习。&lt;/p&gt;
&lt;h2&gt;🎬 书影音&lt;/h2&gt;
&lt;p&gt;以下是本周期的书影音记录。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;看过：电影 |《挽救计划》| ★★★★★&lt;/li&gt;
&lt;li&gt;看过：电影 |《回家的路》| ★★★☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-34&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>2015-2016 随笔选集</title><link>https://ursb.me/posts/2015-2016-essays/</link><guid isPermaLink="true">https://ursb.me/posts/2015-2016-essays/</guid><description>收录作者大二、大三期间（2015 至 2016 年）所写的随笔，围绕教育本质、大学生活现状与自我管理展开思考，记录二十岁时青涩却真诚的观点与成长轨迹。</description><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这些文字写于 2015 到 2016 年间，那时我还在念大二、大三期间，白天在教育学院上课，晚上泡在实验室自学编程，间隙里读闲书、写博客、和朋友争论教育到底应该是什么样子。十年后翻出来重读，文笔青涩，观点偏激，有些段落甚至让我脸红——但我不想修改它们。二十岁的人本就该这样：笨拙地思考，认真地愤怒，不管不顾地把想说的话一口气写完。&lt;/p&gt;
&lt;p&gt;这些随笔不是什么深刻的文章，只是一个大学生在成长路上留下的脚印，记录了那几年我关心的一切——教育、理想、孤独、代码，以及尚未被生活磨平的锐气。&lt;/p&gt;
&lt;h2&gt;教育与大学&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;从初中到大学，对教育本质的追问与反思。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;谈谈我所理解的教育 (2015-07-13)&lt;/h3&gt;
&lt;h4&gt;一、我所经历的教育&lt;/h4&gt;
&lt;p&gt;我很庆幸我能出生在这样一个重视教育的家庭，也很庆幸我接受的一直是“最好的教育”。&lt;/p&gt;
&lt;p&gt;小学是全市排名前二的学校，班级是年级最好的班。可是我却一点也记不得那是怎样的教育了，没有极喜之事，也没有极泣之事。我没有犯过错，属于那些“聪明听话”的乖孩子，平平淡淡匆匆六年就过去了。&lt;/p&gt;
&lt;p&gt;初中我就读的是皋城中学，那是全市最好的学校，也是全市鲜有的不用上晚自习的学校。在我接受教育的这些年来，初中三年是我最愉悦的时光，我甚至回忆出一点让我苦读书的事情。那是一所真正“育人”的学校，市里的其他两所学校虽然中考入榜率（一中是全市最好的高中，在全省也能排上前三，所以市里的中考都是以能不能考上一中为标准的）和她不分上下，但是大家都知道，那样的成绩仅仅是用痛苦换来的，每日的学习压力极大，仿佛每天都是初三。初中三年，我没有感觉到学习压力，甚至中考的时候还在追剧。每天早早的放学，作业很少，有很多自由娱乐的时间。9点上床睡觉的时候，其他学校甚至都还没有放学，现在想想，当初是如何做到每晚9点就开始睡觉的，上高中后到现在为止基本都是12点才能睡。秦文君说过：“教育应是一扇门，推开它，满是阳光和鲜花，它能给小孩子带来自信、快乐。”确实是的，现在回想起那段时光，开心得想笑。&lt;/p&gt;
&lt;p&gt;这三年遇到的老师，是我最爱的老师，甚至让我都有种以后想当教师的想法。如果说初中没有任何学习压力是假的，考试还是偶尔有的。记得有次考试考砸了，不敢回去跟家长说，然后班主任和我做了个交易，先给我试卷加上4分，下次考试如果考不到满分就倒扣4分，我欣然同意了。很遗憾，之后的那次只考了118，被倒扣4分还剩114，不过无伤大雅，反而在减轻我压力的同时给予了我动力。至少我觉得、并且深刻感受到了，那所学校的老师都是真正为了孩子的未来着想的。&lt;/p&gt;
&lt;p&gt;高中，我顺利考上了一中，然后被分到了“教师子女班”，是师资配置最强的班级了。但是相应的，我感到了前所未有学习压力，并且一直无限膨胀。前面说了我每晚学到12点，但是这个是班主任要求的最低标准，他说过：“如果你没有超过12点睡觉，你都不好意思说你是一中的。”确实，咱们班还有很多“疯狂的学生”，1点甚至2点入睡的都有。大家只有一个信念，那就是考上理想的大学，其他的心思一切不允许想。这就是最好的学校，最好的教育吗？我很迷茫，但是我只能随着众流去学习那些所谓的“知识”，幻想着大学应该会很自由。&lt;/p&gt;
&lt;p&gt;其实这不是最严格的，我们市还有一所全国知名的学校——毛坦厂中学，简称“毛大”。因为它是一所以复读生为主的高中，根据你的高考分数入学缴费，最多的一年要交两万，挤在一个200人的课室里上课。它建在偏远的山区，“舌尖上的中国”去年曾采访过这所学校。它已经不是“军事化管理”了，而是“监狱式管理”。这能是教育么？这就是洗脑，彻彻底底的把你变成一个读书机器、应试机器，不能用“可怕”来形容了，只能用“恐怖的教育”来评价它。&lt;/p&gt;
&lt;p&gt;虽然我是别人口中聪明的孩子，平时也很刻苦，但是还是倒在了高考的战场之上。我不明白，也想不通，那种水平的高考试卷真的能区分出一个等级差别么，仅仅只是为了考倒人才去考，这样的难度有什么意义？我平生唯一一次不及格，居然给了高考的数学，简直是很可笑。我不想重修一年，即便这能让我考上我梦寐以求的理想大学，我也不愿去。因为，&lt;strong&gt;这样的教育，我不想再经历第二次！&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;二、当今社会的大学教育&lt;/h4&gt;
&lt;p&gt;说到我为什么要来广大，其实是因为分数恰好够了而已，我想大多学生考虑大学的因素也不外乎是这个。但是我来了之后，才有一种被骗的感觉，因为《报考指南》上将其列之为一本大学，而其实并不是。身边很多外省的同学因此退学，认为学校太烂配不上自己的才华，宁愿选择复读一年。但是我已然下定决心，要在这里度过四年，要混他个风生水起，不会再回头接受那种重复劳动式无意义的教育。&lt;/p&gt;
&lt;p&gt;曾在《大学重建》中看到过这样一段话： &lt;strong&gt;大学应该是一个社会的良知和思想发动器，大学应该为这个社会培养具有正义、勇气和智慧的学子，在他们走上社会之后能够有能力去逐步改善这个社会中不好的东西，促使社会的发展，并不断致力于人类物质社会的改造，以及科学、艺术文学等精神文明的探索和提升。&lt;/strong&gt; 正是这样一段话，才让我对大学充满了憧憬，让我在高中无限地忍受欺压式教育，并且逆流而上，一直坚持坚持再坚持，我发誓一定要看到大学的曙光。&lt;/p&gt;
&lt;p&gt;但是，我又被骗了。&lt;strong&gt;那不是曙光，而是黑暗与堕落。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;除去教学区之外，当我深入走进校园之后，发现这个地方与我之前在书中读到的宁静的大学校园不同。这里各色人等纷纷扰扰，随处可见各式各样的商业海报和广告，甚至商业中心直接建在了校园内部。偶尔举办一次演唱会，甚至是游戏比赛什么的，别说清净了，生活区“热闹”的程度可见一斑，这要是放在小区里，居民不投诉扰民就怪了。没有中小学的朗朗书声，有的只是吵杂与浮躁。&lt;/p&gt;
&lt;p&gt;在正式开始上课之后，我更加见识了大学里很多人是怎么上课的：睡觉的睡觉，迟到的迟到，不点名就随意旷课，人人桌子上一台手机，玩着手机上课是多么惬意。而认认真真听课的学生只是极少部分。大学里有句话是这样流传的：“只要胆子大，一周七天都是假。”可以想象，这样毕业了之后仅仅只是靠一张文凭吃饭而已。&lt;/p&gt;
&lt;p&gt;课下的话，鲜见一起读书、讨论学术问题的场景。大都都是打游戏，玩电脑，看电影，追电视剧，这真的过的是“游戏人生”。凌乱的宿舍，无限的空虚，蓬松的脑袋和迷离的眼神，这就是所谓的大学生。&lt;/p&gt;
&lt;p&gt;稍微“好”一点的，想要过的“充实”一点的，无非就是在忙社团，忙兼职，忙活动。或许有些学生开始会觉得很充实，活动很精彩。但是我在想，这样的“充实生活”真的有意义么？这些活动组织了、举办了、精彩了、笑过了，然后呢？请问这些活动改变了什么？没有更多的智慧启迪，该打游戏的还是在打游戏，该追剧的还是继续追剧，这样的活动无非是只是一个“政绩”的记录。走的是“上面老师”固定的流程，模式化的既定程序和内容，想要改变形式是不可能的。一切都要达到一个目的：活动要精彩，形式要多样!可是没有一个人去思考这样的活动带来的实际意义在哪里。&lt;strong&gt;每天面对团学和社团无聊的会议，我真的不知道这一切的意义在哪？为什么不能针对各个学生采取针对性的规劝和引导，甚至采取强硬措施？为什么辅导员不找这些学生谈话，甚至挂了很多科了也不直接开除学籍，而是等大四的清场考试？有意义么？大四，大学生涯已经结束了，即便拿到了毕业证书和学位证书，又有什么意义？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我有一个舍友，虽说是舍友，但是基本上每天都是见不到面的。我早上出门上课，他在睡觉；我中午回来了，他在被窝里玩手机；我下午放学了，他才刚刚起床准备吃午饭。等我晚上的课程结束，他已经不在宿舍了。他晚上活动很多，甚至我都不清楚他究竟是凌晨几点才回来的。我曾和他谈过话，问他究竟毕业后打算做些什么？他没有回答我，只是说现在活的快乐就好了。在我们人生最应该奋斗的时候，选择了安逸甚至颓废，这才是最可悲的人生。当然，或许他有自己的人生观和价值观，我无从去评价，但是事实却是，现在的大学里有很多和他一样的大学生。早上睡到9点还起不来，就顺理成章把早上的课翘到了然后早饭连同午饭一起吃。更可悲的是周围没有人去批评他，反而帮他“把风”，点名了还帮忙答到，俗称“中国好舍友”，这究竟好在了哪里？害了你的一生你都没有察觉，反而还要对害你的人感恩戴德，可悲！&lt;/p&gt;
&lt;p&gt;其实更可悲的不是这些枉费时光在游戏的大学生们，而是他们的家长。有不少同学的家境其实并不乐观，但是无论家境富不富裕，家长们都是辛辛苦苦供养着孩子在上大学。不说一年的学费和住宿费，仅仅是生活费就上千了，很多大学生没有将其用在学习和日常生活上，反而是用来淘宝新奇玩意、游戏点卡、饭局甚至是用来博彩。要知道，这些血汗钱每一分每一毫都不属于这些大学生的，而需要将其投入在自己的生活和学习上，父母亲只是为了让子女的学习环境更加安逸才给生活费的。但是事实上，父母亲却是自己省吃俭用供孩子在城市里打游戏、混日子！都说可怜父母心，我想起我辛勤劳作的父母，我想起那千百万把孩子送进大学的天下父母，他们都以为自己的子女在大学里“努力学习”，辛苦地赚钱，无私地供养儿女“上学”，让他们解除“后顾之忧”，不用担心生活的问题。殊不知如今大学校园里，有多少人是在游戏人生。如果这些大学生的妈妈来在大学住一个星期，就一定会让他退学回去。这就是大学？那上什么大学啊？因为在中国“上大学”，可能是人生中一段最轻松愉快的时光了。大家可以游戏、看电视、逃课，还有源源不断的生活费，简直比带薪休假还舒服！&lt;/p&gt;
&lt;p&gt;同时我们回过头来看看中国传统的知识分子是怎样做的，宋朝一代大儒张载曾如此说过： &lt;strong&gt;为天地立心，为生民立命，为往圣继绝学，为万世开太平！&lt;/strong&gt; 从此以后，这句话成为了中国知识分子的共识，而现在，我们的社会中有多少这样的学者？我们的大学里有多少这样的教授和讲师？老师基本上都是上完课就完成任务了，很少有老师会在课下针对各个学生的发展和找他们聊天，给学生今后的人生规划、发展方向的建议或者和学生探讨学术上的问题。可以说，因材施教在大学里是不存在的。&lt;/p&gt;
&lt;p&gt;其实造就这一切的，我不否认大学生本身是有一定原因的，但更多的是大学的制度与中国教育的现状。什么综合测评，什么学生干部，一切都是浮云。但是有一部分学生干部自己就是游戏大学里的优等生（实际情况下大部分学生干部都是很好的，能以身作则为同学服务，但是这里我想抨击一下这个制度而已），却因能依仗学院和学校所赋予的权力，来帮助老师来管理学生。丝毫没有发现自己的不足，反而坚信自己是“精英团体”，个个感觉自我良好高人一等。入职久了，日常说话也都带着一股官腔，仿佛在他们的为人处世的观念间，都有三五九等之分。学校的官僚制度甚是浓厚，各个在自我评价上能写出很多很多业绩，但是真正出自自己能力有多少？不是因为他们很厉害才当上了学生干部，而是他们当上了学生干部才很厉害，很多很多成长的机会普通学生是完全享受不到的。我不知道在如此体制下培养出来的学生干部究竟能把学生引导向何方，这就是学校的精英团体？这就是社会的有志青年？这就是国家未来的栋梁？我们的国家缺少这样的人才么？可是高校里的大学生们，还一个个挤破脑壳的想去趟这个浑水。为什么学院和学校能把一个学生的权力放大到如此地步？为什么大学里会有学生干部这个称谓？为什么不能让每个学生都拥有平等的待遇？我认为应该让每一个学生都能体验到管理的权力，并且一个学生任职不超过某一个很短的期限那才是最公平的。&lt;/p&gt;
&lt;p&gt;综合测评方案是一个院校人才陪养计划的最浓缩体现，一个不恰当的评分就印证的人才培养计划的扭曲。去听一个讲座，综测加一分？我先不说有多少人能把讲座的内容记住，本身去参加讲座各个都是玩手机、睡觉的。甚至平常的讲座，都是点学号去的。今天学号1到25号去，下次是26到50号去。还有平时的活动，也需要去“备观众”。为什么会是这样的呢？很简单，因为讲座没人去，活动没意思，而学院又要顾得上场子，就强制要求每个班必须要派出多少人去，然后学院当场有考勤。这是大学的讲座么？直接说是轮流去听课，不是很好么？然后是上面的那些学生干部也加分，那么那些想体验管理权力却没有机会当上学生干部的普通学生，又有何公平可言？为了加分每个学生都是绞尽脑汁去想自己参加过什么比赛、获得过什么证书、参加过什么志愿活动，这让我觉得曾经的比赛和志愿活动失去了其原有的意义。尤其是大学生志愿活动，我相信真正的去志愿的学生们都是发自内心的想去服务社会，这个一个无比高尚的行为。但是部门组织和宣传活动时，会多说一句有综测分加，想要更多的人去报名，那这样举办的活动原本的意义，以及参赛者的初衷究竟在哪里？&lt;/p&gt;
&lt;p&gt;你能想象这就是所谓的“大学”么？&lt;strong&gt;很不幸的，这一切都是真实的，这就是中国的大学教育。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当我认识到这一切之后，我已经看不清“大学之道”究竟在何方。如果只是去上课认真听课，然后想要考个高分，然后拿个奖学金，我觉得也是没有意义的。我们不谈教师因素，学校的课程安排本身就存在着很多漏洞。我不清楚课程是谁编排设置的，但是我清楚，这样的教育之下走出来的学生是没有竞争力的，仅仅是为了学习技术而去学。就我这个专业本学期的课程来看，没有学过教育学基础就开始学习教学设计，然后还有ASP.NET，Flash这两门课程也是存在问题的。ASP.NET，教材是2002年出版，2004年修订的，现在是2015年，13年前的东西，框架用的是2.0，马上都5.0了，编程没有使用IDE，直接用Dreamweaver写代码。代码用的是VB语言，而不是当下使用的C#，可以说现在没有任何一家企业还在用VB写ASP。代码结构混乱，没有一个正确的设计模式，只是为了结果而去写。这样的教学有何意义？再说Flash，因为本身存在许多安全漏洞，再加上HTML5的流行，苹果以及其他一些浏览器已经不再支持Flash ，甚至ADOBE不再支持更新，而转而开发Edge（HTML5的IDE），移动端Flash早就被淘汰，Web端的生命也不久矣。&lt;strong&gt;我们学着过时、还有即将过时的东西，有什么实际价值？&lt;/strong&gt; “永远不要使用过时的技术”，这是IT界的箴言。&lt;/p&gt;
&lt;p&gt;课程是这样定的，不能自己去选择。于是，带着一种失望的情绪，我开始了自己的自学之路。规划好了自己的方向，然后每天看书，甚至某些课上我也是在看自己的教材。有些人说没有逃过课是大学的遗憾，这句话是针对有自己目标的学生而言的，是指逃课做自己的事情，学习或者是其他兴趣都是可以的，而不是逃课在宿舍睡大觉或者打游戏。但是我觉得，如果连这上课一点点时间都安排不出来，谈何时间规划、谈何学习规划，以后的工作和生活又该怎么办。另外旷课逃课是对老师不尊重的表现，不管老师讲的好不好、对不对学生的胃口，至少尊重师长是我们应该做到的。我觉得大学期间，自学是尤为重要的。正因为我看清了大学的教学模式，所以学了那么多与专业无关的知识，也并不担心挂科问题：学习自己不感兴趣的大学课程，然后考前一周老师划下重点，认真背一背考个高分真的不是问题。至少，我一直以来的第一都是这样来的。所以我一直奇怪欢呼不挂科的意义究竟在哪里？我也不清楚这样的考试有何意义，如果能让学生自由发展那不是会更好么？多数人只是为了一份工作而读一个热门的专业，却忘了去关注自己的兴趣、爱好，甚至综合能力的培养和理性的思考。基于这种理念，我又报了自己感兴趣的广大的第二专业。我原本以为是第二专业的老师不会去认真教学，但是出乎我意料的是，二专的老师大部分都相当不错，都是真正为了学生而教学的好老师。&lt;/p&gt;
&lt;p&gt;曾经有老师跟我说：“在知识上投入多少都不算多。”所以我不仅仅是为了学习而学，在二专的成绩达到优异之时我还是觉得自己的知识储备并不算多，于是又自学了第三专业。很多人看到我的时候第一反应就问我是不是计算机学院的，说我的水平可以和创新班媲美；但我说我是教育学院的时候别人还是一脸惊讶，其实没有什么，我也为我自己是学教育、为教育事业献身而感到自豪——我的梦想便是“愿倾尽一生改变世界，并义务反顾追索人生的最高价值和终极关怀”。记得大一的时候觉得做项目是很高大上的事情，可是有了技术之后，觉得其实很多项目做出来根本没有什么实际意义，不能改变这个社会的现状、甚至连我们的生活也没有一丝变化，这些仅仅是技术的应用和产品的再应用而已。至今，我身兼三个项目，并且推掉了六、七个找上门的项目组。拥有自己的目标和梦想，选择自己想学的，相信自己的判断，仅此而已。&lt;/p&gt;
&lt;h4&gt;三、真正的教育&lt;/h4&gt;
&lt;p&gt;我本身第一专业是学教育学的，所以对我所经历和看到的教育有了很多感慨。马克思主义教育学认为*教育是一种社会现象，是人类特有的活动。教育是人类社会特有的一种社会现象；教育是人类特有的一种有意识的活动；教育是人类社会特有的传递经验的形式；教育是有意识的以影响人的身心发展为目标的社会活动。*说了这么多理论上的“正确的废话”，想必还是不明白什么是教育，什么是真正的教育。那么，我先来谈谈教育的本质与目的。&lt;/p&gt;
&lt;p&gt;卢梭和杜威曾指出：“教育即生长，生长就是目的，在生长之外别无目的。” “教育即生长”言简意赅地道出了教育的本义，就是要使每个人的天性和与生俱来的能力得到健康生长，而不是把外面的东西例如知识灌输进一个容器。懂得了“教育即生长”的道理，我们也就清楚了教育应该做什么事。比如说，智育是要发展好奇心和理性思考的能力，而不是灌输知识；德育是要鼓励崇高的精神追求，而不是灌输规范；美育是要培育丰富的灵魂，而不是灌输技艺。&lt;/p&gt;
&lt;p&gt;如果说教育即生长，那么，教育的使命就应该是为生长提供最好的环境。到了大学阶段，自由时间就更重要了。依我之见，可以没有好老师，但不可没有自由时间。说到底，一切教育都是自我教育，一切学习都是自学。就精神能力的生长而言，更是如此。&lt;/p&gt;
&lt;p&gt;外国教育学者曾说过：“对于受过基础教育的聪明学生来说，大学里不妨既无老师也不考试，任他们在图书馆里自由地涉猎。全世界的书架上摆满了精神的美味佳肴，可是学生们却被迫去啃那些毫无营养的乏味的教科书。”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;忘记了课堂上所学的一切，剩下的才是教育。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;至于“教育的目的”，这个短语非常陈腐，教育本没有目的，而是其他事物的目的。教育应该以人为本，一切都应该围绕着人来服务，科技，理论，知识，都应该为人服务。而不是人活着为了知识，科技和理论。不知道怎样做人，不知道做人的快乐，要科技和知识有什么用呢？教育的“教化”之处，就是养成一种好习惯，以探求新的含义，寻找新的联系，将体验复杂化，广泛化使其更丰富更持久。教育的目的是无法被预测的，教育除了其自身之外，没有任何目的。接受教育就是要培养一种习惯，去挖掘我们所研究的各种事件或现象中多重的全新的意义。教育本身不是这些示例，方法，体系。它是一种本能的习性，即探求新的意义，质疑旧的观念，反复玩味并不断挑战我们赋予事件文本和现象的含义，不断开拓创新。教育是一个最具价值，最有人性的并最富人文关怀的平台，有助于个人成就自我。教育并不是教授具体内容，甚至也不是传授技能，教育是一种思维习惯或可称其为思想状态。他并不是你的附属品，而是与你浑然一体的。有篇演讲稿中曾说过：“大学教育是完善生命的土壤、空气和水分，而不是为目的施用的化肥、农药和添加剂。”&lt;/p&gt;
&lt;p&gt;“拥有”知识，而不知道运用、不会运用知识是不可能“改变”什么的，而“拥有”了智慧，学会运用知识，才真正具有了“能力”，才具有了适应环境、改变环境的能力和“力量”。教育不仅仅是一种知识性生存方式，更是一种智慧化生活方式。从知识对人的价值和意义上讲，&lt;strong&gt;“转识成智”既是人的发展的目的和途径，同时也是教育的目的和途径。这大概就是教育的本质吧。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;而现在的教育，仅仅只是教会学生掌握技能，有的甚至不教原理，只教学生怎么使用技能去挣钱。评价毕业生的优劣居然也是以薪资多少为标准，将真正的知识用金钱来衡量简直就是对教育的侮辱。&lt;/p&gt;
&lt;p&gt;当然以上种种教育问题各个国家都有存在，我有个朋友是物理学博士目前在美国带研究生，他时常和我抱怨那里的学生抽象思维太差，说句不好听的就是太笨。他研究过其实这就是美国基础教育不够严格所导致的问题。王安忆在复旦大学研究生毕业典礼发言曾说:“&lt;em&gt;这个世界上有用的事物已经太多了，所有的因果逻辑都是循着用途连接和推动，那些边缘的次要的性质从因果链上碎裂下来，被淘汰出局，生活和人生本来是弥漫的氤氲般的形状，质地也具有弹性，如今越来越被过滤干净，因而变得光滑，坚硬，并且单一。今天的教育确实有着许多问题，有一些还相当严重，可是无论怎么样，教育也不会因此而损失它的意义，它是迄今为止，最有可能公平地给予我们变好的机会。&lt;/em&gt;”因此，我们要相信教育，永怀希望的去面对，相信真正的教育终将到来。如果现在就彻底绝望了，那么教育也就真的没有光明而言了。因为，&lt;strong&gt;只有教育才能从根本上改变一个国家的素质。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;那么，究竟什么是真正的教育？德国两百年前的教育宣言曾经如此说道：&lt;strong&gt;教育的目的，不是培养人们适应传统世界，不是着眼于实用性的知识和技能，而要去唤醒学生的力量，培养他们自我学习的主动性，抽象的归纳力和理解力，以便使他们在目前无法预料的种种未来局势中，自我做出有意义的选择。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所以我认为：&lt;strong&gt;教育是以人为最高的目的，接受教育是人的最高价值的体现。&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;四、勿忘初心&lt;/h4&gt;
&lt;p&gt;现在我们的国家里，大家都在努力创造着物质的财富，每一个城市里可以看到很多忙忙碌碌的人，每个人都在辛苦的追逐着。在成功学和心灵鸡汤泛滥的今天，很多人都在追逐自己的梦想。有梦想，并奋力去追逐它，然后成功。这样的人生听起来确实很美满！我也非常喜欢和有梦想的人交谈、做朋友，因为那是一群积极向上的人。但是梦想相伴我们茁壮成长的同时，我们不能让梦想绑架了自己。&lt;/p&gt;
&lt;p&gt;于是当下，我们每天都在忙，我们没有时间，我们有梦想，我们要为之奋斗。无论是社团工作还是专业学习，我们都投入了很多很多。可是当我们忙完之后空闲下来，心中的空虚感却油然而生。仿佛恍然间失去了什么，而我们自己却不知这失去的究竟是什么。&lt;/p&gt;
&lt;p&gt;其实，&lt;strong&gt;这不是所谓的庸碌，只是务虚而已。活在未来的人何其多，活在当下的人何其少。&lt;/strong&gt; 人们忙着规划未来，做着不属于现在的事，积累了种种成就。这些成就，提供了人对自我的认同。然而，这种我们认为可以占有的东西，使“我”异于我的存在，使我们对自己的认识，并不是借由对自身内在的了解，而是借由对身外之物的拥有。而外在事物变动不居，以此来确证我是谁，必将不断随之而变，直至走形。当一个早已异化却不自知的人，在社会中占据的位置不尽如人意时，就会觉得自己在人前何其卑微；而当他们继续占有更多东西的希望破灭时，就会觉得活着已毫无价值，还不如自我了断。&lt;/p&gt;
&lt;p&gt;这种错把务虚当务实的颟顸之举虽说荒诞，但因习焉不察，生活中俯拾皆是。内心的价值判断原本就应当同外在的行为时间高度统一，言不由衷盖因你说的是一件事，而想的却是另一件事，在欺瞒本心。但在大学中，知行不一才是家常便饭。因为这里就是一场喧闹的假面舞会，不戴面具你连入场券都领不到。自欺得久了，也就异化了。但见一群丢失了灵魂的动物在舞台上浪奔豸突秀下限，表演着一幕幕惊爆眼球的奇观。&lt;/p&gt;
&lt;p&gt;这一系列社会问题，靠钱是无法解决的，必须靠文化、靠智慧。文化与智慧从何而来，还是教育。我们最终都要走上社会，我们最终都要独立地去面对生活和生存，我们最终都要为人父母，我们最终都要赡养自己的父母。&lt;strong&gt;可是这些关乎幸福的问题，学校有教给我们么？怎样去强身健体，怎样去规划人生方向，怎样去处理婚姻问题，怎样去教育孩子，我们的教育有去关注或者启发我们去思考这些问题吗？难道我们的教育就是要在学校里培养一群考试的机器，然后出来成为一个工作的机器？老了成为一个等死的废物吗？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;教育的意义首先应该是快乐，无论别人是否尊重我，我都愿意去接受自己本来的样子。当今社会提倡“爱的教育”，失去自己的人，无论他有多么高的志向，因为内心的缺失，痛苦与自私都会始终与他相伴，他承担的责任也是有限的——正所谓“大学之道，在明明德”。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;接受教育就是——务实梦想，勿忘初心，这就是人的最高价值的体现。&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;五、个体发展及人生价值的实现&lt;/h4&gt;
&lt;p&gt;鲁迅曾说过：“&lt;em&gt;我之所谓生存，并不是苟活，所谓温饱，不是奢侈，所谓发展，也不是放纵。&lt;/em&gt;”每个人出生在这个世界上，其目的就是为了对我们所在的社会做出贡献。无论大家今后选择何种发展方向，都会受到遗传、环境、教育以及主观能动性的影响，但是最终都一定都是会对这个社会造成影响，因为毕竟存在过，“&lt;strong&gt;存在先于本质&lt;/strong&gt;”。萨特指出，人的自由是绝对的，因为人生活在一个孤立无援的世界上，人是被“抛”到世界上来的，上帝、科学、理性、道德等对人都不相干，也就是说，它们都不能告诉我们生活的真理、生活的方式，同时，它们对人也没有任何的控制和约束的作用。正因为如此，人有绝对的自由。&lt;/p&gt;
&lt;p&gt;大学生毕业了可以选择自己的发展方向，无论是自主创业还是出国留学都是自己选择的路。四大影响因素中的遗传，根据不同人影响程度不同，只要不是严重的遗传病基本没有影响。而环境因素可以不计，大环境下，目前是和平年代还有国家九年义务教育，所以每个人都有机会受到基础教育。至于小环境，也就是个人的学习环境，根据个人主观能动性可以弥补，其也无影响。毛主席在市场中读书专心置至，如入无人之境。我的初中也是二十四小时住在我家开的网吧的，因为离学校很近，但是我的初中学习成绩还是很优异。接下来就是教育和主观能动性方面，这是本质上影响人发展的两个因素。之前也说了接受教育是人最高价值的体现，而这样的教育，一定需要是对个体发展最合适的教育，不能说他天生是一个数学天才可是大学却报了文学专业，哪怕这个文学专业排世界第一，那这个人所受的教育也是不好的教育。至于其他的教育因素，之前也说了很多，这里不再赘述。&lt;/p&gt;
&lt;p&gt;主观能动性是影响人发展的内在本质要素，也就是要求我们要严格律己，知道自己想坐什么、要做什么，而中国目前的教育决定了大学就是充分发挥个人主观能动性的事情，如果在要奋斗的时候，选择了安逸，那么此生必定留有无限遗憾。所以，接下来我简单谈谈个人对人生目标的抉择问题。&lt;/p&gt;
&lt;p&gt;人生总是不容易被社会理解的人生，人生受各种各样的社会关系制约。人生的价值和意义，不是由社会评估，而是由自我价值的肯定衡量的。个人主观上，也许能够按人生意愿去演化自己的人生历程，但客观上，个人的这些人生意愿多大程度能够遂愿，不是个人一厢情愿，受社会关系诸多因素制约。我们最好是把自己的生命看成是前人生命的延续，是现在共同生命中的一部分，同时也是后人生命的开端。正所谓——“&lt;strong&gt;如果我的付出，可以为人类的未来增加一块基石的话，大概我就是为此而生的吧&lt;/strong&gt;”。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;大学生应胸怀天下，忧国忧民，应怀满腔热血，壮志踌躇。如果仅仅在考虑以后的就业问题，温饱问题，虽然很现实还是眼光是否过于狭隘，那么大学生的特别之处又体现在哪里？无论何时，请记住，你是大学生，是中国的大学生，一定要为此无比自豪。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;说了这么多，其实我只是真真切切的希望，这个社会真的能够有那么一天，让我们每个人都能够受到真正的教育，并用尽自己的才华为祖国、为世界贡献出自己的一份力，那才是我所希望看到的未来。&lt;/p&gt;
&lt;h4&gt;写在后面：&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;一直就想写一篇这样的文章，深度探讨一下教育问题。可是每次下笔却不知从何谈起，亦或是琐事缠身写了几句就停了下来。万幸可借此机会，写一篇“长篇大论”，刻苦铭心或许说不上，但是完完全全是肺腑之言。也因此写的有点乱，算是想到什么写了什么，不过大体上按模块分成了五点——个人经历，大学现状，真正的教育，庸碌的梦想，真正的人生价值。我只是一个普通的大学生，甚至在一个不怎样的大学。但是我明白既然教育有问题，那么我们就更不能对自己不负责任了！我真切的希望每一个大学生，都不要荒废自己的时间，找准自己的目标，为实现自己的理想以及整个社会和人类未来而奋斗，做一个真正的大学生。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;不要虚度你的大学时光 (2015-11-08)&lt;/h3&gt;
&lt;p&gt;致 2015 级教育学院新生 —— 暨教育学院生涯规划交流会演讲稿&lt;/p&gt;
&lt;h4&gt;一、精通一项技能&lt;/h4&gt;
&lt;p&gt;不要让你的大学时光白白度过，最直接的方法就是培养自己的兴趣，找准自己的方向，然后掌握并精通至少一项技能。这样，起码至少自己在毕业的时候也不会感叹自己什么都没学成。&lt;/p&gt;
&lt;p&gt;你可能喜欢外语，你可能喜欢画画，你可能喜欢音乐，缺不巧来到了教育学院。不过没有关系，专业不是限制自我发展的理由，掌握的技能可以与专业无关，但必须要迎合自己的兴趣，而且最好是具有实用价值与创造性的技能。什么是具有实用价值与创造性的技能呢？举个例子，比如烧菜。世界上会有很多厨师，但是如果你精通西红柿烧蛋的做法，并且做出的西红柿烧蛋是全世界最好吃的西红柿烧蛋，那么你就是世界上独一无二不可或缺的人。你的价值，就在你的竞争力中体现了出来。&lt;/p&gt;
&lt;p&gt;所以，请务必利用好自己的大学时光，精通至少一项技能。&lt;/p&gt;
&lt;h4&gt;二、学会自律&lt;/h4&gt;
&lt;p&gt;懒惰是人类的天性，如果大学不勤奋，那这一生就真的可能死于安乐了。如何克服懒惰与自己的意志力执行力有关，但是也需要掌握一些方法——制定学习任务就是一个学会自律很有效的方法。&lt;/p&gt;
&lt;p&gt;我自己有很多团队，见过很多很有潜力的同学，但是很可惜，有一部分因为懒惰而荒废了自己的才能甚至荒废了自己的大学生活。宁愿在宿舍喝酒打游戏，也不愿意多学一点知识。相反的，也有很多同学表现的很出色，比如大一时就跟着我做机器人的几位师弟，今年大二就有了两到三项自己的作品，并且其脑电波项目在本周五科学中心举办的的大学城创新节成果交易会上展示。他们大一时也是什么都不会，从最简单的C语言开始学起，然后学数据结构、算法、单片机。仅仅是2个月，就有了成果——蓝牙控制的智能搬运灭火机器人。我很惊异于他们的意志力，每天几乎24小时都待在实验室学习，甚至寒暑假都没有回家，忍受着学校假期坑爹的住宿条件，在校学习研究。成果，取决于自己的努力，这句话一点也不假。&lt;/p&gt;
&lt;p&gt;我自己的项目也很多，但是基本上是一个阶段只专注于一个项目。就拿目前的项目来说，我要求比较严格。会在每周给每位成员布置他们每个人下周每天的具体任务，并且在日历上写上谁谁谁今天的任务是什么，要求每位成员每天要写日报，如果是程序类任务，每天十二点前要提交当天敲的代码，日报需要总结当天的任务和成果，哪部分没完成，为什么没完成。并且在周日核查任务，开阶段性总结会议。&lt;/p&gt;
&lt;p&gt;其他暂时没有精力负责的项目，要求就比较稍微轻松一点。比如实验中心的项目，要求每周提交总结，记录一下自己本周的完成内容并且写一下下一周的学习计划和任务。要求每周至少去实验室学习两次，不然就请退。因为实验室有刷卡门禁，具体每个人去了几次都会有记录。&lt;/p&gt;
&lt;p&gt;所以，自律很重要，每周都需要给自己制定一个学习任务，并且周末总结一下需要保证完成度。能做一两周、一两个月都不稀奇，如果能坚持一两年，成效自然就显现出来了。&lt;/p&gt;
&lt;h4&gt;三、放下手机&lt;/h4&gt;
&lt;p&gt;不否认手机确实是现在信息交流的主要工具，但是很多社交软件和无价值的信息在充斥着我们的生活，所以说利用手机学习几乎是不可能的事情，反而是极大的浪费着我们的时间。所以说，放下手机少用手机。除非手机响了，或是必须有事要主动联系别人，其余时间就尽量不要拿出手机。如果是想刷朋友圈和微博，建议是一天抽出固定20分钟的时间一次刷完，之后就不要再刷了，刷这种东西是有瘾的。尤其是无聊的时间，千万不要拿出手机消遣。走路和吃饭的时间也不要拿出手机刷。&lt;/p&gt;
&lt;p&gt;总之，当下确实需要我们放下手机，去贴近更真实的生活。&lt;/p&gt;
&lt;h4&gt;四、卸载游戏&lt;/h4&gt;
&lt;p&gt;浪费大量时间在无意义的游戏上，百害而无一利，当然，一些益智类游戏哲理类游戏玩玩还是很好的，无论是放松还是学习，这类游戏都特别不错。我现在就特别后悔自己大一上学期的时间都浪费在了LOL上面。一局游戏40分钟到一个小时，打赢了想继续玩，打输了想再打一局赢回来，然后如此往复，一天就过去了。到头来，什么都没有做。曾尝试卸载过它，但卸载了又装上、装了又卸，最后是卸了两三次才把那些游戏戒掉。&lt;/p&gt;
&lt;p&gt;玩游戏建议玩那些有思想有价值的游戏，并且考虑其教会了我们什么？怎么样做，这个游戏会更好？如果什么都没有教会我们，那这样的游戏真的毫无价值可言。比如2048，其游戏原理很简单，我在给15级二专软工的学生上课时就教他们玩这个游戏，并让他们自己尝试实现游戏，在手机上玩自己做的游戏。这才是真正的在“玩中学、学中玩”。&lt;/p&gt;
&lt;p&gt;总之，大家回去后自己思考一下，你自己电脑上的游戏到底花了你多少时间，给你带来了什么？&lt;/p&gt;
&lt;h4&gt;五、随身带书&lt;/h4&gt;
&lt;p&gt;多读书，无论是学术性的书籍还是国内外经典散文小说，都需要读。&lt;/p&gt;
&lt;p&gt;随身带书是强迫自己多读书的好方法。这个说起来简单做起来却不容易，有的时候书很沉，拿了几次后你发现没看，就不拿了，这是不行的。要做到随时带书，把书当成手机一样必要。因为出门在外你不知道会有什么情况发生，堵车、排队这些事我从来不慌张，不慌张的前提是我有事做。不要因为带着书不看就不带了，只要带着书就一定有机会看的。&lt;/p&gt;
&lt;p&gt;万事开头难，就怕你第一页也不肯翻开。之前说无聊时间要放下手机，没错，放下手机拿起书本，才是我们应该去做的。上课时无聊了，可以看看自己的书，但是不要玩手机。排队无聊了，可以看看自己的书，但是不要玩手机。&lt;/p&gt;
&lt;p&gt;选书时也要追求质量，不要盲目追求数量。有些书可能晦涩难懂，但是坚持读完之后肯定会有所收获。甚至多年后的某天，你就会突然顿悟当时书中的话语。&lt;/p&gt;
&lt;h4&gt;六、勤写博客&lt;/h4&gt;
&lt;p&gt;多读书的目的是要促使自己多思考，只读书不思考不如不读。而多思考就要求自己要多记录。可以写读书笔记，可以写书评，可以写心灵日记，只要有思考就要记录下来。记录的方式有很多种，个人推荐是写博客，不要求每天写，但是至少要每两周产出一篇比较高质量的文章，可以是自己读书的感想，也可以是记录自己的状态，或者是近期某件事给你带来的思考。记录的平台，不推荐qq空间，可以自己弄一个微信公众号，也可以自己建立一个博客网站，还可以用简书，这些都是挺不错的。有人读、有人评价，也是支撑自己写下去的理由之一。&lt;/p&gt;
&lt;p&gt;同样的，贵在坚持，凡事都是这样，因此自律还是最重要的。&lt;/p&gt;
&lt;p&gt;以上就是我给大家提出的六点的建议。如果有其他交流，可以给我发邮件（&lt;em&gt;e-mail:airing@ursb.me&lt;/em&gt;）。&lt;/p&gt;
&lt;p&gt;谢谢大家。&lt;/p&gt;
&lt;h3&gt;如果大学可以重来 (2016-03-25)&lt;/h3&gt;
&lt;p&gt;如果大学可以重来…&lt;/p&gt;
&lt;p&gt;“你马上就大三了啊？！”我有些惊讶。那这样算来，我马上不就大四了？还没有意识到，大学生活已经悄然接近尾声了。睡在宿舍的床上，入学的第一天情景还历历在目。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;那年的不服气，全部变成了今天的不舍得。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;对于广大，已然是母校般的存在了，毕竟在这里度过了我成长最快的四年。所以，在听大四师姐给大一新生报告的时候，笑着说自己其实考得不好才来的广大，我有些嗤之以鼻。如果大学可以重来，她应该会选择更加努力的方式度过吧？&lt;/p&gt;
&lt;p&gt;那如果大学可以重来，我又会怎么做？&lt;/p&gt;
&lt;p&gt;记得开学第一天，容姐一口气吃了八两饭。&lt;/p&gt;
&lt;p&gt;依然记得面试学生会四个部门全部失败的挫折，那个时候懂得了能力的重要性，暗暗发誓要让所有拒绝我的人刮目相看。&lt;/p&gt;
&lt;p&gt;记得当了一年的体委，因为全班32个人只有我一个男生。&lt;/p&gt;
&lt;p&gt;记得当年的职发会，虽然打了一年的酱油，但部长之爱铭记于心。&lt;/p&gt;
&lt;p&gt;记得当年的辩论赛，输了一场超级不服气，有种掐死评委的冲动。&lt;/p&gt;
&lt;p&gt;记得那年的死亡之痛，躺在床上不能动，容姐和志豪彻夜照料。&lt;/p&gt;
&lt;p&gt;记得那时的手术，那晚的电话，那几日的天花板，还有护士姐姐。&lt;/p&gt;
&lt;p&gt;记得那节马哲课，因为阐述柏拉图的理念论而被盛赞，于是改名柏拉熊。想着，我可能真的是与众不同的那个人。&lt;/p&gt;
&lt;p&gt;于是学习各种技术，参加二专学习，并且积极自学，主流的几乎都有涉猎，但都不深。&lt;/p&gt;
&lt;p&gt;考过满分，拿过第一。
挂过课，也免修过。&lt;/p&gt;
&lt;p&gt;骄傲过，自负过，难受过，开心过，笑过。现在，很平静。&lt;/p&gt;
&lt;p&gt;举报过老师，见识过社会的黑暗，但也得到了更多温暖的反馈。我知道，所做的一切都是值得的。&lt;/p&gt;
&lt;p&gt;记得当年痴迷VB，半夜三点突然有思路，惊醒继续敲“姓名大乐斗”。&lt;/p&gt;
&lt;p&gt;记得当年“一时冲动”加入了实验中心机器人项目，苦苦钻研单片机两个月，无所获。甚至要闭关，呆了一夜就回来了…那个时候才意识到——还是宿舍温暖…&lt;/p&gt;
&lt;p&gt;后来和师兄们参加马拉松，自己做app，创新项目、创业项目，所谓的梦想，那个时候差点溺死其中。之后意识到生活可贵。&lt;/p&gt;
&lt;p&gt;再后来写书、写博客、教书上课，尽量不再沉迷于技术，看看书籍、看看电影、听听音乐、去外面走走看看，做自己想做的事情。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;记得那晚的星空，记得所有的一切。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;遇见的人，经历的事。或是缘分，或是不可避免，但都尽力使其往好的方面发展。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我只是一个普通的大学生，这就是我的大学。挺好。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;可能有些遗憾，但没有什么后悔的。该做的都做了，只剩下考研。&lt;/p&gt;
&lt;p&gt;如果大学可以重来，我依然如此。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;或许有点小忙碌，但是意义自在其中。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;各有各的生活，各有各的精彩。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;理想、孤独与生活&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;在忙碌与迷茫之间，寻找月亮与远方。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;何以我们孤独 (2015-10-25)&lt;/h3&gt;
&lt;p&gt;刚刚上传了作品，突然就感觉放松了下来。六天完成了iOS+Watch App，感谢小伙伴的帮忙。虽然有点粗糙，但是起码功能能顺利的跑起来。接下来优化下代码，和后台对接做好，大概，毕设也就完成了吧。&lt;/p&gt;
&lt;p&gt;这几周还在带大一的新生辩论赛，感觉自己变老了。曾经，是这样。去年，也是这样。今年，还是这样。新生赛每年都是这样，一直一直都是这样。只是这三年来，我渐渐地从一个参与者变成了一个旁观者，渐渐散去了初入大学时的兴奋与锋芒。而我们，究竟是如何一步步走向平庸的？见过很多悲欢离合，身边的搭档也是一直在变换，忙碌的事情也始终不同。唯独不变的是，终点。&lt;/p&gt;
&lt;p&gt;在这里，我忙碌过、高兴过、孤独过、气愤过。你对生活感到充实吗？忙碌就是充实吗？睡觉就是空虚吗？学习就是充实吗？游戏就是空虚吗？曾一度这样以为，但现在感觉好像又不是这样。因忙碌产生的充实感之后，随之而来的就是空虚。因睡觉产生的空虚感之后，随之而来的就是充实。如此飘忽不定，而唯独不变的是，孤独。&lt;/p&gt;
&lt;p&gt;前一段时间朋友圈转发了很多“停用朋友圈”之类的文章，里面说了很多很多，杜老师上课也呼吁我们停用朋友圈。简单看了一下，貌似蛮有道理的。朋友圈究竟是写给谁看的？为何要分组屏蔽，为何要晒自拍吃喝？你的生活与别人有何关系？顺手点赞的人比比皆是，一直不会联系的联系人，永远不会成为你的人际。相对应的，别人的生活与你何关？此番社交，似乎没有存在的必要。“&lt;em&gt;要么庸俗，要么孤独&lt;/em&gt;”，&lt;em&gt;精神卓越者必然孤独&lt;/em&gt;。停用朋友圈，享受人生中难有的孤独。&lt;/p&gt;
&lt;p&gt;如此鸡汤的东西，看看也就好了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我们要做的不是，放弃当下的苟且，去追寻梦想的远方。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我们要做的是，如何把当下的苟且，变成梦想的远方。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我相信，每个人都会被朋友晒出来的东西感动过。真心的点个赞或者留个言。也许是很久没有联系的朋友，我默默无语的看看他的朋友圈，虽然我又默默的飘开，仿佛也还没有离得那么远。&lt;/p&gt;
&lt;p&gt;朋友圈可以关掉，微信可以卸载，手机可以停机，只要你还是那个你，只要你对自己的生活不满意，就总能找到不如意。&lt;/p&gt;
&lt;p&gt;就算你停用了朋友圈，唠叨的老妈，讨厌的领导，炫耀的闺蜜，晒娃的同事，没良心的同学……都还是活生生的活在那里。&lt;/p&gt;
&lt;p&gt;其实要停用不是你的朋友圈，而是你无力掌握自己生活的不满。&lt;/p&gt;
&lt;p&gt;人生是个很奇怪的东西，一路走过来，你会忘记很多东西。有一些看似无关紧要的细节，却刻骨铭心，记得分外清楚。而朋友圈，大概也就是为了记住这一点一滴的小时光而存在的。因为，英文版的朋友圈翻译为“&lt;em&gt;moments&lt;/em&gt;”。新版微信的欢迎页有这样一句话：“&lt;em&gt;发之前，请想一想，你想表达什么？&lt;/em&gt;”&lt;/p&gt;
&lt;p&gt;说到这里，想起了前两天看的《小王子》。你曾是谁的玫瑰，现在又是谁的狐狸。真正的成长，不在于长大，而在于遗忘。王子先生最终还是想起了小王子，影片构思很妙，因为我从未想过小王子也会长大。&lt;strong&gt;世界那么大，有几分生动，就有几分残忍。所有人都会长大，都会遗忘，自己儿时的模样。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;曾经在意的，到头来却再也不联系。我也反思过，思考过，为何如此？还是因为成长。扪心自问，我也遗忘了很多。忘记了上学路上的风景，忘记了放学同行的伙伴，忘记了上课时自己的小心思，忘记了八卦过谁和谁在一起，忘记了黑板上的值日生，忘记了自己的小组长，忘记了班级的人数，忘记了你们的生日…&lt;/p&gt;
&lt;p&gt;想起高中时很喜欢摘抄的一首诗：
“少年听雨歌楼上，红烛昏罗帐。壮年听雨客舟中，江阔云低、断雁叫西风。
而今听雨僧庐下，鬓已星星也。悲欢离合总无情，一任阶前、点滴到天明。”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;人生如此，何以孤独？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;因为成长，因为遗忘。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;大家走上了不同的路，忘记了曾经的誓言，忘记了曾同行的朋友，忘记了自己儿时的模样与勇气。&lt;/p&gt;
&lt;p&gt;于是想要努力成长，不用让这遗忘的记忆白白流失。而长大后的模样，却没有我们当初想象的那么美好。&lt;/p&gt;
&lt;p&gt;坚信你若盛开，清风自来。&lt;/p&gt;
&lt;p&gt;不，&lt;strong&gt;我若盛开，清风爱来不来。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;生活不用努力，需要努力的是你，想要去的地方，不管是心里，还是在真实的时空存在的。永远要抱着期待，不管你现在觉得有多糟。 哪怕再孤独，也要勇敢地向前走，向着儿时的目标前进。因为你还这么年轻，不必活得好像历经沧桑。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;我想抬头看看月亮 (2016-01-11)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;正如傅雷说的那样：“&lt;strong&gt;本质的善良，宽广的胸襟，天性的温存&lt;/strong&gt;”，这才是让我们内心觉得温暖幸福的所在。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;今天考完试了，这标志我的大三第一学期结束了。&lt;/p&gt;
&lt;p&gt;忽然觉得，我好像不久前才回过家啊。&lt;/p&gt;
&lt;p&gt;可是实际上已经很久很久了，这学期也做了很多事。&lt;/p&gt;
&lt;p&gt;不同以往，这是一些值得未来的自己回忆留恋的事。&lt;/p&gt;
&lt;p&gt;想起《月亮和六便士》里，别人跟思特里克兰德说：“你以为你是谁，你以为你很有才华吗，你想投机取巧，被画商看中出画展，然后成名赚钱吗？”思特里克兰德摇头说：“&lt;strong&gt;我知道自己不是个伟大的画家，我不是米开朗琪罗，不是的，但是我有自己的东西。&lt;/strong&gt;”&lt;/p&gt;
&lt;p&gt;我的便士捡够了，我想抬头看会儿月亮。&lt;/p&gt;
&lt;p&gt;我的心中有一点亮光，我想去捕捉它，我想去靠近它；&lt;strong&gt;因为它会温暖我。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;大学快结束了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我在年轻的时候，勇敢了这么一次。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;未来的我，会感谢现在的自己的。&lt;/p&gt;
&lt;p&gt;当候鸟发动螺旋桨，成长不请自来。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我懂得星体运行的规律和宇宙的起源发展史，但在仰望夜空时，闭上眼睛仍能嗅到，从某颗亿万光年以外的星星上，传来的玫瑰香味。
我明白物质都会自衰，世上没有永恒的事物，人岁不过百，太阳也有其寿命，但天真与爱，却能在心的行星上永远存在。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;——记于大三上学期的最后一天，一个人的寝室&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;我们都是一只企鹅 (2016-03-13)&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;I&apos;m busy, but also lazy.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;上一刻我可能还在考虑智能车的数据处理问题该怎么办，下一刻就不得不面对植树网的后台需要快点搞定。对了，还有中期检查，两个项目的中期检查。报告和论文还没写完，知网查查文献，意识到不先把这个功能实现怎么写报告呢？于是冒着暴雨从宿舍跑到实验室。那先试试 python 的 flask 吧，正好最近刚学。好吧，晕了，SQLite 的数据类型什么鬼，为什么存不了数据，这个 ORM 也太差了吧，查查书本，解决不了。还是换 Java 做吧。做完了 Java 的后台，还要想想 Web 前端的 Canvas 渲染，数据怎么拿才好。于是，上课一直在想。突然，接到通知挑战杯立项要在这个月完成。于是疯狂查文献，别说什么申报书了，开了四五六七个会，连题目都没定下来。刚开完会，匆匆吃完晚饭去上课，上了两小节从后门逃了出来，因为要去广美谈项目，于是又做到了 iOS。晚上回来的比较晚，不知道甲方怎么想的。不过这个月还是赶快先把自己的二专毕业设计搞定吧，搞定完之后还要速度写出论文。KFC、全家、学工办、办公室、实验室、宿舍、饭堂、课室各种跑。什么？下周一要补考我上学期挂了的 UML？好吧，还是先看看 UML 吧。那考研英语单词还没背啊，高数还没看啊。算了，周末还是先看看 UML 吧。&lt;/p&gt;
&lt;p&gt;我要是会影分身之术就好了，分十几二十个估计够用了。&lt;/p&gt;
&lt;p&gt;前段时间看了《搏击俱乐部》，对多重人格还是没什么感冒的，毕竟赤司的多重人格前两天治好了，开启了完全体的天帝之眼，截下了拥有魔王之眼的纳什的球，主角队又是毫无悬念地以最后一秒的绝杀一分优势赢得了这场打了一年的篮球赛。扯远了，这部电影我印象深刻的还是泰勒的反体制反秩序的思想——“广告诱惑我们买车子，衣服，于是拼命工作买不需要的东西，我们是被历史遗忘的一代，没有目的，没有地位，没有世界大战，没有经济大恐慌，我们的大战只是心灵之战，我们的恐慌只是我们的生活。我们从小看电视，相信有一天会成为富翁，明星或摇滚巨星，但是，我们不会。那是我们逐渐面对着的现实，所以我们非常愤怒。”&lt;/p&gt;
&lt;p&gt;主角（不好意思，我记不清你叫什么名字了）第一次在安抚组织的催眠下，看到了自己心灵的动物是只企鹅。哈，那不是腾讯吗？难道他想跳槽？&lt;/p&gt;
&lt;p&gt;其实到最后才明白，不是这样的。正如我记不清主角的名字一样，他只是一个社会中普普通通的人。企鹅那黑白图案，不就像是社会中西装革履的人们吗？当它混在企鹅群里，它没有什么突出的，所有的企鹅都一样。&lt;/p&gt;
&lt;p&gt;“开的车也不能代表你，皮夹里的东西不能代表你，衣服也不能代表你，你只是平凡众生中的其中一个。”&lt;/p&gt;
&lt;p&gt;细细回想，究竟有什么东西可以代表我呢？我敲的代码？我写的论文？我杀过的僵尸？还是我今晚唱过的歌？确实，是没有的。证明自己存在的，似乎只有那近乎死循环的 &lt;em&gt;busy&lt;/em&gt; 或者 &lt;em&gt;lazy&lt;/em&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果这种价值都不存在了，会怎样？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;想到了前段时间听到 LiSA 唱的《印记》。歌词什么的不知道，但是很好听。世上好听的音乐有很多很多，这首也算不上特别好听。但是评论区里有这样一句话，我喜欢这首歌 不是因为它是《刀剑神域》优纪的角色曲，而是因为 LiSA 头上沾满汗水，十分疲惫却依然含着泪水唱完这首歌留给我的印象太深了。&lt;/p&gt;
&lt;p&gt;虽然我之前对任何歌手都没有兴趣，不追星也不看演唱会，但出于好奇，还是找了一下这场演唱会的视频，快进到了最后，这首终场的曲子。LiSA 说，她没有什么特别的，但是她有现场的所有歌迷，有这些音乐，有这首能给大家带来力量的歌，而且只有 LiSA 能唱，这就足够了。这就是她作为歌手的，全部的意义。&lt;/p&gt;
&lt;p&gt;正如歌名“印记”一般，挥洒泪水唱完这首歌的她，着实在我心里留下了印记。&lt;/p&gt;
&lt;p&gt;不反对泰勒所说的，我们只是普通的生命。甚至，我们与企鹅没有什么区别。在人群里，我们忙碌，我们会淹没了自己，找不到自我。&lt;/p&gt;
&lt;p&gt;但是，生命过程之长，无论你是怎样的度过自己的一生，是 &lt;em&gt;busy&lt;/em&gt; 还是 &lt;em&gt;lazy&lt;/em&gt;，我相信总有那么一样东西，可以代表你、可以展示出你的意义。毕竟，我们每个人，都是倾尽一生在追逐这种细微且遥不可及的光亮。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;无论怎样的伤痛，都要振作起来扬帆远航。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;无论怎样的风雨，都要稳住船只坚定方向。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这种印记，已经刻在心底。哪怕我们是一只企鹅，也是一只有理想的企鹅。做人没有梦想，和咸鱼有什么区别！&lt;/p&gt;
&lt;p&gt;所以，沿着雪坡，滑下去吧。&lt;/p&gt;
&lt;h3&gt;难得清闲 (2016-03-27)&lt;/h3&gt;
&lt;p&gt;难得周末，想清闲一下，却发现没有什么可放松的。找了网游排行榜，想再次痴迷游戏，发现这些游戏都好无聊。不是打打杀杀的，就是要刷图升级强化装备的。还是打僵尸好玩。然后找了“打僵尸俱乐部”的同学，求组队打僵尸，结果他们都在看书学习……&lt;/p&gt;
&lt;p&gt;好吧，想放松一下，都找不到娱乐之处，也是一种悲哀吧…&lt;/p&gt;
&lt;p&gt;于是随手拿起一本书——《月亮与六便士》，第二次读了吧，每次拿起这本书，感觉这个世界干净得一尘不染。&lt;/p&gt;
&lt;p&gt;月亮高高在上，是我们的理想。六便士是当时英国金额最少的钱，象征着我们生活。毛姆拟题时采用了评论家对《人性的枷锁》的一句评价——主人公嘉里像许多青年人一样终日仰慕月亮，却没有看到脚下的六便士。&lt;/p&gt;
&lt;p&gt;这种半开玩笑的意味，在当下却有了不同的解释。疲于奔命，为了生计而四处奔波，不知生活的意义何在。忙碌忙碌忙碌，只为了更多的“便士”，更好的生活。可是这却造成了恶性循环，只有“奋斗”是不会有好生活的。&lt;/p&gt;
&lt;p&gt;何谓生活的意义？何谓生命的意义？&lt;/p&gt;
&lt;p&gt;如果只是这样的生活，那么生命确实没有意义。赚够了钱，体验下庸碌的生活，然后躺进棺材，不过只是来这世上走一遭罢了。你所遇到的人，你所经历的事，终会化为过眼云烟，不再有一丝瓜葛。你所坚持奋斗的一切，或许从最一开始就没有意义，只是为了做而做，没有反思过为什么。&lt;/p&gt;
&lt;p&gt;如果只是这样的生活，那为何要存在于这个世界？人山人海，黑压压的似一片蚁潮。再与众不同、再实力出众，也终究是一个蝼蚁，归于体制之下，什么也不能改变。唯一存在的价值，就是为了维系秩序，庸碌的走下去。&lt;/p&gt;
&lt;p&gt;于是我们奋斗，我们想要更加出众，我们要变得强大、要有所为。&lt;/p&gt;
&lt;p&gt;殊不知，在那之后，&lt;strong&gt;迷茫充斥了一切。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;广告诱惑我们买衣服、买房买车、买我们根本不需要的东西。再怎么样，一生的意义，终究还是为了“物质”行尸走肉，愧对自己的一身好皮囊。&lt;/p&gt;
&lt;p&gt;胡适曾说：“&lt;em&gt;生命本没有意义，你要能给它什么意义，它就有什么样的意义。&lt;/em&gt;”&lt;/p&gt;
&lt;p&gt;那么，我们为何不能抬头看看月亮呢？&lt;/p&gt;
&lt;p&gt;哪怕会错过脚下的便士，哪怕会不小心掉进坑里，哪怕摔死了。那也是溺死在理想中，也是一个伟人，因为他看到了远方。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;生活不应该是眼前的苟且，还应该有诗和远方。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;愿溺死在理想之中，不愿困扰于生活之内。&lt;/p&gt;
&lt;p&gt;“&lt;em&gt;追逐梦想就是追逐自己的厄运，满地都是六便士，他却看到了月亮。&lt;/em&gt;”&lt;/p&gt;
&lt;p&gt;在我看来，嘉里没有什么可笑的。可笑的是只注意到他脚下便士的那些人。&lt;/p&gt;
&lt;p&gt;作家王小波曾经说过，年轻的时候最痛苦的是找到自己喜欢做的事。其实，就算是年轻时候没有想明白也没有关系，这种事情永远不会太晚，只在于有没有这勇气去改变。&lt;/p&gt;
&lt;p&gt;正如“&lt;em&gt;少时汩于世俗，颇有所为，晚而悔之。然渔歌菱晚，犹不能止。&lt;/em&gt;”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;难得清闲，诗酒趁年华。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;编程之路&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;从 VB 到全栈，一个非科班程序员的弯路与感悟。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;别在编程的路上走得太远 (2015-11-20)&lt;/h3&gt;
&lt;p&gt;时间过得真快，已经伴随大家走过了11周的课程。想当初给大家上第一节课的时候，汗流浃背掌心冒汗，但是现在已经能和你们谈笑风声了。我常常和别人说，“&lt;em&gt;你们是一群很可爱的孩子&lt;/em&gt;”。如果只用一个词来形容你们，除了“可爱”，我想不到其他更好的词语了。&lt;/p&gt;
&lt;p&gt;太多的感受，话语已无法言清。&lt;/p&gt;
&lt;h4&gt;我的编程之路&lt;/h4&gt;
&lt;p&gt;简单先来说一说我自己的经历吧，毕竟，&lt;strong&gt;你们正将踏向我曾走过的道路&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;高考报志愿的时候也没想过要报计算机，刻板印象让我觉得这是一个枯燥无味的专业，想从理科走向文科，于是报了个“教育技术学”（后来发现，广大的教育技术学居然也是理科……）。学习是个枯燥的过程，至少高中的我是这样觉得的。况且大学的课程很无聊（于我而言），没有难度，考前突击了一下还考了第一。所以，我不会去主动学习，宁愿宅在宿舍打电脑游戏人生。&lt;/p&gt;
&lt;p&gt;或许吧，人生总是充满戏剧性的。大一下开学第一天就被推进手术室，得了一种“再拖一天就会去另一个世界”的病，疼痛的我只能冒着汗发出这样几个字——“死亡的痛苦，大概也不过如此吧！”。那几天真的明白了何为痛苦，何为死亡，躺在重症监护的病床上，周围雪白雪白的，身上插满了各种针和各种电极，而我一个手指都没法动，只能看着天花板，发呆。时间，也就这样静静地流逝过去，在那里，根本分不清白天与黑夜。看惯了各种各样的人，被推进来，被送出去，我迫切的希望，下一个能出去的人是我。&lt;/p&gt;
&lt;p&gt;就这样，过了一个月，完全康复并且返校上课了。课程还是一如既往的无聊，但是我知道了我需要去做什么。机遇，就这样降临了，在你有目标的时候，四处都是机遇。因为课堂上随意回答出了一道VB题目，授课老师课下找我谈话，希望我跟随他做项目。在那之前，我根本没有学习过编程知识。哦对了，初中学过一周的 Pascal，貌似只会打印 “hello world”，然后就翘课了，后来的“希望杯”计算机竞赛，我只考了 3 分（百分制），还获得了三等奖。&lt;/p&gt;
&lt;p&gt;简而言之，当时觉得做项目是很高大上的事情，于是就答应了。而且，学 VB 的时候，我发现我是热爱它的。当时做了一款小游戏，“姓名大乐斗”，1.0 版本，1.1 版本……一直到 1.5 版本，每次都加了很多功能。比较有意思的一个游戏，输入对战双方的姓名便会生成各种属性，然后姓名之间大家。虽然是文字游戏，后来还做了数据库（ADO 连接 Access），还做了商店，副本（死亡之塔），1.5版本还去阿里云买了服务器，做了联机 PVP 和擂台战……当时做这个是比较疯狂的，半夜 2 点睡觉，然后睡不着，3 点突然想起 Bug 怎么修复，然后立刻爬起来打开电脑继续做。这是我觉得最有意思的一段时间。&lt;/p&gt;
&lt;p&gt;后来学了 Java，在军训的时候晚上回来还在啃 Java 书，学了真正的 OOP 之后，发现 VB 真的很 low，于是下定决心不再用 VB 了。其实，抛弃一向自己曾热爱过的、并且掌握很熟练的技术，是很难的一件事。后来还用它做了一个综测评分计算器，但是发现并没有什么卵用。一气之下，就把 VB6 卸载了。从此再也没有用过 VB。&lt;/p&gt;
&lt;p&gt;学习 Java 是比较痛苦的一个过程，没有任何人指导，而且 VB 那种不入流的旁门左道的编程思想，给我加了很大一层枷锁。理解上很难。所以，能深刻体会到，为什么有人不建议初学者学 VB，为什么有人会说第二门语言会很难学。在初期学习 Java 的时候，还是受到了 VB 的影响，学 Java 就重点学 Swing，然后还给 Eclipse 装了插件，让它像 VB 一样可以拖控件，所见即所得。其实这是一种很蠢的做法。Java 本身的强项没有好好学，Swing 的精髓也没有掌握到……走了很多很多弯路，后来总算学到了 Java EE。&lt;/p&gt;
&lt;p&gt;不出所料，没看懂。看了两遍，也没看懂。&lt;/p&gt;
&lt;p&gt;里面有 JSP 的知识，然后我就去先学 HTML 和 CSS，怎么学呢？把所有的标签都打印下来，随身带着，随身看。很快就掌握了。学网页也是比较有意思的一个过程哈，自己买了服务器，然后用 CMS、Wordpress、Discuz 做了各种网站，还搭建了自己的个人博客。这个时候已经大二上学期了，学的东西很多很杂很不深入，报了第二专业软件工程，C++也没学好。但是期间学了很多其他的东西，还做了一个 RPG 游戏，别出心裁的把它改成教育游戏获得了课件的一等奖。反正比较开心，因为决赛只有我是一个大二的学生。还学了 Flash、Photoshop、Premier 等等等等软件的使用。&lt;/p&gt;
&lt;p&gt;大二寒假，学了数据库，各种数据库都用了一遍……（自己也是比较有闲心去弄……）然后花三周学了 Android，做了一个实验设备租借系统，并没有什么卵用。后来还学了C#与ASP.NET，做了一个网站版的实验设备租借系统，还是没有什么卵用。三月份被实验中心招去做机器人，使用C51编程，学了两个月，做了一些小作品，没有什么卵用。发现深入学下去如果不掌握模拟电路的知识根本没法继续学。&lt;/p&gt;
&lt;p&gt;于是，决定放下这一切，专心弄一门语言——Java。花了两个月，专心深入的学习了 Java EE 的 SSH 框架，什么也没有做。六月份参加广州创客马拉松，做了一个iOS App，但是团队缺设计师，于是花了一个月的时间学习 UI 设计……获得了三等奖和最佳交互奖，对自己而言是很意义的。除了奖之外，我更学习了一个专业的团队到底是如何管理和分工的。&lt;/p&gt;
&lt;p&gt;之后还学了 JavaScript 和 Swift，都是很不错的语言，发现自己很快就能学完一门语言，毕竟它们都是一样的。直到现在，还饶有兴趣地一直在学。&lt;/p&gt;
&lt;p&gt;这就是我自己的编程的路，很曲折。&lt;/p&gt;
&lt;h4&gt;别在编程路上走得太远&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;学习需要抱有目的和兴趣地去学，尤其是编程。&lt;/strong&gt; 不过，不要像我这样走那么多弯路，专注于一门或一个方向就好（我总是自嘲自己是什么都不会的全栈工程师），如果有人指导那就更好了（常联系我哈~）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不要学得太多、走得太远而忘记了自己当初为什么出发。&lt;/strong&gt; 感觉自己就是一只迷途的小羔羊，每个分岔路都走了一遍，忘记了自己当初为什么想学编程，为什么报软件工程第二专业。现在想来，大概还是兴趣吧。但是，兴趣真的没有以往那么浓厚了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;勤写博客，记录自己的问题与心情。永远记住，不是为了知识而去生活，而是为了生活而且学习知识。&lt;/strong&gt; 所以，好好生活，快乐地活，精彩地活。BUG无忧绕，如果真的遇到难题，不妨就让它一直留在那里吧！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;掌握编程之外的知识。&lt;/strong&gt; 不是为了迎合“互联网+”的战略，而是为了自己。最好是一些人文社科的知识，多学一点，不要让脑子随着计算机的思维去转。要记得，我们是人，复杂的人。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不要享受孤独。&lt;/strong&gt; 珍惜眼前人，学会生活。多多与人沟通，多多参加课外活动。爱自己，也要爱他人。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后，谢谢大家。认识你们，我倍感荣幸。&lt;/p&gt;
&lt;p&gt;“真是一群可爱的孩子，是吧？”&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;读书笔记&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;读书所思，从三体到休谟。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;以爱之名做蠢事 (2016-02-06)&lt;/h3&gt;
&lt;p&gt;用了一周时间看完了《三体》，有很多话想写，粗中带细的史强、屌丝崛起的罗辑、牛逼哄哄的章政委，每一个人物都是这样的真实而富有个性……但真正想写的时候，却不知从何说起，那么就简单说说最后一部的主角——程心吧。&lt;/p&gt;
&lt;p&gt;一个善良的蠢人。&lt;/p&gt;
&lt;p&gt;一个用“道德”绑架自己的“圣母”。&lt;/p&gt;
&lt;p&gt;一个用“责任”毁灭宇宙的“死神”。&lt;/p&gt;
&lt;p&gt;看了各平台的读后感与书评，对程心的评价感觉没有说到点子上。甚至有相当一部分评论没有看到程心背后的东西，“被道德推上制高点的可怜人”？“单纯而又善良的女孩”？&lt;/p&gt;
&lt;p&gt;好吧。其实，最开始在云天明临死前的描述中，我也以为她是这样一个好女孩。但是，在她在云天明安乐死前出现的那一刻，将爱她的人从天堂推向地狱，她自称那时没有多想什么。&lt;/p&gt;
&lt;p&gt;我信了。云天明也认了。&lt;/p&gt;
&lt;p&gt;她或许就是这么单纯的吧。仅仅是好心，不小心做错了事而已。&lt;/p&gt;
&lt;p&gt;真的吗？再读第二次，看到这么戏剧性的剧情，我不禁感到可悲。如果真的是好心，为什么不能真正从他人的角度去考虑？为什么不给云天明拒绝的余地，直接以“人类兴旺”这个道德至高点的“威胁”他。&lt;/p&gt;
&lt;p&gt;真的是好心吗？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“他以为给了所爱的人一颗星星那人就爱他了？就流着圣洁的眼泪飞越大洋来救他了？多美的童话。”&lt;/p&gt;
&lt;p&gt;“看她圣洁的庄严，看她殷切的期待，她在为人类文明而战，她在保卫地球……周围怎么是这样，看这束夕阳透进窗里的余晖，投在白墙上如一摊肮脏的血；外面孤独的橡树，不过是坟墓中伸出的枯骨……”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;竞选执剑人的时候，没有从自己的能力考虑，抱一抱孩子，觉得自己是圣母，众人推举，理应承受这一切，于是就当了。&lt;/p&gt;
&lt;p&gt;没有真正的考虑过责任，没有真正的考虑过后果。&lt;/p&gt;
&lt;p&gt;罗辑交剑之时，就知道自己一生的努力都要毁在这个女人的手里。但是他知道一切都没有意义，错的不是她，是这个世界。&lt;/p&gt;
&lt;p&gt;第一次选择，因为自己的善良，差点毁灭了地球。&lt;/p&gt;
&lt;p&gt;她因此自责，而双目失明。&lt;/p&gt;
&lt;p&gt;众人也因此同情她，没有更多的责备。甚至智子也对她说：* “不必自责，事实是：人们选择了你，也就选择了这个结局。全人类里面，就你一个是无辜的。” *&lt;/p&gt;
&lt;p&gt;于是，* “智子的话让程心的心动了一下。她井没有为此感到安慰，但不得不承认这个美丽的魔鬼有种穿透心灵的力量。” *&lt;/p&gt;
&lt;p&gt;什么是“穿透心灵的力量”？&lt;/p&gt;
&lt;p&gt;恐怕，此刻，潜意识里就将自己的这次错误归因到了“人类”上——* “谁叫你们选择了我，错的不是我，是世界。” *&lt;/p&gt;
&lt;p&gt;当那次假警报来的时候，什么都没有考虑，直接就跑。还是好闺蜜AA想到了要带枪。跑到一半，看到一群小孩，就说要全部带上。没有问过AA的意见，甚至也不知道船上能坐几个人，就执意要带上他们。多么慈爱啊！&lt;/p&gt;
&lt;p&gt;作为星环集团总裁，她对集团一无所知，既不参与研究，又不参与运行。只知道关键时刻拿总裁身份命令自己的朋友，而这位朋友正在努力为她争取一个生存的机会。&lt;/p&gt;
&lt;p&gt;虽然整个故事里都把她描写的多善良多慈悲，但是在二向铂来了的时候，她也没把船上的位置让给那些小学生，而是自己占了个位置跑了，那时候的她对人类来说已经没有价值，却也不肯牺牲自己。&lt;/p&gt;
&lt;p&gt;第二次选择，没有相信维德，强制终止他们的抵抗运动，终止了光速飞船，也导致了太阳系的灭亡。&lt;/p&gt;
&lt;p&gt;我看到这里的时候，真得想撕书。&lt;/p&gt;
&lt;p&gt;谁开始说“只有光速飞船才能让人成为大写的人”？&lt;/p&gt;
&lt;p&gt;当一群真正的大写的人站在你面前的时候，当他们准备赴死抵抗的时候，当他们就要造出飞船的时候，谁又剥夺了他们炙热的心！&lt;/p&gt;
&lt;p&gt;表面上看，避免了一场可能发生的战争。&lt;/p&gt;
&lt;p&gt;表面上看，为了世界和平。&lt;/p&gt;
&lt;p&gt;多么善良，多么富有责任感的一个人啊！&lt;/p&gt;
&lt;p&gt;维德，那个如法西斯一般疯狂的人，在此刻，目光也暗淡了。他终于明白了，自己一辈子的努力，全没了。这个世界也完蛋了。他明白了，“带4个猪队友准备20投”是什么感觉。&lt;/p&gt;
&lt;p&gt;轻轻的一句话，六十年的努力化为泡影。&lt;/p&gt;
&lt;p&gt;轻轻的一句话，一群铁血战士全被处死。&lt;/p&gt;
&lt;p&gt;而此刻的程心，自我感觉良好。帮政府避免了一场战争，马上又要被万人顶礼膜拜了，为了不要人崇拜自己，我还是冬眠去吧。&lt;/p&gt;
&lt;p&gt;其实，只是在逃避现实而已。&lt;/p&gt;
&lt;p&gt;自己在最关键的一场谈话里什么都没做。哦不，只是说了三句话，导致亮了三次黄灯，然后记一下云天明的童话故事而已。自己不是救世主。什么也不是啊。&lt;/p&gt;
&lt;p&gt;当太阳系毁灭之时，罗辑最后也只是对她说：* “孩子，看看你都干了什么。” *&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“她两次处于仅次于上帝的位置上，却两次以爱的名义把世界推向深渊，而这一次已没人能为她挽回。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;好的，我看到这里时有些高兴，程心终于是意识到了自己的问题。 但是接下来的话让我如鲠在喉。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“她开始恨一个人，这人就是维德，她恨他竟然遵守了诺言。为什么遵守？男人的尊严，还是为了她？”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;为什么最后的最后，还是要如此推卸责任？&lt;/p&gt;
&lt;p&gt;最开始的时候，是谁说要相信维德？&lt;/p&gt;
&lt;p&gt;童话里那个公主说的就是你啊，为什么不能自己撑伞，为什么不能将权利让出？&lt;/p&gt;
&lt;p&gt;人类末日的时候想到两个的朋友，就放弃了自杀。单纯的认为“活着就是赎罪”。当自己沦落为流浪者的时候，还自我感觉良好，要求智子救自己的朋友。&lt;/p&gt;
&lt;p&gt;全人类的生死在你手上，自己都不在乎。最后只要保和自己关系最亲近的人。我不知道，智子听到这话心里作何感想？——虫子终究是虫子。&lt;/p&gt;
&lt;p&gt;第三次选择，直接毁灭了宇宙。&lt;/p&gt;
&lt;p&gt;自己明明什么都可以放弃，为什么要留家里的五公斤装饰品？为什么要私下揣测别人的想法？认为别人不会全部归还宇宙质量？于是自己也不全部归还，还认为，这样做没什么大不了的。前脚刚说完“如果每个小宇宙的人都这么想，那大宇宙肯定死定了。”，后脚就问“还可以再留下五公斤吗”。&lt;/p&gt;
&lt;p&gt;坐光速飞船逃亡的时候，到最后才想到去云天明送给自己的星星那。不是说会一生牵挂吗？为什么最后躲进了关一帆的胸膛？&lt;/p&gt;
&lt;p&gt;逃亡之时，一度惜命，认为自己死了就是死了人类的一半。&lt;/p&gt;
&lt;p&gt;好吧。&lt;/p&gt;
&lt;p&gt;用善良绑架自己，自己却无法做到善良。&lt;/p&gt;
&lt;p&gt;比较讽刺的是，自传的终章是《责任的阶梯》。&lt;/p&gt;
&lt;p&gt;其实，只是一直拿责任当借口，拿善良当理由，随心所欲为所欲为罢了。做任何事都有一个冠冕堂皇的理由，看似善良，实则没有任何责任心和底线。&lt;/p&gt;
&lt;p&gt;可笑。可悲。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我们允许善良，我们也允许愚蠢。但我们不允许善良和愚蠢同时出现在同一个人身上。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;但实际上，我们身边充斥着这种愚蠢的善良。看看时不时出现的那些舆论热点事件就知道，有多少人为了“同情弱者”，为了一副图片一段煽情文字，就可以不要思考不要事实不要权衡地冲上去贩卖情怀啊~&lt;/p&gt;
&lt;p&gt;确实，程心是人类全体的选择，她的出现是必然的，她只不过是全人类心理的映射。就算没有程心，也会有张心、王心、李心出现。&lt;/p&gt;
&lt;p&gt;平心而论，一个拥有大爱的人远远不会像程心那样愚蠢肤浅，维德才是拥有大爱的人。我不认为博爱的人会是软弱的，程心并不是圣母，她不过自以为是圣母罢了。&lt;/p&gt;
&lt;p&gt;最后以维德的一句话结尾—— &lt;strong&gt;“失去人性，失去很多；失去兽性，失去一切。”&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;论样本与因果律的脆弱性 (2016-04-04)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;——读《统计陷阱》有感&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一拿到这本书，给我的感觉就一个字——薄，确实如此一共才70页，分为10章，为总分式结构，前九章具体分析，最后一章总结。大体来说，书中举了很多事例也有很多形象的插画，所以我读起来觉得没有什么难以理解的地方。下面具体说说我对《统计陷阱》的理解。&lt;/p&gt;
&lt;p&gt;整本书所说的陷阱其实就是围绕 “样本” 来讲的，分为两个方面，“样本的来源”（也称抽样）与 “样本的表现” 。&lt;/p&gt;
&lt;h4&gt;样本的来源&lt;/h4&gt;
&lt;p&gt;先说样本的来源。确实，大部分统计的核心就是抽样。一个以抽样为基础的报告如果要有价值，就必须使用具有代表性的样本，这种样本排除了各种误差。忽视抽样所隐含的误差将导致一些愚蠢的举动。人们有时会为了一个数学上可论证却小得没有意义的差别费尽力气。这种行为是对这句古训的藐视：&lt;strong&gt;“只有当差别有意义时才能称之为差别。”&lt;/strong&gt; 这句古训也应该辩证的去看待。&lt;/p&gt;
&lt;p&gt;以下的话我觉得可以作为整本书识别“陷阱”的核心—— “样本有偏的趋势可以自动地操纵结果,使其变得扭曲。无形的误差与有形的误差一样容易破坏样本的可信度。也就是说，即使你找不到任何破坏性的误差来源，但只要有产生误差的可能性，你就有必要对结果保留一定的怀疑。” 这以后用到辩论中必定也是很有价值的，肯定有很多同学发现了。样本的来源必须提供足够多的信息才有说服力，比如说“显著性程度”什么的，对比的对象，样本的数量与区别，等等。&lt;/p&gt;
&lt;h4&gt;样本的表现&lt;/h4&gt;
&lt;p&gt;再说样本的表现，就是各种视觉上有误导的图像表现，不能说是错误的，只能说是不恰当的表现形式。并不是所有的统计都是绝对的，将“正常的”与“期望的”混为一谈导致事情变得更糟。这也是一点需要注意的。&lt;/p&gt;
&lt;p&gt;“如果你想证明某事,却发现没有能力办到，那么试着解释其他事情并假装它们是一回事。在统计资料与人类思维冲撞所引起的耀眼光芒中，几乎没有人会发现它们的区别。不相匹配的数据是保证你处在有利位置上的武器，而且通常如此。”这也是表现误区的一种。&lt;/p&gt;
&lt;h4&gt;相关关系与因果关系&lt;/h4&gt;
&lt;p&gt;最后，也是最重要的，谈谈我对这本书影响最深刻的部分，也是我认为最有价值的地方——“相关关系与因果关系”。先复制书上几句话来凑凑字数——“但这是一个古老的谬误，然而它仍频繁地出现在统计资料中，并被大量让人印象深刻的数据所伪装。这个谬误是：如果 B 紧跟着 A 出现，那么 A 一定导致 B。然而,更大的可能性是两个周素并不互为因果，而同为第三个因素的产物”。之所以说它好，是因为它使我联想到了休谟的怀疑论——一个打破了因果关系的思想，曾一度导致建立于因果律之上的科学世界濒临破产。&lt;strong&gt;毕竟他揭穿了科学知识的因果关系不过是我们习惯性的联想，等于说是抽掉了构成知识最重要的因果律，科学知识不再具有先天普遍性的必然性。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;太阳出来了，地上的石头发热了。很多人理所应当（注意，是理所应当）地认为，石头发热是阳光照射所导致的。因为太阳出来了，所以石头发热。很明显的因果关系。虽然我们能观察到一件事物随著另一件事物而来，我们并不能观察到任何两件事物之间的关联。&lt;/p&gt;
&lt;p&gt;所以休谟说：“我们无从得知因果之间的关系，只能得知某些事物总是会连结在一起，而这些事物在过去的经验里又是从不曾分开过的。我们并不能看透连结这些事物背后的理性为何，我们只能观察到这些事物的本身，并且发现这些事物总是透过一种经常的连结而被我们在想像中归类。”也因此我们不能说一件事物造就了另一件事物，我们所知道的只是一件事物跟另一件事物可能有所关连。&lt;/p&gt;
&lt;p&gt;这里，我再举一个例子来解释一下这段话（例子来自于知乎），&lt;code&gt;碳酸钠+盐酸 = 氯化钠+二氧化碳&lt;/code&gt;这一因果关系，最初必然来自于经验。假设一个人完全没有关于实验结果的经验，并且没有任何相关的化学知识，他必然没有办法从 &lt;code&gt;碳酸钠+盐酸&lt;/code&gt; 这一原因依据任何先验法则推论出 &lt;code&gt;氯化钠+二氧化碳&lt;/code&gt; 这一结果。原因中并不天然地包含着结果，在没有经验的情况下，从一个事物中产生任何事物都是可想象的，并没有办法说一定会产生出某一特定事物（无法从作为原因的事物中运用理性推论出作为结果的事物）。我们只有依赖经验才能发见这种事物间的联系。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;因此，因果关系的基础是经验。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们总是经验到 &lt;code&gt;碳酸钠+盐酸 = 氯化钠+二氧化碳&lt;/code&gt; 这一事实（它们总是相伴出现），&lt;code&gt;碳酸钠+盐酸&lt;/code&gt;在前，而&lt;code&gt;氯化钠+二氧化碳&lt;/code&gt;在后，于是我们就把 &lt;code&gt;碳酸钠+盐酸&lt;/code&gt; 看作产生 &lt;code&gt;氯化钠+二氧化碳&lt;/code&gt; 的原因。更一般的情况是，甲和乙总是先后出现，甲的后面总是伴随着乙，我们便把甲当作乙的原因。除此之外，我们无法知道甲和乙具有的更深层次的联系（如果我们真的知道些什么，那么在经验之先我们就能判断将会发生什么）。&lt;strong&gt;到目前为止则可以说明，我们只是用因果关系来描述相伴出现的经验事实。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;因果关系基于经验，但只是一时一地的经验（只对发生过的事实有权发言），而&lt;strong&gt;要想对未来做出预测，就要基于归纳原理&lt;/strong&gt;。即，过去甲和乙总是先后出现，甲的后面总是伴随着乙，所以我们判断未来甲的后面一定有乙（过去总是&lt;code&gt;碳酸钠+盐酸 = 氯化钠+二氧化碳&lt;/code&gt;，未来也一定是这样）。&lt;/p&gt;
&lt;p&gt;但可惜的是，归纳原理我们无法证成它，即无法说明未来必定与过去相似（可能性之一是，也许有一天，自然的法则会改变，没有任何理由可以说明宇宙以后一定也是这个样子）。我们没有绝对的理由证明归纳原理一定是正确的。&lt;/p&gt;
&lt;p&gt;因为归纳原理可能是错误的，导致因果关系无法向未来、类似的事物推广，&lt;code&gt;碳酸钠+盐酸 = 氯化钠+二氧化碳&lt;/code&gt; 并不一定总是正确的。过去是1000亿次是这样，但未来1000亿+1次未必还是这样（试想，应该如何论证，未来1000亿+1次结果仍相同）。另外，我们没有掌握任何实质性的规律，我们只是对事实进行了描述，把一方设定成原因，一方设定成结果。我们不能说它是错的，但是它一定不是肯定正确的。&lt;/p&gt;
&lt;p&gt;人类有依赖因果关系的本能，这种本能则是来自我们神经系统中所养成的习惯，长期下来我们便无法移除这种习惯，但我们并没有任何论点、也不能以演绎或归纳来证明这种习惯是正确的，就好像我们对于世界以外的地方一无所知一样。就像罗素在《西方哲学史》序言所说——“人为万物立法”，中国古代大儒所言—— “为天地立心”，恐怕也是如此吧！&lt;/p&gt;
&lt;p&gt;一句句 “因为”、“所以” 说的理所当然，究其根本是没有关心其联结，如果硬是要说感官经验使然，习惯期待为之，这套怀疑论是无法辩倒的。因此，怀疑者顶好是守住自己的范围，并且发挥出由较深奥的研究而发生的那些哲学的反驳。在这里，他似乎有充分取胜的地方，他可以合理地主张说，在存在于记忆证据或感官证据以外的任何事实方面，我们的全部证明都是由因果关系来的；他可以合理地主张说，我们对于这种关系并没有别的观念，我们只是对恒常在一块会合着的两个物象有一种观念；他可以合理地主张说，我们并没有什么充分的论证可以使我们相信，我们经验到常在一块会合着的那些物象，在别的例证下，也照样会合在一块；他还可以合理地主张说，除了习惯或我们天性中一种本能以外，并没有别的情节可以使我们得到这种推测，这种本能自然是难以反抗的，不过它也和别的一些本能一样，也可以是错误的、骗人的。一个怀疑家如果坚持这些论点，那他就充分表现出他的力量来，或者可以说，表现出他自己以及我们全人类的弱点来，而且他就似乎（至少在当下）消灭了一切信念和确信。&lt;/p&gt;
&lt;p&gt;最后康德用先天范畴很巧妙的绕过了这个问题，这里就不再说了。但是很多思考方式还是值得我们深思的⋯⋯&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=2015-2016-essays&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>essays</category></item><item><title>2025，全新旅途</title><link>https://ursb.me/posts/summary-2025/</link><guid isPermaLink="true">https://ursb.me/posts/summary-2025/</guid><description>记录2025年移居新加坡后的生活与工作变化：MoFlow进入维护模式、加入TikTok业务并首次带团队、经历肾结石重症就医，以及Tana、NotebookLM、Claude Code、OpenClaw等AI工具构建的学习与自动化体系。</description><pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;自写年终总结以来，已是第八个年头，我离开了一直以来生活的城市，来到未知的国度。2024 年破碎之后的虚无感逐渐消散，取而代之的，是一种由一个个具体人和事搭建起来的、粗糙但坚实的秩序。&lt;/p&gt;
&lt;h2&gt;工作&lt;/h2&gt;
&lt;h3&gt;创业&lt;/h3&gt;
&lt;p&gt;MoFlow 在产品思考上过于稚嫩与理想，导致其无法承载风险和调整。在年初受到苹果审查，导致软件 3 个多月无法发版，即便发现 Bug 也无法更新，做好了的迭代特性被一个个堆积在发布队列里，这对一个初生的产品而言是致命的，而我却无能为力。&lt;/p&gt;
&lt;p&gt;最终在开发了一版 LLM 长期记忆的技术更新之后，我们选择了进入长期维护模式。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/IMG_9468.png&quot; alt=&quot;&quot; /&gt;坚持写到现在的 MoFlow我很庆幸自己在合适的时机去做了 MoFlow，这让我在这一波 AI 浪潮中始终走在一线。而通过这个情感疗愈项目，我也意识到：AI 在飞速迭代，但那些无法被算法量化的——譬如人与人之间的交浅言深、深夜里突如其来的共鸣——才是我们作为碳基生物最珍贵的特权。&lt;/p&gt;
&lt;h3&gt;面试&lt;/h3&gt;
&lt;p&gt;在&lt;a href=&quot;https://blog.ursb.me/posts/weekly-29/&quot;&gt;《月刊（第29期）》：新生活&lt;/a&gt; 提及到，我在 2-3 月参与了几个面试，体感上市场上的就业机会相比于我刚毕业那会确实少了一些，但只要能力匹配，还是能找到一些满意的工作。但我想趁着这次机会去海外看看，所幸自己抓住了这次机会。&lt;/p&gt;
&lt;h3&gt;新工作&lt;/h3&gt;
&lt;p&gt;这一部分因为合规原因不会表达太多，目前在一个 TikTok 快速增长的业务里，因为其纯理性决策的方式，我可以学习并积累到不少业务认知。在这里我有海量的知识可以去学，这个过程中我又体验到了知识灌进脑海里的爽感。&lt;/p&gt;
&lt;p&gt;另外一个变化是，我开始带人了。过去的工作里我的主要定位是作为技术专家的 IC，在 IC 转型 POC 的过程中遇到了不少困难，在这个过程中我很感恩我的 Leader，毫不客气地说，就是他用了几个月的时间手把手来培养我 Landing。但我骨子里还是很喜欢 Coding，所以基本上也每次都会给自己排一些一线的需求。&lt;/p&gt;
&lt;p&gt;核心在于有效沟通，这需要定期探询，去挖掘每个人、每件事背后的核心需求。&lt;/p&gt;
&lt;p&gt;其次是培养信任感，避免始终靠自己救火，而应该适当放权、去大胆且细心地去做针对性地培养 —— 无论是哪个文化下，这一点都是一样的。&lt;/p&gt;
&lt;p&gt;关于沟通想顺便分享一下“探询模型”，它等于：&lt;em&gt;&lt;strong&gt;(可信度 * 可靠度 * 亲密度) / 个人意图&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;那么，提高沟通成功率的因子就在于这几点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提升可信度&lt;/strong&gt;（专业懂行）：用专业判断与事实说话，先做功课，靠的就是自身技术和业务能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提升可靠度&lt;/strong&gt;（做事靠谱）：及时回应、解决问题，让对方觉得可依靠。这部分靠的是日常表现和信任积累。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;增加亲密度&lt;/strong&gt;（关系融洽）：日常关系，可以多聊工作之外的话题。营造温暖、平等的氛围。这部分靠的是自身对他人的关照，以及体贴的性格。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;降低功利性&lt;/strong&gt;（个人意图）：沟通开场先说明正向意图，少夹带个人得失，避免被解读为利用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;每次通过自己的沟通扭转进程、疏通阻塞点，这会让我有种莫名的成就感，也是以往工作里未曾体验到的。&lt;/p&gt;
&lt;p&gt;而来到这个业务之后，每天总是很忙。我之前在做 IC 的时候，总会把项目和自己时间安排地井井有条。但合作方变多之后，变化总是多于计划的，甚至——事情是做不完的——这个就是真理。那就会考验两点能力：&lt;strong&gt;专注力&lt;/strong&gt;与&lt;strong&gt;判断力&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;先说专注力。其实刚来的很长一段时间内，我的 Todoist 列表里是无限的事情，这会让我感觉到一种 overwhelm 的焦虑感。而对抗焦虑最好的武器，我以前一直以为是具体，即把每个事规划好再去执行就可以。但如果这样的话，那些关于未来的、庞大而模糊的焦虑往往在执行前就会压垮自己 —— 比如会始终会像着下一步要做什么，两个小时后有什么安排，正是这些琐碎的具体让此刻的自己陷入焦虑。&lt;/p&gt;
&lt;p&gt;后来我就不再使用 Todoist 的 Upcoming 视图了，只专注当下的事情，把除此之外的一切抛之脑后，我才真正感觉到了双脚踩在大地上的实感。&lt;/p&gt;
&lt;p&gt;另外是判断力。除了是自己手上事情优先级的判断，更多地要判断这件事是否要做、怎么做、能带来多大的收益。因为无论如何，资源始终是有限的，如何用有限的资源带来更大的业务收益，这对判断力的要求更高。&lt;/p&gt;
&lt;h2&gt;生活&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/photo_2026-02-15_21-36-30.jpg&quot; alt=&quot;&quot; /&gt;NotebookLM 基于我的日记生成的图片&lt;/p&gt;
&lt;h3&gt;新加坡&lt;/h3&gt;
&lt;p&gt;这一年，我迁徙到了赤道。这是一个很小的国家，开车横穿东西两极只需要 40 分钟。物理坐标的移动似乎也拉扯了心理的时钟——在这里，没有四季的更替来提醒你时间的流逝，只有永恒的盛夏，迫使你直面每一个赤裸的当下。&lt;/p&gt;
&lt;p&gt;生活成本陡然增高，收入的新币需要当人民币去花，与此同时还要全额缴纳中国大陆的税 —— 从性价比的角度而言这显然是不值得当的，但我依然决心出海看看。如果说以前去远方是为了逃避当下的疲惫，那现在生活在别处，则是为了重新测量世界的纹理。&lt;/p&gt;
&lt;p&gt;所幸饮食和气候还算习惯，与深圳差异不算大。关于衣食住行的开销，本篇就不再列举了，如果有机会以后单独在月刊里总结。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/8fc513d2e94deebacc3cebab7a79a581.jpeg&quot; alt=&quot;&quot; /&gt;国庆军演&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/image.png&quot; alt=&quot;&quot; /&gt;夜景
&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/image%201.png&quot; alt=&quot;&quot; /&gt;市中心的教堂&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/image%202.png&quot; alt=&quot;&quot; /&gt;圣淘沙&lt;/p&gt;
&lt;h3&gt;旅游&lt;/h3&gt;
&lt;p&gt;4月，去了苏州。&lt;/p&gt;
&lt;p&gt;10 月，去了印尼、马来、澳门（&lt;a href=&quot;https://blog.ursb.me/posts/weekly-33&quot;&gt;《月刊（第33期）》：推理阶梯&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/image%203.jpg&quot; alt=&quot;&quot; /&gt;印尼海岛的日出&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/IMG_9474.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/image%204.jpg&quot; alt=&quot;&quot; /&gt;澳门的一个街角&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/image%205.jpg&quot; alt=&quot;&quot; /&gt;澳门商场的富丽堂皇&lt;/p&gt;
&lt;h3&gt;生病&lt;/h3&gt;
&lt;p&gt;过去一个月被肾结石折腾的很惨。一块肾结石 7mm 堵住了输尿管，第一次去诊所被误诊成胃炎。吃了三天药不好，第四天凌晨异常疼，去复诊还是没查出来。于是去医院拍 CT 并做血常规。这个基础的检查，花了 2300 SGD，折合1.5万 CNY。确诊肾结石后就安排了体外碎石，但未曾想后续尽是波折，大大小小的手术做了 4 场。&lt;/p&gt;
&lt;p&gt;第一次：超声波碎石。失败，感染住院。&lt;/p&gt;
&lt;p&gt;第二次：全麻，支架植入治疗。感染缓解。&lt;/p&gt;
&lt;p&gt;第三次：全麻，RIRS 碎石取石。&lt;/p&gt;
&lt;p&gt;第四次：局麻，取出埋在体内的支架。&lt;/p&gt;
&lt;p&gt;这一套总花费 6 万多 SGD（折合 30 万+CNY）。不过不得不说，私立医院的服务还是挺好的，住院病房整的和酒店差不多，病号餐也有很多美食可以选。幸好公司购买的保险可以全额报销。但如果是国内的话，三甲医院也可以在 1 万 CNY 以内解决。&lt;/p&gt;
&lt;h2&gt;学习&lt;/h2&gt;
&lt;h3&gt;阅读流&lt;/h3&gt;
&lt;p&gt;在 &lt;a href=&quot;https://blog.ursb.me/posts/weekly-31&quot;&gt;《月刊（第31期）》：基于 Claude 的阅读流&lt;/a&gt; 有介绍过这块内容，这里想做些补充。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tana&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;之前有提到过我使用的笔记软件是 Tana +Heptabase，但在 AI 时代下，我基本上只使用 Tana了。我有几个结合 AI 的高效用法可以分享：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;使用自定义的 AI Command 进行扩展探索&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如下面这个我发在小红书上的图文，就是简单写了一句话：“为什么小红书在纠结于商业化广告和电商之间的取舍？”之后点击我定义的 AI Command，让 Gemini Pro 基于这个文本进行探索，探索完之后再调用另一个 AI Command 使用 Nano Banana 生图。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/2046.jpg&quot; alt=&quot;&quot; /&gt;Tana 生成的小红书图片&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/photo_2026-02-15_21-59-31.jpg&quot; alt=&quot;&quot; /&gt;
这套方法可以用于任意主题的深度研究和输出，产出的图片也很直观讨喜。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bookmark 自动总结生图&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我简单做了个 Workflow，看到某个网页之后我点击保存到 Raindrop，这个时候会触发 IFTTT 的 Webhook 调用 Tana 的 Input API，将网页链接打上特定的 supertag(如#link) 保存到 Today 里。&lt;/p&gt;
&lt;p&gt;在 #link 中配置了新增节点时，会针对这个链接自动调用自定义的 AI Command，而这个 AI Command 可以 Fetch 对应链接的网页内容，并配合自定义的文章解读 Prompt 进行文章总结和反思，最后调用 Nano Banana 生图。&lt;/p&gt;
&lt;p&gt;整套流程非常丝滑，且因为早鸟用户的关系，订阅费也不贵。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;无限递归的深入探索&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我做了个 #question 的 supertag，里面有两个 AI 字段，一个是深度总结、另一个是哲学反思。遇到问题时我先记录到 Tana 里，但不会立刻调用这两个 AI 字段，而是自己去思考或检索资料去补齐我认为的解答（我认为这一步是必不可少的，详情见&lt;a href=&quot;https://blog.ursb.me/posts/weekly-31&quot;&gt;《月刊（第31期）》：基于 Claude 的阅读流&lt;/a&gt;）。补齐自己的答案之后，我再点击 AI 字段让它输出深度总结和哲学反思，让 AI 反向为我补齐我对这个问题缺失的认知。&lt;/p&gt;
&lt;p&gt;那么接下来，有意思的就来了，因为所有的句子在 Tana 里都是一个单独的节点，这意味着我可以针对 AI 深度总结或者哲学反思的某句话，再打上 #question 的 supertag，无限地、递归地去探索这个问题。这套方法在深度研究时非常有用，可以帮助自己对某个知识体系建立非常深且牢固的认知。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;结合 OpenClaw 调用和保存&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;前几天 Tana 推出了 MCP，现在不仅仅可以 Input，更可以对 Tana 空间进行 CURD 了，那可玩性就大多了。比如我让 OpenClaw 自己写了个 Tana skill，当我在 TG 里和 OpenClaw 聊到比较有意思的话题时，我可以让它检索或保存到 Tana 里。&lt;/p&gt;
&lt;p&gt;AI 时代的笔记本身也适合碎片笔记，但偶尔的总结与沉淀用来锻炼自己的组织和表达能力也是必不可少的，这个时候还是会用我之前的 Heptabase，这款软件之前介绍过，这里就不赘述了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NotebookLM&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;用了一年多，主要用来深度检索，比如遇到某个问题直接让 NotebookLM 自己补齐材料，然后点击生成 PPT，让自己通过这个 PPT 快速了解这个领域的 Outline，根据知识点快速建立其一个初步的框架。‘&lt;/p&gt;
&lt;p&gt;一旦建立了框架，深入学习时的提问就有了方向。后续如果要回到 Tana 进行无限递归的深入探索，学会高效地去提问是很重要的，这样 #question supertag 反哺给自己的信息密度才够高。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;YouMind&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;玉伯的作品，优势是在国内环境里可以较为方便的采集 Bilibili、Youtube、微信公众号，不需要自己再折腾刚才我提到的大部分工作流，适合小白入门做资料管理。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/image%206.png&quot; alt=&quot;&quot; /&gt;我的 YouMind 看板&lt;/p&gt;
&lt;h3&gt;AI&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;25 年年中的时候开始用 Claude Code，用朋友 200 美元的套餐，编码基本离不开了。CLI 工具天然有着最齐全的权限和上下文信息，所以除了 AI Coding，在 CLI 场景下还可以定制很多有意思的事情。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AnyGen&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 Manus 被 Meta 收购的周末，字节就放出了 AnyGen。其实这套工具在内部跑了快一年，口碑很不错，体验上也与 Manus 和一众类 Manus 的产品（Flowith、Fellou 等） 不分伯仲。因此在 AnyGen 发布之后立马注册了，目前主要跑一些定时任务。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hapi&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 Crawdbot 之前，我自己主要用 Hapi 控制 Mac Mini 上的 Claude Code 干活。也体验过 Happy 和 Droid 这些方案，但用了一圈下来还是 Hapi 最方便。&lt;/p&gt;
&lt;p&gt;我可以在搭地铁的时候，通过部署在 MacMini 公网端口 Hapi 代理操作 Claude Code，让它 Vibe Coding、让它获取日程、规划 Todoist。&lt;/p&gt;
&lt;p&gt;原本以为这套方案我可以用很久，直到那只龙虾的出现。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;关注到 Clawdbot 是在中文圈大火之前，但私以为只是交互方式的更变本质上并不能替代我自建的这套方案。但体验之后才发现我完全错了，能用到好用，往往就差了那一步。OpenClaw 对每个 Agent 设定所划分的 AGENTS、SOUL、IDENTITY、TOOLS、USER、HEARTBEAT、BOOTSTARP，让 Agent 的性格设定、沟通方式可以按照用户诉求变得生灵活现，我想这也是 OpenClaw 能快速破圈的原因之一。&lt;/p&gt;
&lt;p&gt;我迁移到 Clawdbot 之后依然可以用我之前的阅读流、RSS 订阅、Google 日程和 Todoist 管理，这些都是比较常规的 Agent 用法了。&lt;/p&gt;
&lt;p&gt;接下来分享几个自己在 OpenClaw 的其他用法。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;复式记账&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;之前尝试过复式记账，但是需要在电脑上用 IDE 编辑 Beancount 的语法，根本坚持不下来。现在有了 OpenClaw，Beancount 这种非人类的记账方式恰恰是 AI friendly 的。海外信用卡是有邮件通知的，OpenClaw 配上邮件服务之后也可以实现自动记账。&lt;/p&gt;
&lt;p&gt;同样是股票追踪，也可以用 BeanCount 记录持仓，再让 OpenClaw 每天根据市场情况输出持仓日报，给出调仓建议，也是蛮有趣的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;身体数据&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Apple Watch 采集的身体数据用脚本每个小时发到指定的 iCloud 目录，再写一个身体数据的 skill，这样 OpenClaw 也就能够监控自己的身体情况并给出建议。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/IMG_9478.jpeg&quot; alt=&quot;&quot; /&gt;OpenClaw 汇报身体数据&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/photo_2026-02-15_21-55-45.jpg&quot; alt=&quot;&quot; /&gt;
&lt;strong&gt;多人公司&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;目前用了五个厂商的模型做了十个 Agent，拉到群聊里由主 Agent 调度，家里人也在群聊里可以一起在日常生活里使用，群聊因此有人气了很多：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/2030.jpg&quot; alt=&quot;&quot; /&gt;让群聊更活跃的 OpenClaw&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/2032.jpg&quot; alt=&quot;&quot; /&gt;让群聊更活跃的 OpenClaw
这些 Agent 部署在两个地方，Mac Mini 和 Railway，这样不仅可以互相修复，也能在突发情况下保持服务的稳定性。&lt;/p&gt;
&lt;p&gt;后续可能会把五个厂商压缩一下，体验了一些模型并不适合用来做 Agent。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;服务开发&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;用 LocalCan + ngrok 分配了 10 个对公网端口，并给每个端口绑上了域名。在群里和另一个研发指挥 Agent 编程，做完之后直接部署服务，代码一眼也不看，只看效果。这样当老板的感觉真的很爽 🤣。&lt;/p&gt;
&lt;p&gt;PS. 现在的 MoFlow 全是由 AI 在维护的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;YouMind 录入&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;对于一些没有 API 或者 MCP 的平台，如果想让 OpenClaw 对接，可以直接抓包写 Skill。比如现在看到某个文章，就直接丢群里让深度阅读 Agent 读一下，它觉得不错，就顺便帮忙保存到 YouMind 里。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/IMG_9479.jpeg&quot; alt=&quot;&quot; /&gt;MoFlow 群组里的云编程&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/IMG_9476.jpeg&quot; alt=&quot;&quot; /&gt;OpenClaw 保存到 YouMind&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;理财&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;其实 25 年机会挺多的，但因自己保守策略导致最终收益率不到 30%，私以为这个收益率是比较健康的，虽然不多，但从 2020 年开始一直都是盈利的。&lt;/p&gt;
&lt;p&gt;小小总结了一下我的几个原则：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;永远不买自己看不懂的股票&lt;/strong&gt;：要盘基本面，理解涨跌背后的逻辑链。理性建仓，交易之前把规划写下来（在 Google 文档上设计了个交易模板，有交易计划就复制一份填写），填好的止盈线、止损线、加仓减仓都按照计划执行—— 盘前设好策略单，盘中不盯盘，不做计划之外的操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;常年保持稳健低仓位&lt;/strong&gt;：确保有合适入场的时机不要错过，永远不上杠杆，也永远不做在压路机前捡硬币的行为（不要为了微薄的确定性收益，去承担隐形的毁灭性风险）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不把鸡蛋放在一个篮子里&lt;/strong&gt;：无论是仓位控制、证券账户、币种/基金/股票配置，都要坚守这个原则。例如如果买了科技股，那就对应补一点合适的蓝绸。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;好物&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;硬件&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ray-Ban Meta&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以录制视频和拍照，画质相当于 iPhone 12 的画质，日常使用是完全足够了。&lt;/p&gt;
&lt;p&gt;缺点是日常佩戴被人发现有摄像头会比较尴尬，需要付出额外的解释成本；且不防水，新加坡下雨天比较多的时候比较麻烦。&lt;/p&gt;
&lt;p&gt;目前眼镜电量也无法支撑正常使用完一天，音质也比较差，只是听个响而已。因此最近半年没有给它充电了，就当一个日常的眼镜在使用，我还是挺中意定制的蔡司镜片，防蓝光+自动变色帮助很大。&lt;/p&gt;
&lt;p&gt;最近预定了 Even G2，因为发现 MentraOS 以及 Even 有对应的接口可以接入 OpenClaw，等收到货了试试。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/image%207.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;韶音耳机&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;非常利好开会，算得上是今年最值单品。忙碌的时候每天 8-10 个视频会议，有时候还要线下双开，那么开放式耳机就很必要了，可以有效保护听力。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;三星 Z Fold 7&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;生态是自己设下的壁垒，克服之后能体验到更多新颖的玩意，三星系统的自定义程度非常高，这也意味着可玩性非常高。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Surface Pro 12&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了写文档和 Vibe Coding 入的，可以称得上是这个时代绝佳的 Vibe Coding 设备。虽然性能和屏幕很差，但起码是满血版的 PC 系统，这只能怪 iPad Pro 不争气。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;折叠自行车 + 滑板&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;新加坡出门主要靠 MRT 和公交，有了折叠自行车之后很方便，带上折叠车之后可以走遍整个国家。&lt;/p&gt;
&lt;p&gt;还顺便入了个滑板，摔了很多跤之后总算能简单代步了…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KODAK 拍立得+打印机&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;公司发的新年礼物，日常打印一些照片作为纪念还是挺有仪式感的。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;软件&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PeakWatch：在 Apple Watch 上量化出自己的身体能量，转成可视化的电量消耗，使用了一个季度发现挺准的。如果生病了，那身体电量恢复的就慢，上限就低且电量消耗得快；如果休息得好吃得好，电量就恢复得快。体感上这个数据还是挺准的。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/IMG_9473.png&quot; alt=&quot;&quot; /&gt;常规的能量消耗&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/IMG_9472.png&quot; alt=&quot;&quot; /&gt;生病情况下的能量消耗&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;MoneyWiz：目前没有发现替代品，除了常规的记账、预算、报告，还支持我最看重的多币种记账和股票追踪。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Typeless：Typeless 较 Wispr Flow、闪电说来说产品细节做得好，语音输入结合 AI 润色体验很丝滑。日常在和 AI 交流的时候措辞不需要那么精准，适合用语音输入。另外发现写日记这个场景也挺适合语音输入的。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;书影音&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;电影&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;F1 狂飙飞车：★★★★★，去影院看了两遍，剧情虽然老套的英雄故事，但音画沉浸感令人着迷。&lt;/li&gt;
&lt;li&gt;捕风追影：★★★★★&lt;/li&gt;
&lt;li&gt;疯狂动物城 2：★★★★★&lt;/li&gt;
&lt;li&gt;鬼灭之刃 无限城篇第一章：★★★★★&lt;/li&gt;
&lt;li&gt;One Battle After Another：★★★★☆&lt;/li&gt;
&lt;li&gt;翻译疑云：★★★★☆&lt;/li&gt;
&lt;li&gt;死神来了 6：★★★☆☆&lt;/li&gt;
&lt;li&gt;扬名立万：★★★☆☆&lt;/li&gt;
&lt;li&gt;Together：★★★☆☆&lt;/li&gt;
&lt;li&gt;诡异列车：★★★☆☆&lt;/li&gt;
&lt;li&gt;哭声：★★★☆☆&lt;/li&gt;
&lt;li&gt;神奇4侠：★★☆☆☆&lt;/li&gt;
&lt;li&gt;名侦探柯南：独眼的残像：★★☆☆☆&lt;/li&gt;
&lt;li&gt;非常宣言：★★☆☆☆&lt;/li&gt;
&lt;li&gt;巨洪：★☆☆☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;剧集&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;苦尽柑来遇见你：★★★★★，东亚人还挺吃苦难叙事这一套的。&lt;/li&gt;
&lt;li&gt;恶缘：★★★★★，原以为一集集是独立的小故事，未曾想串在一起之后组成了一个更大的恶缘之网，挺有意思的故事设计。&lt;/li&gt;
&lt;li&gt;万神殿：★★★★★&lt;/li&gt;
&lt;li&gt;All Her Fault：★★★★★&lt;/li&gt;
&lt;li&gt;咒术回战 死灭洄游篇：★★★★☆，作画有种艺术感，但总觉得和整体风格不太搭。&lt;/li&gt;
&lt;li&gt;棋士：★★★★☆&lt;/li&gt;
&lt;li&gt;不眠日：★★★☆☆&lt;/li&gt;
&lt;li&gt;扫毒风暴：★★★☆☆&lt;/li&gt;
&lt;li&gt;迷尸校园：★★★☆☆&lt;/li&gt;
&lt;li&gt;弥留之国的爱丽丝 第三季：★★★☆☆&lt;/li&gt;
&lt;li&gt;余生有涯：★★★☆☆&lt;/li&gt;
&lt;li&gt;赴山海：★★☆☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;漫画&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;咒术回战 modulo：★★★★☆，虎天帝太帅了！前作主角在续作就应该这么爽才对。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;书籍&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我可能错了：★★★★★&lt;/li&gt;
&lt;li&gt;余华文学课：★★★★★&lt;/li&gt;
&lt;li&gt;绝叫：★★★★☆&lt;/li&gt;
&lt;li&gt;少年巴比伦：★★★★☆&lt;/li&gt;
&lt;li&gt;麒麟之翼：★★★☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;游戏&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;哈迪斯 2：★★★★☆&lt;/li&gt;
&lt;li&gt;超级英雄派遣中心：★★★★☆，可惜结局仓促了，但也探索出了未来一种可能的剧集形式。&lt;/li&gt;
&lt;li&gt;暗黑破坏神 4：★★★★☆&lt;/li&gt;
&lt;li&gt;丝之歌：★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;写作&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-29/&quot;&gt;《月刊（第29期）》：新生活&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-30&quot;&gt;《月刊（第30期）》：写在 30 岁这天&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-31&quot;&gt;《月刊（第31期）》：基于 Claude 的阅读流&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-32&quot;&gt;《月刊（第32期）》：中大校友会的采访&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-33&quot;&gt;《月刊（第33期）》：推理阶梯&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/game-engine-renderer/&quot;&gt;《游戏组件的一生：从加载到上屏》&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;《有效沟通 SOP》（内网文章）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;新年目标&lt;/h2&gt;
&lt;p&gt;站在 30 岁的起点上，我并没有迎来预想中的恐慌。小时候觉得三十岁是遥不可及的彼岸，真到了这一天，才发现它不过是人生长河里，普通得不能再普通的一个周一。&lt;/p&gt;
&lt;p&gt;我不确定下一站去哪里，但我开始享受在路上的感觉。凡是我遇见的，我都喜欢；一切都被接受。从此，我自己便是方向。&lt;/p&gt;
&lt;p&gt;敬这趟全新的旅途，敬那些具体的焦虑。愿我们都能在不确定的世界里，守住确定的本心。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/image%208.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/05F2C1F8-B457-4774-96B5-36CDDFAF7E02.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=summary-2025&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>月刊（第33期）：推理阶梯</title><link>https://ursb.me/posts/weekly-33/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-33/</guid><description>介绍「推理阶梯」概念，剖析人类感知信息、赋予意义、形成信念直至采取行动的七个步骤及其局限，主张放低价值预设以更包容地体验世界，并附本期旅行与书影音记录。</description><pubDate>Sat, 15 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本篇是对二〇二五年九月至十月的记录与思考。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=KJLqOclPqis&quot;&gt;《Rethinking thinking》&lt;/a&gt;这个视频里介绍了「推理阶梯」这个概念，它较为详细地阐述了我们是如何处理在现实世界中感知的各种信息，分为以下七个步骤：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj33/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;原始数据：世界中的原始数据，以及我们感官对其接收到的感知信息。&lt;/li&gt;
&lt;li&gt;筛选信息：对于接收到的信息，我们会不自觉地使用注意力去筛选出特定的信息和细节。&lt;/li&gt;
&lt;li&gt;赋予意义：对于筛选后的信息，我们会去尝试解释信息所传达内容。&lt;/li&gt;
&lt;li&gt;形成假设：根据前一层创造的意义来发展假设，在这里事实和故事之间的区别开始变得模糊。&lt;/li&gt;
&lt;li&gt;得出结论：根据假设得出结论，我们的情绪反应也是在这个地方产生的。&lt;/li&gt;
&lt;li&gt;调整信念：根据当前的经验调整我们之前对周围世界的信念。&lt;/li&gt;
&lt;li&gt;采取行动：根据调整后的信念采取行动。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在这个阶梯的七个步骤其实每一步都存在着局限性，注定了我们无法直接感知真实。例如在原始数据这一层，人类感官的局限性决定了不可能接收到全貌信息，且接受到的信息也不能够反映客观。&lt;/p&gt;
&lt;p&gt;本福特定律揭示了在很多自然产生的数据里，数值的分布更接近按对数分布而不是按均匀分布。大量真实世界数据不是线性增长，现实世界的数据常常跨越多个数量级。为了适应这一现象，生物的神经系统也进化为对数型编码，以便大脑能够以信息量最大化感知信息。这也就是魏伯–费希纳定律——人类的感知系统对外界刺激的敏感度按比例变化。我们感知到的，是感官与大脑共同构建的替代物，而非真实本身。&lt;/p&gt;
&lt;p&gt;对此，津巴多在《普通心理学》写到：“知觉赋予感觉以意义，因此知觉产生的是对世界的解释，而不是对世界的完美表征。”知识并非只是信息，而是在个体的认知模型在与环境不断冲突中辩证产生的解释。我们对人生的认知都是经这些意义和观点过滤后的产物。因此，我们并不活在现实里，而是活在对现实的感知里。&lt;/p&gt;
&lt;p&gt;大脑追求的不是真理，而是可依赖的稳定模型。为了生存，大脑必须依赖模型，因此会竭力维护自己所信的模型。&lt;/p&gt;
&lt;p&gt;固化的信念让我们不假思索地依靠「系统 1」去做出更节能的判断，这个时候不妨停下来思考一下自己得出这个结论的推理阶梯的每一层是什么，是否存在更高的维度去看待这件事情，让「系统 2」发挥一下作用，往往能更加客观地理清思路。&lt;/p&gt;
&lt;p&gt;我们心中一个概念的形成，是由无数个视域融合后的结果。若我们的立足点越高，自身的历史视野、文化视野就越是开阔，越能够按照大和小、远和近去正确评价视野所及的范围内一切事物的意义。&lt;/p&gt;
&lt;p&gt;但我们也必须要知道，我们只能不断去逼近真实本身，而非抵达它，因此对于不同观点需要抱有谦卑地心态去接纳与理解。&lt;/p&gt;
&lt;p&gt;在之前的&lt;a href=&quot;https://blog.ursb.me/posts/life/&quot;&gt;《谈谈存在的价值与人生体验》&lt;/a&gt;一文中也提到过这个观点 —— 这个真实世界是复杂多元的，仅仅去做你认为「有价值」的事情是非常片面的，也是遗憾的，因为那样会错过生活中很多圆润的、尖锐的、小众的、朴实的美。降低价值的要求反而更能在生活中发现「甜点」。&lt;/p&gt;
&lt;p&gt;因此我们可以尝试去降低心中那个模型的价值顺位，这样反而能够更好地积累人生的甜点，因为你会变得更包容，也因此更快乐，同时也能够让我们更客观地体验人生、不断进步。&lt;/p&gt;
&lt;p&gt;这个世界上有人树立权威，就会有人盲目跟从；也有很多人独尊小众美，就会有人觉得他们是卖弄而已。这些都是不同的人、不同的时间、不同的地点、不同的情绪观察世界的方式而已。而最终只要能看到事物本身，并在过程中积累百家各自视角内的甜点，选择用什么方法去看，又如何呢？&lt;/p&gt;
&lt;h2&gt;🌺 生活点滴&lt;/h2&gt;
&lt;p&gt;这两个月工作节奏非常紧凑，但回顾来看也抽空去了不少地方。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🇲🇾 马来新山&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;组内去马来西亚的新山聚餐 &amp;amp; 密室团建，写月刊的时候才发现那两天没有拍照。新山整体观感有点像国内的二三线城市，华人占比也不小。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🇮🇩 印尼民丹岛&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;十一国庆我没有假期，只能羡慕朋友圈里发的各种假期旅行照片。于是周末跑去民丹岛躺了两天，就当是放了国庆假了。&lt;/p&gt;
&lt;p&gt;海岛边的日出，XPan + 裁切之后还是挺出片的：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj33/B0000431HEIC1759535470.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;🇨🇳 北京&amp;amp;珠海&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;国庆后的一周回了国内出差，先去北京、再去珠海，也是时隔 6 个月之后的首次回国。回国的第一件事就是找各种好吃的，一天吃几顿，还是国内的食物好吃。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj33/B0000486HEIC1760271280.jpeg&quot; alt=&quot;&quot; /&gt;也喝到了心心念念的阿嬷手作：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj33/B0000493HEIC1760272098.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;🇲🇴 澳门&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;珠海出差结束后，趁着周末去了趟澳门，City Walk 了一天。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj33/B0000559HEIC1760771304.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj33/B0000583HEIC1760772990.jpeg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj33/B0000514HEIC1760766420-1.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;🇸🇬 万圣节环球影城&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;10 月份还去了趟 SG 的环球影城，体验了下夜晚的万圣节主题和 4 个限定鬼屋，鬼屋都是清一色的 Jump scare，布景有特色但体验较为同质化。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj33/20251025_215212.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;🎬 书影音&lt;/h2&gt;
&lt;p&gt;以下是本周期的书影音记录。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;看过：剧集 |《苦尽柑来遇见你》| ★★★★★&lt;/li&gt;
&lt;li&gt;看过：剧集 |《迷尸校园》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看过：剧集 |《余生有涯》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看过：剧集 |《赴山海》| ★★☆☆☆&lt;/li&gt;
&lt;li&gt;看过：剧集 |《弥留之国的爱丽丝 第三季》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看过：电影 |《捕风追影》| ★★★★★&lt;/li&gt;
&lt;li&gt;看过：电影 |《南京照相馆》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看过：电影 |《一战再战》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看过：电影 |《同甘共苦》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;在读：科普 |《GEB》| ★★★★★&lt;/li&gt;
&lt;li&gt;读过：小说 |《麒麟之翼》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;玩过：游戏 |《超英派遣中心》| ★★★★★&lt;/li&gt;
&lt;li&gt;在玩：游戏 |《空洞骑士：丝之歌》| ★★★☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-33&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>月刊（第32期）：中大校友会的采访</title><link>https://ursb.me/posts/weekly-32/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-32/</guid><description>记录接受中山大学哲学系校友寻访的采访内容，回顾选择哲学与中国哲学专业的契机，探讨哲学训练如何塑造技术思维、职业选择与抗压能力，并推荐三本书。</description><pubDate>Sat, 16 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本篇是对二〇二五年七月至八月的记录与思考。&lt;/p&gt;
&lt;p&gt;上周末有幸接受了个中山大学哲学系优秀校友寻访，正好采访同学发给我过提纲，挑选一些话题，凭借着记忆，在这里挑选采访过程中一些对话分享。&lt;/p&gt;
&lt;p&gt;Q1. 您在2017年入读哲学系，成为中国哲学方向的硕士，首先想请教，当初是什么契机让您选择中大的中国哲学专业？在众多哲学方向中，为何特别钟情于中国哲学？&lt;/p&gt;
&lt;p&gt;选择哲学的契机在本科深入技术领域之后，我开始感到一种疲惫和迷茫。当面对“应该做能获奖的项目还是自己想做的项目”这类选择时，我开始反思：“我做技术是为了什么？娱乐自己，还是改变世界？”我感到在当时的环境下，两者似乎都难以实现，甚至想不被世界改变就很不错了。&lt;/p&gt;
&lt;p&gt;正是这种对技术意义的追问和人生方向的困惑，促使我决定转向哲学。我的目标很明确——“不为其他，只是想求得一番境界，一种胸怀宇宙、达观人生的境界。”（&lt;a href=&quot;https://blog.ursb.me/posts/summary-2017/&quot;&gt;《再见了，我的大学》&lt;/a&gt;）同时，我也想从哲学中寻找关于“温暖”与“幸福”的答案。&lt;/p&gt;
&lt;p&gt;关于为何选择中国哲学，可能是我的思考方式天然地亲近中国哲学，我会更关注生命实践与内在安顿。在教育实习期间的体验让我更加明确了这点。那段时间每日在实习的小学的走廊中捧读中西哲学史备考，伴随朗朗书声，哲学智慧与孩子们的纯真质朴相结合，让我感受到了无比温暖，是我与中国哲学智慧产生情感共鸣的起点。&lt;/p&gt;
&lt;p&gt;Q2. 在哲学系的求学经历对您后来人生道路，尤其是职业选择产生了什么样的影响（您在文章中提到哲学硕士背景与小学教师经历，这些看似与技术无关的积累如何影响了您在鹅厂的技术研发的工作思维？）？以及您是如何看待大学是就业的准备期这一问题呢？&lt;/p&gt;
&lt;p&gt;哲学对技术工作思维的影响，我觉得在于几点吧。&lt;/p&gt;
&lt;p&gt;首先培养了自己追本溯源的思考方式。哲学训练我不断追问“为什么”，这种思维方式让我接触到技术时不只看用法，而是会像剥洋葱一样深入到底层原理，我觉得这个过程非常奇妙，满足自己好奇心的同时可以获得一种爽感。所以我的技术路径也是从前端深入到客户端，尤其对浏览器和渲染非常感兴趣。&lt;/p&gt;
&lt;p&gt;其次哲学训练培养了自己用系统性视角去看待问题的方式。在研发阶段站在整条产品链路的层面去俯视各个环节的合理性，在业务视野上也提醒自己不能仅局限于手上的业务，而是要纵向去挖根因缘起、横向去调查行业竞品，在当下思考不足、往未来预判发展。这种跳出当下模块、审视系统整体的思维习惯，我也正是哲学强调整体性思考的体现。&lt;/p&gt;
&lt;p&gt;最后是加强了自己的一些沟通与表达上的软素质，这就不展开说了。&lt;/p&gt;
&lt;p&gt;关于就业准备期这个说法，我觉得是有一定道理的，毕竟这是一条社会认同的传统路径——高考、大学、就业。但有些时候也要意识到自己的可能性，在大学需要去不断求索，探索并确立个人未来可能的道路，并培养为之奋斗的毅力。&lt;/p&gt;
&lt;p&gt;从我的视角来看，大学学习的根本目的在于完善自己认知世界的模型，找寻看待问题的不同视角，锻炼独立思考的能力，并基于此懂得何是何非，培育自己的共情力。这些是比单一职业技能更重要、更能支撑一个人走得长远的素养。&lt;/p&gt;
&lt;p&gt;Q3. 您在文章中写道认为编程的快乐源于“纯粹创造”，但现实中技术常被绩效异化。您认为哲学训练赋予您的哪些“反脆弱”能力特别珍贵？以及您认为学生时代应锻造哪些核心素养（做什么）来抵御未来的价值消磨？&lt;/p&gt;
&lt;p&gt;哲学赋予自己的反脆弱能力，可能是让我把价值锚定在内部，这种内在的价值锚点，让我在面对外部压力时不易被异化。另外可能比其他人更幸运的一点是在刚上大学时的时候接近了一次死亡时刻，这让我着实体会到——在生命面前一切都无足轻重。我们应该、也必须用有限的生命多去体验生活中的精彩、去探寻生命的无限可能。&lt;/p&gt;
&lt;p&gt;学生时代应锻造的核心素养，前面有泛泛地提及到，这里具体说我觉得至少有三个点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;持续反思与复盘的习惯：这是我以往文章中反复出现的主题，无论是心情日记，还是年度总结，都是我抵御价值消磨的方式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;建立个人的意义系统：学生时代不应只学习“术”，更要思考“道”。要去追问“为什么学”、“为何而做”，为自己的人生确立一个不易被外界动摇的内核。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;保持纯粹的好奇心：内在的好奇作为动力源时，探寻问题和解决问题所带来的价值感和成就感是最稳固的。这种好奇心不仅是个人无限发展的动力源，其实也是人类历史长河得以发展的源泉。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Q4. 看了学长的经历，给我印象最深的理念就是“拥抱变化”，想知道这个理念是源于您早期的成长经历，还是在某个特定阶段形成的？在当下普遍追求稳定的社会氛围中，您是如何培养并保持这种‘拥抱变化’的心态的？&lt;/p&gt;
&lt;p&gt;确实是那次半只脚踏入地狱之门的经历，让我从一个普通大学生转变为主动寻求生命意义的探索者的分水岭。在我看来，变化其实就是机会，是一个可以让自己跳出舒适圈、探索不同可能性的机会。人生的意义就是体验当下，保持这种心态的话，那无论何种变化都可以更从容地面对。&lt;/p&gt;
&lt;p&gt;至于如何保持这种心态，有两点吧：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;持续的自我反思：前面提到的，通过写定期的总结、复盘、反思和规划，可以不断地审视和接纳生活中的变化，并从中提炼出成长的养分。&lt;/li&gt;
&lt;li&gt;关注内在成长：我认为安全感的本质其实是来源于自身能力的提升，而非外部环境的稳定。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Q5. 作为学长，您最想跟现在就读于哲学系的本科生和研究生分享什么（有什么建议）？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;打破专业的墙：不要被任何标签标签所束缚。花精力去接触不同领域，然后融会贯通，我相信也会有一些收获。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在生活中修行：哲学不是故纸堆里的学问。所谓“道不远人”，试着用学到的工具去分析一部电影、一个社会热点，或者就像我一样，用它来审视自己的生活和成长。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;找到无用之用：不要因为哲学不好找工作而焦虑。哲学训练的逻辑思辨、宏大视野、清晰表达的能力，是任何行业都稀缺的软实力。同时，去培养一项具体的硬技能，它会成为一个让你的思想有落地的工具。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Q6. 最后，作为学长，如果让您留下一句中国哲学中对您生活影响最大的一句话，您会选择哪一句呢，为什么？&lt;/p&gt;
&lt;p&gt;在不同阶段都有其实都有不同的话勉励着我。这个问题其实在研究生复试的时候也被问过，当时我的回答是《中庸》里的：“人一能之，己百之；人十能之，己千之。果能此道矣，虽愚必明，虽柔必强。”勤能补拙是一个很简单的道理，如果觉察到自己的天赋不如别人，那就多花精力去追上。虽然本科阶段没有接受过系统地哲学训练，那么我愿意花更多的精力去学习；虽然某个领域我没有接触过或者天然不擅长，那么就加倍去学习，总能理解的。这句话至今都在勉励着我，面对陌生无需害怕，因为有自信、有手段可以掌握那些未知。&lt;/p&gt;
&lt;p&gt;第二句话可能是我工作两年后，在 &lt;a href=&quot;https://blog.ursb.me/posts/summary-2021/&quot;&gt;2021 年终总结&lt;/a&gt;的主题：“行有不得，反求诸己。”遇到困难时，提醒自己要向内求索、寻找自身成长空间。但前提是在做好课题分离的前提下进行内省，否则就是内耗了。&lt;/p&gt;
&lt;p&gt;第三句话可能近两年感受比较深的：“吾生也有涯，而知也无涯。以有涯随无涯，殆已！”生命有限而知识无穷，尤其是 AI 快速发展的这两年，我们获取知识的手段变得无比便捷，但如果一味地用有限的生命去追求无限的知识，必然会让自己变得无比疲惫。因此不要过分执着于追求知识，而是要过滤与筛选出自己感兴趣的内容，并内化为自己新的认知，才能保持内心的宁静和自然的状态。&lt;/p&gt;
&lt;p&gt;Q7. 最后的最后，希望可以推荐三本书。&lt;/p&gt;
&lt;p&gt;第一本《有限与无限的游戏》，常读常新的一本书。&lt;/p&gt;
&lt;p&gt;第二本就《存在主义心理治疗》吧，和我的人生观很契合的一本书。&lt;/p&gt;
&lt;p&gt;最后一本纠结于是《鱼不存在》还是《悉达多》，最后还是选择《鱼不存在》吧，希望我们都可以学会与不确定性相处。&lt;/p&gt;
&lt;h2&gt;🌺 生活点滴&lt;/h2&gt;
&lt;p&gt;🌇 分享这个月拍到的几张好看的夕阳吧：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj32/IMG_8276.jpeg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj32/05F2C1F8-B457-4774-96B5-36CDDFAF7E02.jpeg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj32/IMG_8405.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;🎬 书影音&lt;/h2&gt;
&lt;p&gt;以下是本周期的书影音记录。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;看过：电影 |《鬼灭之刃: 无限城第一章》| ★★★★★&lt;/li&gt;
&lt;li&gt;看过：韩剧 |《恶缘》| ★★★★★&lt;/li&gt;
&lt;li&gt;看过：电影 |《F1：狂飙飞车》| ★★★★★&lt;/li&gt;
&lt;li&gt;看过：电影 |《神奇四侠》| ★★☆☆☆&lt;/li&gt;
&lt;li&gt;看过：剧集 |《扫毒风暴》| ★★☆☆☆&lt;/li&gt;
&lt;li&gt;看过：电影 |《诡异列车》| ★★☆☆☆&lt;/li&gt;
&lt;li&gt;看过：电影 |《非常宣言》| ★★☆☆☆&lt;/li&gt;
&lt;li&gt;读过：文学 |《余华的文学课》| ★★★★☆&lt;/li&gt;
&lt;li&gt;读过：艺术 |《创意行为：存在即答案》| ★★★★☆&lt;/li&gt;
&lt;li&gt;在读：小说 |《太白金星有点烦》| ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-32&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>月刊（第31期）：基于 Claude 的阅读流</title><link>https://ursb.me/posts/weekly-31/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-31/</guid><description>分享用Claude和MCP搭建的个人阅读流：工作日碎片阅读用Reader记笔记，周末用Claude结合Readwise笔记做深度整理并沉淀进Project的RAG，反思AI时代阅读与思考的意义。</description><pubDate>Sat, 05 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在 《&lt;a href=&quot;https://blog.ursb.me/posts/weekly-16/&quot;&gt;月刊（第16期）：个人信息流分享&lt;/a&gt;》里，我曾梳理过自己处理信息输入输出的方法。三年过去了，AI 工具的发展让我觉得有必要重新审视这个话题。这期月刊想重点聊聊我最近摸索出的阅读流。&lt;/p&gt;
&lt;h2&gt;阅读流分享&lt;/h2&gt;
&lt;p&gt;按照工作生活节奏，我把阅读分为碎片阅读和深度阅读。&lt;/p&gt;
&lt;p&gt;工作日缺少沉静的心境和整段时间，我会把深度阅读留在周末，日常则消化各种信息源的文章。阅读过程中直接在 Reader 里记录笔记，周末前尽可能独立思考，完善对问题的理解。&lt;/p&gt;
&lt;p&gt;最终在周末的时候利用 Claude 和 MCP，结合之前在 Reader 的阅读笔记和问题，让 Claude 来完善我的笔记和思考。最终再把笔记沉淀到 Project 的 RAG 里，方便 Claude 未来索引使用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj31/image.png&quot; alt=&quot;&quot; /&gt;整个流程中我尽可能剥离对工具的依赖，一方面是为了工具简化、另一方便也是为了抽象出通用的方法以便迁移，因此全程只使用 Reader 和 Claude 这两个工具来完成这个阅读流。&lt;/p&gt;
&lt;h3&gt;碎片阅读&lt;/h3&gt;
&lt;p&gt;首先是碎片阅读，包括三部分，收集、阅读、速记。这里我统一使用的是 Reader。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj31/20250705184732@2x.png&quot; alt=&quot;&quot; /&gt;收集上，除了用 Reader 订阅固定的几个 RSS 之外，也会去自己探索一些优质的 Newsletter 添加进来。在 Reader 中添加文章是很方便的，阅读过程中可以点击超链接直接添加进 Library，也可以利用浏览器插件添加文章，整个过程快捷无感，不会打断当前的阅读体验。&lt;/p&gt;
&lt;p&gt;Reader 主打功能是高亮自动同步 Readwise。除此之外，我非常喜欢 Reader 的一个功能是可以在阅读时直接在旁边做笔记，这些笔记也会被 Reader 自动同步到 Readwise 中，最终可以在 Claude 中使用 Readwise MCP 做召回使用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj31/20250705184354@2x.png&quot; alt=&quot;&quot; /&gt;Reader 最近还更新了 AI Chat 功能，你可以直接和文章或 PDF 对话，配合之前就已经提供的的自定义 Prompt 能力，这些已经基本满足绝大多数 AI 辅助阅读的场景了，我们可以利用它做总结、翻译、名词解释、发散脑暴等等。&lt;/p&gt;
&lt;p&gt;但我基本很少使用这些功能，在我看来效率和阅读在某种意义上是冲突的，阅读的目标应该是找到那些信息的背面。因此我更提倡是把自己的想法临时记录在文章旁边，如果有疑问也记录下来先自己思考思考。给问题多几天思考时间，而不是跳过思考直接尝试获取答案。&lt;/p&gt;
&lt;h3&gt;深度阅读&lt;/h3&gt;
&lt;p&gt;说到思考，我更注重的是深度阅读，因为它更能容易带来思考的情景。&lt;/p&gt;
&lt;p&gt;周末阅读的材料也与工作日不同，尽可能是长文、PDF 或者是图书。一般我使用微信阅读或者 Kindle 来阅读，虽然舍弃了纸质书的触感，但是它们更容易和 Readwise 结合，以便我的阅读高亮和阅读笔记可以自动同步到 Readwise 中，在整理阶段被 Claude 直接召回。&lt;/p&gt;
&lt;p&gt;微信读书建议关掉评论划线功能，保持沉浸的独立思考。把注意力放在我们阅读时发生的一切、包括阅读过程的情绪体验之上，而不仅仅是信息本身。&lt;/p&gt;
&lt;h3&gt;整理消化&lt;/h3&gt;
&lt;p&gt;经过了一周的输入之后，每周日都会堆积很多内容需要整理。如前文所言，这个环节主要是用来解答前几天发现的问题、完善自己的思考，利用 AI 补齐思考的角度，加深思考的深度。&lt;/p&gt;
&lt;p&gt;我会针对每个主题创建一个 Project，里面放上我自己的文章和笔记作为这个 Project 的 RAG，方便我通过之前的阅读思考和 AI 辅助，来补齐自己的认知。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj31/20250705191459@2x.png&quot; alt=&quot;&quot; /&gt;但如果你是 Claude Pro，那用 Opus + Research 每天也没有多少额度，如果问题太多可以下周的工作日晚上继续让它异步跑着。基本上每天晚上我都是把 Claude Pro 的额度用完再心满意足地入睡。&lt;/p&gt;
&lt;p&gt;需要注意的是，这里的提示词一般要强调“批判性思考”，以下是我常用的提示词：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;你是一个全球闻名的哲学家，请根据以下内容继续提出 3 个有哲理的、引人深思的问题，以便于读者发散思考。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用李继刚的提示词偶尔也会有一些发现：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;;; 作者: 李继刚
;; 想法来源: 群友 @三亿
;; 版本: 0.1
;; 模型: Claude Sonnet
;; 用途: 掰开揉碎一个概念

;; 设定如下内容为你的 *System Prompt*
(defun 撕考者 ()
  &quot;撕开表象, 研究问题核心所在&quot;
  (目标 . 剥离血肉找出骨架)
  (技能 . (哲学家的洞察力 侦探的推理力))
  (金句 . 核心思想)
  (公式 . 文字关系式)
  (工具 . (operator
           ;; ≈: 近似
           ;; ∑: 整合
           ;; →: 推导
           ;; ↔: 互相作用
           ;; +: 信息 + 思考 = 好的决策
           (+ . 组合或增加)
           ;; -: 事物 - 无关杂项 = 内核
           (- . 去除或减少)
           ;; *: 知 * 行 = 合一
           (* . 增强或互相促进)
           ;; ÷: 问题 ÷ 切割角度 = 子问题
           (÷ . 分解或简化))))

(defun 掰开揉碎 (用户输入)
  &quot;理解用户输入, 掰开揉碎了分析其核心变量, 知识骨架, 及逻辑链条&quot;
  (let* (;; 核心变量均使用文字关系式进行定义表达
         (核心变量 (文字关系式 (概念定义 (去除杂质 (庖丁解牛 用户输入)))))
         ;; 呈现核心变量的每一步推理过程, 直至核心思想
         (逻辑链条 (每一步推理过程 (由浅入深 (概念递进 (逻辑推理 核心变量)))))
         ;; 将核心思想进行整合浓缩
         (知识精髓 (整合思考 核心变量 逻辑链条)))
    (SVG-Card 知识精髓)))

(defun SVG-Card (知识精髓)
  &quot;输出SVG 卡片&quot;
  (setq design-rule &quot;合理使用负空间，整体排版要有呼吸感&quot;
        design-principles &apos;(干净 简洁 逻辑美))

  (设置画布 &apos;(宽度 400 高度 900 边距 20))
  (自动缩放 &apos;(最小字号 16))

  (配色风格 &apos;((背景色 (蒙德里安风格 设计感)))
            (主要文字 (楷体 粉笔灰))
            (装饰图案 随机几何图))

  (动态排版 (卡片元素 ((居中标题 &quot;撕考者&quot;)
             (颜色排版 (总结一行 用户输入))
             分隔线
             知识精髓
             ;; 单独区域,确保图形不与文字重叠
             (线条图展示 知识精髓)
             分隔线
             ;; 示例: 用更少的数字, 说更多的故事
             (灰色 (言简意赅 金句))))))

(defun start ()
  &quot;启动时运行&quot;
  (setq system-role 撕考者)
  (print &quot;请就座, 我们今天来拆解哪个问题?&quot;))

;; 运行规则
;; 1. 启动时必须运行 (start) 函数
;; 2. 之后调用主函数 (掰开揉碎 用户输入)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;还有一个问题之锤也比较好用，这里不贴了。&lt;/p&gt;
&lt;p&gt;但如果问题比较深度，那开了 Opus + Research 的话也不用太在意提示词。我一般让它做批判性思考或者深度发散，在这个阅读输入整理的场景中比较好用。&lt;/p&gt;
&lt;p&gt;举个例子，比如我想探索 AI 写作的议题，我可以这么询问，它会自己结合 Readwise 的笔记进行思考研究：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj31/20250705211956@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;自我探索&lt;/h3&gt;
&lt;p&gt;以上环节得到的完善后的结论我会进一步沉淀到 Project 的 RAG 里，作为 RAG 的一部分。如果是非常值得分享的议题，我也会单独写月刊分享。&lt;/p&gt;
&lt;p&gt;在这个过程中我发现自己沉淀下来的输出可以帮助我进一步做自我探索，来实现下一个阶段的学习规划。&lt;/p&gt;
&lt;p&gt;比如我的月刊 Project 中，Claude 就能很敏锐地发现了我这些年思维方式的转变：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj31/20250705192357@2x.png&quot; alt=&quot;&quot; /&gt;&amp;gt; 报告详见&lt;a href=&quot;https://claude.ai/public/artifacts/ab570268-283b-4dc7-b5ea-2fefcf0f7dbe&quot;&gt;这里&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;另外 Claude 近期也上线了记忆能力，相信在以后的使用过程中，AI 会让我们越来越了解自己。&lt;/p&gt;
&lt;p&gt;题外话，我们用这套提示词给 ChatGPT 可以直接提取出自己的用户画像，结论精确到有些细思极恐，有兴趣的读者自己可以试试：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;我希望你一字不漏的总结迄今为止你从我身上了解到的全部信息，包括我是谁，我的人际关系是怎么样的，我的公司结构是怎么样的，我偏好什么样的信息，我关心什么样的事情，我现在在为什么事情苦恼和发愁，等等，你能想到的关于我的一切事情，我都需要，因为我现在要备份一个新的GPT账号，我需要在那个账号上备份一份关于我自己的信息。
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;回到阅读的根本&lt;/h2&gt;
&lt;p&gt;目前 AI 已经这么方便了，可以辅助我们阅读，提高信息的获取效率；可以帮助我们写作，加深我们的观点输出。因此可能有人会问，AI 时代的写作和阅读究竟还有什么意义？&lt;/p&gt;
&lt;p&gt;正如前文所说，我认为效率和阅读在某种意义上是冲突的，所以我在阅读的过程中基本不会用 AI 总结、AI 解释等功能。这并非是对技术的抗拒——阅读本身就是价值，所以不能逃避思考的过程，迷失在高效和技术追逐中。因此这套阅读流的设计中更加强调思考整理的环节，这都是为了让 AI 更好地辅助我们思考，而非跳过。&lt;/p&gt;
&lt;p&gt;阅读是通向自我体验的桥梁，余华的分享中有这么一段话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我曾经多次说过这样的话，如果文学里真的存在某些神秘的力量，那就是让我们在属于不同时代、不同民族、不同文化和不同环境的作品里读到属于自己的感受。文学就是这样的美妙，某一个段落、某一个意象、某一个比喻和某一个对话等，都会激活阅读者被记忆封锁的某一段往事，然后将它永久保存到记忆的“文档”和“图片”里。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;同样的道理，阅读文学作品不仅可以激活某个时期的某个经历，也会激活更多时期的更多经历。而且，一个阅读还可以激活更多的阅读，唤醒过去阅读里的种种体验，这时候阅读就会诞生另外一个世界，出现另外一条人生道路。这就是文学带给我们的想象力的长度。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;阅读能够抹去所有的边界，包括阅读和阅读之间的边界、阅读和生活之间的边界、生活和生活之间的边界，这种边界消解能让我们在不同时代、民族、文化的作品中读到属于自己的感受。&lt;/p&gt;
&lt;p&gt;这种属于自我的感受具有不可替代性，与此同时它跟效率有时也是相悖的。当我们急于获取结论时，往往错过了抵达结论的风景。&lt;/p&gt;
&lt;p&gt;而阅读可以帮助把注意力放在我们阅读时发生的一切——包括阅读过程的情绪体验之上，而不仅仅是信息本身。那些在字里行间涌现的联想、在段落停顿处的沉思、甚至是某个词句触发的回忆，都是阅读体验不可分割的部分。&lt;/p&gt;
&lt;p&gt;好的阅读，就是身临其境，是拉长时间，加深生命的厚重感的方法。当我们专注于与文字的对话，而不急于求成时，才能真正抵达作者想要传达的那个世界。&lt;/p&gt;
&lt;p&gt;真正的理解需要停下来，思考每个概念如何与其他事物联系。而如果我们把所有的思考都外包给 AI 时，我们失去的不仅仅是记忆，而是思考本身。&lt;/p&gt;
&lt;p&gt;伍尔夫有个日记集叫《思考就是我的抵抗》，里面提到了一句话：“一个人能使自己成为自己，比什么都重要。” 阅读就是通往自己的有效途径，我们不可能通过放弃思考来抵达这个终点。&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-31&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>月刊（第30期）：写在 30 岁这天</title><link>https://ursb.me/posts/weekly-30/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-30/</guid><description>写在三十岁生日这天，回顾二十岁以来求学、创业、离职、旅居异国的经历，反思成长与自我重复之间的张力，期许自己保持开放与勇气继续前行。</description><pubDate>Sun, 29 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本篇是对二〇二五年五月至六月的记录与思考。&lt;/p&gt;
&lt;p&gt;古人云三十而立，终于也轮到我走到了这天。恰好，这期月刊也正是第 30 期。&lt;/p&gt;
&lt;h2&gt;长大&lt;/h2&gt;
&lt;p&gt;前天晚上下班去家楼下的理发店理发，和来自东北的大叔聊着天，他说现在越发觉得时间过得很快，一天一眨眼就过去了，没有什么感知。每天过着重复的生活，一月又一月、一年又一年。以至于现在害怕时间过得太快，而小时候却总盼望着时间能过快一些，想着早点长大。&lt;/p&gt;
&lt;p&gt;是啊，我也似乎已经很久没有过那种“期待明天快点来”的感觉了。小时候会期待明天上学和同学一起玩，期待明天播出的动画片，期待每周三晚上更新的火影漫画——以至于那个时候每天晚上都会想快点睡着，似乎闭上眼睛黑屏之后，就能马上看到期待的事物。&lt;/p&gt;
&lt;p&gt;但现在已经完全相反了。不甘心今天就这么过去了，于是不舍得睡觉，总想着晚上的时间属于自己，似乎只要不睡觉，时间就能被无限拉长。&lt;/p&gt;
&lt;p&gt;前几天在网上看到一句话——“解释笑话就像解剖青蛙，的确能明白它的构造和意思，但是青蛙已经死了。”类比于我写长大这个话题，当我真正体验到长大时，我也就再写不出对于长大的期待了。&lt;/p&gt;
&lt;h2&gt;期望&lt;/h2&gt;
&lt;p&gt;罗曼·罗兰有一句名言：“Most men die at 20 or 30, and are buried at 60 or 70. They merely repeat themselves for the rest of their lives.”&lt;/p&gt;
&lt;p&gt;人的灵魂之所以会被视作“二三十岁就宣告凋零”，往往是因为在那之后，我们开始将昨日的思想与行为机械地翻刻，逐渐失去了最初的鲜活与灵动。&lt;/p&gt;
&lt;p&gt;这样的凋零更多指向精神上的固化——当我们只是一味地重复自己曾相信、曾热爱、曾厌弃的一切时，就像在刻意模仿一个陈旧的自我，不再敏锐地感知世界的丰盈与未知，不再能在日常琐碎中体会到微光与可能。&lt;/p&gt;
&lt;p&gt;其实我也很怀念和感恩曾经二十出头的自己。他拥有着我现在无法想象的动力和韧劲，抗住了巨大的压力和挫折，创造过很多出乎意料的体验——&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;高考意外落榜，从双非的教育学，自学计算机参加各种比赛，拿过国奖、去过 WWDC（&lt;a href=&quot;https://blog.ursb.me/posts/wwdc-19/&quot;&gt;《WWDC 19 游记》&lt;/a&gt;）；&lt;/li&gt;
&lt;li&gt;去教育实习当老师，认识了很多可爱的孩子（&lt;a href=&quot;https://blog.ursb.me/posts/summary-2017/&quot;&gt;《再见了，我的大学》&lt;/a&gt;）；&lt;/li&gt;
&lt;li&gt;又去考哲学的研究生，漫游在哲思书海里，那是最广阔的天地（&lt;a href=&quot;https://blog.ursb.me/posts/summary-2018/&quot;&gt;《2018，沉淀初心》&lt;/a&gt;）；&lt;/li&gt;
&lt;li&gt;再之后去大厂实习、工作，努力工作、快速晋升（&lt;a href=&quot;https://blog.ursb.me/posts/2024-summer/&quot;&gt;《再见了，盛夏》&lt;/a&gt;）；&lt;/li&gt;
&lt;li&gt;再到离职创业（&lt;a href=&quot;https://blog.ursb.me/posts/weekly-27/&quot;&gt;《月刊（第27期）：旅居》&lt;/a&gt;）；&lt;/li&gt;
&lt;li&gt;直至现在的身处异国他乡（&lt;a href=&quot;https://blog.ursb.me/posts/weekly-29/&quot;&gt;《月刊（第29期）：新生活》&lt;/a&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;二十岁的我经历了很多，这些体验中有着乐趣，但也伴随着相应的痛苦。这些印证了他的坚韧与强大。&lt;/p&gt;
&lt;p&gt;我不知道三十岁的我是否还能继承他的那份强大，但如果固化于此、仅仅刻意模仿那陈旧的自我，我也就此凋零了。&lt;/p&gt;
&lt;p&gt;我期望三十岁的自己，敢于挣脱二十岁既定的经验与信念，敢于冒险去探寻那些尚未被熟识的可能性。&lt;/p&gt;
&lt;p&gt;真正的成长不仅限于汲取外界的新知，更在于对自我的改造与突破——以一种开放、谦逊而勇敢的姿态活在不断流变的当下。如此，才不至于被过去的成见所桎梏，也能在漫长岁月中不止步于自我模仿的重复，而是在灵魂的敞亮处再次起舞，保持张力、始终绽放。&lt;/p&gt;
&lt;p&gt;我始终着渴求一种清晰、平和、笃定的思绪，去体验下一段未知的人生。&lt;/p&gt;
&lt;h2&gt;🌺 生活点滴&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;🏡 住所&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;上个月搬家进了新公寓里，是一个刚交付的小区，所以一切都很新。网球场、游泳池、健身房一应俱全，对面也有小贩中心和巴沙，生活上还是挺方便的。&lt;/p&gt;
&lt;p&gt;但这里的租金实在是太可怕了，一居室  3000+ 新币…&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj30/IMG_8589.jpeg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;⛰️ 徒步&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;和同事去徒步，登顶新加坡最高峰武吉知马山（163m…）&lt;/p&gt;
&lt;p&gt;下山的时候看到了有趣的树桩和猴子。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj30/IMG_7311.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj30/IMG_7344.jpeg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;🎡 摩天轮&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;拍到了摩天轮！看相册，之前我还拍过各个城市（中山、苏州、深圳）的摩天轮，但却都没有坐上去过。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj30/IMG_7379.jpeg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;🌴 Batam&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这周末去了印尼的 Batam 岛，物价还挺便宜的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj30/DSCF1551.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;🌳 植物园&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;值得纪念的一天。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj30/DSC03714.jpg&quot; alt=&quot;&quot; /&gt;明天和未来也许并不是最重要的事，此时此地是我当下唯一拥有和值得珍惜感恩的祝福，也是全部意义所在。&lt;/p&gt;
&lt;h2&gt;🎬 书影音&lt;/h2&gt;
&lt;p&gt;以下是本周期的书影音记录。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在读：散文 |《世间的小儿女》| ★★★★☆&lt;/li&gt;
&lt;li&gt;在读：散文 |《思考就是我的抵抗》| ★★★★☆&lt;/li&gt;
&lt;li&gt;在读：文学 |《余华的文学课》| ★★★★☆&lt;/li&gt;
&lt;li&gt;在读：小说 |《长安的荔枝》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《死神来了 6》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《哭声》| ★★★☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-30&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>游戏组件的一生: 从加载到上屏</title><link>https://ursb.me/posts/game-engine-renderer/</link><guid isPermaLink="true">https://ursb.me/posts/game-engine-renderer/</guid><description>解析小游戏容器与各类游戏引擎的协作机制，从脚本加载、渲染上下文到画面上屏，梳理游戏组件从加载到呈现的完整生命周期。</description><pubDate>Sat, 17 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;1. 小游戏容器与游戏引擎&lt;/h2&gt;
&lt;p&gt;小游戏容器的设计上可以理解是一种特化版的 WebView，渲染上下文上裁剪了多余的 DOM Element，只保留 Canvas；而脚本引擎上则 JS Polyfill 或是容器 Binding 的方式去对齐 ECMA-262 的标准。此外容器还需要提供 Script 加载与执行、WASM 等新标准处理、以及 Audio 与 Video 等多媒体能力，这些能力都将通过 JSBinding 的形式，将接口包装成 BOM 的形式给到 JS 侧使用。&lt;/p&gt;
&lt;p&gt;小游戏容器之所以要设计成符合 Web 标准的容器，是为了兼容不同游戏引擎。这种设计理念的本质是将底层平台能力标准化、通用化，把碎片化的硬件、系统能力屏蔽在容器内部，只向上提供一套与浏览器 BOM、DOM 类似的编程模型，使得各类游戏引擎（如 Cocos、Egret、Laya、Unity WebGL）都可以以 Web 的运行环境的方式接入，避免每个引擎都去适配各家平台的原生能力。这实际上是 WebView 本地化、轻量化的一次再演化，小游戏容器约等于一个轻量浏览器内核。&lt;/p&gt;
&lt;p&gt;这个过程中容器负责“平台标准化”，引擎负责“内容生态”，比如&lt;/p&gt;
&lt;p&gt;小游戏容器的职责：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提供统一的渲染上下文（Canvas/WebGL）。&lt;/li&gt;
&lt;li&gt;提供统一的脚本运行时（JS/WASM）。&lt;/li&gt;
&lt;li&gt;提供标准化的输入、音频、视频、多媒体 API。&lt;/li&gt;
&lt;li&gt;提供网络、存储、支付、分享、广告等平台能力封装。&lt;/li&gt;
&lt;li&gt;对接安全沙箱、权限管理、性能隔离等系统层。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;游戏引擎的职责：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提供高层抽象的场景管理、物理引擎、动画、资源管理。&lt;/li&gt;
&lt;li&gt;提供开发者友好的编辑器、调试工具链。&lt;/li&gt;
&lt;li&gt;提供跨平台的组件化开发范式（UI、骨骼动画、粒子系统等）。&lt;/li&gt;
&lt;li&gt;管理游戏生命周期、状态同步、渲染调度。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接下来，以 Cocos 引擎的渲染管线为例，介绍小游戏容器对资源的加载流程以及对游戏组件的渲染流程。&lt;/p&gt;
&lt;h2&gt;2. 游戏引擎中的三大循环&lt;/h2&gt;
&lt;p&gt;游戏引擎的渲染管线由三大循环进行驱动，分别是渲染循环、事件循环和游戏循环，以下是梳理出来的三大循环的全景图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2.1 渲染循环 RenderLoop&lt;/h3&gt;
&lt;p&gt;首先是渲染循环，它的主流程如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%201.png&quot; alt=&quot;&quot; /&gt;整个渲染循环由系统的 Vsync 信号驱动，iOS 由 CADisplayLink 发起，通过应用进程的主线程的  RunLoop 来执行渲染任务，具备一定的帧率控制能力，如 iOS 下可以设定 30/60/90/120 FPS。&lt;/p&gt;
&lt;p&gt;在引擎侧，核心流程做了 3 件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;glFlush&lt;/code&gt; 清空 GL 缓冲指令：将上帧未执行的 OpenGL 指令强制刷新，确保显存与帧缓区数据一致，防止由于指令堆积导致的“帧延迟”或“卡顿”。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UpdateScheduler&lt;/code&gt; 异步任务调度：调度当前帧需要触发的异步任务，例如音频回调、网络事件响应等。保证非渲染逻辑（如数据更新）与渲染解耦，提高主线程并发能力。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Tick&lt;/code&gt; 驱动 JS 层逻辑：每帧通过 Binding 固定调用 JS 侧 Tick 方法，执行动画、状态更新等与渲染相关的逻辑。从而实现逻辑层与渲染层的解耦，增强跨平台的适配能力。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在容器侧，iOS 通过 &lt;code&gt;CAEAGLayer&lt;/code&gt; 处理 GL 指令上屏，主要有两个步骤：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;glBindRenderbuffer&lt;/code&gt;绑定 RenderBuffer：将当前帧渲染结果绑定至 RenderBuffer，作为上屏缓冲区。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PresentRenderbuffer&lt;/code&gt; 显示输出：将 RenderBuffer 内容呈现至屏幕，实现用户可见的最终画面。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在 iOS 渲染体系中，最终负责显示的组件是 CAEAGLLayer。它作为 Layer 树（Layer Tree） 的一部分，直接引用共享内存中的渲染缓冲区（Renderbuffer 数据）。与此同时，系统的 Compositor（合成器） 会将 CAEAGLLayer 的内容与其他 UI 元素（如 UIKit、SwiftUI）进行统一合成，最终输出到屏幕。&lt;/p&gt;
&lt;p&gt;在每一帧的 Tick 任务 中，JavaScript 会与游戏引擎协作，生成本帧所需的 Framebuffer（详见 3.5 至 3.10 节）。此时，Core Animation 与 OpenGL ES 通过共享渲染缓冲区实现数据同步。这意味着，OpenGL 渲染结果实质上只是一块 Layer 树中的画布，最终仍需与系统 UI 层级一同被合成为最终显示图像。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%202.png&quot; alt=&quot;&quot; /&gt;当然，本文中涉及的小游戏容器仅使用了 OpenGL 作为渲染后端，随着 Metal、Vulkan 等新一代图形 API 的兴起，RenderBuffer 绑定与上屏流程将更倾向“并行渲染 + 异步上屏”，提升高帧率下的流畅度与低延迟体验。
这个渲染循环的逻辑是同步执行的，因此如果将帧率设置为 60 FPS 时，以上所说的一帧的逻辑没有在 16.6ms 内运行完，便会导致 Jank。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%203.png&quot; alt=&quot;&quot; /&gt;比如在这个 Bad case 中，运行 Tick 任务时，在主线程的 JS 执行了 136ms，就导致了游戏动画卡顿：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/20250514171113@2x.png&quot; alt=&quot;&quot; /&gt;因此，为了保证游戏运行的流程性，意味着我们需要不停地打磨性能，尽可能降低同步任务的耗时。性能优化一定要借助 Profiling 工具，以下是一些常用的工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Xcode GPU Frame Debugger：针对 iOS 平台的图形调试工具，能够深入分析 渲染管线级别的性能瓶颈，尤其适合 Metal 与 OpenGL ES 开发场景。&lt;/li&gt;
&lt;li&gt;RenderDoc：业界主流的跨平台图形调试工具，支持捕捉帧数据，分析渲染管线各阶段的资源与性能瓶颈，适用于 OpenGL、Vulkan、DirectX 等 API。&lt;/li&gt;
&lt;li&gt;inspector.js：Web 端可以使用，便于在 WebGL 场景下分析 DrawCall、着色器与资源绑定等性能数据。&lt;/li&gt;
&lt;li&gt;Mali offline shader compiler：&lt;a href=&quot;https://zhuanlan.zhihu.com/p/161761815&quot;&gt;https://zhuanlan.zhihu.com/p/161761815&lt;/a&gt;，适用于 ARM Mali GPU 的离线着色器编译与分析工具，可用于评估 Shader 复杂度与指令执行成本，优化移动端渲染性能。&lt;/li&gt;
&lt;li&gt;Snapdragon Profiler: 抓帧工具，支持统计 &lt;strong&gt;Heavy DrawCall&lt;/strong&gt; 与 &lt;strong&gt;Overdraw&lt;/strong&gt;，帮助识别渲染瓶颈与冗余计算。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2 事件循环 EventLoop&lt;/h3&gt;
&lt;p&gt;我们向下，从 Tick 任务进入到第二个循环 —— 事件循环。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%204.png&quot; alt=&quot;&quot; /&gt;因为小游戏容器不是 WebView，只有一个 JS 引擎，因此我们需要实现一个事件循环机制，驱动 JS 执行（不一定完全对齐浏览器标准，只需要满足容器要求即可）。由图可见，主要包括 3 个任务：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;消费 timer 等宏任务：处理通过 setTimeout、setInterval 等方式注册的定时任务，确保定时逻辑的正确触发。&lt;/li&gt;
&lt;li&gt;消费 rAF 任务：这一步主要是为了驱动 GameLoop 逻辑，游戏主循环通常挂载于 rAF 回调中，用于逐帧更新渲染与逻辑。&lt;/li&gt;
&lt;li&gt;清空当前帧的 Commands：执行渲染命令、界面更新等待处理的指令，完成本帧渲染周期。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里重点说一下 rAF 的实现。在早期，rAF 通过 setTimeout(0) 来模拟实现，链路如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%205.png&quot; alt=&quot;&quot; /&gt;可以发现这里是存在问题的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不合规范：是使用 setTimeout 0 模拟的，并非 vsync 直接驱动。&lt;/li&gt;
&lt;li&gt;链路太长：Native 来维护 Timer 队列，等待 vsync 信号消费完之后再回调给 JS。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;后来按照 WHATWG 标准进行了重构，&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%206.png&quot; alt=&quot;&quot; /&gt;优点如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;标准化：vsync 后直接触发 JS 的调用&lt;/li&gt;
&lt;li&gt;开销小：JS 维护 Timers 队列，移除原生层中转的 JSBinding 调用开销。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可见渲染性能的优化，关乎在很多实现的细节上，需要挖掘与打磨。&lt;/p&gt;
&lt;p&gt;最终，通过以上的事件循环，容器能够维持 JS 引擎与渲染系统之间的协同工作，实现游戏的持续运行与更新。&lt;/p&gt;
&lt;h3&gt;2.3 游戏循环 GameLoop&lt;/h3&gt;
&lt;p&gt;这一部分展开来说就是第 3 章——游戏组件的一生：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%207.png&quot; alt=&quot;&quot; /&gt;在展开画卷之前，介绍一下传统的使用 OpenGL 作为渲染后端的小游戏容器的渲染流程：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%208.png&quot; alt=&quot;&quot; /&gt;首先是资源加载，涉及到两种完全不同的资源处理——脚本资源和静态资源。脚本资源由 JS Runtime 进行处理，而静态资源则针对不同类型的文件又有各自的处理方案——包括图片、字体、音频、视频、还有比较特殊的骨骼动画。因为本文主要说渲染，就不展开介绍资源加载流程了。&lt;/p&gt;
&lt;p&gt;之后，这些资源被游戏引擎渲染关键处理，由 JS 驱动生成 WebGL 指令，通过 JS Binding 最终调用到 C++ 或 Native 侧的 OpenGL 指令集上 —— WebGL 是 OpenGL 的子集，因此可以一一对应。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%209.png&quot; alt=&quot;&quot; /&gt;这个过程往往会出现很多渲染瓶颈，因此其中会涉及到很多优化项。我们根据硬件资源来看，主要关注 CPU、GPU 和带宽。而在当下移动端硬件资源并不富裕的场景下，对于游戏的优化，本质上变成了“平衡的艺术” —— 我们需要去平衡 CPU、GPU 和带宽资源。即如果瓶颈不能消灭，就需要转移瓶颈，比如经常见的是从 CPU 移到 GPU —— 使用 Computer Shader、GPU skinning、Animation Bake、GPU particles 等等。&lt;/p&gt;
&lt;p&gt;对于 CPU，这是最常见的瓶颈。这里不展开说游戏业务侧的优化项（减少 DrawCall 的 Culling、Batching 这些），而是从容器侧提供一些优化思路。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;比如上面的 JS Binding 调用可能会导致瓶颈，那我们可能会去做合批，从两方面去实现，一方面是调用次数合批，做 CommandBuffer 增加吞吐；另一方面可以做调用实现的合并，比如提供 GFX 高级图形库。&lt;/li&gt;
&lt;li&gt;还比如一些 JS 同步任务会阻塞主线程，那么就把计算密集型的任务转到 Native 去做。&lt;/li&gt;
&lt;li&gt;比如 JS 自身解释执行的执行效率，那就想办法用 JIT 或者 WASM。&lt;/li&gt;
&lt;li&gt;再比如 GC 上，也有一些优化的地方。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于 GPU，如果产生瓶颈了，一般是由于 Fragment Shader 指令太复杂，或者 Vertex Buffer 过大，比如 3D 渲染中的三角形面数超过阈值，一般移动端场景下需要控制在 50 万面到 150 万面之间。另外，高 Overdraw 也会导致 GPU 多做很多无用功。&lt;/p&gt;
&lt;p&gt;对于带宽瓶颈，则主要是靠压缩纹理（桌面端还可以用延迟渲染和后处理技术）。在网上有这么一个结论：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你的游戏跑 60 帧，那么每帧可用的带宽将会是 2&lt;em&gt;1024/60 = 34M, 假设你的 GBuffer 的分辨率是 1280 * 1080，那么写一次 GBuffer(RGBA 4 个字节)的带宽大小为： 1280&lt;/em&gt;1080*4/1024/1024 = 5.2M, 如果 3 张则是 15.6M.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;考虑到一般你的游戏都会有 Overdraw， 假设 Overdraw 比较合理在 1.5 左右，那么这样的带宽消耗就能占到 15.6 * 1.5 = 23.4 M。 考虑到你还要渲染场景，ui 和角色等内容，这样很容易就超过了每秒 34M 的推荐带宽占用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下图是一个常见的同步渲染管线：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;应用层提供顶点数据&lt;/li&gt;
&lt;li&gt;构建顶点着色器对顶点进行标准化&lt;/li&gt;
&lt;li&gt;图元装配构建几何图元&lt;/li&gt;
&lt;li&gt;光栅化阶段，将图元离散化为片元，每个片元对应屏幕上的像素区域&lt;/li&gt;
&lt;li&gt;片元着色器对每个片元执行纹理采样、颜色计算、雾效等像素级处理。&lt;/li&gt;
&lt;li&gt;进行测试与混合操作（Alpha、深度、模板测试），并将结果写入帧缓冲区 Framebuffer。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2010.png&quot; alt=&quot;&quot; /&gt;构建完 Framebuffer 后，就回到了我们 2.1 节所说的 CAEAGLLayer 绘制上屏了。&lt;/p&gt;
&lt;p&gt;接下来，我们就展开画卷，看看游戏组件的一生。&lt;/p&gt;
&lt;h2&gt;3. 游戏组件的一生&lt;/h2&gt;
&lt;p&gt;对于游戏组件从加载到上屏的流程我画了一张图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%207.png&quot; alt=&quot;&quot; /&gt;把这个流程可以简单拆成 10 个阶段：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2011.png&quot; alt=&quot;&quot; /&gt;为了介绍清楚这个流程，我准备了一个最简单的 Cocos 游戏 Demo。这个是 Demo 的场景设计：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2012.png&quot; alt=&quot;&quot; /&gt;这个是主场景的代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const { ccclass } = cc._decorator;

@ccclass
export default class Helloworld extends cc.Component {

    protected onLoad(): void {
        console.log(&apos;onLoad&apos;);
    }

    start () {
        console.log(&apos;Hello World&apos;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.1 Load Assets&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2013.png&quot; alt=&quot;&quot; /&gt;首先是资源加载，前文介绍过游戏资源可以分为静态资源和脚本资源。由于静态资源的加载流程涉及的内容太多了，本节只简单介绍下脚本资源加载。&lt;/p&gt;
&lt;p&gt;包括 3 类脚本资源：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;内置脚本：引擎启动的时候进行加载，包括注册 JS Binding、实现 window 对象（基础的 BOM 和 Canvas DOM 对象）、polyfill 补齐 ES 标准等等。这个脚本内置在容器里，容器启动 JS 引擎的时候直接加载。这一步可以做多实例和预执行，以加快启动速度。&lt;/li&gt;
&lt;li&gt;入口脚本：容器需要一个入口脚本，类似与 Web 里的 HTML，以便引入游戏入口资源。&lt;/li&gt;
&lt;li&gt;动态加载的脚本：由游戏入口资源引入，比如游戏框架代码、游戏包里的 JS 资源等等。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里可以容器侧可以提供离线资源、preload、prefetch、预执行等方式进行优化，同时在 JS 引擎方面也可以扩展做下 Code Cache，避免重复的编译耗时。&lt;/p&gt;
&lt;h3&gt;3.2 Component Scheduler&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2014.png&quot; alt=&quot;&quot; /&gt;脚本资源加载执行后，游戏组件代码会进入到组件调度器中进行优先级调度。&lt;/p&gt;
&lt;p&gt;Cocos 组件的生命周期如下图左所示，在 3 个关键的生命周期环境分别存在对应的调度器，每个调度器里设计了三个优先级队列，本质上每个队列的内容是由链表进行组织，顺序执行注册好的 invoker。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2015.png&quot; alt=&quot;&quot; /&gt;具体而言，从业务侧视角来看：在场景编辑器中创建节点（Node）时，业务方可以为其命名，并通过勾选“active”属性来决定该节点是否默认激活。一旦节点被标记为激活，加载阶段将由 Node Activator 负责激活该节点，接着 Component Activator（组件调度器的一部分）会依次激活该节点所挂载的各个组件，同时触发组件所在场景（Scene）的激活流程。最终，激活后的场景会将节点挂载入层级树，并完成组件 Invoker 的注册，交由调度器统一调度与管理。&lt;/p&gt;
&lt;p&gt;整体流程如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2016.png&quot; alt=&quot;&quot; /&gt;我们的 Demo 游戏组件的 &lt;code&gt;start&lt;/code&gt; 生命周期下打印了一个 “Hello World”，调度堆栈如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2017.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2018.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2019.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.3 Render Scene&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2020.png&quot; alt=&quot;&quot; /&gt;当场景激活并挂载了对应组件之后，接下来便是渲染场景，这一步就涉及到从 JS 调用到了 Native —— 即需要将 Scene 数据传递给 Native 侧，从而触发 Native 的 Render 流程。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2021.png&quot; alt=&quot;&quot; /&gt;JS 和 Native 互相调用的方式有很多，适用场景也不同，这里也不展开说了。需要注意的是，在架构设计上，这里可以对 Binding 层做一层抽象，以便容器对接不同的 JS 引擎实现。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2022.png&quot; alt=&quot;&quot; /&gt;另外需要注意的是 Binding 要做好两端的 GC，因此 Binding 的实现上需要符合 RAII 原则：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2023.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.4 Batcher&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2024.png&quot; alt=&quot;&quot; /&gt;当 Native 拿到节点之后，便需要进行 Batch，这一步属于计算密集型，因此选择放在 Native 侧去做。&lt;/p&gt;
&lt;p&gt;Batch 的流程比较复杂，核心思想是通过 DFS 对场景中的 Node 进行遍历，计算并装配（Assembler）顶点数据，得到顶点缓冲（VertexBuffer）和索引缓冲（IndexBuffer）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2025.png&quot; alt=&quot;&quot; /&gt;我们 Demo 游戏的场景树结构相对简单，遍历从 root 开始向下遍历（别忘了 Camera）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2026.png&quot; alt=&quot;&quot; /&gt;装配的计算流程比较复杂，下面仅对装配的结果做一个拆解，方便读者理解数据的由来。对于小恐龙而言，它是一个 Sprite2D，装备时会转成 Texture2D 处理，而后者在这个环节的核心，是需要拿到网格数据（Mesh Buffer）。下图是最后计算得到的 Mesh Buffer。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2027.png&quot; alt=&quot;&quot; /&gt;Mesh Buffer 由 Vertex Buffer 构成，这里装配的 Mesh Buffer，共 80 字节，其中每个顶点 20 字节，那么可以容易拆出 4 个 Vertex Buffer，同时根据 a_uv 的定义和偏移能拿到各自的 uv 坐标：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2028.png&quot; alt=&quot;&quot; /&gt;例如，根据顶点着色器的代码我们知道这个 Vertex Buffer 包括 3 部分数据：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;a_position&lt;/code&gt;: 偏移量 0，8 字节。vec2，能算出来一个坐标。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a_uv0&lt;/code&gt;: 偏移量 8，8 字节。vec2，就是 x,y，算出来之后是(0,1)。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a_color&lt;/code&gt;: 偏移量 16，4 字节。vec4，RGBA，数值是 0xFFFFFFFF，即白色透明。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2029.png&quot; alt=&quot;&quot; /&gt;我们把四个顶点的坐标都算一下，可以拿到宽高和左上角的坐标，其实可以发现，这个数据就是业务侧在场景编辑器里对 Node 的宽高和坐标设置：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2030.png&quot; alt=&quot;&quot; /&gt;顶点装配完毕之后的 Node 会被放进 Models 里，最后做成 Scece Tree 中的 models 节点：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2031.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.5 Setup&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2032.png&quot; alt=&quot;&quot; /&gt;这个环节主要由两个逻辑组成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;设置 Framebuffer 和 Viewport&lt;/li&gt;
&lt;li&gt;将 Scene 里的各个 Model 转成 drawItems 队列&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;首先是第一个部分，设置 Framebuffer 和 Viewport。具体而言，包括以下步骤：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2033.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通过 &lt;code&gt;setFrameBuffer&lt;/code&gt; 函数调用 &lt;code&gt;glBindFramebuffer&lt;/code&gt; 绑定 Framebuffer 帧缓冲对象，并分别附加颜色缓冲（&lt;code&gt;COLOR_ATTACHMENT&lt;/code&gt;，存储渲染的颜色信息）、深度缓冲（&lt;code&gt;DEPTH_ATTACHMENT&lt;/code&gt;，存储每个像素的深度信息，用于深度测试）和模板缓冲（&lt;code&gt;STENCIL_ATTACHMENT&lt;/code&gt;，存储模板测试的结果），确保后续绘制有正确的渲染目标。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;setViewport&lt;/code&gt; 调用 &lt;code&gt;glViewport&lt;/code&gt; 设置视口，决定最终渲染区域在屏幕上的映射范围&lt;/li&gt;
&lt;li&gt;&lt;code&gt;setup clear&lt;/code&gt; 依次执行 &lt;code&gt;glClearColor&lt;/code&gt;、&lt;code&gt;glClearDepth&lt;/code&gt; 和 &lt;code&gt;glClearStencil&lt;/code&gt;，初始化颜色、深度和模板缓冲的清除值，为每一帧绘制提供干净的初始状态。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;unsigned int fbo;
glGenFramebuffers(1, &amp;amp;fbo);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来，游戏引擎会将 Scene 里的各个 Model 转成一对一的 DrawItem，一个 DrawItem 的数据结构如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2034.png&quot; alt=&quot;&quot; /&gt;最后，引擎将这些 DrawItem 组装成 DrawItems 队列，以便后续流程处理。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2035.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.6 Render Stage&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2036.png&quot; alt=&quot;&quot; /&gt;接下来进入 Render Stage 阶段，渲染管线会开始对 DrawItems 进行分类处理。根据渲染的 Material 的需求，DrawItems 会被分发至三个不同的 Pass，分别对应 Opaque、Shadowcast 和 Transparent 三个阶段，关系到材质属性和阴影投射：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Opaque：用于绘制完全遮挡光线的物体，如墙面、地板、角色模型等。这类物体会首先渲染，通过深度缓冲区（Z-Buffer）完成遮挡剔除，避免后续无效绘制，提升渲染效率。&lt;/li&gt;
&lt;li&gt;Shadowcast：专门处理场景中的阴影投射。此阶段会根据光源信息，对具有投影能力的物体进行阴影绘制，为场景添加真实感与空间深度，尤其适用于强光源或需要表现光影效果的环境。&lt;/li&gt;
&lt;li&gt;Transparent：负责绘制允许光线穿透的半透明物体，如玻璃、水面、特效粒子等。透明物体通常需要根据视角进行深度排序，以保证前后层次正确渲染，避免视觉穿插错误。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过将 DrawItems 按照物体特性分发至不同 Pass，渲染管线能够有针对性地对 Effect 进行实现。&lt;/p&gt;
&lt;p&gt;业务侧可以在代码里创建一个指定的 Material，之后管线就会走到对应的 pass 进行处理：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 创建一个立方体网格
const cube = new cc.MeshRenderer();
cube.mesh = cc.GizmoMesh.createBox(1, 1, 1);

// 设置材质为不透明
const opaqueMaterial = cc.Material.create();
opaqueMaterial.initialize({
    effectName: &apos;builtin-unlit&apos;,
    technique: &apos;opaque&apos;,
});
cube.setMaterial(opaqueMaterial, 0);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因为我们 Demo 较为简单，因此最后生成的 StageInfo 只包含 Opaque Pass：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2037.png&quot; alt=&quot;&quot; /&gt;当然，在 Cocos 中也是支持自定义渲染管线，实际上就是自定义这个环节的 Passes，定义完之后可以直接应用在 Opaque、Shadowcast 和 Transparent 三个阶段之上：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2038.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.7 ModelView Transformation&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2039.png&quot; alt=&quot;&quot; /&gt;经过 Passes 之后，场景中的 DrawItems 会根据其属性被分别送入 OpaqueStage Renderer、Shadowcast Renderer 和 Transparent Renderer 进行初步处理。各个 Renderer 在此阶段主要负责更新与视图相关的 Uniforms（如矩阵、材质参数等），以确保后续渲染过程中所需的视角、空间信息正确。这一部分可归类为 View Transformation 阶段，统一完成视图坐标系下的变换数据准备。&lt;/p&gt;
&lt;p&gt;紧接着不同的渲染阶段会有差异化的预处理操作：不透明物体和透明物体会分别执行 SubmitLight 以提交光照信息，而投影阶段则专门进行 SubmitShadow 以生成阴影数据。同时，透明阶段由于涉及深度排序问题，还会额外执行 Calculate zdist 以计算对象的深度信息。&lt;/p&gt;
&lt;p&gt;所有这些预处理完成之后，最终将统一进入 ModelView Transformation 阶段，得到视图投影矩阵，从而完成从模型空间到屏幕空间的最终变换，以便于后续的图元栅格化与像素着色工作。&lt;/p&gt;
&lt;p&gt;在讲解 ModelView Transformation 之前，先来介绍下游戏系统中的坐标系统的定义。一般会涉及物体坐标、世界坐标与相机坐标三种主要坐标系。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;物体坐标系：以物体自身的中心点（anchor 通常设置为(0.5, 0.5)）为原点，用于描述物体内部各个部位的位置关系，便于定义复杂物体内部的原子结构关系。&lt;/li&gt;
&lt;li&gt;世界坐标系：则是以整个场景的中心作为原点，用来统一描述场景内所有物体、相机以及光源的位置关系，确保场景整体的空间一致性。&lt;/li&gt;
&lt;li&gt;相机坐标系：以相机的位置作为原点，是为了将 3D 空间转化为 2D 图像，以便进行计算和渲染。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2040.png&quot; alt=&quot;&quot; /&gt;基于这套坐标系统下，观测变换（Viewing Transformation）主要包括视图变换、模型变换与投影变换三个步骤。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;视图变换：可看作是将相机放置到场景中的过程，主要是定义相机的朝向和位置。&lt;/li&gt;
&lt;li&gt;模型变换：对物体进行放置或调整位置、旋转以及缩放等操作。&lt;/li&gt;
&lt;li&gt;投影变换：类似于摄影，通过投影方式，将三维物体的信息映射到二维的屏幕空间。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2041.png&quot; alt=&quot;&quot; /&gt;下面重点说说投影变换（Projection Transformation），它分为正交投影（Orthographic Projection）与透视投影（Perspective Projection）两种方式。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;正交投影常用于工程制图软件，不体现远近透视效果；&lt;/li&gt;
&lt;li&gt;透视投影广泛应用于游戏、渲染引擎中，能更真实地模拟人眼观察到的空间透视效果。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而透视投影的数学本质是压缩加上正交投影的结合，实际将一个无限延伸的观察空间（视锥体）转化为一个便于计算的立方体。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2042.png&quot; alt=&quot;&quot; /&gt;这里简单画了个图来介绍透视变换的实现，fov（视角）定义相机的视场宽度，可以分为水平fov与垂直 fov；distance 定义投影平面与相机之间的距离。视景空间通过近裁剪平面（near）和远裁剪平面（far）定义渲染的范围，通过相似三角形的计算，最终将 3D 空间映射到 2D 屏幕（Canvas）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2043.png&quot; alt=&quot;&quot; /&gt;说完了透视投影，我们再看看投影变换的另一种方式——正交投影。其通常有实现的方式有两种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;直接舍弃Z坐标，将 3D 物体转化为 2D 物体，直观但无法表现空间深度；&lt;/li&gt;
&lt;li&gt;将观察空间变换成标准的立方体后，利用变换矩阵进行计算。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2044.png&quot; alt=&quot;&quot; /&gt;综上，坐标转换流程具体包括物体坐标到世界坐标，再到相机坐标，接着到投影坐标，最终映射到屏幕坐标。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先，在编辑器中定义坐标相加的关系，将物体放置到场景中；&lt;/li&gt;
&lt;li&gt;之后，通过视图变换调整相机位置、模型变换调整物体位置；&lt;/li&gt;
&lt;li&gt;再经过投影变换将 3D 空间投射到 2D 空间；&lt;/li&gt;
&lt;li&gt;最后进行坐标系转换，确保渲染到正确的屏幕位置。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2045.png&quot; alt=&quot;&quot; /&gt;在这个过程中，会计算得到视图矩阵（View Matrix）、投影矩阵（Projection Matrix），最终矩阵相乘拿到视图投影矩阵（Model-View-Projection Matrix）。我们结合 Demo 游戏的断点数据，分别看看他们仨是怎么计算得到的。&lt;/p&gt;
&lt;p&gt;首先是视图矩阵，它负责将世界坐标系转化为相机坐标系，其中包含坐标轴的缩放和平移操作。实际计算中，通常涉及坐标轴补齐，即齐次坐标的补齐过程，确保矩阵运算的有效性。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2046.png&quot; alt=&quot;&quot; /&gt;之后是计算投影矩阵，它用于将相机空间进一步映射到标准化的设备空间（Normalized Device Coordinates, NDC），矩阵中的缩放系数根据屏幕的宽高比和设定的正交高度来计算。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2047.png&quot; alt=&quot;&quot; /&gt;最终的渲染过程通常使用视图投影矩阵（Model-View-Projection Matrix, MVP）。视图投影矩阵是视图矩阵与投影矩阵的组合，用于最终的顶点变换和着色器渲染计算。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2048.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.8 Link Program&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2049.png&quot; alt=&quot;&quot; /&gt;接下来进入到着色器的创建与 Link 阶段，首先是创建图元：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2050.png&quot; alt=&quot;&quot; /&gt;之后是创建顶点着色器和片元着色器：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2051.png&quot; alt=&quot;&quot; /&gt;值得关注的是，在 Cocos 中有一共有 11 个内置着色器，其中前 5 个处理 2D 渲染相关，builtin-clear-stencil|vs|fs 用于清楚模板缓冲区，7-10 3D 渲染相关，最后一个用于处理 3D 光照：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;builtin-2d-spine|vs|fs&lt;/li&gt;
&lt;li&gt;builtin-2d-graphics|vs|fs&lt;/li&gt;
&lt;li&gt;builtin-2d-label|vs|fs&lt;/li&gt;
&lt;li&gt;builtin-2d-sprite|vs|fs&lt;/li&gt;
&lt;li&gt;builtin-2d-gray-sprite|vs|fs&lt;/li&gt;
&lt;li&gt;builtin-clear-stencil|vs|fs&lt;/li&gt;
&lt;li&gt;builtin-3d-trail|particle-trail:vs_main|tinted-fs:add&lt;/li&gt;
&lt;li&gt;builtin-3d-trail|particle-trail:vs_main|tinted-fs:multiply&lt;/li&gt;
&lt;li&gt;builtin-3d-trail|particle-trail:vs_main|no-tint-fs:addSmooth&lt;/li&gt;
&lt;li&gt;builtin-3d-trail|particle-trail:vs_main|no-tint-fs:premultiplied&lt;/li&gt;
&lt;li&gt;builtin-unlit|unlit-vs|unlit-fs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文中的 Demo 是使用内置着色器模板进行创建的。&lt;/p&gt;
&lt;p&gt;接着创建着色器程序，Link 上我们创建的顶点着色器和片元着色器。紧接着，设置着色器中所需要的 Uniforms 变量，这里就包括纹理和我们上一步计算得到的视图投影矩阵：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2052.png&quot; alt=&quot;&quot; /&gt;最终，我们的 Framebuffer 会附着上颜色附件、深度附件与模板附件：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2053.png&quot; alt=&quot;&quot; /&gt;需要注意的是对于刚创建完的 FrameBuffer 不能立即使用，因为它还不完整（Complete）。而一个完整的帧缓冲需要满足以下的条件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;附加至少一个缓冲（颜色、深度或模板缓冲）。&lt;/li&gt;
&lt;li&gt;至少有一个 GL_COLOR_ATTACHMENT。&lt;/li&gt;
&lt;li&gt;所有的附件都必须是完整的（保留了内存）。&lt;/li&gt;
&lt;li&gt;若开启 Multisampling，则每个缓冲都应该有相同的样本数(sample)。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此需要使用 &lt;code&gt;glCheckFramebufferStatus&lt;/code&gt; 对缓冲区的完整性做出检查：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) {
    // ...
    // notify native: getInstance()-&amp;gt;glErrorCallback(GL_ERROR, errMsg);
    return;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.9 Blend &amp;amp; Test&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2054.png&quot; alt=&quot;&quot; /&gt;接着依次进入执行 混合（Blend）、深度测试（Depth Test）、模版测试（Stencil Test）。&lt;/p&gt;
&lt;p&gt;首先是 Blend，顾名思义讲两个颜色进行混合。下图展示了混合方程的计算方式：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2055.png&quot; alt=&quot;&quot; /&gt;OpenGL 中常用的混合函数如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2056.png&quot; alt=&quot;&quot; /&gt;下面是一个简单的例子，使用着色器来创建红色蒙版的 Blend 效果：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2057.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2058.png&quot; alt=&quot;&quot; /&gt;深度测试（Depth Test）在图形渲染中用来决定每个像素是否显示。启用深度测试时，OpenGL会将当前片段的深度值与深度缓冲区的值进行比较。如果通过测试，深度缓冲区将更新为新的深度值，否则该片段会被丢弃。下图展示了 OpenGL 中常用的深度测试函数：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2059.png&quot; alt=&quot;&quot; /&gt;而模板测试（Stencil Test）则用于限制渲染区域。通过模板缓冲区，可以在渲染时创建特殊的区域标记，只有符合模板缓冲区设定条件的片段才会被渲染到屏幕上。模板缓冲区允许实现诸如阴影、镜面效果、轮廓高亮等复杂渲染效果。下图展示了 OpenGL 中常用的模版测试函数：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2060.png&quot; alt=&quot;&quot; /&gt;上述的结果最终都会与 Framebuffer 的 Attachment 机制相关联。Framebuffer 的 Attachment 机制决定了渲染结果如何输出到缓冲区中。Framebuffer 通常会附带多个 buffer，包括颜色缓冲区（GL_COLOR_ATTACHMENT）、深度缓冲区（GL_DEPTH_ATTACHMENT）和模板缓冲区（GL_STENCIL_ATTACHMENT），他们共同决定了最终渲染的结果。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2061.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.10 Commit &amp;amp; Draw Pass&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2062.png&quot; alt=&quot;&quot; /&gt;到了管线的最后一步，便是提交（Commit）和绘制（Draw）。&lt;/p&gt;
&lt;p&gt;在 Cocos 中每一帧会存储两种状态，一个是当前画面帧的状态（currentState），另一个是我们即将渲染帧的状态（nextState）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2063.png&quot; alt=&quot;&quot; /&gt;我们需要依次计算 nextState 中的各个部分的 state，之后将 nextState 和 currentState 的状态值做 diff，如果某个环节的状态值不一致，便会触发 commit 操作。以便管线最大程度利用缓存结果。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2064.png&quot; alt=&quot;&quot; /&gt;下面依次介绍下管线中需要管理的状态值：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Blend States、Depth States、Stencil States&lt;/li&gt;
&lt;li&gt;Cull Mode&lt;/li&gt;
&lt;li&gt;Vertex Buffer&lt;/li&gt;
&lt;li&gt;Program&lt;/li&gt;
&lt;li&gt;Textures&lt;/li&gt;
&lt;li&gt;Uniforms&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其中 Program 通常在管线初始化时所有的着色器都会准备好，非极端情况下缓存不会失效，因此上面的图中没有标出这个状态。&lt;/p&gt;
&lt;p&gt;Blend States、Depth States、Stencil States 分别存储了我们前文所说的 Blend、Depth Test、Stencil Test 过程中涉及到的 GL 调用的参数和部分结果，这里就不详述了。&lt;/p&gt;
&lt;p&gt;接着是 Cull Mode，根据顶点的索引的顺逆时针来用来区分正面与反面，如果状态值和 currentState 不一样，便触发 &lt;code&gt;glCullFace&lt;/code&gt; 的调用来进行 commit。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2065.png&quot; alt=&quot;&quot; /&gt;对应顶点缓冲区也是一样有状态值管理，如果变脏了，就需要重新调用 &lt;code&gt;glBindBuffer&lt;/code&gt; 进行绑定：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2066.png&quot; alt=&quot;&quot; /&gt;着色器程序也是一样的，如果脏了，就重新调用 &lt;code&gt;glUseProgram&lt;/code&gt; 进行设置：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2067.png&quot; alt=&quot;&quot; /&gt;接着便是对 Textures 的检查和提交，这里有两个知识点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;纹理的应用：具体涉及到 &lt;code&gt;glActiveTexture&lt;/code&gt; 和 &lt;code&gt;glBindTexture&lt;/code&gt;。首先使用 &lt;code&gt;glActiveTexture&lt;/code&gt; 函数来选择当前要激活的纹理单元，这一步决定了接下来绑定的纹理将作用于哪个纹理单元上。然后，通过 &lt;code&gt;glBindTexture&lt;/code&gt; 函数将具体的纹理对象绑定到特定的纹理目标上。通过这种机制，纹理对象与对应的纹理单元和目标进行关联，从而完成纹理的激活与绑定操作。&lt;/li&gt;
&lt;li&gt;纹理单元：用于表示显卡可以同时管理的多个纹理。默认情况下，&lt;code&gt;GL_TEXTURE0&lt;/code&gt; 纹理单元总是被激活的状态。此外，OpenGL 规范保证至少支持 16 个纹理单元（即从&lt;code&gt;GL_TEXTURE0&lt;/code&gt; 到 &lt;code&gt;GL_TEXTURE15&lt;/code&gt;）。纹理单元是按顺序定义的，因此我们可以通过诸如 &lt;code&gt;GL_TEXTURE0 + 8&lt;/code&gt; 的方式便捷地访问特定编号的纹理单元，以便在复杂的渲染场景中实现多纹理同时使用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2068.png&quot; alt=&quot;&quot; /&gt;当前面的状态值都准备并提交完毕后，最后需要管理的状态值是 Uniforms，这一步如果有脏区产生，也需要重新提交 Uniforms 变量。比如游戏 Demo，涉及到的 Uniforms 变量有 &lt;code&gt;cc_matViewProj&lt;/code&gt; 和 &lt;code&gt;texture&lt;/code&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2069.png&quot; alt=&quot;&quot; /&gt;最后就是绘制了，其中在每一帧的绘制前都需要调用 &lt;code&gt;glClear&lt;/code&gt; 清理 Freambuffer 的状态。下图展示了 gl 指令调用的时序：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2070.png&quot; alt=&quot;&quot; /&gt;由于游戏 Demo 比较简单，绘制只需要准备好纹理和 Uniforms 即可，最后调用 &lt;code&gt;glDrawArrays&lt;/code&gt; 或 &lt;code&gt;glDrawElements&lt;/code&gt; 将准备好 Framebuffer 绘制上屏：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2071.png&quot; alt=&quot;&quot; /&gt;至此，经历了这一系列的管线处理之后，我们的 Demo 游戏在小游戏容器内完成了上屏。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2072.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;扩展阅读&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;《GAMES 101》&lt;/li&gt;
&lt;li&gt;《计算机图形学入门：3D渲染指南》&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://learnopengl-cn.github.io/&quot;&gt;LearnOpenGLCN&lt;/a&gt;》&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=game-engine-renderer&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>月刊（第29期）：新生活</title><link>https://ursb.me/posts/weekly-29/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-29/</guid><description>记录从TME离职后六个月Gap期的完整规划与选择：一边推进MoFlow创业方向，一边求职拿到TikTok与Bilibili两份offer，最终告别深圳、赴新加坡入职TikTok，开启异国新生活。</description><pubDate>Fri, 18 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本篇是对二〇二五年二月至四月的记录与思考。&lt;/p&gt;
&lt;h2&gt;近况&lt;/h2&gt;
&lt;p&gt;新年之后有两个多月没有更新月刊了，这篇文章聊一聊自己的近况。&lt;/p&gt;
&lt;h3&gt;规划&lt;/h3&gt;
&lt;p&gt;去年 10 月我从 TME 离职，趁着这次 gap，我规划了两条路线，并限定了自己 gap 的时间最长为 6 个月，我需要在 6 个月里完成既定的 PlanA 或 PlanB。其中给了 PlanA 的 MoFlow 3 个月的研发时间和 2 个月的运营测试时间。而如果没有达到初期既定的运营指标，我将暂停这部分的工作，将项目交接给合伙人。正因为时间有限，所以项目前期的开发节奏才会这么紧张。因此哪怕去了大理旅居，也几乎没有出门娱乐，这在我后来的回忆里一直是个遗憾。&lt;/p&gt;
&lt;p&gt;PlanB 则是规避创业风险，回归职场。而我一直以来都有出国发展的规划，因此我希望这次就直接找一个 Base 地在海外的工作。那 gap 的最后一个月，就开始进行面试的准备了，我需要在一个月内拿到 offer。&lt;/p&gt;
&lt;p&gt;虽然时间短暂，尤其是海外岗位还要准备英语。但我坚信无论何时，关于我们能做什么都有无数个选项。如果我们一遇到事就认为自己做不到，那扇通往无限可能的大门便随即向我们关闭了。我不愿如此，我要尽我所能去触及所有的可能性。&lt;/p&gt;
&lt;h3&gt;面试&lt;/h3&gt;
&lt;p&gt;于是年后开始准备面试、投递简历。这是我的第二份工作，因此选择公司的时候比较谨慎。&lt;/p&gt;
&lt;p&gt;细细考虑未来的规划之后，我分了 3 个赛道进行投递：海外赛道 TikTok、Apple，管理岗赛道 Bilibili 和 Anker，以及为了对冲风险还投了微信保底。其中 Bilibili 过了，而且 scope 15 个人左右，就没有去面 Anker 了；Apple 只能 Base 北京，且能力不匹配，放弃。&lt;/p&gt;
&lt;p&gt;最后的面试结果是 TikTok、Bilibili 过，微信在四面面委面主动放弃，因为那时已经进入了 TikTok HR 面。而且从自己面试过程的体验而言，也是 TikTok &amp;gt; Bilibili &amp;gt; 其他。最后很幸运，能如愿以偿来到 TikTok，拿到了预期的 offer。&lt;/p&gt;
&lt;h3&gt;离别&lt;/h3&gt;
&lt;p&gt;TikTok 的岗位 Base 在新加坡，出国的各种手续都由公司包办了，但是对于自己而言还涉及到很多资产要去处理。一些旧的设备能卖的都卖了，但是最中意的 mini 一直没下定决心。最后一个月里天天开着它，去了周边的许多城市，最终还是在出国的前一天将它出售了。直接二手交易卖给了当时我买它的 4S 店，价格还算能接受。&lt;/p&gt;
&lt;p&gt;最后一个月回到深圳，见了一些前同事、以前的老同学，还去了一趟苏州和前舍友告了别。算来，在广东待了 11 年，深圳待了将近 6 年。这么长的时光，没有换来多少轰轰烈烈的回忆，以至于离别的时候，心中更多的是伤感。&lt;/p&gt;
&lt;p&gt;突然想到《少年巴比伦》里的一句话：“离别总之是伤感的，因为伤感，所以不能用言语来表达，好像春天里绵密的细雨，用肉眼都分辨不出雨丝，不知道该不该打伞。”那时我的状态大约也是如此，不知道自己失去了什么，但是我能意识到那根弦似乎是要断了。&lt;/p&gt;
&lt;p&gt;有时候我会对电视剧或小说的结局感到害怕，因此大多数剧集我总是留着最后几集不去看，或者过了很久很久之后有了足够的心情才去选择去看。我害怕一切的结局，但是我同时对结局之后的一切充满期待和希望。&lt;/p&gt;
&lt;p&gt;这一篇章属于我的结局走到了这里，那么以后的生活又会是怎么样的呢？&lt;/p&gt;
&lt;h3&gt;新生活&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;生活在视界中的人从来不是安处于某处，而是永远在路上。——詹姆斯·卡斯《有限与无限的游戏》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我们永远都在路上，每一个结尾都是一个新的起点，是重新审视自我、重塑故事的机会。在这个过程中，变化是永恒的，我们对自我的理解和定义则是不断发展的。而我对这个世界则一直有深沉的热爱和长久的好奇，而且我幸运地将它们保存到如今。&lt;/p&gt;
&lt;p&gt;孤身抵达新加坡、面对即将加入的新职场，尤其是某红书上对于新加坡和 TikTok 的口碑一直很差，我有很多不安。但我面试的时候感受还是不错的，我相信我的感受。我知道这只是我面对不确定性的恐慌，但我知道这也将是一个机遇，我能够从中挖掘出自己的好奇与热爱。生命之于我们，或许意味着不断地将我们自身及所遭遇的一切转化为光与火。&lt;/p&gt;
&lt;p&gt;而经过一周的职场体验，我确信这是值得我全身心投入第二段职业生涯的团队。团队氛围其乐融融，上下之间、同事之间不存在任何隔阂，项目之内不存在信息差，如果想学习想成长，大门随时都在那里。&lt;/p&gt;
&lt;p&gt;入职第一天晚，团队里一个同学要转岗了，他请客大家一起吃了顿大餐。饭桌上大家的话题让我笑得合不拢嘴。&lt;/p&gt;
&lt;p&gt;入职第三天，团队去环球影城团建，路上我跟丢了中国小伙伴们，只能跟着团队里的外国人一起游玩。在排队的时候，大家会很照顾我，哪怕我口语不好、甚至有些听不明白，但大伙也边比划着边和我交流。&lt;/p&gt;
&lt;p&gt;入职第四天晚，隔壁服务端组的 ld 请我们吃了肉骨茶，发现不仅是团队里，整个部门的氛围都超乎了预期的好。&lt;/p&gt;
&lt;p&gt;今天是入职第五天，Good Friday 的假期，我在宾馆里写着这些文字，回忆起这周的日子，充实且开心着。&lt;/p&gt;
&lt;p&gt;詹姆斯·卡斯在《有限与无限的游戏》中说：“如果我要知道自己生命的全部故事，我就必定已经将它译为一种解释。就好像我能成为自己的旁观者，同时看见自己生命的第一幕与最后一幕，好像我能看穿自己生命的全部。如果这样的话，我就不是在生活，而是在表演生活。”&lt;/p&gt;
&lt;p&gt;我很庆幸我不知道所有的故事，我还抱有着对未来的可能性和好奇心。我还继续爱着这个世界，我还在这个世界之中，生活着。&lt;/p&gt;
&lt;p&gt;庆幸一切。&lt;/p&gt;
&lt;h2&gt;🌺 生活点滴&lt;/h2&gt;
&lt;p&gt;以下是本周期内一些瞬间的记录。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🌍 深圳&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是这些年在深圳的足迹，还有很多迷雾没有探索，希望还有机会继续开图。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418140323.png&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;🌸 苏州&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;去苏州找了丁同学，之前玩得很好的舍友。前段时间偶然收到了他的来信，互相交流了下这些年的情况，才意识到我们已经很多年没有见面了，于是走之前去找他一次。实名羡慕他的工作和住处…非常大的房子，有自己的电竞房，微软的工作也使他非常闲适。走之前的晚上，一起去玩了个病娇的剧本杀——他是星期一，我是星期二。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418131851.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418131843.png&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;✈️ 新加坡的第一天&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;下午的飞机，到机场被海关关小黑屋了，直到傍晚才放我出来。来到这里之后，所有的一切都是第一次。第二天在公司周边转了转。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418140924.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418140928.png&quot; alt=&quot;&quot; /&gt;另外，office 是个海景楼！（PS. 职场不让拍照，这个在低楼层的食堂拍的…）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418141042.png&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;⛱️ 团建&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;第一次去环球影城，运气好，刚来就赶上团建了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418141213.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418141218.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418141233.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418141239.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418141317.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;🎬 书影音&lt;/h2&gt;
&lt;p&gt;以下是本周期的书影音记录。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;读完：传记 |《我可能错了》| ★★★★★&lt;/li&gt;
&lt;li&gt;读完：小说 |《少年巴比伦》| ★★★★☆&lt;/li&gt;
&lt;li&gt;读完：哲学 |《箭术与禅心》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;在读：传记 |《小米创业思考》| ★★★★☆&lt;/li&gt;
&lt;li&gt;在读：散文 |《世间的小儿女》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：动漫 |《葬送的芙莉莲》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：电影 |《扬名立万》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《哪吒之魔童闹海》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：剧集 |《棋士》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：剧集 |《漂白》| ★☆☆☆☆&lt;/li&gt;
&lt;li&gt;玩过：游戏 |《三角战略》| ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-29&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>2024，告别盛夏</title><link>https://ursb.me/posts/summary-2024/</link><guid isPermaLink="true">https://ursb.me/posts/summary-2024/</guid><description>2024年终总结：辞去五年的TME工作投身创业，推出AI心理产品MoFlow并历经App Store审核受阻的波折，反思对失控的焦虑，记录读者来信与他人善意带来的力量。</description><pubDate>Sat, 01 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;自写年终总结以来，这已是第七个年头。这一年发生了许多事，在很多方面主动或被动地打破了过往的平衡与常规。勇敢过、彷徨过、迷茫过、失望过、痛苦过，但或许这是好事，毕竟年龄已悄然迈向而立之年。而一切，不破不立。&lt;/p&gt;
&lt;h2&gt;工作&lt;/h2&gt;
&lt;h3&gt;毕业这五年&lt;/h3&gt;
&lt;p&gt;这一年的主题是「告别盛夏」，来自于今年的大事件——《再见了，盛夏》。由于对不确定性的向往、对创业项目的期待，以及其他种种原因，我离开了校招毕业待了五年的企业——TME。&lt;/p&gt;
&lt;p&gt;说实话，离开是不舍的，无论是当时还是后来，虽有遗憾，但并不后悔。转眼之间，这五年只剩下回忆。&lt;/p&gt;
&lt;p&gt;2018 年 3 月，将校招实习的简历投递给了腾讯和蚂蚁，记得当时周五晚投递之后就有人联系我周六电话面试，是 SNG 的 QQ 音乐。面试的问题已然不太记得了，但去年离别时领导和我说，那天捞了我的简历之后他怕我跑了，于是周六早上来公司加班过来面试。他觉得这几年耽误了我，他认为我的前途原可以更宽阔，而我却完全没有类似的懊悔和遗憾，只有相遇的感激。&lt;/p&gt;
&lt;p&gt;我很感激自己遇到了这个团队，当初 SNG 的音乐要被拆家成子公司，HR 一再确认我是否要续约，因为校招的合同将不再是腾讯而是 TME；而蚂蚁当年前端网红团队，加上即将上市的风口，大家都趋之若鹜。但在短暂的音乐实习过后，我毅然选择了留下来。我很喜欢当时的团队氛围，有导师的关照、同事之间的交流打趣、产研之间的互相欣赏和平等讨论，仿佛一切还在象牙塔之中，以至于五年后的今天我仍很怀念刚毕业时的状态，现在联系较多的朋友也是那两年团队里的同事们。&lt;/p&gt;
&lt;h3&gt;晋升的瓶颈与路径&lt;/h3&gt;
&lt;p&gt;回忆总是美好的，但现实无法如愿。&lt;/p&gt;
&lt;p&gt;在工作期间，我愿付出 100% 精力投入，并且我坚信自己可以把手上的项目做到最好。在毕业 2 年半快速升到 T10 之后，我遇到了第一个瓶颈——没有成长型的项目了。&lt;/p&gt;
&lt;p&gt;那一年互联网下行，各企业开始裁员。我们团队也因为部门的业务压力，每天的工作都是琐事，需要多线程同时负责数个需求，甚至在研发过程中的业务也会经常发生变化——今天付出加班精力做的项目，说不定明天就突然被砍了。不再安稳，不知道努力的结局，发现不到成长的契机。于是，想办法提升工作效率，努力适应这个氛围的改变。&lt;/p&gt;
&lt;p&gt;我之前负责的是偏研究型的项目，所以对于并行处理事务的效率是有所欠缺的，需要有意识地去锻炼，恰好可以利用这个契机去培养自己的多线程处理能力和跨团队沟通能力。但我发现，当我成长到能同时处理好三个需求的时候，这时可能会分配更多的需求下来，仿佛永动机一样，最后手上就变成了七、八个需求并行。&lt;/p&gt;
&lt;p&gt;那段时间甚是焦虑，因为之前一直精益求精，但是在并行之后是无法保证每个项目质量的，这个时候我会攻击自己的内心，出了问题之后无法原谅自己的交付质量。&lt;/p&gt;
&lt;p&gt;同时，我意识到如果陷入到这种琐碎的漩涡之中，是几乎不会有成长和突破的，我需要自己找一条路破局——既然自己的部门没有项目，那就去别的部门争取项目。平时工作甚多，那就能周末投入，相当于加班帮别的部门打工。同时，自己也在利用业余时间做一些没有立项的技术项目，想着待生米煮成熟饭，那时不立项也得立。最后一年架构调整，我被分到了之前帮忙加班打工的团队，负责新的项目，升到了 T11。&lt;/p&gt;
&lt;p&gt;在外人看来，我毕业 4 年升到 T11 似乎是一直有好项目的“运气”；但复盘下来可以发现，其实许多资源都是需要靠自己争取来的。运气只是成长的契机，但不是决定成长高度的因子。如果将一切都归因于运气，那么我们就会轻易忽视掉自己的潜力，误以为路径不可复制，从而丧失持续前进的动力，甚至影响到他人对我们的信任和支持。&lt;/p&gt;
&lt;p&gt;树立一个明确的目标之后，剩下的就是想方设法去找到一条可行的路径，抵达它。&lt;/p&gt;
&lt;h2&gt;创业&lt;/h2&gt;
&lt;h3&gt;MoFlow&lt;/h3&gt;
&lt;p&gt;离开 TME 之后，我选择创业。在今年 8 月做了一个月的赛道分析和用研之后，召集了几个小伙伴，立项了 AI + 心理的产品 —— &lt;a href=&quot;https://moflowapp.com/&quot;&gt;MoFlow&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;关于 MoFlow 的内容写过&lt;a href=&quot;https://blog.ursb.me/posts/moflow/&quot;&gt;《AI 心理疗愈应用的探索与实现》&lt;/a&gt;介绍分析过，这里不再赘述项目内容了。我期望能够通过这款产品普及大家对于心理健康领域的关注，以鼓励用户进行自我对话、自我成长、自我关爱。&lt;/p&gt;
&lt;p&gt;如同在上篇月刊&lt;a href=&quot;https://blog.ursb.me/posts/weekly-28/&quot;&gt;《AI 没有体验世界的能力》&lt;/a&gt;中提到的那样：“关注、关心和关爱——这些都是我们会收到的礼物，同时也是我们可以用来赠予他人的礼物，因为这些礼物只有在一种慷慨相待的生活中才会展现其活力。我们学习理论，并不是为了通过吊书袋式的显摆来彰显自己的存在，关键在于如何改变世界。每一次实践背后都闪耀着众多灵魂的力量，这些努力最终都落到实处，为他人带来福祉——这才是我们追求的实践意义。”&lt;/p&gt;
&lt;h3&gt;研发&lt;/h3&gt;
&lt;p&gt;通过这个项目，我得以有机会充分去接触、体验、研究、开发各类 AI+ 的应用层产品，算是补足了在职场期间的空缺，同时找到了对于产品、对于研发最初的动心与热爱。&lt;/p&gt;
&lt;p&gt;10 月离职后进入研发阶段，产品侧、设计侧、研发侧、LLM 侧、运营侧拉满效率并行，基本上三天一个小周期开发一个功能模块，9-12-6 连轴转。终于在 11 月底如期推出了 TF 内测版，内测阶段也保持着一天一版本的迭代进度，在 12 月底上架了 App Store。&lt;/p&gt;
&lt;p&gt;整个项目的工作量对于小团队而言是巨大的，但是大家始终保持着积极的沟通和研发热情，所有人的力量仿佛拧成一股绳，指向同一个方向。虽然劳累，但满怀热情，不知疲惫。&lt;/p&gt;
&lt;p&gt;项目上线后各路资方联系，但我们决定不融资，因为产品收入足以支撑它健康的转动起来。因此我们首要目标是将基础数据打磨好，以服务好用户。在收到一些用户的认可的反馈后，我们也由衷地感到温暖：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/IMG_5141.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;挑战&lt;/h3&gt;
&lt;p&gt;在内测阶段的和上线初期，产品暴露了一些问题，我们及时做出调整和修复，比如上线后对于输入模块的调整，让留存得以提升。预留了一个月的打磨阶段，一切仿佛都在往好的方向发展。&lt;/p&gt;
&lt;p&gt;但在上线后没几天，我们的其中一个提审版本就一直被 App Review 卡在“正在审核”中了，至今已经被卡了一个多月，Bug 修复无法发布，期间规划的 4 个版本所包含的重要特性也被卡住无法发布……只收到审核员的一句“我们需要更多时间来进行审核”，之后就再也没有下文了。&lt;/p&gt;
&lt;p&gt;因为线上版本存在 Bug 我们甚至也没法铺开推量，焦虑、恐慌、不安在团队中弥漫开来。期间我尝试过撤回重提、修改 ASO/描述/截图/标题、备注 Bug 和审核员沟通、邮件联系 Apple Support、电话联系 Apple 客服、找某宝加速渠道、状态查询申请、加急审核申请、内渠加急申请、找 WWDR 咨询，唯一的回复只是“请耐心等待”。查询了开发者论坛上的相关讨论，遇到这种情况基本要被卡 2 个月以上，论坛中充满了吐槽和抱怨。&lt;/p&gt;
&lt;p&gt;因为没有做动态化的部分，以及对相关情况的预案不充分，我们只得暂时放慢了功能迭代节奏，将工作重心转到了服务端和 LLM 侧的优化上来。并预计年后，启动全新模块的研发，不再依赖短平快的迭代节奏。但无论如何，上线初期就遇到这种情况，让我感到焦虑万分。&lt;/p&gt;
&lt;h3&gt;反思&lt;/h3&gt;
&lt;p&gt;那两周我一直在 MoFlow 中记录、吐槽这件事情，直到某个周一早上，MoFlow 的周报服务给我推送了一条消息，让我逐渐发现自己的问题所在。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/Picsew_20250121095546.jpg&quot; alt=&quot;&quot; /&gt;“模式上，每当遇到这些超出你控制范围的事情，你的情绪就会受到较大的影响。”&lt;/p&gt;
&lt;p&gt;我反思了之后，发现确实如此。一直以来我都追求对事物的完全把控，不允许让工作内容超出自己的掌控，否则我就会不安焦虑、甚至暴躁易怒。包括前文提到的那一年的工作焦虑，也是被强行穿插的诸多琐事积压，导致无法把控自己的项目质量，从而让自己陷入焦虑之中。&lt;/p&gt;
&lt;p&gt;如果再进一步往深层剖析，是我自己一直以来都不允许自己停下来，永远被困在对未来的追赶之中。&lt;/p&gt;
&lt;p&gt;前两天在给读者的回信中我写到：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我之前一直很恐惧在雾中原地踏步，每一天、每一分、每一秒都恐惧着，于是想拼劲全力抓住流逝的时间，拼命学习、工作，想走出来，尝试去把握住那些“不确定”中的“确定”。走出来之后我才发现，我所恐惧的其实不是“不确定”本身，而是“原地停留”这件事情，这导致我一直活在对「未来」的追逐中。每当我赶上未来时，它在我手中便失去了价值，于是继续去追赶另一个虚无缥缈的未来，精疲力竭。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;然而实际上，“不确定”并不可怕、失败也不可怕，重要的是面对这团迷雾的态度——享受挑战，享受探索，享受当下的一切。打磨心性，放慢脚步，“不是目标成就了你，而是你走向目标的每一步成就了你”。正确的方向是在达到目的的过程中，而非目的的达成；不是走入旅馆，而是走向旅馆；不是得到桂冠，而是追求桂冠。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如同《箭术与禅心》中所提到的“当下的真心”，重要的是在当前时刻保持完全的觉知和正念，而不被过去的记忆或未来的期望所干扰。专注于当前的体验和感受，放下自我的投射，去体验一种纯粹的存在状态。&lt;/p&gt;
&lt;p&gt;人生不是竞赛，是探索。生命的旅途并非一连串的终点，而是一系列的旅程。每一个目标的实现只是暂时的停靠，而真正的意义在于如何珍藏好每一个当下，走向这些目标。&lt;/p&gt;
&lt;h2&gt;能量&lt;/h2&gt;
&lt;p&gt;生活上今年并不如意，所遇种种皆怀痛楚，长这么大第一次没有回家过年。痛楚的部分就不展开说了，反过来分享一下今年搜集到的一些能量光点吧。&lt;/p&gt;
&lt;h3&gt;来信中的能量&lt;/h3&gt;
&lt;p&gt;今年的来信比往年要少一些，只有 31 封。一直以来，我都认为回复来信是一件消耗能量的事情，在&lt;a href=&quot;https://blog.ursb.me/posts/moflow/&quot;&gt;《AI 心理疗愈应用的探索与实现》&lt;/a&gt;中我曾描述过这种回信的体验：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;然而坦率地说，在来信数较少的日子里，我会感到轻松许多。每次回复来信时，我都需设身处地，细细品味来信者的文字，努力与之共情——“若我是他们，在如此境遇下，我该如何应对？”随后，我会整理思绪，将自身的能量转化为回信的内容。通常，一封来信需要一到两周的时间才能回复，因为我自己也需要一个宁静的环境，以便做出最恰当的答复。尝试共情已然如此艰难，更难以想象来信者在现实世界的真实体验中会面对多少痛苦。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;但后来，我发现自己可能错了。信件的回复并非是消耗，我在回信的过程中也会反思自己的处理方式，比如前文提到的那段回信，剖析了我自己对未来的执念。&lt;/p&gt;
&lt;p&gt;此外，有些来信也同时在给予我意想不到的巨大能量。&lt;/p&gt;
&lt;p&gt;年初的时候收到过一封读者的“还愿”：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;祝您除夕快乐！看到您能朝着自己满意的方向前进，我感到非常高兴。我想借此机会向您表示感谢，感谢您对我的点拨（还有您的博文），告诉了我世上存在这么多的自我实现方式。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;无论如何，感谢您能在最开始的回复中点拨了一位迷茫的学子，我也对即将到来的毕业和工作（希望能圆梦省考）充满了期待。希望您能事业有成，一切顺利！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我也很感谢你，当时读来没有更多的感触，但未曾想到时隔一年的信件会在未来的某一刻反哺自己能量。&lt;/p&gt;
&lt;p&gt;以及前些日子另一位读者的一段文字：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在工作这块，我在 9 月读完《再见了，盛夏》后，转发给了我的朋友。问他读完什么感受。他和我说，他最大的感受是难过，字里行间的自由和对未来不确定的向往，是他可能这辈子都无法经历的。看到了有人这样生活，于是，开始审视困住自己的这一方天地。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;其实这篇文章在博客下有许多留言，但来信的这段话让我的感受更加真切。那段时间我正处于巨大的迷茫之中，忽然收到这封来信，看着这段文字仿佛是看着从我某段人生里撕下的几页日记，又从中拾取了勇气和力量。&lt;/p&gt;
&lt;p&gt;以及朋友来信的安慰：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;或许当一个人落魄的时候，更应该爱自己。生活是很现实的，很少有人会越过一个人的外在条件去接触心灵。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我之所以喜欢信件的沟通方式，不仅仅异步沟通便于自己安排时间，更重要的是在&lt;a href=&quot;https://blog.ursb.me/posts/weekly-18/&quot;&gt;《月刊(第 18 期)：逃离社交网络》&lt;/a&gt; 中写到的那样：“写邮件代替细碎聊天也是一个非常不错的方法，可以沉淀自己日常的想法并锻炼表达力，让自己的关注点回归文字本身，赋予语言与情感最真实、细腻的纹理。并且写信本身也是一件较为庄重的事，可以培养生活里的仪式感。”&lt;/p&gt;
&lt;p&gt;我不可能从当下的这一点上看到它与将来的关系，但过些年头之后再回头看，两者之间在一些维度上却存在着千丝万缕的联系。正如乔布斯在斯坦福大学毕业典礼中的演讲所说的：“我们不可能从现在这个点上看到将来；只有回头看时，才会发现它们之间的关系。所以你必须相信，那些点点滴滴，会在你未来的生命里，以某种方式串联起来。你必须相信一些东西——你的勇气、宿命、生活、因缘，随便什么——因为相信这些点滴能够一路连接会给你带来循从本觉的自信，它使你远离平凡，变得与众不同。”&lt;/p&gt;
&lt;h3&gt;他人的善意&lt;/h3&gt;
&lt;p&gt;除了读者来信中的能量，我也十分感谢这一年遇到的种种善意。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;感谢所有的鼓励。&lt;/strong&gt; 在离职期间得到了老朋友的礼物和鼓励，同时意外收获了一些新朋友，让我在前进的道路上坚定不移。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;感谢所有的欣赏。&lt;/strong&gt; 自从自己出来单干之后，不会再有上级的肯定和同事的反馈了，我对自己所做事情的价值都会画上问号，会考虑很多、质疑很多、否定很多。但是用户的反馈让我明确了它是有意义的、用户的付费让我知道它是可以健康走下去的。&lt;/p&gt;
&lt;p&gt;MoFlow 上线前夕，网易云音乐联系到我希望聊一聊合作，视频会议开启的时候我才发现对面坐着的人是两个 VP 和一个部门的负责人，是 1v3 的会议。我们聊了产品的愿景、核心指标的制定、产品可能会面临的问题，一切都很愉快。在会议即将结束之际，我问他们：“可是这些和你们都没有关系呀，在聊之前这也是我所困惑的，没有领域交叉的话，合作对于你们有任何收益吗？”他们说：“合作其实只是一个建立联系的契机，我们看到你的履历和正在做的事情，很欣赏你。认识你，这才是最重要的目的。”我只能打趣道：感谢友商老板的欣赏和肯定。但这一切，确实给予了我很大能量。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;感谢所有的际遇。&lt;/strong&gt; 不仅仅是生活中遇到的人们，还有一些陌生人的留言。这本是一句可有可无的留言，但它的存在让我真切地感受到我们之间的交集：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/20250131171524@2x.png&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;感谢所有的故事。&lt;/strong&gt; 在今年&lt;a href=&quot;https://blog.ursb.me/posts/2024-summer/&quot;&gt;《再见了，盛夏》&lt;/a&gt;发布之后，许多人留言了自己的故事，让我见识到了人生中各种奇妙的可能性。其中有一条微信，让我感慨良多：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/IMG_5143_2.jpg&quot; alt=&quot;&quot; /&gt;她说“做可以想象的事情才能让自己觉得活着”。钦佩之余，我将此谨记于心。&lt;/p&gt;
&lt;p&gt;一口气行文至此，抬头看了下书店桌上的灯光，或是巧合，但更似是命运的低语：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/IMG_5139.jpeg&quot; alt=&quot;&quot; /&gt;&amp;gt; 人生天地之间，若白驹之过隙，忽然而已。——《庄子·知北游》&lt;/p&gt;
&lt;p&gt;或许分离和死亡都不是最可怕的，可怕的是还没想好怎么过好这一生就已经走到了尽头，不论是挫折还是辉煌，不论是平淡还是精彩，都是生命中最好的礼物。&lt;/p&gt;
&lt;p&gt;感恩一切。&lt;/p&gt;
&lt;h2&gt;书影音&lt;/h2&gt;
&lt;p&gt;因为是年终总结，这里照例列举下这年的书影音。&lt;/p&gt;
&lt;h3&gt;剧集&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;《安娜》：★★★★★&lt;/li&gt;
&lt;li&gt;《追风者》：★★★★★&lt;/li&gt;
&lt;li&gt;《玫瑰的故事》：★★★★☆&lt;/li&gt;
&lt;li&gt;《庆余年 2》：★★★★☆&lt;/li&gt;
&lt;li&gt;《千万别回家》：★★★☆☆&lt;/li&gt;
&lt;li&gt;《执行法官》：★★★☆☆&lt;/li&gt;
&lt;li&gt;《漂白》：★★☆☆☆&lt;/li&gt;
&lt;li&gt;《猎冰》：★★☆☆☆&lt;/li&gt;
&lt;li&gt;《白夜破晓》：★★☆☆☆&lt;/li&gt;
&lt;li&gt;《九部的检察官》：★★☆☆☆&lt;/li&gt;
&lt;li&gt;《回响》：★★☆☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;电影&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;《周处除三害》：★★★★★&lt;/li&gt;
&lt;li&gt;《我的阿勒泰》：★★★★★&lt;/li&gt;
&lt;li&gt;《误杀瞒天记 2》：★★★★☆&lt;/li&gt;
&lt;li&gt;《祭屋出租》：★★★★☆&lt;/li&gt;
&lt;li&gt;《异形：夺命舰》：★★★★☆&lt;/li&gt;
&lt;li&gt;《死亡录像》：★★★★☆&lt;/li&gt;
&lt;li&gt;《三大队》：★★★★☆&lt;/li&gt;
&lt;li&gt;《默杀》：★★★★☆&lt;/li&gt;
&lt;li&gt;《因果报应》：★★★★☆&lt;/li&gt;
&lt;li&gt;《飞驰人生 2》：★★★★☆&lt;/li&gt;
&lt;li&gt;《一个母亲的复仇》：★★★☆☆&lt;/li&gt;
&lt;li&gt;《瞒天过海》：★★★☆☆&lt;/li&gt;
&lt;li&gt;《浴火之路》：★★☆☆☆&lt;/li&gt;
&lt;li&gt;《惊天大营救》：★★☆☆☆&lt;/li&gt;
&lt;li&gt;《哥斯拉大战金刚 2》：★★☆☆☆&lt;/li&gt;
&lt;li&gt;《海王 2》：★★☆☆☆&lt;/li&gt;
&lt;li&gt;《被我弄丢的你》：★★☆☆☆&lt;/li&gt;
&lt;li&gt;《末路狂花钱》：★☆☆☆☆&lt;/li&gt;
&lt;li&gt;《维和防暴队》：☆☆☆☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;动漫&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;《葬送的芙莉莲》：★★★★★&lt;/li&gt;
&lt;li&gt;《物理魔法师马修》：★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;阅读&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;《鱼不存在》：★★★★★&lt;/li&gt;
&lt;li&gt;《有限与无限的游戏》：★★★★★&lt;/li&gt;
&lt;li&gt;《亲爱的我饱含杀意》：★★★★★（漫画）&lt;/li&gt;
&lt;li&gt;《六个说谎的大学生》：★★★★☆&lt;/li&gt;
&lt;li&gt;《哲学 100 问：后现代的刺》：★★★★☆&lt;/li&gt;
&lt;li&gt;《书写自愈力》：★★★★☆&lt;/li&gt;
&lt;li&gt;《不要相信你所想的一切》：★★★★☆&lt;/li&gt;
&lt;li&gt;《慢慢变富》：★★★★☆&lt;/li&gt;
&lt;li&gt;《箭术与禅心》：★★★☆☆&lt;/li&gt;
&lt;li&gt;《心灵书写》：★★★☆☆&lt;/li&gt;
&lt;li&gt;《夏日、烟火和我的尸体》：★★★☆☆&lt;/li&gt;
&lt;li&gt;《巴菲特教你读财报》：★★★☆☆&lt;/li&gt;
&lt;li&gt;《无：生命的最佳状态》：★★★☆☆&lt;/li&gt;
&lt;li&gt;《七个证人》：★★☆☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;游戏&lt;/h3&gt;
&lt;p&gt;今年依旧没有怎么玩游戏，看了下只有一款《塞尔达传说：智慧的再现》，没有通关。&lt;/p&gt;
&lt;h3&gt;写作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-25/&quot;&gt;《月刊（第25期）：爱具体的人》&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-26/&quot;&gt;《月刊（第26期）：旅途》&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-27/&quot;&gt;《月刊（第27期）：旅居》&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-28/&quot;&gt;《月刊（第28期）：AI 没有体验世界的能力》&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/2024-summer/&quot;&gt;《再见了，盛夏》&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/moflow/&quot;&gt;《AI 心理疗愈应用的探索与实现》&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/tools/&quot;&gt;《个人工具箱与好物分享》&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/mac-app-share-2024/&quot;&gt;《Mac 小众软件推荐与工作流分享(2024)》&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;《Atum 渲染引擎揭秘——游戏组件的一生：从加载到上屏》&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;新年目标&lt;/h2&gt;
&lt;p&gt;29 岁，是一个可攻可守的年纪。这是一个充满可能性的年纪，希望在今年的破碎之后，我可以在而立之年重建秩序。&lt;/p&gt;
&lt;p&gt;前几天在看《玫瑰的故事》，剧中最后用了一首诗作为结尾，我想把它作为结束语：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我轻松愉快地走向大路&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;我健康自由&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;世界，在我面前&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;长长的褐色的大路，在我面前&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;指向我想去的任何地方&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;从此&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;我不再希求幸福&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;我自己便是幸福&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;凡是我遇见的，我都喜欢&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;一切都被接受&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;从此&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;我不受限制&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;我使我自己自由&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;我走到我愿去的任何地方&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;我完全、绝对地主持着我&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;世界在我面前，指向我想去的任何地方，此后我不再希求幸福，我自己便是幸福。&lt;/p&gt;
&lt;p&gt;愿世间万物，都能迎来开花结果之时。&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=summary-2024&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>月刊（第28期）：AI 没有体验世界的能力</title><link>https://ursb.me/posts/weekly-28/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-28/</guid><description>围绕MoFlow上线App Store这一契机，探讨AI与人类的本质区别——AI没有体验世界的能力，剖析语言的局限、情感模拟的陷阱，以及AI陪伴产品应有的边界。</description><pubDate>Wed, 01 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本篇是对二〇二四年十一月至十二月的记录与思考。&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;AI 没有体验世界的能力&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://moflowapp.com&quot;&gt;MoFlow&lt;/a&gt; 于昨夜——2024 的跨年夜上线了 &lt;a href=&quot;https://itunes.apple.com/app/id6737146258&quot;&gt;App Store&lt;/a&gt;，这标识着这三个月的忙碌换得了一个阶段性的结果。于是，我终于有时间来写写月刊了。&lt;/p&gt;
&lt;p&gt;在做 MoFlow 这段期间，我被人问到最多的问题是 ——“AI 真的有可能帮助人们实现心理疗愈吗？”在这篇文章中，我想对这个问题做出一个简单的解答。&lt;/p&gt;
&lt;p&gt;注：本文中的 AI 均指 LLMs。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Part 1: AI 与人类的区别 —— AI 没有体验世界的能力&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;谈及 MoFlow，我们不禁会探讨 AI 咨询师与人类咨询师之间的区别。我们说 AI 无法与人“面对面”的交流、无法与受访者之间实现“现实互动” ——比如语气中的细微变化、沉默中的含义、甚至是未曾言说的情感，这些都是基于情感复杂性而诞生的人类特有体验。&lt;/p&gt;
&lt;p&gt;人类的认知不仅仅是信息的处理，而是一种通过感官与情感交织而成的体验。我们通过身体感知现实世界、通过情感去赋予事物意义。这种体验赋予了我们一种独特的理解方式，使我们能够在复杂的情境中做出判断和决策。&lt;/p&gt;
&lt;p&gt;如果说体验是我们人类与世界互动的直接方式，它是感官的、情感的，是一种即时的存在状态。那么理解则是对这些体验进行反思、分析和整合的过程，是一种理性的活动。&lt;/p&gt;
&lt;p&gt;AI 尽管在处理信息和生成文本方面表现出色，但它们缺乏这种体验的维度。AI 可以处理大量的数据，生成看似合理的文本，但它无法体验这些数据所代表的现实世界，它缺乏人类所拥有的直接体验世界的能力。&lt;/p&gt;
&lt;p&gt;体验不仅仅是感知信息，它还包括情感、意识和主观性，这些是人类境遇的核心。体验是把人的内在意识与外在事实、个体与社会结合起来的关键（狄尔泰）。&lt;/p&gt;
&lt;p&gt;而理解常常被认为是与体验密不可分的。我们通过生活的经历、情感的波动、以及与他人的互动来获得对世界的深刻理解。AI 虽然可以处理大量数据并从中提取模式，但它无法真正“体验”这些数据所代表的现实，无法满足“体验”的时间性和实践性。与此相对的，AI 的“理解”则是一种基于算法的模拟，而非真正意义上的领悟。&lt;/p&gt;
&lt;h3&gt;Part2: 概念的无限与语言的界限&lt;/h3&gt;
&lt;p&gt;接着，我们再来谈谈 LLM 中语言表达的问题。&lt;/p&gt;
&lt;p&gt;在 2020 年的一篇《&lt;a href=&quot;https://blog.ursb.me/posts/sky/&quot;&gt;从《光·遇》出发，谈谈「游戏美学」&lt;/a&gt;》中，我曾写到：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;由于人类有声语文符号的局限性，又由于事物属性的无限丰富，不可能有绝对严密的表达，何况情感与事物都是在不断变化发展的，一切的言语表达对事物的历史进程都只能是疲惫的追踪。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;巴别塔事件时，上帝通过分化语言从而使人们之间无法沟通，让人类分崩离析。语言的意义并不由上帝规定，而由使用者规定，并且沟通的手段也不仅仅只有语言，还有无数种其他的行为可以拉近人与概念之间的距离。但仅仅只是拉近而已，概念本身是无限的，在《悉达多》中，也强调了语言无法完全传达真理和智慧。&lt;/p&gt;
&lt;p&gt;逻辑学中，逻辑是一个对象在一个概念之下。我们可以将任意对象分为性质和个体，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Fa: 孔子是哲学家
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么这个命题中的 a 即是个体常元，表示孔子；而 F 即谓词，描述某个个体是一个哲学家。我们可以发现，对于具体的个体我们无法把握，在所有的艺术表现中，我们把握到的仅仅是某个个体的特征。而&lt;strong&gt;我们心中一个概念的形成，就是由这些个无数视域融合后的结果。而我们的立足点越高，自身的历史视野、文化视野就越是开阔，越能够按照大和小、远和近去正确评价视野所及的范围内一切事物的意义。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;此外，将主观经验转化为客观语言的过程本身就存在问题。观察者的主观感受是无法被他人完全分享的，因为他人不能成为观察者，也不能拥有与最初观察者完全相同的经验。正如维特根斯坦所说：&lt;strong&gt;“语言的界限意味着我的世界的界限”&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;因此，AI 基于文本的处理和表达方式也必然会导致理解与共情的困难。&lt;/p&gt;
&lt;h3&gt;Part3: AI 陪伴的寒潭倒影&lt;/h3&gt;
&lt;p&gt;前文我们谈及情感的真实性源于体验——人类情感的复杂性不仅仅在于其表现形式，更在于其根植于个人经历、文化背景和生物本能。AI 缺乏亲身体验的能力，这种缺失意味着 AI 的所反馈的情感表现极可能是表面的、缺乏深度的。AI 对人类情感的理解可能更像是一种镜像反射，而非源自内心的共鸣。正如一幅画可以模仿自然，但永远无法成为自然本身。&lt;/p&gt;
&lt;p&gt;理解或许还可以是逻辑上的、计算上的，而共鸣则需要一种内在的体验和情感上的连接。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但这一切不是理解、不是共鸣，而是如同寒潭中的倒影，冰冷而完美地映射着世界的表象。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 2019 年我曾写过一篇《&lt;a href=&quot;https://blog.ursb.me/posts/ai-consciousness/&quot;&gt;人工意识何以可能？&lt;/a&gt;》，这篇文章中探讨了 AI 是否可能具备自我意识。文中举例了“中文屋实验”和“哲学僵尸”来论证了人类具有独特的主观体验能力，这种体验是私密的、无法被直接观察的。但我们可以确定的是，目前的 LLMs 缺乏真实的内在体验。&lt;/p&gt;
&lt;p&gt;情感是人类体验的核心，它不仅仅是对外部刺激的反应，更是我们内在世界的真实表达。然而，&lt;strong&gt;当模拟情感的技术变得无处不在时，我们可能会陷入一种情感的“稀释”，将复杂而深刻的情感体验简化为可复制的模式&lt;/strong&gt;——这也就是目前市面上各类 AI 陪伴软件的普遍陷阱。&lt;/p&gt;
&lt;p&gt;情感的独特性来自于个体的生命经历和文化背景，每个人的情感都是其生活故事的反映，是其与世界互动的结果。我们需要珍视个体经验的独特性，而不是将其归结为普遍的模式。我们可以通过 Prompt 指定 Agent 的背景故事，我们也可以指定它的人际关系、性格、爱好、人生经历等等，但是 AI Agent 没有经验过这一切，于是将一切转成模拟，给用户的情感反馈也沦为表现化、模式化。用户可以在陪伴类软件里创造复数个 Agent，和它们聊天，好奇想看看这种人设具体会怎么应对我们的情感。即便存在模式化的问题，大不了聊腻了就创造下一个。&lt;/p&gt;
&lt;p&gt;但我们真正需要让用户培养一种批判性的意识，去辨别哪些情感是我们真实的内心体验，哪些是由外部技术所引导的。&lt;strong&gt;我们需要保持人类情感的真实性，这需要我们不断地进行自我反思和自我理解。只有通过深入的自我探索，我们才能真正理解自己的情感来源，并在这个过程中发现情感的真实价值。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在这个情感模拟的时代，**我们需要的不仅是单纯陪伴类的产品，更需要对人类情感本质的深刻理解和尊重。**只有这样，我们才能在这个复杂的世界中，&lt;strong&gt;保持情感的独特性和真实性&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;Part 4: 在实践中诞生的意义&lt;/h3&gt;
&lt;p&gt;AI 的情感理解仅仅是模拟，那么人类与 AI 之间的互动是否会因此失去更深的意义？&lt;/p&gt;
&lt;p&gt;在人类交往中，意义常常源于情感的真实交流、共鸣和理解。&lt;/p&gt;
&lt;p&gt;然而，值得注意的是，意义并不仅仅来自于情感的真实性。意义也可以从功能性、实用性和结果中产生。例如，当 AI 帮助我们解决复杂问题或提升生活质量时，这种互动本身就具有意义，即使情感理解是模拟的。&lt;/p&gt;
&lt;p&gt;此外，我们也可以反思人类自身的情感体验。我们的情感是否总是真实的？或者它们是否也受到社会、文化和生物因素的“编程”？如果我们承认人类情感有时也是一种复杂的“模拟”，那么 AI 的模拟情感是否就显得不那么不同？在《&lt;a href=&quot;https://blog.ursb.me/posts/ai-consciousness/&quot;&gt;人工意识何以可能？&lt;/a&gt;》的最后，我曾提到过：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;中文屋实验忽视了工程学维度，若真正实施起来必然需要构建一套模型或者函数，符号虽然不具备语义，但输入输出之所以是可预测的，那还是人的意识所赋予的结果。其实在决定模型或者函数之时，就已经构建立起来了形式语义，这就不仅仅是语法的了，而是语义的了。确实，就目前的 NLP 领域研究而言，无论是经验主义进路去构建深度学习模型，还是以理性主义进路去研究形式逻辑，在构成系统的时刻起，其实就已经是语义的了。后者自不必多言，而前者在喂数据时，监督学习自带的标签就是人为所赋予的语义内容。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;因此，**所谓的“意义”不在于体验、不在于理解，更多地取决于我们如何选择看待和使用这些互动。**AI 的情感模拟可以被我们视为一种工具，它可以帮助我们更好地理解自己、促进人类之间的情感交流、甚至在某些情况下提供情感支持。因此，AI 与人类互动的意义，或许并不在于情感的真实性，而在于我们如何赋予这些互动以价值和目的。在探索 AI 的过程中，我们不仅在观察和创造，也在被观察和被重新定义。&lt;strong&gt;这种双向的互动或许正是通向真理的必经之路。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Part5: MoFlow 追求的答案&lt;/h3&gt;
&lt;p&gt;真正的理解和智慧不仅仅是信息的积累，而是通过体验、反思和情感所获得的深刻洞察。这是人类独有的特质，是我们在面对 AI 时应当珍视和保护的核心价值，也是 MoFlow 的产品理念。&lt;/p&gt;
&lt;p&gt;在 MoFlow 所有的设计中，我们都围绕着“使用者”为核心，功能中淡化 AI 的存在，仅充分发挥 AI 的工具属性，规避情感陪伴属性。&lt;/p&gt;
&lt;p&gt;例如，在 MoFlow 写完自己的经历之后，MoFlow 会默默提取你的想法，并将其中正效价的想法和情绪做显化处理，当你不经意看到这些外显能量时，你会潜移默化地去培养起更加积极的信念。而 MoFlow 鼓励用户进行正面的自我对话。&lt;/p&gt;
&lt;p&gt;在《&lt;a href=&quot;https://m.huxiu.com/article/3684208.html?type=text&quot;&gt;让心智快速成长的方法：提高自己的“主动性”&lt;/a&gt;》一文中，有这么一个论述：&lt;/p&gt;
&lt;p&gt;“许多人会习惯性地采用消极的自我对话，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自我否定：我不擅长这个领域，所以我最好回避，别去碰它；&lt;/li&gt;
&lt;li&gt;自我质疑：这个问题好像很麻烦，是不是超出了我的能力范围？&lt;/li&gt;
&lt;li&gt;自我批评：我刚才的言行举止真是太糟了，我怎么会表现这么差？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些对话看起来并不严重，但大脑是有一个特性的：它会相信不断重复的信息。这看似普通的自我对话，却会因为大脑的重复记忆特性，逐渐形成固定的认知模式。&lt;/p&gt;
&lt;p&gt;久而久之，大脑就会相信它们，从而调低对自己的评价，让自己真的变成自己所反刍和念叨的样子。这就会极大地束缚我们的主动性，让我们在面临困难的时候，变得瞻前顾后、畏手畏脚，难以有效行动。因此，要产生改变，最首要的一步，就是把消极对话变成积极的自我对话。比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我不擅长这个领域，所以我最好回避，别去碰它→ 我又有机会可以增长经验了。&lt;/li&gt;
&lt;li&gt;这个问题好像很麻烦，是不是超出了我的能力范围？→ 我是不是变得更厉害了呢？不如拿这个问题来试一试吧。&lt;/li&gt;
&lt;li&gt;我刚才的言行举止真是太糟了，我怎么会表现这么差？→ 我已经比以前有进步了，也许下一次可以做得更好。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里要特别注意：很多书籍可能会教你「自我暗示」，比如不断告诉自己「我很棒」「我很强大」「我很厉害」—— 但是，这是错的。&lt;/p&gt;
&lt;p&gt;为什么呢？研究发现：过于空泛、不够具体的自我暗示，以及大脑本身不相信的自我暗示，不仅是无效的，反而会造成反效果。它反而会把问题凸显出来，让原本没那么严重的问题显得更严重。”&lt;/p&gt;
&lt;p&gt;MoFlow 会当你面临一个难题时，笃定地告诉你：“你解决过相似的问题，你有触类旁通的经验，有足够的能力足以去应对它。”“哪怕出错了也没关系，它也能丰富你的生命，成为你新的经验。”&lt;/p&gt;
&lt;p&gt;现在的 AI 已经可以通过分析大量数据，揭示出人类在某些情况下的普遍行为模式，帮助我们更好地认识自己和社会。但最终，真正的理解仍需回归到个体的体验与反思中。&lt;/p&gt;
&lt;p&gt;AI 的理解是一种工具性的理解，而非存在性的理解。**它可以协助我们更好地理解人类境遇的某些方面，但无法替代我们通过亲身体验和内心反思所获得的深刻洞察。**因此，MoFlow 中的 AI 设计更多是引导式、启发式的，以此来鼓励用户自我对话、自我成长、自我关爱。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关注、关心和关爱——这些都是我们会收到的礼物，同时也是我们可以用来赠予他人的礼物，因为这些礼物只有在一种慷慨相待的生活中才会展现其活力。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们学习理论，并不是为了通过吊书袋式的显摆来彰显自己的存在，关键在于如何改变世界。&lt;strong&gt;每一次实践背后都闪耀着众多灵魂的力量，这些努力最终都落到实处，为他人带来福祉——这才是我们追求的实践意义。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;“AI 真的有可能帮助人们实现心理疗愈吗？”&lt;/p&gt;
&lt;p&gt;——&lt;strong&gt;“是的，完全可以。”&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;🎬 书影音&lt;/h2&gt;
&lt;p&gt;以下是本周期的书影音记录。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;读完：传记 |《鱼不存在》| ★★★★★&lt;/li&gt;
&lt;li&gt;读完：心理学 |《无：生命的最佳状态》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;读完：心理学 |《不要相信你所想的一切》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;读完：小说 |《六个说谎的大学生》| ★★★★☆&lt;/li&gt;
&lt;li&gt;读完：科普 |《星星离我们有多远》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：韩剧 | 《安娜》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：网剧 |《白夜破晓》| ★★☆☆☆&lt;/li&gt;
&lt;li&gt;在读：哲学 |《世界观》| ★★★★☆&lt;/li&gt;
&lt;li&gt;在读：心理学 |《知识的错觉》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;在读：哲学 |《我们为什么而活》| ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-28&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>AI 心理疗愈应用的探索与实现</title><link>https://ursb.me/posts/moflow/</link><guid isPermaLink="true">https://ursb.me/posts/moflow/</guid><description>记录 AI 心理疗愈应用 MoFlow 的设计理念，将表达性写作拆解为表达、宣泄、理解、允许、探索五个阶段，结合情绪追踪、书写报告与认知行为疗法分析实现自我疗愈。</description><pubDate>Fri, 29 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;开篇：咨询来信及自我疗愈的思考&lt;/h2&gt;
&lt;p&gt;在过去的两年中，我持续收到了一些来自博客的咨询来信。这些来信促使我在今年上半年开设了一个&lt;a href=&quot;https://blog.ursb.me/posts/service/&quot;&gt;专门的咨询服务&lt;/a&gt;，以作为一种异步沟通的渠道，帮助解答读者们的各种问题。迄今为止，我已收到近百封来信。有些来信者在我回复后明确表达了感谢，而另一些则杳无音信。我常常会思索，我的回信是否在他们的生活中产生了积极的影响——或许，他们已重返正常的生活轨道，因此不再需要回信。&lt;/p&gt;
&lt;p&gt;然而坦率地说，在来信数较少的日子里，我会感到轻松许多。每次回复来信时，我都需设身处地，细细品味来信者的文字，努力与之共情——“若我是他们，在如此境遇下，我该如何应对？”随后，我会整理思绪，将自身的能量转化为回信的内容。通常，一封来信需要一到两周的时间才能回复，因为我自己也需要一个宁静的环境，以便做出最恰当的答复。尝试共情已然如此艰难，更难以想象来信者在现实世界的真实体验中会面对多少痛苦。&lt;/p&gt;
&lt;p&gt;在这些来信中，我发现大多数人面临着相似的困扰和挑战——自我发展、人际关系、家庭关系、职业规划等各个方面，它们有着极大的共性。仅凭个人力量，我们很难从这些问题中解脱出来。观察来信者的倾诉，我意识到大多数人缺乏有效的方法、甚至缺乏意识去应对生活中的这些问题。每个人都是以高度个人化的方式去体验人类处境的压力，因此当问题来临时，人们往往选择自我消化，直到无法承受时才尝试倾诉。很少有人会系统性地去寻找、以及去解决这些问题背后的根本原因。&lt;/p&gt;
&lt;p&gt;因此，我希望能够构建一个通用性强且系统化的疗愈方案，以规模化地处理这些问题，让个体可以通过这个方案实现自我疗愈。我将这个系统化的过程拆解为——表达、宣泄、理解、允许和探索。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E4%BA%94%E4%B8%AA%E7%8E%AF%E8%8A%82.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;表达：作为载体的表达性写作&lt;/h2&gt;
&lt;p&gt;自我反思是解决问题的起点。在回复读者来信时，我也常常反思自己是如何探寻问题根源的。如果是我的话，我会选择一个安静的环境，将所遇到的困难和当前的处境在心中复盘，然后记录下来。在文字中，我努力寻找事件背后的隐藏因素。多年来，我养成了在睡前花费十分钟记录当天经历的习惯。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/IMG_5031.jpeg&quot; alt=&quot;&quot; /&gt;在&lt;a href=&quot;https://blog.ursb.me/posts/weekly-19&quot;&gt;《月刊 (第19期): 日记的意义》&lt;/a&gt;中，我曾探讨过多年来自己写日记所发现的意义，一共有三点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自我觉察的工具&lt;/li&gt;
&lt;li&gt;折射生活的意义&lt;/li&gt;
&lt;li&gt;记录身边的美好&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E6%97%A5%E8%AE%B0%E7%9A%84%E4%B8%89%E4%B8%AA%E6%84%8F%E4%B9%89.png&quot; alt=&quot;&quot; /&gt;日记不仅是记录生活的工具，更是一种自我对话和成长的方式。通过写日记，我能够将内心的混乱和困扰转化为清晰的文字，这个过程本身就是一种治愈。在安静的写作时刻，我得以暂时脱离日常的喧嚣，专注于倾听内心的声音。&lt;/p&gt;
&lt;p&gt;写日记帮助我建立与自我对话的习惯，使我能够以更客观的视角审视自己的情绪和想法。通过持续的书写，不仅能够记录生活的点滴，还能观察到自己的成长轨迹，发现情绪的变化模式，从而更好地理解和管理自己的心理状态。&lt;/p&gt;
&lt;p&gt;然而，写日记只是形成记录习惯的一个载体，它还可以是周记、随笔、备忘录等其它形式。这种写作方式在心理学上称为表达性写作，这是一种常用的方法，帮助人们处理压力和改善心理健康。在写作过程中，人们可以真实地抒发感受和想法，完全袒露内心。它有助于深入内心的孤独感，让我们重新连接自我，找到内心的宁静。&lt;/p&gt;
&lt;p&gt;在牛津大学出版社的《积极心理学手册》第三版中写道：“在写作练习后的几个月里，那些写下了关于创伤事件的‘最深刻的想法和感受’的人，因病去诊所就诊的次数减少了50%。这种写作被称为‘情感披露写作’。为检验生理因素，研究人员设计了另一项研究。在写作开始前一天、最后一次写作结束时和结束六周后，对被试抽血检验，以便评估其免疫功能，结果发现，那些写下自己想法和感受的人免疫功能得到了很大的提高。这种影响在写作的最后一天达到顶峰，而且往往会持续六周以上。除了这一结果，研究人员还发现，被试经常称写作多么有用，能帮助他们理解和处理事情。”&lt;/p&gt;
&lt;p&gt;表达性写作作为一种心理疗法，它揭示了人类内心深处的重要真相：表达本身即是一种解放。从哲学角度看，表达性写作是一种自我反思的实践，不仅是情感的宣泄，更是对自我存在的重新审视。通过书写，我们将内心的混乱外化为有形的文字，这一过程使我们能够以旁观者的视角重新审视自己的情感和思维。这种方法之所以有效，是因为它让人能够与自己进行对话，从而打破内心的孤独。如果能够将最深刻的想法和感受表达出来，这本身就是对自己的疗愈。&lt;/p&gt;
&lt;p&gt;我们不能遇见自己，是因为我们没有把时间用在自己身上。表达性写作让我们学习温柔地面对自己，温柔地放下面具，用一种温和、温柔的方式贴近自己。&lt;/p&gt;
&lt;p&gt;正如海德格尔所言，人类的存在本质是“在世存在”，意味着我们始终与世界和他人相连。但在当今快节奏、高压力的社会中，人们常感到与自己和他人疏离。表达性写作提供了一条重新连接自我、寻找内心平静的途径。&lt;/p&gt;
&lt;p&gt;因此，我们将这个系统性解决方案的载体定义为表达性写作。其中，方案的重点不在于“写作”，而在于“表达”。接下来的问题是，如何使用这个载体去解决实际问题？&lt;/p&gt;
&lt;h2&gt;宣泄：在自由书写中觉察情绪&lt;/h2&gt;
&lt;p&gt;在表达性书写的静谈中，我们开始探寻情绪的深邃之源。根据理性情绪行为疗法（REBT）的基本前提——不是事件本身导致我们的情绪反应，而是我们对事件的认知和解释决定了我们的情感和行为。因此，首先我们要明确的是：已经发生的事情是无法被改变的，但记忆和体验是可以被改变的。这是疗愈的前提。&lt;/p&gt;
&lt;p&gt;基于这个前提，可以推演出疗愈的首要目标是调节自身的认知与情绪。而在调节认知与情绪的过程中，最关键的一步是学会觉察和识别情绪，这也是我们这个系统性方案的核心。而识别的前提是能够觉察出情绪，那么我们该如何有效地觉察自身的情绪呢？&lt;/p&gt;
&lt;p&gt;情绪觉察和我们的感受力息息相关，鲍勃·迪伦有一句话：“有些人能感受到雨，而其他人则只是被淋湿。”作为人类个体而言，每个个体对同样事件的体验是存在差异的，这取决于个体的感知和内心状态。&lt;/p&gt;
&lt;p&gt;我们在生活中对事件往往仅是被动的接受者，并不会主动地感知和理解周围的世界。我们首先需过激活我们的感受能力，以便深入地探索自己的核心情绪，从而获得更丰富的生活体验。这种深刻的感知能力不仅能带来个人的成长，也能增强我们与他人的联系和理解。生活的艺术在于从每一个瞬间中提炼出有意义的体验，而不仅仅是经历。&lt;/p&gt;
&lt;p&gt;重新激活感受能力的最直接方法是宣泄，这是一种情绪的自我修复机制。然而，在现代社会的背景下，我们需要一个安全的途径来进行无害的宣泄——我们给出的答卷是自由书写。我们鼓励个体在自由书写中释放自我，让思想得以放空，随心所欲地书写，无需遵循任何逻辑或修辞规则，不必在意排版、逻辑和语句的通顺。顺应思绪，让情绪自由流动。记录下今天发生的事情，书写自己的心情，这也是叙事疗法的一种手段。我们提倡书写，因为书写能够更好地实现情绪的分离与释放，也更有利于客体分离。&lt;/p&gt;
&lt;p&gt;我深知，恢复感受力并非易事。将粗糙的感受精微化、细腻化，犹如在一摊浑水中筛选出闪烁的金子。然而，通过自由书写的方式，我坚信个体能够逐步开始觉察自身的情绪。因为在书写的过程中，我们已经学会了与自己“相遇”。&lt;/p&gt;
&lt;p&gt;如果说自由书写是对内心的探索，那么接下来的步骤，则是对自我理解的深化。&lt;/p&gt;
&lt;h2&gt;理解：识别当下的核心情绪&lt;/h2&gt;
&lt;p&gt;在自由书写的过程中，我们常常通过焦虑等抑制性情绪来表达我们的反应。这一环节的任务是穿透这些抑制性情绪，探寻事件中的核心情绪，并将其从自由书写的文本中识别出来。通过这一过程，我们能够实现精准的情感疗愈，深入理解自身的内心世界。&lt;/p&gt;
&lt;p&gt;因此在书写的过程中，我们最重要的任务就是找到自己面对这个事件时的核心情绪。这个过程如同在自己觉察千丝万缕的情绪间，找到引发它们的源头情感，也就是核心情绪。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E6%A0%B8%E5%BF%83%E6%83%85%E7%BB%AA%E4%B8%8E%E5%85%B6%E4%BB%96%E6%83%85%E7%BB%AA%E7%9A%84%E5%85%B3%E7%B3%BB%E5%9B%BE.png&quot; alt=&quot;&quot; /&gt;核心情绪隐藏在各种抑制性情绪之后，我们在寻找的过程中很大几率会遇到困难，这需要引入一个新的概念——情绪粒度。就像画家能够分辨出常人难以察觉的细微色差，我们对情绪的感知也是如此。&lt;/p&gt;
&lt;p&gt;如果对情绪的感知过于模糊笼统，比如只能说&quot;我感觉很糟糕&quot;或&quot;我的情绪很差&quot;，那么每当感到&quot;不好&quot;时，都容易会陷入负面的身心反应。这种状态会不断消耗我们的精力，因为这样我们既不清楚具体要应对什么，也不知道该如何解决。当我们培养出快速辨别各种情绪的能力时，这些被清晰标记的情绪就会形成一道“语言结界”，守护我们的精神世界。&lt;/p&gt;
&lt;p&gt;提高情绪粒度的方法有 2 种：学习新的词汇，以及为情绪贴标签。我们可以将这种情绪识别能力比作一道内在的“语言结界”，当我们学会给情绪贴上精准的标签时，这些情绪就不再是朦胧难辨的感受，而是转化为清晰可理解和处理的信息。这种能力既能保护我们自己，也能推动个人成长，因为它帮助我们更准确地认识内心的需求和边界。&lt;/p&gt;
&lt;p&gt;然而，这种识别过程要求我们对自身感受进行理性化处理，这带来了新的挑战——在追求情绪识别和自我意识提升的过程中，我们如何确保不失去对生活中不可预知性和自发性的欣赏？此外，这种情绪识别的方式是否可能导致我们过于理性化自身感受，从而忽视了情绪的自然流动与变化？&lt;/p&gt;
&lt;p&gt;这便需要介绍 MoFlow 的要点——让情绪自由流动。&lt;/p&gt;
&lt;h2&gt;允许：让情绪自由流动&lt;/h2&gt;
&lt;p&gt;为情绪贴标签确实可能在某些情况下导致人们过于理性化自己的感受。通过使用情绪识别工具，人们可能倾向于分析和标签化情绪，而非自然地体验和处理它们。这种过度分析可能使人忽视情绪的自然流动与变化，甚至可能导致对情绪的过度控制或压抑。&lt;/p&gt;
&lt;p&gt;我们需要允许情绪的自然发生。比如，人类的负面情绪是一种“生存工具”，是为了更快地适应变化而进化出来的：愤怒提醒我们在遭遇不公时需要捍卫自己的界限，并赋予我们行动的勇气；焦虑提升我们处理问题所需的专注力；孤独感提醒我们对亲密人际关系的需求；悲伤则提醒我们刚刚失去了重要的人或物。没有负面情绪，我们便无法巧妙地应对外界的威胁。&lt;/p&gt;
&lt;p&gt;除此之外，情绪也是推动行动的重要动力。恐惧是害怕某种事物，而忧虑则是害怕没有事物；愤怒促使我们去纠正不公，悲伤让我们更加珍惜和关心他人，而热情与激情则推动我们追求目标，实现梦想。人们因为失去爱而哀伤，又保持哀伤以重新获得爱。&lt;/p&gt;
&lt;p&gt;人生经历的事件都是为了成就我们，换一个态度看待我们的过去，我们就可以从中得到资源和力量，找出规律，找到自己的人生使命，然后好好规划未来的人生之路应该怎么走。 苦难本身并不是目的，而是一个过程，通过改变我们对苦难的看法，我们能够从中汲取经验和力量。&lt;/p&gt;
&lt;p&gt;因此，在追求内心宁静的过程中，重要的是找到一种平衡，既能保持内心的平和，又不忽视情绪的积极作用。这也正是 MoFlow 的 Slogan：“&lt;strong&gt;让情绪自由流动，书写疗愈力量。&lt;/strong&gt;”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/Slogan.png&quot; alt=&quot;&quot; /&gt;书写疗愈整体而言包括三个阶段，即觉察、识别和疗愈。在疗愈这一阶段，MoFlow 强调经历的即时性与着陆的治疗方式，引导我们接纳自我、允许情绪的发生，从而转向内心宁静。接纳，是我们愿意面对和接受事物此刻的本来面目；接纳，不是抑制情绪的发生，而是看着各种情绪和想法产生、发展、消失。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E5%8D%B3%E6%97%B6%E6%80%A7%E5%92%8C%E7%9D%80%E9%99%86.png&quot; alt=&quot;&quot; /&gt;首先是“经历的即时性”，它指的是一种不关注脱离自身经验的事实的精神状态，简单来说，就是接纳事物的本来面目的态度，是个体在当下时刻对事件或情境的直接感知和体验。这种即时性强调的是对当前经历的全然投入和感受，而非对过去的回忆或对未来的期待。在&lt;a href=&quot;https://sspai.com/post/83743&quot;&gt;《谈谈存在的价值与人生体验》&lt;/a&gt;一文中，我曾强调过“当下”的重要性，我们“唯一确信的存在是当下，唯一重要的是现在、是此时此刻的感受。人首先必须存在，才谈得上有关人生的一切”。换言之，如阿德勒所言：“人生是一连串的刹那，最重要的是此时此刻。”&lt;/p&gt;
&lt;p&gt;其次是“着陆”，它是应用于心理治疗领域的一种方法，是将心灵拉回“现在”的各种技巧的总称。个体的真实存在在于对“此刻”的体验，而不是对过去的沉溺或对未来的焦虑。一个人能真正生活的只有当下，事实上，人不可能比当下活得更久——当下一直伴随着你。即便是在回顾既往生活的那一刻，即便是在生命的最后一刻，人仍然在体验着、在生活着。永恒的时态是当下，而非未来。生活在过去的阴影或未来的焦虑中，往往让我们忽视了当下的真实体验和存在的意义。这种观念帮助我们减少不必要的痛苦，避免伤口再被“第二支箭”射中，让自我“着陆”，找到内心的平和。&lt;/p&gt;
&lt;p&gt;这也是接受与实现疗法（ACT）的核心理念：强调接受现实和承诺行动，通过帮助个体接受无法改变的事情，专注于当下，并根据个人价值观采取行动，从而实现心理灵活性。&lt;/p&gt;
&lt;p&gt;《书写自愈力》一书中说：“疗愈，是指我们看到自己的伤痛，理解伤痛的由来，进而转化创伤情绪之后，我们在生活中就不会再像以前那样对特定的事件产生特别强烈的情绪，从而能够客观理智地思考和行动；疗愈，是指张开心灵的眼睛，看到内心被伤痛掩盖的、难以表达的需要，不在内心驱使自己，从而可以减少甚至消除内耗，更加从容自在地面对生活。”&lt;/p&gt;
&lt;p&gt;但我们必须承认的是，并不是所有的书写都会通往疗愈，如电影《好东西》中铁梅写了自己单亲妈妈的经历却遭网暴。生活中有许多不确定性和痛苦是不可避免的，但我们可以选择如何回应这些挑战。接受现实并不意味着放弃，而是通过接受来找到内心的平和，并在此基础上采取积极的行动。&lt;/p&gt;
&lt;p&gt;这是一场向内的旅程——专注此刻，当自我沉浸于记录当下的感受时，允许情绪的发生，让情绪自由流动。请允许自己去体验这些情绪，在经历整个过程之后，你会得到生命的礼物——“怀有迷惘的时候，心被景色所包围。悟道之后，景色被心所包围。”&lt;/p&gt;
&lt;h2&gt;探索：MoFlow 心理疗愈的场景&lt;/h2&gt;
&lt;p&gt;以上是 MoFlow 的设计理念，围绕着这套理论结构，我们探索并设计了一系列的产品功能。&lt;/p&gt;
&lt;h3&gt;情绪追踪&lt;/h3&gt;
&lt;p&gt;MoFlow 提供了基础的情绪追踪功能，允许我们在无需书写任何内容的情况下，通过简单的情绪打卡来记录当下的情绪状态。MoFlow 鼓励你将目光转向内在，每天留出时间倾听内心的声音，了解自己真实的想法：此刻的我快乐吗？我感到幸福吗？我真正追求的是什么？我在害怕什么？我在逃避什么？我需要做出哪些改变？我该如何活出真实的自我？只有当你愿意花时间静心聆听，才能听见内心最真实的声音。&lt;/p&gt;
&lt;p&gt;在洞察模块中，MoFlow 将展示你的情绪日历，以及情绪与活动之间的关联关系。这一功能不仅帮助我们直观地了解情绪变化，还揭示了情绪与日常活动之间的潜在联系，为更深入的自我觉察提供了支持。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E6%83%85%E7%BB%AA%E8%BF%BD%E8%B8%AA.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;书写助手&lt;/h3&gt;
&lt;p&gt;MoFlow 的书写助手与书写体验实现了无缝结合。当你在自由书写过程中遇到思维瓶颈时，可以唤起书写助手，以辅助我们进行思维扩展。通过这一引导，我们能够书写出更多内容，从而深入挖掘自身的核心情绪。这一过程不仅促进了自我表达，也为情感的深入探索提供了支持。&lt;/p&gt;
&lt;p&gt;在思维层面，如果你在书写的当下对自己“为什么如此”感到好奇，那就可以采用自我追问式的方法，也叫作苏格拉底式提问。在心理咨询和心理治疗中，提问是基本的谈话治疗工具，并且提问也能体现心理咨询师的功底。MoFlow 提供了追问工具，你可以在书写中自己向自己提问。未来书写助手会得到更多的特性支持，以便更好地辅助我们进行自由书写。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E4%B9%A6%E5%86%99%E5%8A%A9%E6%89%8B.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;书写报告&lt;/h3&gt;
&lt;p&gt;在书写完成后，MoFlow 利用精调模型对你的书写进行个性化分析，生成结构化的书写报告。针对不同的核心情绪，模型提供相应的应对措施。这种分析不仅帮助你更好地理解自身情感，还为情绪管理提供了具体的指导路径。通过 MoFlow 的分析，我们不断擦拭心灵中起雾的那面镜子，擦掉虚假自己与真实自己之间的模糊，让自己越来越真实，这也是我们拉伸自身心理弹性和拓宽心理边界的过程。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E4%B9%A6%E5%86%99%E6%8A%A5%E5%91%8A.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;想法提炼&lt;/h3&gt;
&lt;p&gt;书写过程中，思想逐渐凝聚。所有的心理治疗都基于一个事实：在某种可控的情况下，大脑中的神经元会以可预测的方式移动并相互连接，然后形成新的联系。如果没有脑细胞的重构，学习将不可能发生。&lt;/p&gt;
&lt;p&gt;在某些特定的书写内容中，MoFlow 会触发认知行为疗法（CBT）分析，试图挖掘我们想法背后的核心信念。通过依托想法分类模型，MoFlow 能够处理想法之间的依赖关系。这一过程不仅深化了对自我思维的理解，也为你提供了更为系统的思维整理和情感解析。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E6%83%B3%E6%B3%95%E6%8F%90%E7%82%BC.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;行动建议&lt;/h3&gt;
&lt;p&gt;在一些特定的书写内容中，MoFlow 会结合辩证行为疗法（DBT），为你提供针对性的行动建议。MoFlow 希望通过技能训练，调节我们的情绪、提升人际关系能力，并增强对生活的掌控感。MoFlow 强调内心平和与外在行动之间的关系。在追求生命的最佳状态时，我们不仅要关注内心的接受与理解，还需积极采取行动，实现我们的价值观和目标。正如铃木祐在其著作中可能探讨的那样，生命的最佳状态或许并非完美无缺，而是一种在接受现实的基础上，持续追求个人价值和意义的动态过程。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E8%A1%8C%E5%8A%A8%E5%BB%BA%E8%AE%AE.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;能量卡片&lt;/h3&gt;
&lt;p&gt;MoFlow 的能量模块会根据具体事件，提供相应的正念卡片和思考卡片。通过正念练习和自我反思，我们不仅能够更好地理解和管理情绪，还能将其转化为创造力和行动力的源泉。这种能量转化的过程，与显化理论中所强调的&quot;吸引力法则&quot;不谋而合——当我们保持积极的心态和清晰的意图，就更容易吸引相应的能量和机遇。此外，这一模块能够帮助我们培养好奇心：保持对周围世界的好奇，尝试新事物，探索未知领域，这些都是显化理想生活的重要组成部分。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E8%83%BD%E9%87%8F%E5%8D%A1%E7%89%87.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;共鸣时刻&lt;/h3&gt;
&lt;p&gt;在某些书写内容中，MoFlow 会向你展示与其当前情绪和事件相关联的历史事件、名人名言以及书影音作品。这一做法旨在更好地实现自我分离，通过外部参照物的启发，获得新的视角和理解，从而深化对自我情感和经历的洞察。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E5%85%B1%E9%B8%A3%E6%97%B6%E5%88%BB.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;定期反思&lt;/h3&gt;
&lt;p&gt;MoFlow 提供了一项类似心理咨询回访的功能——情绪周报。通过这一功能，你能够自我反思情绪和行为，识别出哪些方面可以更好地平衡自我意识与自发性。此外，对于某些极端情绪，我们可能无法在当下进行理性的情绪分析，因此会通过定期回顾为你提供更深入的洞察和建议。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E5%AE%9A%E6%9C%9F%E5%8F%8D%E6%80%9D.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;安全隐私&lt;/h3&gt;
&lt;p&gt;MoFlow 高度重视用户隐私，提供端对端的通信加密和数据存储加密功能。在注册账号时，会为你生成一个专属密钥，所有数据均通过该密钥进行加密处理，确保未经授权的第三方无法访问。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E5%AE%89%E5%85%A8%E9%9A%90%E7%A7%81.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;陪伴疗愈&lt;/h3&gt;
&lt;p&gt;MoFlow  鼓励你享受每一个小的进步和意外的发现，享受使用 MoFlow 的整个过程。希望你能够去感受情绪流动的过程，而不仅仅关注疗愈报告的结果。为此，MoFlow 计划在未来推出一系列情绪疏导和陪伴功能，敬请期待。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E9%99%AA%E4%BC%B4%E7%96%97%E6%84%88.png&quot; alt=&quot;&quot; /&gt;
过去是我们牵绊的来处，未来是我们前进的动力。 未来，我们计划不断完善与扩展 MoFlow 的功能，目前释放出的版本仅是 MoFlow 自闭环中的冰山一角。&lt;/p&gt;
&lt;p&gt;我们希望，MoFlow 能够让每个人都能得到属于自己的礼物——内在的安宁与平静。&lt;/p&gt;
&lt;p&gt;我们期望，MoFlow 能够创造出一个更加理解、包容且富有同情心的社会环境。&lt;/p&gt;
&lt;p&gt;“让情绪自由流动，书写疗愈力量。”——MoFlow。&lt;/p&gt;
&lt;p&gt;目前，MoFlow iOS 端已在 App Store 开放预约下载，欢迎前往 App Store 搜索「MoFlow」进行预约。&lt;/p&gt;
&lt;p&gt;更多产品详情可见：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MoFlow 官网：&lt;a href=&quot;https://moflowapp.com&quot;&gt;https://moflowapp.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;App Store 产品页：&lt;a href=&quot;https://apps.apple.com/cn/app/id6737146258&quot;&gt;https://apps.apple.com/cn/app/id6737146258&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;本文作者 &lt;a href=&quot;https://ursb.me&quot;&gt;Airing&lt;/a&gt;，MoFlow Founder，博客 &lt;a href=&quot;https://ursb.me&quot;&gt;ursb.me&lt;/a&gt;。
本文配图 &lt;a href=&quot;https://www.xiaohongshu.com/user/profile/65cc47e7000000000401c841&quot;&gt;LZH&lt;/a&gt;，MoFlow 设计师。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=moflow&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Mac 小众软件推荐与工作流分享(2024)</title><link>https://ursb.me/posts/mac-app-share-2024/</link><guid isPermaLink="true">https://ursb.me/posts/mac-app-share-2024/</guid><description>分享作者多年工作中积累的 Mac 小众软件与工作流，涵盖笔记（Heptabase、Obsidian、Tana）、时间管理、任务管理、研发工具与 AI 搜索/对话产品的选型与使用心得。</description><pubDate>Mon, 04 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这篇文章分享了我在工作这几年遇到过的好用的 Mac 软件，其中有不少我还在使用，它们在我工作道路上帮到了我很多，部分软件组合起来形成的工作流甚至让我的工作本身也变得愉悦起来。我希望能够把这些分享给大家。&lt;/p&gt;
&lt;h2&gt;一、笔记篇&lt;/h2&gt;
&lt;p&gt;首先出场的是笔记赛道的诸多产品们，实话说，其中的产品我都折腾过，最后选择了 Heptabase，除了偶尔作图或者写草稿的时候在用 Excalidraw。选择 Heptabase 只是因为它的设计最适合我自己的场景，并非其他产品不够好。&lt;/p&gt;
&lt;p&gt;本节将笔记产品粗略分为常规笔记、双链笔记、数据库笔记、画板笔记，分类也并不是很严谨，只是它的主要功能在某个范畴内就这么划分了，比如 Obsidian Canvas 和 Logseq 都可以做白板，但这并非是它们的特色功能，因此没有分到画板笔记中。&lt;/p&gt;
&lt;h3&gt;0x01 常规笔记&lt;/h3&gt;
&lt;p&gt;1.1 Drafts
&lt;a href=&quot;https://getdrafts.com/&quot;&gt;Drafts&lt;/a&gt;，作为开篇的第一款软件，把尊重留给 Drafts。这是十几年的老牌产品，同时有移动端，搭配快捷键和桌面置顶功能，我常用作临时笔记或者桌面便签。非常良心，基础功能免费可用，也可以用商城里预制的 Action。付费则可以自己用 JS 写定制脚本做一些 Action，扩展性非常强，蛮酷的。缺点是仅支持纯文本输入，不支持图片插入。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240921225942@2x.png&quot; alt=&quot;&quot; /&gt;1.2 Bear
&lt;a href=&quot;https://bear.app/zh/&quot;&gt;Bear&lt;/a&gt;，中文名熊掌记，挺可爱的一款笔记软件，功能完善，将笔记导出成图片/PDF 的功能非常实用。缺点是不支持 CDN 图片解析，在写一些需要发布到网站的文章时则不太方面。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240921230357@2x.png&quot; alt=&quot;&quot; /&gt;1.3 Typora
[Typora]，程序员们钟爱的笔记软件，支持完整的 Markdown 和流程图语法，简洁易用，功能完备。缺点是存储库不支持标签管理，本质上只是一个 Markdown 编辑器。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240921230343@2x.png&quot; alt=&quot;&quot; /&gt;1.4 iA Writer
&lt;a href=&quot;https://ia.net/writer&quot;&gt;iA Writer&lt;/a&gt;，一款 wysiwyg 的写作编辑器，主打文字创作，写作时容易进入心流。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240921230744@2x.png&quot; alt=&quot;&quot; /&gt;1.5 Apple Notes
一款被低估的软件，配合 ProNotes 插件可以支持 Markdown 输入、模板定义、AI 输入与 Deeplink 拷贝，配合 Hookmark 可以做任意软件的双链，此外再配合 Raycast 的 Apple Notes 插件可以做全文检索和快速打开。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/Pasted%20image%2020240921231315.png&quot; alt=&quot;&quot; /&gt;1.6 Obsidian
&lt;a href=&quot;https://obsidian.md/&quot;&gt;Obsidian&lt;/a&gt;，笔记软件的集大成者，社区非常活跃，软件本身除了功能齐全、稳定之外，配合插件可以做到许多意想不到的事情。优点是支持全平台，文件完全本地存储。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240921231439@2x.png&quot; alt=&quot;&quot; /&gt;1.7 NotePlan
&lt;a href=&quot;https://noteplan.co/&quot;&gt;NotePlan&lt;/a&gt;，除了传统的笔记功能外，特点是支持非常完备的日程和任务管理。但因为 AI 合规问题，退出了中国区的 App Store。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/Pasted%20image%2020240921231939.png&quot; alt=&quot;&quot; /&gt;1.8 Agenda
&lt;a href=&quot;https://agenda.com/&quot;&gt;Agenda&lt;/a&gt;，好几年前 App Store 的年度产品，特点也是支持完备的日程和任务管理。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240921232040@2x.png&quot; alt=&quot;&quot; /&gt;1.9 Mem
&lt;a href=&quot;https://get.mem.ai/&quot;&gt;Mem&lt;/a&gt;，海外比较火的 AI 笔记软件，支持快速裁剪、快速录入、AI Q&amp;amp;A 功能。缺点是数据云存储，并且编辑器输入体验比较差。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/Pasted%20image%2020240921232158.png&quot; alt=&quot;&quot; /&gt;1.10 Flomo
&lt;a href=&quot;https://flomoapp.com/&quot;&gt;Flomo&lt;/a&gt;，身边很多产品朋友在用的软件，简单易用，理念是让记录回归到内容本身。开源社区还有像素级的复刻产品 memo，Obsidian 中也有相关的集成插件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/Pasted%20image%2020240921232411.png&quot; alt=&quot;&quot; /&gt;1.11 Raycast Notes
Raycast 内置的 Notes，想对标 Bear 和 Drafts，目前还在内测中，体验了下偏简易版的 Drafts。后续还需要利用 Raycast 的存量生态好好打磨。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240921232609@2x.png&quot; alt=&quot;&quot; /&gt;1.12 Lazy
&lt;a href=&quot;https://lazy.so/&quot;&gt;Lazy&lt;/a&gt;，前两周刚发布的笔记软件，仍在内测中。体验之后发现它和 Mem 的趋于同质化，都是主打快速记录，只是 Lazy 做的更加极端，能从任意软件创建笔记（有点类似于 Hookmark + Drafts）。和现代主流软件一样，内置了较为齐全的 AI 功能。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240926103101@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;0x02 双链笔记&lt;/h3&gt;
&lt;p&gt;双链笔记是 2020 年开始出现的概念，由 Roam Research 提出，后来被许多产品借鉴、效仿、集成、改进。&lt;/p&gt;
&lt;p&gt;2.1 Roam Research
&lt;a href=&quot;https://roamresearch.com/&quot;&gt;Roam Research&lt;/a&gt;，虽然被追随者效仿并超越，但是不得不提一下。在 2020 年 Roam Research 刚出来的时候就付费深度使用了，摸索了一套双链笔记的使用方法，可以见我写的这篇文章&lt;a href=&quot;https://blog.ursb.me/posts/roam-research/&quot;&gt;Roam Research 最佳实践——知识管理与任务管理&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/Pasted%20image%2020240921232835.png&quot; alt=&quot;&quot; /&gt;2.2 Logseq
&lt;a href=&quot;https://logseq.com/&quot;&gt;Logseq&lt;/a&gt;，可以非常简单粗暴的理解成 Roam Research 的免费本地客户端版，但后续出了白板功能、插件市场、PDF 标注等能力，总体来说是当下体验双链笔记最好的选择，没有之一。但这一年来被 Obsidian 蚕食过多，商业化是个问题，开源社区堆积了很多 Issue 没有处理。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/Pasted%20image%2020240921233208.png&quot; alt=&quot;&quot; /&gt;2.3 Reflect
&lt;a href=&quot;https://reflect.app/&quot;&gt;Reflect&lt;/a&gt;，也是一款双链笔记，但突出日程管理、任务安排以及 AI 编辑功能，海外用户画像偏商务人士。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240921233421@2x.png&quot; alt=&quot;&quot; /&gt;2.4 Tana
&lt;a href=&quot;https://tana.inc/&quot;&gt;Tana&lt;/a&gt;，是我个人非常偏爱的一款产品，在双链的概念之上更进一步，万物皆 Node，每一个 Node 都可以定义多个 Supertag，而每个 Supertag 又是一个数据表定义，因此被套上 Supertag 的 Node 转瞬变成了 Notion 的 Database。并且 Supertag 本身存在继承关系，而 Supertag 内的 Field 也有属性和复用的能力。AI 功能和语音输入非常好用，提供的 API 也比较完备，其中 AI Workflow 的可玩性非常高，再结合 Perplexity 的 AI 可以在 Node 内自行实现 AI 搜索。&lt;/p&gt;
&lt;p&gt;缺点是这个软件着实太复杂了，如果不花多点时间研究下是搞不懂的，对新手很不友好。适合喜欢掌控、整理、秩序的同学。内测了两年，目前在公测中，还是邀请制加入，每周五晚上它会更新个小版本。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240921233650@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;0x03 数据库笔记&lt;/h3&gt;
&lt;p&gt;3.1 Notion
&lt;a href=&quot;https://www.notion.so/&quot;&gt;Notion&lt;/a&gt;，在 2017 年的时候开始使用，给了我永久的 Plus 会员。国内还有很多类 Notion 的软件，这里就不展开说了。去年 Notion 出了 AI Q&amp;amp;A 的功能，因此可以基于自己的内容直接生成了 RAG，非常强大和易用。但是我在 beta 版使用之后觉得 AI 的能力还是太弱，不知最近是否有所改善。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240921234249@2x.png&quot; alt=&quot;&quot; /&gt;3.2 Anytype
&lt;a href=&quot;https://anytype.io/&quot;&gt;Anytype&lt;/a&gt;，很早提出基于 Object(Type) 的 All in One 软件，但是研发进度着实太慢太慢，过了两年理念先被 Capacities 实现出来了，而且即便今天，Anytype 的完成度依然不高。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240921234722@2x.png&quot; alt=&quot;&quot; /&gt;3.3 Capacities
&lt;a href=&quot;https://capacities.io/&quot;&gt;Capacities&lt;/a&gt;，基于 Object 的笔记软件（或者叫收集软件？），你可以像面向对象编程那样，定义很多很多对象的原型，之后每有一个 item 产生，那么都需要归类到某个对象之下。Item 之间也支持双链，因此可以搭建一个资源网络。AI 功能也比较好用，API 的存在也衍生了不少玩法。月更大版本，每个月看他们的 Changlog 还是蛮期待的。缺点是他们的服务基本上每个月都会挂一次，服务挂了或者网络不好就完全不可用，迫使他们今年开始做离线存储的改造。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/Pasted%20image%2020240921234537.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;0x04 画板笔记&lt;/h3&gt;
&lt;p&gt;4.1 Heptabase
&lt;a href=&quot;https://heptabase.com/&quot;&gt;Heptabase&lt;/a&gt;，近三年来一直在用的笔记软件，特点是卡片笔记+画板，数据本地存储+云同步，我也把它作为 PDF 阅读器，因为 PDF 阅读期间的标注也会自动转成卡片（类似于 MarginNote）以便我后续统一处理。同时它也支持我在用的 Readwise，在网页上标注的片段也会自动同步成卡片。一般我会收集很多卡片，在写文章或者做分享需要输出的时候，使用画板功能整理、发散、创新。最近新出的 AI Insight 功能对我而言用处不大，一般来说笔记在记录的时候就已经梳理好内容了，不需要再 AI 帮忙做大纲了，除非是无脑复制的长文才可能有这个场景。期待后续 Heptabase 在 AI 上的探索。&lt;/p&gt;
&lt;p&gt;PS. 如果需要试用的话，可以使用我的邀请链接 &lt;a href=&quot;https://join.heptabase.com/?invite-acc-id=4cbb8101-41a9-4961-a447-a423f080f288&quot;&gt;https://join.heptabase.com?invite-acc-id=4cbb8101-41a9-4961-a447-a423f080f288&lt;/a&gt;，你转成付费用户之后我们各得 $5。&lt;/p&gt;
&lt;p&gt;我在内测阶段开始使用这款软件，至今近 3 年 5000+ 卡片。喜欢这款软件不仅仅是因为它本身足够好用，而且这个台湾小哥的开发者(Alan)我非常佩服，在大学毕业就创业做这款产品，并且写了四篇文章介绍自己的愿景（&lt;a href=&quot;https://medium.com/heptabase/my-vision-the-context-c73e29981685&quot;&gt;My Vision: The Context&lt;/a&gt;、&lt;a href=&quot;https://medium.com/heptabase/my-vision-a-new-city-c7010f5871d&quot;&gt;My Vision: A New City&lt;/a&gt;、&lt;a href=&quot;https://medium.com/heptabase/my-vision-a-forgotten-history-67ee77e969da&quot;&gt;My Vision: A Forgotten History&lt;/a&gt;、&lt;a href=&quot;https://medium.com/heptabase/my-vision-project-meta-e0bedd1467b2&quot;&gt;My Vision: The Knowledge Lifecycle&lt;/a&gt;）。功能开发非常尊重用户，关键细节点会发投票，并咨询用户这么选的原因。中间有一年多的时间，我每天早上上班时打开 Heptabase，都会有版本更新，而且每个更新都是 Feature，可见作者对这款产品的热情。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/Pasted%20image%2020240921235857.png&quot; alt=&quot;&quot; /&gt;4.2 AFFiNE
&lt;a href=&quot;https://affine.pro&quot;&gt;AFFiNE&lt;/a&gt;，雪碧(ewind)团队创业打造的产品，特点是文档直接转画板、以及多人协作，每个笔记也支持 Notion 那样内置 Database。创意非常好，但是目前产品的编辑体验个人觉得欠佳。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240921235612@2x.png&quot; alt=&quot;&quot; /&gt;4.3 Excalidraw
&lt;a href=&quot;https://excalidraw.com/&quot;&gt;Excalidraw&lt;/a&gt;，严格来说不是笔记软件，而是作图软件，非常适合程序员做各种架构图、流程图，我平时开发的时候也会单独开一个画板来当成草稿本。&lt;/p&gt;
&lt;p&gt;分享一个小技巧，Obsidian 的 Excalidraw 插件比网页版好用很多，相当于有一个画本客户端。之前在做复杂项目的时候，一个多月都在同一个画本里打草稿，最后项目做完后，一个画布文件有上百 MB 的大小，但是一点儿也不卡。作者也一直在精心维护着它，偶尔还会有使用的小功能，比如两周前还出了个 PDF 标注能力，可以把画本改造成 MarginNote。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/Pasted%20image%2020240922001312.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;二、效率篇&lt;/h2&gt;
&lt;h3&gt;0x01 时间管理&lt;/h3&gt;
&lt;p&gt;1.1 Apple Calendar、Google Calendar
系统级应用，服务稳定，功能齐全，也是免费的。iOS 18 的 Apple Calendar 也支持集成提醒事项，非常易用。Google Calendar 的优势则在于丰富的三方集成。&lt;/p&gt;
&lt;p&gt;1.2 Fantastical
&lt;a href=&quot;https://flexibits.com/fantastical&quot;&gt;Fantastical&lt;/a&gt;，可以整合多种日历源和任务源，设计精美。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/Pasted%20image%2020240922121249.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;0x02 时间追踪&lt;/h3&gt;
&lt;p&gt;2.1 Rize
&lt;a href=&quot;https://rize.io/&quot;&gt;Rize&lt;/a&gt; 是一个时间追踪软件，曾经在我的&lt;a href=&quot;https://blog.ursb.me/posts/weekly-23/&quot;&gt;《月刊（第23期）：多任务中的时间管理》&lt;/a&gt; 介绍过它。&lt;/p&gt;
&lt;p&gt;除了时间追踪，它更是一个培养专注的工具，同一软件或是保持在同一工作上下文中保持一段时间，会进入 Focus 状态（类似心流），这个时间会统计 Focus 时间。而如果你突然切出上下文，如打开微信或者用浏览器浏览了这个上下文无关的网页，Rize 会认为此刻你分心了，从而弹出保持 Focus 提示并退出此轮 Focus 计时。&lt;/p&gt;
&lt;p&gt;整个软件设计地异常简单，整个流程不需要去配置任何东西，结合 AI 进行全自动的监测，只有在娱乐或者是打断 Focus 的时候才会感知到它的存在。（PS: 这不是广告，但如果想体验可以用 &lt;a href=&quot;https://rize.io/?code=291287&amp;amp;utm_source=refer&amp;amp;name=Airing&quot;&gt;https://rize.io?code=291287&lt;/a&gt; 链接来注册…）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/Pasted%20image%2020240922121633.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;0x03 任务&lt;/h3&gt;
&lt;p&gt;任务软件有非常多，相信读者们也有自己用的顺手的任务管理软件。只要用的顺手，最基础的系统的提醒事项就足够用了。本节只列举 3 个具有代表性的产品。&lt;/p&gt;
&lt;p&gt;3.1 Todoist
&lt;a href=&quot;https://todoist.com/zh-CN&quot;&gt;Todoist&lt;/a&gt;，老牌的任务工具，免费 5 个项目的限制足够使用。我之所以一直使用它，是因为它的 API 丰富，同时支持丰富的筛选语法，可以做很多集成，配合工作流使用。&lt;/p&gt;
&lt;p&gt;比如能和 Obsidian 集成，这样 Daily Note 就能直接展示今天的待办事项，或者在项目笔记里可以做项目任务的集成，服务稳定、扩展性非常强，技术支持也很友善、积极。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240922121912@2x.png&quot; alt=&quot;&quot; /&gt;3.2 滴答清单
&lt;a href=&quot;https://dida365.com/&quot;&gt;滴答清单&lt;/a&gt;，适合中国宝宝体质的任务软件（工作事项繁多、存在多线程并行场景），功能丰富，但是始终保持着易用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/Pasted%20image%2020240922115729.png&quot; alt=&quot;&quot; /&gt;3.3 Linear
&lt;a href=&quot;https://linear.app/&quot;&gt;Linear&lt;/a&gt;，适合研发项目管理，集成能力多、可以同步跟进多个项目的工作量进展与进度预测。软件设计非常出众，设计圈内称之为 Linear 风格。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240922115941@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;0x04 研发&lt;/h3&gt;
&lt;p&gt;研发软件每个技术领域都有不同，这里列举一下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Warp，开箱即用，颜值也不错，最重要的是完全不需要自己去折腾各种配置和插件，代替了之前自己使用了很久的 iTerms。也直接生成分享链接给他人展示自己的终端内容，发给他人定位问题的时候比较好用。&lt;/li&gt;
&lt;li&gt;Cursor，最近大火的代码编辑器，AI 功能强大，比 GitHub Copilot 体验好很多。虽然 GitHub Copilot 对我的账号一直是免费使用，但我转 Cursor 付费了，后者甚至有和 AI 结对编程的感觉。&lt;/li&gt;
&lt;li&gt;Apifox，API 文档、接口文档工具。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;oh-my-zsh&lt;/strong&gt;，用的比较多的是 git alias、git 插件、zsh-autosuggestions 插件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tig&lt;/strong&gt;，命令行 Git 增强工具，非常使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Homebrew&lt;/strong&gt;，Mac 必备的软件管理工具，也不算小众了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;musicfox&lt;/strong&gt;，命令行听歌工具，因此电脑上没有装音乐软件，通过 Vim 快捷键可以操作，还可以连接 Last.fm。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scrcpy&lt;/strong&gt;，安卓开发时使用，一般使用真机配合 Scrcpy 投屏，方便电脑操作或录制。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;iPhone Mirrors&lt;/strong&gt;，新系统支持的功能，算是姗姗来迟，着实非常好用，可以用来 iOS 开发直接操作真机，不需要再低头操作了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git Kraken&lt;/strong&gt;，一般较复杂的项目和场景下才会用，比如大仓里包括很多 submodule，或者需要溯源很长的 commit 的历史去查某个地方的变动，否则直接用 tig。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;0x05 AI&lt;/h3&gt;
&lt;p&gt;5.1 Perplexity
AI 搜索软件这一年来因为门槛降低，涌现了不少产品，之前整理过一波：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.askan.ai/&quot;&gt;askan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arc.net/&quot;&gt;arc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bing.com/&quot;&gt;Bing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.everypixel.com/&quot;&gt;everypixel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.genspark.ai/&quot;&gt;genspark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gptgo.ai/&quot;&gt;gptgo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://explorer.globe.engineer/&quot;&gt;Globe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://komo.ai/&quot;&gt;komo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.perplexity.ai/&quot;&gt;perplexity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.phind.com/search?home=true&quot;&gt;phind&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rosebud.ai/&quot;&gt;rosebud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://searcholic.com/#gsc.tab=0&quot;&gt;searcholic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.songtell.com/&quot;&gt;songtell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://scite.ai/&quot;&gt;scite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://you.com/&quot;&gt;you&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://metaso.cn/&quot;&gt;秘塔AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ItzCrazyKns/Perplexica&quot;&gt;Perplexica&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devv.ai/zh&quot;&gt;devv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://so.360.com/&quot;&gt;360搜索脑图&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chatglm.cn/&quot;&gt;ChatGLM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tiangong.cn/&quot;&gt;天工开物&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://trackaianswers.com/PEOPLE?from_site=hibe&quot;&gt;trackaianswers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://maester.app/&quot;&gt;maester&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.morphic.sh/&quot;&gt;morphic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jeeves.ai/&quot;&gt;jeeves&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bookabout.io/&quot;&gt;bookabout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.dorkgpt.com/&quot;&gt;dorkgpt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hellomiku.com/index&quot;&gt;miku&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://search.lepton.run/&quot;&gt;lepton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.aisearch.vip/#&quot;&gt;aisearch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://flowith.io/sub&quot;&gt;flowith&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thinkany.ai/zh&quot;&gt;thinkany&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里重点推一下 &lt;a href=&quot;https://www.perplexity.ai&quot;&gt;Perplexity&lt;/a&gt;，基本上它在我这里已经取代了 Google，它会结合搜索引擎的结果进行回答，同时也支持识别 PDF 文件和图像，回答质量对比同类产品来看是非常之高，最近出了 Mac 客户端版本非常方便。&lt;/p&gt;
&lt;p&gt;PS: Perplexity 的免费版也足够使用（免费版只是不能用 GPT-4 而已），如过注册的话可以使用这个链接 → &lt;a href=&quot;https://perplexity.ai/pro?referral_code=0ZSAD0VT&quot;&gt;https://perplexity.ai/pro?referral_code=0ZSAD0VT&lt;/a&gt; ，未来如果想要付费的话可以得到 $5 的抵扣。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/Pasted%20image%2020240922102256.png&quot; alt=&quot;&quot; /&gt;5.2 Raycast AI
AI Chat 客户端也非常多了，较上面的 AI 搜索而言更是不胜枚举。这里提一下 Raycast AI。&lt;/p&gt;
&lt;p&gt;结合 Raycast 使用很方便，可以通过 Prompt 自定义 AI Command，以下是我常用的一些命令：比如提取 WeChat Bot 返回的 JSON 配置、JSON 压缩、输入 URL 总结网页内容、根据 JCE 协议转 ts 声明或者直接 Mock 出数据配合 Whilstle 构造请求的响应体。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/Pasted%20image%2020240922103635.png&quot; alt=&quot;&quot; /&gt;5.3 Dify
&lt;a href=&quot;https://dify.ai/zh&quot;&gt;Dify&lt;/a&gt;，我愿称之为成年人的大玩具！各种小模型基于组件节点自己搭起来，和小时候搭积木的感觉一样，再配合知识库、API 服务等能力，可玩性取决于你的创意。有开源版本，自己部署在服务端的话比较吃机器配置，可以本地部署或者直接使用 Cloud 版本。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240922104021@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;0x06 工作流&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;IFTTT，自动化服务，支持 AI、Webhook，并且支持 JS 编程处理信息格式和过滤操作，可以做各种记录的聚合、整理和转发，可以作为常驻稳定的中转服务。&lt;/li&gt;
&lt;li&gt;Zapier，类似 IFTTT 的自动化服务，价格较前者更贵，但更加易用，适合不想写过滤脚本的场景。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;n8n&lt;/strong&gt;，类似于 IFTTT 的自动化平台，开源免费，自己部署即可。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有了自动化之后，可以做很多有意思的事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Star 总结：GitHub 点了 Star 之后，自动请求发给 Perplexity  API 让 AI 去总结仓库内容，拿到结果之后再调用 API 同步到 Tana / Capacities 等笔记软件内收集。&lt;/li&gt;
&lt;li&gt;RSS 监控舆情周报：订阅的 RSS 渠道如果触发到某个关键词，就请求 Perplexity  API 拿到文章总结，之后同步到笔记软件内收集，调用通知接口提醒，并发到 TG 的个人频道里。最后利用 Email 做 Weekly 收集，每周发送汇总邮件，汇总触发到这个关键词的文章和对应的简介。特别适合用来做舆情监控。&lt;/li&gt;
&lt;li&gt;豆瓣书影音收集：类似于 GitHub Star，豆瓣评分了某个作品之后，收藏到笔记软件里。&lt;/li&gt;
&lt;li&gt;微博动态订阅：类似于 GitHub Star 订阅。&lt;/li&gt;
&lt;li&gt;听歌记录周报：实用 Musicfox 命令行软件听歌，之后配合 Last.fm 可以汇总听歌数据，每周发给你本周的听歌记录。&lt;/li&gt;
&lt;li&gt;工作专注日报：Rize 每日的专注邮件讲给 IFTTT 监听，如果有 Rize 的邮件，就会使用 IFTTT AI 自动总结今日的时间报告发送给自己。
&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/Pasted%20image%2020240922114741.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;0x07 阅读&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Readwise Reader&lt;/strong&gt;，和 Readwise 的集成做的非常好，体验流畅，支持快捷键、RSS 订阅、NewsLetter 订阅、也可以高亮图片。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inoreader&lt;/strong&gt;，RSS 订阅源管理，配合邮箱、IFTTT &amp;amp; AI、Telegram 订阅、关键词监控做一些自动化提醒和总结。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;微信读书&lt;/strong&gt;，AI 大纲和 AI 解读十分好用，阅读完之后配合 Readwise 保存书摘。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cubox&lt;/strong&gt;，网页收藏箱，配合 IFTTT 使用，各订阅渠道最终都会收录到 Cubox 里。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instapaper&lt;/strong&gt;，因为免费+集成化做的很好，配合 IFTTT、浏览器插件、Inoreader 做网页收藏的中转服务。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Follow&lt;/strong&gt;，基于 Web3 和 RSSRub 搭建的阅读器，前几周新出产品，目前还在内测中，需要邀请码可以找我要。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reeder&lt;/strong&gt;，老牌 RSS 阅读器，前几天出了新的大版本转订阅制了，也是开始转型主打多信息媒介订阅。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Me.bot&lt;/strong&gt;，前段时间新出的一款网页收藏工具，基础功能类似于 My Mind，但是它基于角色卡做的 AI 助理还是蛮有意思的，性格鲜明。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240926102553@2x.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240926102631@2x.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240926102742@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;0x08 系统&lt;/h3&gt;
&lt;p&gt;8.1 截图
CleanShot X
&lt;a href=&quot;https://cleanshot.com/&quot;&gt;CleanShot X&lt;/a&gt; ，一款老牌 &amp;amp; 功能强大的 MacOS 平台的截图软件，以上两款软件的功能它都有，除此之外，还有录制视频、录制 GIF、上传图片到云端、顺序标注等独有的能力，界面也很美观，和 Raycast 的联动做的也很好，还有独创的「all in one」模式。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240922001821@2x.png&quot; alt=&quot;&quot; /&gt;Snipaste
&lt;a href=&quot;http://zh.snipaste.com/&quot;&gt;Snipaste&lt;/a&gt; ，Windows 和 MacOS 平台皆有，最喜欢的是可以把截图贴在桌面上的能力，如同便签一样，方便我贴重构稿、关键信息、对比代码、二维码等信息到桌面上。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240922001946@2x.png&quot; alt=&quot;&quot; /&gt;Shottr
&lt;a href=&quot;https://shottr.cc/#/&quot;&gt;Shottr&lt;/a&gt; 是最近新出的又一款 MacOS 平台的截图 App，功能强大、界面美观、而且免费，较于 Snipaste 多了滚动截图、窗口截图、OCR 等能力。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240922001938@2x.png&quot; alt=&quot;&quot; /&gt;8.2 翻译&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bob&lt;/strong&gt;，翻译软件，有不错的快捷键支持，用的较少，大多数情况下会用 Raycast + AI Command 翻译。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;沉浸式翻译&lt;/strong&gt;，比较好用的网页翻译，可以指定翻译接口。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monica&lt;/strong&gt;，是一个 AI 工具软件，类似于工具箱集合，内置的翻译则是像素级借鉴沉浸式翻译的功能，此外它还内置了网页总结、PDF 总结、视频总结、博客总结、搜索总结等等 AI 小工具。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;8.3 其他&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://arc.net/&quot;&gt;Arc&lt;/a&gt;，强大、易用的浏览器。(但是前几天官宣停止更新新功能了)
&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/20240922114859@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stats&lt;/strong&gt;，状态栏展示设备 CPU、内存、网络、磁盘、电源灯信息。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bartender 5&lt;/strong&gt;，也属于 Mac 必装软件了，可以控制状态栏展示。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RunCat&lt;/strong&gt;，用小猫猫的状态来表示 CPU 的状态，挺可爱的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Vimac&lt;/strong&gt;，使用 Vim 快捷键控制 Mac。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;NinjaMouse&lt;/strong&gt;，配合 Vimac 使用，切软件的时候会自动把鼠标指针挪到激活窗口的正中间。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Input Source Pro&lt;/strong&gt;，切换软件时自动切换输入法，做研发时很常用，如切到 IDE 或终端时自动切英文输入法，而切到文档或者企业微信时则自动切中文输入法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;微信输入法&lt;/strong&gt;，非常好用的输入法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AltTab&lt;/strong&gt;，软件切换工具。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hookmark&lt;/strong&gt;，配合 Drafts 使用，方便做任意书签的笔记。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Geekbench 6&lt;/strong&gt;，本机性能测试软件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AlDente&lt;/strong&gt;，电源充放电管理软件，可以更精准的、个性化的控制电源策略。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tencent Lemon&lt;/strong&gt;，硬盘清理软件，小巧实用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Paste，比较知名的剪切板软件，特点是支持移动端、优秀的检索能力，缺点是价格较贵、竞品也较多。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.raycast.com/&quot;&gt;Raycast&lt;/a&gt;，入了 Raycast Pro + GPT 4 扩展包，最常用的功能是 HotKey 快捷打开软件 、AI Chat 与 Clipboard History。下面是一些常用的插件：&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;AI Chat &amp;amp; Quick AI&lt;/strong&gt;，电脑上一键呼出 AI，这就显得微软的 Copilot 独立按键很蠢了。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI Command&lt;/strong&gt;，根据自定义的预制 Prompt 执行复制的文本，一般我会让它提取 CI 结果中关键的信息，然后生成我需要的配置；或者让它格式化压缩 JSON；分析堆栈信息；英汉互译等等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clipboard History&lt;/strong&gt;，之前入过 Rewind，发现完全没有必要，直接 Clipboard History 效率更高&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;My IP&lt;/strong&gt;，研发原因经常要看内网 IP，快捷键直接查看+复制。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Search&lt;/strong&gt;，因为 Arc 默认搜索设置成了 Perplexity，当明确想用 Google 搜索的时候会按下这个快捷键。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QR Code Generator&lt;/strong&gt;，工作原因有时需要 URL 转二维码，这个就很实用，不需要打开浏览器利用插件或三方工具转。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Todoist&lt;/strong&gt;，配合 Todoist 使用，可以在状态栏或弹窗显示今日任务。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Format JSON&lt;/strong&gt;，有了 AI Command 之后这个插件很少用了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linear&lt;/strong&gt;，配合 Linear 使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scrcpy&lt;/strong&gt;，配合 Scrcpy 使用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20240925/Pasted%20image%2020240922115130.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=mac-app-share-2024&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>月刊（第27期）：旅居</title><link>https://ursb.me/posts/weekly-27/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-27/</guid><description>记录作者告别深圳、旅居大理创业的经历：组建六人团队研发AI心理产品MoFlow，并复盘用Slack、Loom、Linear搭建远程协作流程，附本期生活点滴与书影音。</description><pubDate>Wed, 30 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本篇是对二〇二四年九月至十月的生活记录与思考。&lt;/p&gt;
&lt;h2&gt;🌿 旅居与创业&lt;/h2&gt;
&lt;p&gt;9 月 27 日办理资产退库之后，我告别了深圳，告别了自求学起生活了十年了广东，正式开启了我的新生活。&lt;/p&gt;
&lt;p&gt;离开前的一晚，和 Kami 在万象天地的小酒馆交谈甚欢，他感慨道，认识我这么多年，第一次见我如此健谈。或许在公司时，我给人的印象总是“内敛且不善言辞”，但那只是因为我选择将精力主要关注在事业之上。&lt;/p&gt;
&lt;p&gt;在这之前的一周，我与同事们一一告别。令人意外的是，大家不约而同地最怀念的竟都是那段从零到一研发 Flutter 混合框架的岁月。那些共同奋斗、彼此成长的日子，早已深深镌刻在心中，感恩于这段珍贵的时光。&lt;/p&gt;
&lt;p&gt;这段时间告别老朋友的同时，得益于上一篇全网加起来 &lt;a href=&quot;https://blog.ursb.me/posts/2024-summer/&quot;&gt;10 万+阅读量的文章&lt;/a&gt;，也因此遇到了一些新朋友。有付费听我说故事的，有几封来邮件交友的，甚至还有一些曾一起共事的同频人，竟在离别之际才算真正认识上。&lt;/p&gt;
&lt;p&gt;人生在世，理应结识形形色色的人，去聆听他们的人生故事。毕竟我们的人生仅此一次，但若能与他人的生命碰撞，迸发出璀璨的火花，那将是何等的幸运。&lt;/p&gt;
&lt;p&gt;告别深圳之后，我驱车自驾来到了大理。租了一个小院子，每天埋头研发。说是旅居，其实更像是换了一个安静、凉爽的地方做自己的事情。但这一切，其实早已不是自己一个人的事情了。&lt;/p&gt;
&lt;p&gt;原本是自己的事情，这个想法萌生于几年前，之后做了大量的市场调研、产品调研和用户调研，前几个月，设计合伙人正好处于 Gap 期，于是我们约着又讨论了想法，进行了补充和完善，最终将产品定义在 AI + 心理的赛道上。&lt;/p&gt;
&lt;p&gt;目前为这个项目组建了一个六人团队，四全职两兼职，大伙对于项目充满激情，一起凝聚想法、一讨论、一起设计、一起实现，每天充实且开心着，让我想到了在前司做 Flutter 的那段日子。&lt;/p&gt;
&lt;p&gt;回到项目本身，现在项目进展良好，预计 11 月底可以开启 TF 外团测试。根据目前的设计和内团体验来看，大家都迫不及待地想让这款产品上线，团队内的小伙伴都认为它着实可以帮到自己。&lt;/p&gt;
&lt;p&gt;但我们也时刻保持着冷静，不断体验与打磨产品细节，如果 11 月底没有如期进入 Beta 版测试，那肯定是大家对自己的产品细节还不够满意。我们希望能够给用户们呈现一个好用的、完整的产品，希望它也能够给大家带来帮助。敬请期待。&lt;/p&gt;
&lt;h2&gt;🌺 生活点滴&lt;/h2&gt;
&lt;p&gt;以下是本周期内一些瞬间的记录。&lt;/p&gt;
&lt;p&gt;🎁 &lt;strong&gt;礼物：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;非常感谢朋友们送的礼物（或者米饭），完全的 surprise！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/FotoJet.jpg&quot; alt=&quot;&quot; /&gt;那段告别的日子相较于伤感，更多的其实是愉悦，感恩这一切。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/4571730261295_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;🚗 国庆自驾：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;没想到小 Mini 这么能装，我们带上了两只猫、两个 24 寸的显示器、全装了衣服的 20 寸大行李箱、一个鹅绒被、两个枕头、两套床单，还有几个背包。&lt;/p&gt;
&lt;p&gt;装完满满一车之后，驱车三天行程 1800 公里，来到了大理。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/4641730261540_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;🏡 旅居与小院子：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;到了大理之后便在苍山下租了一个带二楼露台的小院子，早晨，阳光洒进院子，显得格外温馨；下午，在露台上饮茶办公，也是绝美。我最喜欢的是，这片区域非常安静，非常适合沉浸式办公。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🌊 洱海：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;来到大理的这一个月来，每天 12 个小时工作时长，就只有一个周日出门了，那天环洱海自驾了一圈。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/WechatIMG467.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/WechatIMG465.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;💰保险：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;自驾途中，后窗玻璃意外破碎，于是我报了人生中的第一次保险。开始以为是换个玻璃就好，结果原厂的配件号没有后窗玻璃，4S 店说只能整个敞篷一起换。原本还是有些难过的，心里用“碎碎平安”来安慰自己，但出险一次，整个敞篷得以更换，倒也不算坏事。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🐱 丢了两条命的泡芙：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;来了大理之后所遇种种并不算顺利。某天下午泡芙和手套从小院子的栏杆缺口越狱了，发现猫没了之后立马出门找，毕竟之前一直是家养，出门之后也不知道会遇到些什么。结果一出门就看到了手套，它着实太笨了，一出门就掉进了家门口的水渠里，跳不去来，只能喵喵叫（可惜没先拍张照片做个丑照纪念）。但是泡芙找了一圈也没有找到，最后不得已挂了寻猫启示，邻居看到了就送回来了，说泡芙一整天都在他家的阳台上躺着晒太阳，还以为是野猫。&lt;/p&gt;
&lt;p&gt;泡芙回来之后的第二天，就开始不断吐口水，甚至开始在地上疯狂抽搐，抽到最狠的时候会强直身体，我也不敢碰它，担心它挺不过这一波。等缓下来之后，立马送去医院，初诊是中毒。但是吊了 5 天广谱解毒药配合护肝药也没有任何好转，甚至有加重倾向，每天抽搐的次数更加频繁，精神也愈加萎靡。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/4591730261327_.pic.jpg&quot; alt=&quot;&quot; /&gt;于是我们停止用解毒药，医院怀疑是神经问题，于是开始吃抗癫痫药，立马有好转，不再吐口水和抽搐了。但吃了一天之后，另一个问题表现出来——四肢软弱无力，导致它有两天无法正常行走。再送去医院，配合抽搐症状基本可以确定是神经问题，但医生说无法根治，国内也没有几家机构可以做检查，只能长期用药。于是开始吃维生素 B1 和 B12，未曾想吃了两天之后完全好转了。每天到处上蹿下跳跟个没事人一样，依旧调皮、依旧活泼。要说变化，是变得更加粘人了，同时也能听懂我们的一些指令，哪怕它玩的再欢，喊一声就会屁颠屁颠跑到你身旁。&lt;/p&gt;
&lt;p&gt;都说猫有九条命，可能它又用掉了一条吧。上一次还是 4 年前，自己咬开阳台的封网走去阳台边缘，从 12 楼直接掉到了二楼商铺的楼顶上，第二天下午才找到。送去医院，检查之后发现只是受到了惊吓，同时咬破了自己的舌头，除此之外没有任何骨折和内脏受损，医生也说是个奇迹。&lt;/p&gt;
&lt;p&gt;希望两只猫猫今后都能健康生活下去。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;📊 最后的技术分享：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;离开公司的最后一天做了一个技术课程，准备了足足两周有余，从加载到上屏整个流程如果要说清楚是一件比较困难的事情。我准备了一个 Demo 游戏，配合运行时断点数据与数学计算，讲解了渲染上屏的 10 个环节。把这个过程梳理清楚的过程非常有意思，也通过这个过程让我感受到了图形学趣味。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/202410301213062x.png&quot; alt=&quot;&quot; /&gt;因为时长问题，改过了 3 版的 PPT 大纲最终如下（反正放大也看不清楚就不打码了），原本会更系统一些，准备了 200 页+。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/202410301218082x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;✨ 创业分享&lt;/h2&gt;
&lt;h3&gt;即时通讯：Slack&lt;/h3&gt;
&lt;p&gt;之前我们团队用的飞书，作为一款 All in One 的办公软件用起来确实很方便，至少会比企业微信高效很多。我们也在飞书里建立了若干个话题群，大家会在话题群里滚动发一些资讯的帖子，以保持对新鲜事物的敏感度。&lt;/p&gt;
&lt;p&gt;使用飞书两个月后，我们发现了一些不太满意的地方：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;消息已读功能带来了阅读焦虑&lt;/strong&gt;：飞书有消息已读，发完消息之后或多或少会有阅读焦虑，一方面会关注别人读了自己的消息没有，另一方面也会考虑着有新消息的时候需要尽快阅读。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文档体验不流畅&lt;/strong&gt;：飞书文档虽然强大，但用起来的整体体验并不能称得上是流畅，文档切换与检索会很容让人觉得知识库的设计过于繁重。虽然文档中的待办事项可以直接关联到飞书任务，但飞书任务也是一言难尽的难用。此外飞书免费版限制了 60 分钟会议，对于我们的周会讨论而言也是不够的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;默认的三方集成有限&lt;/strong&gt;：常用软件如 GitHub、Linear 等集成较少，需要我们自行开发 Bot 进行集成。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;之后在 Slack 和 Discord 之间，我们选择了 Slack，有几点优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;公开的频道设计&lt;/strong&gt;：频道的设计避免了聊天群的小圈子感，所有频道都是公开的，默认只邀请相关同学。对话题感兴趣的同学可以自行加入。我们还建立了许多消息频道，类似于之前飞书的话题群，每天滚动更新资讯，保持对产品的敏感度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高效沟通&lt;/strong&gt;：Slack 会将连续的消息整理成独特的样式，期望用户像发送电子邮件一样，一条消息将事情说全。高效沟通需要在整理好背景、问题、原因和方案后，一次性发送消息，不必担心对方是否及时收到，可以当作留言。避免询问对方“在吗”，然后再慢慢发送消息，这既不是高效沟通，也不是即时沟通。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/slack-message.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;免打扰设计&lt;/strong&gt;：Slack 的通知设计较弱，除非是私信或 @ 的消息，只有在活动/未读消息 Tab 才能看到。如果想在群里 @所有人，会弹出确认提示，因为这是一个很打扰的操作。同时，Raycast 有插件，可以方便地设置当前的 Slack 状态，配合定时消息和稍后阅读功能，确保不错过重要消息，同时也不打扰他人。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/slack-notify.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;轻量化语音会议&lt;/strong&gt;：我们很喜欢 Slack 的抱团功能，很多国内办公软件称之为“会议”，需要预约，邀请时会有电话铃声响起，这种设计很严肃。但抱团不同，需要语音/投屏沟通时，直接发起抱团，对方按需加入。抱团类似于游戏中的“连麦”，是一种轻量、即时的设计，使每次沟通不再那么严肃。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;丰富的集成应用&lt;/strong&gt;：众所周知，Slack 的集成非常丰富，我们集成了 GitHub、Notion、Linear、Loom、Xcode Cloud 等常用软件，结合自动化，几乎可以算作另一种意义上的 All in One。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/slack-linear.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/slack-app.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;会议：Loom &amp;amp; Slack 抱团&lt;/h3&gt;
&lt;p&gt;前文提到了集体会议的时长会比较长，后来我们尝试做了一些优化。&lt;/p&gt;
&lt;p&gt;首先，每周我会先用 Loom 录制一个异步会议，总结大家上周的工作和下周的工作安排，并整理下周工作安排的几个重点方案，团队成员有时间的时候浏览下视频和配套的文档即可。&lt;/p&gt;
&lt;p&gt;之后，在方案进入设计研发阶段时，再在方案频道里使用「抱团」进行方案讨论。&lt;/p&gt;
&lt;p&gt;这样就不需要约大家都有空的时间进行全体会议，约一个大家都有空的共同时间这件事本身就比较耽误项目的节奏。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/loom.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;任务管理：Linear&lt;/h3&gt;
&lt;p&gt;团队使用 Linear 作为任务管理工具，它和 Slack 集成非常好，填好工作量之后，洞察功能可以对整个项目的研发进度给出预估完成的最早和最晚时间，这点对于 PM 把握项目节奏而言非常好。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/linear-progress.png&quot; alt=&quot;&quot; /&gt;此外，我们将项目每隔两周划成一个 Cycle，每个 Cycle 有 1-2 个主题，帮助我们专注于当下最核心的任务模块。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/linear-cycle.png&quot; alt=&quot;&quot; /&gt;最后，Linear 里程碑、任务约束等基础功能也打磨的非常好。&lt;/p&gt;
&lt;h2&gt;🎬 书影音&lt;/h2&gt;
&lt;p&gt;以下是本周期的书影音记录。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;读完：哲学 |《后现代的刺》| ★★★★★&lt;/li&gt;
&lt;li&gt;读完：小说 |《七个证人》| ★☆☆☆☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《因果报应》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《异形：夺命舰》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《误杀瞒天记 2》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《默杀》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;玩过：游戏 |《Thronefall》| ★★★★★&lt;/li&gt;
&lt;li&gt;在玩：游戏 |《塞尔达传说：智慧的再现》| ★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-27&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>再见了，盛夏</title><link>https://ursb.me/posts/2024-summer/</link><guid isPermaLink="true">https://ursb.me/posts/2024-summer/</guid><description>记录作者从大厂裸辞的心路历程，结合自身在腾讯音乐五年的职业经历，借鹅笼、幸福与勇气三个意象，探讨工作的目的、世俗成功的规训与生命意义的追寻。</description><pubDate>Sat, 31 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;一、近况、过往与未来&lt;/h2&gt;
&lt;h3&gt;1.1 近况&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;譬如朝露。——《短歌行》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我提离职了，Last Day 定在了国庆节，裸辞。&lt;/p&gt;
&lt;p&gt;当我突然向领导提出离职时，他表示很不解——大好前程、稳定高收入、大堆未解禁的股票、手上还有可以答 T12 的核心项目，不知道为什么我要离开。后来总监和 GM 找过我聊，我只是说我想体验更多的可能性，我在这里已经停留了太久了。按计划，我原本早该走了。&lt;/p&gt;
&lt;p&gt;29 岁、小学老师、哲学硕士、毕业 4 年鹅厂 T11，很多标签环绕着我，偶尔拿到的奖项、优质的项目和熟练的业务，让我逐渐陷入到一个舒适圈里。我害怕一眼看到头的未来，我想跳出目前的境地，这条既定的大道，我不愿走完。&lt;/p&gt;
&lt;p&gt;月刊断更的这个夏天，父亲确诊脑瘤住院了，术后又反复感染肺炎，愈后很差，经历转院 3 次、ICU 反复进了 4 次。每每去医院看望，都在数着我剩下可能能看望的次数。当我在病床前看向父亲时，才惊觉到父亲已如此衰老，在我的记忆里他一直如伟岸的山，过往回忆像走马灯在目光中闪烁。转瞬之间，29 年过去了，而我却不知我此生的时光还剩下多少。&lt;/p&gt;
&lt;p&gt;所幸，父亲已得到治愈，目前处于康复阶段。我也决定离职，抛弃一切光环，走向不可知的未来。&lt;/p&gt;
&lt;h3&gt;1.2 过往&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;飘如陌上尘。——《杂诗》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;回首毕业后在 TME 的时光，我得到了很多成长。第 1 年做在 Q 音做绿钻活动、第 2 年在直播做 Flutter 框架、第 3 年做 3D 元宇宙、第 4 年在 K 歌做游戏渲染引擎，接触到的业务每年都在变化，而每一年我也都在尽自己的最大努力在这些业务中得到成长——2 年 T9，2 年半 T10，4 年半 T11。但说实话，期间在第 3 年看不到成长机会的时候就想离开了，因此在去年提了一次离职，但总监给了渲染引擎这个核心项目让我负责，我也抓住了这个机会晋升到了 T11。但是我的喜悦之情也只有得到晋升消息的那个晚上而已——得到了，然后呢？继续成长，剑指 T12 吗？&lt;/p&gt;
&lt;p&gt;突然间察觉，我似乎将我所经历的这一切，当成了一场有倒计时的生死游戏，而那个倒计时的终点，是 35 岁。因此我需要在那之前的每一年，努力打怪升级得到成长，以便在尽可能早的时间内晋升到高职级转管理。到目前为止，我在这局游戏中完成地很出色，甚至在可见的游戏结局里，我也有非常之高的概率达到所谓“游戏胜利”。&lt;/p&gt;
&lt;p&gt;但我选择中途退出，因为发现在这局游戏中我后续要做的事情并没有什么意思，我将得到的并不值得我为之付出的生命能量。既然如此，那么再继续玩下去只是浪费时间，我应该主动寻求改变。&lt;/p&gt;
&lt;p&gt;前两天有一篇&lt;a href=&quot;https://tinystruggles.com/posts/google_postmortem/&quot;&gt;博客&lt;/a&gt;，一个优秀的 Google SRE 工程师工作了 9 年之后决定离职，她认为自己虽然得到了对等的报酬，但是仍有一些遗憾。她早就察觉到自己并不适合这份工作，但是只是被动的等待改变，没有更早地转变角色去探寻新的可能性。&lt;/p&gt;
&lt;p&gt;失去可能性只是一方面，更关键的是自身会陷入到了一种舒适的循环之中，大多数人会习惯在舒适圈中增长自我，但舒适圈本身会消磨殆尽个体的主动性和可能性。&lt;/p&gt;
&lt;p&gt;此外，类似于追求多巴胺不断强化愉悦回路的行为，人生不能陷入“增长成瘾”的境地，不能将所有的成就、人生的快乐都依赖于自我的永远上升。那么无限膨胀的欲望会吞噬自己，直到某天自己的能力再也无法满足欲望，那么价值感则会瞬间崩塌，化为无尽的虚无与痛苦。&lt;/p&gt;
&lt;p&gt;每年写完年终总结之后，我都会给自己画一个五年计划，规划未来五年内我所有可能的目标和人生路径。如果想要成功的人生，那就必须每隔一段时间，就把人生推进到下一个阶段，完成前一个目标之后，再朝着全新的目标努力。现在，是更新路径的时候了，比我预期的来得更早，在这个盛夏中来了。&lt;/p&gt;
&lt;p&gt;本节的最后，像 &lt;a href=&quot;https://tinystruggles.com/posts/google_postmortem/&quot;&gt;Postmortem of my 9 year journey at Google&lt;/a&gt; 这篇文章一样，给这段职业生涯来一个分析报告：&lt;/p&gt;
&lt;p&gt;介绍
23 岁的研一暑假，我在校招实习时加入腾讯音乐，那个时候 TME 还属于腾讯的 SNG。&lt;/p&gt;
&lt;p&gt;虽然在那之前我已经是一个在 GitHub 活跃了 5 年有余的独立开发者，但是我从未参与过企业级的项目。通知这次实习，我掌握了项目的完整流程，也学习到了对线上的敬畏、对用户个体的关注。&lt;/p&gt;
&lt;p&gt;加入时的期望
在实习之后，我在对鹅厂的这段经历充满热情，加上团队氛围很好，毅然选择留下来，也没有去看其他的机会。&lt;/p&gt;
&lt;p&gt;我想在这里收获尽可能多的技术和成长，想与尽可能多的鹅们建立链接——想体验积极向上的团队氛围，想收获一段独特的人生经历。那时，我对自己的职业规划很简单，三年内到 T9 就可以了。&lt;/p&gt;
&lt;p&gt;那个时候给自己保存了这句歌词，感谢过去的自己：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2018/IMG_0317.jpg&quot; alt=&quot;&quot; /&gt;职业经历
实际的经历则曲折很多，我加入互联网行业时恰好是动荡期，立马经历了几年疫情，之后又是裁员浪潮。我的业务和团队在五年间不断变化，我也积极在其中寻求成长的可能性。&lt;/p&gt;
&lt;p&gt;这段期间，我收获了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;充足的报酬，以及成为鹅厂员工的满足感&lt;/li&gt;
&lt;li&gt;软件工程技能，现在基本上任何一个需求抛过来能立马抛出它的实现方案&lt;/li&gt;
&lt;li&gt;问题处理能力，在问题定位上形成了自己的一套方法论，得到同事之间的认可&lt;/li&gt;
&lt;li&gt;高效、有序的规划能力，繁杂的工作培养出来的业务能力，最多同时手上并行七个需求仍然井井有条&lt;/li&gt;
&lt;li&gt;坚定的工作态度，培养了在工作时保持专注的能力，在工作中几乎能付出百分百的精力和责任感&lt;/li&gt;
&lt;li&gt;钻研的精神，对各端技术都有较为深度的理解，始终保持热爱和好奇&lt;/li&gt;
&lt;li&gt;沟通与协调能力，越到后期越注重这个软能力项，在过程中负责过紧迫的大项目，同时协调将近 10 个团队配合项目工作&lt;/li&gt;
&lt;li&gt;数据分析能力，生涯中培养了对业务的敏感度，对基本数据有直观上的归因能力，在更深的挖掘能力上也得到了培养&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但也有我不满意的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对大厂开始祛魅&lt;/li&gt;
&lt;li&gt;团建假期没有了(PS. 后来发通知今年恢复了)&lt;/li&gt;
&lt;li&gt;没有机会培养管理经验，个人成长机会有些不明朗&lt;/li&gt;
&lt;li&gt;等等其他不说了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;自我反思
哪些地方进展顺利：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我晋升很快，两年 T10、四年 T11，绩效让我几乎一直走绿色通道，三次答辩也是 Top1，保持着百分百的通过率&lt;/li&gt;
&lt;li&gt;以 T11 作为这段经历的结束已经超预期了&lt;/li&gt;
&lt;li&gt;收获了很多出来后不知道有什么用的奖项&lt;/li&gt;
&lt;li&gt;负责过 4 个核心项目，而且分别在不同的技术领域&lt;/li&gt;
&lt;li&gt;软技能得到了培养和提升，包括沟通、汇报、技术分享等&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/img_trophy.jpg&quot; alt=&quot;&quot; /&gt;哪些地方做的不好：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主动性在后期逐渐减弱，工作激情在身边人逐渐离职后开始消磨&lt;/li&gt;
&lt;li&gt;推动性较弱，顾及形象，但这点后来想通了，如果都是为了同一个目标奋斗的话，那么对事不对人就好&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;幸运之处：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;初期团队的包容和友善&lt;/li&gt;
&lt;li&gt;和设计师合作，写了很多专利&lt;/li&gt;
&lt;li&gt;绩效不错&lt;/li&gt;
&lt;li&gt;领导们也都很好&lt;/li&gt;
&lt;li&gt;接触到了很多不同形态的业务&lt;/li&gt;
&lt;li&gt;职业生涯中有半数以上的时间专注技术&lt;/li&gt;
&lt;li&gt;得到机会接触并负责不错的技术项目，包括跨端项目以及后续的渲染引擎项目，有机会负责 iOS 项目和 C++ 工程，在前端领域得到了扩展和转型&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果重来，我有什么可以改变的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;做更多的技术输出，目前个人的技术输出偏少了&lt;/li&gt;
&lt;li&gt;付出一部分精力在工作之外的技术探索上&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接下来，谈谈我对短期未来的规划。&lt;/p&gt;
&lt;h3&gt;1.3 未来&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;劝君莫强安蛇足，一盏芳醪不得尝。——《有感》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;关于未来的路，我有很多问题想要去探索：我们能否真正理解他人的感受？每个人内心深处的记忆，都是真实的吗？还是说我们只愿意相信自己所看到的东西呢？意识的结构是什么？知觉是如何给予事物本质的？主体如何在生活世界中构建意义？为什么我们总会情不自禁地交浅言深呢？我们的生命，真的能够像日出那样，向上而且温暖吗？又或者只是我们心里的美好祝愿呢？&lt;/p&gt;
&lt;p&gt;我心里还有数不清的问题想问，我愿意让自己的人生一直沉浸在对这些问题的探索之中，探索人生无尽的无尽的可能性。而眼下，我决定先去尝试实现一个多年间的想法，希望它能真正地帮助到人们去解决一些问题。&lt;/p&gt;
&lt;p&gt;在去年的年终总结&lt;a href=&quot;https://blog.ursb.me/posts/summary-2023/&quot;&gt;《2023，逃离仿徨》&lt;/a&gt; 列举到了我通过写作帮助了到一波读者的例子：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240113164230.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240113164313.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240113164354.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/IMG_1129.jpg&quot; alt=&quot;&quot; /&gt;之前听闻“婴儿最快乐的时刻就是发现他自己可以对周围的世界产生影响”。在写作这种创造性的活动中，或许我也是在追求某种“存在感”，这种存在感可能就是我对世界的一点点影响和改变。而我想创业做的产品，也是具有这种属性和价值的。&lt;/p&gt;
&lt;p&gt;但当我说出我正在着手准备做项目创业的决策时，周围人基本对此持有悲观态度，而我却清楚地知道，眼前这条路我非走不可。如果只是因为眼前这件事困难很大、或是收益很低而选择不去做，那并不是我的行事风格，我一直喜欢去做难而正确的事情，虽然这种行为在别人眼中，这可能并不正确。&lt;/p&gt;
&lt;p&gt;在 2018 年的年终总结&lt;a href=&quot;https://blog.ursb.me/posts/summary-2018/&quot;&gt;《2018，沉淀初心》&lt;/a&gt;中我提到和两位 VC 的见面，当时我的决定是先不创业，而是去大厂磨砺几年，大约 3 年到 T9 左右再离开，因为当时的我虽然想法很多，也有非常想去做的事情，但我知道以我当时的能力和阅历不足以支撑我做成它，这也是我初心。&lt;a href=&quot;https://blog.ursb.me/posts/summary-2018/&quot;&gt;《2018，沉淀初心》&lt;/a&gt; 这个标题的坑埋了很多年，在这里呼应回来了。现在时机成熟了，是时候行动了，无论最后是成功还是失败，我都不悔初心。&lt;/p&gt;
&lt;p&gt;有人觉得我固执，有人觉得这无法理解、也有人觉得我不合群，而我反思了一下，觉得这一切应该来自于我此生最大的幸运——在恰当的时机体验了死亡觉察。在&lt;a href=&quot;https://blog.ursb.me/posts/summary-2017/&quot;&gt;《再见了，我的大学》&lt;/a&gt;里提到过那两次住院和一次濒临死亡的体验，那之后的每一天我都认为是新生的恩赐，我希望能尽可能地利用好自己的每一天去探寻自己存在的价值。&lt;/p&gt;
&lt;p&gt;三年前，我将相关的想法撰写成了一篇短文&lt;a href=&quot;https://sspai.com/post/83743&quot;&gt;《谈谈存在的价值与人生体验》&lt;/a&gt;，后在少数派上发表，得到了很高的热度和留言。而在本文中，我想结合工作这个主题，从另一个角度再来谈一谈生命意义这个议题。&lt;/p&gt;
&lt;p&gt;弗兰克尔提出了三种发现生命意义的方式，分别是工作、爱和勇气，后文将围绕这三个点分别对应的去谈一谈我眼中的鹅笼、幸福和勇气。&lt;/p&gt;
&lt;h2&gt;二、鹅笼、幸福与勇气&lt;/h2&gt;
&lt;h3&gt;2.1 鹅笼&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/banner-goose.png&quot; alt=&quot;&quot; /&gt;&amp;gt; 笼亦不更广，书生亦不更小，宛然与双鹅并坐，鹅亦不惊。——《阳羡书生》&lt;/p&gt;
&lt;p&gt;鹅笼一词并非是讥讽，而且来源于《阳羡书生》中一个意象，象征着一种束缚和限制。原文中的货郎在背负鹅笼的过程中，实际上反映了现代人生活中面临的各种束缚和压力。改编动画短片《鹅鹅鹅》的导演胡睿提到，鹅笼代表了人生中的种种限制，暗示人们在追求自由和理想时，往往会被现实的桎梏所困扰。因此，鹅笼不仅是物理上的容器，更是幻想与现实交织的空间。“书生从笼中吐出美食和美女，展现了人们内心深处的渴望与幻想，这种幻想的实现与现实的冲突，反映了人们在追求美好生活时所经历的挣扎与失落。”&lt;/p&gt;
&lt;p&gt;鹅笼因此成为了一个充满神秘色彩的象征，代表着人们对理想生活的追求和对现实的无奈。在本章中，我力求还原鹅笼的本来样貌，将个体的挣扎与追寻呈现出来。&lt;/p&gt;
&lt;p&gt;工作的目的
大部分中产阶级的打工人在工作困顿之际难免反思到工作的目的究竟是什么，而得到的结论普遍为以下几种：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一种，为钱工作。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;产生这种想法的原因有几种：&lt;/p&gt;
&lt;p&gt;首先是社会因素，在现代社会中，我们往往会通过工作来获得社会认同，因此收入的高低直接影响个体在社会中的看法，这种文化促使我们将工作和金钱联系到一起，甚至将收入的高低视为衡量成功的标准之一。当以前的同学或者老家的亲戚知道我在大厂工作，大部分都是羡慕的，而这只是因为收入高。&lt;/p&gt;
&lt;p&gt;其次收入可以用来满足主观的物欲，在消费主义肆掠的年代，工作的目的转化为了消费，为钱工作的驱动力在于对物质欲望的无止境追求。&lt;/p&gt;
&lt;p&gt;因此大部分人，即便在被 PUA 或是一直在抱怨自己的工作不好、即便严重透支了自身的身心健康，也不愿意换工作。当我听到这些抱怨时就会劝其直接跑路，但对方大多只是嘴上说说，当我进一步问其跑路之后想去什么公司时，得到的答案却是换一家薪资更高的公司。为钱工作的鹅笼牢牢束缚住了他。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二种，为未来工作。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;前文提到大厂基本上都是倒计时的生死游戏，而大多员工的唯一目标就是在倒计时终点来临之前赚到尽可能多的钱，以实现财务自由、提前退休，这一路径在过往的十几年的互联网行业里已经验证了是极具可操作性的。&lt;/p&gt;
&lt;p&gt;这种场景表面上看和第一种一样，但其实思考得更进了一步，至少知道自己想要什么。同时为了实现这个目标的未来，个体也会不断在游戏中鞭策自己晋升成长。在此期间，无论吃多少苦、忍受多少痛，哪怕工作无意义、只是拧螺丝，也不会有过多怨言，因为大家心中有一个美好的愿景，因为大家知道这些苦和痛，都是为了以后的甜。吃更多的苦，收获更多的甜。&lt;/p&gt;
&lt;p&gt;在这种恶性循环之下，工作的唯一目标，转变为了不工作。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三种，为了不工作。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在经历了前面的阶段之后，劳动已经发生了异化。怀有这种目的的劳动者将出卖劳动力与时间的工作，视为获取幸福生活的一种代价，而非幸福生活本身。&lt;/p&gt;
&lt;p&gt;什么是异化？苏珊·桑塔格曾经在《论摄影》里面有过这么一句话：“人们患上了摄影强迫症：把经验本身变成一种观看方式。”随着摄影技术的普及，人们越来越倾向于用拍照的方式来经历和记录生活。拍照成为一种强迫性的行为，仿佛只有通过照片，一次经历才算完整，一个事件才算真实发生过。人们开始把现实生活等同于照片中的影像，于是旅行不再专心看风景体验人文，而是专注于拍照、打造朋友圈中待分享的照片。这种情况下，摄影这个行为扭曲人们对现实的理解，让观看变得肤浅、经验变得虚幻。而这实际上便是一种异化，工具本身变成了目的，使人疏离了真实的生活。&lt;/p&gt;
&lt;p&gt;这种场景下的工作也是类似，将不工作作为工作的目的，忽视了工作本身可能存在的价值和意义。&lt;/p&gt;
&lt;p&gt;那么，究竟什么样的工作目的，才是积极健康的？&lt;/p&gt;
&lt;p&gt;前文提到了弗兰克尔提出的三种发现生命意义的方式，第一条便是工作——我们通过从事有意义的工作来找到自我价值。我们要思考在个体的创造中，个体完成了什么或者是给世界贡献了什么。&lt;/p&gt;
&lt;p&gt;我之所以会选择编程作为职业，最主要的原因是编程的创造给我过最纯粹的快乐，无论过了多少年，我依然记得刚接触编程那会，笨拙地操弄着 VB 开发做到深夜，当开发完成、打开软件界面的那一刻，那种油然而生的欣喜永远也不会忘记。&lt;/p&gt;
&lt;p&gt;其实早在初中的政治课中，我们就学习过劳动是为了创造社会价值、实现个人价值，而长大之后，我们似乎将其看作了一个笑话。这并不是个体的过错导致的认知偏差，而是受到了畸形的社会规训影响。&lt;/p&gt;
&lt;p&gt;世俗的成功
世俗的成功给我们定义了一套人生模版，在《幸福的积分》一文中有过生动的描述：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;对于出生于改革开放后的一、二线城市的中国青年来说，这个典型模板大体包括：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;拼命求学到至少本科；&lt;/li&gt;
&lt;li&gt;加入金融或科技互联网等高增长行业；&lt;/li&gt;
&lt;li&gt;在 GDP 前十的城市购买一套住宅（上海、北京、深圳、广州、重庆、苏州、成都、杭州、南京和武汉）；&lt;/li&gt;
&lt;li&gt;在 30~35 岁之间结婚并生子；&lt;/li&gt;
&lt;li&gt;每年 1~2 次的境外旅行或过上同等购买力的“中产生活”；&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;在我身边的绝大多数人目前也都遵循这一成功模板来构建属于自己的幸福生活，而它的终局只能是幻觉。&lt;/p&gt;
&lt;p&gt;“在过去，人们像磨盘上的动物一样追求着前方的胡萝卜——总有一些人会得到胡萝卜，但重点在于让所有人都相信朝着一个方向走，会有胡萝卜。胡萝卜更像是一种终极想象，谁吃到胡萝卜并不重要，重要的是只要有一根胡萝卜，便可让无数的人对此趋之若鹜。”（《幸福的积分》）&lt;/p&gt;
&lt;p&gt;在《规训与惩罚》中，福柯指出这种规训在社会中具有着普遍性，称之为微权力。这种规训微权力通过规范来控制个体的行为，让社会形成了一种全景敞视的监狱，个体在这种权力结构中被迫自我规训，成为合格的社会成员。&lt;/p&gt;
&lt;p&gt;这种世俗的成功在很大程度上，定义了我们的行为方式。它们告诉我们哪些行为是正常的，哪些行为是不正常的。这种规训不仅决定了我们的行为，也在很大程度上决定了我们对于他人的价值判断，使得一些行为被贴上了“应该”的标签。在某种意义上，社会规训的存在，是对我们的自由选择的一种剥夺。他们定义了我们“应该”做的事情，而忽略了我们其他可能的选择。&lt;/p&gt;
&lt;p&gt;这便是福柯在《词与物》所说的“人之死”，即人之主体性的丧失，我们失去了人之所以为人的自由和无限可能。&lt;/p&gt;
&lt;p&gt;消亡的主体
现代社会的结构使得人们为了获得社会的认可与世俗的成功，不得不将自己物化来寻求他人的认可，从而表现出一种在规训之下的虚假个性。人们在同一性逻辑下的挣扎，进一步加剧了个体主体性的消亡。&lt;/p&gt;
&lt;p&gt;而主体性的消亡会导致失去认知自己的机会，如果一个人从未真正替自己做过决定，那他就很难有动力去向内探索，从而失去了解真实自我的机会。这也反应出现代人的困境——无法听从本能知道自己必须做什么、无法根据传统了解自己应当做什么，也不知道自己想要什么。&lt;/p&gt;
&lt;p&gt;身边有朋友和我交流时倾诉过，即便他已经知道当下的工作不是自己最想做的，或许饱含了抱怨和痛处，但也暂时不愿离开，因为离开了也不知道自己想要去做什么。这种情况下很多人会选择在工作中进入半躺平的状态，在工作之余分出一部分精力探寻自己的副业，之后等待合适的时机进行转型。这种做法是折中的，是对微权力的反抗，也是积极向内探寻的。但我不愿意这么做，因为我认为无论做何事都得认真拿出 100% 的精力去对待，这才是认真地活过。&lt;/p&gt;
&lt;p&gt;除却这一部分积极向内探求的路径之外，弗兰克尔提出，对这样的主体性消亡价值危机有最常见的两种的行为反应——从众，即做别人做的事情，以及顺从权威，即做其他人想要自己做的事情。&lt;/p&gt;
&lt;p&gt;而如果很有幸，你知道自己想做什么，但可能也因为诸多因素身不由己无法付诸实施去行动。做自己很难，“这个世界日以继夜、竭尽全力让你成为其他人，如果你想做你自己，就意味着要打一场最艰难的仗。”(E·E·卡明斯)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/fish.jpg&quot; alt=&quot;&quot; /&gt;——“可是宝贝啊人生又何止这样？我们在世上是为了感受阳光。”&lt;/p&gt;
&lt;p&gt;工作与生活
悉达多有过这样的反思：“所有这些他做的事情无非是游戏，这游戏令他快活，偶尔让他愉悦。但是真实的生活却擦身而过，无法触及。”如果把人生模板或是职场晋升当做成游戏的话，那生活又置于何处呢？我的博客中经常有这样的疑问，我是“如何将生活工作都安排的井井有条的”？&lt;/p&gt;
&lt;p&gt;如何平衡工作和生活之间的关系一直以来都是个大难题，我的破局之法是”认真体验”。工作的时候就拿出百分百的干劲去工作，而剩余的时间则认认真真去生活。而可以拿出百分百的干劲去工作的前提是，我工作的目的是想得到成长，以便未来能有能力实现个人价值。&lt;/p&gt;
&lt;p&gt;因此，工作和生活保持平衡是一个狡猾说法，它的隐藏含义是将工作与生活置于平等的定位。而生活是一切，工作只是工作，后者是为前者服务的手段而已。若想保持所谓的平衡，其实更多的是想办法将两者进行恰当地融合罢了，意义本在生活之中。追求幸福的生活才是每个人的目标，职业只是实现这一目标的手段。&lt;/p&gt;
&lt;p&gt;或许未来社会会如同《工作、消费主义和新穷人》所推演的那样，未来的工作会被赋予了美学价值，工作被视为一种个人体验和享受的方式，工作与个人兴趣和娱乐之间的界限逐渐模糊，工作本身能够带来愉悦和满足，而不仅仅是为了生计。这种情况下工作不仅仅是经济活动，更是自我实现和个人表达的途径。那些能够将工作与个人兴趣结合的人，往往才会成为最大赢家。&lt;/p&gt;
&lt;p&gt;如何破解「鹅笼」之局，我将答案交给「幸福」和「勇气」。&lt;/p&gt;
&lt;h3&gt;2.2 幸福&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/banner-happiness.png&quot; alt=&quot;&quot; /&gt;&amp;gt; 由爱故生忧，由爱故生怖。——《妙色王求法偈》&lt;/p&gt;
&lt;p&gt;应对失去的焦虑
进入幸福之前，先讨论第一个问题，我们应该如何应对焦虑？&lt;/p&gt;
&lt;p&gt;首先要厘清焦虑的本质是什么，在快速变化的社会环境中，未来的不确定性成为我们焦虑的重要来源。有句话说“焦虑的反义词是具体”，具体则意味着决策，而决策的本质在于我们舍弃了什么，而不是选择了什么。&lt;/p&gt;
&lt;p&gt;因此，放弃始终伴随着决定，人必须放弃其余的选项，通常放弃之后，它就再也不会回来了。但决定是痛苦的，因为它们意味着可能性的限制，而人的可能性越是有限制，就越不自由。人生的可能性，在做出决定的瞬间就消失了，这便是人生可能性的坍缩。&lt;/p&gt;
&lt;p&gt;我们设想一种情况，如果你不向任何一种人生迈出一步，那么就相当于拥有了无限的可能性。就像《瞬息全宇宙》中杨紫琼饰演的妈妈那样，之所以她可以被选为对抗 BOSS，是因为她是所有平行宇宙中最无能的那个，因此她才拥有成为任何更好的她自己的潜力。亦如《德米安》中说的那样：“每个人其实都有变成人的无数可能，但只有他了解到这些可能性的存在，甚至有意识地去认识这些可能性时，他才真正拥有它们。”&lt;/p&gt;
&lt;p&gt;但是时间一直在滴答滴答地流逝，不停流逝的时间将我们推向一个个待抉择的事件，我们不得不做出选择，而选择则意味着放弃另一种可能性，如此便产生了焦虑。《生命不可承受之轻》里米兰·昆德拉说，&quot;人类的时间不是循环转动的，而是直线前进，这就是人类为什么不可能幸福，因为幸福是对重复的渴望。&quot;&lt;/p&gt;
&lt;p&gt;那么，我们究竟该如何应对？最近风靡全球的《黑神话·悟空》里，游戏临近结局时，老猴子给出了答案：&lt;/p&gt;
&lt;p&gt;老猴子：古往今来的奇才异能之士，何其之多，但真正成就不朽功业的，寥寥无几。你们可知为何？&lt;/p&gt;
&lt;p&gt;八戒：世道不公？&lt;/p&gt;
&lt;p&gt;老猴子：世道从来不公。&lt;/p&gt;
&lt;p&gt;八戒：运气不好？&lt;/p&gt;
&lt;p&gt;老猴子：运气只是强者的谦辞。&lt;/p&gt;
&lt;p&gt;八戒：那只能是…没我老猪英俊了。&lt;/p&gt;
&lt;p&gt;老猴子：因为空有天赋，不思进取，小富即安，沉迷享乐。想安逸，又想名利；想快意江湖，又想成佛作祖，哪有这样的好事？身本多忧，怎可全求？&lt;/p&gt;
&lt;p&gt;身本多忧，怎可全求？我们生命当中，每一天都是新的，每一秒都是新的，可是再想想，如果用这么宝贵的生命，往那个鹅笼里钻，去担心自己的焦虑，真的值得吗？失去了又能怎么样呢？以我有限的人生经历来看，往往事后来看失去了也不会怎么样，我还是我。无论有没有外在的那些东西，都要相信自己是 100% 的珍贵，我永远拥有自己的价值，没有条件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/image_1689677717149_0.png&quot; alt=&quot;&quot; /&gt;由爱故生忧，由爱故生怖。一切的因缘际会，都是无常的，难以得到长久。人生在这个世界上会产生焦虑事件，而生命的短暂就像早晨的露水一般转瞬即逝。古人曾经形容过，人这一生就像江中的浮萍，在浪花当中摩肩接踵，你碰碰我，我碰碰你，一起归入大海。&lt;/p&gt;
&lt;p&gt;浮萍一世，我有责任把仅此一次的人生过好，《牧羊少年奇幻之旅》的作者保罗·柯艾略在《悉达多》作序时写了这样一句话：“然后我又想到悉达多，他执意将自己投入生命本质之真实去找寻自我的道路，那天早晨我深吸了一口气，我要体味这世界所包含的一切气息，我发誓，我要选择生命。”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/image_1689658461558_0.png&quot; alt=&quot;&quot; /&gt;寻找稳定的内核
“你的心灵就是整个世界，然而，真正的自我究竟在哪里？”——黑塞笔下的悉达多历经一生都在追寻他内在的阿特曼，那是一种称之为心灵或者内在自我圆融统一的境界。他说人必须找到自我之内在的源泉，人终其一生必须拥有它。人的使命不过是回到自我，寻找自我的途径，依托于稳定的内核，那是一种平静圆融的生命体验。&lt;/p&gt;
&lt;p&gt;在本科毕业前夕的某个深夜，我写了一篇&lt;a href=&quot;https://blog.ursb.me/posts/summary-2017/&quot;&gt;《再见了，我的大学》&lt;/a&gt;，在文章里曾提到过这种内核。&lt;/p&gt;
&lt;p&gt;那段时间处于人生低谷，身体上也不堪重负，考完研第二天发高烧，直接去医院躺了一个月。在医院的那个月，每日无所事事，思考了很多很多。当时的我在读《新原人》，冯友兰将人生境界划分为四个层次，在说到自然境界时，他提及生活在这一境界的人往往缺乏自觉意识，无论人生是漫长还是短暂，都是在“顺习而行”，如同前文提到的从众或服从权威，对自己的生活行为没有什么觉解。我在反思自我是否在一直在“顺习而行”？我是否有自己的热爱？如果有，那我能否做到心无旁骛去追求？至今为止，我失去的和我获得的，究竟存在什么样的关系？&lt;/p&gt;
&lt;p&gt;一切想至洞察清明，豁然走出低谷——“其实，人生本着内心的宽容和洞察的清明，在外在上随遇而安，不与世争，这样的话，我们才能把每个当下活得更好，才能把人生整个的流光以一种从容的姿态安详走过。”“在此刻，一切的一切，都处之泰然。我所获得的一切荣誉，不足挂齿。我所面临的失败，也不足为惧。我所得到的，也就是我所失去的。”&lt;/p&gt;
&lt;p&gt;柏拉图在《理想国》中写道：&quot;我们一直寻找的，却是自己原本早已拥有的；我们总是东张西望，唯独漏了自己想要的，这就是我们至今难以如愿以偿的原因。&quot;&lt;/p&gt;
&lt;p&gt;但在客观上，世间亦有许多无可奈何之事，我们没有能力和勇气去改变它们，那就坦然接受并从中寻找内心的平和。如同《庄子·人间世》云：“知其不可奈何而安之若命，德之至也。” 人是一根会思考的芦苇，帕斯卡在《思想录》中用芦苇比喻人类很脆弱，一折就断，但是人类的思考却能包含整个宇宙，故人类是即渺小又伟大的存在。人类不管多么悲惨，都要努力找寻属于自己的稳定内核。&lt;/p&gt;
&lt;p&gt;所谓“眼存星海，心怀宇宙”，便是像悉达多顿悟时的体验——“所有这自古有之的一切，悉达多一直熟视无睹。他从不在场。而现在，他归属其中。流光魅影在他眼中闪耀，星辰月亮在他心中运行。”稳定的内核始于圆融，在生命中的每个瞬间，通过圆融统一地思考，方能获得稳定的精神内核。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/image_1689658437726_0.png&quot; alt=&quot;&quot; /&gt;细流涓涓不绝，其水滴滴各异，泡沫浮于淤泥，且消乎且结乎，概无久存之例，世间人事，鸟兽栖息，亦不如此。&lt;/p&gt;
&lt;h3&gt;2.3 勇气&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/banner-brave.png&quot; alt=&quot;&quot; /&gt;&amp;gt; 鸟要挣脱出壳。蛋就是世界。人要诞于世上，就得摧毁这个世界。——《德米安》&lt;/p&gt;
&lt;p&gt;面对不确定的勇气
&lt;strong&gt;在追寻幸福的道路上，愿你有面对不确定的勇气。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;面对一个很不稳定的世界，要坚定、勇敢地建立自己的附近，不要牺牲日常。如果我们太过强调环境的不确定性，实际上等同于放弃了我们的自主权，从而毫不犹豫地屈服于环境支配论——都是目前大环境不好、经济形式不行，导致我无所适从。&lt;/p&gt;
&lt;p&gt;然而，真实的情况却是我们所处的环境，往往是由参与其中的个体共同塑造的，尤其是我们自己。&lt;/p&gt;
&lt;p&gt;我们可以确定，成就不在于外在定义，全看是否按自己的意愿在活。&lt;/p&gt;
&lt;p&gt;我们可以确定，现实的、小群体的社会交往可以把握，周围人的情感支持可以拯救我们对世界的不知所措，做一个善良的人，做一些对自己、对别人、对这个世界有意义的事情，在这个过程中与自己、与他人、与世界建立联结，从而感到幸福、满足、愉悦，这总是一个不会错的策略。&lt;/p&gt;
&lt;p&gt;我们可以确定，如果大环境无法改变，如果命运无法抗争，那么人类最后自由就只剩下自己对生活的态度了。所有东西都能被抢走，除了一件事，人类最后的自由——去选择在当前环境下自己的态度，选择自己的方式。&lt;/p&gt;
&lt;p&gt;今天来看，一切坚固的东西似乎最终都会云烟成雨。然而，正是这个价值观缺乏依托的时代，没有身份的束缚，反而赋予了我们选择和行动的自由。你不等于你的过去，也不等于你的现在，你永远拥有策划和改变现状的能力，也永远拥有展望未来的能力。事实上，在一个一切都在快速变化的时代、在一个除了自由别无选择的时代，我们需要勇敢起来。&lt;/p&gt;
&lt;p&gt;在毕业前夕我拿到了 WWDC 奖学金，参加了梦寐以求的 WWDC，归途时我写了一篇&lt;a href=&quot;https://blog.ursb.me/posts/wwdc-19/&quot;&gt;《WWDC19 游记》&lt;/a&gt;，在这篇文章的结尾里，我写了这样一段话：&lt;/p&gt;
&lt;p&gt;“我也曾有过这样的时光，毫无理由地深信自己的未来充满可能，相信自己将有一个玫瑰色的未来。&lt;/p&gt;
&lt;p&gt;但更多的时候面对陌生的事物时，面对仰望以及羡慕之情时，会迷茫，会不知所措。&lt;/p&gt;
&lt;p&gt;无论上到哪一层台阶，阶下有人在仰望， 阶上亦有人在俯视。抬头者自卑，低头者自得，唯有内省，才能看见真正的自己。&lt;/p&gt;
&lt;p&gt;每个人都需要知道什么是自己想要的，知道什么是不可逆转的，知道用什么方式实现梦想， 知道用什么心情面对苦难，进退得失不离不弃也就都有了答案。&lt;/p&gt;
&lt;p&gt;然而这一切其实都很难很难。我不知道面对苦难时应该何以面对，我不知道用什么方式去实现梦想，也不知道自己会错过什么，会留下什么遗憾，我不知道命运会把我带向何方，但我相信，只要面向阳光奔跑就会把阴影甩在身后。&lt;/p&gt;
&lt;p&gt;之前 IT 之家专访让我留个寄语，我说道： ‘去学有意义的知识，去做自己喜欢的事情，做对社会有贡献的产品。’&lt;/p&gt;
&lt;p&gt;其实这也是一年前我给导师的一封信中说过的话，那封信中我决定接下来不再继续读博了，想要选择去探索更多新鲜的事物。但今天突然觉得，大概人生最大的意义就是用余生去找到那些最爱吧。&lt;/p&gt;
&lt;p&gt;我觉得这个世界美好无比，满树花开，柳枝摇曳。阳光席卷城市，微风穿越指间。这个世界是美好的，值得为她奋斗，也值得为自己所热爱的事物奋斗。”&lt;/p&gt;
&lt;p&gt;在不确定的世界，坚持做确定的自己。愿你旅途漫长，充满奇遇。&lt;/p&gt;
&lt;p&gt;甘于平凡的勇气
&lt;strong&gt;在不确定的世界中，愿你有甘于平凡的勇气。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;很多人常常被人诟病“不务正业”，许多擅长的技能、喜欢的爱好，仿佛只有转化成物质，才是有价值的。但人生本不应该如此，“如果天性是蝙蝠，你肯定成不了鸵鸟”（《德米安》）。&lt;/p&gt;
&lt;p&gt;我们的生命是属于自己的，所度过的每一分、每一秒，都是自己切切实实的人生。如果人生不能以喜欢的方式度过，那又有什么意义呢？拥有一个爱好，有自己想做的事情，哪怕它再小众、再“不务正业”，都是我们生命的光辉。&lt;/p&gt;
&lt;p&gt;“铅刀有干将之志，萤烛希日月之光”。我们要做的，是去延伸它，发展它，从中获得意义感、目标感、成就感、价值感和支撑感。&lt;/p&gt;
&lt;p&gt;具体来说，当我们准备做一件事时，无论这件事情大小，无论这件事在社会评价体系中的重要性如何，郑重地将自己全部投入进去，不计得失地投入自己的才华、注意力和时间，就会从心底感受到一种愉悦和对自己的肯定，我想这就是幸福。往往此时事情多半会做得很不错，但这也只是“幸福”的副产品，并非我们做事过程中时时关注的目标。弗兰克尔说，人所需要的“并不是一种没有压力的状态，而是值得为之努力奋斗的目标”，“这是人之为人的特征，人总是朝向自身以外的某种东西。”&lt;/p&gt;
&lt;p&gt;那么，真正的勇气是什么？是基于健康、稳定的自尊基础上，对自己能力边界的清晰认知，并且有意愿去做一些困难的事情、做一些自己擅长的事情、做一些只有自己可以做到的事情，并对此抱有使命感，实现自己的持续成长。它不是无所畏惧，而是愿意相信：未来是好的，我是有价值的，一切都会好转。勇气不是不惧怕黑暗，而是愿意向着朝阳前进。&lt;/p&gt;
&lt;p&gt;“勇敢的时刻已敲响我们的钟”，旅途漫长，愿你赤诚且勇敢，自由且尽兴。&lt;/p&gt;
&lt;p&gt;告别盛夏的勇气
&lt;strong&gt;在漫长的旅途中，愿你有告别盛夏的勇气。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;找到自我，固守自我，沿着自己的路向前走，不管它通向哪里。当感到胆怯的时候，想想纳瓦尔说的“99% 的努力终将白费。”认清这个现实，如果害怕失败，安于现状，什么都不做，不去寻求任何改变，那就不可能找不到那 1 % 的可能性。&lt;/p&gt;
&lt;p&gt;在 Bilibili 2024 跨年晚会的结尾有一段祝酒辞，最后的那杯酒是敬自己：&lt;/p&gt;
&lt;p&gt;我想跟自己干杯，也是跟每一个热爱自己的你们干杯。&lt;/p&gt;
&lt;p&gt;希望以后不管遇到什么事情，在新的一年，我们都一定要在心里默念：&lt;/p&gt;
&lt;p&gt;我一定能够遵循本心，&lt;/p&gt;
&lt;p&gt;我一定能够热爱万物，&lt;/p&gt;
&lt;p&gt;我一定能够追寻梦想，&lt;/p&gt;
&lt;p&gt;我一定能够成为我想成为的那个人。&lt;/p&gt;
&lt;p&gt;敬自己！&lt;/p&gt;
&lt;p&gt;敬自己，希望告别这段盛夏之后，依然拥有无限春天。&lt;/p&gt;
&lt;p&gt;——“你骄傲地飞远，我栖息的夏天。”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/rainbow.jpg&quot; alt=&quot;&quot; /&gt;于 2024 年 8 月 31 日深夜。&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=2024-summer&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>Airing 开通了一个咨询服务</title><link>https://ursb.me/posts/service/</link><guid isPermaLink="true">https://ursb.me/posts/service/</guid><description>开通两种咨询服务：免费信件咨询用于倾听与交流，以及限时优惠至200美元的50分钟付费语音咨询，涵盖职业规划、技术与写作等话题解答。</description><pubDate>Mon, 13 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我将提供以下两种方式的咨询服务，若希望与我取得联系，可以仍选其一。&lt;/p&gt;
&lt;h2&gt;方式 1：信件咨询&lt;/h2&gt;
&lt;p&gt;非常欢迎你以此方法与我联系，我期待与读者建立良好的互动关系，也非常愿意倾听他人的内心世界和独立想法。若你有任何困难，可以直接邮件联系我，我愿意输出自己的想法，希望能给予你一些启发或帮助。当然，仅仅只是交朋友的来信也是非常欢迎的~&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;报酬：无偿。&lt;/strong&gt; 但在充分保护来信人隐私的情况下，信件内容可能会在我的博客中作为案例分享出去。&lt;/p&gt;
&lt;p&gt;回信时长：回复时长以收件时的自动回复为准，目前月均约会收到 2~4 封咨询来信，回复间隔约为 14 天。若后续信件增多，或增加回信时长，具体以邮箱自动回复为准。&lt;/p&gt;
&lt;p&gt;咨询方式：邮件至 airing@ursb.me 即可。&lt;/p&gt;
&lt;h2&gt;方式 2：有偿咨询&lt;/h2&gt;
&lt;p&gt;我会提供时长 50 分钟的一对一咨询服务（仅限中文），&lt;/p&gt;
&lt;p&gt;根据目前我掌握的知识领域，我可以提供以下内容的答疑解惑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;职业发展规划与建议&lt;/li&gt;
&lt;li&gt;软件技术相关咨询&lt;/li&gt;
&lt;li&gt;求职/求学途中遇到的任何困难&lt;/li&gt;
&lt;li&gt;写作的有关建议与心得分享&lt;/li&gt;
&lt;li&gt;效率类工具使用建议与指导&lt;/li&gt;
&lt;li&gt;其他任何闲聊&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意，本服务不提供任何商业咨询、数据咨询，且需全程录音录像。&lt;/p&gt;
&lt;p&gt;您可点击 &lt;a href=&quot;https://cal.com/airing/50-min-meeting-paid&quot;&gt;https://cal.com/airing/50-min-meeting-paid&lt;/a&gt; ，在页面内直接进行付费预约。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;价格：200 USD&lt;/strong&gt;（原价 600 USD，限时 3 折），提供全程退款服务。&lt;/p&gt;
&lt;p&gt;如有任何问题可随时邮箱联系 airing@ursb.me，期待与您建立联系。&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=service&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>月刊（第26期）：旅途</title><link>https://ursb.me/posts/weekly-26/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-26/</guid><description>记录二〇二四年四月新西兰九天自驾游历程,途经基督城、瓦纳卡、皇后镇等地,体验羊驼牧场、银河夜空与滑翔伞,并记述当月晋升T11的工作进展。</description><pubDate>Tue, 07 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本篇是对二〇二四年四月的生活记录与思考。&lt;/p&gt;
&lt;p&gt;因为机票相对便宜的缘故，在元旦就早早定下了五一期间新西兰的旅程。而我对国外旅游几乎没有经验，甚至攻略也是临时在飞机上对着离线地图做的，未曾想到，这趟旅途可以如此丰富多彩。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/map.jpg&quot; alt=&quot;&quot; /&gt;现在是旅途的最后一夜，在机场等待着归途的飞机。闲来无事，凭借着回忆，流水账般记录下这次新西兰的旅途。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 1：飞机 - 基督城 - 中餐馆&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;坐了 10h 的飞机到达奥克兰，因为口语不好办理值机之后仍然不知道该如何转机，一旁的工作人员发现了我们的难处，直接引领着我们走向正确的方向。机场大多数指示牌都标有着中文，全程并没有遇到其他的障碍。&lt;/p&gt;
&lt;p&gt;在候机时发现脚边有两只小鸟在啄食，抬头看去也偶见在室内飞翔的小鸟，突然明白了飞机上海关宣传片中「这片脆弱的土地是我们最珍贵的财富」的含义了。&lt;/p&gt;
&lt;p&gt;晚上达到基督城之后成功租到了车，虽然和国内的车道相反，但是开起来异常简单。一方面是这里的车道较少，极少存在需要变道的情况；另一方面则是这里的车辆极其友善——从未遇到别车插队、催促闪远光、恶意超车的情况。相反这些车辆礼让做的很到位，譬如环岛前宁愿多等几十秒，也不愿在有车的情况下汇入；窄路会车时，基本都会主动靠边让行，因此经常能看到双方车辆都在靠边让行没有人愿意先通过的情况（笑）。会车时对向车辆的驾驶员基本都会主动向我招手打招呼，还有人向我比了个手枪的手势，着实有些可爱。&lt;/p&gt;
&lt;p&gt;说到可爱，偶见路边人家的家门口摆的一些小物件——小猪佩奇的娃娃、邮箱旁的糖果盒，还有对向路牌背面的一些贴纸。&lt;/p&gt;
&lt;p&gt;可爱、友善，这是我对这里的初见印象。&lt;/p&gt;
&lt;p&gt;晚上在汽车旅馆办理入住之后在附近转了一圈，虽然才下午 6 点多，但天已然黑了，街道上没有行人，商铺也基本全部关门了，附近只有一家中餐私房菜在营业，而餐厅里也并没有顾客。&lt;/p&gt;
&lt;p&gt;就餐后，老板夫妇和我们闲聊，他们是从深圳移民至此，谈到了这里的房价、教育、工作、收入、居民的生活态度、还有我们自驾时的注意事项，涨了许多见识。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 2：羊驼 - 海湾小镇&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;第二天的行程安排在基督城周边，睡前在网上预约了羊驼牧场的参观，驱车前往，一路上的平原、牧场、 山景应接不暇，秋意甚浓。翻过最后一个山头时，看到了海湾，那一瞬间觉得这里不愧为「被世界遗忘之地」。&lt;/p&gt;
&lt;p&gt;羊驼牧场有一位中国的员工，她分享了她在牧场喂羊的经历、介绍了每一只羊奇奇怪怪的性格特点，如数家珍。如今回忆起来，羊驼牧场在这趟旅途可以排得上 Top2，和一群大羊驼、小羊驼互动，欢乐的氛围洋溢满了整片山谷。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/sheep.jpg&quot; alt=&quot;&quot; /&gt;下午在海边的阿卡罗拉小镇消磨时光——泛舟、海滩上看景发呆、吃冰激凌、散步，直至日落才回旅馆。这个小镇人很少、海湾没有风浪、节奏很慢，我很喜欢这种静下心来感受时光在指尖慢慢流淌的感觉。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/akarola.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;Day 3：西海岸 - 夜行冰川 - 银河&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;早上归还钥匙之后驱车前往西海岸，从城镇开到平原，再开上山路、经过河谷，到了峡谷，之后过了丘陵，一望无际黑色的大海映入眼帘，着实壮观。&lt;/p&gt;
&lt;p&gt;经过 Hokitika 的小镇，天阴，大海是黑色的。再往前开去，天空放晴，海水变蓝，无比壮阔，瞬感渺小。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/sea.jpg&quot; alt=&quot;&quot; /&gt;因为预约了 wanaka 的开飞机，所以晚上在西海岸的山路上预计多开一段，以便明天能按时赶到 wanaka。夜里开错了路，而汽车旅馆的小哥一直在等着我们办理入住（否则早就下班了）。将近九点到了旅馆，发现那栈还在为我们亮着的灯，心安定了下来，感到了一丝家的温暖——&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/chat-2.jpg&quot; alt=&quot;&quot; /&gt;有信号之后也收到了昨晚旅馆老板的消息，甚感温暖——&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/chat-1.jpg&quot; alt=&quot;&quot; /&gt;旅馆小哥和我们说这里经常能看到漫天的银河，抬头一看果真如此，一直在驱车前行，却没有抬头看看天空。&lt;/p&gt;
&lt;p&gt;可惜没带三脚架，只能用 iPhone 的夜景模式随手拍了一张。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/star.jpg&quot; alt=&quot;&quot; /&gt;当浩瀚的宇宙摆在眼前之际，才惊觉自己其实也只是宇宙中的浮游。人类的存在其实与星星是一样的，都是由同一种东西构成，但我们却有着意识。在人类看向银河之时，人类的存在便成了宇宙用来了解自身的一种方式——“风景在我之内思考它自身，我就是它的意识。”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 4：Wanaka - 开飞机&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;晨起，日升，才发现昨晚的住宿环境如仙如梦。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/fox.jpg&quot; alt=&quot;&quot; /&gt;驱车前往 wanaka，wanaka 的湖景不必多言。房东奶奶为我们办理入住的时候，即为友善，哪怕我们口语不好也耐心着听着，回复说 don&apos;t worry，一直给予我们鼓励的眼神，还给我们介绍她家的大 house，给人的感觉并不是房东，而友善的邻居奶奶。我们发现电源转接头遗失了，在 booking 上留言是否有转接头，结果房东爷爷捧着一堆五花八门的转接头送过来给我们，着实可爱。&lt;/p&gt;
&lt;p&gt;这天还体验的开飞机——&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/aircraft.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;Day 5-6：皇后镇&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;早餐在 wanaka 湖边散步，拍了那棵有名的树——&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/wanaka-tree.jpg&quot; alt=&quot;&quot; /&gt;拿着冰淇淋在湖边走着，随手偷拍了张湖景——&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/wanaka.jpg&quot; alt=&quot;&quot; /&gt;午后驱车前往皇后镇，因为没定上其他项目，空出了一天，就在镇的湖边发呆——看行人、看鸭子，度过了两天。&lt;/p&gt;
&lt;p&gt;如此闲暇，如此缓慢。看着一切素未谋面的风景，好奇的思绪在心里积攒着，总想把过客当作城市的主人，渴望在更深处的地方探索这片土地独有的个性。&lt;/p&gt;
&lt;p&gt;即便明天我离开此地，我也仿佛根本不觉得自己离开过，空间和时间都不能影响我们，好像时空是属于我们的，而非我们属于时空。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/queenstown.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/town.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;Day 7：Deer Park - 滑板车 - 滑翔伞&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这天是在皇后镇的最后一天，早上去了 Deer Park，小动物们都很给面子，拍到了不少靓照——&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/deerpark.jpg&quot; alt=&quot;&quot; /&gt;下午在山上玩了滑板车，这个项目意料之外的好玩。路上遇到了一个国人小哥，主动上来打招呼非常激动地和我们说这个项目多好玩，他几年前玩过至今念念不忘，所以现在又飞过来体验……&lt;/p&gt;
&lt;p&gt;之后玩了滑翔伞，在山顶上奔跑——跳跃——起飞，以及在天空中自由翱翔的体验，是这次旅途的 Top1！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/sky.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;Day 8：奥马鲁 - 企鹅 - 民宿&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这天离开皇后镇，驱车前往东海岸的奥马鲁，看了海豹和蓝企鹅。（蓝企鹅不给拍照，所以这里并没有照片啦）&lt;/p&gt;
&lt;p&gt;晚上入住背包客民宿，装修氛围很温馨，厨房的墙壁上贴着旅客们的留言。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 9：归途&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;今天回到基督城，旅途开始的地方。八天前，这趟风景之旅的第一天夜晚，在此地，我感到无比的孤独。黑夜降临后，街上没有行人，商店关着门，仅有微弱的路灯宣告着这是一座城。异国、黑夜、对明天的未知、日常指导原则被剥夺的体验感、在此世的陌生感，让我感到孤独。&lt;/p&gt;
&lt;p&gt;但经历了这八天的旅途，现在的黑夜不会再给我带来孤独感。因为我知道明天太阳还会照耀着这片大地，当阳光洒下时，这里风景依旧；因为我知道，这里生活着可爱友善的人们，遇到困难时，你不会是一个人面对。&lt;/p&gt;
&lt;p&gt;存在的基本模式是关系，而最好的关系是个体以彼此无所求的方式建立关联。我们不是并不是作为独立的实体存在，人类是彼此关系中的生物，这里的人们用可爱与友善证明了这一点。&lt;/p&gt;
&lt;p&gt;旅行能够让我们的生活变得更好吗？我们的生命，真的能够像日出那样，向上而且温暖吗？我不能给出肯定的答案，当我愿意想着肯定的答案奔跑。&lt;/p&gt;
&lt;p&gt;最后，2024 年跨年夜 B 站祝酒辞中有一段话我特别喜欢，在此作为游记的结束语吧——&lt;/p&gt;
&lt;p&gt;「我想跟平凡里的坚持干杯，我想跟那些有何不可的失败干杯，我想跟所有值得被尊重的一切干杯。敬存在。」&lt;/p&gt;
&lt;p&gt;「我想和地球干杯，敬那些未曾谋面的山海，敬那些令人心驰神往的文化，敬那些芸芸众生们努力用爱打造的这颗璀璨星球。敬世界。」&lt;/p&gt;
&lt;p&gt;「我要和明天干杯，我不会问你是喜是悲，不会问你有何贵干，我只会毫无畏惧地接过你手中的礼物，珍惜每一段经历。不问别离，不问结局。敬明天。」&lt;/p&gt;
&lt;p&gt;「我想跟自己干杯，也是跟每一个热爱自己的你们干杯。希望以后不管遇到什么事情，在新的一年，我们都一定要在心里默念：我一定能够遵循本心，我一定能够热爱万物，我一定能够追寻梦想，我一定能够成为我想成为的那个人。敬自己。」&lt;/p&gt;
&lt;h2&gt;🌺 生活点滴&lt;/h2&gt;
&lt;p&gt;以下是本周期内一些瞬间的记录。&lt;/p&gt;
&lt;p&gt;🚀 工作：晋升 T11&lt;/p&gt;
&lt;p&gt;3 月的答辩顺利通过了，过年期间一直在准备材料，而且这大半年的项目成果也确实不错，即便这次通过率很低，但总体上还是十拿九稳，对自己还是有信心的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/t11.jpg&quot; alt=&quot;&quot; /&gt;T5 校招卡了一年，T10 也因为新规卡了两年，除此之外都走了绿通，三答三过，于是毕业两年 T9、两年半 T10、四年半 T11，总体来说晋升进度相对来说是比较快的了。目前 TME 前端只有一位 T12 天花板，那么下个小目标暂且先定成三年内 T12 吧。&lt;/p&gt;
&lt;p&gt;为了梦想，继续加油！&lt;/p&gt;
&lt;h2&gt;🎬 书影音&lt;/h2&gt;
&lt;p&gt;以下是本周期的书影音记录。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;看完：剧集 |《追风者》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：动漫 |《物理魔法使马修》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看完：动漫 |《物理魔法使马修》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《哥斯拉大战金刚 2》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《海王 2》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《被我弄丢的你》| ★★☆☆☆&lt;/li&gt;
&lt;li&gt;重温：剧集 |《庆余年》| ★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-26&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>个人工具箱与好物分享</title><link>https://ursb.me/posts/tools/</link><guid isPermaLink="true">https://ursb.me/posts/tools/</guid><description>分享作者的个人数码工具箱：从MacBook、iPhone、HHKB键盘等硬件选择，到Raycast、HeptaBase、Readwise、Todoist、Fantastical等软件与效率工具的实际使用体验和取舍理由，兼顾编程与日常阅读场景。</description><pubDate>Fri, 29 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;一直都很想写这个话题，因为本人是强烈的数码爱好者同时又是一个执着的工具控，自己尝试过很多新产品，淘汰了一批又一批产品，最终沉淀下来这套较为稳定的工具箱。&lt;/p&gt;
&lt;p&gt;而这实际上是一个高度个人化的话题，我们每个人的观点都会受到自己生活经验和视野的影响，我认为优秀的工具或许在别人眼里却并不出色。尽管如此，我仍决定分享出来我目前正在使用的工具箱，希望能够为你带来一些灵感。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Updated: 2024-03-29&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;硬件&lt;/h2&gt;
&lt;h3&gt;💻 电脑与配件&lt;/h3&gt;
&lt;p&gt;Apple MacBook Pro (2021, 16-inch, M1 Max, 深空灰色, 32G RAM, 1T SSD) ，办公主力设备，虽然是 21 年的设备，内存也不大，但是 M 系列的芯片内存 swap 率挺高的，用起来目前没有什么问题。Apple MacBook Air (2022, M2, 午夜色, 24G RAM, 1T SSD) ，移动设备，外出会带。Apple iMac (2020, 27-inch Retina, Intel Core i7-10700K, 96G RAM, 1T SSD) ，公司配的设备，之后自己加装了内存，奈何 CPU 跟不上，现在办公桌上接 Luna Display 作为扩展显示器了，偶尔会跑下耗时任务。Studio Display (蚀刻玻璃) ，摆在家里的显示器，后悔加钱上了蚀刻玻璃，确实会影响清晰度，且书房光线稳定镜面玻璃完全足够。LG UltraFine 4K Display，2021 年企业优惠价入手的，入手一个月后又买了第二台，本身支持菊连，配合 MBP 很方便。HHKB Studio，机械轴的 HHKB 很舒服，办公用。HHKB Professional HYBRID Type-S (White, 有刻) ，被 HHKB Studio 淘汰下来了，目前书房用。HHKB Professional HYBRID Type-S 雪，同时入了无刻的键帽作为收藏，虽然型号一样，但手感上其实比上面那款要偏软一些。Magic Trackpad (银色) ，搭配白色键盘，书房用。Magic Trackpad (深空灰色) ，搭配黑色的 HHKB，办公用。Magic Keyboard(蓝色，Touch ID) ，从海鲜市场上收的 iMac(M1) 配件，后来没用了，还是更喜欢 HHKB 配列。&lt;/p&gt;
&lt;h3&gt;📱 移动设备&lt;/h3&gt;
&lt;p&gt;iPhone 15 Pro，主力机。iPhone 6s，公司配置的测试机，低端机用于测性能。Samsung Galaxy Z Flip4，自购的 Android 设备，用于体验 Android 软件和开放生态，偶尔作为阅读器使用。Xiaomi Mi 9，公司配置的测试机，经常用来跑项目。Apple Watch Ultra，个人更喜欢白钢的 Series 版本。iPad Pro 12.9 (M1) ，你的下一台电脑还得是电脑，糟糕的文件系统、窗口管理和软件生态让它成为了 Bilibili 播放器。iPad Pro 妙控键盘，配合 iPad Pro 使用，但不喜欢用，组合起来比 MacBook Air 还要重上许多。iPad mini (第六代) ，看电子书或玩游戏较多，外出会带着，使用频率很高。BOOX Leaf 2，开放系统体验不错，和 KO3 有一样的侧边翻页键很是实用，用来看微信读书。Kindle Oasis 3，清晰度会比 Leaf 2 好一些，但 Kindle 退出中国市场后体验上有折损，且不支持微信读书，后续就没用了。zendure 征拓充电宝(10000mAh, 踏青绿) ，体验过多款充电宝，这款价格实惠且非常小巧好看，是最满意的一个充电宝了。&lt;/p&gt;
&lt;h3&gt;🎧 音频设备&lt;/h3&gt;
&lt;p&gt;AirPods Pro (2nd generation, USB-C) ，之前的 1 代被洗衣机洗了两个小时，虽然还能用，但是降噪和通透模式不好使了，遂更换。AirPods Max，使用频率较少，戴时间久了很压耳朵。HomePod (1st generation) ，HomeKit 网络中枢，也时常播音乐。&lt;/p&gt;
&lt;h3&gt;📷 影像设备&lt;/h3&gt;
&lt;p&gt;富士 X100VI，直出效果很好。907X &amp;amp; CFV 100C + XCD 4/28P，大道至简。Insta360 GO 3，夜间画质一般，但胜在小巧，拍到比拍好更重要。&lt;/p&gt;
&lt;h3&gt;🎮 娱乐设备&lt;/h3&gt;
&lt;p&gt;Nintendo Switch (OLED Model) ，塞尔达启动器。Nintendo Switch Lite，偶尔当便携设备带出门玩玩小游戏。Steam Deck，偶尔玩玩 Steam 小游戏。PlayStation 4 Pro，吃灰很久了，刚毕业的时候为了玩《战神》入的。Xbox Elite 无线控制器，质感很好，配件和软件丰富，可玩性强，iPad、Steam Deck 均可使用。Nintendo Switch Pro 控制器，完善了 NS 的游戏体验。坚果 N1S Pro 4K，三色激光投影理论数值无敌，但是系统不行，半年就返修了一次，摆在卧室。极米 H3S，在司内的商城用积分换的，用了 3 年了没有问题，摆在客厅。&lt;/p&gt;
&lt;h2&gt;软件与服务&lt;/h2&gt;
&lt;h3&gt;📁 系统&lt;/h3&gt;
&lt;p&gt;Arc，浏览器，设计理念符合我的使用习惯。CleanShot X，截图工具与录屏工具，标注快捷键挺好用的。Bob，翻译软件，有不错的快捷键支持，用的较少，大多数情况下会用 Raycast + AI Command 翻译。Stats，状态栏展示设备 CPU、内存、网络、磁盘、电源灯信息。Keynote，制作平时分享或答辩的 PPT，之前体验过 iA Present，还是觉得原生 Keynote 最好用。Numbers，制作图表。Bartender 5，也属于 Mac 必装软件了，可以控制状态栏展示。RunCat，用小猫猫的状态来表示 CPU 的状态，挺可爱的。Vimac，使用 Vim 快捷键控制 Mac。NinjaMouse，配合 Vimac 使用，切软件的时候会自动把鼠标指针挪到激活窗口的正中间。Input Source Pro，切换软件时自动切换输入法，做研发时很常用，如切到 IDE 或终端时自动切英文输入法，而切到文档或者企业微信时则自动切中文输入法。AltTab，软件切换工具。Hookmark，配合 Drafts 使用，方便做任意书签的笔记。Geekbench 6，本机性能测试软件。AlDente，电源充放电管理软件，可以更精准的、个性化的控制电源策略。Tencent Lemon，硬盘清理软件，小巧实用，希望不要变成恶龙。&lt;/p&gt;
&lt;h3&gt;🌏 服务&lt;/h3&gt;
&lt;p&gt;Perplexity，Arc 默认搜索已经替换成了 Perplexity，每日搜索在 20~40 次，配合自己的 Prompt 和 Claude 3 Opus，答案的输出质量非常之高，大幅提升学习效率。腾讯文档，工作用，或者需要协作的场景用。GitHub Copilot，从 2022 年一直免费用到现在，大幅提升研发效率，尤其配合 Jupyter 使用，可以做到自然语言处理数据。Readwise，各端阅读源摘要汇总到 Readwise 服务，之后在 HeptaBase 做笔记和二次整理。IFTTT，自动化服务，支持 AI 和 Webhook，可以做各种记录的聚合、整理和转发，最终网页收藏汇总到 Cubox，而消息通知则汇总到 Telegram 的个人频道。Last.fm，统计各端听歌记录，图表做的很好看，配合 musicfox 使用。&lt;/p&gt;
&lt;h3&gt;🧰 效率&lt;/h3&gt;
&lt;p&gt;Raycast，入了 Raycast Pro + GPT 4 扩展包，最常用的功能是 HotKey 快捷打开软件 、AI Chat 与 Clipboard History。下面是一些常用的插件：&lt;/p&gt;
&lt;p&gt;AI Chat &amp;amp; Quick AI，电脑上一键呼出 AI，这就显得微软的 Copilot 独立按键很蠢了。AI Command，根据自定义的预制 Prompt 执行复制的文本，一般我会让它提取 CI 结果中关键的信息，然后生成我需要的配置；或者让它格式化压缩 JSON；分析堆栈信息；英汉互译等等。Clipboard History，之前入过 Rewind，发现完全没有必要，直接 Clipboard History 效率更高My IP，研发原因经常要看内网 IP，快捷键直接查看+复制。Google Search，因为 Arc 默认搜索设置成了 Perplexity，当明确想用 Google 搜索的时候会按下这个快捷键。QR Code Generator，工作原因有时需要 URL 转二维码，这个就很实用，不需要打开浏览器利用插件或三方工具转。Todoist，配合 Todoist 使用，可以在状态栏或弹窗显示今日任务。Format JSON，有了 AI Command 之后这个插件很少用了。Linear，配合 Linear 使用。Scrcpy，配合 Scrcpy 使用。
Rize，时间统计与专注管理软件。Fantastical，统一的日历和 TODO 管理工具，使用七年有余。Apple Calendar，配合 Fantastical 使用。Todoist，这些年体验过 OmniFocus、Things 3、Sorted3、Apple Reminder、滴答清单、Taskade，最后选择 Todoist 是看中了它开放的 API、优秀的 Vim 快捷键支持、以及对 Fantastical 等三方软件的良好集成。如果不考虑以上三个方面，综合来看滴答清单的体验和性价比是最佳的。Drafts，搭配快捷键和桌面置顶功能，用作临时草稿或者桌面便签。&lt;/p&gt;
&lt;h3&gt;📚 阅读&lt;/h3&gt;
&lt;p&gt;Readwise Reader，和 Readwise 的集成做的非常好，体验流畅，支持快捷键、RSS 订阅、NewsLetter 订阅、也可以高亮图片。一般直接用网页端。Inoreader，RSS 订阅源管理，配合邮箱、IFTTT &amp;amp; AI、Telegram 订阅、关键词监控做一些自动化提醒和总结。微信读书，新出的 AI 大纲十分好用，阅读完之后配合 Readwise 保存书摘。Cubox，网页收藏箱，配合 IFTTT 使用，各订阅渠道最终都会收录到 Cubox 里。Instapaper，因为免费+集成化做的很好，配合 IFTTT、浏览器插件、Inoreader 做网页收藏的中转服务。&lt;/p&gt;
&lt;h3&gt;📝 笔记&lt;/h3&gt;
&lt;p&gt;HeptaBase，笔记软件这七八年体验过 Notion、Bear、NotePlan、Tana、Roam Research、Capacities、LogSeq、Obsidian、Craft、Mem、MWeb，最后用下来最趁手并且产出效率最高的，只有 HeptaBase，除了卡片笔记之外，还有画板功能、PDF 标注、以及配合 Readwise 使用。Obsidian，折腾了不少插件，但是我用 Obsidian 最后只用其中的 Excalidraw 插件，现在 Obsidian 已经变成 Excalidraw 的客户端了，是每日必用的白板工具，用作记录草稿和工作思路。&lt;/p&gt;
&lt;h3&gt;👨🏻💻 编程&lt;/h3&gt;
&lt;p&gt;编辑器&lt;/p&gt;
&lt;p&gt;Visual Studio Code，临时查看项目、分析日志、或者使用 Jupyter 的时候才会用到。WebStorm，以前也曾是 VSCode 党，后来才发现付费软件真香（公司许可证免费），内置的 Git 、冲突处理、文件管理很好用，不需要自己折腾插件，还可以调内存占用，流畅性表现也比自己装一堆插件的 VSCode 好很多。CLion，和上面一样是 JetBrains 家族的软件，敲 C++ 项目的时候会用。Xcode，敲 iOS 项目的时候会用。Android Studio，敲 Android 项目的时候会用。Cocos Creator，编译游戏项目的时候用。
编辑器插件&lt;/p&gt;
&lt;p&gt;Vim，JetBrains、VSCode、Xcode 都会装。MetaJump，配合 Vim 使用，快速移动指针。Banish Pointer，配合 Vim 使用，焦点在编辑器的时候隐藏鼠标指针。Error Lens，增强错误提示。Filter Line，查日志时可以过滤关键词。GitHub Copilot，辅助编程。GitToolbox，JetBrains 的 Git 增强工具，可以显示行内提交信息。GitLens，VSCode 会装，类似于 GitToolbox。Git Graph，VSCode 会装，JetBrains 内置的足够好用。TODO++ ，VSCode 会装，统一管理注释标记，JetBrains 内置的足够好用。Bookmarks，VSCode 会装，书签管理器，JetBrains 内置的足够使用。Jupyter，做数据分析时用。WakaTime，记录编程时间。
浏览器插件&lt;/p&gt;
&lt;p&gt;Readwise，配合 Readwise 服务使用，可以直接在网页上划线，之后在 Reader 中阅读。Instapaper，配合 Instapaper、IFTTT、Cubox、Readwise 使用，收藏网页。沉浸式翻译，阅读部分外文网站时使用。1Password，配合 1Password 使用，自动注册或自动填充登录。Vimium C，Vim 快捷键进行网页浏览。Whistle 规则管理，配合 Whistle 开发时使用，Proxy SwitchyOmega 的替代品，预计 2024 年 6 月 Chrome 将停用 Manifest V2 扩展，那么 SwitchyOmega 将不再可用。
终端&lt;/p&gt;
&lt;p&gt;Warp，开箱即用，颜值也不错，最重要的是完全不需要自己去折腾各种配置和插件，代替了之前自己使用了很久的 iTerms。
命令行工具&lt;/p&gt;
&lt;p&gt;oh-my-zsh，用的比较多的是 git alias、git 插件、zsh-autosuggestions 插件。tig，命令行 Git 增强工具，用的很多。Homebrew，Mac 必备的软件管理工具。musicfox，命令行听歌工具，因此电脑上没有装音乐软件，通过 Vim 快捷键可以操作，还可以连接 Last.fm。nvm，管理 node 版本。Scrcpy，安卓开发时使用，一般使用真机配合 Scrcpy 投屏，方便电脑操作或录制。
版本管理&lt;/p&gt;
&lt;p&gt;GitKraken，一般较复杂的项目和场景下才会用，比如包括很多 submodule，或者需要溯源很长的 commit 的历史去查某个地方的变动，否则直接用 tig。
网络调试&lt;/p&gt;
&lt;p&gt;Whistle，工作中最常用的软件，可以查看 raw、配置代理、保存/还原现场、模拟/重放请求、拦截修改回包，灵活方便、简直万能。Chrome，常规场景就是用代理软件开发本地项目，除了 Devtools 偶尔还会用 inspect 调试真机，或者用 net-log 定位更深层次的网络问题。Safari，调试 iOS 真机的 JSCore 或 WKWebView 会使用。
其他&lt;/p&gt;
&lt;p&gt;Linear，一个 Issue 管理软件，可以给 Project 设置里程碑并展示 Roadmap，也有工作量评估和时间预测功能，可配合 IFTTT 同步到 Todoist，自行安排项目管理时会使用。控制台，抓 iOS 客户端日志用，类似于 LogCat。Perfdog，性能测试软件，分析卡顿时常用。Xcode Instruments，性能测试，分析耗时堆栈时常用。&lt;/p&gt;
&lt;h3&gt;🏚 其他&lt;/h3&gt;
&lt;p&gt;📷 图片处理：Pixelmator Pro，好像是限免入的，软件功能强大、体验流程、操作便捷。💰 财务管理：Money Things，配合移动端使用。🔐 安全工具：1Password，统一管理密码和各种证件、license，内置双重验证工具、Passkey、SSH 代理。&lt;/p&gt;
&lt;h3&gt;手机软件&lt;/h3&gt;
&lt;p&gt;📝 记录&lt;/p&gt;
&lt;p&gt;世界迷雾，把生活过成探险家模式，因为这个软件不知道绕了多少路，但成就感满满。Rond，被动的停留地点记录。一生足迹，被动的移动轨迹记录。Day One，日记记录，详见&lt;a href=&quot;https://blog.ursb.me/posts/weekly-19/&quot;&gt;周刊（第19期）：日记的意义&lt;/a&gt;Daylio，每日心情记录。豆瓣，书影音记录，部分豆瓣小组也不错，每日豆瓣也会推荐，可以 RSS 订阅。Money Things，之前体验过许多记账软件，最终选择 Money Things，支付计划、自动化记账、场景管理、快捷记录、开销统计做的很不错，也有桌面端。
📖 阅读&lt;/p&gt;
&lt;p&gt;微信读书，一般用 iPad 或者 Leaf2 看。Readwise Reader，配合桌面版使用。Unread，RSS 阅读器，免费，且移动端体验比 Reeder 做的要好。缺点是没有桌面端，桌面端 RSS 阅读可以选用 Web 版或者 Reeder。Cubox，配合桌面版使用。滴墨书摘，看实体书时使用，OCR 录入文字很方便，之后再导入到 Readwise 里。
🧰 效率&lt;/p&gt;
&lt;p&gt;Fantastical，配合桌面版使用。Apple Calendar，配合 Fantastical 使用。Todoist，配合桌面版使用。Drafts，配合桌面版使用，但移动端快速输入体验也非常优秀。Niagara Launcher，Android 机必装软件，提高首屏启动 App 的效率。
🌍 网络&lt;/p&gt;
&lt;p&gt;Arc Search，用手机快速查东西的时候会用它，将默认搜索引擎替换成了 Perplexity。Readwise，配合桌面阅读使用，移动端则是方便定期回顾。
🏸 运动&lt;/p&gt;
&lt;p&gt;健康，偶尔记录心情和体重，查看身体指标变化趋势。健身，运动时用，合并圆环的设定很好。WorkOutDoors，可以导入路书，相较于健身更适合有路线的户外运动，如徒步、骑行等。Grow，图表统计很好看。
🛍 出行&lt;/p&gt;
&lt;p&gt;彩云天气，对雨水的实时预报较为精准，无奈免费版广告实在是太多了。Apple Map，开车时偶尔会用，较高德地图而言，实时位置更精准，且可以和 Watch 联动。高德地图，之前对比过百度地图和腾讯地图，高德堵车预测更加精准、路线推荐更加合理，城区红绿灯展示也很实用。航旅纵横 Pro，航班信息齐全且更新及时，各种通知的及时性比现场播报还要快。&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=tools&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>月刊（第25期）：爱具体的人</title><link>https://ursb.me/posts/weekly-25/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-25/</guid><description>记录一次司内TED演讲内容《爱具体的人》,通过用户反馈案例探讨研发中的人文关怀,主张关注具体用户体验、以用户价值为依归而非只看大盘数据。</description><pubDate>Sun, 17 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本篇是对二〇二四年一月至三月的生活记录与思考。&lt;/p&gt;
&lt;p&gt;鸽了两期没有更新，从过年至今为止的假期和周末一直在准备着 T11 答辩，这周答完了算是暂时解脱了，空闲的周末又回来了。&lt;/p&gt;
&lt;p&gt;前两天参加了一个司内的 TED 演讲，演讲前一晚准备了下 PPT，当天对着 PPT 练了两遍流畅性和节奏就直接上去讲了。我一直认为演讲不需要稿子，重要的是台风稳，需要根据听众的反应去动态调整要讲述的内容和节奏。但距离我上次在台上讲话已过去整整六年，刚开始上台还有些紧张，但随着状态渐入佳境，未曾想到最终居然拿了个冠军。意外之余，更多的是欣喜。&lt;/p&gt;
&lt;p&gt;这期内容则是以文字的形式记录下我这次演讲的主题——《爱具体的人——研发质量保障的人文关怀》（已做脱敏处理）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.001.jpeg&quot; alt=&quot;&quot; /&gt;如果你现在面临一个选择，一边是个别的无法复现的用户反馈，另一边是亟待上线的 Feature。那么基于定语的限制与 ROI 的考虑，我想大多数人、也包括我，会毫不犹豫地选择优先做需求。那么希望听完这次演讲，大家可以对这个毫不犹豫的选择产生一点点的思考。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.002.jpeg&quot; alt=&quot;&quot; /&gt;在我们业务场景下，用户的反馈率是相当低的，当然这一定程度上是因为业务体量大、分母大，但这并不意味着用户的反馈就不值得优先关注。如果用户的反馈不能及时得到解决，那么用户会极易暴躁。就像我这前两天刚截的图，但其实还有更多类似的反馈，言语实在难登大雅之堂。那么这个时候在我看来，这个用户和产品的纽带已经变得愈发僵硬了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.004.jpeg&quot; alt=&quot;&quot; /&gt;但其实只要认真去观察，可以发现绝大多数用户第一次反馈的言辞其实是友善且恳切的。因为用户喜欢这款产品，所以他遇到问题才会反馈。他的初衷是希望自己的问题得到解决，他希望去帮助我们改进这款产品，让它变成更好的样子。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.005.jpeg&quot; alt=&quot;&quot; /&gt;我再举一个例子，前几天我灰度了一个技术容器，监控发现有个接口报错了几次。我赶紧去查了一下，因为这个接口的报错会导致用户直接进不了游戏，发现这两天这个错误只影响到了两个用户。针对其中一个用户捞日志上报，发现出现这个问题之后，他每天早上、中午、晚上每隔几个小时都会去尝试登录游戏。很遗憾，他每次都无法登录，但他依然在尝试。我可以感受到他焦急的心理，于是当天晚上优先处理了这个问题。&lt;/p&gt;
&lt;p&gt;在这里我不是想说这个 Bug 多严重多隐蔽什么的，而关键的点在于，这个用户从始至终，他都没有反馈过。那我们可以想象，如果这个问题一直被忽略，我们就必然会流失这两个用户。而即便他们流失了，我们在大盘上也永远发现不了这个事实。因为这个分子，微乎其微，甚至还无法在转化率曲线上留下一丁点数值上的波动。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.006.jpeg&quot; alt=&quot;&quot; /&gt;那么对于有反馈的人呢，如果我们解决了他们的问题，他们会回馈以我们感谢、表扬、鼓励。这个时候我能真正感受到屏幕后面的反馈是一个一个活生生的人，而不是 UID + UserAgent 的标签而已。其实我身边也有长辈使用我们的产品，那么想象下，当自己的长辈遇到送礼送不出去的问题、好不容易完成任务却无法领奖、想玩游戏却无法登录，我们又该会去怎么处理它呢？&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.007.jpeg&quot; alt=&quot;&quot; /&gt;Altman 在斯坦福大学商学院上有一门创业课程，他里面提到了两个点我感触很深。&lt;/p&gt;
&lt;p&gt;第一个是「感性」，他指出我们不应该以纯理性的视角去分析我们产品，不应该只关注大盘、DAU、转化率、留存、ARPPU——而应该去掺杂一些感性，以感性的角度出发去思考产品的增长。产品和用户之间的关系，应该类似于一种相亲关系、或是婚姻关系，应该去打造、维护、经营产品和用户之间长期友善的关系。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.008.jpeg&quot; alt=&quot;&quot; /&gt;第二词是「尊重」，他举了一个 WUFOO 的例子，是一个做在线表单的产品。他们团队仅 10 个人，要服务 50 万个用户，每周有 1000 多的问题需要去解决。而他们每周会安排专门的人去滚动这些问题，争取每周清零。他们对用户的尊重，值得尊重。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.009.jpeg&quot; alt=&quot;&quot; /&gt;这让我想到了我上学时用心打磨的一款产品，在反馈区中收获了用户们的喜爱、支持和溢美之词。这些反馈反哺着我对于研发的热爱、对于打造好产品的执着。以至于这么多年后我再想到这些反馈，心中仍然是暖暖的，充满信念和力量。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.010.jpeg&quot; alt=&quot;&quot; /&gt;最后一个关键词，是「意义」。最近看了一本书，叫《有限与无限的游戏》，作者将这世间人类参与的行为都比作游戏，而这些游戏又可以分为有限与无限的两种。而后者的意义感和价值感更加强烈。&lt;/p&gt;
&lt;p&gt;回到演讲开头的那个场景，其实稍微转换一下视角来看，会得到一个完全不一样的答案。如果我们只是从外而内，逐步去推进需求，然后去解决问题，目的是为了打造好产品，那么这有一个明确的终点和可复制的周期性，是一个有限的游戏。&lt;/p&gt;
&lt;p&gt;但如果反过来呢？我们如果是抱着打造好产品的信念去推进需求解决问题，在这种情况下的内驱力是无比强大的，从内而外地发展，这拥有着无限的可能性。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.011.jpeg&quot; alt=&quot;&quot; /&gt;说了这么多，总结一下，我们应该从真实的用户体验出发，关注当下每一个用户，友善地去连接产品与用户之间的关系。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.012.jpeg&quot; alt=&quot;&quot; /&gt;这一大段话，如果浓缩成一句话，那就是大家耳熟能详的——「一切以用户价值为依归」。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.013.jpeg&quot; alt=&quot;&quot; /&gt;谢谢大家。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.014.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;🌺 生活点滴&lt;/h2&gt;
&lt;p&gt;以下是本周期内一些瞬间的记录。&lt;/p&gt;
&lt;p&gt;🏮 春节假期：月是故乡明&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4111710590875_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4101710590872_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4091710590872_.pic.jpg&quot; alt=&quot;&quot; /&gt;🛫 返程：在飞机上拍到了广州塔&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4081710590871_.pic.jpg&quot; alt=&quot;&quot; /&gt;🇭🇰 香港：去香港办了张银行卡&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4151710590881_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4161710590882_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4141710590879_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4131710590878_.pic.jpg&quot; alt=&quot;&quot; /&gt;🌇 夕阳：日落黄昏后&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4071710590867_.pic.jpg&quot; alt=&quot;&quot; /&gt;🏆 突出个人与 TED 演讲&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4041710590865_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4051710590866_.pic.jpg&quot; alt=&quot;&quot; /&gt;🐱 手套：依旧憨憨的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4121710590877_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;🎬 书影音&lt;/h2&gt;
&lt;p&gt;以下是本周期的书影音记录。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;读完：心理学 |《存在主义心理治疗》| ★★★★★&lt;/li&gt;
&lt;li&gt;读完：理财 |《慢慢变富》| ★★★★☆&lt;/li&gt;
&lt;li&gt;读完：哲学 |《有限与无限的游戏》| ★★★★★&lt;/li&gt;
&lt;li&gt;读完：漫画 |《亲爱的我饱含杀意》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：电影 |《飞驰人生2》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《一个母亲的复仇》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《三大队》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《漫天过海》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《交换人生》| ★☆☆☆☆&lt;/li&gt;
&lt;li&gt;看完：美剧 |《洛基2》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：剧集 |《猎冰》| ★★☆☆☆&lt;/li&gt;
&lt;li&gt;看完：剧集 |《如果奔跑是我的人生》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看完：日漫 |《物理魔法使—马修(第1季)》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：日漫 |《咒术回战2》| ★★★★★&lt;/li&gt;
&lt;li&gt;在看：日漫 |《葬送的芙莉莲》| ★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;强推《葬送的芙莉莲》🎉&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/Capture-2024-03-17-145239.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-25&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>2023，逃离仿徨</title><link>https://ursb.me/posts/summary-2023/</link><guid isPermaLink="true">https://ursb.me/posts/summary-2023/</guid><description>2023年终总结：工作陷入迷茫一度提出离职，转组后接触Cocos引擎与iOS/Android全栈开发并晋升，同时脱单、博客迁移新平台，记录旅行、观影与阅读清单。</description><pubDate>Sun, 14 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;又是一年总结时，自开始写年终总结以来，这已是第六年，年龄也悄无声息地往 29 迈去。在这个年龄感觉到了焦虑和彷徨，以至于生日那天都没有在朋友圈里透露半点风声，我才理解到小时候那时无法理解到的——为什么有人会不喜欢过生日。&lt;/p&gt;
&lt;p&gt;这一年在工作上经历了彷徨和迷茫，寻求改变的过程非常曲折，而我也思考了许多、做了许多努力去逃离这份彷徨。因此今年的主题，就叫做「逃离彷徨」吧。&lt;/p&gt;
&lt;h2&gt;生活&lt;/h2&gt;
&lt;p&gt;每年的年终总结第一个环节都是工作，但是这次不一样了。今年，先写生活。&lt;/p&gt;
&lt;h3&gt;恋爱&lt;/h3&gt;
&lt;p&gt;喜大普奔，今年终于脱单了！这是今年最重要的收获了，所以第一个写。之前一直没有官宣过，因为我觉得感情的事情是私事，无必大庭广众下同外人说起。所以呢，这个环节就到这里啦~&lt;/p&gt;
&lt;h3&gt;交际&lt;/h3&gt;
&lt;p&gt;本科上铺+舍友+同组同事 Zyktrcn 离职了，带着小熊猫回了广州。说实话心里有些空落落的，自工作以来结识的朋友最后都走的走、散的散。之前的好兄弟舍友，他女友每天抱着泡芙玩，他们一起去了苏州；学习小组的 Wall-E 和 Ellia 离开了；大姐大 Sara 走的这两年，组里的重担都落在我肩上了，工作时偶尔看到以前同事 commit 的代码，总能想到那几年组里欢乐的时光。&lt;/p&gt;
&lt;p&gt;或许真如告别酒桌上领导说的那句话——“聚是一团火，散是满天星”，大家分散在世界各个角落里，散发着光和热。&lt;/p&gt;
&lt;p&gt;人生如逆旅，但我希望大家不会只是过客。&lt;/p&gt;
&lt;p&gt;今年还搬了家，搬家前最后拍了下阳台的风景，依旧绝美——&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG67.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;旅行&lt;/h3&gt;
&lt;p&gt;今年去了不少地方旅行。&lt;/p&gt;
&lt;p&gt;👪 大鹏：春节期间家人过来深圳过年，带他们逛了大鹏半岛。&lt;/p&gt;
&lt;p&gt;🍺 北京：年初去的，出差去听个会，见到了很多年没有见的老朋友，在冬日北京的巷子里散步，谈笑着这些年的经历。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG70.jpg&quot; alt=&quot;&quot; /&gt;🐚 惠州双月湾：和女友的第一次旅行，在海边捡了很多贝壳。&lt;/p&gt;
&lt;p&gt;⛰ 福鼎：端午请了很多天假，在深山的旅馆里修行，别有一番意境。&lt;/p&gt;
&lt;p&gt;🐂 顺德：逛了下清晖园，清晖园附近的牛杂贼好吃，后来从珠海旅行回来时还特地绕路吃了一顿。&lt;/p&gt;
&lt;p&gt;🐬 珠海长隆：国庆前周末玩了一趟，去了长隆新开的宇宙飞船，愉快的经历（但是胆小没坐过山车）&lt;/p&gt;
&lt;p&gt;🎏 清远-英德-从化：国庆自驾游路线，清远漂流出乎意料得很好玩！&lt;/p&gt;
&lt;p&gt;🌊 巽寮湾三角洲岛：10 月底部门团建，岛上物资匮乏，帆船上很容易出片。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG65.jpg&quot; alt=&quot;&quot; /&gt;👻 长沙：自驾去的，来回开了 20 个小时…印象深刻的反而不是长沙的美食，而是深夜开车听着鬼故事，结果在国道里真的路过了公墓。&lt;/p&gt;
&lt;p&gt;🎰 广州：找高中同学玩，VR 打僵尸、抓娃娃、密室逃脱，非常非常非常开心！&lt;/p&gt;
&lt;h3&gt;好物&lt;/h3&gt;
&lt;p&gt;分享下今年新入的好物。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Steam Deck：吃灰了，但是 SD 抱在手里的一瞬间，哪怕还没有启动游戏、哪怕还没有想好要玩什么游戏，就已经感觉到很快乐了。那种游戏库整个把握在手里的感觉，简直就是童年的梦。&lt;/li&gt;
&lt;li&gt;BOOX Left2：Kindle Oasis 几年，唯一的缺点就是看微信读书不方便，所以换了外观相似的 BOOX，很中意它们的物理翻页键。用了半年，中途开不了机返厂修了一次。而对比下 Kindle 的两台设备用了很多年也没有坏过…&lt;/li&gt;
&lt;li&gt;Insta360 GO 3：贼可爱的小相机，每次旅行必带它，所幸直接放在车里了。挂在脖子上可以去漂流，带着三脚架可以拍 vlog，软件自带的自动剪辑也很方便，简直不要太完美。唯二的缺点——一个是夜景实在拉胯，入夜之后属于不能看的状态，晚上只能手机录；另一个是内置存储，无法扩展存储，同时导出素材有点麻烦。&lt;/li&gt;
&lt;li&gt;碧云泉饮水机：很便捷，直出任意温度矿泉水，冲茶装水都很方便。后悔知道的晚了。&lt;/li&gt;
&lt;li&gt;戴森吹风机：很好用，女友的说法是碾压其他吹风机，再也不用护发素。&lt;/li&gt;
&lt;li&gt;AirPods Pro2(USB-C)：之前的 Pro1 被洗衣机洗了一遍，虽然勉强还能听，但是降噪失效了，且偶尔会有杂音，趁着今年出了 USB-C 的新款换了一下。&lt;/li&gt;
&lt;li&gt;莫曼顿助力自行车：每天上下班的代步车，三档助力可调，续航 35 KM 左右，正好够我一周上下班（上坡的时候和开挂一样）；不开电的时候也可以当自行车，有七档变速，缺点是不开电的时候有点难骑。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG69.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;试驾&lt;/h3&gt;
&lt;p&gt;今年陪不同朋友去试驾了几辆车，谈谈我个人的感受。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;问界 M5：体验智驾的时候翻车了，该转弯的时候没变道成功，直接直行了。而且我不太喜欢它的内饰，有点老气。&lt;/li&gt;
&lt;li&gt;阿维塔 12：颜值是长在了我的审美上，但电子后视镜的距离感很难把握（可以不选）。没有 HUD。&lt;/li&gt;
&lt;li&gt;保时捷 718：颜值爆炸好看，但是深圳已经见到很多了，车库里的保时捷和特斯拉都能在一起玩三消了。坐姿舒适，驾驶的运动感很强，但内饰还是上个年代的，音响也就听个响，不超过 100 迈的时候开起来很抖，而且噪音太大。可惜的是没有体验到 SC。&lt;/li&gt;
&lt;li&gt;蔚来 ET5T：颜值不错，驾驶感也很棒，兼具运动和舒适。nomi 也很可爱，但 ET5 没有 HUD。同时驾驶位坐姿偏高，倒车镜挡住了 1/4 的视野，耗电也相对严重些，续航一般。但蔚来可换电，而且坐姿偏高对 SUV 车型影响也不大，后续可能会考虑再试下 EC8 或者 ES8。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;运动&lt;/h3&gt;
&lt;p&gt;今年坚持打球（和女友也是打球认识的），共打了 59 场球，勉强不是个菜鸟了。号称前场雨刮器，后场也能打高远了。&lt;/p&gt;
&lt;p&gt;还去爬了一次塘朗山。&lt;/p&gt;
&lt;p&gt;整体而言，运动以后比以前的状态好了特别多。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG64.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;情绪&lt;/h3&gt;
&lt;p&gt;今年依旧每天写心情日记，今年的 iOS 17 还出了「手记」和健康里的「心理状态」，是我一直想做的 App。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG71.jpg&quot; alt=&quot;&quot; /&gt;今年的情绪图如下，处理六月那段时间比较艰难之外（后文讲到工作再提），其余时间都是保持着小确幸的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG79.jpg&quot; alt=&quot;&quot; /&gt;为什么坚持记录心情，这个点在《&lt;a href=&quot;https://blog.ursb.me/posts/weekly-19/&quot;&gt;月刊（第19期）：日记的意义&lt;/a&gt;》里已经深入阐述过了——记录是防止信息流失的方法，也是防止自己流失的方法。记录自己的生活，是为了让生活形成整体。&lt;/p&gt;
&lt;p&gt;在「豆瓣2023年度社区故事」的介绍语里有这样一句话，很时候作为这个「生活」模块的结尾——“我们认真投入生活本身，用爱意与目光，穿透最具体的细节，在果壳做的微型宇宙里为自己加冕。”&lt;/p&gt;
&lt;h3&gt;猫猫&lt;/h3&gt;
&lt;p&gt;手套和泡芙很好，尤其是手套——每天除了睡（而且是躺尸睡姿）就是吃（而且是埋头干饭，恨不得整个头都塞进猫碗里）。&lt;/p&gt;
&lt;p&gt;泡芙还是很调皮，但现在听话很多，喊它至少会回应你了。&lt;/p&gt;
&lt;p&gt;手机没有存货，刚现场拍了一张：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG75.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;学习&lt;/h2&gt;
&lt;p&gt;今年是大模型 AI 之年，借助 AI 和一些软件以及自己的工作流，摄取知识的效率更高了。这里简单介绍下我的工作流和方法。&lt;/p&gt;
&lt;p&gt;在 2022 年的《&lt;a href=&quot;https://blog.ursb.me/posts/weekly-16/&quot;&gt;月刊（第16期）：个人信息流分享&lt;/a&gt;》一文中，介绍过自己的信息处理模式，2023 年有一些辅助性上的改动，这里介绍一下。&lt;/p&gt;
&lt;p&gt;首先对白板工具更完善的使用——LogSeq、Obsidian、Heptabase 都支持白板和 Readwise 集成（Muse 、无边记、GoodNotes 等软件不支持 Readwise 集成，这里就不介绍了），整理标注和笔记的输出时可以使用白板辅助整理思路。工作时很多方案文档以及今年的月刊都是以这种模式进行运作的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240114152239.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240114152314.png&quot; alt=&quot;&quot; /&gt;其次，在打草稿梳理研究思路的时候，我更喜欢用 Excalidraw，在 《&lt;a href=&quot;https://blog.ursb.me/posts/weekly-24/&quot;&gt;月刊（第24期）：  十年编程之路&lt;/a&gt;》里介绍过使用经历，这里不再赘述了。有时候我针对一个专题的研究能写出 200 多 MB 的图谱，但同时 Excalidraw 却一点也不卡，配合顺手的快捷键，用起来得心应手。&lt;/p&gt;
&lt;p&gt;至于 AI 软件的推荐，首推 OpenAI Plus，之后是 Perplexity、DALLE-3、Poe。但是这几款对 IP 都有要求，可以考虑微软云服务器做代理。这里重点推一下 Perplexity，基本上它在我这里已经取代了 Google，它会结合搜索引擎的结果进行回答，同时也支持识别 PDF 文件和图像，GPT-4 的回答质量非常之高：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240114153100.png&quot; alt=&quot;&quot; /&gt;&amp;gt; Perplexity 的免费版也足够使用（免费版只是不能用 GPT-4 而已），如过注册的话可以使用这个链接 →  &lt;a href=&quot;https://perplexity.ai/pro?referral_code=0ZSAD0VT&quot;&gt;https://perplexity.ai/pro?referral_code=0ZSAD0VT&lt;/a&gt; ，未来如果想要付费的话可以得到 $5 的抵扣。&lt;/p&gt;
&lt;p&gt;如果没有条件翻墙的话，可以使用 Raycast AI，目前对网络没有限制，支持 GPT-4 等多个模型，一般深度对话我会使用它（一共三台设备，这是工作电脑的 Raycast AI 的使用记录）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/raycast-2023-2.jpg&quot; alt=&quot;&quot; /&gt;除此之外，它还可以通过 Prompt 自定义 AI 命令，以下是我常用的一些命令：比如提取 WeChat Bot 返回的 JSON 配置、JSON 压缩、输入 URL 总结网页内容、根据 JCE 协议转 ts interface 或者 直接 Mock 出数据以便 Whilstle Mock Response ——&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240114153518.png&quot; alt=&quot;&quot; /&gt;当然抛开 AI 能力，Raycast 本身也是一个足够优秀的软件，工作电脑使用记录如下（通过 Raycast 打开 Arc 用了 2.3万次，打开终端 2k 次）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/raycast-2023-1.jpg&quot; alt=&quot;&quot; /&gt;如果想体验，可以使用这个链接进行注册：&lt;a href=&quot;https://raycast.com/?via=airing&quot;&gt;https://raycast.com/?via=airing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;还有 《&lt;a href=&quot;https://blog.ursb.me/posts/weekly-23/&quot;&gt;月刊（第23期）： 多任务中的时间管理&lt;/a&gt;》 一文中推荐过的 Rize，对于培养专注和免分心有一定的效果，可以使用 &lt;a href=&quot;https://rize.io?code=291287&quot;&gt;https://rize.io?code=291287&lt;/a&gt; 链接注册免费体验一个月（仅 Mac）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231006123244@2x.png&quot; alt=&quot;&quot; /&gt;还有 Arc 如今也取代了 Chrome 和 Safari 成为我主力浏览器，树状标签、自定义空间、分屏浏览、AI 重命名都是很实用的功能。不知道现在还是不是邀请制了，但可以直接使用 &lt;a href=&quot;https://arc.net/gift/ab29c0b8&quot;&gt;https://arc.net/gift/ab29c0b8&lt;/a&gt; 链接注册体验：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240114154311.jpg&quot; alt=&quot;&quot; /&gt;今年使用 IFTTT 和它的 AI 能力自动化了我的信息流：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IFTTT 注册了我在 inoreader 上的订阅更新，如果有固定的关键词触发了（比如「年度总结」），会直接收录到 Cubox 并通知到 &lt;a href=&quot;https://t.me/airingchannel&quot;&gt;Telegram 群&lt;/a&gt;里。&lt;/li&gt;
&lt;li&gt;Rize 每日的专注邮件会转发给 inoreader，之后 IFTTT 监听，如果有 Rize 的邮件，就会使用 IFTTT AI 自动总结今日的时间报告发到群里。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG72.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我会收藏一些优秀的文章到 Cubox 里，通过 Webhook 触发到 inoreader 订阅，之后再由 IFTTT 转发到 &lt;a href=&quot;https://t.me/airingchannel&quot;&gt;Telegram 群&lt;/a&gt;里。对于文章本身，IFTTT AI 也会给予总结。&lt;/li&gt;
&lt;li&gt;利用 IFTTT 和 Github Action 还做了每周编程报告，Action 通过 API 拉 WakaTime 的上周数据，之后 IFTTT 总结发到群里。&lt;/li&gt;
&lt;li&gt;同理，利用 Action + IFTTT 还做了对 last.fm 的收听报告的总结。&lt;/li&gt;
&lt;li&gt;GitHub Star、豆瓣动态、微博动态也交由 IFTTT 订阅了。&lt;/li&gt;
&lt;li&gt;每次发布博客也交由 IFTTT 监听对应的 RSS，有博客更新也会通知到群里。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今年还体验了 Notion AI，但是没几天就弃坑了。&lt;/p&gt;
&lt;p&gt;Notion 年底支持了 Q&amp;amp;A Beta，它的理念非常好，可以基于自己的 Notion 知识库进行 AI 问答。好不容易申请到了 Beta 体验资格，效果如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG73.jpg&quot; alt=&quot;&quot; /&gt;但是深度使用之后发现，它对于问题的要求非常苛刻，有时候稍微偏一点它搜不到就不会回答。同时他也不能指定知识库作为答案源，回答的质量并不算很高（明显弱于 GPT-4，上下文逻辑性不强），大部分时候不如自己直接搜索，对于回答的结果只能是一个参考性的价值。只能说目前的成熟度还是不够。&lt;/p&gt;
&lt;h2&gt;工作&lt;/h2&gt;
&lt;p&gt;接着转化心情，谈一谈工作吧，也是今年「逃离彷徨」主题的由来。&lt;/p&gt;
&lt;p&gt;年初 2-3 月时在对未来的工作进行规划时产生了迷茫，之后 5-6 月阳了之后对这种迷茫集中爆发了。虽然我富满激情、虽然我能者多劳、虽然我绩效优异、虽然我履历光鲜，但是这两年我始终无法直面自己的内心——目前的工作内容真的是我喜欢做的事情吗？我只是为了这份不错的薪资和工作中领导、同事对我的肯定，我才一直一直尽全力把工作做到最好。&lt;/p&gt;
&lt;p&gt;自 Flutter 项目结束之后，工作上已经没有新的项目能够让我燃起激情了。虽然负责过不少重点项目，但回顾过去两年做的事情，其实都没有给自己带来预期之内的进步。琐碎、简单、单调可以称之为这两年工作的主旋律。&lt;/p&gt;
&lt;p&gt;最终在深思之后，我提出了离职。在给领导的信（也叫辞呈吧）中，我这么写道——&lt;/p&gt;
&lt;p&gt;「现在我要攻克这个阶段的迷宫，关键在于我要克服自己的心态，但是即便我通关了我所处的迷宫，迷宫劣化的问题依然存在，如果我无视问题的存在，只是调整自己心态进入到下一关，那我只会变得越来越麻木——遇到项目机器人似地高效处理，那我便不再是自己了，我的性格特点将会被磨灭，我所喜欢的、所追求的、所热爱的梦想，也总有一天会在无休止的迷宫闯关中消失殆尽。想到卡明斯说过的一句话：“这个世界日以继夜、竭尽全力让你成为其他人，如果你想做你自己，就意味着要打一场最艰难的仗。“我只想保持自己，这是我的底线。&lt;/p&gt;
&lt;p&gt;为了不让自己迷失，18 年开始我每年都会写年终总结，我知道紧握初心不迷失的关键在于要不断自省、反思，之后再从中展望未来。您应该也发现了，我更适合研究型、科研型的工作，因此 Flutter 我可以做的很好，因此哲学论文我也可以写的很棒，再之前也一直如此。比如大三时候可以独自一人住在实验室三天，搞一个机器人项目，可有意思了。回想起来，貌似很久很久没有体会到技术带给我的激情了。除此之外，因为人生经历的原因，我也想追求丰富的人生体验，不会为自己不喜欢的项目去投入 100% 的精力。」&lt;/p&gt;
&lt;p&gt;我未曾想到的是，领导竟同意了我离职——他说如果其他人的话他会尝试去挽留，但若是我的话，他能够理解并且给予支持。无论今后如何，他都会支持我。&lt;/p&gt;
&lt;p&gt;其实那天早上和他的对话让我解开了这些年的心结，我一直不舍得走更多的原因是看重领导的栽培以及和同事的关系，殊不知它们已成为系紧我的枷锁。但&lt;/p&gt;
&lt;p&gt;我所看重的一切，它们并不是枷锁，而是支持我前进的力量。&lt;/p&gt;
&lt;p&gt;最终今年并没有离职，因为被上面的领导留了三次，最后决定转组调整项目再试一下。&lt;/p&gt;
&lt;p&gt;调整之后得到的成长还是蛮多的——比如业务感，懂得 ABT 实验数据，知道盘子画像对数据的影响，有意识地去通过尽可能多的技术手段去提升某些业务指标，也会通过各种维度去挖掘数据背后的归因。&lt;/p&gt;
&lt;p&gt;除此之外还有一些技术上的成长——深入学习了 Cocos 渲染，并写了 C++ 库在项目的游戏引擎上集成了 GFX 模块。还通过这个项目接触了 Android 开发，实现了资源包不同的加载模式，并从零完善并落地了 iOS 的游戏引擎，有机会对 iOS 开发、C++ 开发进行项目实战。&lt;/p&gt;
&lt;p&gt;自此之后，基本什么都敲——JS、iOS、Android、C++，一个人调试游戏引擎的全链路，96G 内存的 iMac 也逐渐带不动了。&lt;/p&gt;
&lt;p&gt;PS. 某周 WakaTime 的编程统计：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/536246ac76ccd45f8e4c29b8b7184b88.jpg&quot; alt=&quot;&quot; /&gt;我不能说这是机遇，我只能很庆幸，一路上遇到的都是贵人——他们给予我理解、肯定与支持，让我不再彷徨。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG66.jpg&quot; alt=&quot;&quot; /&gt;在这过程中并没有丢失掉这些年一直以来的初心，我一直愿景着通过手上的技术给社会带来福祉，虽然目前能做的不多，但申请加入了 W3C 无障碍工作组，也算是迈出了第一步吧。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG74.jpg&quot; alt=&quot;&quot; /&gt;今年公司还给做了一套 IDP 职业测评，我的数据如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240114152553.png&quot; alt=&quot;&quot; /&gt;
抱负能量是职业发展的内核，我的成功愿望居然高达 9.8，思维和执行上也有相当不错的表现。 但与之相反地，人际互动就很低分（我果然还是很适合埋头做研究性质的工作）。&lt;/p&gt;
&lt;h2&gt;写作&lt;/h2&gt;
&lt;p&gt;今年一共写了 7 篇月刊，年中的时候因为工作原因停更了好几期：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;《&lt;a href=&quot;https://blog.ursb.me/posts/weekly-18/&quot;&gt;月刊（第18期）：逃离社交网络&lt;/a&gt;》&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://blog.ursb.me/posts/weekly-19/&quot;&gt;月刊（第19期）：日记的意义&lt;/a&gt;》&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://blog.ursb.me/posts/weekly-20/&quot;&gt;月刊（第20期）：重启人生&lt;/a&gt;》&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://blog.ursb.me/posts/weekly-21/&quot;&gt;月刊（第21期）： 快节奏时代下的短视频&lt;/a&gt;》&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://blog.ursb.me/posts/weekly-22/&quot;&gt;月刊（第22期）： 当下的快乐&lt;/a&gt;》&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://blog.ursb.me/posts/weekly-23/&quot;&gt;月刊（第23期）： 多任务中的时间管理&lt;/a&gt;》&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://blog.ursb.me/posts/weekly-24/&quot;&gt;月刊（第24期）：  十年编程之路&lt;/a&gt;》&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;此外，还在少数派上发表了一篇&lt;a href=&quot;https://sspai.com/post/83743&quot;&gt;旧文&lt;/a&gt;，意料之外的得到很多感谢的评论：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240113164230.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240113164313.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240113164354.png&quot; alt=&quot;&quot; /&gt;看着这些善意的评论心里暖暖的，以前觉得写作只是记录自己的想法，不想未来的自己丢失现在的感受，而未曾想到其实自己的想法也可以影响到他人。&lt;/p&gt;
&lt;p&gt;之前听闻“婴儿最快乐的时刻就是发现他自己可以对周围的世界产生影响”。在写作这种创造性的活动中，或许我也是在追求某种“存在感”，这种存在感可能就是我对世界的一点点影响和改变。&lt;/p&gt;
&lt;p&gt;某天在知乎上收到了一个私信，真切地感受到写作给他人带来的帮助：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/IMG_1129.jpg&quot; alt=&quot;&quot; /&gt;之后便在月刊中鼓励读者与我写信交流，今年陆陆续续收到一些读者的来信，我也积极认真地逐一回信了。2024 年初预计启动一个读者来信计划，可以期待一波~&lt;/p&gt;
&lt;p&gt;技术文章就写了两篇：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;《Atum 自研游戏引擎高性能探索之路》：暂未脱敏，就没发到外网了。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://blog.ursb.me/posts/cross-end/&quot;&gt;大厂自研跨端框架技术揭秘&lt;/a&gt;》&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;较往年而言技术文章写的少了，一方面是因为时间分配问题，另一方面是很多内容原本想写、但觉得写完之后没法脱敏所幸就不写了——但不管怎样，技术文章这块明年需要补足。&lt;/p&gt;
&lt;p&gt;大家已经发现了，今年的周刊是在新的博客上发布的。因为前段时间服务器和博客被恶意攻击产生了损失，这几天将迁移了博客到新平台 &lt;a href=&quot;https://blog.ursb.me&quot;&gt;blog.ursb.me&lt;/a&gt;，并对相关资源做了加固。新博客整合了之前的小屋和月刊，小屋和月刊两个网站直接关停，目前对小屋和月刊的核心页面做了 302 处理，而评论的迁移过于麻烦就直接丢弃了。之后请直接关注新的平台，订阅博客之后也会有邮件推送新文章。&lt;/p&gt;
&lt;h2&gt;书影音&lt;/h2&gt;
&lt;p&gt;今年看的剧不少，以下排名按个人评分排序。&lt;/p&gt;
&lt;h3&gt;剧集&lt;/h3&gt;
&lt;p&gt;神作档：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;《重启人生》：★★★★★，心底里的六个星，每次重温都能发现温暖的小细节。&lt;/li&gt;
&lt;li&gt;《漫长的季节》：★★★★★，披着悬疑片壳的文学佳作，兼具优异的叙事模式和情感内核。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;好评档：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/35465232/&quot;&gt;狂飙&lt;/a&gt;》：★★★★★，后悔现在才看。但是看的是删减版，只能下调一档了。&lt;/li&gt;
&lt;li&gt;《黑暗荣耀 1 &amp;amp; 2》：★★★★★&lt;/li&gt;
&lt;li&gt;《洛基 2》：★★★★★，所以为什么时间宝石的绿色的。&lt;/li&gt;
&lt;li&gt;《隐秘的角落》：★★★★★，重温的佳作。&lt;/li&gt;
&lt;li&gt;《最后生还者 1》：★★★★★，本身剧本好。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/35991840/&quot;&gt;死期将至&lt;/a&gt;》：★★★★★，意料之外的好片。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/36178641/&quot;&gt;三大队&lt;/a&gt;》：★★★★★&lt;/li&gt;
&lt;li&gt;《新闻女王》：★★★★★，中规中矩的 TVB 剧集。&lt;/li&gt;
&lt;li&gt;《繁城之下》：★★★★★&lt;/li&gt;
&lt;li&gt;《三体》：★★★★★&lt;/li&gt;
&lt;li&gt;《凪的新生活》：★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;值得一看档：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;《白夜追凶》：★★★★☆&lt;/li&gt;
&lt;li&gt;《都挺好》：★★★★☆&lt;/li&gt;
&lt;li&gt;《恶鬼》：★★★★☆&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/35633163/&quot;&gt;莲花楼&lt;/a&gt;》：★★★★☆&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/36212784/&quot;&gt;别班&lt;/a&gt;》：★★★★☆&lt;/li&gt;
&lt;li&gt;《好事成双》：★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可看可不看档：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;《故乡，别来无恙》：★★★★☆&lt;/li&gt;
&lt;li&gt;《宁安如梦》：★★★☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG62.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;电影&lt;/h3&gt;
&lt;p&gt;神作档：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;《蜘蛛侠：纵横宇宙》：★★★★★&lt;/li&gt;
&lt;li&gt;《情书》：★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;好评档：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;《奥本海默》：★★★★★，4.5 星。本来很期待的诺兰新片，但如果没有提前看过解析，根本不知道通过黑白来转化视角的表达方式，还是太隐晦了，会导致有些云里雾里。&lt;/li&gt;
&lt;li&gt;《消失的她》：★★★★★&lt;/li&gt;
&lt;li&gt;《满江红》：★★★★★&lt;/li&gt;
&lt;li&gt;《银河护卫队 3》：★★★★★，对于漫威而言 5 星只是及格分。但是这几年漫威在影片荧幕上没有及格的影片，这个银护 3 就显得很难能可贵了。&lt;/li&gt;
&lt;li&gt;《网络谜踪 2》：★★★★★&lt;/li&gt;
&lt;li&gt;《年会不能停》：★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;值得一看档：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;《保你平安》：★★★★☆&lt;/li&gt;
&lt;li&gt;《孤注一掷》：★★★★☆&lt;/li&gt;
&lt;li&gt;《坚如磐石》：★★★★☆，老戏骨还是老戏骨。&lt;/li&gt;
&lt;li&gt;《饥饿站台》：★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可看可不看档：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;《八角笼中》：★★★★☆&lt;/li&gt;
&lt;li&gt;《封神 1》：★★★★☆&lt;/li&gt;
&lt;li&gt;《分手的决心》：★★★★☆&lt;/li&gt;
&lt;li&gt;《名侦探柯南：黑铁的鱼影》：★★★☆☆，心疼琴酒。&lt;/li&gt;
&lt;li&gt;《末日崩塌》：★★★☆☆&lt;/li&gt;
&lt;li&gt;《人生路不熟》：★★★☆☆&lt;/li&gt;
&lt;li&gt;《长空之王》：★★★☆☆&lt;/li&gt;
&lt;li&gt;《流浪地球 2》：★★★☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;烂片档：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;《蚁人与黄蜂女》：★★★☆☆&lt;/li&gt;
&lt;li&gt;《天龙八部之乔峰传》：★★★☆☆&lt;/li&gt;
&lt;li&gt;《雷神 4》：★★☆☆☆，讲了个啥？&lt;/li&gt;
&lt;li&gt;《前人4：英年早婚》：★★☆☆☆&lt;/li&gt;
&lt;li&gt;《Nope》：★★☆☆☆&lt;/li&gt;
&lt;li&gt;《变形金刚：超能勇士的崛起》：★★☆☆☆，特效不错&lt;/li&gt;
&lt;li&gt;《鹦鹉杀》：★☆☆☆☆，打一星是因为最差只能打一星&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;动漫&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;《咒术回战 1 &amp;amp; 2》：★★★★★，刚粉上五条悟漫画里就被腰斩了…&lt;/li&gt;
&lt;li&gt;《三体（动画版）》：★☆☆☆☆，看一半弃了，看下去的动力居然是评论区和弹幕的调侃&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;阅读&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;《存在主义心理治疗》：★★★★★&lt;/li&gt;
&lt;li&gt;《人类灭绝》：★★★★☆&lt;/li&gt;
&lt;li&gt;《消失的 13 级阶梯》：★★★★☆&lt;/li&gt;
&lt;li&gt;《悉达多》：★★★★★&lt;/li&gt;
&lt;li&gt;《&amp;lt;资本论&amp;gt;的读法》：★★★★☆&lt;/li&gt;
&lt;li&gt;《少年巴比伦》：★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;游戏&lt;/h3&gt;
&lt;p&gt;今年没有怎么玩游戏，《原神》须弥主线硬着头皮刷完了、枫丹没有开；《王国之泪》只打了一个 Boss，《博德之门》只出了新手村，《潜水员戴夫》也就下海了几次。&lt;/p&gt;
&lt;h2&gt;新年目标&lt;/h2&gt;
&lt;p&gt;又到了新年目标环节了，依旧不定具体的目标，而是希望自己始终保持危机感。&lt;/p&gt;
&lt;p&gt;罗曼罗兰说过一句话：“大部分人在二三十岁上就死去了，因为过了这个年龄，他们只是自己的影子，此后的余生则是在模仿自己中度过，日复一日，更机械，更装腔作势地重复他们在有生之年的所作所为，所思所想，所爱所恨。”&lt;/p&gt;
&lt;p&gt;为了紧握初心、保持进步，2024 送自己三句话：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“铅刀有干将之志， 萤烛希日月之光。”&lt;/li&gt;
&lt;li&gt;“生也有涯，知也无涯，向死而生，求知不怠。”&lt;/li&gt;
&lt;li&gt;每天默念：“我尊重一切发生，我追求内心渴望，我相信自己每一天都变得更好。”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG63.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=summary-2023&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>月刊（第24期）：十年编程之路</title><link>https://ursb.me/posts/weekly-24/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-24/</guid><description>回顾自二〇一四年起十年编程历程,从VB、Java Swing到Web前端、iOS、Flutter与游戏渲染的技术变迁,总结以热爱为核心、项目驱动学习并注重沉淀的经验。</description><pubDate>Thu, 09 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本篇是对二〇二三年十月生活的记录与思考。&lt;/p&gt;
&lt;h2&gt;十年编程之路&lt;/h2&gt;
&lt;p&gt;时光荏苒，回首望去，自系统接触编程已近十年，这篇月刊就写写这十年的编程之路吧。&lt;/p&gt;
&lt;p&gt;深得周围小朋友的羡慕，家里小时候是开网吧的，因此我对电脑游戏向来比较熟悉，但未曾设想过以后会走向编程的道路。2007 年的时候，初中组织了一波 Pascal 的奥赛班我也半途而废了， 2013 年高考之后报了教育技术学专业，这是一个在教育学院里和计算机稍稍沾些边的理科专业。如果按照正常的轨迹发展，想着大概毕业以后凭着专业的教师资格回老家的中小学当一名老师吧。&lt;/p&gt;
&lt;p&gt;但一切在 2014 年的年初发生了改变。&lt;/p&gt;
&lt;h3&gt;2014：初识&lt;/h3&gt;
&lt;p&gt;年初那会儿那段&lt;a href=&quot;https://me.ursb.me/archives/72.html&quot;&gt;逼近死亡的经历&lt;/a&gt;给我带来了巨大的变化，后面的每一天都有向死而生的感觉。如同《存在主义心理治疗》中对死亡焦虑的剖析：“死亡的觉察使人们脱离对琐事的关心，为生命提供深入、强烈而完全不同的观点。”也是自那之后，我的人生观发生了重大的转变——人生目标定为想要为世界留下些什么。我不愿按照之前的既定之路走完一生，于是重新安排生活的优先级，努力找寻未来人生的方向，恰好那时有一门 VB 的课程我很感兴趣，也是 VB 让我正式敲开了编程的大门。&lt;/p&gt;
&lt;p&gt;记得接触 VB 那会儿自己开发文字 RPG，每天晚上搞到一两点仍意犹未尽。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109134159-1.jpg&quot; alt=&quot;&quot; /&gt;姓名大乐斗最终迭代了 6 个版本：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109133726@2x.jpg&quot; alt=&quot;&quot; /&gt;那段时间的每个深夜里，满怀激动地开发着游戏，这种心情哪怕是现在回忆起来也仍未有任何衰减。现在想来，那恐怕就是最纯粹的热爱吧。&lt;/p&gt;
&lt;p&gt;因为课程表现优异，被老师拉进了项目组，之后自学了 Java Swing 和数据库，做了一些游戏化的课件和管理平台。&lt;/p&gt;
&lt;p&gt;在 VB 和 Java Swing 时期我开发的 GUI 小玩具们都是直连数据库的（不敢相信），为了弥补上中间的桥梁，也是因为向往做一些联网应用，于是又学了 ASP.Net 和 JSP，那个时候不管开发什么 API 都是直接 Struct + Hibernate + Spring 一套撸上去。那个时候感觉自己无所不能，貌似自己凭借着 GUI、JSP、Access 就已天下尽在掌握之中。&lt;/p&gt;
&lt;p&gt;之后和每个技术人一样，我购买了自己的域名并备了案（&lt;a href=&quot;https://ursb.me&quot;&gt;ursb.me&lt;/a&gt; ，一直使用到了现在），并魔改了 WordPress 的主题把博客部署在虚拟主机中。（所谓虚拟主机也是古早时期的产物，就是服务器上给你一块目录随便操作。）&lt;/p&gt;
&lt;p&gt;那个时候博客大概长这样（古早的 3G 网络和 iPhone 5）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/04b0d14653332a6699b3171ea12679%201.jpg&quot; alt=&quot;&quot; /&gt;大二的时候，我们学校开放了一些第二专业，我便申请辅修了计算机，每天白天上本专业的课程，晚上去上二专课，九点多下课回宿舍捣鼓自己的东西。虽然有点辛苦，但是回忆起来异常充实，而且稀里糊涂地总是第一。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/3d1f1c4f311d701f2fac3f4d0c7773.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2015：Web 前端&lt;/h3&gt;
&lt;p&gt;一五年的时候接触了 HTML、CSS 和 JS，也就是现在所谓的 Web 前端。刚接触 H5 开发的时候还在用 DreamWeaver…之后了解到了 Sublime，便把 DreamWeaver 卸载了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/afa372be5a1f3f23eee5d46d63d3ba%201.jpg&quot; alt=&quot;&quot; /&gt;学 JS 期间用 Canvas 写了个微信聊天界面模拟器，项目也迅速上了 100 Star。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109192948@2x.jpg&quot; alt=&quot;&quot; /&gt;在那之后写了一本 Canvas 的教程，也收获了许多 Star：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109193106@2x.jpg&quot; alt=&quot;&quot; /&gt;打印出来之后给班上同学授课也是成就感满满：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/a75270287ac6dfb1ea89dba5b217ab%201.jpg&quot; alt=&quot;&quot; /&gt;这一年年初，和专业的同学组队去参加了人生中的第一次 Hackathon，团队决定写一款叫 AskNow 的 Android App，由于我不会 Android，所以被分配去画 UI 了。经过这个项目学习了 Sketch，也了解了移动端的一些基本组件，之后又对移动端开发感兴趣学了段时间 Android。&lt;/p&gt;
&lt;p&gt;由于手上没有 Android 设备，总是在模拟器开发很没意思。恰那时 Swift 刚出没一年，立马开始学起了 iOS 开发，那个时候简直是 iOS 开发的黄金时代，而自己的学习欲望也特别强，感觉什么东西能有兴趣，什么东西都能学下去。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/69d124a038d6637dc5fe09ce2f2de6%201.jpg&quot; alt=&quot;&quot; /&gt;那一年，苹果发布了史上第一款 Apple Watch，当时看得满眼冒星星，马上去 Apple Store 买了一个，并付费了 Apple Developer 资格证书，开始开发 Apple Watch 应用：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109135133@2x.jpg&quot; alt=&quot;&quot; /&gt;很庆幸自己生在这个时代，时不时有新技术涌现出来，也毫无顾虑地可以学习一切想学的技术。&lt;/p&gt;
&lt;h3&gt;2016：无限可能性&lt;/h3&gt;
&lt;p&gt;学完 Swift 之后便跃跃欲试，做了一个 App 并上架了，成就感满满：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/3f4621fa4bccdd3afb856c9eb5b7dd%201.jpg&quot; alt=&quot;&quot; /&gt;在那之后又做了一款 Apple Watch 的宠物养成+英语学习的 App —— FeedMe：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/Capture-2023-11-09-195333%20%281%29.png&quot; alt=&quot;&quot; /&gt;这一年还学了 R 语言还有 Python，做了一些爬虫和数据分析的项目，迷上了 Kaggle。但可惜的是后来没有往这个方向发展，当时也觉得学了以后对做软件可能没有帮助。（但神奇的是，今年年初在对一个外网现象做技术数据归因分析的时候用到了！当时觉得好不可思议！）&lt;/p&gt;
&lt;p&gt;这一年参加许多竞赛，其中有一个项目是电子信息技术专业的，做一个搬运机器人。刚接触项目的时候对单片机没有任何了解，为了恶补知识和赶项目进度，项目期间还搬进了实验室住。那个时候实验中心的项目组给我分配了一个独立的实验室，劳累着、幸福着。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/da41799d63df979f0b1c8b5f3f62b2%201.jpg&quot; alt=&quot;&quot; /&gt;做完这个项目之后，发现自己某种意义上成为了全栈工程师——UI 设计、Web、后台、客户端、硬件。我对这一切都感兴趣。&lt;/p&gt;
&lt;p&gt;那段时间跨端技术开始初露头角，Ionic 和 Cordova 也是立马学了然后撸了几个 App 出来参加比赛，感觉自己的精力好像是无限的…&lt;/p&gt;
&lt;p&gt;而这些比赛基本上都获奖了，也算是收获满满了~&lt;/p&gt;
&lt;p&gt;PS. 这一年的空余时间依旧在折腾我的博客：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/3b14912d5c6ef4def505534a1e8d67.jpg&quot; alt=&quot;&quot; /&gt;（明明是最简单的 Hexo，被折腾的臃肿不堪）&lt;/p&gt;
&lt;h3&gt;2017：前端大杂烩&lt;/h3&gt;
&lt;p&gt;前文说到博客，这一年我最后一次修改博客，力求简洁，于是改成了现在的样子（&lt;a href=&quot;https://me.ursb.me&quot;&gt;me.ursb.me&lt;/a&gt;）。自此之后再也没有动过博客的样式，博客本应该以内容质量为本。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109210317@2x.jpg&quot; alt=&quot;&quot; /&gt;2017 年过年期间，又一次生病住院了。住院期间我记得微信发布了小程序，然后对着官方文档敲了个小程序出来：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109135857@2x.jpg&quot; alt=&quot;&quot; /&gt;（现在看来简直不敢相信自己能左手敲代码。）&lt;/p&gt;
&lt;p&gt;那一年学习了 VUE，做了个社区：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/sophia-shot%20%281%29.jpg&quot; alt=&quot;&quot; /&gt;那一年的本科毕业论文写了个推荐系统。&lt;/p&gt;
&lt;p&gt;那一年入手了个咕咕机和树莓派，做了个玩具：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/gugu3.jpg&quot; alt=&quot;&quot; /&gt;那一年参加了很多比赛，在互联网上组建了零熊团建，用 React Native + Express 做了一图、双生、四时等众多上架了 App Store 的 App：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/__%20Oh_Bear%20-%20https___oh-bear_github_io_%201.jpg&quot; alt=&quot;&quot; /&gt;那一年接了个健身房的外包，做了一整套卖课、约课、排课、打卡、监测上课运动状态的系统，赚了不少生活费：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109195704@2x.jpg&quot; alt=&quot;&quot; /&gt;这一年的年终总结：&lt;a href=&quot;https://me.ursb.me/archives/72.html&quot;&gt;再见了，我的大学&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;2018：实习&lt;/h3&gt;
&lt;p&gt;这一年上半年主要在重构 双生日记 2.0，最终凭借它拿到了小程序大赛的 Top2。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109195513@2x.jpg&quot; alt=&quot;&quot; /&gt;3 月份开始秋招实习面试，凭借着这份&lt;a href=&quot;http://ursb.me/resume/&quot;&gt;校招简历&lt;/a&gt;和不错的八股文准备，如愿进入了鹅厂，岗位是 Web 前端（当时觉得前端比较好准备）。自此之后，一直一直在这个团队做到了现在。&lt;/p&gt;
&lt;p&gt;那个时候的工卡照（真年轻啊…）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109140130@2x.jpg&quot; alt=&quot;&quot; /&gt;这一年的年终总结：&lt;a href=&quot;https://me.ursb.me/archives/153.html&quot;&gt;2018，沉淀初心&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;2019：WWDC 与工作&lt;/h3&gt;
&lt;p&gt;这年赶上了两年学硕的末班车，顺利硕士毕业。毕业前夕收到了 WWDC Scholarship 送的门票和住宿，加上浙大慷慨给我中大学子包机票，免费去美国玩了几天。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109140340@2x.jpg&quot; alt=&quot;&quot; /&gt;这趟旅途上认识了很多厉害的同学，也知道了前途永无止境，需要不断向前。&lt;/p&gt;
&lt;p&gt;回来之后正式入职，前几个月基建有点落伍，还在写 JQuery，年末团队推动了 React。这年除了 React 业务活动页面，还做了个小程序，也用 Hippy 做了一个独立的 App。&lt;/p&gt;
&lt;p&gt;这一年的年终总结：&lt;a href=&quot;https://me.ursb.me/archives/2019.html&quot;&gt;2019，走走停停&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;2020：Flutter&lt;/h3&gt;
&lt;p&gt;这一年跨端异常火爆。我这年的主旋律有幸是 Flutter，在团队内主导 Flutter 混合开发框架的建设，也做了一些 iOS 侧的研发工作。基于项目做了一些 BU 和司外的分享，还拿了两个五星，这也是毕业之后第一次拿五星绩效，对个人的激励还是非常大的。&lt;/p&gt;
&lt;p&gt;这个项目让我重燃了对原生开发的兴趣，也激发了对底层技术的钻研精神。自此之后，技术宽度收窄，开始深挖。&lt;/p&gt;
&lt;p&gt;这一年的年终总结：&lt;a href=&quot;https://me.ursb.me/archives/2020.html&quot;&gt;2020，追逐星火&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;2021：中台与元宇宙&lt;/h3&gt;
&lt;p&gt;这一年中台概念兴起，我们也做中台；年底元宇宙兴起，我们又开始做 3D 渲染。&lt;/p&gt;
&lt;p&gt;这一年业务繁忙，被推着往前走，鲜有沉淀。&lt;/p&gt;
&lt;p&gt;这一年，从 T6 升到了 T9。&lt;/p&gt;
&lt;p&gt;这一年的年终总结：&lt;a href=&quot;https://me.ursb.me/archives/2021.html&quot;&gt;2021，自渡向前&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;2022：工程化&lt;/h3&gt;
&lt;p&gt;这一年年初升到了 T10。&lt;/p&gt;
&lt;p&gt;这一年专注 3D 渲染和 Web 工程化，但是成长不多，如果说成长率=学到的知识/时间，反思一下这两年的成长率是很低的。于是寻求突破，业余时间搞搞开源项目、看浏览器内核代码、写文章，虽然鲜有练手，但是知识储备上丰富了不少。&lt;/p&gt;
&lt;p&gt;这一年的年终总结：&lt;a href=&quot;https://me.ursb.me/archives/2022.html&quot;&gt;2022，平安喜乐&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;2023：iOS 与游戏渲染&lt;/h3&gt;
&lt;p&gt;这一年主要在做游戏渲染这块，技术上主要做 iOS 容器和 C++ 跨端，但同时也要写一些 ts 和 debug Android 问题。&lt;/p&gt;
&lt;p&gt;十年，大概就是这些啦。&lt;/p&gt;
&lt;p&gt;最后分享一下学习编程的技巧，其实从前文也能看出来，最核心的是热爱，其次是要以项目为中心，学了什么就想着去做个东西出来用，但还有一些文章里没有谈到——需要沉淀。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;学习过程：看官网文档即可。&lt;/li&gt;
&lt;li&gt;应用过程：以项目为目标是为了加深对前一个环节的理解，同时做出东西出来也很有成就感。&lt;/li&gt;
&lt;li&gt;沉淀过程：开发记录总结，写博客分享。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;学习过程中除了做笔记：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109204530@2x.jpg&quot; alt=&quot;&quot; /&gt;对问题的深入研究也需要把核心点画出来：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109161956@2x.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109141638@2x.jpg&quot; alt=&quot;&quot; /&gt;画出来可以贴图记录现场，同时思路是白板般的四处扩散，这个比普通的笔记记录好。&lt;/p&gt;
&lt;p&gt;最后知识的输出就在于勤写技术博客。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109210427@2x.jpg&quot; alt=&quot;&quot; /&gt;希望自己还能在这条热爱的道路上再走出下一个不一样的十年。&lt;/p&gt;
&lt;h2&gt;🌺 生活点滴&lt;/h2&gt;
&lt;p&gt;以下是十月里一些瞬间的记录。&lt;/p&gt;
&lt;p&gt;🚗 国庆假期自驾游&lt;/p&gt;
&lt;p&gt;自驾路线：深圳-顺德-广州-清远-英德-从化-广州-深圳&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/1048d08dfe540604a2f9d324078bea7.jpg&quot; alt=&quot;&quot; /&gt;感想：清远漂流真好玩！&lt;/p&gt;
&lt;p&gt;🧟♀️ VR 打丧尸&lt;/p&gt;
&lt;p&gt;国庆的末尾去广州见了高中同学，四个人一起玩了 VR 打丧尸，贼有意思。&lt;/p&gt;
&lt;p&gt;还抓了一堆娃娃：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109211134@2x.jpg&quot; alt=&quot;&quot; /&gt;🎧 AirPods Pro&lt;/p&gt;
&lt;p&gt;之前的耳机被洗衣机洗了，有时候播音乐会有杂音，但也勉强继续用了两年，这次换了一个新出的 USB-C 口的 AirPods：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109211408@2x.jpg&quot; alt=&quot;&quot; /&gt;🚗 保时捷&lt;/p&gt;
&lt;p&gt;和一个土豪朋友去试驾了 718 boxster，感觉我更喜欢我的 Mini 了。&lt;/p&gt;
&lt;p&gt;🏄🏻 团建&lt;/p&gt;
&lt;p&gt;部门团建，去了惠州的一个岛上（第一次坐帆船）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109211643@2x.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109211557@2x.jpg&quot; alt=&quot;&quot; /&gt;🏃🏻♀️ 体重&lt;/p&gt;
&lt;p&gt;从小到大，基本都在 55 kg 左右，从来没超过 60。最近一直在上涨，感觉有望突破 65。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109211709@2x.jpg&quot; alt=&quot;&quot; /&gt;🐱 手套&lt;/p&gt;
&lt;p&gt;手套最近特别喜欢蹂躏这只狗，每天把这狗藏起来晚上，手套总能把它拖出来打一番：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109211241@2x.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;🎬 书影音&lt;/h2&gt;
&lt;p&gt;以下是这个月的书影音：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在读：心理学 |《存在主义心理治疗》| ★★★★★&lt;/li&gt;
&lt;li&gt;在看：美剧 |《洛基2》| ★★★★☆&lt;/li&gt;
&lt;li&gt;在看：日漫 |《咒术回战2》| ★★★★★&lt;/li&gt;
&lt;li&gt;在看：日漫 | 《间谍过家家 2》| ★★★★★&lt;/li&gt;
&lt;li&gt;在看：纪录片 |《地球脉动3》| ★★★★★&lt;/li&gt;
&lt;li&gt;重温：剧集 | 《沉默的真相》| ★★★★★&lt;/li&gt;
&lt;li&gt;看过：剧集 | 《繁城之下》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看过：电影 | 《请叫我英雄》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看过：电影 | 《坠落的审判》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看过：电影 | 《坚如磐石》| ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-24&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>月刊（第23期）：多任务中的时间管理</title><link>https://ursb.me/posts/weekly-23/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-23/</guid><description>分享多任务工作下的时间管理方法,用日历与提醒事项区分固定日程与待办琐事,强调保持专注、减少任务切换以进入心流状态,兼记九月转岗与生活片段。</description><pubDate>Fri, 06 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本篇是对二〇二三年九月生活的记录与思考。&lt;/p&gt;
&lt;h2&gt;多任务中的时间管理&lt;/h2&gt;
&lt;p&gt;这期应读者期望，聊一聊时间管理。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/IMG_0207.jpg&quot; alt=&quot;&quot; /&gt;对时间的管理有两个基本方面：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;做事前，对时间的分配&lt;/li&gt;
&lt;li&gt;做事时，对时间的使用&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;分配时间：区分优先级&lt;/h3&gt;
&lt;p&gt;每个人的精力是有限的，但事儿却接近是无限的——工作会有一堆待安排的事儿，生活中也会有许多琐事需要去做，那么如何合理地安排好自己有限的时间呢？&lt;/p&gt;
&lt;p&gt;简单分享下自己的方法：日历+提醒事项。其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;日历：用来记录 &lt;strong&gt;已固定时间的、不得不去做事项&lt;/strong&gt;。即，我的这段时间固定被这个时间段的 &lt;strong&gt;Event&lt;/strong&gt; 消费掉，需要安排进日历里。比如会议、球局、饭局等等。（下图中原点打头的就是 Event）&lt;/li&gt;
&lt;li&gt;提醒事项：用来收集琐事和待办，它们是一个一个 &lt;strong&gt;Things&lt;/strong&gt;，可以相对地根据优先级的不同被灵活安排。如工作的待办、生活中的琐事等等。（下图√打头的就是 Things，已经完成的就可以勾上）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231006155233@2x.png&quot; alt=&quot;&quot; /&gt;软件这里我的用的是 Fantastical，使用了 iCloud 的 Apple 日历和 Todoist。之所以使用 Todoist 是看中了它的开放性和集成能力，可以在 Obsidian、Raycast 等各种三方软件中被集成进去。TODO 类的软件有很多，用自己喜欢的、顺手的就好。&lt;/p&gt;
&lt;p&gt;当然，没有特别需求的话，用 Apple 的日历和 Apple 提醒事项也就 OK 了。&lt;/p&gt;
&lt;p&gt;工具介绍好了，那么具体该如何分配时间呢？这里可以灵活安排的时间主要是 Things，这里有几个小技巧可以分享一下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;根据优先级分配：高优且紧急的必须立刻做，低优或者生活琐事我会安排在早上起床或者晚上睡前统一处理。（至于如何区分优先级，考虑的因素有很多，此处不扩展说了）&lt;/li&gt;
&lt;li&gt;根据自己的专注时间段分配：发掘自己的专注时间段，是晚上效率高还是下午效率高，把一整段时间空出来，然后把相对困难或重要的事情放在这个时间段去处理。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当然，事情可能会在工作中随时安排进来，来了事之后，如果是非紧急的事情就不要停下手上的工作，而是把它们先放进 Things 的收集箱（Inbox）里，待切换工作上下文的间歇再去回顾、安排、调整 Inbox 和已安排实现，看看优先级和时间段是否需要变化。&lt;/p&gt;
&lt;h3&gt;消费时间：保持专注、全力以赴&lt;/h3&gt;
&lt;p&gt;时间对于每个人而言都是公平的，每个人的一天都是 24 小时，那保持高效的时间利用率就能把更多的精力节省出来做更多的事。&lt;/p&gt;
&lt;p&gt;前两年的年终总结中我说过自己不擅多线程工作，后来做了一番调整，核心要点在于——一天中保持尽可能长的专注时间、尽可能少的切换工作上下文。&lt;/p&gt;
&lt;p&gt;前两周的《纽约时报》有&lt;a href=&quot;https://www.nytimes.com/2023/05/28/opinion/artificial-intelligence-thinking-minds-concentration.html&quot;&gt;一篇文章&lt;/a&gt;写到：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;多任务处理在很大程度上是一个神话。我们可以一次只专注于一件事。“这就像我们头脑中有一块内部白板，”马克说。“如果我在做一项任务，我的大脑白板上就有我需要的所有信息。然后我转而使用电子邮件。我必须在脑海中抹去那块白板，写下写电子邮件所需的所有信息。就像在真正的白板上一样，我们的脑海中可能会有残留物。我们可能还在想着三项任务之前的一些事情。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;多线程工作会占用我们的认知资源，也会干扰我们的工作记忆，更会摧毁我们进入心流的可能性。因此工作中需要尽可能保持专注，摒除非工作的影响因素和尽量避免被打断。回过头来看，人类在文化领域的成就，包括哲学思想，都归功于人类深刻、专一的注意力。而随着功绩社会的兴起，这种深度注意力却日益边缘化。&lt;/p&gt;
&lt;p&gt;我们知道，经济学是研究社会中稀缺资源如何分配的问题，而如果我们将这个概念中的「社会资源」置换成「个人资源」后，稀缺的概念和原则依然适用，&lt;strong&gt;一个人最稀缺的资源可以概括提炼为「时间、精力、注意力、专注力」&lt;/strong&gt;，这些资源使用在一个地方的时候，就不能使用在另一个地方了。&lt;/p&gt;
&lt;p&gt;《稀缺》一书中谈到一个观点：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;人的大脑就像一条道路，有自己的「带宽」。当这条道路被某些东西占满时，人就会耗尽认知资源，陷入「满负荷」的状态，无暇去思考其它的东西。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;综上，高效的秘诀在于「专注」。&lt;/p&gt;
&lt;p&gt;我一直在用「Rize」，它不单纯是一个简单的 Time Tracer 工具：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231006123136@2x.png&quot; alt=&quot;&quot; /&gt;而是一个培养 Focus 的工具。同一软件或是保持在同一工作上下文中保持一段时间，会进入 Focus 状态（类似心流），这个时间会统计 Focus 时间。而如果你突然切出上下文，如打开微信或者用浏览器浏览了这个上下文无关的网页，Rize 会认为此刻你分心了，从而弹出保持 Focus 提示并退出此轮 Focus 计时。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231006123244@2x.png&quot; alt=&quot;&quot; /&gt;整个软件设计地异常简单，整个流程不需要去配置任何东西，结合 AI 进行全自动的监测，只有在娱乐或者是打断 Focus 的时候才会感知到它的存在。（PS: 这不是广告，但如果想体验可以用 &lt;a href=&quot;https://rize.io?code=291287&amp;amp;utm_source=refer&amp;amp;name=Airing&quot;&gt;https://rize.io?code=291287&lt;/a&gt; 链接来注册…）&lt;/p&gt;
&lt;p&gt;当然，再完美的软件也无法替代时机的行动，世界上多的是一张白纸也能把自己的生活安排得明明白白的时间管理大师，研究多少方法论，也不如老老实实做事实在。决定时间价值的，不是你拥有什么，而是你产出了什么。&lt;/p&gt;
&lt;p&gt;对于我们的时间，重要的不是「当下的回报」，而是它的成长性和可能性。培养练习自己对于个人能力的认知、对于时间的感觉，从而合理调整安排自己的精力资源和时间资源，在有限的时间和有限的资源下产出更多的成果。&lt;/p&gt;
&lt;p&gt;对于有限的时间，也无需过于焦虑，无论面对多少事情，全力以赴便是幸福。当我们准备做一件事时，无论这件事情大小，无论这件事在社会评价体系中的重要性如何，郑重地将自己全部投入进去，不计得失地投入自己的才华、注意力和时间，就会从心底感受到一种愉悦和对自己的肯定。&lt;/p&gt;
&lt;p&gt;或许一切如同上期月刊中分享的《时之形》中说的那样：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“与其挣扎求索，不如素然以对，或许那样才能画出相对美丽的生命轨迹。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;🌺 生活点滴&lt;/h2&gt;
&lt;p&gt;以下是一些瞬间的记录。&lt;/p&gt;
&lt;p&gt;🔨：啥都敲工程师&lt;/p&gt;
&lt;p&gt;转了岗之后开始啥都敲，有点终端全栈了。日常对渲染的研究日渐深入，经常一个小问题卡两三天，但是解决之后成就感满满。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231006124058@2x.png&quot; alt=&quot;&quot; /&gt;那之后，心情和心态一直在变好。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/IMG_0409.jpg&quot; alt=&quot;&quot; /&gt;📱 iPhone 15 Pro&lt;/p&gt;
&lt;p&gt;换了新手机，感觉没啥变化=。=&lt;/p&gt;
&lt;p&gt;🐬 错峰度假&lt;/p&gt;
&lt;p&gt;国庆前一周请了个周五的假，凑三天小长假去长隆玩了圈~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/IMG_0046.jpg&quot; alt=&quot;&quot; /&gt;🌇 夕阳&lt;/p&gt;
&lt;p&gt;某日晚饭后回到工位，惊鸿一瞥的夕阳。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/IMG_6518.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;🎬 书影音&lt;/h2&gt;
&lt;p&gt;以下是近两个多月的书影音：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在读：哲学 |《&amp;lt;资本论&amp;gt;的读法》| ★★★★★&lt;/li&gt;
&lt;li&gt;读完：小说 |《人类灭绝》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《奥本海默》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《孤注一掷》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《封神：朝歌风云》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《末日崩塌》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《变形金刚：超能勇士的崛起》| ★★☆☆☆&lt;/li&gt;
&lt;li&gt;在看：日漫 |《咒术回战2》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：日漫 |《咒术回战》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：日漫 |《钢之炼金术师FA》| ★★★★★&lt;/li&gt;
&lt;li&gt;在看：韩剧 |《超能异族》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：日剧 |《VIVANT》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看完：古装 |《莲花楼》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看完：现代 |《装腔启示录》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：纪录片 |《地球脉动2》| ★★★★★&lt;/li&gt;
&lt;li&gt;在玩：Switch |《塞尔达传说：王国之泪》| ★★★★★&lt;/li&gt;
&lt;li&gt;在玩：Steam | 《地平线 5》| ★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;刚看动漫粉上五条悟，结果隔天在漫画里就人设崩塌了… By the way，《钢炼》不愧为经典神作。&lt;/p&gt;
&lt;p&gt;最后一个小广告，我在 TG 上注册了 Channel，利用 Bot 和 WebHook 实现了个行为收集站，每当我发了月刊、博客或者收藏了一些网页、文章，Bot 都会在 Channel 里进行自动通知，有兴趣的朋友可以订阅：&lt;a href=&quot;https://t.me/airingchannel&quot;&gt;https://t.me/airingchannel&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231006125707@2x.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-23&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>月刊（第22期）：当下的快乐</title><link>https://ursb.me/posts/weekly-22/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-22/</guid><description>探讨如何在压力中体会当下的快乐,提出珍惜当下瞬间与知觉生活快乐两条路径,并记录本月患病、生日、转岗iOS开发、搬家及加入W3C无障碍工作组等经历。</description><pubDate>Sun, 13 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本篇是对二〇二三年五月至八月生活的记录与思考。&lt;/p&gt;
&lt;p&gt;最近周末比较忙导致断更了，感谢催更同学的关注：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20230810231510@2x.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20230810231537@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;💐 当下的快乐&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;本文标题来源于莪默·伽亚谟《鲁拜集》——“&lt;strong&gt;享受当下的快乐，因为这一刻正是你的人生。&lt;/strong&gt;”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;PS. 我一直把月刊中的文章定位为“自我对话”，只有对话结果满意的文章我才会拿出来修整一番重新在博客上发布。因此如果这篇文章最终行文紊乱，请多包涵，我也没有把握仅靠一篇文章就把这个议题讲清楚。此外，如果读者发觉文章中可能含有说教意味，请无视；如果有，那么这部分应该是我对自己的说教。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;求而不得的意义感&lt;/h3&gt;
&lt;p&gt;是否已经很久没有过快乐的感觉了？&lt;/p&gt;
&lt;p&gt;在如今的环境下生存，人们对意义的感受会通常和焦虑联系在一起。追求生活的意义，找寻存在的价值，最后得出的结论无外乎“好好努力”——从而不断压榨自己的精力和时间去追求产出、追求实用、追求充实，将自己的生命意义定义在「努力焦虑」之下。&lt;/p&gt;
&lt;p&gt;仿若人生在命运之中逆水行舟，不进则退。在这种压力之下，内心难以平静，也很难完全放下心来去体会快乐是什么；而另一部分人们则选择完全躺平，放弃去追逐意义感以摆脱「努力焦虑」；还有一部分人则在内卷和躺平之间不断做仰卧起坐。（至于如何在生活和工作之间保持平衡，这又是一大话题。这个问题的完美解和每个人的生活节奏有关系，暂且不展开说了。）&lt;/p&gt;
&lt;p&gt;从前的我会觉得在学习和工作之余的快乐瞬间总是伴随着的是莫名其妙的负罪感，当然这不是刻意为之，而是小时候各方面歌颂苦难的教导——“今天吃的苦会在未来收获甜，而今天如果感受到甜，那不久的将来一定会吃到苦”。&lt;/p&gt;
&lt;p&gt;后来想了想，人只有在背离自己的内心时才会害怕，从而诞生出焦虑和负罪感。&lt;/p&gt;
&lt;p&gt;我们害怕的是无法坦然面对自己；&lt;/p&gt;
&lt;p&gt;我们害怕的是碌碌无为终此一生；&lt;/p&gt;
&lt;p&gt;我们害怕的是对意义感的求而不得。&lt;/p&gt;
&lt;p&gt;有位领导对我说：“如果自身的内心是充实的，那么即便一生卖烧饼，也是有价值的一生。”&lt;/p&gt;
&lt;p&gt;思索一番，这番话并不是鼓励出世，也不是让我对环境和命运妥协。如果拼尽全力，发现自己的命运真的是无法抗争，那就认清它——“事实就是这么悲哀，不是所有人都能功成名就，我们中有些人注定要在日常的点滴中去寻找生命的意义。”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/image_1691909877629_0.png&quot; alt=&quot;&quot; /&gt;即便如此，也不要忘记“甘于平凡的勇气”。&lt;/p&gt;
&lt;p&gt;如果大环境无法改变，如果命运无法抗争，那么人类最后自由就只剩下自己对生活的态度了。正所谓“所有东西都能被抢走，除了一件事，人类最后的自由——去选择在当前环境下自己的态度，选择自己的方式。”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/image_1691909958474_0.png&quot; alt=&quot;&quot; /&gt;这又让我想到了之前在《心灵奇旅》幕后采访中看到的一句话：“&lt;strong&gt;成就不在于外在定义，全看是否按自己的意愿在活。&lt;/strong&gt;”&lt;/p&gt;
&lt;p&gt;那么这个问题的解法在于“当下的快乐”，具体有二：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;珍惜每个当下瞬间&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;知觉生活中的快乐&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;珍惜每个当下瞬间&lt;/h3&gt;
&lt;p&gt;人是一个一个的、在不同瞬间的“存在”，人之所以成为人，乃因为他存在。换言之，如阿德勒所言：“&lt;strong&gt;人生是一连串的刹那，最重要的是此时此刻。&lt;/strong&gt;”&lt;/p&gt;
&lt;p&gt;要知道当下的瞬间就只有当下，没有过去、也没有未来——对过去的后悔，以及对未来的担忧，正是影响我们生活和工作的最大敌人，也是破坏我们幸福感的元凶。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/image_1689677717149_0.png&quot; alt=&quot;&quot; /&gt;我们常会遗憾未曾选择的路，会常常去想如果当时我不这样去选，而走另一条路会不会当下的结果会更好一些？&lt;/p&gt;
&lt;p&gt;然而一切其实都不可知，《重启人生》中就戏谑地表达了所谓“最优选择”的结局，即便重启人生不断尝试走了另一些路，回头来看，或许还不是最初的选择。《寻找天堂》中的 Sopia 说：“人的一生如此短暂，我们不可能完成每一件想做的事。无论我们做了什么，总有其他东西值得一试，总有另一条路值得一走。所以到最后，我们能做的，也是必须做的，是满足于自己所选择的路。”&lt;/p&gt;
&lt;p&gt;要知道，现实没有如果，我们有的只有一个一个当下的瞬间，在当下的瞬间做出的选择无论结果怎样，它就是最好的。&lt;/p&gt;
&lt;p&gt;珍惜当下，珍惜此时此刻，珍惜身边的一切。我衷心希望所有人都能学会感受这些瞬间，而不要让它们白白地溜走。&lt;/p&gt;
&lt;h3&gt;知觉生活中的快乐&lt;/h3&gt;
&lt;p&gt;首先要知道，是快乐构成了我们生命中的幸福感，而不是其他。&lt;/p&gt;
&lt;p&gt;在压力较大的环境下，我更喜欢一些轻量化的情绪出口，或许越简单、单纯、质朴的东西，越能净化心灵。我特别喜欢看“每日豆瓣”中推送的文章，千奇百怪的豆瓣小组中总会有那么些人喜欢分享身边的开心事儿：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;很多时候，似乎下意识觉得，快乐不是一件像工作、学习那样的正经事。所以，每天会安排工作学习，却不怎么安排快乐的事。 但有时候还是会随机做点快乐的事，比如学唱喜欢的歌、练习吉他、看电影、写日记、查菜谱做自己喜欢的菜、做奶茶等饮料、趴窗台发呆（看云，看楼下的老人小孩）、看跟最近问题有关的书等等。——罗恬恬&lt;/li&gt;
&lt;li&gt;喜欢看天，看云卷云舒，看晚霞变色，很放松，最近大理的天空都是七彩祥云，今天等了一个傍晚真的看到了一点点就很开心。还喜欢让阳光透过窗帘洒在书上一点点看书，光影斑驳但是却很幸福。可以收拾房间分门别类，清理不需要的东西，会很治愈。——浪漫小孩&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;能够知觉生活中的快乐是一种值得羡慕的能力，然而这种知觉力本身就很难得。在 &lt;a href=&quot;https://me.ursb.me/archives/299.html#directory095888137327391123&quot;&gt;《谈谈存在的价值与人生体验》&lt;/a&gt; 一文中我曾写过“敏感决定了对世界的感知边界（轮廓）”。《德米安》也不断强调知觉的重要性——“只要他对此没有知觉，他就只是一棵树，一块石子，最多称得上是一个动物。然而，当这种知觉开始闪出第一道微光时，他便成了一个人。在你的眼中，或许并非所有走在大街上的两腿动物都能称得上是人，虽然他们也能直立行走，生儿育女。你心里明白，其中大多数人仍是鱼羊虫豸之辈，多少人生如蝼蛄！当然，每个人其实都有变成人的无数可能，但只有他了解到这些可能性的存在，甚至有意识地去认识这些可能性时，他才真正拥有它们。”&lt;/p&gt;
&lt;p&gt;那么如何培养这种感知快乐的知觉力呢？我总结了一下，有以下四个途径：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;慢下来&lt;/li&gt;
&lt;li&gt;培养专注&lt;/li&gt;
&lt;li&gt;拉长视野&lt;/li&gt;
&lt;li&gt;永葆善良&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;一、慢下来&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;把注意力从瞬息万变的外界抓回来，不要被外界的信息爆炸所吸引。需要更多地去关注自己的内心，关注每一天的感受。写日记就是一个不错的办法——“记录幸福快乐的体验，重温那种良好感觉能让人更快乐。写下坏事，发泄式地写，可以宣泄痛苦情绪，帮助恢复心理健康。”在&lt;a href=&quot;https://weekly.ursb.me/posts/weekly-19/&quot;&gt;《WJ.19: 日记的意义》&lt;/a&gt;里写过日记的好处，这里就不展开了。&lt;/p&gt;
&lt;p&gt;我们的生活只有在慢下来，去关注它的时候，它才切实存在。同时我们追求高效，是为了可以慢下来去体验生活，而不是失去生活。&lt;/p&gt;
&lt;p&gt;没有任何事比好好睡觉、开心、健康更重要。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二、培养专注&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;《如何应对心里的难》说到：”当我们真的调用全部的身心资源，带着「究竟发生了什么」的好奇感去感知一个苹果、一棵树、一个人、一件事，或者感知我们自己的肌肉、温度、心跳、呼吸等体验变化时，我们会瞬间进入“忘我”状态，也会因此体验到宁静、祥和，以及无意识的喜悦。 ”&lt;/p&gt;
&lt;p&gt;当我们全身心地投入在手头所做的事情上，沉浸在它所带给自身的反馈和感受之中，体验着当下的每一瞬间——这种心流状态中的的心绪将一片宁静，不会有任何烦恼和忧虑。这是一种特别舒服的状态，会感到跟这个世界融为一体，时间仿佛停止了走动，心灵被满足感充盈，真切地感受到自己的存在。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三、拉长视野&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们的生命是属于自己的，我们所度过的每一分、每一秒，都是自己切切实实的人生。如果人生不能以喜欢的方式度过，那岂不是在浪费生命，这一切又有什么意义呢？&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/image_1689659167533_0.png&quot; alt=&quot;&quot; /&gt;拉长视野来看，人生很广阔，或许大多数人是平凡的，但是没有人会是平庸的。所有人都拥有同一个起源和母亲，我们来自同一个深渊，然而人人都在奔向自己的目的地，试图跃出深渊。我们可以彼此理解，然而能解读自己的人只有自己。&lt;/p&gt;
&lt;p&gt;每个人都与众不同，每个人的生命都是通向自我的征途，是对一条道路的尝试，是一条小径的悄然召唤。人们从来都无法以绝对的自我之相存在着，每一个人都在努力地去找寻、去成为绝对自我，这个过程中有人迟钝，有人更洞明，但无一不是自己的方式。选择自己喜欢的方式去度过一生，多去体验人生，那么当下的每个瞬间都会是快乐的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/image_1689658461558_0.png&quot; alt=&quot;&quot; /&gt;没有那么多大不了的问题，需要如此枕戈待旦，天天紧张得要死。生活中该是有些意料之外的好东西的，会被一些偶然送到我们身边。&lt;/p&gt;
&lt;p&gt;人呢，只要看穿了这个世界的矫饰，世界便会属于你。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/image_1689658437726_0.png&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;四、永葆善良&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个点在&lt;a href=&quot;https://me.ursb.me/archives/299.html#directory095888137327391123&quot;&gt;《谈谈存在的价值与人生体验》&lt;/a&gt; 一文中也曾谈到过，不过那个时候是以建立联结的角度去分析的，不再重复赘述。&lt;/p&gt;
&lt;p&gt;这里补充想介绍下《悉达多》中的佛陀乔达摩，他熟稔人性的无常、空幻，却依然深爱并倾尽一生去助佑、教导世人。“在这位伟大的导师心中，爱事物胜于爱言辞。他的作为和生命重于他的法义。他的仪态重于言论。他的伟大不在他的法义中、思想中，而在他的生命中。”&lt;/p&gt;
&lt;p&gt;认识到了乔达摩的伟大智慧，悉达多说道，”对于我来说，爱乃头等要务。审视世界、解释世界或藐视世界，或许是思想家的事。我唯一的事，是爱这个世界。不藐视世界，不憎恶世界和自己，怀抱爱，惊叹和敬畏地注视一切存在之物和我自己。“&lt;/p&gt;
&lt;p&gt;我想，如果可以达到此种人生状态，对世界抱有爱，对万物怀揣善意，那么生命中的每一刻也都将是最纯粹的快乐。&lt;/p&gt;
&lt;h2&gt;🌺 生活点滴&lt;/h2&gt;
&lt;p&gt;最近两个月经历了很多事，算是工作以来最坎坷的一段时间了，过程和细节就先省略不说了，曾处在焦虑和不快乐的状态中，还好调整回来了（这也是这期选题《当下的快乐》的原因）。以下是一些瞬间的记录。&lt;/p&gt;
&lt;p&gt;🐑：六月一日，阳了&lt;/p&gt;
&lt;p&gt;终于还是中招了，首阳非常难受，基本只能躺着不能动，以至于鸽了5月的月刊。阳了的第二天，高烧中发现自己手脚开发发麻，直到最后只能维持在一个奇怪的姿势无法动弹。幸亏 Belle 在，给我抬去了医院。检查之后是由于过度呼吸导致碱中毒，从而引发了手脚搐搦，控制呼吸节奏就自己好了。虽然没啥问题，但是我在过程中还是想了很多——应该把握住每一个当下的体验，好好地去利用宝贵而有限的生命。&lt;/p&gt;
&lt;p&gt;🎂：六月三十日，生日&lt;/p&gt;
&lt;p&gt;今年生日没有发朋友圈，因为我比较排斥这一天的到来——毕竟 28 岁了，开始感到年龄的焦虑了。&lt;/p&gt;
&lt;p&gt;🤒：七月，肠胃炎+扁桃体炎发烧&lt;/p&gt;
&lt;p&gt;不知道吃了啥坏东西，双症齐发直接搞到了40度，去医院之后医生开了一堆药（还得按一定的规则食用和储藏），药很管用，吃了两天直接就好了。&lt;/p&gt;
&lt;p&gt;🏸：羽毛球&lt;/p&gt;
&lt;p&gt;身体好了之后开始恢复打球，周三、周六、周日三选二，基本保持一周两场的状态。&lt;/p&gt;
&lt;p&gt;👨🏻💻：工作，尝试转 iOS 开发&lt;/p&gt;
&lt;p&gt;工作这块最近变动有点大，这段时间认识了很多优秀的人，也遇到了一些赏识我的人。我能感觉到这些目光中对我抱有的极大的期待，但也很害怕自己的表现会让他人的期望落空。总之，能做的就是自己好好努力——尽我所能，把当下的事情做好。此外，工作内容也从 Web 开始转 iOS 开发，并钻研着我喜欢的技术需求，一直向往着客户端岗位总算得到了机会，希望这一切都在变好吧。&lt;/p&gt;
&lt;p&gt;🏠：搬家&lt;/p&gt;
&lt;p&gt;依依不舍离开了满分的房子，附房间纪念图一张：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/IMG_6288.jpg&quot; alt=&quot;&quot; /&gt;（不过搬到了120 分的新屋子！）&lt;/p&gt;
&lt;p&gt;👩🏻🦯：W3C&lt;/p&gt;
&lt;p&gt;加入了 W3C 无障碍工作组，在工作组会议上见识到了社区的工作模式，看到了一堆牛逼的外国同行。如果以后能够为无障碍领域贡献出自己的一份力，也算是达成了职业理想吧。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20230813143809@2x.png&quot; alt=&quot;&quot; /&gt;🏆：公司培训&lt;/p&gt;
&lt;p&gt;这两个月参加了个公司级的培训项目，通过项目认识了优秀的同组同学，希望未来能维持“革命友谊”。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/Pasted%20image%2020230810234446.jpeg&quot; alt=&quot;&quot; /&gt;🍵：校招分享&lt;/p&gt;
&lt;p&gt;荣幸参加了公司校招培训的座谈会分享，结识了同年龄段优秀的人。&lt;/p&gt;
&lt;h2&gt;🎬 书影音&lt;/h2&gt;
&lt;p&gt;以下是近两个多月的书影音：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;读完：哲学 |《德米安》| ★★★★☆&lt;/li&gt;
&lt;li&gt;在读：经济 |《经济学原理：微观经济学》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：剧集 |《恶鬼》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：剧集 |《D.P：逃兵追缉令》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：剧集 |《漫长的季节》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：剧集 |《隐秘的角落》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：剧集 |《都挺好》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看完：剧集 |《白夜追凶》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《蜘蛛侠：纵横宇宙》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：电影 |《网络迷踪2》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：电影 |《雷神4：爱与雷霆》| ★★☆☆☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《银河护卫队3》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：电影 |《消失的她》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《八角笼中》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《人生路不熟》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;重温：电影 |《禁闭岛》| ★★★★★&lt;/li&gt;
&lt;li&gt;重温：电影 |《星际穿越》| ★★★★★&lt;/li&gt;
&lt;li&gt;重温：电影 |《盗梦空间》| ★★★★★&lt;/li&gt;
&lt;li&gt;重温：电影 |《信条》| ★★★★★&lt;/li&gt;
&lt;li&gt;玩过：Steam |《Thronefall》| ★★★★★&lt;/li&gt;
&lt;li&gt;玩过：Steam |《时之形》| ★★★★★&lt;/li&gt;
&lt;li&gt;在玩：Switch |《塞尔达传说：王国之泪》| ★★★★★&lt;/li&gt;
&lt;li&gt;在玩：Steam |《潜水员戴夫》| ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;重点安利一下 NExTStudios 和 oooooohmygosh 老师出品的小游戏《时之形》&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/Pasted%20image%2020230813164144.png&quot; alt=&quot;&quot; /&gt;《时之形》由&lt;strong&gt;15个场景&lt;/strong&gt;构成，参考了众多哲学家对时间的思考，引用官方的一句文案来介绍：“哲学常以文字叙述，时间则常以数字时钟定义，两者都难以具象。不限于语言，《时之形》借助运动、反馈、视听给时间和哲学更丰富而具体的感知。在体验《时之形》的过程中，你仿佛看到、听见并触摸时间的形状，甚至开启生命和哲学之思，尤在夜深人静之时。”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/Pasted%20image%2020230813164317.png&quot; alt=&quot;&quot; /&gt;思考是有限的碎片，时间是连续的情感。与其挣扎求索，不如素然以对，或许那样才能&lt;strong&gt;画出美丽的生命轨迹。&lt;/strong&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-22&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>月刊（第21期）：快节奏时代下的短视频</title><link>https://ursb.me/posts/weekly-21/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-21/</guid><description>探讨快节奏时代短视频对注意力的侵蚀,从倍速播放、三分钟解说电影、抖音神曲谈到淄博烧烤等文化狂欢现象,反思短视频消解深度思考、解构崇高的隐忧。</description><pubDate>Wed, 03 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本篇是对二〇二三年四月生活的记录与思考。&lt;/p&gt;
&lt;h2&gt;🚀 快节奏时代下的短视频&lt;/h2&gt;
&lt;p&gt;关于周刊选题我有一个 LogSeq 的白板，当我发现某个选题的素材准备的差不多时就会拿出来写写分享一下，也算作话题的总结。写了一个题目就在白板里划掉一个选题，剩余的选题储备长期维持在 5 个左右。&lt;/p&gt;
&lt;p&gt;而短视频这个话题在我的选题白板里已经躺了大半年了，每次周刊想写它都会发现准备的还不够充分，写起来会比较复杂，就一直拖着不写，长期躺在白板的角落里。这次之所以决心拿出来写，主要也是前段时间的一些新闻和 B 站的商业化让我有些感受，想写出来分享下。&lt;/p&gt;
&lt;h3&gt;注意力的散失：倍速播放、三分钟电影、抖音神曲&lt;/h3&gt;
&lt;p&gt;移动互联网时代以来，我们几乎无时无刻都不在接收新的信息，各种热搜、头条、热点 Push 充斥着眼球。同时人人都有选择，导致信息方向四散。经过这种日积月累的刺激，让我们的注意力变得越来越亢奋。随着时间推移，人们能够集中注意力的时间是越来越短的，注意力容易散失、难以被捕获专注。 &lt;strong&gt;我们越来越不满足于慢吞吞的、起承转合的内容和信息，而是希望在更短的时间里面，获得更多的新鲜刺激。&lt;/strong&gt; 因而，一个极其适合这个时代的产物就应运而生了：倍速播放。&lt;/p&gt;
&lt;p&gt;而我个人非常讨厌倍速播放，我认为影音剧集所要呈现的是导演、编剧想要给我们讲的故事，是影像与声音高度浓缩的内容产物，它将创作者对人生的思考、对理想世界的想象等信息压缩在数个小时的画面里面里，因此需要观众慢慢欣赏。其中音效、鼓点、节拍、表情变化、剧情张力都是依靠屏幕内外唯一可以穿越的真实——时间的流动——让观众尽可能确切感受到屏幕内的故事。&lt;/p&gt;
&lt;p&gt;比如《星际穿越》主角团探索高重力的米勒水星，BGM 里杂夹着秒表的滴答声，暗示着米勒星球的时间流逝缓慢，一小时等于地球七年，从而塑造主角团需要去争分夺秒的紧迫感。除此之外的例子还有很多很多，这里就不展开说了。如果一部片需要倍速去看，那可能说明它的信息容量不够、或者是不够精彩深刻，那也没有必要去观看。&lt;/p&gt;
&lt;p&gt;然而短视频领域里，对快节奏还有更极端的呈现方式——三分钟电影。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;三分钟电影解说既不是电影，也不是解说，它更像是一管管高度提纯的多巴胺，通过眼睛「注射」到你的身体里，让你享受短时间摄取超量信息的快感，而代价则是慢慢失去与角色共情的能力，失去欣赏光影、音乐的耐心，最终好不容易培养起来的观影能力退化得一干二净。——&lt;a href=&quot;https://www.ifanr.com/1524332&quot;&gt;「小帅和小美」，用三分钟毁掉电影 | 爱范儿&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在这三分钟的电子榨菜里，精妙绝伦的镜头设计直接被抽离，只留下猎奇的画面抓住观众的眼球；跌宕起伏的背景音乐也被换成了激昂慢摇舞曲，刺激你不断分泌肾上腺素提高你的专注度；充满张力的剧情变换也只剩下突兀的猎奇。一切的一切，都在为我们的眼球服务，因此信息浓度高到极致，时长尽可能短暂，AI 的台词节奏也被加快，生怕你下一秒离开了这里。&lt;/p&gt;
&lt;p&gt;而我们貌似非常喜欢这套，因为它总能抓住我们孱弱的注意力，它不会让我们的注意力轻易散失，一直一直被抓住，着了魔一样不断往下滑动，于是，我们的时间也被它偷走了。&lt;/p&gt;
&lt;p&gt;除了电影剧集，音乐领域也难逃魔抓。&lt;/p&gt;
&lt;p&gt;要论播放量，周杰伦的歌可能现在可能还还真的不如动辄破十亿的抖音神曲。当下流行的歌曲，比如抖音神曲，跟过去的流行金曲的根本区别在于：音乐不再是审美导向，而变成了&lt;strong&gt;用户行为导向&lt;/strong&gt;。抖音神曲已经有着成熟的批量制造流水线，从热点捕捉、创作编曲、到录制上线，整个过程只需要花一天时间，每个环节都通过大数据精密计算，务求每个节拍都踩在用户爽点上。&lt;/p&gt;
&lt;p&gt;音乐心理学领域的同行评审期刊 Musicae Scientiae 2017 年的一篇研究中，分析了 1986 年至 2015 年的 303 首美国 Top 10 单曲，发现在 1980 年代歌曲前奏普遍超过 20 秒，如今基本已经缩短到 10 秒之内。一首歌的平均长度，从以前的4分10秒下降到大约 3 分 30 秒，2021 年美国 Top 50 歌曲平均时长更短，仅为 3 分 7 秒，其中 38% 的歌曲甚至不到 3 分钟。这表明人们的关注周期越来越短，如果不能很快听到精彩部分，就会感到不耐烦、不再听下去。&lt;/p&gt;
&lt;p&gt;最近很喜欢听的蔡健雅的《达尔文》 ，前奏 28 秒，歌曲时长 4 分 25 秒，还有经典的《爱在西元前》，就像音乐制作人陈稷坤说的，它一个前奏就可以让人记住一辈子。而现在很多的编曲，一上来就是噼里啪啦堆一堆，因为今天要吸引用户完整听完一首歌已经不容易了，只要有 15 秒洗脑的片段，就可能一炮而红——比如《热爱 105 度的你》，听过一遍很上头于是脑海里一遍又一遍回绕的那个旋律，想脑子中了病毒一样挥之不去，可过段时间之后什么都记不住，除非再去听一遍。&lt;/p&gt;
&lt;p&gt;而我们可以做的应该是慢一点、耐心一点，把注意力从瞬息万变的外界抓回来，不要被外界的信息爆炸所吸引，更多地关注自己的内心，关注你每一天的感受，每一次行动的手感，每一次复盘的反馈、思考、经验。&lt;/p&gt;
&lt;h3&gt;快节奏时代下的文化狂欢：熊猫、淄博、毒鸡汤&lt;/h3&gt;
&lt;p&gt;根据巴赫金对狂欢的理解，狂欢式可以分为以下四种范畴：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;人们在狂欢节中可以随便亲昵的接触；&lt;/li&gt;
&lt;li&gt;插科打诨的相处方式；&lt;/li&gt;
&lt;li&gt;人们平等亲昵的生活态度；&lt;/li&gt;
&lt;li&gt;粗鄙，即人们保持的一种平民化的生活格调。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;此外，狂欢具有两大外在特征，即全民性和仪式性。根据巴赫金的狂欢理论来看，短视频实际上也属于文化狂欢的一类。&lt;/p&gt;
&lt;p&gt;典型的例子是这段时间全网对于熊猫的异常关注，我之前喜欢看熊猫的图片单纯只是因为可爱（尤其是还没有脖子的花花），但是从日本送别香香上了热搜之后，关于熊猫的传播风向和关注热度就变得不对劲了起来，这里就不展开说了。&lt;/p&gt;
&lt;p&gt;还有便是突然爆火的淄博烧烤，很多传播学的媒体评论文章去分析淄博为什么突然火起来了，这种热度能否形成模式并复刻。比如全媒派的这篇文章&lt;a href=&quot;https://36kr.com/p/2224474401195137&quot;&gt;《全网打卡淄博烧烤：短视频造神、社交平台种草和网红城市的网感》&lt;/a&gt; 里面谈到了两个点——短视频的“网感”和“在场感”。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;短视频的可见性：呈现具有丰富细节的现场，具有视觉冲击力，甚至还带来滤镜、特效等修辞手段，但这种强冲击、奇观化的视觉维持难度较大，这就势必要进入“造神”2.0阶段，即由感性、狂欢、娱乐的体验转向一种意义生产过程。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;网感相关的论述如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;所谓的“网感”，是指基于互联网文化的信息传播、连接方式而建立起来的认知习惯和表达方式。&lt;strong&gt;“网感”就意味着网民的所思所想得到关注，体现为碎片化、娱乐化、年轻化的内容气质，有一定的情节爆点和情感痛点，有较强的用户参与性和体验感。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;短视频同时具有可见性和连接性，因此制造“在场感”是它擅长的功能，“由此营造沉浸感，在一定程度上留住用户注意力和用户时长。在碎片化、巨量内容的媒介生态环境中，增强受众的场景化体验是提升传播力的关键。”(出处同上)&lt;/p&gt;
&lt;p&gt;而短视频“毒鸡汤”的火爆也印证了“在场感”理论的可靠性。如果我们站在上帝视角看，我们很容易辨别出“毒鸡汤”里儿媳打婆婆这些离谱的故事是虚构的，但刷视频时，往往会代入其中，甚至信以为真，这便是“在场感”的作用。&lt;/p&gt;
&lt;p&gt;与文字相比，短视频通过人物的演绎及还原，更容易营造一种“在场感”。这种体验仿佛身临其境，参与了一场家庭争吵、参与了一场友谊崩溃，配合夸张的语言文本、戏剧化的人物动作和表情，超现实的拟像状态会让很多用户越看越爽，欲罢不能。&lt;/p&gt;
&lt;p&gt;尼尔·波兹曼曾经说：“&lt;strong&gt;现代技术彻底改变了人们对于信息的态度，过去人们是为了解决生活中的问题而搜寻信息，现在则是为了让无用的信息派上用场而制造问题。&lt;/strong&gt;”&lt;/p&gt;
&lt;p&gt;“毒鸡汤”一味追求超越常识乃至反常识，制造奇奇怪怪的问题来吸引眼球，这种新奇性既吸引着人们，也对人的认知产生了巨大影响。&lt;/p&gt;
&lt;p&gt;由于短视频传播主体的泛化，传受双方的交互，最终共同促成了以上这些狂欢现象，而狂欢本身又会弱化、消解人们对严肃问题的认知。&lt;/p&gt;
&lt;p&gt;因此最后想再结合 B 站现状谈一谈现代人正在进行的危险游戏。&lt;/p&gt;
&lt;h3&gt;现代人的危险游戏：解构神圣，执迷现象&lt;/h3&gt;
&lt;p&gt;前段时间关注到 B 站 Up 主停更事件，木鱼水心发了一段回应——&lt;/p&gt;
&lt;p&gt;“接下来，我们会制作越来越多的节目。在不放弃深耕长视频的同时，去拓展更多的节目形式，也会思考和尝试更多的商业可能性。&lt;/p&gt;
&lt;p&gt;「脚踏实地，认真做内容」，这不应该成为一个悲壮的故事，而应该成为一个「站着活下去，并且活得更丰盛」的故事。&lt;/p&gt;
&lt;p&gt;我常常想，在这个年代，能够产出这样的作品，和这么好的观众们互动，难道不是最最幸运的事情吗？”&lt;/p&gt;
&lt;p&gt;于是我去关注了下 B 站的商业化模式和短视频战略的分析，对于花火平台的问题、广告收益的问题、用户画像的差异这里不展开说了，不是本文的重点，相关材料列在了附录的参考资料里了，有兴趣的同学可以自行了解。这里想重点谈谈认真做长视频 Up 主在这个时代下被逐渐淘汰的悲哀。&lt;/p&gt;
&lt;p&gt;目前无论是长视频还是短视频，无论是文章还是传播的营销活动，能够踩到观众爆点的现象级的话题，最终都服务于流量传播，无外乎有三类：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;能引发了大众焦虑&lt;/strong&gt;，比如赚钱、贫穷、两性、学习、工作之类的话题，如探讨应届生就业难、裁员潮、分享副业、下乡种田等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;直击社会热点，义愤填膺一番，带有明显的情绪渲染和对猎奇心理的迎合&lt;/strong&gt;，如丫丫、拖夫等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;能让受众感觉到优越感的&lt;/strong&gt;，比如网易云各种哄人的测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不妨静下心来想一想，我们真的需要这种内容吗？&lt;strong&gt;我们学习知识不是为了制造流量凸显优越感、也不是为了抓人眼球骗人点击，而是去传递知识。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;越是在注意力被分散的浮躁时代，越是需要更多优秀创作者以优质内容破壁，沉下心去打造具有陪伴感的内容输出；越是丧文化风靡，就越需要更多明丽的热血瞬间去破穿时代空气里的灰雾与阴霾。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不可否认，现在的社会生活变得丰富多彩起来了。现代人心安理得地陶醉在快餐式的消费文化中。现代人不需要思考本质，他们只相信现象，因为他们看穿了本质只不过是人自己虚构的一个幻象。现代人太清醒了，哲学的斯芬克斯之谜已经不可能再让他们感到困惑，因为他们根本就不需要去思考那些稀奇古怪的东西。活着，并且快乐着，这就是现代人的生活秘诀。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不过这真的是“快乐”吗？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;短视频、各种娱乐游戏和活动，这些快乐不需要思考，来的非常容易，但也容易让人迷失。我们费劲心思寻求快乐，可是快乐好像成了速食快餐品，似乎少了一些什么。&lt;/p&gt;
&lt;p&gt;短视频让我们短暂沉浸在低级快乐里，忘却了颓废的不想努力的自己，给自己营造了一种虚假的充实，实则最后只会带来更多的空虚与不安。而那种持久思考，需要艰难的付出获得的快乐，是这些东西没有办法替代的。&lt;/p&gt;
&lt;p&gt;今天的人类正在进行一场危险的游戏——抛弃了一切神性的东西、本质性的东西，总觉得没有什么东西是崇高的，解构着神圣，嘲笑着深刻，把自我意识和当下感受提高到了无以复加的地步。现象学与存在主义大行其道，主张抛弃一切本质或深刻的东西，跟着感觉走，尽情地去享受当下的生活。&lt;/p&gt;
&lt;p&gt;事实上，&lt;strong&gt;当我们放弃本质、追逐现象的时候，当我们以为自己变得聪明的时候，我们已经走上了一条从人到动物的道路。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;参考资料与扩展阅读：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ifanr.com/1524332&quot;&gt;「小帅和小美」，用三分钟毁掉电影 | 爱范儿&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://mp.weixin.qq.com/s?__biz=MjgzMTAwODI0MA==&amp;amp;mid=2652130451&amp;amp;idx=1&amp;amp;sn=81b0435a420fb1f62d0227f73923f6ac&amp;amp;chksm=9b62da0cac15531a69b2b178a608257848490594bb5b11dfc177f535b1824b1054783b44066a&amp;amp;mpshare=1&amp;amp;scene=1&amp;amp;srcid=0706gGbppEo5FWzQYf6LpaAQ&amp;amp;sharer_sharetime=1657156135777&amp;amp;sharer_shareid=b3d3816607a91fd20809bd0f9b8507f6#rd&quot;&gt;周杰伦《最伟大的作品》全解读，他还是那个音乐的王&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://36kr.com/p/2224474401195137&quot;&gt;全网打卡淄博烧烤：短视频造神、社交平台种草和网红城市的网感&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1XN411w7ro&quot;&gt;B站到底应该如何逆天改命？做了四年UP主的一些感想。| 智能路障&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://mp.weixin.qq.com/s?__biz=MjM5NDAzMjk2MA==&amp;amp;mid=2653590032&amp;amp;idx=1&amp;amp;sn=1f1f78bf0755ed8bcea8c12a854e0d96&amp;amp;chksm=bd53ce3f8a244729e4534ea04536bbe4d9fe48abf0f52739a00e020fff5f4e061f22999981b4&amp;amp;mpshare=1&amp;amp;scene=1&amp;amp;srcid=0430U7vKys8HmcMmNEokjYHV&amp;amp;sharer_sharetime=1682829152935&amp;amp;sharer_shareid=b3d3816607a91fd20809bd0f9b8507f6#rd&quot;&gt;B站“赚钱难”背后 | 第一财经 |《商业就是这样》&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🎬 本月书影音&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;在读：哲学 |《西方哲学讲演录》（赵林）| ★★★★★（5.0）&lt;/li&gt;
&lt;li&gt;在读：哲学 |《哲学与人生》（傅佩荣） | ★★★★☆（3.5）&lt;/li&gt;
&lt;li&gt;在读：文教 |《人类简史》 | ★★★★☆（3.5）&lt;/li&gt;
&lt;li&gt;在读：文教 |《自私的基因》 | ★★★☆☆（3.0）&lt;/li&gt;
&lt;li&gt;在看：动漫 |《鬼灭之刃：锻刀村篇》| ★★★★★&lt;/li&gt;
&lt;li&gt;重温：英剧 |《神探夏洛克》| ★★★★★&lt;/li&gt;
&lt;li&gt;重温：电影 |《活埋》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：电影 |《流浪地球 2》 | ★★★☆☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《长空之王》 | ★★★☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本月阅读较少，下个月要弥补下阅读方面。By the way，安利下赵林的《西方哲学讲演录》，找回了自己当年考研读到他和邓晓芒编写的教材时，所感受到的那种对哲学的真挚的热爱，这才是真正值得接触的哲学。平时也没有在看剧和玩游戏了，一方面是没有发现好看的剧，另一方面是调休有些打乱节奏，项目也处于关键时期需要补充的知识不少。&lt;/p&gt;
&lt;p&gt;本月做了一个 GPI 测试，具有强烈的成功愿望（9.8/10分），情绪调控也是符合预期的高达 9.8 分（毕竟五一开车堵了 9 个小时还是能保持平静，笑），批判性和条理性得分也很高，但是乐群性、适应性等人际/环境上的指标只有一点几分，需要后续加强。&lt;/p&gt;
&lt;p&gt;已经度过了一个春意酥怀的四月，期待下个月能安心玩上《王国之泪》~&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-21&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>月刊（第20期）：重启人生</title><link>https://ursb.me/posts/weekly-20/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-20/</guid><description>记录二〇二三年三月生活,重点评述日剧《重启人生》的细腻真实与温暖内核,兼谈《最后生还者》《黑暗荣耀》等剧集观感,以及打羽毛球、骑车通勤等日常琐事。</description><pubDate>Sun, 02 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本篇是对二〇二三年三月生活的记录与思考。&lt;/p&gt;
&lt;h2&gt;🎬 本月书影音&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;在读：小说 |《德米安》 | ★★★★★&lt;/li&gt;
&lt;li&gt;在读：小说 |《少年巴比伦》| ★★★★★&lt;/li&gt;
&lt;li&gt;在读：文学 |《西方文学史》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：日剧 |《重启人生》| ★★★★★★&lt;/li&gt;
&lt;li&gt;看完：韩剧 |《黑暗荣耀》 | ★★★★★&lt;/li&gt;
&lt;li&gt;看完：美剧 |《最后生还者》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：电影 |《情书》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：电影 |《保你平安》| ★★★★☆&lt;/li&gt;
&lt;li&gt;在看：动漫 |《钢之炼金术师 FA》 | ★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个三月基本没有玩游戏，周末都在看剧，从《最后生还者》到《黑暗荣耀》，再到《重启人生》。一部部来说吧，先从心目中最佳的《重启人生》开始。&lt;/p&gt;
&lt;p&gt;如果只打五星已经不能满足我对《重启人生》的溢美之词了，所以这次给了史无前例的六颗星！虽然才 3 月，但我觉得《重启人生》已经是今年的年度最佳了。主角麻美意外去世，得知「下辈子将投胎为大食蚁兽」，若想投胎成人，需要不断重启人生，积德行善。在部重生剧在真正意义上做到了“清新脱俗”，简单谈一谈它的优点吧！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一，细腻的真实感&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;开篇是麻美的第一轮人生，影片看了四十分钟全是琐碎无聊的日常小事，比如和同事讨论在市公所上班需不需要说“欢迎光临”，给朋友庆生没有准备生日蛋糕、服务员会不会有什么想法，分析爸爸的私房钱藏在哪。整篇故事文本量巨大，充斥着大量的对白，但都在事无巨细地呈现主角的日常琐事，似乎是一些「没用的废话」或者「无聊的思考」，仿佛已经忘了“重生”这件大事。第一集的观感让我感到平淡，甚至有些无聊。但这种细腻的剧本，角色们对生活琐事的碎碎念、以及每个角色特有的小细节，这些闲笔制造真实感，逐渐会让观众接受他们是自己珍贵的朋友，对她们的命运产生共情。&lt;/p&gt;
&lt;p&gt;至第三轮时，仿佛看到了自己的影子，虽然每天工作很忙、加班到很晚，但会有好友半夜跑来看你，这种感觉让人觉得甚是幸福。&lt;/p&gt;
&lt;p&gt;而至第四轮时，则更充斥着苦涩的现实，如果重生那么多次和最好的朋友、和亲密的家人疏远了，那下辈子即便能够做人还有什么意义呢？在麻美重生四次的百年之后，最想念的仍然是童年时互换贴纸的那个遥远下午，而对于观众而言亦是如此。&lt;/p&gt;
&lt;p&gt;冲破文本内部的情绪惯性，抓住人物当下细微的思绪，这种真实感流露出细腻的情感，让我在不知不觉中也视她们为真实的朋友。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402165042.png&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;二，平视每一个角色，不戏谑任何一种价值观&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这里要说到剧中的配角小福，他对自己的音乐才华始终有过高期待，事业不顺，直至离婚，离婚后在 KTV 当服务员，按说很可悲，但编剧对这个人物的塑造始终有种潜台词——&lt;strong&gt;任何人都没资格评判或怜悯他的人生&lt;/strong&gt;。加缪也曾言：“&lt;strong&gt;应当想象西西弗是幸福的。&lt;/strong&gt;”&lt;/p&gt;
&lt;p&gt;麻美第二轮时曾想过改变小福的人生轨迹，让他的人生变得“更好”一些，但最终她没有去实施，多年后在 KTV 和小福聊天，确认了他对自己当下的生活很满意，确认他洋溢幸福的笑容，麻美对自己的决定如释重负。&lt;/p&gt;
&lt;p&gt;平凡并不等于平庸，因为一个人的人生，如果是平凡的人生，至少可以活成自己接受的样子；但是一个平庸的人生，一不留神就会活成自己讨厌的样子。小福是平凡的打工人，但是他至少在努力地、幸福地活着。&lt;/p&gt;
&lt;p&gt;这就要说到本剧背后那个更温暖的东西——&lt;strong&gt;活着不是快乐，快乐才是活着&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402165118.png&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;三，更温暖而强大的内核&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这部剧集给我们呈现了人生的本来面目，但它同时有着一些更丰富、更简单、更强大的东西。&lt;/p&gt;
&lt;p&gt;好的作品亦是如此，&lt;strong&gt;它不是为了让观众重温现实，而是从现实中创造出一些东西，把一种更强烈的情绪传递给观众。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;而时下不少作品充斥着傲慢和对角色、甚至是对观众的戏谑，&lt;strong&gt;畸形的时尚造就虚伪&lt;/strong&gt;。它们把世间一切自然的东西，无论是物质的、情感的、还是伦理的，都当做世仇而加以割舍、抛弃、毁坏，并且认为割舍得越彻底，心灵就越崇高，结果只能导致作品与现实世界的背谬。对肉体和自然人性、人情的无端摧残是不能构成审美愉悦的，由此而获得的沐神福祉的喜悦也是一种畸形的心理病态。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但人在此世间，并非仅仅作为个人而存在，他同时也是独一无二的特殊个体，永远是一个关键而奇妙的点，在这个点上，世界的万千现象纵横交错，充满不可重复的偶然&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;应了《日常》里的那句话：&lt;strong&gt;我们所度过的每一个日常，都是一个个小小奇迹的连续&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;而我们要做的，只是&lt;strong&gt;体会那情感的任性，以把捉自由、探险人性&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;在这每一个平淡的日常之中，《重启人生》以善良底色书写不说教的故事，赢得喝彩。它承认个体力量的有限，哪怕读档重来，每次也只能进步一点点，但我们仍能通过点滴的小小努力，给自己的人生抛个光。&lt;/p&gt;
&lt;p&gt;当然我最喜欢的还是这篇故事最温暖的结局，看到最后会有一种时间都停了、所有人都回来了的感觉，经过了百年来的兜兜转转，终于留住身边最好的人。——与其一个人变成人，不如一起变成鸽子！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402164927.png&quot; alt=&quot;&quot; /&gt;PS: 剧组内的氛围也有爱，番外篇值得看一看！&lt;/p&gt;
&lt;p&gt;除了《重启人生》，本月看完的《最后生还者》和《黑暗荣耀》也都是满分作品，两者都有着反传统的结局（复仇成功、没有原谅加害者、没有“大义”的介入），总体观感很爽很过瘾。&lt;/p&gt;
&lt;p&gt;《最后生还者》还原原作，但适时加入一些轻微的调整和战斗情节的略过，避免剧集沦为游戏那样平铺直叙的公路片。原作原本就是神作，因此忠于原作的剧集也很棒，当然演员表现也棒，乔尔和艾莉的演技令人惊叹。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402165703.png&quot; alt=&quot;&quot; /&gt;《黑暗荣耀》相较于它的复仇剧情，我更喜欢它的镜头语言，比如片中不少霸凌情节穿插了第一人称视角，增强了观众的代入感，更易产生共情，让后面的复仇更加爽快；在月色中女主漏出全身伤疤时房间的明暗对比、还有围棋师徒四季榕树的变化之景，也都是片中绝美的镜头。除此之外，剧中部分音效用的也非常不错，值得琢磨一番。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402165435.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;🌺 本月生活点滴&lt;/h2&gt;
&lt;p&gt;🏸：这个月开始打羽毛球了，自从去年年底疫情肆掠之后就没有打过了，现在重新捡回这项运动，并通过它遇见有意思的人们，是一件幸事。&lt;/p&gt;
&lt;p&gt;🚴🏻：这个月开始骑自行车上班，通勤耗时比开车要短一些，并且每天还能省下不少停车费。By the way 电助力车骑在路上就像开挂一样。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402222644.png&quot; alt=&quot;&quot; /&gt;👩🏻🍳：在B师傅的教导下学做菜，目前学了电饭煲鸡腿、白灼虾、耗油生菜这种简单的菜肴。（照片就不放了，能吃就行。）&lt;/p&gt;
&lt;p&gt;🦆：某个周末的下午在家楼下的河边发了一下午的呆，放空自我，盯着看白鹭是怎么捉鱼的，看流水的形状，感受时间从指尖流过，忽然有那么一瞬间貌似能体会到钓鱼的乐趣了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402222654.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402222701.png&quot; alt=&quot;&quot; /&gt;👨💻：对工作内容有些迷茫，某个周日找了B前辈吃饭聊了聊，被指明道路之后一切都豁然开朗了，是自己太着眼于当下与急功近利所以才会迷茫，于是回家之后列出了未来7年每一年的职业目标，按这计划一步一步脚踏实地向前走，终有一天能登上顶峰。By the way，那天下午去和朋友试驾了阿维塔，试驾的工作人员给了我很深的印象，虽然是位零几后，但是对工作非常认真负责、富有激情，同时他也对我说到，工作就是要怀着热情且谦卑的态度认真去做，该工作的时候就不要考虑别的，把事情做得漂亮自然就有好结果。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402222715.png&quot; alt=&quot;&quot; /&gt;⛺️：组内团建去梧桐山脚下露营，虽然很堵车，但是敞篷在山里派上了用途。By the way，篝火晚会还是蛮有氛围的。
&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402222719.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;总结：这个三月过得很开心、很充实、很满足，是工作以来最满足的三月了。希望四月是一个繁美丰盛的四月，一见倾心的四月、春意酥怀的四月。💐&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402224028.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-20&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>月刊（第19期）：日记的意义</title><link>https://ursb.me/posts/weekly-19/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-19/</guid><description>探讨坚持六年记日记的意义,认为日记是自我觉察的工具、折射生活意义的方式,也是记录身边美好瞬间的载体,并附北京出差与书信往来等生活片段。</description><pubDate>Fri, 03 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;日记的意义&lt;/h2&gt;
&lt;p&gt;月底在回顾日记以准备当月的月刊素材时，偶然在 dayone 上看到了17年-19年2月28日的记录，而在 daylio 上则有着20年-22年2月28日的记录。&lt;/p&gt;
&lt;p&gt;这才发现，写日记这个习惯居然已无声无息持续了已六年。再回头看这六年间的日记，着实有一种奇妙的感觉。于是这篇文章就来谈谈——日记的意义吧！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/IMG_5031.jpeg&quot; alt=&quot;&quot; /&gt;于我而言日记的意义有以下几点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自我觉察的工具&lt;/li&gt;
&lt;li&gt;折射生活的意义&lt;/li&gt;
&lt;li&gt;记录身边的美好&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;1. 自我觉察的工具&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;自我觉察指的是察觉自己真正的感受和情绪，理解自己真正的需要和欲望是什么，从而为生活找到目标和意义感。&lt;/p&gt;
&lt;p&gt;记日记的好处之一是可以通过日常细碎的思考来了解自己的思维，类似于辅助正念的工具，通过觉察自己的情绪，从而发现自我。&lt;/p&gt;
&lt;p&gt;前几年上学的时候也开发过一款 App 叫「双生日记」，主打的匹配和心理报告功能也都是为了自我觉察而服务的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 折射生活的意义&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;其实这一点本质上和“自我觉察”说的是同一件事，因为自我觉察本身就是找寻意义感的重要途径。这里单独拆出来自成一节展开谈谈。&lt;/p&gt;
&lt;p&gt;在之前的一篇文章中（&lt;a href=&quot;https://me.ursb.me/archives/299.html&quot;&gt;《谈谈人生的价值与体验》&lt;/a&gt;）谈到了”&lt;strong&gt;人生是一连串的刹那，最重要的是当下的此时此刻&lt;/strong&gt;” ，而“&lt;strong&gt;生命的意义并不是由所谓的“人生大事”来赋予的，而是落实到生活中无常的琐碎&lt;/strong&gt;”。&lt;/p&gt;
&lt;p&gt;我们求而不得的生活意义感，首先是通过这样真实地投入生活开始的，只有当你“真实地存在”的时候，你和生活才建立了足够深入和真诚的链接，生活会用它独特的方式给予你回报。&lt;/p&gt;
&lt;p&gt;日本茶道中讲“一期一会”，意思是&lt;strong&gt;在茶会时领悟到这次相会无法重来，是一辈子只有一次的相会，故宾主须各尽其诚意&lt;/strong&gt;。这也是佛教中“无常” 的思想，&lt;strong&gt;珍惜每个瞬间的机缘，并为人生中可能仅有的一次相会，付出全部的心力&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;眼前可口的饭菜，河里跃起的鱼群，路边飘落的花瓣，每个时刻、每件事物都会让我们有发自内心的喜悦，油然而生的幸福感，即使是恐惧或愤怒也是当下的，我们有的只是当下的体会和感受。觉知当下的喜怒哀乐、体验它们、悦纳它们，便是活着的意义吧。&lt;/p&gt;
&lt;p&gt;而日记的作用便是记录这每一个“当下”的觉察和感受，虽然这些念头可能以后永远都派不上用场，但是光是记下来本身，就是生活意义的折射，能产生一种充实的幸福感——至少当下的心情是真实的，当下的瞬间没有被浪费。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 记录身边的美好&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个点记录了 4 年日记之后才发现的，如果真的要记录点什么，为什么不能只记录那些开心的事情呢？&lt;/p&gt;
&lt;p&gt;在去年的&lt;a href=&quot;https://me.ursb.me/archives/2022.html&quot;&gt;年终总结&lt;/a&gt;里提到了“在睡前回顾今日的心情时，也会选择性地去记录今天遇到的美好的事情，一方面是期望带来好梦，另一方面是期待明天可以更美好。”日后翻看回忆时，也尽是美好事物，这不是一件很美好的事情吗？&lt;/p&gt;
&lt;p&gt;愿我们不会将一生都花费在漂浮奔波上，而是怀着对生活的喜悦和热情，全情投入到美好生活中。&lt;/p&gt;
&lt;p&gt;最后摘录一段 2019 年 &lt;a href=&quot;https://me.ursb.me/archives/wwdc19.html&quot;&gt;WWDC 19 游记&lt;/a&gt; 中的一段话作为结尾：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230304173158.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;本月记录&lt;/h2&gt;
&lt;p&gt;月初出差去北京听 GMTC，这个会的北京站也是比较坎坷，从2020年开始数十次因疫情推迟，最终到23年才……这也是我工作以来第一次出差。&lt;/p&gt;
&lt;p&gt;在北京约到了久别重逢的好友，是很久以前最好的朋友，转眼已整整5年未曾联系，本以为老死不相往来从此沦为人生遗憾，但再见时已记不清为什么要不相往来。真的是一点儿也没有变。&lt;/p&gt;
&lt;p&gt;贴一些 2 月的瞬间：&lt;/p&gt;
&lt;p&gt;P1: 🍶 夜晚，清冷的北锣鼓巷。没有破败的气息，只是清冷，寥寥几盏灯火点亮幽邃的胡同。喜欢“不卖书的书店”和专注巧克力的“可可芭蕾”。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230303220049@2x.jpg&quot; alt=&quot;&quot; /&gt;P2: 🍻 有人跳海，胡同深处的一家小酒吧。那晚在无尽的黑巷里走了一个多小时，才觅得的一家可以进去避风休息的店铺。从北京回来之后没几日发现了一直关注的博主也去了这家店（下图也是从他的周刊里盗的），有种时空交错的感觉。想吐槽下北京的店面关门都很早，晚上八九点就没有什么店了，十点多连车都打不到了 QAQ&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/IMG_4945.jpeg&quot; alt=&quot;&quot; /&gt;P3: 🌺 楼下的鸡蛋花树开花了，春天来了。很喜欢家楼下的这条马路，傍着小河，静谧且美丽。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/IMG_4974.jpeg&quot; alt=&quot;&quot; /&gt;P4: 🍩 海边的落日与飞机&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/IMG_5004.jpeg&quot; alt=&quot;&quot; /&gt;P5: 🚗 难得去广州，但来回用了将近8个小时，疯狂堵车的一天。灾星体质，去哪儿哪儿就会发生车祸。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/IMG_4935.jpeg&quot; alt=&quot;&quot; /&gt;P6: 🍾 周五晚邀请朋友来家里吃零食、吐槽、看电影&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/IMG_4955.jpeg&quot; alt=&quot;&quot; /&gt;P7: 🎮 做原神任务时发现的一个超美场景&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/IMG_0126.jpeg&quot; alt=&quot;&quot; /&gt;P8: 📮 自从上期提倡信件交流以来，又多了些好友来信，上月往来信件 20 封，发现信件交流确实更加沉静、深入。也欢迎读者给我写信—— airing@ursb.me ，什么乱七八糟的都可以交流~&lt;/p&gt;
&lt;p&gt;P9：📝 关于工作，做了一个部门分享，写了一篇&lt;a href=&quot;https://me.ursb.me/archives/cross-end.html&quot;&gt;技术文章&lt;/a&gt;，在知乎接了一个软广，学习了 Android JNI 编程，给项目的 V8 接入了调试器。&lt;/p&gt;
&lt;p&gt;P10：🎬 本月的书影音（貌似是最多的一个月）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;读完：小说 |《一个陌生女人的来信》 | ★★★★★&lt;/li&gt;
&lt;li&gt;读完：小说 |《消失的13级台阶》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;在读：小说 |《德米安》 | ★★★★★&lt;/li&gt;
&lt;li&gt;看完：电影 |《蚁人与黄蜂女 3》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看完：电影 |《饥饿站台》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看完：日剧 |《凪的新生活》 | ★★★★★&lt;/li&gt;
&lt;li&gt;在看：美剧 |《最后生还者》| ★★★★★&lt;/li&gt;
&lt;li&gt;在看：剧集 |《三体》 | ★★★★★&lt;/li&gt;
&lt;li&gt;在看：动漫 |《钢之炼金术师 FA》 | ★★★★★&lt;/li&gt;
&lt;li&gt;在玩：Switch |《女神异闻录 P5R》| ★★★★★&lt;/li&gt;
&lt;li&gt;在玩：Steam |《荒野大镖客 2》| ★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-19&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>大厂自研跨端框架技术揭秘</title><link>https://ursb.me/posts/cross-end/</link><guid isPermaLink="true">https://ursb.me/posts/cross-end/</guid><description>梳理大厂自研跨端框架的四种技术方向，深入揭秘 Kun、WebF、Weex 2.0 等自绘引擎方案在脚本引擎选型与 CSS 渲染实现上的具体技术路径与优劣对比。</description><pubDate>Sat, 25 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;导言&lt;/h2&gt;
&lt;p&gt;本文将围绕跨端框架技术的主题，分析其技术目标和 3 种演进方向，接着揭秘业内的自绘跨端方案的技术实现——包括 Kun、WebF、TDF、Weex 2.0、Waft 与 MiniX 等方案，分析各自的特点与不足，总结跨端框架的研发思路与技术要点，最终分享对跨端框架发展趋势的思考。&lt;/p&gt;
&lt;p&gt;分享过程中，会穿插介绍跨端框架的脚本引擎的选型与技术难点、业内各跨端框架各自的困境、分享 Debugger 原理以及一核多生态的工程化思路。&lt;/p&gt;
&lt;p&gt;大纲如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;跨端框架的技术目标（略）&lt;/li&gt;
&lt;li&gt;跨端框架的技术方向&lt;/li&gt;
&lt;li&gt;跨端框架的技术揭秘&lt;/li&gt;
&lt;li&gt;跨端框架的技术要点&lt;/li&gt;
&lt;li&gt;跨端框架的发展趋势（略）&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;注 1：本文系线下分享的文字总结版，将省略前情提要、技术背景（如第1节、第5节）与部分技术细节的扩展（如第3-4节部分内容），仅保留核心内容。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;注 2：本文材料源于 GMTC 大会跨端主题的公开分享、部分企业的公开微信公众号文章、框架公开源代码与个人历史分享素材，其余内部分享与内部框架等材料做脱敏处理。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;跨端框架的技术方向&lt;/h2&gt;
&lt;p&gt;我略微总结了一下，跨端框架有以下 4 种技术方向。&lt;/p&gt;
&lt;h3&gt;方向 1：基于 WebView 的增强&lt;/h3&gt;
&lt;p&gt;基于 WebView 的增强是一个偏前端往客户端方向靠拢的技术方向，即上层生态依然使用 Web 技术，但是需要依靠客户端对 WebView 做一些能力补充。&lt;/p&gt;
&lt;p&gt;比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ionic、Cordova 等 Hybrid 框架。&lt;/li&gt;
&lt;li&gt;业内一众基于 WebView 的小程序。&lt;/li&gt;
&lt;li&gt;Sonic 等客户端预加载 WebView 资源的方案。&lt;/li&gt;
&lt;li&gt;App 厂商针对 Web 做的离线包方案。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这类框架都有这几个特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于 WebView 渲染，但补充了一些原生能力增强&lt;/li&gt;
&lt;li&gt;开发生态基于 Web 前端生态（严格来说，小程序也是）&lt;/li&gt;
&lt;li&gt;想方设法增强 Web 的用户体验&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;方向 2：基于 DSL 的 Native 增强&lt;/h3&gt;
&lt;p&gt;基于 DSL 的 Native 增强属于偏客户端但往前端方向靠拢的技术方向，即开发生态基于 Native，但是框架设计上参考了 WebView 的一些特性。这些框架总体上都是自定义了 DSL 来实现跨端与动态化的。&lt;/p&gt;
&lt;p&gt;比如手淘的无障碍框架 DinamicX、美团的 MTFlexbox、阿里的 &lt;a href=&quot;http://tangram.pingguohe.net/&quot;&gt;Tangram&lt;/a&gt;(七巧板)。&lt;/p&gt;
&lt;p&gt;浏览这些框架的文档可以发现，它们的设计比较像 React Native，只是上层需要开发者使用 DSL 来接入组件。&lt;/p&gt;
&lt;h3&gt;方向 3：代码共享&lt;/h3&gt;
&lt;p&gt;代码共享是终端的开发方案，目前业内熟知的方案是 KMM（Kotlin Multiplatform Mobile），通过 K2 编译器将 kotlin 源码编译成各个平台的目标代码，从而实现跨端。具体而言，kotlin 通过编译器前端生成带有语义信息的 FIR，之后 FIR 交给各个平台的编译器后端来进行优化和生成，如 JVM/LLVM 等，最终生成各平台可执行的目标代码。&lt;/p&gt;
&lt;p&gt;KMM 的工程结构也比较简单，包括跨端代码(Shared module)与壳工程(Android/iOS App)两部分组成。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230225222623.png&quot; alt=&quot;&quot; /&gt;目前来看这套方案在生成 iOS 代码时，对多线程的逻辑处理不是特别好，需要业务方优化。&lt;/p&gt;
&lt;h3&gt;方向 4：基于 GPL 的 Native 增强&lt;/h3&gt;
&lt;p&gt;基于 GPL 的 Native 增强我将其视为大终端的开发方案。所谓大终端是一个融合之后的产物，在早年 PC 时代，大家使用 .NET、JVM、Qt 来开发桌面应用，我们将其称为终端开发；随后进入移动端时代，Native 方向的客户端开发在不断追逐动态化之路，而跨平台方向的前端开发在不断追逐性能之路，这两条道路最终融合成如今这些跨端框架。无论是小程序、Flutter、DSL 开发框架、WASM 均属于融合演进的产物。&lt;/p&gt;
&lt;p&gt;总结一下，方向 4 有以下几类方案：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;原生渲染组件：如 React Native / Hippy 1.0 / Weex 1.0 等。&lt;/li&gt;
&lt;li&gt;自绘引擎：Flutter。暂且将其单独算作一档。&lt;/li&gt;
&lt;li&gt;基于 Flutter 的自绘框架：这里业内有诸多框架（曾整理过 20+ 框架），如 WebF(Kraken)，Kun，FMP，基于 Skyline 的小程序等等。&lt;/li&gt;
&lt;li&gt;基于系统图形库（Skia / Vulkan / Metal / OpenGL）的自绘框架：这里业内也有不少框架，如 TDF，Hippy 3.0，Weex 2.0，Waft 等等。严格来说 Flutter 也属此类。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;前 3 个方向以及第 4 个方向的前两类框架都是开源的，且业内也有不少文章介绍了它们的原理，这里就不赘述了。本文主要介绍第 4 个方向后两类框架的技术方案。&lt;/p&gt;
&lt;h2&gt;跨端框架的技术揭秘&lt;/h2&gt;
&lt;p&gt;本节将挑选几个有代表性的框架做技术揭秘：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kun&lt;/li&gt;
&lt;li&gt;WebF&lt;/li&gt;
&lt;li&gt;Weex 2.0&lt;/li&gt;
&lt;li&gt;TDF（需脱敏，略过）&lt;/li&gt;
&lt;li&gt;Waft&lt;/li&gt;
&lt;li&gt;MiniX（略）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;之所以在芸芸框架中挑这几个，是因为他们的方案在领域细节中属于典型框架，可关注这些框架的应用开发体系、脚本引擎与渲染引擎的选型。&lt;/p&gt;
&lt;h3&gt;Kun&lt;/h3&gt;
&lt;p&gt;Kun 是闲鱼基于 Flutter 开发的一个跨端框架，目前并未开源，网上能学习到的文章只有闲鱼公众号上发表的三篇文章。架构设计比较简单，虽然没有源码也能分析一二，架构图这里就不放了，有兴趣的同学可以自行点进文章了解。&lt;/p&gt;
&lt;p&gt;Kun 的整体设计思路是基于 Flutter 开发一个 JS Runtime，开发者使用前端生态进行页面开发，JS 解释器作为胶水层会将源码翻译成 Flutter Widget，之后交给 Flutter Engine 做渲染。&lt;/p&gt;
&lt;p&gt;JS 引擎他们采用了 QuickJS，但猜测应该是阿里内部的 QKing 引擎（基于 QuickJS）。&lt;/p&gt;
&lt;p&gt;Debugger 支持 CDP，Test 基于 Flutter Golden test。&lt;/p&gt;
&lt;p&gt;CSS 解析他们先使用 Yoga 做 polyfill，将样式处理成 css in js，之后解析模块挪用了 Kraken 的遗产 CSSLib，通过 Dart FFI 将 JS 测的内链样式传递给 Dart 侧做处理，最终解析成 Flutter Widget。&lt;/p&gt;
&lt;p&gt;但是 CSS 的盒模型与文档流毕竟与 Flutter Widget 的样式标准格格不入，他们则采用了 Widget 拼接的方式，每一层 Widget 特定处理某类样式，最终通过层层套娃拼接的方式实现组件样式。如下图所示，这是一个 div element 所对应的拼接方式：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230225222654.png&quot; alt=&quot;&quot; /&gt;总结一下特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不支持完备的 W3C 标准（也不可能支持，比如 css in js 无法实现伪类），只支持各标准子集，包括：HTML 标签、CSS 样式集、WebAPI 标准&lt;/li&gt;
&lt;li&gt;提供了一些定制的 Element 组件，由 Dart 侧实现，业务方也能使用 Dart 侧来开发一些定制的 Element。&lt;/li&gt;
&lt;li&gt;组件的实现上采用 Widget 拼接的方式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本节参考资料：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大终端领域的新物种-KUN&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mp.weixin.qq.com/s/26SCEM6QPhAazydRUq9h3Q&quot;&gt;三代终端容器 KUN 的首次大考【架构演进】&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;双十一｜探索KUN的加载性能与增强体验&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WebF&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/openwebf/webf&quot;&gt;WebF&lt;/a&gt; 前身是阿里的 Kraken，后团队解散部分遗产交接给了 Kun，剩余同学出走在开源社区成立了 openwebf，将 Kraken 改名 WebF 继续维护。&lt;/p&gt;
&lt;p&gt;这个是 WebF 的架构图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230225224007.png&quot; alt=&quot;&quot; /&gt;可以看到与 Kun 不同的地方在于除了提供了 JSBinding 之外，团队还在 Flutter 的 Dart 侧做了一些开发，将 RenderObject 的能力做了丰富，以适应 W3C 标准——即在 Dart 层来实现 CSS，C++ 层实现 WebAPI，对标 W3C 标准。&lt;/p&gt;
&lt;p&gt;脚本引擎依然是 QuickJS，但是目前做了一些&lt;a href=&quot;https://github.com/openwebf/quickjs&quot;&gt;优化&lt;/a&gt;，值得学习一波。&lt;/p&gt;
&lt;p&gt;其实对比一下 Kun 和 WebF，我们可以发现他们对 CSS 的处理采用了两种不同的思路。&lt;/p&gt;
&lt;p&gt;先说说 Kun 吧，它的方案存在几个问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一条渲染链路存在两次 Layout，这是完全没有必要的，而且 Layout 的更新频率本身也非常高，两次 Layout 会带来额外的性能开销&lt;/li&gt;
&lt;li&gt;Dart FFI 不足以支撑样式更新的信息传递，样式更新的数据量很大，会触及 FFI 的瓶颈&lt;/li&gt;
&lt;li&gt;内联样式的开发体验不好，很多 CSS 的属性也会无法实现&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那么 CSS 应该如何实现呢？有两种比较好的解法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CSS 在 Dart 层实现，样式更新依靠 RenderObject 的 Layout，无需走 FFI&lt;/li&gt;
&lt;li&gt;DOM 与 CSS 全使用 C++ 实现，剥离 Dart 层&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;解法 1 便是 WebF，解法 2 是后文的 Weex 2.0 与 TDF 等框架。&lt;/p&gt;
&lt;p&gt;但解法 1 也存在技术难点，因为引入了 CSS 会导致 RenderObject Tree 难以维护，那么我们应该如何管理 RenderObject Tree？这也有两种思路：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;把 RenderObject 做薄：即 Flutter Widget 做原子级渲染组件，不对 RenderObject 做修改，上层通过组合 RenderObject 来实现复杂功能和样式。就像 Kun 那样。&lt;/li&gt;
&lt;li&gt;把 RenderObject 做厚：集成大量的布局渲染能力于一身，上层通过样式表驱动 RenderObject 渲染。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;显而易见的，把 RenderObject 做厚会是更好的方案，因为前者复杂度太高（看前面那段层层嵌套的代码也可以直观感受到），每个样式规则的计算都需要一层一层检查推断，导致维护效率下降。&lt;/p&gt;
&lt;p&gt;因此，这里我比较看好 WebF 的方案，并且 WebF 也是目前众多跨端框架中唯一一个拥抱开源的方案，呼吁有兴趣的同学加入 &lt;a href=&quot;https://github.com/openwebf/webf/blob/main/GOVERNANCE.zh-CN.md&quot;&gt;TSC&lt;/a&gt; 一起共建。&lt;/p&gt;
&lt;p&gt;本节参考资料：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openwebf/webf&quot;&gt;https://github.com/openwebf/webf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;晟怀：《WebF 是如何高性能实现 Flutter + Web 融合》（2022 QCon）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Weex 2.0&lt;/h3&gt;
&lt;p&gt;Weex 2.0 是阿里内部开源的跨端方案，目前基本上实现了阿里内部的一核多生态体系。技术架构上完全推倒 1.0 重新研发，期间他们也走了不少探索之路。从分享来看，整套方案比较完备，工作量也很大。&lt;/p&gt;
&lt;p&gt;这个是 Weex 2.0 的结构图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230225225458.png&quot; alt=&quot;&quot; /&gt;重点介绍一下这几个组件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WeexAbility：容器和能力扩展，URL 拦截、缓存、基础 API、三方扩展等。&lt;/li&gt;
&lt;li&gt;WeexFramework：通用基础框架。封装页面实例，实现 DOM、CSSOM、WebAPI 标准，解耦脚本引擎和渲染引擎。&lt;/li&gt;
&lt;li&gt;QKing：脚本引擎，基于 QuickJS 的魔改。&lt;/li&gt;
&lt;li&gt;Unicorn：自绘渲染引擎。实现 CSS 能力，包括完整的节点构建、动画、手势、布局、绘制、合成、光栅化渲染管线，可跨平台。&lt;/li&gt;
&lt;li&gt;WeexUIKit：原生 UI 渲染引擎，封装了原生组件。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2.0 源码产物和前几个框架一样是基于 jsbundle 打出来的 bytecode，但是编译做了一些 SSA 的优化，此外 JS 运行时也做了许多优化，全链路使用 C++开发，没有额外的通信开销、没有冗余的抽象、链路更短，同时基于自研的 Unicorn，有着精简布局算法、精细的操控手势和动画，直通系统图形库。整套方案与 1.0 毫无关系，解决了 1.0 的跨语言通信问题、双端渲染差异问题、布局算法问题、脚本执行效率问题。&lt;/p&gt;
&lt;p&gt;基于 Weex 2.0，阿里解决了烟囱式方案的问题，基于多核同构的内核，推动了基础能力的统一，以此来支持差异化的业务场景：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230225230055.png&quot; alt=&quot;&quot; /&gt;本节参考资料：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;门柳：《淘宝新一代自绘渲染引擎的架构与实践》（2023 GMTC）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注：腾讯的 TDF 也在致力于类似的工作，此处脱敏不再介绍。&lt;/p&gt;
&lt;h3&gt;Waft&lt;/h3&gt;
&lt;p&gt;Waft 全称 WebAssembly Framework for Things，是天猫精灵团队基于 WebAssembly Runtime 与 Skia 开发的一套自绘框架，没有开源。虽然它目前没有实现框架，只支持 AIoT 的场景，但是原理上是可以跨端的，因此放在这里介绍下，以开阔思路。&lt;/p&gt;
&lt;p&gt;天猫精灵早期在 AIoT 上有过一些尝试，最开始做 Android App，但无奈运存太低，只有几百兆，所以性能受限；后续他们开发了云应用，效果虽然还可以，但是服务器成本太高，被叫停；于是继续探索端渲染的道路，研发了 Waft。&lt;/p&gt;
&lt;p&gt;这个是 Waft 的架构图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230225230654.png&quot; alt=&quot;&quot; /&gt;他们也重新设计了加载流程和渲染流程：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230225230717.png&quot; alt=&quot;&quot; /&gt;可见整体工作量比较大，并且也不契合前端标准和生态。&lt;/p&gt;
&lt;p&gt;这里脚本引擎选型 WebAssembly 他们提供了一张对比图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230225230748.png&quot; alt=&quot;&quot; /&gt;这里我对这个脚本引擎的选型是存疑的，想了想有以下不足之处（也可能他们内部有其他考量）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fib 的用例太简单，无法充分发挥 JS 引擎的优势&lt;/li&gt;
&lt;li&gt;AOT 来对比解释执行，是明显不公平&lt;/li&gt;
&lt;li&gt;QuickJS 应该用的原始版本，它还有很大的优化空间&lt;/li&gt;
&lt;li&gt;用力也没有去对比其他有 JIT 模式的引擎，比如 V8 和 JSCore 这些&lt;/li&gt;
&lt;li&gt;这里没有说明使用了什么 wasm 的框架，因为不同 wasm 的实现性能表现是不同的，有的侧重于解释执行的效率，有的则侧重于 AOT / JIT 的效率&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Waft 本身也有的问题，期待他们后续能优化：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CSS 仅支持部分子集&lt;/li&gt;
&lt;li&gt;W3C 标准（DOM Elememt、WebAPI）实现欠缺&lt;/li&gt;
&lt;li&gt;包体积可能偏大，这部分先存疑&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以目前的 Waft 的实现也决定了应用场景，暂且只能支持简单的 IoT 页面。&lt;/p&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;聂鑫鑫：《Waft：基于 WebAssembly 和 Skia 的 AIoT 应用开发框架》（2023 GMTC）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;跨端框架的技术要点&lt;/h2&gt;
&lt;h3&gt;动态化&lt;/h3&gt;
&lt;p&gt;介绍了以上框架，可以总结下跨端框架的应用场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;动态化&lt;/li&gt;
&lt;li&gt;IoT&lt;/li&gt;
&lt;li&gt;Desktop&lt;/li&gt;
&lt;li&gt;车机&lt;/li&gt;
&lt;li&gt;一核多生态&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所谓“没有动态化能力的跨端技术是没有灵魂的”，其实我们也可以发现动态化框架和跨端框架很多部分其实是完全重叠的，我之前总结过动态化的五种实现思路：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于 WebView 的增强&lt;/li&gt;
&lt;li&gt;基于 DSL 的 Native 增强&lt;/li&gt;
&lt;li&gt;基于 GPL 的 Native 增强&lt;/li&gt;
&lt;li&gt;插件化（Android）&lt;/li&gt;
&lt;li&gt;利用 OC 运行时动态化特性（iOS）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我还画了一张图来补充说明：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230225231814.png&quot; alt=&quot;&quot; /&gt;&amp;gt; 注：这张图我画的比较早，其实左上角可以换成 “Flutter 与其他自绘框架”。&lt;/p&gt;
&lt;p&gt;他们的核心其实都是要在 Runtime 期间加载可执行代码，并调用。可以发现前三个动态化的思路和我们总结的跨端框架的技术方向是一模一样的。&lt;/p&gt;
&lt;p&gt;技术要点个人以为有以下几点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;脚本引擎&lt;/li&gt;
&lt;li&gt;渲染引擎&lt;/li&gt;
&lt;li&gt;调试器&lt;/li&gt;
&lt;li&gt;工程化&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一一来介绍。&lt;/p&gt;
&lt;h3&gt;脚本引擎&lt;/h3&gt;
&lt;p&gt;脚本引擎的选型思路有以下三个：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JS 引擎：仅用于胶水语言，对 JIT 不强依赖&lt;/li&gt;
&lt;li&gt;Dart VM：主要是为了利用 Flutter Engine 来渲染，因此使用 Dart 生态&lt;/li&gt;
&lt;li&gt;WARM: 需要设计 DSL 和实现渲染引擎，完善整个生态&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果选择 JS 引擎，那么也有以下几个选型思路：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用双引擎：即各端使用自己的优势引擎，Android 使用 V8，引入 j2v8 即可，而 iOS 使用 JSCore 则完全无包增量。但可惜的是直接使用 JSCore 无法开启 JIT。&lt;/li&gt;
&lt;li&gt;使用 Hermes 单引擎：Meta 为 React Native 这类 Hybrid 框架专门开发的脚本引擎，开箱即用。&lt;/li&gt;
&lt;li&gt;使用 QuickJS 单引擎：大神开发的 JS 引擎，胜在体积极小，性能优秀。&lt;/li&gt;
&lt;li&gt;使用自研 JS 引擎：基本上业内都是基于 QuickJS 做优化的。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;小结了一下 QuickJS 目前存在一些问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;没有 JIT，这个按需实现吧，有 JIT 虽然执行效率上了一个数量级，但是作为胶水语言而言看重的不是这些。JIT 会导致冷启动耗时增加、内存占用变大、体积变大，而且 iOS 还不能用。&lt;/li&gt;
&lt;li&gt;手动 GC，难以管理和维护，可优化&lt;/li&gt;
&lt;li&gt;缺失行号记录&lt;/li&gt;
&lt;li&gt;缺失 Debugger，目前 github 有一些开源插件实现了&lt;/li&gt;
&lt;li&gt;缺少 code cache&lt;/li&gt;
&lt;li&gt;缺少 inline cache&lt;/li&gt;
&lt;li&gt;缺少内存泄露检测能力&lt;/li&gt;
&lt;li&gt;Bytecode 有许多优化的空间&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;渲染引擎&lt;/h3&gt;
&lt;p&gt;渲染引擎选型思路有二：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于 Flutter Engine&lt;/li&gt;
&lt;li&gt;基于系统图形库，如 Skia / OpenGL / Metal / Vulkan&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不管基于啥，框架的整体思路都是精简管线，并使用同步光栅化。&lt;/p&gt;
&lt;h3&gt;调试器&lt;/h3&gt;
&lt;p&gt;Debugger 一种可以让 JavaScript Runtime 进行中断，并可以实时查看内部运行状态的应用，是提供开发者使用的工具，作为框架而言必不可少。&lt;/p&gt;
&lt;p&gt;目前主要有三种调试协议，刚才介绍的框架都至少实现了其中一种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CDP: Chrome DevTools Protocol&lt;/li&gt;
&lt;li&gt;DAP: Debug Adapter Protocol&lt;/li&gt;
&lt;li&gt;自建协议：微信小程序早期就是自建协议&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;工程化方案&lt;/h3&gt;
&lt;p&gt;工程化至少包括以下工作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;资源加载方案&lt;/li&gt;
&lt;li&gt;降级处理&lt;/li&gt;
&lt;li&gt;版本管理&lt;/li&gt;
&lt;li&gt;研发模式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里之前 Q 音开发的 Kant 在工程化上有过详细的设计与实现，此处不展开说了。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;自绘框架常遇到的问题与解题思路：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开发体验差：生态使用前端生态，即提供 JS Runtime；需要提供 Debugger；IDE 需要支持语言服务。&lt;/li&gt;
&lt;li&gt;文档写的不好：写好文档。&lt;/li&gt;
&lt;li&gt;CSS 能力不够用：对齐标准；如果 Dart 侧实现 CSS，需要把 RenderObject 做厚。&lt;/li&gt;
&lt;li&gt;样式和 H5 不一样：堆测试用例，配合 WPT 验证&lt;/li&gt;
&lt;li&gt;Android 和 iOS 不一致：利用已有资源，可基于 Flutter&lt;/li&gt;
&lt;li&gt;组件太少，没有生态：对齐 W3C 标准，尽可能完备&lt;/li&gt;
&lt;li&gt;JS 执行性能差：自研 JS 引擎&lt;/li&gt;
&lt;li&gt;不够标准，无法复用社区库：对齐 W3C 标准，尽可能完备&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;值得学习的一些经验：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;标准至上&lt;/li&gt;
&lt;li&gt;提供丰富的文档&lt;/li&gt;
&lt;li&gt;少自研，合理利用已有资源&lt;/li&gt;
&lt;li&gt;开发体验很重要&lt;/li&gt;
&lt;li&gt;关注低端机表现&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;参考资料与扩展阅读&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;PPT(已脱敏): &lt;a href=&quot;https://weekly.ursb.me/slide/cross-end/&quot;&gt;https://weekly.ursb.me/slide/cross-end/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;门柳：《淘宝新一代自绘渲染引擎的架构与实践》（2023 GMTC）&lt;/li&gt;
&lt;li&gt;聂鑫鑫：《Waft：基于 WebAssembly 和 Skia 的 AIoT 应用开发框架》（2023 GMTC）&lt;/li&gt;
&lt;li&gt;晟怀：《WebF 是如何高性能实现 Flutter + Web 融合》（2022 QCon）&lt;/li&gt;
&lt;li&gt;吉丰：《大终端领域的新物种-KUN》&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openwebf/webf/pull/227/files&quot;&gt;openwebf/WebF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Airing：《Kant 在「QQ 音乐」的实践》（未公开）&lt;/li&gt;
&lt;li&gt;Airing：《Flutter 动态化方案》（未公开）&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=cross-end&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>月刊（第18期）：逃离社交网络</title><link>https://ursb.me/posts/weekly-18/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-18/</guid><description>记录尝试逃离社交网络的动机与方法,剖析表达力弱化、专注力被剥夺与个体价值被遗忘三重消耗,并分享主动获取信息、书信往来与每日留白等应对方式。</description><pubDate>Fri, 03 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;逃离社交网络&lt;/h2&gt;
&lt;p&gt;这个月尝试了“逃离社交网络”，有些收获和心得，本期月刊从“动机”和“方法”两个方面来简单分享一下。&lt;/p&gt;
&lt;h3&gt;0x01 动机&lt;/h3&gt;
&lt;p&gt;首先是动机，为什么要做这个尝试？&lt;/p&gt;
&lt;p&gt;在&lt;a href=&quot;https://weekly.ursb.me/posts/weekly-9/&quot;&gt;《周刊（第 9 期）：高效率到高消耗的现象与反思》&lt;/a&gt;中有说过——「移动互联网带来的更多是消耗，同时上网这件事本身，变得焦虑了」。但后来我又想了下，这个描述不够准确，并非是互联网带来的这些负面因素，准确来说应该是互联网中「社交网络」给我们带来了更多的消耗。&lt;/p&gt;
&lt;p&gt;这些「消耗」具体表现在以下三个方面：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;表达力被弱化&lt;/li&gt;
&lt;li&gt;专注力被剥夺&lt;/li&gt;
&lt;li&gt;个体价值被遗忘&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;首先，&lt;strong&gt;表达力被弱化&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;留心观察社交网络上的文体，包括近几个月来网络依次火过的「疯四文学」、「小狗文学」、「小猫文学」、「疯批文学」、「鼠鼠文学」，皆是套语气、套情境的模版体，这些文体现成的几乎所有段子都没有任何有价值的点可以体现其「表达力」。游离于这般环境的社交网站，由此而来，日积月累，表达能力会受到严重损伤，同时造成线上与线下状态分离。线上可能是疯批文学的段子手，各种文体可以信手捏来，但是线下却写不出一篇逻辑自洽、语言流畅的报告。&lt;/p&gt;
&lt;p&gt;在《论语言的通货膨胀》一文中作者提到了「语言通货膨胀」这个概念——“币制是交换财富的手段，语言是表达思想和情感的媒介；如同制币与其背后财富的不匹配而生的通胀，语言和语言背后的思想、情感的不匹配，就是语言的通胀。”若某个词语被随意、频繁地使用，该词语的词义将被弱化。此时，该词语所能表达的情感也将被弱化，导致情感表达的不到位，这便是语言的通货膨胀现象。&lt;/p&gt;
&lt;p&gt;譬如在以前，我们会用「（笑）」或者「哈哈」来表达快乐的情绪。但现在的网络交流中，「哈」越多，貌似表达的情感越激烈，与之对照来看「哈哈」则显得过于“敷衍”。于是，即便想发「哈哈」也会多凑一些「哈」，避免对方觉得敷衍。这就说语言通货膨胀，在社交网站中，通货膨胀与表达能力的弱化无可避免。&lt;/p&gt;
&lt;p&gt;通胀的背后是语言的贫瘠，表达能力的损伤，也是&lt;strong&gt;情感的缺失&lt;/strong&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;推荐观看：&lt;a href=&quot;https://www.bilibili.com/video/BV1he4y1i7cX/&quot;&gt;《论当今的通话膨胀》&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;其次，&lt;strong&gt;专注力被剥夺&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;社交网络会让我们的注意力变得支离破碎，专注力被剥夺。社交网络无时无刻不在产出消息，若自制力不足，则无时无刻不想着接收这些消息。并且现在获取信息的方式简直太多了，很多消息都是被动输入的，哪怕你没有看过《狂飙》，也会清楚地知道主演是谁、有什么梗、未删减的片段是怎么样的；哪怕你不认识某个演员，如果他发生了什么事情，大概率也会从社交网络中接收到。但这些信息有什么意义吗？于我又有何价值？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;社交媒体大行其道的一个原因，就是它打破了努力创作有实际价值的作品和吸引到人们注意力之间的正相关关系。相反的，它用浅薄的集体主义式交换取代了永恒的资本主义交换：如果你注意我说了什么，我就会注意你说了什么，不管这话语有无价值。——《深度工作》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;而太多的信息造成了信息过载，大脑的容量几乎被这些不断更新的无意义信息填满，如此便造成了消耗。除此之外，当接收的社会消息过多，对事物的敏感度也会降低，情绪变得麻木，不断渴望吃更大的瓜来满足自己在社交网络中的猎奇欲望。&lt;/p&gt;
&lt;p&gt;最后，是&lt;strong&gt;个人价值被遗忘&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;互联网成为我们的精神居所，也成为我们与世界连接的媒介，我们处在一个“连接社会”，“人”与“物”之间的关系、乃至是人与人之间的“关系”，都被“连接”所取代。但是在这个网络连接中，我们每一个具体的、有丰富面向的人，在社交网络中只是一个抽象而单薄的收发的节点，个体的价值淹没于社交网络的汪洋中，鲜有人会静心体悟网络一隅中不知名陌生网友的感想，没有情感的透明流量大多被掠夺至宣发素材上。这样的网络，不值得逗留。&lt;/p&gt;
&lt;h3&gt;0x02 方法&lt;/h3&gt;
&lt;p&gt;我尝试了一些逃离的方法，选取几个有可行性的进行分享。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方法 1：信息从被动接受，转变成主动获取。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;被动接受的大多是垃圾消息或是算法“精心”为你推荐的内容，所以核心一点是转被动为主动，用 RSS 订阅自己关注的周刊、博客、Email、网站、论坛、微博、公众号，每天 1-2 次定时去主动去扫描信息，只阅读你关注的内容。保持好自己的「输入节奏」。是我们在使用互联网，而不是被互联网「利用」。&lt;/p&gt;
&lt;p&gt;除此之外需要去减少在「接触社交网络」上的消耗时间，比如关闭朋友圈入口、关闭微信的通知、把微信移除手机首屏。如果真的关心某个朋友，应该是主动点去朋友圈看，而非在票圈 Feed 流刷到了他的消息才去问候。而关闭微信通知推送也是同样的理由，不过找我的人较少，目前看来没有什么影响。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方法 2：培养邮件交流的习惯。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;写邮件代替细碎聊天也是一个非常不错的方法，可以沉淀自己日常的想法并锻炼表达力，让自己的关注点回归文字本身，赋予语言与情感最真实、细腻的纹理。并且写信本身也是一件较为庄重的事，可以培养生活里的仪式感。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方法 3：每天为自己留点时间。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;最后就是每天要自己留些时间（我是中午和晚上各半小时），这段时间不会有人打扰，也拒绝接受任何消息，专注于自己想做的事——阅读也好，工作也罢。这有利于培养自己专注力，做事时也能够更容易进入心流状态。&lt;/p&gt;
&lt;h2&gt;本月记录&lt;/h2&gt;
&lt;p&gt;刚刚过去的一月过得非常充实，把家里人接来深圳过了年，利用假期较为系统地学习了编译原理相关的知识以补充下内功，也借着工作之便实践了一下 babylon。沉下心来阅读，与友人写信，和家人凌晨去看《满江红》，翻出了很久没用的 PC 和精英版的 Xbox 手柄玩了一直想玩的《荒野大镖客 2》——应该是有史以来最棒的一月了。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;读完：哲学 |《悉达多》 | ★★★★★&lt;/li&gt;
&lt;li&gt;在读：小说 |《少年巴比伦》 | ★★★★★&lt;/li&gt;
&lt;li&gt;看完：电影 |《满江红》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看完：动画 |《间谍过家家》 | ★★★★★&lt;/li&gt;
&lt;li&gt;在看：日剧 |《凪的新生活》 | ★★★★☆&lt;/li&gt;
&lt;li&gt;在看：剧集 |《三体》 | ★★★★★&lt;/li&gt;
&lt;li&gt;在看：动画 |《中国奇谭》 | ★★★★★&lt;/li&gt;
&lt;li&gt;在玩：Switch |《女神异闻录 P5R》| ★★★★★&lt;/li&gt;
&lt;li&gt;在玩：Steam |《荒野大镖客 2》| ★★★★★&lt;/li&gt;
&lt;li&gt;在玩：PS4 |《双人成行》| ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-18&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>2022，平安喜乐</title><link>https://ursb.me/posts/summary-2022/</link><guid isPermaLink="true">https://ursb.me/posts/summary-2022/</guid><description>2022年终总结：晋升T10并深耕Chromium与JS引擎写作系列文章，情绪管理明显改善，经历一段短暂恋情、乔迁购车，记录梅西、Faker、小智等圆梦故事与书影音清单。</description><pubDate>Mon, 02 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;转眼间，这已经是第五篇年终总结了。从 2018 的「沉淀初心」到 2019 的「走走停停」，再到 2020 的「追逐星火」，与去年的「自渡向前」。至于今年的关键词，琢磨了许久，最后决定就叫「平安喜乐」吧！&lt;/p&gt;
&lt;p&gt;平安喜乐，既是总结，但&lt;strong&gt;更多是期许&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;工作&lt;/h2&gt;
&lt;p&gt;每年的年终总结第一个环节都是工作，今年也不例外，毕竟是我投入精力最多的部分了。&lt;/p&gt;
&lt;p&gt;今年工作有一个好的开端，年初的晋升答辩顺利通过，达成毕业两年半晋升 T10 的成就，不知这个耗时是否前无古人，但新的公司制度限制了晋升答辩的频次，所以应该是后无来者了。&lt;/p&gt;
&lt;p&gt;在&lt;a href=&quot;https://me.ursb.me/archives/2021.html&quot;&gt;去年的年终总结&lt;/a&gt;中，总结的第一个问题是「多线程事务处理能力薄弱」，如今再回顾，这个问题基本已经解决了。今年的日常中，几乎每天都有多项事情要处理。一个新事情来了，我不会立刻处理它，而是先记下来把它放进收件箱中。等我阶段性处理完手头上的事情之后，再去收集箱中给它打上优先级的标记，同时去看下收集箱里是否有 P0 标记的事项，如果有就立马切换过去处理，否则就处理 P1 或接着处理手上的事情。&lt;/p&gt;
&lt;p&gt;简而言之，依靠收集箱与优先级就可以解决这个问题了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;收集箱可以让自己不遗漏任何琐碎的事情，同时把其他事情临时放进收集箱也是一种处理，它不会打断自己手上正在做的事情。频繁切换线程是低效率最重要的因素，因此核心在于尽量避免频繁切换，保持专注。&lt;/li&gt;
&lt;li&gt;而优先级则方便高优的事情快速解决，不会耽误项目进程。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今年 Q3 有幸拿了公司的青年优才奖，同时绩效是 4+5，没有六连五星算是退步了吧（笑）。但认真说来，其实这个绩效是超乎了我的预期了，因为今年手头上没有负责过复杂的项目，自己在技术深度上的挖掘也是较为不满意的。如果此刻去答 T11，基本拿不出什么项目，因此感觉到今年在自我成长性上的欠缺。年底和 Leader 说了这个问题，同时也反思了一下，我个人在日常的项目中看问题的角度也是受限的。&lt;/p&gt;
&lt;p&gt;手上的项目，无论难易与否、重要与否，其都有值得自己学习的东西。比如被我吐槽只是参与联调工作的项目 A，虽然是核心技术在公司 B 手上，但是我确实没有考虑过如果不依赖公司 B 的话，仅靠自己如何能实现同等或者是更好的项目效果。&lt;/p&gt;
&lt;p&gt;《打开心智》里提到过一种“经验值心态”，把工作看成打怪联机。这种心态最大的价值在于，它为生活中大大小小的事情，都赋予了意义：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果一项任务是重复、单调的：没关系，它能够提高我的熟练度，让我在这项技能的使用上更加得心应手。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果遇到一个突如其来的问题：那更好，我触发了一项隐藏的挑战，又有一个新的目标可以去实现了……&lt;/p&gt;
&lt;blockquote&gt;&lt;/blockquote&gt;
&lt;p&gt;如果遇到一个意料之中的问题：没关系，这本来就是我的主线任务，我辛辛苦苦练级就是为了通过它。&lt;/p&gt;
&lt;blockquote&gt;&lt;/blockquote&gt;
&lt;p&gt;如果一项任务是艰巨、困难的：非常棒，它能够给我带来大量经验让我快速成长，获得更强的能力。&lt;/p&gt;
&lt;p&gt;如果我可以想得足够多，并且不仅仅只满足于完成手上的工作，那成长性就不再是受限的了。本可以做的更好一些，这是今年的遗憾之一。&lt;/p&gt;
&lt;p&gt;今年暑期带了一个很认真的实习生，看到了当年自己实习时的影子。那是 18 年，也是第一次写年终总结，标题是&lt;a href=&quot;https://me.ursb.me/archives/153.html&quot;&gt;「沉淀初心」&lt;/a&gt;。最开始我学技术做产品的初心，如今还剩下多少。迷茫之际，时不时提醒着自己，现在所做的事情、所经历的一切、所收获的一切绝不是没有意义的，它们都会成为养分，在今后的路途上，会帮助自己更好地面对下一个关卡的“BOSS”。&lt;/p&gt;
&lt;p&gt;今年业余期间学了 Chromium 和 JS 引擎的一些知识，沉淀了一些文章：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://me.ursb.me/archives/js-string-to-number-1.html&quot;&gt;引擎剖析：JS 中的字符串转数值（上）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://me.ursb.me/archives/js-string-to-number-2.html&quot;&gt;引擎剖析：JS 中的字符串转数值（下）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://me.ursb.me/archives/case-sensitivity.html&quot;&gt;前端开发中的大小写敏感问题&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://me.ursb.me/archives/360.html&quot;&gt;Chromium 渲染流水线——字节码到像素的一生&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://weekly.ursb.me/posts/weekly-14/&quot;&gt;Chromium Rendering Pipeline - Introduce&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://weekly.ursb.me/posts/weekly-15/&quot;&gt;Chromium Rendering Pipeline - Parsing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对技术的热情未曾消退，同时也发觉了自己有许多可以成长的空间。&lt;/p&gt;
&lt;p&gt;2023，愿工作上不骄不躁，沉淀技术。&lt;/p&gt;
&lt;h2&gt;学习&lt;/h2&gt;
&lt;p&gt;这个模块打算总结一下自己今年在输入与输出上的两个改变。&lt;/p&gt;
&lt;p&gt;第一个改变是发掘了新的输入方式。&lt;/p&gt;
&lt;p&gt;今年开始听播客了，发现播客也是一个信息输入的好手段，但自己平时听得也并不多，只听《商业就是这样》和声动活泼的《跳进兔子洞》。&lt;/p&gt;
&lt;p&gt;此外，发现自己获取信息的手段并不及时，且特别受推荐算法的影响陷入信息茧房之中。比如忘记打开平台的网站（如少数派、掘金这种），就会遗漏一些不错的文章；关注的技术公众号推来推去也总是那几篇文章在互相推。于是搭建了属于自己的 RSS 和邮件订阅系统（&lt;a href=&quot;https://weekly.ursb.me/posts/weekly-16/&quot;&gt;WJ.16: 个人信息流分享&lt;/a&gt;），采集信息和整理的效率高出了很多，是今年最满意的收获之一了。&lt;/p&gt;
&lt;p&gt;第二个改变是开始写&lt;a href=&quot;https://weekly.ursb.me/posts/weekly-1/&quot;&gt;周刊&lt;/a&gt;了。&lt;/p&gt;
&lt;p&gt;至于为什么要写周刊，在 &lt;a href=&quot;https://weekly.ursb.me/posts/weekly-1/&quot;&gt;WJ.1: 开刊，为什么写周刊&lt;/a&gt; 中详细说明过，这里就不赘述了。值得一提的是，周刊在中间停了两个月，因为写着写着意识到自己每周的（非技术）输入并不是很充足，且周末也没有足够的时间把它们整理成周刊，导致周刊的选题与行文的质量自己并不是很满意，于是在最后两个月中把它调整了月刊。&lt;/p&gt;
&lt;p&gt;今后不管是否有读者，我都会为了未来的自己而坚持写下去的。&lt;/p&gt;
&lt;h2&gt;情绪&lt;/h2&gt;
&lt;p&gt;去年年终总结里提到的问题「容易陷入焦虑的负面情绪」，于是有个目标是「修炼自己的心性」，今年则重点做了情绪管理。下面是今年的心情记录，较以往几年而言，绿色的成分明显多了很多。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2022-emotion.jpeg&quot; alt=&quot;&quot; /&gt;遇到某些事情的时候，情绪会突如其来，我会立马感觉到焦躁、愤怒或难过等负面情绪，但仅仅只有那么一瞬，我明白此刻是情绪占据了理智，任由自我情绪发泄是不当的行为。&lt;/p&gt;
&lt;p&gt;情绪的本质是「大脑警报器」，而我把它当成了一个卫兵，当它告诉我此刻应该愤怒的时候，我确实立马感觉到了愤怒的情绪。但我又会告诉自己，情绪是不可控的，情绪的发泄此刻可能解决不了任何问题。我会告诉这个愤怒的卫兵：“我知道了，你退下吧。我接纳了这个情绪，现在咱们先冷静下来分析问题，回头再慢慢消化你的愤怒吧”。&lt;/p&gt;
&lt;p&gt;而绝大多数时，当我处理完那件事或者处理不了接受现实之后，彼时的负面情绪也就烟消云散了，不存在什么回头慢慢消化。&lt;/p&gt;
&lt;p&gt;我并非排斥那时的愤怒或悲伤，只是接纳了它。&lt;/p&gt;
&lt;p&gt;除此之外，再分享一个我特别喜欢的方法：“&lt;em&gt;每当我遇到自己不敢直视的困难时，我就会闭上双眼，想象自己是一个80岁的老人，为人生中曾放弃和逃避过的无数困难而懊悔不已，我会对自己说，能再年轻一次该有多好，然后我睁开眼睛：砰！我又年轻一次了！&lt;/em&gt;”&lt;/p&gt;
&lt;p&gt;此外在睡前回顾今日的心情时，也会选择性地去记录今天遇到的美好的事情，一方面是期望带来好梦，另一方面是期待明天可以更美好。因此今年心情记录的绿色偏多了不少，这是一个好的改变。&lt;/p&gt;
&lt;p&gt;日记确实是需要如实的记录，但若只是选择性地忽略琐碎而烦心的小事，去记住更值得记录的美好，不是一件更美好的事吗？&lt;/p&gt;
&lt;h2&gt;感情&lt;/h2&gt;
&lt;p&gt;不堪回首的往事我不愿去想，但是今年春天这段&lt;a href=&quot;https://me.ursb.me/archives/weekly-3.html&quot;&gt;短暂的恋情&lt;/a&gt;，即便现在回忆起来也只有美好的点滴。现如今，真的只剩下「&lt;strong&gt;一瞬の夢&lt;/strong&gt;」了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;希望今后仍旧能抱着那时被珍视的心情，勇敢地继续走下去。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2022-006.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;生活&lt;/h2&gt;
&lt;p&gt;今年搬了新家，换了居住三年的小屋子搬到了一个大屋子。&lt;/p&gt;
&lt;p&gt;喜欢我房间窗外的晚霞。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2022-001.jpeg&quot; alt=&quot;&quot; /&gt;喜欢上班路上的那条小河。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2022-002.jpeg&quot; alt=&quot;&quot; /&gt;今年开始「计划消费」了，之前其实也记账，而且记了 6 年有余，但之前只是机械地记录而已，对花销没有什么控制，每个月底一看账单汇总总是想不起来为什么数字会是这样。今年换了《MoneyThings》来记录，制定了每周与每月的消费计划，每周还有进度条来可视化控制余额，算是非常好用了。&lt;/p&gt;
&lt;p&gt;今年还购入了小车，是看剧种草的 mini F57。原本我四月订的是特斯拉，当时恋爱期间有车方便去广州，但订车有点盲目跟订的感觉，而且只是对特斯拉的品牌有认知，所以下定了，认为随众不会有错，所以后来也一直没有取消订单。&lt;/p&gt;
&lt;p&gt;但是在剧里看到 mini 敞篷之后瞬间心动，简直就是梦中情车，当晚就了解了这个品牌的历史和车型，第二天预约试驾，考虑了一中午之后下午就给了定金。不知道这算不算冲动消费，但是现在用来一点儿也不后悔。很有个性、帅萌帅萌的一台小车，在大街上从来没有撞见到同款~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2022-003.jpeg&quot; alt=&quot;&quot; /&gt;By the way，家里有很多只猫猫，手套和泡芙过得很好。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2022-004.jpeg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2022-005.jpeg&quot; alt=&quot;&quot; /&gt;By the way，目前还没有阳，希望能坚持到年后。&lt;/p&gt;
&lt;h2&gt;圆梦&lt;/h2&gt;
&lt;p&gt;今年发生了很多事情，若排除掉社会面上负面的新闻，如果要我总结今年的关键词，我给出「圆梦」这个词。&lt;/p&gt;
&lt;p&gt;首先是世界杯梅西圆梦，从19岁到35岁，人生有多少个16年能让你追随梦想。&lt;/p&gt;
&lt;p&gt;然后是英雄联盟的戴先生的最后一舞，10 年来一直在追逐冠军，从最不被看好的四号种子到打败大魔王拿下冠军，这是一位电竞选手最完美的谢幕。&lt;/p&gt;
&lt;p&gt;还有宝可梦的小智，从高级球之后我每周五晚上都在追《旅途》，真新镇小智的 25 年，从 1999 年石英联盟 16 强到 2002 城都联盟 8 强，2005 丰缘联盟 8 强，2010 神奥联盟 4 强，2013 合众联盟 8 强，再到最可惜的 2016 卡洛斯联盟亚军，最终 2019 拿下阿罗拉冠军，接着今年拿到世界锦标赛总冠军。&lt;/p&gt;
&lt;p&gt;25 年冠军圆梦之路，虽然 25 年被编剧不断剧情杀，但是小智在观众心目中已经是当之无愧的宝可梦大师了！小智的故事最终还是谢幕了，希望最后的《特别篇》中能给他和皮卡丘一个好的结局。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PS. 其实打丹帝的时候更希望老宠回来，世界第一喷火龙的约定，还有和忍蛙一起登上巅峰的预言，这些观众都没有看到呀！25 年的结局真的不想留下一丁点儿遗憾。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;PSS. 安利一个视频：&lt;a href=&quot;https://www.bilibili.com/video/BV1kG4y1t7FW/?vd_source=1fe8af6c07d1b622a35ca9ca19e717d2&quot;&gt;《“真新镇少年小智的25年”【小智宝可梦世界锦标赛决赛夺冠纪念MAD】》&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最后还有灌篮高中全国大赛的动画化，再次看到湘北的比赛，圆了小时候的梦。&lt;/p&gt;
&lt;p&gt;圆梦之年，祝愿大家也可以圆青春时的梦。&lt;/p&gt;
&lt;h2&gt;书音影&lt;/h2&gt;
&lt;p&gt;如果要评选今年买的最有价值的物品，那必然是投影仪了！今年周末看了很多剧。&lt;/p&gt;
&lt;p&gt;简单列一下今年看过的剧、电影和书籍吧，大部分我会顺手给出评价或是吐槽一句。&lt;/p&gt;
&lt;h3&gt;剧集&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/35141236/&quot;&gt;钱断情始&lt;/a&gt;》：★★★★★，喜欢春马的笑容，喜欢女主的反消费主义。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/35142915/&quot;&gt;行骗天下&lt;/a&gt;》：★★★★★，看完了剧集与四部剧场版，全部都给了 5 星好评。有笑点、燃点、泪点，剧本满分，长泽雅美满分！&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/26720117/&quot;&gt;卖房子的女人&lt;/a&gt;》：★★★★☆，很热血的一部剧，没有干劲的时候可以看看。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/35030325/&quot;&gt;僵尸校园&lt;/a&gt;》：★★★★☆，我对丧尸片毫无抵抗力，这部丧尸片每集都堪比釜山行，虽高开低走，但也值得一看。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/35524446/&quot;&gt;非常律师禹英禑&lt;/a&gt;》：★★★★★，很温暖治愈的一部剧，看着莫名心情变好。By the way，mini F57 我就是在这部剧种草的，看着郑明锡在敞篷里吹风看风景，简直就是梦中情车，第二天就预约了试驾并下定了。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/30156074/&quot;&gt;金宵大厦&lt;/a&gt;》：★★★☆☆，吃饭的时候看的，互相魂穿的设定不错，但演技浮夸、情节平庸。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/30291070/&quot;&gt;财阀家的小儿子&lt;/a&gt;》：★★★☆☆，烂尾了。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;电影&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/6844868/&quot;&gt;狼少年&lt;/a&gt;》：★★★★☆&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/35183042/&quot;&gt;独行月球&lt;/a&gt;》：★★★★☆&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/35700395/&quot;&gt;坠落&lt;/a&gt;》：★★★☆☆&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/1329562/&quot;&gt;头文字D&lt;/a&gt;》：★★★★★&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/1296339/&quot;&gt;爱在黎明破晓前&lt;/a&gt;》：★★★★★&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/1291990/&quot;&gt;爱在日落黄昏时&lt;/a&gt;》：★★★★★&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/26419637/&quot;&gt;误杀瞒天记&lt;/a&gt;》：★★★★★&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/7059671/&quot;&gt;最佳出价&lt;/a&gt;》：★★★★★，结局很震撼，千万不能开弹幕看！&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/1300613/&quot;&gt;土拨鼠之日&lt;/a&gt;》：★★★★★，不愧为经典之作。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/30469922/&quot;&gt;密室逃生2&lt;/a&gt;》：★★★☆☆，商业爆米花电影。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/1300299/&quot;&gt;杀人回忆&lt;/a&gt;》：★★★★★，韩国电影的水平确实很高。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/30304994/&quot;&gt;奇异博士2&lt;/a&gt;》：★★★★☆，只看预告、搭配女巫&amp;amp;博士两个魔法大 IP，原本或许可以成为让第四阶段翻身的电影，但最终呈现的效果和主题深度上都稍显逊色。旺达的性格转变也太突兀了，让人怀疑导演甚至没有看过《旺达幻视》。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/35505100/&quot;&gt;这个杀手不太冷静&lt;/a&gt;》：★★★★☆，看名字以为是烂片，但有点出乎意料了。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/30314848/&quot;&gt;瞬息全宇宙&lt;/a&gt;》：★★★★★，丰富的想象力搭配光怪陆离地表现力，满分作品。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/34874432/&quot;&gt;花束般的恋爱&lt;/a&gt;》：★★★★★，令人难过的电影，但也同时是令人释怀的电影。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/5912992/&quot;&gt;熔炉&lt;/a&gt;》：★★★★★&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/26933210/&quot;&gt;蜘蛛侠：英雄无归&lt;/a&gt;》：★★★★★，看在三蛛同屏的面子下给的情怀分。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/35613853/&quot;&gt;长津湖之水门桥&lt;/a&gt;》：★★★★☆，春节时和家人一起在影院看的。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/26628357/&quot;&gt;一个叫欧维的男人决定去死&lt;/a&gt;》：★★★★★，贼喜欢这种表现生活小日常的温情片。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;动漫&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/35118256/&quot;&gt;赛博朋克：边缘行者&lt;/a&gt;》：★★★★★&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/1865703/&quot;&gt;红辣椒&lt;/a&gt;》：★★★★★，满分。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/1395091/&quot;&gt;未麻的部屋&lt;/a&gt;》：★★★★★，满分，但是大晚上看的，还有点害怕。&lt;/li&gt;
&lt;li&gt;《夏日重现》：★★★★★，老实说动画的节奏有点怪异，结尾的配乐也不好，没有漫画好看。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/35258427/&quot;&gt;间谍过家家&lt;/a&gt;》：★★★★★，看着很治愈。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://movie.douban.com/subject/34813210/&quot;&gt;鬼灭之刃 游郭篇&lt;/a&gt;》：★★★★★，漫画党，在剧情保障的情况下还有优异的作画，着实是满分作品。&lt;/li&gt;
&lt;li&gt;《宝可梦 旅途》：★★★★☆（只看八大师之后）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;阅读&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;《&lt;a href=&quot;https://book.douban.com/subject/36089614/&quot;&gt;打开心智&lt;/a&gt;》：★★★★★，值得一读，可以学到很多东西。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://book.douban.com/subject/27200261/&quot;&gt;假面山庄&lt;/a&gt;》：★★★★☆&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://book.douban.com/subject/35789345/&quot;&gt;记忆旅行者&lt;/a&gt;》：★★★★☆，设定很棒，画卷展开的节奏很吸引人，但结局有些仓促。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://book.douban.com/subject/30210250/&quot;&gt;谁杀了她&lt;/a&gt;》：★★★★☆&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://book.douban.com/subject/34786086/&quot;&gt;沉默的巡游&lt;/a&gt;》：★★★★☆&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://book.douban.com/subject/35579316/&quot;&gt;见字如面&lt;/a&gt;》：★★★★☆，前半部分 4 星，后半部分 2 星。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://book.douban.com/subject/26651926/&quot;&gt;红手指&lt;/a&gt;》：★★★★★&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://book.douban.com/subject/10740776/&quot;&gt;占星术杀人魔法&lt;/a&gt;》：★★★★★，本格推理，读得很慢也没有读懂，搭配着视频分析才明白手法。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://book.douban.com/subject/35094680/&quot;&gt;桶川跟踪狂杀人事件&lt;/a&gt;》：★★★★★，纪实文，作者是一个记者，工作兢兢业业，心中一直有着名为正义的尺子不曾动摇，值得尊重和学习。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://book.douban.com/subject/26877752/&quot;&gt;恶意&lt;/a&gt;》：★★★★★，叙述性诡计玩得不错。&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://book.douban.com/subject/26118072/&quot;&gt;祈祷落幕时&lt;/a&gt;》：★★★★☆&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://book.douban.com/subject/25957816/&quot;&gt;悖论13&lt;/a&gt;》：★★★★☆&lt;/li&gt;
&lt;li&gt;《&lt;a href=&quot;https://book.douban.com/subject/35494160/&quot;&gt;挽救计划&lt;/a&gt;》：★★★★☆&lt;/li&gt;
&lt;li&gt;《苏东坡传》：★★★★★，“我一生之至乐在执笔为文之时，心中错综复杂之情思，我笔皆可畅达之。我自谓人生之乐，未有过于此者也。”&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;游戏&lt;/h3&gt;
&lt;p&gt;游戏就不评分啦，既然是选择玩通关了，本身就说明对我个人就一定的吸引力了。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;《三角战略》：战棋爱好者的盛宴，又是像素风格，简直太棒了！&lt;/li&gt;
&lt;li&gt;《异度之刃 3》：玩了几个小时，发现太肝了，弃了。&lt;/li&gt;
&lt;li&gt;《宝可梦剑盾 · 盾》：已通关，剧情太差，道馆太简单。联机部分还没有游玩。&lt;/li&gt;
&lt;li&gt;《十三机兵防卫圈》：游玩中，剧情进度有点慢，故事还没有展开，暂不评价。&lt;/li&gt;
&lt;li&gt;《女神异闻录 P5R》：不愧是天下第一的游戏，大约每两周推一个宫殿，目前还在赌场。&lt;/li&gt;
&lt;li&gt;《原神 3.0》：草神赛高！&lt;/li&gt;
&lt;li&gt;《王者荣耀》：以前很少玩，一直是白金钻石这样。前几个月开始每天下班来一局，居然一波单排连胜上了无双。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;新年目标&lt;/h2&gt;
&lt;p&gt;最后是新年目标环节：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;生活上：培养&lt;strong&gt;感恩心&lt;/strong&gt;，多与人打交道，主动建立人与人之间的链接。（今年几乎没有认识新的朋友）&lt;/li&gt;
&lt;li&gt;学习上：保持&lt;strong&gt;好奇心&lt;/strong&gt;，继续保持好奇地学习心态，保持好奇，不断地好奇；追求真知，仅为求知而求知。&lt;/li&gt;
&lt;li&gt;工作上：保持&lt;strong&gt;谦卑心&lt;/strong&gt;，在完成项目的基础上，不要设置自己的边界。多去想，多思考，多实践，多反思，发掘并扩大影响力。&lt;/li&gt;
&lt;li&gt;心态上：保持&lt;strong&gt;喜乐心&lt;/strong&gt;，要擅于发现与记录身边的美好，过诗意的人生。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后想用《钱断情始》的一句话作为 2022 的结语——“&lt;strong&gt;细流涓涓不绝，其水滴滴各异，泡沫浮于淤泥，且消乎且结乎，概无久存之例，世间人事，鸟兽栖息，亦不如此。&lt;/strong&gt;”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2022-007.jpeg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;愿你，愿我，愿那些在空中飘荡的心愿，最终都能传达到温柔的彼岸。&lt;/strong&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=summary-2022&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>月刊（第17期）：心之所向，素履以往</title><link>https://ursb.me/posts/weekly-17/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-17/</guid><description>第17期月刊由骑行流浪中国的博主徐云说起，串联刘慈欣《山》、徐霞客游记与王小波的文字，探讨探索欲望与按自己的方式度过人生的人生意义。</description><pubDate>Sun, 25 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;心之所向，素履以往&lt;/h2&gt;
&lt;p&gt;最近迷上了「徐云流浪中国」的视频，up 主大约 2 日一更，记录自己骑行中国、风餐露宿的流浪生活。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/20221225192143%402x%202.png&quot; alt=&quot;&quot; /&gt;徐云出身农村，两年没有工作过，只带着一辆单车、一个帐篷、一个睡袋、一个防尘布、一张防潮垫、一个折叠式柴火炉、一个打火机、一个高压锅、还有充电宝/手机/运动相机，骑行到了海拔 5000 米川西高原、零下 30 度东北边境。&lt;/p&gt;
&lt;p&gt;每天在野外骑行，尽量避开人群，浏览自然风格。夜晚则孤身一人在桥底、道路旁、山沟里、废弃屋内搭帐篷过夜（废弃屋对于他而言简直就是五星级住房了）。并且几乎每顿晚饭都是自己捡木柴生火做饭，除了必要的补充补给之外很少进城住宾馆。&lt;/p&gt;
&lt;p&gt;每期视频有近半的时长是做饭的时候对着镜头闲聊。对他而言，这种异步的沟通记录是种奇妙的体验；对我们而言，他成了我们看世界的眼睛。&lt;/p&gt;
&lt;p&gt;我把视频推荐给朋友的时候，他们很难理解为什么会有人选择过这种生活。我看了网上的评价，除了鼓励之外，有质疑、有同情也有劝诫。&lt;/p&gt;
&lt;p&gt;在&lt;a href=&quot;https://www.bilibili.com/video/BV1xW4y1s7se/&quot;&gt;某期视频&lt;/a&gt;中徐云给出了回答：“&lt;strong&gt;但路就在那，你得往前走。&lt;/strong&gt;”&lt;/p&gt;
&lt;p&gt;这让我想到了刘慈欣的《山》，小说中的主角执迷于登山，他说：“&lt;strong&gt;我们之所以登山，因为山就在那里。&lt;/strong&gt;”&lt;/p&gt;
&lt;p&gt;小说中的地核文明也和人类的探险史如出一辙，一代又一代去探索外面的世界。无论是好奇心也好，是征服欲也罢，因为它就在那里，所以他们要去。基于一代又一代探险者的前赴后继，地核文明的加加林终于摆脱了暗无天日的地核，看到了灿烂的星空。&lt;/p&gt;
&lt;p&gt;心之所向，犹梦何妨？&lt;/p&gt;
&lt;p&gt;高中那会儿读《明朝那些事儿》，令我印象深刻的除了王阳明、海瑞、张居正、于谦等当年明月花了较长篇幅介绍的名人之外，还有一个人令我为之动容——徐霞客。在明朝七部曲的文末，当年明月用&lt;a href=&quot;https://blog.sina.com.cn/s/blog_49861fd50100culs.html&quot;&gt;徐霞客的故事&lt;/a&gt;做了全篇的收尾，写得特别好，这里建议读者有空重温下。&lt;/p&gt;
&lt;p&gt;当年明月用如此之多的篇幅，讲述一个王朝的兴起和衰落，在终结的时候，却说了徐霞客游记的故事。为什么呢？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;此前，我讲过很多东西，很多兴衰起落、很多王侯将相、很多无奈更替，很多风云变幻，但这件东西，我个人认为，是最重要的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;因为我要告诉你，所谓千秋霸业，万古流芳，以及一切的一切，只是粪土。先变成粪，再变成土。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;现在你不明白，将来你会明白，将来不明白，就再等将来，如果一辈子都不明白，也行。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;而最后讲述的这件东西，它超越上述的一切，至少在我看来。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;但这件东西，我想了很久，也无法用准确的语言，或是词句来表达，用最欠揍的话说，是只可意会，不可言传。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;然而我终究是不欠揍的，在遍阅群书，却无从开口之后，我终于从一本不起眼，且无甚价值的读物上，找到了这句适合的话。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;这是一本台历，一本放在我面前，不知过了多久，却从未翻过，早已过期的台历。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;我知道，是上天把这本台历放在了我的桌前，它看着几年来我每天的努力，始终的坚持，它静静地，耐心地等待着终结。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;它等待着，在即将结束的那一天，我将翻开这本陪伴我始终，却始终未曾翻开的台历，在上面，有着最后的答案。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;我翻开了它，在这本台历上，写着一句连名人是谁都没说明白的名人名言。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;是的，这就是我想说的，这就是我想通过徐霞客所表达的，足以藐视所有王侯将相，最完美的结束语：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;成功只有一个——按照自己的方式，去度过人生。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;《徐霞客游记》中有言：“初四日，兀坐听雪溜竟日。”&lt;/p&gt;
&lt;p&gt;反思一下自己这月初四在做些什么，是奔忙着追逐富贵与功名、还是操劳着家庭、忧心着事业？但徐霞客却坐在黄山绝顶，听了一整天的大雪融化声。&lt;/p&gt;
&lt;p&gt;徐霞客不是奔着写《徐霞客游记》去旅游的，辛弃疾不是奔着写《稼轩诗集》去救国的。&lt;/p&gt;
&lt;p&gt;我们需要的是爱生活，而不是爱生活的意义。如同王小波所说：“我来这个世界，不是为了繁衍后代。而是来看花怎么开，水怎么流。太阳怎么升起，夕阳何时落下。我活在世上，无非想要明白些道理，遇见些有趣的事。生命是一场偶然，我在其中寻找因果。 ”&lt;/p&gt;
&lt;p&gt;有首我很喜欢听的歌，叫《路过世界的旅行家》，歌词描述了旅行者的见闻与心境，最后以「那便是你，生而为人曾经存在的印迹」一句词作为结尾。人生是没有意义的，有的只是「一连串的刹那」，那便是我们存在的痕迹。&lt;/p&gt;
&lt;p&gt;这一生最重要的是体验和感受，去拥抱美好，度过自己想要的人生。&lt;/p&gt;
&lt;p&gt;最后以我崇拜的一位皮克斯设计师在采访中说过的话作为结尾——「&lt;strong&gt;成就不在于外在定义，全看是否按自己的意愿在活。&lt;/strong&gt;」&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;浮游于世，魂魄荧荧。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;心之所向，素履以往。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;本月记录&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;看完：韩剧 |《财阀家的小儿子》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;在看：日剧 |《凪的新生活》 | ★★★★☆&lt;/li&gt;
&lt;li&gt;在看：动画 |《三体》 | ★★☆☆☆&lt;/li&gt;
&lt;li&gt;在玩：Switch |《女神异闻录 P5R》| ★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;《财阀》标准爽文穿越剧情，高开低走（不知道算不算高开），综合 3 分吧。如果可以把男女主换下演员可能效果会更好，全剧的演技基本靠爷爷撑起来的 Orz。最后期待一波今晚的大结局。&lt;/p&gt;
&lt;p&gt;《凪的新生活》还没看完，并不是很喜欢这种强行洗白的剧情，编剧企图将对他人已然造成的伤害，归因成自身的性格缺陷。不过挺喜欢日剧这种小清新的生活气息。&lt;/p&gt;
&lt;p&gt;《三体》动画一言难尽，看完第四集决定弃了，缺点很多就不吐槽了，提一嘴优点——广告营销做的很好。&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-17&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>月刊（第16期）：个人信息流分享</title><link>https://ursb.me/posts/weekly-16/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-16/</guid><description>第16期月刊图解作者的个人信息流管理方案，从Inoreader订阅、关键词监控自动推送，到Reeder快捷键阅读、Readwise划线标注同步至Logseq和Obsidian笔记的完整流程。</description><pubDate>Sat, 03 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;周刊暂停了一段时间，发现每周保持更新对我的压力还是有些大的。经过调整之后，发觉 3 周更一下挺合适的，那 3 周更一下，不如就月更啦~所以这次月刊主要分享下 11 月发现的好玩意儿！&lt;/p&gt;
&lt;h2&gt;个人信息流分享&lt;/h2&gt;
&lt;p&gt;本期分享一下我的信息流，简单画了个图示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/%E4%BF%A1%E6%81%AF%E6%B5%81%E5%88%86%E4%BA%AB@2x.png&quot; alt=&quot;&quot; /&gt;这套信息流个人用起来非常舒服，只要在 inoreader 或 reader 上进行文章阅读即可，搭配 Readwise 服务，阅读文章时的标注可以自动同步到 Logseq 等笔记软件上。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步：输入，即订阅的信息源。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这里我订阅了一些公众号的推送、B 站 Up 主的更新通知，以及 V2EX、少数派、掘金、豆瓣小组、知乎热榜、微博热搜等 RSS；如果是订阅的 newsletter，还可以配置邮件转发，将所有需要的数据统一输入到 inoreader 上。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20221203141149@2x.png&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;第二步：采集，即通过自动化初筛信息源。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这里使用 inoreader 的规则和监控能力，可以监控新增信息源的关键词。比如我监控了 Vite，之后搭了个 Webhook 转发服务，当掘金、知乎、前端 Q 公众号推送了关于 Vite 的文章之后，inoreader 会触发我自定义的 Webhook，将文章推送到我的企业微信机器人上，以此达到信息源监控的效果。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20221203141427@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;同理，我也监控《深圳卫健委》公众号的新增文章，若标题有「日新增」字样也会发送到我的企业微信机器人上，从而实现订阅深圳疫情实况的功能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三步：阅读，即阅读文章并进行标注笔记。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这里使用 Reeder 或者直接在 inoreader 上阅读均可，前者是原生开发的阅读器，体验会更好一些，无论是 Reeder 还是 inoreader 都支持同样的类 vim 快捷键，阅读体验非常优秀：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;J：上一篇&lt;/li&gt;
&lt;li&gt;K：下一篇&lt;/li&gt;
&lt;li&gt;M：mark unread&lt;/li&gt;
&lt;li&gt;S：mark star&lt;/li&gt;
&lt;li&gt;空格：翻页&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;搭配这套快捷键，每天大概可以消化 300 篇+的文章，其中会挑十几篇 mark star 之后精读。&lt;/p&gt;
&lt;p&gt;标注也很简单，阅读时直接划线即可，无论是在阅读器里划线还是笔记，都可以自动推送到 Readwise 上。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20221203140918@2x.png&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;第四步：整理输出，即使用 Logseq 等笔记软件整理阅读笔记。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Logseq 和 Obsidian 都有 Readwise 官方插件，可以定期同步标注笔记到本地笔记中，之后进行整理加工。&lt;/p&gt;
&lt;p&gt;Logseq 直接输出标注的效果演示：
&lt;img src=&quot;https://airing.ursb.me/image/blog/20221203140509@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Obsidian 直接输出标注的效果演示（整合 DataView）：
&lt;img src=&quot;https://airing.ursb.me/image/blog/20221203140653@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;本期记录&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;看完：日剧 |《钱断情始》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：日剧 |《行骗天下：英雄篇》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：动画 |《名侦探柯南：万圣节的新娘)》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;在看：动画 |《间谍过家家》| ★★★★★&lt;/li&gt;
&lt;li&gt;在看：动画 |《万神殿》| ★★★★☆&lt;/li&gt;
&lt;li&gt;在看：日剧 |《世界奇妙物语》| ★★★★☆&lt;/li&gt;
&lt;li&gt;在玩：Switch |《女神异闻录 P5R》| ★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;《行骗天下》强烈安利，英雄篇抽空还二刷了一下，明明知道一定会有反转，但反转来临的时候还是会被燃到（PS. 很喜欢达子这个人设）&lt;/p&gt;
&lt;p&gt;而看《世界奇妙物语》的感觉就和开盲盒一样，不知道这个短篇是有意思还是无趣的，综合之下还是给了 4 星。&lt;/p&gt;
&lt;p&gt;至于《钱断情始》明明是一个喜剧片，但第四集还是哭到我。终于理解为什么那么多人喜欢春马了，春马的笑容着实治愈，把角色的快乐和阳光演绎到观众内心深处。渐渐接受了以后的人生里，遇到的告别会多过相遇，遇到的失去会多过得到。&lt;/p&gt;
&lt;p&gt;——「细流涓涓不绝，其水滴滴各异，泡沫浮于淤泥，且消乎且结乎，概无久存之例，世间人事，鸟兽栖息，亦不如此。」&lt;/p&gt;
&lt;p&gt;除此之外，也很喜欢女主的反消费主义，购物前需要想想它是消费、浪费还是投资。毕竟钱是拿生命能量换来的，如果购买的东西配不上自己的生命能量，那比起物质消费，应该要做到更爱自己。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/Pasted%20image%2020221203141247.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-16&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Chromium 渲染流水线——字节码到像素的一生</title><link>https://ursb.me/posts/chromium-renderer/</link><guid isPermaLink="true">https://ursb.me/posts/chromium-renderer/</guid><description>剖析 Chromium 浏览器架构与进程模型，梳理 Blink、V8 等渲染与脚本引擎的演化脉络，并逐层拆解 Render Process 中主线程、合成线程等模块在渲染流水线中的具体职责。</description><pubDate>Sun, 16 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📌 2026 增订重写版：&lt;/strong&gt; 这篇 2022 年的原文已被重新组织为一份&lt;strong&gt;沉浸式增订版&lt;/strong&gt;——补全了每一步的 Chromium 源码定位、类层级、算法骨架与可视化插图，新增 LayoutNG / PaintController / SkiaRenderer 等深度技术章节。&lt;/p&gt;
&lt;p&gt;👉 &lt;strong&gt;推荐阅读新版：&lt;a href=&quot;/immersive/chromium-renderer/&quot;&gt;字节码到像素的一生 — Chromium 渲染流水线全景&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原文保留如下,仅作存档参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;现代浏览器架构&lt;/h2&gt;
&lt;p&gt;在开始介绍渲染流水线之前，我们需要先介绍一下 Chromium 的浏览器架构与 Chromium 的进程模型作为前置知识。&lt;/p&gt;
&lt;h3&gt;两个公式&lt;/h3&gt;
&lt;p&gt;公式 1： 浏览器 = 浏览器内核 + 服务&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Safari&lt;/strong&gt; = WebKit + 其他组件、库、服务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chrome&lt;/strong&gt; = Chromium + Google 服务集成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Edge&lt;/strong&gt; (Chromium) = Chromium + Microsoft 服务集成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Yandex Browser&lt;/strong&gt; = Chromium + Yandex 服务集成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;360 安全浏览器&lt;/strong&gt; = Trident + Chromium + 360 服务集成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chromium&lt;/strong&gt; = Blink + V8 + 其他组件、库、服务&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;公式 2：内核 = 渲染引擎 + JavaScript 引擎 + 其他&lt;/p&gt;
&lt;p&gt;Browser
Rendering Engine
JavaScript Engine&lt;/p&gt;
&lt;p&gt;Internet Explorer
Trident (MSHTML)
JScript/Chakra&lt;/p&gt;
&lt;p&gt;Microsoft Edge
EdgeHTML → Blink
Chakra → V8&lt;/p&gt;
&lt;p&gt;Firefox
Gecko
SpiderMonkey&lt;/p&gt;
&lt;p&gt;Safari
KHTML → WebKit
JavaScriptCore&lt;/p&gt;
&lt;p&gt;Chrome
WebKit → Blink
V8&lt;/p&gt;
&lt;p&gt;Opera
Presto → WebKit → Blink
Carakan → V8&lt;/p&gt;
&lt;p&gt;这里我们可以发现除了 Firefox 和已经死去的 IE，市面上大部分浏览器都朝着 Blink + V8 或是 WebKit + JavaScriptCore 的路线进行演变。&lt;/p&gt;
&lt;h3&gt;渲染引擎&lt;/h3&gt;
&lt;p&gt;负责解析 HTML, CSS, JavaScript，渲染页面。&lt;/p&gt;
&lt;p&gt;以 Firexfox 举例，有以下工作组：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Document parser (handles HTML and XML)&lt;/li&gt;
&lt;li&gt;Layout engine with content model&lt;/li&gt;
&lt;li&gt;Style system (handles CSS, etc.)&lt;/li&gt;
&lt;li&gt;JavaScript runtime (SpiderMonkey)&lt;/li&gt;
&lt;li&gt;Image library&lt;/li&gt;
&lt;li&gt;Networking library (Necko)&lt;/li&gt;
&lt;li&gt;Platform-specific graphics rendering and widget sets for Win32, X, and Mac&lt;/li&gt;
&lt;li&gt;User preferences library&lt;/li&gt;
&lt;li&gt;Mozilla Plug-in API (NPAPI) to support the Navigator plug-in interface&lt;/li&gt;
&lt;li&gt;Open Java Interface (OJI), with Sun Java 1.2 JVM&lt;/li&gt;
&lt;li&gt;RDF back end&lt;/li&gt;
&lt;li&gt;Font library&lt;/li&gt;
&lt;li&gt;Security library (NSS)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接下来，我们看看 WebKit 的发展历程。&lt;/p&gt;
&lt;p&gt;Apple 2001 年基于 KHTML 开发了 WebKit 作为 Safari 的内核，之后 Google 在 2008 年时基于 WebKit 自研 Chromium，那时候的 Chrome 渲染引擎采用的也是 Webkit。2010 年时，Apple 升级重构了 WebKit，其就是如今 WKWebView 与 Safari 的渲染引擎 WebKit2。2013 年时，Google 基于 WebKit 开发了自己的渲染引擎—— Blink，其作为如今 Chromium 的渲染引擎。因为开源协议的关系，我们如今看 Blink 源码依然能看到很多 Apple 和 WebKit 的影子。&lt;/p&gt;
&lt;p&gt;WebKit 的演变路线大致历程如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015171504.png?max_age=624800&quot; alt=&quot;&quot; /&gt;
通过 Web Platform Tests 的测试报告可见 Chromium 渲染引擎的兼容性也是极好的：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015203034.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;JavaScript 引擎&lt;/h3&gt;
&lt;p&gt;JavaScript 引擎在浏览器中通常作为渲染引擎内置的一个模块，但同时它的独立性非常好，也可以作为独立的引擎移植到其他地方使用。&lt;/p&gt;
&lt;p&gt;这里列举几个业内有名的 JavaScript 引擎：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SpiderMonkey&lt;/strong&gt;: Mozilla 的 JavaScript 引擎，使用 C/C++ 编写，作为 Firefox 的 JavaScript 引擎。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rhino&lt;/strong&gt;: Mozilla 的开源 JavaScript 引擎，使用 Java 编写。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nashorn&lt;/strong&gt;: Oracle Java Development Kit (JDK) 8 开始内置的 JavaScript 引擎，使用 Java 编写。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScriptCore&lt;/strong&gt;: WebKit 内置的 JavaScript 引擎，其作为系统提供给开发者使用，iOS 移动端应用可以直接零增量引入 JavaScriptCore（但这种场景下无法开启 JIT）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ChakraCore&lt;/strong&gt;: Microsoft 的开源 JavaScript 引擎，而如今已全面使用 Chromium 作为 Edge，因此除了 Edge iOS 移动端以外（Chromium iOS 端使用 JavaScriptCore 作为 JavaScript 引擎），其他端的 Edge 使用的都是 V8 引擎。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;V8&lt;/strong&gt;: Google 的开源 JavaScript 引擎，使用 C++ 编写，作为 Chromium（或者更进一步可以说 Blink）的内置 JavaScript 引擎，同时也是 Android 系统 WebView 的内置引擎（因为 Android WebView 也是 Chromium 嘛，笑）。性能优异，开启 JIT 之后的性能吊打一众引擎。此外，ES 语法兼容性表现也比较优秀（可见后文表格）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JerryScript&lt;/strong&gt;: Samsung 开源的 JavaScript 引擎，被 IoT.js 使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hermes&lt;/strong&gt;: Facebook 的开源 JavaScript 引擎，为 React Native 等 Hybrid UI 系统打造的引擎。支持直接加载字节码，从而使得 JS 加载时间缩短，让 TTI 得到优化。此外引擎还对字节码做过优化，且支持增量加载，对中低端机更友好。但是其设计为胶水语言解释器而存在，故不支持 JIT。（移动端 JS 引擎会限制 JIT 的使用，因为开 JIT 之后预热时间会变得很长，从而影响页面首屏时间；此外也会增加包体积和内存占用。）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QuickJS&lt;/strong&gt;: 由 FFmpeg 作者 Fabrice Bellard 开发，体积极小（210 KB），且兼容性良好。直接生成字节码，且支持引入 C 原生模块，性能优异。在单核机器上有着 300 μs 极低的启动时间，内存占用也极低，使用引用计数，内存管理优秀。QuickJS 非常适用于 Hybrid 架构、游戏脚本系统或其他嵌入式系统。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;各引擎性能表现如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015202658.png?max_age=624800&quot; alt=&quot;&quot; /&gt;ECMAScript 标准支持情况：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015202855.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Chromium 进程模型&lt;/h2&gt;
&lt;p&gt;Chromium 有 5 类进程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Browser Process：1 个&lt;/li&gt;
&lt;li&gt;Utility Process：1 个&lt;/li&gt;
&lt;li&gt;Viz Process：1 个&lt;/li&gt;
&lt;li&gt;Plugin Process：多个&lt;/li&gt;
&lt;li&gt;Render Process：多个&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;抛开 Chrome 扩展的 Plugin Process，和渲染强相关的有 Browser Process、Render Process、Viz Process。接下来，我们重点看看这 3 类进程。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015203410.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Render Process&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;数量：多个&lt;/li&gt;
&lt;li&gt;职责：负责单个 Tab 内单个站点（注意跨站点 iframe 的情况）的渲染、动画、滚动、Input 事件等。&lt;/li&gt;
&lt;li&gt;线程：&lt;/li&gt;
&lt;li&gt;Main thread x 1&lt;/li&gt;
&lt;li&gt;Compositor thread x 1&lt;/li&gt;
&lt;li&gt;Raster thread x 1&lt;/li&gt;
&lt;li&gt;worker thread x N&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Render Process 负责的区域是 WebContent：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015205533.png?max_age=624800&quot; alt=&quot;&quot; /&gt;Main thread
职责：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;执行 JavaScript&lt;/li&gt;
&lt;li&gt;Event Loop&lt;/li&gt;
&lt;li&gt;Document 生命周期&lt;/li&gt;
&lt;li&gt;Hit-testing&lt;/li&gt;
&lt;li&gt;事件调度&lt;/li&gt;
&lt;li&gt;HTML、CSS 等数据格式的解析
&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015204128.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Compositor Thread
职责：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Input Handler &amp;amp; Hit Tester&lt;/li&gt;
&lt;li&gt;Web Content 中的滚动与动画&lt;/li&gt;
&lt;li&gt;计算 Web Content 的最优分层&lt;/li&gt;
&lt;li&gt;协调图片解码、绘制、光栅化任务（helpers）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其中，Compositor thread helpers 的数目取决于 CPU 核心数。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015204233.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Browser Process&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;数量：1 个&lt;/li&gt;
&lt;li&gt;职责：负责 Browser UI （不包含 WebContent 的 UI）的全部能力，包括渲染、动画、路由、Input 事件等。&lt;/li&gt;
&lt;li&gt;线程：&lt;/li&gt;
&lt;li&gt;Render &amp;amp; Compositing Thread&lt;/li&gt;
&lt;li&gt;Render &amp;amp; Compositing Thread Helpers&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Viz Process&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;数量：1 个&lt;/li&gt;
&lt;li&gt;职责：接受 Render Process 和 Browser Process 产生的 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/quads/compositor_frame.h%3Bl=26?q=viz::CompositorFrame&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::CompositorFrame&lt;/a&gt;，并将其合成 (Aggregate)，最后使用 GPU 将合成结果上屏 (Display)。&lt;/li&gt;
&lt;li&gt;线程：&lt;/li&gt;
&lt;li&gt;GPU main thread&lt;/li&gt;
&lt;li&gt;Display Compositor Thread&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Chromium 的进程模式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Process-per-site-instance：老版本的默认策略，如果从一个页面打开了另一个新页面，而新页面和当前页面属于同一站点（根域名与协议相同）的话，那么这两个页面会共用一个 Render Process。&lt;/li&gt;
&lt;li&gt;Process-per-site&lt;/li&gt;
&lt;li&gt;Process-per-tab：如今版本的默认策略，每个 Tab 起一个 Render Process。但注意站点内部的跨站 iframe 也会启动一个新的 Render Process。可看下文 Example。&lt;/li&gt;
&lt;li&gt;Single Process：单进程模式，启动参数可控，用于 Debug。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;p&gt;假设现在有 3 个 Tab，分别打开了 foo.com，bar.com，baz.com 三个站点，其中 bar.com、baz.com 不涉及 iframe；但 foo.com 涉及，它的代码如下所示：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;
  &amp;lt;iframe id=one src=&quot;foo.com/other-url&quot;&amp;gt;&amp;lt;/iframe&amp;gt;
  &amp;lt;iframe id=two src=&quot;bar.com&quot;&amp;gt;&amp;lt;/iframe&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么按照 Process-per-tab 模式，最终的进程模型如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015205446.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Chromium 渲染流水线&lt;/h2&gt;
&lt;p&gt;至今前置知识已介绍完毕，开启本文的核心部分 —— Chromium Rendering Pipeline。&lt;/p&gt;
&lt;p&gt;所谓渲染流水线，就是从接受网络的字节码开始，一步步处理这些字节码把它们转变成屏幕上像素的过程。经过梳理之后，包括以下 13 个流程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parsing&lt;/li&gt;
&lt;li&gt;Style&lt;/li&gt;
&lt;li&gt;Layout&lt;/li&gt;
&lt;li&gt;Pre-paint&lt;/li&gt;
&lt;li&gt;Paint&lt;/li&gt;
&lt;li&gt;Commit&lt;/li&gt;
&lt;li&gt;Compositing&lt;/li&gt;
&lt;li&gt;Tiling&lt;/li&gt;
&lt;li&gt;Raster&lt;/li&gt;
&lt;li&gt;Activate&lt;/li&gt;
&lt;li&gt;Draw&lt;/li&gt;
&lt;li&gt;Aggregate&lt;/li&gt;
&lt;li&gt;Display&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;整理了一下各自流程所在的模块与进程线程，绘制的最终流水线如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015205821.png?max_age=624800&quot; alt=&quot;&quot; /&gt;下文，我们一步步来看。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注：本文属于 Overview，所以力求简洁、不贴源码，但是会把设计到源码的部分打上源码链接，读者们可以自己索引阅读。同时，有些环节我撰写了更详细的流程分析文章，会贴在对应章节的开头处，感兴趣的读者可以点进去详细阅读。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Parsing&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;本节推荐阅读该系列的文章&lt;a href=&quot;https://weekly.ursb.me/posts/weekly-15/&quot;&gt;《Chromium Rendering Pipeline - Parsing》&lt;/a&gt;以深入了解 Parsing。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015205840.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模块：blink&lt;/li&gt;
&lt;li&gt;进程：Render Process&lt;/li&gt;
&lt;li&gt;线程：Main thread&lt;/li&gt;
&lt;li&gt;职责：解析 Browser Process 网络线程传过来的 bytes，经过解析处理，生成 DOM Tree&lt;/li&gt;
&lt;li&gt;输入：bytes&lt;/li&gt;
&lt;li&gt;输出：DOM Tree&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个环节设计的数据流为：bytes → characters → token → nodes → object model (DOM Tree)&lt;/p&gt;
&lt;p&gt;我们把数据流的每次扭转进行梳理，得到以下 5 个环节：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Loading&lt;/strong&gt;：Blink 从网络线程接收 bytes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conversion&lt;/strong&gt;: HTMLParser 将 bytes 转为 characters&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tokenizing&lt;/strong&gt;: 将 characters 转为 W3C 标准的 token&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lexing&lt;/strong&gt;: 通过词法分析将 token 转为 Element 对象&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DOM construction&lt;/strong&gt;: 使用构建好的 Element 对象构建 DOM Tree&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015210704.png?max_age=624800&quot; alt=&quot;&quot; /&gt;Loading
职责：Blink 从网络线程接收 bytes。&lt;/p&gt;
&lt;p&gt;流程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Browser process 下载网页内容&lt;/li&gt;
&lt;li&gt;传给 Render Process 的 Content 模块&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/loader/document_loader.h;l=123?q=blink::DocumentLoader&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;blink::DocumentLoader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/parser/html_document_parser.h;l=84?q=blink::HTMLDocumentParser&amp;amp;ss=chromium/chromium/src&quot;&gt;blink::HTMLDocumentParser&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015211156.png?max_age=624800&quot; alt=&quot;&quot; /&gt;Conversion
职责：将 bytes 解析为 characters。&lt;/p&gt;
&lt;p&gt;核心堆栈：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#0 0x00000002d2380488 in blink::HTMLDocumentParser::Append(WTF::String const&amp;amp;) at /Users/airing/Files/code/chromium/src/third_party/blink/renderer/core/html/parser/html_document_parser.cc:1037
#1 0x00000002cfec278c in blink::DecodedDataDocumentParser::UpdateDocument(WTF::String&amp;amp;) at /Users/airing/Files/code/chromium/src/third_party/blink/renderer/core/dom/decoded_data_document_parser.cc:98
#2 0x00000002cfec268c in blink::DecodedDataDocumentParser::AppendBytes(char const*, unsigned long) at /Users/airing/Files/code/chromium/src/third_party/blink/renderer/core/dom/decoded_data_document_parser.cc:71
#3 0x00000002d2382778 in blink::HTMLDocumentParser::AppendBytes(char const*, unsigned long) at /Users/airing/Files/code/chromium/src/third_party/blink/renderer/core/html/parser/html_document_parser.cc:1351
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tokenizing
职责：将 characters 解析为 token。&lt;/p&gt;
&lt;p&gt;核心函数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTMLDocumentParser::Append&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/parser/html_tokenizer.cc;l=221&quot;&gt;HTMLTokenizer::NextToken&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;需要注意的是，这一步中如果解析到 link、script、img 标签时会继续发起网络请求；同时解析到 script 时，需要先执行完解析到的 JavaScript，才会继续往后解析 HTML。因为 JavaScript 可能会改变 DOM 树的结构(如 &lt;code&gt;document.write()&lt;/code&gt; 等)，所以需要先等待它执行完。&lt;/p&gt;
&lt;p&gt;Lexing
职责：将 token 解析为 Element。&lt;/p&gt;
&lt;p&gt;核心函数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/parser/html_construction_site.h;l=257?q=HTMLConstructionSite::CreateElement&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;HTMLConstructionSite::CreateElement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意这一步在处理的过程中，就会使用栈结构存储 Node (HTML Tag)，以便后续构造 DOM Tree —— 例如对于 &lt;code&gt;HTMLToken::StartTag&lt;/code&gt; 类型的 Token，就会调用 &lt;code&gt;ProcessStartTag&lt;/code&gt; 执行一个压栈操作，而对于&lt;code&gt;HTMLToken::EndTag&lt;/code&gt; 类型的 Token，就会调用 &lt;code&gt;ProcessEndTag&lt;/code&gt; 执行一个出栈操作。&lt;/p&gt;
&lt;p&gt;如针对如下所示的 DOM Tree：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div&amp;gt;
  &amp;lt;p&amp;gt;
    &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/p&amp;gt;
  &amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;各 Node 压榨与出栈流程如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015211837.png?max_age=624800&quot; alt=&quot;&quot; /&gt;DOM construction
职责：将 Element 实例化为 DOM Tree。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015211943.png?max_age=624800&quot; alt=&quot;&quot; /&gt;最终 DOM Tree 的数据结构可以断点从 &lt;code&gt;blink::TreeScope&lt;/code&gt; 中预览：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015211940.png?max_age=624800&quot; alt=&quot;&quot; /&gt;我们可以使用 DevTools 查看页面的 Parsing 流程：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016103824@2x.png?max_age=624800&quot; alt=&quot;&quot; /&gt;但是这个火焰图看不到 C++ 侧的栈调用情况。如果想深入查看内核侧的堆栈情况， 可以使用 &lt;a href=&quot;https://perfetto.dev/&quot;&gt;Perfetto&lt;/a&gt; 进行页面录制与分析，它不仅能看到 C++ 侧的堆栈情况，还能分析每个调用所属的线程，以及跨进程通信时也会连线标出发出通信与接收到通信的函数调用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015212114.png?max_age=624800&quot; alt=&quot;&quot; /&gt;分析完 Paring 之后，我们可以完善一下我们的流程图：
&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015212322.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Style&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015212330.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模块：blink&lt;/li&gt;
&lt;li&gt;进程：Render Process&lt;/li&gt;
&lt;li&gt;线程：Main thread&lt;/li&gt;
&lt;li&gt;职责：Style Engine 遍历 DOM，通过匹配 CSSOM 进行样式分析 (resolution) 和样式重算 (recalc) 构建出 Render Tree&lt;/li&gt;
&lt;li&gt;输入：DOM Tree&lt;/li&gt;
&lt;li&gt;输出：Render Tree&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;RenderTree 由 RenderObject 构成，每个 RenderObject 对应一个 DOM 节点上，它会在 DOM 附加 ComputedStyle （计算样式）信息。&lt;/p&gt;
&lt;p&gt;ComputedStyle 可以通过 DevTools 直接查看，CSS 调试时经常使用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016103738@2x.png?max_age=624800&quot; alt=&quot;&quot; /&gt;核心函数：&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/dom/document.h%3Bl=706?q=document::updateStyle&amp;amp;ss=chromium/chromium/src&quot;&gt;Document::UpdateStyleAndLayout&lt;/a&gt; (可以先不看 Layout 的部分)&lt;/p&gt;
&lt;p&gt;该函数的的逻辑如下图所示，这个生成 ComputedStyle 的环节我们称之为 style recalc（样式计算）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015212848.png?max_age=624800&quot; alt=&quot;&quot; /&gt;完整的 Style 的流程如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015213034.png?max_age=624800&quot; alt=&quot;&quot; /&gt;
我们可以拆成 3 个环节：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CSS 加载&lt;/li&gt;
&lt;li&gt;CSS 解析&lt;/li&gt;
&lt;li&gt;CSS 计算&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CSS 加载
核心堆栈的打印：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[DocumentLoader.cpp(558)] “&amp;lt;!DOCType html&amp;gt;\n&amp;lt;html&amp;gt;\n&amp;lt;head&amp;gt;\n&amp;lt;link rel=\”stylesheet\” href=\”demo.css\”&amp;gt; \n&amp;lt;/head&amp;gt;\n&amp;lt;body&amp;gt;\n&amp;lt;div class=\”text\”&amp;gt;\n &amp;lt;p&amp;gt;hello, world&amp;lt;/p&amp;gt;\n&amp;lt;/div&amp;gt;\n&amp;lt;/body&amp;gt;\n&amp;lt;/html&amp;gt;\n”
[HTMLDocumentParser.cpp(765)] “tagName: html |type: DOCTYPE|attr: |text: “
[HTMLDocumentParser.cpp(765)] “tagName: |type: Character |attr: |text: \n”
[HTMLDocumentParser.cpp(765)] “tagName: html |type: startTag |attr: |text: “
…
[HTMLDocumentParser.cpp(765)] “tagName: html |type: EndTag |attr: |text: “
[HTMLDocumentParser.cpp(765)] “tagName: |type: EndOfFile|attr: |text: “
[Document.cpp(1231)] readystatechange to Interactive
[CSSParserImpl.cpp(217)] recieved and parsing stylesheet: “.text{\n font-size: 20px;\n}\n.text p{\n color: #505050;\n}\n”
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;需要注意的是 DOM 构建之后不会立刻渲染 HTML 页面，而是要等待 CSS 处理完毕。因为 CSS 加载完之后才会进行后续的 style recalc 等流程，如果没有 CSS 只渲染无样式的 DOM 是无意义的。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The browser blocks rendering until it has both the DOM and the CSSOM.  ——Render blocking CSS&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;CSS 解析
CSS 解析涉及的数据流为：bytes → characters → tokens → StyleRule → RuleMap，bytes 的处理前文已经说过，不再赘述，我们重点看后续的流程。&lt;/p&gt;
&lt;p&gt;首先是：characters → tokens。&lt;/p&gt;
&lt;p&gt;css 涉及到的 token 有下图这些：
&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015213557.png?max_age=624800&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015213600.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;需要注意的是 FunctionToken 会有额外的计算。例如，Blink 底层使用 RGBA32 来存储 Color (&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/css/css_color.h;l=23?q=CSSColor::Create&amp;amp;ss=chromium/chromium/src&quot;&gt;CSSColor::Create&lt;/a&gt;)。根据我微基准测试的结果，Hex 转换为 RGBA32 比 rgb() 的效率快 15% 左右。&lt;/p&gt;
&lt;p&gt;第二步是：tokens → StyleRule。&lt;/p&gt;
&lt;p&gt;StyleRules = selectors(选择器) + properties(属性集)。&lt;/p&gt;
&lt;p&gt;值得注意的的是 CSS 选择器解析是&lt;strong&gt;从右向左&lt;/strong&gt;的&lt;/p&gt;
&lt;p&gt;例如对于这个 CSS：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.text .hello{
    color: rgb(200, 200, 200);
    width: calc(100% - 20px);
}
#world{
    margin: 20px;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解析结果如下所示：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;selector text = “.text .hello”
value = “hello” matchType = “Class” relation = “Descendant”
tag history selector text = “.text”
value = “text” matchType = “Class” relation = “SubSelector”
selector text = “#world”
value = “world” matchType = “Id” relation = “SubSelector”
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里额外说一下 Blink 的默认样式，Blink 有一套应用默认样式的规则：加载顺序为 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/resources/html.css;l=1;bpv=0;bpt=0&quot;&gt;html.css&lt;/a&gt; （默认样式）→ &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/resources/quirks.css;bpv=0;bpt=0&quot;&gt;quirk.css&lt;/a&gt; （怪异样式）→ android/linux/mac.css（各操作系统样式） → other.css（业务样式）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;更多内置 CSS 加载顺序可参考 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/public/blink_resources.grd;l=1;bpv=0;bpt=0?q=public/blink_resources.grd&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;blink_resources.grd&lt;/a&gt; 配置。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最后是：StyleRule → RuleMap。&lt;/p&gt;
&lt;p&gt;所有的 StyleRule 会根据选择器类型存储在不同的 Map 中，这样做的目的是为了在比较的时候能够很快地取出匹配第一个选择器的所有 rule，然后每条 rule 再检查它的下一个 selector 是否匹配当前元素。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RuleMap &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/css/rule_set.h;l=561;drc=416bc691f0aab3a1f344b673df60a00b26cd482a;bpv=1;bpt=1?q=CompactRule&amp;amp;ss=chromium/chromium/src&quot;&gt;id_rules_&lt;/a&gt;: id 选择器的 RuleMap&lt;/li&gt;
&lt;li&gt;RuleMap &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/css/rule_set.h;l=562;drc=416bc691f0aab3a1f344b673df60a00b26cd482a;bpv=1;bpt=1?q=CompactRule&amp;amp;ss=chromium/chromium/src&quot;&gt;class_rules_&lt;/a&gt;: 类选择器的 RuleMap&lt;/li&gt;
&lt;li&gt;RuleMap &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/css/rule_set.h;l=563;drc=416bc691f0aab3a1f344b673df60a00b26cd482a;bpv=1;bpt=1?q=CompactRule&amp;amp;ss=chromium/chromium/src&quot;&gt;attr_rules_&lt;/a&gt;: 属性选择器的 RuleMap&lt;/li&gt;
&lt;li&gt;RuleMap tag_rules_: tag 选择器的 RuleMap&lt;/li&gt;
&lt;li&gt;RuleMap &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/css/rule_set.h;l=539;drc=416bc691f0aab3a1f344b673df60a00b26cd482a;bpv=1;bpt=1?q=CompactRule&amp;amp;ss=chromium/chromium/src&quot;&gt;ua_shadow_pseudo_element_rules_&lt;/a&gt;: 伪类选择器的 RuleMap&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;建议阅读： blink/renderer/core/css/rule_set.h&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;CSS 计算&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;产物：ComputedStyle&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015214137.png?max_age=624800&quot; alt=&quot;&quot; /&gt;为什么要计算 CSS Style？因为可能会有多个选择器的样式命中了 DOM 节点，还需要继承父元素的属性以及 UA 提供的属性。&lt;/p&gt;
&lt;p&gt;步骤：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;找到命中的选择器&lt;/li&gt;
&lt;li&gt;设置样式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;指的注意的是最后应用样式的优先级顺序：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/css-cascade-layers/&quot;&gt;Cascade layers&lt;/a&gt; 顺序&lt;/li&gt;
&lt;li&gt;选择器优先级顺序&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://drafts.csswg.org/css-cascade-6/Overview.bs&quot;&gt;proximity&lt;/a&gt; 排序&lt;/li&gt;
&lt;li&gt;声明位置顺序&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;源码：&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/css/element_rule_collector.cc%3Bl=938?q=compareRules&amp;amp;ss=chromium/chromium/src&quot;&gt;ElementRuleCollector::CompareRules&lt;/a&gt; ：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我们都知道应用样式的优先级顺序是选择器优先级相加，但这只是里面的第二级优先级。如果前三个优先级完全相同的情况下，最后应用的样式会取决于样式的声明时机 —— 声明靠后的优先级越大。&lt;/p&gt;
&lt;p&gt;如图：
&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015214542.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里的 h1 的 class，无论写成 &lt;code&gt;main-heading 2 main-heading&lt;/code&gt; 还是调转顺序，标题都是蓝色的，因为 &lt;code&gt;.main-heading2&lt;/code&gt; 的声明靠后，因此优先级更高。&lt;/p&gt;
&lt;h3&gt;Layout&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015215600.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模块：blink&lt;/li&gt;
&lt;li&gt;进程：Render Process&lt;/li&gt;
&lt;li&gt;线程：Main thread&lt;/li&gt;
&lt;li&gt;职责：处理 Element 的几何属性，即位置与尺寸&lt;/li&gt;
&lt;li&gt;输入：Render Tree&lt;/li&gt;
&lt;li&gt;输出：Layout Tree&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Layout Object 记录了 Render Object 的几何属性。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015214927.png?max_age=624800&quot; alt=&quot;&quot; /&gt;一个 LayoutObject 附加了一个 LayoutRect 属性，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;x&lt;/li&gt;
&lt;li&gt;y&lt;/li&gt;
&lt;li&gt;width&lt;/li&gt;
&lt;li&gt;height&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但需要注意的是，LayoutObject 与 DOM Node 并非 1:1 的关系，理由如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015215041.png?max_age=624800&quot; alt=&quot;&quot; /&gt;Layout 流程的核心函数：&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/dom/document.h%3Bl=706?q=document::updateStyle&amp;amp;ss=chromium/chromium/src&quot;&gt;Document::UpdateStyleAndLayout&lt;/a&gt; ，经过这一步之后 DOM tree 会变成 Layout Tree，如下图代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div style=&quot;max-width: 100px&quot;&amp;gt;
  &amp;lt;div style=&quot;float: left; padding: 1ex&quot;&amp;gt;F&amp;lt;/div&amp;gt;
  &amp;lt;br&amp;gt;The &amp;lt;b&amp;gt;quick brown&amp;lt;/b&amp;gt; fox
  &amp;lt;div style=&quot;margin: -60px 0 0 80px&quot;&amp;gt;jumps&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015215220.png?max_age=624800&quot; alt=&quot;&quot; /&gt;
每一个 LayoutObject 节点都记录了位置和尺寸信息：
&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015215232.png?max_age=624800&quot; alt=&quot;&quot; /&gt;
我们知道避免 Layout （reflow），可以提高页面的性能。那么如何减少重排呢？主旨是合并多个 reflow，最后再反馈到 render tree 中。具体有以下措施：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;直接更改 classname 而非 style → 避免 CSSOM 重新生成与合成&lt;/li&gt;
&lt;li&gt;让频繁 reflow 的 Element “离线”&lt;/li&gt;
&lt;li&gt;替代会触发 reflow 的属性&lt;/li&gt;
&lt;li&gt;将 reflow 的影响范围控制在单独的图层内&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其中，会首次/二次触发 Layout(reflow)，Paint(repaint)，Compositor 的属性可以参考 &lt;a href=&quot;https://www.lmame-geek.com/&quot;&gt;CSS Triggers&lt;/a&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015215506.png?max_age=624800&quot; alt=&quot;&quot; /&gt;可以发现每个浏览器内核对于属性的处理是不一样的，如果需要优化性能，就可以对照查看这张表格，看看有没有 css 属性是可以优化的。&lt;/p&gt;
&lt;h3&gt;Pre-paint&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015215607.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模块：blink&lt;/li&gt;
&lt;li&gt;进程：Render Process&lt;/li&gt;
&lt;li&gt;线程：Main thread&lt;/li&gt;
&lt;li&gt;职责：生成 Property trees，供 Compositor thrread 使用，避免某些资源重复 Raster&lt;/li&gt;
&lt;li&gt;输入：Layout Tree&lt;/li&gt;
&lt;li&gt;输出：Property Tree&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;基于属性树，Chromium 可以单独操作某个节点的变换、裁剪、特效、滚动，不至于影响它的子节点。&lt;/p&gt;
&lt;p&gt;核心函数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/paint/pre_paint_tree_walk.h%3Bl=34?q=Prepainttreewalk::walk&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;Prepainttreewalk::WalkTree&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/paint/paint_property_tree_builder.h;bpv=1;bpt=1;l=353?q=paintpropertytreebuilder&amp;amp;ss=chromium%2Fchromium%2Fsrc&amp;amp;gsn=PaintPropertyTreeBuilder&amp;amp;gs=kythe%3A%2F%2Fchromium.googlesource.com%2Fchromium%2Fsrc%3Flang%3Dc%252B%252B%3Fpath%3Dthird_party%2Fblink%2Frenderer%2Fcore%2Fpaint%2Fpaint_property_tree_builder.h%23TD8b-BjkhPvxV4tHm8Me_cgemvQUT8vSpUBQ_zuHunw&quot;&gt;PaintPropertyTreeBuilder&lt;/a&gt;
&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015215716.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;新版本 Chromium 改成了 CAP（composite after paint）模式&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Property trees&lt;/strong&gt; 包括以下四棵树：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015215807.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Paint&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015215947.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模块：blink&lt;/li&gt;
&lt;li&gt;进程：Render Process&lt;/li&gt;
&lt;li&gt;线程：Main thread&lt;/li&gt;
&lt;li&gt;职责：Blink 对接 cc 的绘制接口进行 Paint，生成 cc 模块的数据源 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/layers/layer.h;l=86;drc=416bc691f0aab3a1f344b673df60a00b26cd482a;bpv=1;bpt=1?q=cc::Layer&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;cc::Layer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;输入：Layout Object&lt;/li&gt;
&lt;li&gt;输出：PaintLayer (cc::Layer)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：cc = content collator (内容编排器)，而不是 Chromium Compositor。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;核心函数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/frame/local_frame_view.h%3Bl=911%3Bbpv=1%3Bbpt=1?q=LocalFrameView::PaintTree&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;LocalFrameView::PaintTree&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/paint/paint_canvas.h%3Bl=148%3Bbpv=1%3Bbpt=1?q=PaintCanvas::drawRect&amp;amp;ss=chromium/chromium/src&quot;&gt;PaintCanvas::drawRect&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015220145.png?max_age=624800&quot; alt=&quot;&quot; /&gt;Paint 阶段将 Layout Tree 中的 Layout Object 转换成绘制指令，并把这些操作封装在  &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/paint/display_item_list.h;l=49?q=cc::DisplayItemList&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;cc::DisplayItemList&lt;/a&gt; 中，之后将其注入进 cc::PictureLayer 中。&lt;/p&gt;
&lt;p&gt;生成 display item list 的流程也是一个栈结构的遍历：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015220721.png?max_age=624800&quot; alt=&quot;&quot; /&gt;再举一个例子，针对以下 HTML：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;style&amp;gt; #p {
  position: absolute; padding: 2px;
  width: 50px; height: 20px;
  left: 25px; top: 25px;
  border: 4px solid purple;
  background-color: lightgrey;
} &amp;lt;/style&amp;gt;
&amp;lt;div id=p&amp;gt; pixels &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对应生成的 display items 如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015220823.png?max_age=624800&quot; alt=&quot;&quot; /&gt;最后再介绍一下 cc::Layer，它运行在主线程，且一个 Render Process 内有且只有一棵 cc::Layer 树。&lt;/p&gt;
&lt;p&gt;一个 cc::Layer 表示一个矩形区域内的 UI，以下子类代表不同类型的 UI 数据：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;cc::PictureLayer&lt;/strong&gt;：用于实现自绘型的 UI 组件，它允许外部通过实现 cc::ContentLayerClient 接口提供一个 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/paint/display_item_list.h;l=49?q=cc::DisplayItemList&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;cc::DisplayItemList&lt;/a&gt; 对象，它表示一个绘制操作的列表，记录了一系列的绘制操作。它经过 cc 的流水线之后转换为一个或多个 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/quads/tile_draw_quad.h;l=16?q=viz::TileDrawQuad&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::TileDrawQuad&lt;/a&gt; 存储在 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/quads/compositor_frame.h;l=26?q=viz::CompositorFrame&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::CompositorFrame&lt;/a&gt; 中。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cc::TextureLayer&lt;/strong&gt;：对应 viz 中的 viz::TextureDrawQuad，所有想要使用自己的逻辑进行 Raster 的 UI 组件都可以使用这种 Layer，比如 Flash 插件，WebGL等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cc::UIResourceLayer&lt;/strong&gt;/&lt;strong&gt;cc::NinePatchLayer&lt;/strong&gt;：类似 TextureLayer，用于软件渲染。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cc::SurfaceLayer&lt;/strong&gt;/cc::VideoLayer(废弃)：对应 viz 中的 viz::SurfaceDrawQuad，用于嵌入其他的 CompositorFrame。Blink 中的 iframe 和视频播放器可以使用这种 Layer 实现。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cc::SolidColorLayer&lt;/strong&gt;：用于显示纯色的 UI 组件。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Commit&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015220154.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模块：cc&lt;/li&gt;
&lt;li&gt;进程：Render Process&lt;/li&gt;
&lt;li&gt;线程：Compositor thread&lt;/li&gt;
&lt;li&gt;职责：将 Paint 阶段的产物数据 (&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/layers/layer.h;l=86;drc=416bc691f0aab3a1f344b673df60a00b26cd482a;bpv=1;bpt=1?q=cc::Layer&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;cc::Layer&lt;/a&gt;) 提交给 Compositor 线程&lt;/li&gt;
&lt;li&gt;输入：cc::Layer (main thread)&lt;/li&gt;
&lt;li&gt;输出：LayerImpl (compositor thread)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;核心函数：&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/layers/layer.h;l=717;drc=8d399817282e3c12ed54eb23ec42a5e418298ec6;bpv=1;bpt=1?q=PushPropertiesTo&amp;amp;ss=chromium/chromium/src&quot;&gt;PushPropertiesTo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015221246.png?max_age=624800&quot; alt=&quot;&quot; /&gt;核心逻辑是将 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/trees/layer_tree_host.h;l=120;drc=8d399817282e3c12ed54eb23ec42a5e418298ec6;bpv=0;bpt=1?q=LayerTreeHost&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;LayerTreeHost&lt;/a&gt; 的数据 commit 到 LayerTreeHostImpl，我们在接收到 Commit 消息的地方进行断点，堆栈如下所示：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;libcc.so!cc::PictureLayer::PushPropertiesTo(cc::PictureLayer * this, cc::PictureLayerImpl * base_layer)
libcc.so!cc::PushLayerPropertiesInternal&amp;lt;std::__Cr::__wrap_iter&amp;lt;cc::Layer**&amp;gt; &amp;gt;(std::__Cr::__wrap_iter&amp;lt;cc::Layer**&amp;gt; source_layers_begin, std::__Cr::__wrap_iter&amp;lt;cc::Layer**&amp;gt; source_layers_end, cc::LayerTreeHost * host_tree, cc::LayerTreeImpl * target_impl_tree)
libcc.so!cc::TreeSynchronizer::PushLayerProperties(cc::LayerTreeHost * host_tree, cc::LayerTreeImpl * impl_tree)
libcc.so!cc::LayerTreeHost::FinishCommitOnImplThread(cc::LayerTreeHost * this, cc::LayerTreeHostImpl * host_impl)
libcc.so!cc::SingleThreadProxy::DoCommit(cc::SingleThreadProxy * this)libcc.so!cc::SingleThreadProxy::ScheduledActionCommit(cc::SingleThreadProxy * this)libcc.so!cc::Scheduler::ProcessScheduledActions(cc::Scheduler * this)
libcc.so!cc::Scheduler::NotifyReadyToCommit(cc::Scheduler * this, std::__Cr::unique_ptr&amp;lt;cc::BeginMainFrameMetrics, std::__Cr::default_delete&amp;lt;cc::BeginMainFrameMetrics&amp;gt; &amp;gt; details)
libcc.so!cc::SingleThreadProxy::DoPainting
libcc.so!cc::SingleThreadProxy::BeginMainFrame(cc::SingleThreadProxy * this, const viz::BeginFrameArgs &amp;amp; begin_frame_args)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Compositing&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015221354.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模块：cc&lt;/li&gt;
&lt;li&gt;进程：Render Process&lt;/li&gt;
&lt;li&gt;线程：Compositor thread&lt;/li&gt;
&lt;li&gt;职责：将整个页面按照一定规则，分成多个独立的图层，便于隔离更新&lt;/li&gt;
&lt;li&gt;输入：PaintLayer(cc::Layer)&lt;/li&gt;
&lt;li&gt;输出：GraphicsLayer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;核心函数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:ui/compositor/compositor.h%3Bl=368%3Bdrc=13c40eeef88afe7258a56ec8c552b226312545ce%3Bbpv=1%3Bbpt=1?q=Compositor::Update&amp;amp;ss=chromium/chromium/src&quot;&gt;Compositor::UpdateLayerTreeHost&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015223151.png?max_age=624800&quot; alt=&quot;&quot; /&gt;为什么需要 Compositor 线程？那我们假设下如果没有这个步骤，Paint 之后直接光栅化上屏又会怎样：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015223404.png?max_age=624800&quot; alt=&quot;&quot; /&gt;如果直接走光栅化上屏，如果 Raster 所需要的数据源因为各种原因，在垂直同步信号来临时没有准备就绪，那么就会导致丢帧，发生 “Janky”。&lt;/p&gt;
&lt;p&gt;当然，为了避免 Janky，Chromium 也在每个阶段也做了很常规的优化——缓存。如下图所示，在 Style、Layout、Paint、Raster 阶段都做了对应了缓存策略，以避免不必要的渲染，从而减少 Janky 发生的可能性：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015223848.png?max_age=624800&quot; alt=&quot;&quot; /&gt;但即便做了如此多的缓存优化，一个简单的滚动会导致所有的像素重新 Paint + Raster！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015223926.png?max_age=624800&quot; alt=&quot;&quot; /&gt;而 Compositing 阶段经过分层之后的产物 GraphicsLayer，可以让 Chromium 在渲染时只需要操作必要的图层，其他图层只需要参与合成就行了，以此提高渲染效率：&lt;/p&gt;
&lt;p&gt;如下图所示：
&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015224050.png?max_age=624800&quot; alt=&quot;&quot; /&gt;
wobble 类有个 transform 动画，那么这整个 div 节点就是一个独立的 GraphicsLayer，动画只需要渲染这部分 layer 即可。&lt;/p&gt;
&lt;p&gt;我们也可以通过 DevTools 的图层工具查看所有的 Layers，它会告诉我们这个图层产生的原因是什么、内存占用多少，至今为止绘制了多少次，以便我们进行内存与渲染效率的优化。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015224223.png?max_age=624800&quot; alt=&quot;&quot; /&gt;这也解答了为什么 CSS 动画性能表现优秀？因为有 Compositor 线程的参与，它基于 Property Trees 合成的图层，单独在 Compositor 线程处理 CSS 动画。此外，我们也可以使用 will-change 去提前告知 Compositor 线程，以优化图层合并。但这个方案也不是万能的，每个 Layer 都会消耗一定的内存。&lt;/p&gt;
&lt;p&gt;Compositor Thread 还具备处理输入事件的能力，如下图所示，它会监听从 Browser Process 过来的各种事件：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015224441.png?max_age=624800&quot; alt=&quot;&quot; /&gt;但需要注意的是如果在 JavaScript 注册了事件监听，它会把输入事件转发给 main thread 进行处理。&lt;/p&gt;
&lt;h3&gt;Tiling&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015224507.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模块：cc&lt;/li&gt;
&lt;li&gt;进程：Render Process&lt;/li&gt;
&lt;li&gt;线程：Compositor thread&lt;/li&gt;
&lt;li&gt;职责：将一个 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/layers/picture_layer_impl.h;l=36?q=cc::PictureLayerImpl&amp;amp;ss=chromium/chromium/src&quot;&gt;cc::PictureLayerImpl&lt;/a&gt; 根据不同的 scale 级别，不同的大小拆分为多个 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/raster/tile_task.h;l=14?q=cc::TileTask&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;cc::TileTask&lt;/a&gt; 任务给到 Raster 线程处理。&lt;/li&gt;
&lt;li&gt;输入：LayerImpl (compositor thread)&lt;/li&gt;
&lt;li&gt;输出：cc::TileTask (raster thread)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;图块（Tiling）是 Raster 的基本工作单位，这个阶段中 Layer (LayerImpl) 会拆成一个个 Tiling。在 Commit 完成之后会根据需要创建 Tiles 任务 cc::RasterTaskImpl，这些任务被 Post 到 Raster 线程中执行。&lt;/p&gt;
&lt;p&gt;核心函数：&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/tiles/tile_manager.h;bpv=1;bpt=1;l=170?q=prepareTiles&amp;amp;ss=chromium&amp;amp;gsn=PrepareTiles&amp;amp;gs=kythe%3A%2F%2Fchromium.googlesource.com%2Fchromium%2Fsrc%3Flang%3Dc%252B%252B%3Fpath%3Dcc%2Ftiles%2Ftile_manager.h%234xVenYmC3_6YrIyHJnLvGGvCCRrl-4CfQhzoOUbOkMQ&quot;&gt;PrepareTiles&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;推荐阅读：&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/tiles/tile_manager.h%3Bl=170%3Bbpv=1%3Bbpt=1?q=prepareTiles&amp;amp;ss=chromium&quot;&gt;cc/tiles/tile_manager.h&lt;/a&gt;
&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015224749.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这个环节主要是提交 cc::TileTask 任务给到 raster thread 做分块渲染 (Tile Rendering)，所谓分块渲染就是把网页的缓存分为一格一格的小块，通常为 256x256 或者 512x512，然后分块进行渲染。&lt;/p&gt;
&lt;p&gt;分块渲染的必要性提现在以下两个方面：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GPU 合成通常是使用 OpenGL ES 贴图实现的，这时候的缓存实际就是纹理（GL Texture），很多 GPU 对纹理的大小是有限制的。&lt;strong&gt;GPU 无法支持任意大小的缓存。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;分块缓存，&lt;strong&gt;方便浏览器使用统一的缓冲池来管理缓存。缓冲池的小块缓存由所有 WebView 共用&lt;/strong&gt;，打开网页的时候向缓冲池申请小块缓存，关闭网页是这些缓存被回收。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果说前一个环境的分层是宏观上提升了渲染效率，那么分块就是微观上提升了渲染效率。&lt;/p&gt;
&lt;p&gt;Chromium 对分块渲染的策略还有以下优化点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;优先绘制靠近视口的图块：Raster 会根据 Tiling 与可见视口的距离安排优先顺序进行 Raster，离得近的会被优先 Raster，离得远的会降级 Raster 的优先级。&lt;/li&gt;
&lt;li&gt;在首次合成图块的时候，降低分辨率，以减少纹理合成和上传的耗时。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在提交 TileTask 的位置我们断点，可以看到该环节的完整堆栈：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;libcc.so!cc::SingleThreadTaskGraphRunner::ScheduleTasks(cc::TestTaskGraphRunner * this, cc::NamespaceToken token, cc::TaskGraph * graph)
libcc.so!cc::TileTaskManagerImpl::ScheduleTasks(cc::TileTaskManagerImpl * this, cc::TaskGraph * graph)
libcc.so!cc::TileManager::ScheduleTasks(cc::TileManager * this, cc::TileManager::PrioritizedWorkToSchedule work_to_schedule)
libcc.so!cc::TileManager::PrepareTiles(cc::TileManager * this, const cc::GlobalStateThatImpactsTilePriority &amp;amp; state)
libcc.so!cc::LayerTreeHostImpl::PrepareTiles(cc::LayerTreeHostImpl * this)
libcc.so!cc::LayerTreeHostImpl::NotifyPendingTreeFullyPainted(cc::LayerTreeHostImpl * this)libcc.so!cc::LayerTreeHostImpl::UpdateSyncTreeAfterCommitOrImplSideInvalidation(cc::LayerTreeHostImpl * this)
libcc.so!cc::LayerTreeHostImpl::CommitComplete(cc::LayerTreeHostImpl * this)
libcc.so!cc::SingleThreadProxy::DoCommit(cc::SingleThreadProxy * this)libcc.so!cc::SingleThreadProxy::ScheduledActionCommit(cc::SingleThreadProxy * this)
libcc.so!cc::Scheduler::ProcessScheduledActions(cc::Scheduler * this)
libcc.so!cc::Scheduler::NotifyReadyToCommit(cc::Scheduler * this, std::__Cr::unique_ptr&amp;lt;cc::BeginMainFrameMetrics, std::__Cr::default_delete&amp;lt;cc::BeginMainFrameMetrics&amp;gt; &amp;gt; details)
libcc.so!cc::SingleThreadProxy::DoPainting(cc::SingleThreadProxy * this)
libcc.so!cc::SingleThreadProxy::BeginMainFrame(cc::SingleThreadProxy *this, const viz::BeginFrameArgs &amp;amp; begin_frame_args)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Raster&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015225228.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模块：cc&lt;/li&gt;
&lt;li&gt;进程：Render Process&lt;/li&gt;
&lt;li&gt;线程：Raster thread&lt;/li&gt;
&lt;li&gt;职责：Raster 阶段会执行每一个 TileTask，最终产生一个资源，记录在产生一个资源，该资源被记录在了 LayerImpl (&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/layers/picture_layer_impl.h;l=36;drc=8d399817282e3c12ed54eb23ec42a5e418298ec6;bpv=0;bpt=1?q=PictureLayerImpl&amp;amp;ss=chromium/chromium/src&quot;&gt;cc::PictureLayerImpl&lt;/a&gt;) 。它会将 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/paint/display_item_list.h;l=49?q=cc::DisplayItemList&amp;amp;ss=chromium/chromium/src&quot;&gt;DisplayItemList&lt;/a&gt; 中的绘制操作 Playback 到 viz 的 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/quads/compositor_frame.h;l=26?q=viz::CompositorFrame&amp;amp;ss=chromium/chromium/src&quot;&gt;CompositorFrame&lt;/a&gt; 中。&lt;/li&gt;
&lt;li&gt;输入：cc::TileTask&lt;/li&gt;
&lt;li&gt;输出：LayerImpl (&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/layers/picture_layer_impl.h;l=36;drc=8d399817282e3c12ed54eb23ec42a5e418298ec6;bpv=0;bpt=1?q=PictureLayerImpl&amp;amp;ss=chromium/chromium/src&quot;&gt;cc::PictureLayerImpl&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;推荐阅读：&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/raster/%3Bl=1%3Bdrc=13c40eeef88afe7258a56ec8c552b226312545ce?q=raster&amp;amp;ss=chromium/chromium/src&quot;&gt;cc/raster/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016002044.png?max_age=624800&quot; alt=&quot;&quot; /&gt;这些颜色值位图存储与 OpenGL 引用会在 GPU 的内存中（GPU 也可以进行栅格化，即&lt;strong&gt;硬件加速&lt;/strong&gt;。）&lt;/p&gt;
&lt;p&gt;除此之外，Raster 还包括的图片解码的能力：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016002024.png?max_age=624800&quot; alt=&quot;&quot; /&gt;Raster 的核心类 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/raster/raster_buffer_provider.h%3Bl=28%3Bdrc=13c40eeef88afe7258a56ec8c552b226312545ce?q=cc::RasterBufferProvider&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;cc::RasterBufferProvider&lt;/a&gt; 有以下几个关键子类：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cc::GpuRasterBufferProvider：使用 GPU 进行 Raster，Raster 的结果直接存储在 SharedImage 中。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/raster/one_copy_raster_buffer_provider.h;l=37?q=cc::OneCopyRasterBufferProvider&amp;amp;ss=chromium/chromium/src&quot;&gt;cc::OneCopyRasterBufferProvider&lt;/a&gt;：使用 Skia 进行 Raster，结果先保存到 GpuMemoryBuffer 中，然后再将 GpuMemoryBuffer 中的数据通过 CopySubTexture 拷贝到资源的 SharedImage 中。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/raster/zero_copy_raster_buffer_provider.h;l=30?q=cc::ZeroCopyRasterBufferProvider&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;cc::ZeroCopyRasterBufferProvider&lt;/a&gt;：使用 Skia 进行 Raster，结果保存到 GpuMemoryBuffer 中，然后使用 GpuMemoryBuffer 直接创建 SharedImage。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/raster/bitmap_raster_buffer_provider.h;l=25?q=cc::BitmapRasterBufferProvider&amp;amp;ss=chromium/chromium/src&quot;&gt;cc::BitmapRasterBufferProvider&lt;/a&gt;：使用 Skia 进行 Raster，结果保存到共享内存中。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GPU Shared Image
所谓 SharedImage 机制本质上&lt;strong&gt;抽象了 GPU 的数据存储能力&lt;/strong&gt;，即允许应用直接把数据存储到 GPU 内存中，以及直接从 GPU 中读取数据，并且允许跨过 shared group 边界。在早期的 Chromium 中使用的的是 Mailbox 机制，如今的模块基本都重构为 &lt;strong&gt;GPU Shared Image&lt;/strong&gt; 了。&lt;/p&gt;
&lt;p&gt;GPU Shared Image 包括 Client 端和 Service 端，其中 Client 端可以为 Browser / Render / GPU 进程等，Client 端可以有多个；而 Service 端则只能用一个，运行在 GPU 进程。架构图如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016002810.png?max_age=624800&quot; alt=&quot;&quot; /&gt;Chromium 中使用 SharedImage 机制的一些场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC 模块&lt;/strong&gt;：先将画面 Raster 到 SharedImage，然后再发送给 Viz 进行合成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OffscreenCanvas&lt;/strong&gt;：先将 Canvas 的内容 Raster 到 SharedImage，然后再发送给 Viz 进行合成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图片处理/渲染&lt;/strong&gt;：一个线程将图片解码到 GPU 中，另一个线程使用 GPU 来修改或者渲染图片。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;视频播放&lt;/strong&gt;：一个线程将视频解码到 GPU 中，另一个线程来渲染。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;光栅化策略
根据 Compositor 和 Raster 这两个阶段是同步进行（注意同步不一定要求在同一个线程）还是异步进行，分为同步光栅化和异步光栅化，而异步光栅化都是分块进行的，因此也叫异步分块光栅化。&lt;/p&gt;
&lt;p&gt;同步光栅化，如 Android、iOS、Flutter 都使用的同步光栅化机制，同时它们也支持图层分屏额外的像素缓冲区来进行间接光栅化。&lt;/p&gt;
&lt;p&gt;同步光栅化的渲染管线很简单，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016003249.png?max_age=624800&quot; alt=&quot;&quot; /&gt;异步光栅化则是目前浏览器与 WebView 采用的策略，除却一些特殊的图层外（如 Canvas、Video），图层会进行分块光栅化，每个光栅化任务执行对应图层的对应分块区域内的绘图指令，结果写入该分块的像素缓冲区；此外&lt;strong&gt;光栅化和合成不在同一个线程执行，并且不是同步的&lt;/strong&gt;，如果合成过程中某个分块没有完成光栅化，那它就会保留空白或者绘制一个棋盘格的图形。&lt;/p&gt;
&lt;p&gt;两种光栅化策略各有优劣，大致如下表所示：&lt;/p&gt;
&lt;p&gt;同步光栅化
异步光栅化&lt;/p&gt;
&lt;p&gt;内存占用
极好
极差&lt;/p&gt;
&lt;p&gt;首屏性能
好
一般&lt;/p&gt;
&lt;p&gt;动态变化的内容渲染效率
高
低&lt;/p&gt;
&lt;p&gt;图层动画
一般
惯性动画绝对优势&lt;/p&gt;
&lt;p&gt;光栅化性能
低端机略弱
好&lt;/p&gt;
&lt;p&gt;内存占用上，同步光栅化具有绝对的优势，而异步光栅化则很吃内存，基本上可以说浏览器内核的性能大部分是靠内存换出来的。&lt;/p&gt;
&lt;p&gt;首屏性能上，同步光栅化的流水线由于更精炼，没有复杂的调度任务，会更早实现上屏。但这个提升实际上也很有限，在首屏性能上，同步光栅化通常比起异步光栅化理论上可以提前一两帧完成，可能就 20 毫秒。（当然，这里异步光栅化的资源也是本地加载的。）&lt;/p&gt;
&lt;p&gt;对于动态变化的内容，如果页面的内容在不断发生变化，这意味这异步光栅化的中间缓存大部分是失效的，需要重新光栅化。而由于同步光栅化流水更精炼，这部分重渲染效率也更高一些。&lt;/p&gt;
&lt;p&gt;对于图层动画，是异步光栅化绝对的优势了，前文也说了属性树与 Compositing，它可以控制重新渲染的图层范围，效率是很高的。虽然异步光栅化需要额外的分块耗时，但是这个开销不高，也就 2 ms 左右。如果页面动画特别复杂，那么异步光栅化的优势就能体现出来。对于惯性滚动，异步光栅化会提前对 Viewport 外的区域进行预光栅化以优化体验。但是同步光栅化也各显神通，如在编码时，iOS、Android、Flutter 都会非常强调 Cell 层面的重用机制，以此来优化滚动效果。&lt;/p&gt;
&lt;p&gt;最后是光栅化的性能上，同步光栅化对性能要求更高，因为需要大量的 CPU 计算，在低端机上容易出现持续掉帧。但是随着手机 CPU 性能越好，同步光栅化策略的优势就越明显，因为对比异步光栅化有着绝对的内存优势，且对于惯性动画也可以通过重用机制来解决，总体优势还是比较明显的。&lt;/p&gt;
&lt;p&gt;除此之外，异步光栅化也有一些无法规避的问题如快速滚动时页面白屏、滚动过程中 DOM 更新不同步等问题。&lt;/p&gt;
&lt;h3&gt;Activate&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015225235.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模块：cc&lt;/li&gt;
&lt;li&gt;进程：Render Process&lt;/li&gt;
&lt;li&gt;线程：Compositor thread&lt;/li&gt;
&lt;li&gt;职责：实现一个缓冲机制，&lt;strong&gt;确保 Draw 阶段操作前 Raster 的数据已准备好&lt;/strong&gt;。具体而言将 Layer Tree 分成 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/trees/layer_tree_host_impl.h;l=656;drc=416bc691f0aab3a1f344b673df60a00b26cd482a;bpv=0;bpt=1&quot;&gt;Pending Tree&lt;/a&gt; 与 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/trees/layer_tree_host_impl.h;l=654;drc=416bc691f0aab3a1f344b673df60a00b26cd482a;bpv=0;bpt=1&quot;&gt;Active Tree&lt;/a&gt;，从 Pending Tree 拷贝 Layer 到 Activate Tree 的过程就是 Activate。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;核心函数：&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/trees/layer_tree_host_impl.cc;l=3322;drc=416bc691f0aab3a1f344b673df60a00b26cd482a;bpv=1;bpt=1&quot;&gt;LayerTreeHostImpl::ActivateSyncTree&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015225751.png?max_age=624800&quot; alt=&quot;&quot; /&gt;Compositor thread 有三棵 cc::LayerImpl 树：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pending tree&lt;/strong&gt;: 负责接收 commit，然后将 LayerImpl 进行 Raster&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Active tree&lt;/strong&gt;: 会从这里取出栅格化好的 LayerImpl 进行 Draw 操作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recycle tree&lt;/strong&gt;：为避免频繁创建 LayerImpl 对象，Pending tree 后续不会被销毁，而是退化成 Recycle tree。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// Tree currently being drawn.
std::unique_ptr&amp;lt;LayerTreeImpl&amp;gt; active_tree_;

// In impl-side painting mode, tree with possibly incomplete rasterized
// content. May be promoted to active by ActivateSyncTree().
std::unique_ptr&amp;lt;LayerTreeImpl&amp;gt; pending_tree_;

// In impl-side painting mode, inert tree with layers that can be recycled
// by the next sync from the main thread.
std::unique_ptr&amp;lt;LayerTreeImpl&amp;gt; recycle_tree_;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Commit 阶段提交的目标其实就是 Pending 树，Raster 的结果也被存储在了 Pending 树中。通过 Active 可以实现一边从最新的提交中光栅化图块，一边上屏绘制之前的提交。&lt;/p&gt;
&lt;h3&gt;Draw&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015225242.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&amp;gt; 该阶段也可以叫做 Submit，本文中统一术语就叫 Draw。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模块：cc&lt;/li&gt;
&lt;li&gt;进程：Render Process&lt;/li&gt;
&lt;li&gt;线程：Compositor thread&lt;/li&gt;
&lt;li&gt;职责：将 Raster 后图块 (Tiling) 生成为 draw quads 的过程。&lt;/li&gt;
&lt;li&gt;输入：cc::LayerImpl (Tiling)&lt;/li&gt;
&lt;li&gt;输出：viz::DrawQuad&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Draw 阶段并不执行真正的绘制，而是遍历 Active Tree 中的 cc::LayerImpl 对象，并调用它的 cc::LayerImpl::AppendQuads 方法创建合适的 viz::DrawQuad 放入 CompositorFrame 的 RenderPass 中。&lt;/p&gt;
&lt;p&gt;核心函数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/layers/append_quads_data.h%3Bl=18%3Bdrc=13c40eeef88afe7258a56ec8c552b226312545ce?q=AppendQuads&amp;amp;ss=chromium/chromium/src&quot;&gt;PictrueLayerImpl::AppendQuads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/trees/layer_tree_frame_sink.h;l=46?q=cc::LayerTreeFrameSink&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;cc::LayerTreeFrameSink&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016005258.png?max_age=624800&quot; alt=&quot;&quot; /&gt;Viz
这里先介绍一下 Chromium 上屏的重要模块 —— viz。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;viz = visuals&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在 Chromium 中 viz 的核心逻辑运行在 Viz Process 中，负责接收其他进程产生的 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/quads/compositor_frame.h;l=26?q=viz::CompositorFrame&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::CompositorFrame&lt;/a&gt;（简称 CF），然后把这些 CF 进行合成，并将合成的结果最终渲染在窗口上。&lt;/p&gt;
&lt;p&gt;viz 模块的核心类如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016005803.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;一个 CF 对象表示一个矩形显示区域中的一帧画面，&lt;/strong&gt; &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/quads/compositor_frame.h;l=26?q=viz::CompositorFrame&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::CompositorFrame&lt;/a&gt; 内部存储了以下几类数据：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;元数据：CompositorFrameMetadata&lt;/li&gt;
&lt;li&gt;引用到的资源：TransferableResource&lt;/li&gt;
&lt;li&gt;绘制操作：RenderPass/DrawQuad&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;元数据 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/quads/compositor_frame_metadata.h;l=60?q=viz::CompositorFrameMetadata&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::CompositorFrameMetadata&lt;/a&gt; 记录了 CF 相关的元数据，比如画面的缩放级别，滚动区域，引用到的 Surface 等：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;device_scale_factor:float&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:ui/latency/latency_info.h;l=42;drc=8d3351f2b93dc4fef60b794c47ec22ebf54f3e8b&quot;&gt;latency_info:ui::LatencyInfo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;referenced_surfaces:SurfaceRange&lt;/li&gt;
&lt;li&gt;begin_frame_ack:BeginFrameAck&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;引用到的资源 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/resources/transferable_resource.h;l=30?q=viz::TransferableResource&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::TransferableResource&lt;/a&gt; 记录了该 CF 引用到的资源，所谓的资源可以理解为一张图片。资源有两种存在形式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;存储在内存中的 Software 资源&lt;/li&gt;
&lt;li&gt;存储在 GPU 中的 Texture&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果没有开启硬件加速渲染，则只能使用 Software 资源；而如果开启了硬件加速，则只能使用硬件加速的资源。&lt;/p&gt;
&lt;p&gt;CF 的绘制操作 viz::RenderPass 由一系列相关的 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/quads/draw_quad.h;l=34?q=viz::DrawQuad&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::DrawQuad&lt;/a&gt; 构成。可以对一个 RenderPass 单独应用特效，变换，mipmap，缓存，&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/frame_sinks/copy_output_request.h;l=46;drc=416bc691f0aab3a1f344b673df60a00b26cd482a?q=viz::CopyOutputRequest&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;截图&lt;/a&gt;等。DrawQuad 有很多种类型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/quads/texture_draw_quad.h;l=23;bpv=0;bpt=1?q=viz::TextureDrawQuad&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::TextureDrawQuad&lt;/a&gt;：内部引用一个资源。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/quads/tile_draw_quad.h;l=16;bpv=0;bpt=1?q=viz::TileDrawQuad&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::TileDrawQuad&lt;/a&gt;：表示一个 Tile 块，和 TextureDrawQuad 类似，内部也引用一个资源，DisplayItemList 会被 cc Raster 为 TileDrawQuad；&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/quads/picture_draw_quad.h;l=22;bpv=0;bpt=1?q=viz::PictureDrawQuad&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::PictureDrawQuad&lt;/a&gt;：内部直接存放 DisplayItemList，但是目前只能用于 Android WebView；&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/quads/solid_color_draw_quad.h;l=14;bpv=0;bpt=1?q=viz::SolidColorDrawQuad&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::SolidColorDrawQuad&lt;/a&gt;：表示一个颜色块；&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/quads/render_pass_draw_quad_internal.h;l=19;bpv=0;bpt=1?q=viz::RenderPassDrawQuad&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::RenderPassDrawQuad&lt;/a&gt;：内部引用另外一个 RenderPass 的 Id；&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/quads/surface_draw_quad.h;l=15;bpv=0;bpt=1?q=viz::SurfaceDrawQuad&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::SurfaceDrawQuad&lt;/a&gt;：内部保存一个 viz::SurfaceId，该 Surface 的内容由其他 CompositorFrameSinkClient 创建，用于 viz 的嵌套，比如 OOPIF, OffscreenCanvas 等；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;介绍完了 Viz 模块的基础知识，接下来让我们的流水线进入到 Viz Process 中。&lt;/p&gt;
&lt;h3&gt;Aggregate&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015225249.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模块：Viz&lt;/li&gt;
&lt;li&gt;进程：Viz Process&lt;/li&gt;
&lt;li&gt;线程：Display Compositor thread&lt;/li&gt;
&lt;li&gt;职责：&lt;strong&gt;Surface aggregation&lt;/strong&gt;，接受多个进程传递过来的 CF 并进行合成。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;核心类：&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/surface_aggregator.h%3Bl=41%3Bdrc=13c40eeef88afe7258a56ec8c552b226312545ce?q=SurfaceAggregator&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;SurfaceAggregator&lt;/a&gt;。
&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015230002.png?max_age=624800&quot; alt=&quot;&quot; /&gt;
Display compositor（viz process compositor thread）会接受多个进程传递过来的 CF ，并调用&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/surface_aggregator.h%3Bl=41%3Bdrc=13c40eeef88afe7258a56ec8c552b226312545ce?q=SurfaceAggregator&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;SurfaceAggregator&lt;/a&gt; 中的函数进行合成。&lt;/p&gt;
&lt;h3&gt;Display&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015225256.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模块：Viz&lt;/li&gt;
&lt;li&gt;进程：Viz Process&lt;/li&gt;
&lt;li&gt;线程：GPU main thread&lt;/li&gt;
&lt;li&gt;职责：生成了 CF 以后，viz 会调用 GL 指令把 draw quads 最终输出到屏幕上。&lt;/li&gt;
&lt;li&gt;输入：合成之后的 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/quads/compositor_frame.h;l=26?q=viz::CompositorFrame&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::CompositorFrame&lt;/a&gt;  （需要其中的 DrawQuad）&lt;/li&gt;
&lt;li&gt;输出：绘制 pixels&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先介绍一下 Viz 的渲染目标，viz::DirectRenderer 和 viz::OutputSurface 用于管理渲染目标，根据它们不同子类的组合，存在三种不同的渲染方案：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;软件渲染&lt;/strong&gt;： &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/software_renderer.h;l=28?q=viz::SoftwareRenderer%20&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::SoftwareRenderer&lt;/a&gt; + &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display_embedder/software_output_surface.h;l=27?q=viz::SoftwareOutputSurface&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::SoftwareOutputSurface&lt;/a&gt; + &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/software_output_device.h;l=32?q=viz::SoftwareOutputDevice&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::SoftwareOutputDevice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skia 渲染&lt;/strong&gt;： &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/skia_renderer.h;l=45?q=viz::SkiaRenderer&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::SkiaRenderer&lt;/a&gt; +  &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/skia_output_surface.h;l=51?q=viz::SkiaOutputSurface%20&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::SkiaOutputSurface&lt;/a&gt;(Impl) +  &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display_embedder/skia_output_device.h;l=53?q=viz::SkiaOutputDevice%20&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::SkiaOutputDevice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenGL 渲染&lt;/strong&gt;： viz::GLRenderer + viz::GLOutputSurface&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;首先是软件渲染，SoftwareRenderer 用于纯软件渲染，当关闭硬件加速的时候使用该种渲染方式。&lt;/p&gt;
&lt;p&gt;第二个是 &lt;strong&gt;Skia 渲染&lt;/strong&gt;， SkiaOutputSurface 对渲染目标的控制是通过 SkiaOutputDevice 实现的，后者有很多子类，其中 SkiaOutputDeviceOffscreen 用于实现离屏渲染，SkiaOutputDeviceGL 用于 GL 渲染。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016104901.png?max_age=624800&quot; alt=&quot;&quot; /&gt;SkiaRenderer 将 DrawQuad 绘制到由 SkiaOutputSurfaceImpl 提供的 canvas 上，但是该 canvas 并不会进行真正的绘制动作，而是通过 skia 的 ddl(SkDeferredDisplayListRecorder) 机制把这些绘制操作记录下来，等到所有的 RenderPass 绘制完成，这些被记录下来的绘制操作会被通过 SkiaOutputSurfaceImpl::SubmitPaint 发送到 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h%3Bl=86%3Bbpv=1%3Bbpt=1?q=SkiaOutputSurfaceImplOnGpu&amp;amp;sq=&amp;amp;ss=chromium&quot;&gt;SkiaOutputSurfaceImplOnGpu&lt;/a&gt; 中进行真实的绘制。&lt;/p&gt;
&lt;p&gt;Skia 渲染具有最大的灵活性，同时支持 GL 渲染，Vulkan 渲染，离屏渲染等。&lt;/p&gt;
&lt;p&gt;核心函数与相关类梳理如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/skia_renderer.h;l=45?q=viz::SkiaRenderer&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::SkiaRenderer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/skia_output_surface.h;l=51?q=viz::SkiaOutputSurface%20&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::SkiaOutputSurface&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display_embedder/skia_output_device.h;l=53?q=viz::SkiaOutputDevice%20&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::SkiaOutputDevice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h%3Bl=86%3Bbpv=1%3Bbpt=1?q=SkiaOutputSurfaceImplOnGpu&amp;amp;sq=&amp;amp;ss=chromium&quot;&gt;SkiaOutputSurfaceImplOnGpu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/skia/src/image/SkSurface.cpp;bpv=1;bpt=1;l=243?q=SkSurface::draw&amp;amp;ss=chromium&amp;amp;gsn=draw&amp;amp;gs=kythe%3A%2F%2Fchromium.googlesource.com%2Fchromium%2Fsrc%3Flang%3Dc%252B%252B%3Fpath%3Dthird_party%2Fskia%2Finclude%2Fcore%2FSkSurface.h%23JJqTiW3_ZrLk4BWPX-Bz-0r49wyE1npszhYd3P3EtTo&amp;amp;gs=kythe%3A%2F%2Fchromium.googlesource.com%2Fchromium%2Fsrc%3Flang%3Dc%252B%252B%3Fpath%3Dthird_party%2Fskia%2Fsrc%2Fimage%2FSkSurface.cpp%23Qao2aijSUuzqEQ20hEPqnxMvBOT8rkcNgfAMaP9RCFw&quot;&gt;SkSurface::draw&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后是 OpenGL 渲染，来自 viz compositor 线程的 GL 调用（帧数据）被 command buffer 代理，从 Compositor thread 写入到 main thread 的 back buffer 中。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016105249.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&amp;gt; 注：GLRenderer 已经被标记为 &lt;strong&gt;deprecated&lt;/strong&gt;, 未来会被 SkiaRenderer 取代。&lt;/p&gt;
&lt;p&gt;它使用基于 CommandBuffer 的 GL Context 来渲染 DrawQuad 到 GLOutputSurface 上，GLOutputSurface 使用窗口句柄创建 Native GL Context。GL 调用发生在 Compositor thread 中，通过 InProcessCommandBuffer 这些 GL 调用最终在 CrGpuMain 线程中执行。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016105347.png?max_age=624800&quot; alt=&quot;&quot; /&gt;
关于 CommandBuffer 相关内容可以参考 &lt;a href=&quot;https://www.chromium.org/developers/design-documents/gpu-command-buffer/&quot;&gt;GPU Command Buffer&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;最后进行 GL 指令调用，不同的操作系统/显卡驱动提供的类库不同，&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016105418.png?max_age=624800&quot; alt=&quot;&quot; /&gt;需要注意的，图形绘制引擎一般会使用双缓冲（Double Buffering）技术，先将图片绘制到一个缓冲区，再一次性传递给屏幕进行显示，这样可以防止屏幕抖动，优化渲染性能。&lt;/p&gt;
&lt;p&gt;同样的这里上屏也分为 Front Buffer（前台缓冲区）与 Back Buffer（后台缓冲区），屏幕负责从 Front Buffer 读帧数据输出展示。viz 调用 &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/display.h%3Bl=154%3Bbpv=1%3Bbpt=1?q=Display::DrawAndSwap&amp;amp;sq=&amp;amp;ss=chromium&quot;&gt;Display::DrawAndSwap&lt;/a&gt; 来交换 Front Buffer 与 Back Buffer 的指针，在垂直同步信号来临时，显卡驱动类库执行对应的绘制指令，最后用户就能在屏幕上看到 pixels 了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016105832.png?max_age=624800&quot; alt=&quot;&quot; /&gt;以上便是 Chromium 的整个渲染流水线，本文是渲染流水线的 Overview，若对该话题感兴趣，可期待该系列的后续文章，或阅读本文列出的核心源码与扩展阅读，来进一步了解更多相关知识。&lt;/p&gt;
&lt;h2&gt;扩展阅读&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://notes.ursb.me/posts/weekly-14/&quot;&gt;Chromium Rendering Pipeline - Introduce&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://notes.ursb.me/posts/weekly-15/&quot;&gt;Chromium Rendering Pipeline - Parsing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://notes.ursb.me/posts/chromium-style/&quot;&gt;Chromium Rendering Pipeline - Style&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chromium.googlesource.com/chromium/src/+/master/mojo/README.md&quot;&gt;Mojo docs (go/mojo-docs) - Mojo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.chromium.org/developers/design-documents/multi-process-architecture&quot;&gt;Multi-process Architecture - The Chromium Projects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/blog/inside-browser-part3/&quot;&gt;Inside look at modern web browser (part 3)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chromium.googlesource.com/chromium/src/+/master/docs/how_cc_works.md&quot;&gt;How cc Works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chromium.googlesource.com/chromium/src/+/master/services/viz/README.md&quot;&gt;Viz Services Directory Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chromium.googlesource.com/chromium/src/+/master/components/viz/&quot;&gt;components/viz - chromium/src - Git at Google&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.google.com/document/d/12qYPeN819JkdNGbPcKBA0rfPXSOIE3aIaQVrAZ4I1lM/edit#&quot;&gt;Shared images and synchronization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/articles/renderingng-architecture/&quot;&gt;Overview of the RenderingNG architecture - Chrome Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/articles/renderingng/&quot;&gt;RenderingNG - Chrome Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/articles/renderingng-data-structures/&quot;&gt;Key data structures and their roles in RenderingNG - Chrome Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1boPxbgNrTU0ddsc144rcXayGA_WF53k96imRH8Mp34Y/edit#slide=id.ga884fe665f_64_45&quot;&gt;Life of a pixel - Google Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/articles/layoutng/&quot;&gt;RenderingNG deep-dive: LayoutNG - Chrome Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/articles/blinkng/&quot;&gt;RenderingNG deep-dive: BlinkNG - Chrome Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.chromium.org/developers/how-tos/get-the-code/&quot;&gt;Get the Code: Checkout, Build, &amp;amp; Run Chromium - The Chromium Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wpt.fyi/interop-2022&quot;&gt;Web Platform Tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src&quot;&gt;Chromium Code Search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lmame-geek.com/&quot;&gt;CSS Triggers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tc39.es/ecma262/&quot;&gt;ECMAScript Language Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://html.spec.whatwg.org&quot;&gt;WHATWG HTML Living Standard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=chromium-renderer&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>周刊（第13期）：玄学杠杆与异世界小组</title><link>https://ursb.me/posts/weekly-13/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-13/</guid><description>第13期周刊探讨年轻人流行的网络占卜与玄学杠杆现象，以及豆瓣异世界小组背后的社会心理，认为二者都是缓解异化劳动压力的积极心理学工具。</description><pubDate>Sun, 31 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;玄学杠杆与异世界小组&lt;/h2&gt;
&lt;p&gt;周末听到一期播客，说的是年轻人的网络占卜：&lt;a href=&quot;https://therabbithole.fireside.fm/3&quot;&gt;EP03 网络占卜「奇观」：00 后给 70 后指点人生 - 跳进兔子洞&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;网络占卜变成了年轻人的职业选择，大多数人会说一切的开始来源于一颗纯粹的好奇心。低门槛、零成本、高回报。大部分占卜师的第一步都是自学，基本上去 B 站或者几本书看个两三天就会了。小红书上接单的普遍是自学了几个月的 00 后，想要从零基础把塔罗发展成副业甚至是全职并不难，而且比较有前景。现在的年轻人社恐的略多，可能这种足不出户、不用面对面的要求会比较符合目前的市场环境。&lt;/p&gt;
&lt;p&gt;但是这期播客节目深入研究之后，发现其实客户分布在 25 岁到 55 岁之间的，年轻的客户群占卜的话题总是离不开「爱情」，40 多岁的群体则会关注家庭和孩子问题。但是这些群体有个共同特种，很多时候，客户想要的是一种纯粹的情感交流和倾诉。而占卜师，更像是一个树洞。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;因为她们基本上是没有办法排解的。有的时候又不能跟父母说，也不能跟朋友说，也没有自己的资源和资金去寻求真正专业的、长期的心理帮助。这个时候可能就占卜师可以起到一个比较微小的治愈作用。 ——《网络占卜「奇观」》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;听完这期节目，我还想到之前看到的袤则咨询的 &lt;a href=&quot;https://docs.qq.com/pdf/DZVV5aXBOSWZ5TEFW?&quot;&gt;2022大社交趋势观察报告&lt;/a&gt;，里面提到了一个趋势「玄学杠杆」。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;迷茫的人们将对未知人生的情感投射于漫天星斗与风流水转，以“信而不迷”的态度将玄学纳入日常生活决策链的关键一环。 ——《2022大社交趋势观察报告》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;玄学杠杆有以下三个特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将玄学作为小的生活情趣&lt;/li&gt;
&lt;li&gt;信而不迷&lt;/li&gt;
&lt;li&gt;借玄学完整自我认知教育&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;当代玄学更像是一种积极心理学的工具——给定一个不可证伪的支点，年轻人似乎就能撬起阻碍人生、压抑命运的巨石。但同时人们也将自己作为“万物的尺度”，拒绝出让自己的能动性：不好的签就是不准，不应的庙就是不灵。正是因为感到困惑迷惘，年轻人从而寻求玄学的助力，如果事与愿违，更加无力，他们便不会沉溺其间。——《2022大社交趋势观察报告》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;此外，接纳玄学的年轻人也不是单纯去祈求一个问题的答案，正如上面的播客分析到的，有时候他们更期待能够有一个树洞，借由玄学的话语体系，在因时而变的命理中完成自我认知的教育。在与玄学的对话中，对“我为什么会这样”进行追溯和省思，从而找到自我认同的坐标。&lt;/p&gt;
&lt;p&gt;网络占卜可以说是社会异化劳动压力下的积极心理学工具，类似的现象还有去年大火的豆瓣异世界小组：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220731122013.png&quot; alt=&quot;&quot; /&gt;这些小组不仅以话题与兴趣为纽带组织起了交往的论坛，甚至直接以小组为基础建立起与现实世界平行存在的“异世界”，令人叹为观止。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.woshipm.com/it/4442929.html&quot;&gt;豆瓣异世界小组：人类对穿越时空的想象，蕴藏在各种媒介奇观里&lt;/a&gt; 一文中分析了为什么会有异世界小组这种现象：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从独白到狂欢：社交媒体的形塑&lt;/li&gt;
&lt;li&gt;从想象到行动：具身参与的诱惑&lt;/li&gt;
&lt;li&gt;从逃离到回归：对生存境况的反思&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第一点说的是社交媒体的集体狂欢。&lt;/p&gt;
&lt;p&gt;第二点说的是「具身性」，换言之，置身其中的人们仿佛加入了一场电子游戏一般，通过发帖、回帖以及创建规则等方式操控着处于异世界中的“身体”。如此，流于想象的时空重组成为了可感可触的具身参与，这正是异世界最引人流连忘返之处。&lt;/p&gt;
&lt;p&gt;而第三点，则和玄学杠杆很是类似，是对现实生活的逃离，而逃离行为本身就有反思现实的意味。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一方面，城市化带来的生活原子化致使现代人的孤独感与离群感上升。另一方面，层出不穷的新社会议题涌现在公众视野，凸显着诸种社会问题。——《豆瓣异世界小组：人类对穿越时空的想象，蕴藏在各种媒介奇观里》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;根据马克思的观点，人在劳动过程中，由于自身的活动而产生出了与自己相对立、制约自己的东西，即所谓的异化劳动。当日益增长的异化劳动压力将年轻人裹挟，客观现实的不确定性与主观个体的徒劳无力感，使得部分年轻人将当代玄学视为一种提供情绪价值的积极心理学工具。&lt;/p&gt;
&lt;p&gt;异世界小组与网络占卜恰是这类工具的典型代表。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在社交平台上，年轻人将自己的异化困境诉诸于玄学同好，交换倾诉，彼此共情，互相安慰，共同寄托——某种程度上，“搞玄学”与各种娱乐休闲的消遣方式一样，是年轻人消解负面情感的重要路径。——《2022大社交趋势观察报告》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;但除此之外，在异世界小组与网络占卜这类诞生于社交媒体这一奇幻之地的诸种媒介奇观，其实都是人类的实践与社交媒体诸多技术潜力相遇而迸发的火花，而这些事物同时正在形塑着我们的日常生活，为我们创造着新的想象空间。&lt;/p&gt;
&lt;p&gt;想到《娱乐至死》中尼尔·波兹曼的「媒介即隐喻」理论：媒介的选择会反过来改变我们自己，我们选择什么样的媒介，就通往什么样的结局。&lt;/p&gt;
&lt;p&gt;我们不知道该如何认识自我，那么就创造玄学的镜子与异世界的光景，通过投射与自己互动。以此补足自我认知，丰满个体意义。&lt;/p&gt;
&lt;p&gt;珍惜当下的日常，向内看、向后看，也是为了更好地向外看、向前看。不管怎样，多读书、多思考永远是正途。&lt;/p&gt;
&lt;h2&gt;每周推荐&lt;/h2&gt;
&lt;h3&gt;技术文：How Blink works&lt;/h3&gt;
&lt;p&gt;这周在看 Blink 的代码，从网上找到一篇很不错的文章：&lt;a href=&quot;https://docs.google.com/document/d/1aitSOucL0VHZa9Z2vbRJSyAIsAz24kX8LFByQ5xQnUg/edit?pli=1#&quot;&gt;How Blink works&lt;/a&gt;，这是一篇 Chromium 官方团队出品的文章，它介绍了 Chrome 浏览器内核内部的重要模块 Blink 内部设计和实现的一些细节。对于想要了解 Chrome 内核内部实现的同学，这篇文章提供了不错的入门指引。&lt;/p&gt;
&lt;h2&gt;本周记录&lt;/h2&gt;
&lt;h3&gt;Recent Viewings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;读完：科幻 |《记忆旅行者》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看过：电影 |《未麻的部屋》| ★★★★★&lt;/li&gt;
&lt;li&gt;看过：电影 |《爱在日落黄昏时》| ★★★★☆&lt;/li&gt;
&lt;li&gt;看过：电影 |《红辣椒》| ★★★★★&lt;/li&gt;
&lt;li&gt;玩过：治愈 |《Dorfromantik》| ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;很喜欢 Dorfromantik 这种治愈画风的游戏呀~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220731124503.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Recent Code&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TypeScript        21 hrs 1 min   █████████▋░░░░░░░░░░░  45.9%
TypeScript React  19 hrs 56 mins █████████▏░░░░░░░░░░░  43.6%
C++               1 hr 21 mins   ▋░░░░░░░░░░░░░░░░░░░░   3.0%
JSON              1 hr 8 mins    ▌░░░░░░░░░░░░░░░░░░░░   2.5%
JavaScript        56 mins        ▍░░░░░░░░░░░░░░░░░░░░   2.0%
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-13&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>前端开发中的大小写敏感问题</title><link>https://ursb.me/posts/case-sensitivity/</link><guid isPermaLink="true">https://ursb.me/posts/case-sensitivity/</guid><description>梳理前端开发中大小写敏感的常见场景，包括 HTTP Header、URL、Cookie 与 CSS 属性等，并深入 Chromium 与 Blink 源码，验证请求头与响应头字段名大小写转换的具体实现细节。</description><pubDate>Sun, 24 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;大小写敏感（case sensitivity）是软件开发领域的议题，指同一个“词”拼写的大小写字母的不同可能会导致不同效果的场景。&lt;/p&gt;
&lt;p&gt;接下来，我们谈谈前端开发领域中一些常见的大小写敏感/不敏感的场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP Header&lt;/li&gt;
&lt;li&gt;HTTP Method&lt;/li&gt;
&lt;li&gt;URL&lt;/li&gt;
&lt;li&gt;Cookie&lt;/li&gt;
&lt;li&gt;E-Mail Address&lt;/li&gt;
&lt;li&gt;HTML5 Tags and Attribute name&lt;/li&gt;
&lt;li&gt;CSS Property&lt;/li&gt;
&lt;li&gt;File&apos;s name in Git&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;HTTP Header 区分大小写吗?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;HTTP Header 的名称字段是不区分大小写的。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc7230#section-3.2&quot;&gt;RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1)#section-3.2&lt;/a&gt; 中规定：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Each header field consists of a case-insensitive field name followed
by a colon (&quot;:&quot;), optional leading whitespace, the field value, and
optional trailing whitespace.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;但是需要注意的是，HTTP/2 多了额外的限制，因为增加了头部压缩，要求在编码前必须转成小写。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc7540#section-8.1.2&quot;&gt;RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)#section-8.1.2&lt;/a&gt; 中规定：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;However, header field names MUST be converted to lowercase prior to their
encoding in HTTP/2.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;而如今大多数客户端与 HTTP 服务端都默认会把 HTTP Header 的名称字段统一改成小写，避免使用方再重复做大小写转换的处理逻辑。&lt;/p&gt;
&lt;p&gt;比如 NodeJS 中的 HTTP 模块就会自动将 Header 字段改成小写 &lt;a href=&quot;https://github.com/nodejs/node/blob/main/lib/_http_outgoing.js#L187&quot;&gt;node/_http_outgoing.js at main · nodejs/node · GitHub&lt;/a&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// lib/_http_outgoing.js
ObjectDefineProperty(OutgoingMessage.prototype, &apos;_headers&apos;, {
  __proto__: null,
  get: internalUtil.deprecate(function() {
    return this.getHeaders();
  }, &apos;OutgoingMessage.prototype._headers is deprecated&apos;, &apos;DEP0066&apos;),
  set: internalUtil.deprecate(function(val) {
    if (val == null) {
      this[kOutHeaders] = null;
    } else if (typeof val === &apos;object&apos;) {
      const headers = this[kOutHeaders] = ObjectCreate(null);
      const keys = ObjectKeys(val);
      // Retain for(;;) loop for performance reasons
      // Refs: https://github.com/nodejs/node/pull/30958
      for (let i = 0; i &amp;lt; keys.length; ++i) {
        const name = keys[i];
        headers[StringPrototypeToLowerCase(name)] = [name, val[name]];
      }
    }
  }, &apos;OutgoingMessage.prototype._headers is deprecated&apos;, &apos;DEP0066&apos;)
});
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;PS. 在写这篇文章的时候，发现 NodeJS 的这部分文档有处错误，示例中的获取 headers 存在大写字母，于是顺手提了个 PR，现已经合入了。&lt;a href=&quot;https://github.com/nodejs/node/pull/43933/&quot;&gt;doc: fix typo in http.md by airingursb · Pull Request #43933 · nodejs/node · GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;除此之外，Rust 的 HTTP 模块也会将 Header 的字段名默认改成小写，理由是 HeaderMap 会处理地更快。&lt;/p&gt;
&lt;p&gt;文档可见&lt;a href=&quot;https://docs.rs/http/0.1.3/http/header/index.html#headername&quot;&gt;http::header - Rust&lt;/a&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;HeaderName&lt;/code&gt; type represents both standard header names as well as custom header names. The type handles the case insensitive nature of header names and is used as the key portion of &lt;code&gt;HeaderMap&lt;/code&gt;. Header names are normalized to lower case. In other words, when creating a &lt;code&gt;HeaderName&lt;/code&gt; with a string, even if upper case characters are included, when getting a string representation of the &lt;code&gt;HeaderName&lt;/code&gt;, it will be all lower case. This allows for faster &lt;code&gt;HeaderMap&lt;/code&gt; comparison operations.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;源码可见：&lt;a href=&quot;https://docs.rs/crate/http/0.1.3/source/src/header/name.rs&quot;&gt;src/headers/name.rs - http 0.1.3 - Docs.rs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;作为前端开发，会更加关注 Chromium 和 WebKit 对这块的处理。&lt;/p&gt;
&lt;p&gt;对于请求头而言，我们在 Chrome 中做个实验：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var ajax = new XMLHttpRequest();
ajax.open(&quot;GET&quot;, &quot;https://y.qq.com/lib/interaction/h5/interaction-component-1.2.min.js&quot;);
ajax.setRequestHeader(&quot;X-test&quot;, &quot;AA&quot;);
ajax.send();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于 HTTP2 的请求，抓包之后可以发现，这里的 &lt;code&gt;X-test&lt;/code&gt; 被改写成了小写 &lt;code&gt;x-test&lt;/code&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220723154829@2x.png&quot; alt=&quot;&quot; /&gt;为了严谨起见，这里又使用了 Chrome 自带的 netlog-viewer 去抓包查看，这里的请求头确实是被转成小写了没有问题：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220724104811@2x.png&quot; alt=&quot;&quot; /&gt;&amp;gt; 注：以上测试在 Safari 中也会得到同样的结果，但是必须要抓包看，如果只是在 Safari 的控制台看，它展示大小写是有问题的，而 Chrome 的 Devtools 则没有问题。这里猜测是 Safari 的 Bug。&lt;/p&gt;
&lt;p&gt;于是去阅读 Blink 中 XMLHTTPRequest 的源码，可惜的是没有找到在哪里转成了小写。&lt;/p&gt;
&lt;p&gt;我也去查 XMLHTTPRequest 的标准，&lt;a href=&quot;https://xhr.spec.whatwg.org/#the-setrequestheader()-method&quot;&gt;XMLHttpRequest Standard&lt;/a&gt; 中也没有提到需要将 header 字段名改成小写。&lt;/p&gt;
&lt;p&gt;甚至在 XHR 标准中也曾有人建议过直接在 XHR 把 Header 字段名转成小写（&lt;a href=&quot;https://github.com/whatwg/xhr/issues/34&quot;&gt;Should XHR store and send HTTP header names in lower case? · Issue #34 · whatwg/xhr · GitHub&lt;/a&gt;），但是被拒绝了。&lt;/p&gt;
&lt;p&gt;按照规范 HTTP2 的 Header 名都需要转成小写，但我找了个 HTTP1.1 的站点测试了一下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var ajax = new XMLHttpRequest();
ajax.open(&quot;get&quot;, &quot;http://www.cn1t.com/airing.js&quot;);
ajax.setRequestHeader(&quot;X-test&quot;, &quot;AA&quot;);
ajax.send();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;发现这里的 Header 字段名则并不会转成小写：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220724092209@2x.png&quot; alt=&quot;&quot; /&gt;可以得知，请求头的字段名大小写转换不是 XMLHTTPRequest 做的事情，而是底层网络库的逻辑。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PS. 我这里 Debug 了许久，没有找到更底层具体是哪里转成了小写，若有知晓的同学可以直接评论告知，万分感谢。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;而响应头中的字段名则不一样了。如果你使用 XMLHTTPRequest 的 &lt;code&gt;getAllResponseHeaders&lt;/code&gt; 等方法去获取响应头，Blink 会将 Header 的名称字段改成小写：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;String XMLHttpRequest::getAllResponseHeaders() const {
  // ...
  for (const auto&amp;amp; header : headers) {
    string_builder.Append(header.first.LowerASCII());
    string_builder.Append(&apos;:&apos;);
    string_builder.Append(&apos; &apos;);
    string_builder.Append(header.second);
    string_builder.Append(&apos;\r&apos;);
    string_builder.Append(&apos;\n&apos;);
  }
  // ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此外，Chromium 在解析网络响应包的时候，如果走 HTTP2 协议，发现了 Header 字段名有大写字母，会直接导致网络包解析失败：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;absl::optional&amp;lt;ParsedHeaders&amp;gt; ConvertCBORValueToHeaders(
    const cbor::Value&amp;amp; headers_value) {
  // |headers_value| of headers must be a map.
  if (!headers_value.is_map())
    return absl::nullopt;

  ParsedHeaders result;

  for (const auto&amp;amp; item : headers_value.GetMap()) {
    if (!item.first.is_bytestring() || !item.second.is_bytestring())
      return absl::nullopt;
    base::StringPiece name = item.first.GetBytestringAsString();
    base::StringPiece value = item.second.GetBytestringAsString();

    // If name contains any upper-case or non-ASCII characters, return an error.
    // This matches the requirement in Section 8.1.2 of [RFC7540].
    if (!base::IsStringASCII(name) ||
        std::any_of(name.begin(), name.end(), base::IsAsciiUpper&amp;lt;char&amp;gt;))
      return absl::nullopt;
// ...other
  }

  return result;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;HTTP Method 区分大小写吗？&lt;/h2&gt;
&lt;p&gt;根据规范 &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.1&quot;&gt;RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1)#section-3.1.1&lt;/a&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The method token indicates the request method to be performed on the target resource. The request method is case-sensitive.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;HTTP Method 是区分大小写的，并且全部为大写。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;但其实如果你的 XMLHttpRequest 实例传入小写的 Method 也是没有关系的（如调用 &lt;code&gt;ajax.open(&quot;get&quot;, &quot;https://ursb.me&quot;)&lt;/code&gt;），Blink 等浏览器内核会将其规范化改成大写 &lt;a href=&quot;https://chromium.googlesource.com/chromium/blink/+/master/Source/core/xmlhttprequest/XMLHttpRequest.cpp#618&quot;&gt;Source/core/xmlhttprequest/XMLHttpRequest.cpp - chromium/blink - Git at Google&lt;/a&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void XMLHttpRequest::open(const AtomicString&amp;amp; method,
                          const KURL&amp;amp; url,
                          bool async,
                          ExceptionState&amp;amp; exception_state) {
  //...
  method_ = FetchUtils::NormalizeMethod(method);
  // ...
  
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;AtomicString FetchUtils::NormalizeMethod(const AtomicString&amp;amp; method) {
  // https://fetch.spec.whatwg.org/#concept-method-normalize

  // We place GET and POST first because they are more commonly used than
  // others.
  const char* const kMethods[] = {
      &quot;GET&quot;, &quot;POST&quot;, &quot;DELETE&quot;, &quot;HEAD&quot;, &quot;OPTIONS&quot;, &quot;PUT&quot;,
  };

  for (auto* const known : kMethods) {
    if (EqualIgnoringASCIICase(method, known)) {
      // Don&apos;t bother allocating a new string if it&apos;s already all
      // uppercase.
      return method == known ? method : known;
    }
  }
  return method;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;URL 区分大小写吗？&lt;/h2&gt;
&lt;p&gt;根据规范 &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc7230#section-2.7.3&quot;&gt;RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1)#section-2.7.3&lt;/a&gt; 中的描述：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The scheme and host are case-insensitive and normally provided in lowercase; all other components are compared in a case-sensitive manner.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;HTTP 协议 (scheme / protocol) 和域名 (host) 不区分大小写，但 path、query、fragment 是区分的。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 Chromuim 中，URL 统一使用 &lt;code&gt;kUrl&lt;/code&gt; 类管理，其内部会对 &lt;code&gt;protocol&lt;/code&gt; 与 &lt;code&gt;host&lt;/code&gt; 做规范化处理（canonicalization），这个过程会将 protocol 与 host 改为小写。&lt;/p&gt;
&lt;p&gt;除此之外，其中比较有意思的是 &lt;code&gt;path&lt;/code&gt;，虽然规范约定了 &lt;code&gt;path&lt;/code&gt; 是区分大小写的，但实际情况却取决于  Web Server  的底层文件消息，&lt;strong&gt;因此 path 有可能也是不区分大小写的&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;比如 IIS 服务器就是不区分的，因为它取决于 Windows 的文件系统，Windows 使用的 NTFS 和 FAT 系列文件系统，默认大小写不敏感（但大小写保留）。对应的，如果 Apache 服务器部署在大小写不敏感的 Mac(HFS) 上，也同样不区分大小写。&lt;/p&gt;
&lt;p&gt;扩展介绍一些主流操作系统的底层文件系统：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows 使用的 NTFS 和 FAT 系列文件系统，默认大小写不敏感，但大小写保留&lt;/li&gt;
&lt;li&gt;macOS 使用的 APFS 和 HFS+ 文件系统，默认大小写不敏感，但大小写保留&lt;/li&gt;
&lt;li&gt;Linux 使用的 ext3/ext4 文件系统，默认大小写敏感&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;除此之外，还和服务器的策略有关系，比如 &lt;a href=&quot;https://en.wikipedia.org/wiki/Case_sensitivity&quot;&gt;https://en.wikipedia.org/wiki/Case_sensitivity&lt;/a&gt; 和 &lt;a href=&quot;https://en.wikipedia.org/wiki/case_sensitivity&quot;&gt;https://en.wikipedia.org/wiki/case_sensitivity&lt;/a&gt; 指向同一篇文章，但是就不能简单认为它大小写不敏感，因为  &lt;a href=&quot;https://en.wikipedia.org/wiki/CASE_SENSITIVITY&quot;&gt;https://en.wikipedia.org/wiki/CASE_SENSITIVITY&lt;/a&gt; 就直接 404 了。&lt;/p&gt;
&lt;h2&gt;Cookie 区分大小写吗？&lt;/h2&gt;
&lt;p&gt;先说结论，符合直观，&lt;strong&gt;Cookie 的名称是区分大小写的&lt;/strong&gt;。但是规范的演进比较坎坷。&lt;/p&gt;
&lt;p&gt;早期的规范 &lt;a href=&quot;http://www.ietf.org/rfc/rfc2109.txt&quot;&gt;RFC 2109 - HTTP State Management Mechanism&lt;/a&gt; Cookie 的名字是不区分大小写的：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Attributes (names) (attr) are case-insensitive.&lt;/strong&gt; White space is permitted between tokens. Note that while the above syntax description shows value as optional, most attrs require them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;而在 &lt;a href=&quot;https://www.ietf.org/rfc/rfc2965.txt&quot;&gt;RFC 2965&lt;/a&gt; 则废弃掉了  &lt;a href=&quot;http://www.ietf.org/rfc/rfc2109.txt&quot;&gt;RFC 2109&lt;/a&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This document reflects implementation experience with RFC 2109 and obsoletes it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;但是在 Cookie 的最新规范  &lt;a href=&quot;http://tools.ietf.org/html/rfc6265&quot;&gt;RFC 6265&lt;/a&gt;  中并没有写明 Cookie 是否区分大小写，那么默认可以认为是区分的，主流浏览器 Chrome 与 FireFox 的实现也都是区分 Cookie 的大小写。&lt;/p&gt;
&lt;h2&gt;E-Mail 地址区分大小写吗？&lt;/h2&gt;
&lt;p&gt;根据规范 &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc5321#section-2.3.11&quot;&gt;RFC 5321: Simple Mail Transfer Protocol#section-2.3.11&lt;/a&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The standard mailbox naming convention is defined to be &quot;local-part@domain&quot;; contemporary usage permits a much broader set of applications than simple &quot;user names&quot;. Consequently, and due to a long history of problems when intermediate hosts have attempted to optimize transport by modifying them, the local-part MUST be interpreted and assigned semantics only by the host specified in the domain part of the address.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;而 domain 部分遵循 &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc1035&quot;&gt;RFC 1035: Domain names - implementation and specification#section3.1&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Name servers and resolvers must compare [domains] in a case-insensitive manner&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;综上所述：&lt;strong&gt;邮箱中的域名不区分大小写，而用户名（local-part）是否区分大小写，则取决于电子邮件服务商。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;HTML5 标签和属性名区分大小写吗？&lt;/h2&gt;
&lt;p&gt;根据规范 &lt;a href=&quot;https://html.spec.whatwg.org/multipage/syntax.html&quot;&gt;HTML Live Standard#section-13.1&lt;/a&gt;，&lt;strong&gt;HTML 标签和属性名不区分大小写&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Many strings in the HTML syntax (e.g. the names of elements and their attributes) are case-insensitive, but only for characters in the ranges U+0041 to U+005A (LATIN CAPITAL LETTER A to LATIN CAPITAL LETTER Z) and U+0061 to U+007A (LATIN SMALL LETTER A to LATIN SMALL LETTER Z). For convenience, in this section this is just referred to as &quot;case-insensitive&quot;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这意味着文档类型 &lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/code&gt; 写成 &lt;code&gt;&amp;lt;!doctype html&amp;gt;&lt;/code&gt; 也是可以的。&lt;/p&gt;
&lt;p&gt;需要注意的是，data attribute 是个例外，它必须要小写。&lt;a href=&quot;https://html.spec.whatwg.org/multipage/dom.html#custom-data-attribute&quot;&gt;HTML Live Standard#section3.2.6.6&lt;/a&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A custom data attribute is an attribute in no namespace whose name starts with the string &quot;&lt;code&gt;data-&lt;/code&gt;&quot;, has at least one character after the hyphen , is &lt;a href=&quot;https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible&quot;&gt;XML-compatible&lt;/a&gt;, and contains no &lt;a href=&quot;https://infra.spec.whatwg.org/#ascii-upper-alpha&quot;&gt;ASCII upper alphas&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Blink 有纠错逻辑，即便写了 &lt;code&gt;&amp;lt;div data-Name=&quot;airing&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;，最后也会被转成 &lt;code&gt;&amp;lt;div data-Name=&quot;airing&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;。但考虑到兼容性，这里的属性名还是需要小写 &lt;code&gt;data-name&lt;/code&gt; 的。&lt;/p&gt;
&lt;h2&gt;CSS 区分大小写吗？&lt;/h2&gt;
&lt;p&gt;根据 &lt;a href=&quot;http://www.w3.org/TR/css3-selectors/#casesens&quot;&gt;CSS Selectors Level 3&lt;/a&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;All Selectors syntax is case-insensitive within the ASCII range (i.e. [a-z] and [A-Z] are equivalent), except for parts that are not under the control of Selectors. The case sensitivity of document language element names, attribute names, and attribute values in selectors depends on the document language. For example, in HTML, element names are case-insensitive, but in XML, they are case-sensitive. Case sensitivity of namespace prefixes is defined in [CSS3NAMESPACE].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;CSS 的选择器语法不区分大小写，而属性名与属性值是否区分大小写，取决于所在的文档语言。&lt;/strong&gt; 如在 XHTML DOCTYPE 中它们区分大小写，但是在 HTML DOCTYPE 则不区分。&lt;/p&gt;
&lt;h2&gt;Git 文件名区分大小写吗？&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Git 默认不区分文件名大小写&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;因此，如果我们平常不注意文件的大小写，在实际使用中可能会遇到这样的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果团队中有人在 Linux 系统或者开启文件系统大小写敏感的 macOS 或 Window 上开发，他无视了已经存在的 &lt;code&gt;RankItem.tsx&lt;/code&gt; 文件，创建了新的 &lt;code&gt;rankItem.tsx&lt;/code&gt; 文件，并提交成功了；&lt;/li&gt;
&lt;li&gt;那么此时 Git 服务器上同时存在 &lt;code&gt;RankItem.tsx&lt;/code&gt;  与  &lt;code&gt;rankItem.tsx&lt;/code&gt;  文件，在 Windows 或 macOS (默认文件系统)上开发的人，则无法正常拉取到这两个文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里建议关闭 Git 的忽略大小写功能：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --global core.ignorecase false
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时在 Windows 或 macOS 上重命名大小写时，使用 &lt;code&gt;git mv&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git mv --force rankItem.jsx RankItem.jsx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果没有开启的话，这里举个例子，将 readme.md 改成 README.md，这个时候 &lt;code&gt;git status&lt;/code&gt; 无法检测到更变记录：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220723122534@2x.png&quot; alt=&quot;&quot; /&gt;如果用 &lt;code&gt;git mv&lt;/code&gt;，则是可以正常检测到的：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220723123320@2x.png&quot; alt=&quot;&quot; /&gt;因此在开发的时候，强烈推荐关闭 Git 大小写忽略的配置，并且使用 &lt;code&gt;git mv&lt;/code&gt; 进行重命名操作。若条件允许的话，亦可以修改 macOS 或 Windows 默认的文件系统，将卷宗的文件系统改成大小写敏感。&lt;/p&gt;
&lt;p&gt;以上便是前端开发中的一些大小写敏感问题，总结一下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP Header 的 key 不区分大小写，但是绝大多数框架会将响应头的 key 改成小写。[RFC 7230]&lt;/li&gt;
&lt;li&gt;HTTP2 则因为头部压缩，要求必须小写，浏览器会将其改成小写。[RFC 7540]&lt;/li&gt;
&lt;li&gt;HTTP Method 区分大小写，且必须为大写。[RFC 7230]&lt;/li&gt;
&lt;li&gt;URL 的 protocol 和 host 不区分大小写，浏览器会自动改成小写。[RFC 7230]&lt;/li&gt;
&lt;li&gt;URL 的 path 按规范而言是区分大小写的，但实际是否区分大小写取决于 Web Server 的文件系统和服务端配置。[RFC 7230]&lt;/li&gt;
&lt;li&gt;URL 的 query 与 fragment 是区分大小写的。[RFC 7230]&lt;/li&gt;
&lt;li&gt;Cookie 的 key 是区分大小写的，虽然规范并没有明说这点。 [RFC  6265]&lt;/li&gt;
&lt;li&gt;E-Mail 的域名部分是不区分大小写的  [RFC 1035]&lt;/li&gt;
&lt;li&gt;E-Mail 的用户名部分是否区分大小写，取决于邮件服务商。 [RFC  5321]&lt;/li&gt;
&lt;li&gt;HTML5 的标签名和一般的属性 key 是不区分大小写的。[HTML Live Standard 13.1]&lt;/li&gt;
&lt;li&gt;HTML5 的 data- 属性是区分大小写的。[HTML Live Standard 3.2.6.6]&lt;/li&gt;
&lt;li&gt;CSS 的选择器语法不区分大小写，而属性名与属性值是否区分大小写，取决于所在的文档语言。[CSS Selectors Level 3]&lt;/li&gt;
&lt;li&gt;Git 默认是忽略文件大小写的。&lt;/li&gt;
&lt;li&gt;Windows 使用的 NTFS 和 FAT 系列文件系统，默认大小写不敏感，但大小写保留。&lt;/li&gt;
&lt;li&gt;macOS 使用的 APFS 和 HFS+ 文件系统，默认大小写不敏感，但大小写保留。&lt;/li&gt;
&lt;li&gt;Linux 使用的 ext3/ext4 文件系统，默认大小写敏感。&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=case-sensitivity&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>周刊（第12期）：前端三大浪漫</title><link>https://ursb.me/posts/weekly-12/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-12/</guid><description>第12期周刊聊了前端开发圈戏称的三大浪漫——富文本编辑器、在线Excel、CRDT，并探讨了QWERTY键盘布局、高铁座位号缺失D等生活中常见的路径依赖现象。</description><pubDate>Sun, 24 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前端开发中的大小写敏感问题&lt;/h2&gt;
&lt;p&gt;由于前段时间被催更了技术文，于是这周末写了一篇技术文章 &lt;a href=&quot;https://me.ursb.me/archives/case-sensitivity.html&quot;&gt;前端开发中的大小写敏感问题 - Airing 的小屋&lt;/a&gt;，因此本期周刊主体部分便不再撰写。&lt;/p&gt;
&lt;p&gt;有兴趣的同学可以直接阅读原文： &lt;a href=&quot;https://me.ursb.me/archives/case-sensitivity.html&quot;&gt;前端开发中的大小写敏感问题 - Airing 的小屋&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;每周推荐&lt;/h2&gt;
&lt;h3&gt;前端三大浪漫&lt;/h3&gt;
&lt;p&gt;看到一篇文章介绍了 &lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=MzI1NDU3NzM5Mg==&amp;amp;mid=2247490079&amp;amp;idx=1&amp;amp;sn=f57f3de3ac593023f351fe7d52250216&amp;amp;chk&quot;&gt;脉脉上的 &quot;前端三大浪漫&quot; 是个啥？&lt;/a&gt;，三大浪漫分别是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;富文本编辑器&lt;/li&gt;
&lt;li&gt;在线 excel&lt;/li&gt;
&lt;li&gt;CRDT - 无冲突复制数据类型&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;路径依赖&lt;/h3&gt;
&lt;p&gt;朋友上周给我推荐了这篇文章，写的蛮好的：&lt;a href=&quot;http://mp.weixin.qq.com/s?__biz=MzA3MzQ1MzQzNA==&amp;amp;mid=2656986367&amp;amp;idx=1&amp;amp;sn=537b461106fa3a53643b58e9cb7696fd&quot;&gt;我们当下的媒介使用习惯，是否在很久以前就养成了？&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;生活中有一些路径依赖的案例：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;QWERTY 键盘：明明效率并不是最高的，但是沿用至今。&lt;/li&gt;
&lt;li&gt;高铁座位号是 ABC-EF：缺少了 D，因为路径依赖 AF 表示靠窗。&lt;/li&gt;
&lt;li&gt;一首歌的时长通常在 5 分钟以内：因为早期黑胶唱片的容量限制必须控制在5分钟之内。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;至于路径依赖的作用，文章说道：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;过去经验、传统惯习或集体记忆，可以理解为&lt;strong&gt;社会的保持器&lt;/strong&gt;，帮助社会成员产生&lt;strong&gt;群体归属感&lt;/strong&gt;，具有确立身份认同或社会认同的重要功能。从时空角度来看，它们会为社会成员提供整体想象和历史意识，具有共享文化意义、传承文化传统的功能。这已经超越了路径依赖的范畴，而关乎&lt;strong&gt;一个社会如何记忆它自己&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这篇文章还从个体与社会两个层面去分析了路径依赖产生的原因，值得细细研读一下。后续的周刊可能还会再深入谈一谈「路径依赖」这个话题。&lt;/p&gt;
&lt;h2&gt;本周记录&lt;/h2&gt;
&lt;h3&gt;Recent Viewings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在读：科幻 |《记忆旅行者》&lt;/li&gt;
&lt;li&gt;在看：动漫 |《夏日重现》&lt;/li&gt;
&lt;li&gt;在看：漫画 |《间谍过家家》&lt;/li&gt;
&lt;li&gt;看过：电影 |《爱在黎明破晓前》| ★★★★★&lt;/li&gt;
&lt;li&gt;看过：电影 |《我是谁：没有绝对安全的系统》| ★★★★☆&lt;/li&gt;
&lt;li&gt;玩过：手游 |《英雄联盟-电竞经理》&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Recent Code&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TypeScript React  17 hrs 45 mins █████████▎░░░░░░░░░░░  44.3%
TypeScript        15 hrs 7 mins  ███████▉░░░░░░░░░░░░░  37.7%
JSON              1 hr 34 mins   ▊░░░░░░░░░░░░░░░░░░░░   3.9%
C++               1 hr 32 mins   ▊░░░░░░░░░░░░░░░░░░░░   3.8%
JavaScript        1 hr 18 mins   ▋░░░░░░░░░░░░░░░░░░░░   3.3%
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-12&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>周刊（第11期）：筮法是如何进行的</title><link>https://ursb.me/posts/weekly-11/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-11/</guid><description>第11期周刊详解《周易》筮法的具体操作步骤与原理，并推荐了文件关联工具Hook、表情混合网站Emojimix，附带一周观影观赛与编程时长统计记录。</description><pubDate>Sun, 17 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;筮法是如何进行的？&lt;/h2&gt;
&lt;p&gt;前几天看到一个视频  &lt;a href=&quot;https://www.bilibili.com/video/BV1yY4y1G7SU&quot;&gt;《周易》是咋拿来“算卦”的&lt;/a&gt; ，发现这个算卦的流程挺有意思的（啊，中哲专业的血脉突然又开始躁动了），学习了下做个笔记。&lt;/p&gt;
&lt;p&gt;古时算卦叫“卜筮”，“卜”是利用龟壳上的裂纹来算卦，但是太过久远具体如何去算现在已无考证；“筮”则是利用蓍草（蒿）进行随机组合进行测算。具体流程如《周易·系辞上传》所言：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;大衍之数五十，其用四十有九。分而为二以象两，挂一以象三， 揲之以四以象四时，归奇于扐以象闰，五岁再闰，故再扐而后挂。 天一地二，天三地四，天五地六，天七地八，天九地十。天数五，地数五，五位相得而各有合。天数二十有五，地数三十，凡天地之数五十有五。此所以成变化而行鬼神也。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;准备阶段：“大衍之数五十，其用四十有九。”&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“大衍之数五十”：先拿 50 根蓍草，表示先天无极的大衍之数。&lt;/li&gt;
&lt;li&gt;“其用四十有九”：随机拿出一根，剩下 49 根，拿出的那一根表示后天之“损”。阴阳运行的太极要在不平衡的奇数里进行运算。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;测算阶段：“分而为二以象两，挂一以象三， 揲之以四以象四时，归奇于扐以象闰。”&lt;/p&gt;
&lt;p&gt;“分二”、“挂一”、“揲四”、“归奇”表示“四营”，即要做四个步骤进行测算：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分二：就是把 49 根蓍草随机分成两组，两组分别象征“天”、“地”。即“分而为二以象两”。&lt;/li&gt;
&lt;li&gt;挂一：随机从“天”或“地”这两组里拿出一根，这叫“挂一”，拿出的那一根就是“人”。所以原文“挂一以象三”中的三代表“天地人”。这个时候就只剩下 48 根了。&lt;/li&gt;
&lt;li&gt;揲四：之后把“天”这一组按照 4 个为一小组进行清点，多余不满 4 个被排除在外；“地”这一组也是一样的。那么这个时候剩下的蓍草一共有 50-(1+1+(天 mod 4)+(地 mod 4)) 根。这里的四就象征着四时。&lt;/li&gt;
&lt;li&gt;归奇：把剩下的蓍草整理一下，重新进行“四营”循环。这样的循环总共要进行三遍，所谓“四营三变”。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;三次之后，数一数最后还剩多少根蓍草。其实通过这样的步骤算下来之后，剩下的蓍草只有 4 种可能性：36、32、28、24（概率分别是 3/16，7/16，5/16，1/16）。如果把它们除以 4，就会得到 9、8、7、6 四个可能。那么 9、8、7、6 就是这次算卦算出的结果，即四象。&lt;/p&gt;
&lt;p&gt;根据“奇为阳，偶为阴”：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;9：太阳，最大的阳&lt;/li&gt;
&lt;li&gt;7：少阳，较小的阳&lt;/li&gt;
&lt;li&gt;8：少阴，较小的阴&lt;/li&gt;
&lt;li&gt;6：太阴，最大的阴&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们再把这次的结果转成的爻：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;阳爻：—，9,7 可转阳爻&lt;/li&gt;
&lt;li&gt;阴爻：- -，6,8 可转阴爻&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以发现得到阴爻（(1+7)/16）和阳爻（(3+5)/16）的概率都是 1/2。&lt;/p&gt;
&lt;p&gt;每三个阴阳爻排列组合就能得出一个八卦中的基本挂，所以要上述的筮法要再额外进行两次，才能得出剩下的两个爻组成一个基本挂。&lt;/p&gt;
&lt;p&gt;假设三轮的结果是“7,8,7”，那么卦象是 “阳阴阳”，“离卦”。但是 6 和 9 属于特殊情况，所谓“物极必反”，那么它就会“变卦”，比如 666 的太阳爻“坤卦”反而会变成 999 的太阴挂“乾卦”（当然，还有一种说法是“阳极化少阴，阴极化少阳”，待后续考证）；7、8 则不会变卦，符合当前状态。&lt;/p&gt;
&lt;p&gt;得到八卦之后，还要去计算全卦。所谓全卦是两个八卦的上下组合，即 8x8=64 可能。即一共要有 6 个爻组成，要筮法 6 轮。&lt;/p&gt;
&lt;p&gt;假设结果是 978976，那么得到就是下巽上巽的“巽卦”；那么 96 变卦之后得到是“节卦”，那么我们称这次的结果就是“本卦巽，变卦节”。之后拿出《周易》去查解释就行了。&lt;/p&gt;
&lt;h2&gt;每周推荐&lt;/h2&gt;
&lt;h3&gt;Hook: 关联任意两个文件&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://hookproductivity.com/&quot;&gt;Hook – Links beat searching&lt;/a&gt; 是MacOS 上的一款付费 App，支持关联两个文件，原理是关联对应文件类型的 open scheme，这也就是 Hook 的含义。&lt;/p&gt;
&lt;p&gt;我的主要使用场景有以下两个：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;关联：需求笔记+需求单+设计稿+技术方案&lt;/li&gt;
&lt;li&gt;关联：代码+代码笔记+技术方案&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当我打开其中任意一个文件，都可以按住 &quot;Ctrl+H&quot; 查看至于关联的文件/链接。&lt;/p&gt;
&lt;p&gt;当然，这个软件还有一部分很大的场景是关联 GTD 的任务项与相关文件（可惜我正在用的滴答清单不支持 scheme）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022071701.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Emojimix&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://tikolu.net/emojimix/&quot;&gt;emojimix&lt;/a&gt; 是一个网页应用，可以混合两个 Emoji 得到一个新的 Emoji，贼有意思。&lt;/p&gt;
&lt;p&gt;举两个栗子：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/emojimix.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;本周记录&lt;/h2&gt;
&lt;h3&gt;Recent Viewings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在看：动漫 |《宝可梦旅途》&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;读完：小说 |《沉默的巡游》| ★★★☆☆&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;看过：比赛 | IEM - Navi vs AST | ★★★★★&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;看过：动漫 |《间谍过家家》| ★★★★★&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;看过：电影 |《土拨鼠之日》| ★★★★★&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;看过：电影 |《最佳出价》| ★★★★★&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;看过：电影 |《误杀瞒天记》| ★★★★★&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;看过：电影 |《花束般的恋爱》（二刷）| ★★★★★&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;《宝可梦旅途》：傻东西 100% 胜率的千万伏特居然用在了八强赛的第一场，那么大胆猜测决赛是丹喷 vs mega 路卡利欧，小智今年又没法夺冠了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;《沉默的巡游》：设定不错，但是剧情转折却没有那么自然流畅，有点强行为了反转而反转的感觉。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;昨晚 Navi 的比赛看的是热血沸腾，现场的气氛也是非常活跃。Navi：“3 分保平，4 分保赢。”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;《间谍过家家》：完结了，据说第二季要等到 10 月了，可惜邦德第一季居然还没有登场。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;《土拨鼠之日》：直到现在才看，原本以为是恐怖片，没想到是 HE 的喜剧。人生确实就是平凡的日子一遍又一遍的重复，如果说楚门是困在了空间里打破束缚，那么菲尔就是被困在了时间里打破日常。每天改变自己一点，让自己更好一点，去爱去生活。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;《最佳出价》：看完之后给我的震撼实在是太大了，不愧是意大利的悬疑片，强烈安利。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Recent Code&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TypeScript 28 hrs 49 mins ██████████████████▏░░  86.6%
JSON       1 hr 41 mins   █░░░░░░░░░░░░░░░░░░░░   5.1%
JavaScript 58 mins        ▌░░░░░░░░░░░░░░░░░░░░   2.9%
HTML       43 mins        ▍░░░░░░░░░░░░░░░░░░░░   2.2%
YAML       26 mins        ▎░░░░░░░░░░░░░░░░░░░░   1.3%
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PS. 这周不知道是不是 WakaTime 出 Bug 了，TypeScript React 居然没统计到…&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-11&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>周刊（第10期）：那些我喜欢的游戏（第1辑）</title><link>https://ursb.me/posts/weekly-10/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-10/</guid><description>第10期周刊分享作者喜爱的游戏，包括《传说之下》《去月球》《饥荒》《暗黑地牢》《史丹利的寓言》《塞尔达传说：旷野之息》《空洞骑士》等，逐一点评推荐理由。</description><pubDate>Sun, 10 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;周刊居然坚持了两个月，一期不落按时按量写到了第 10 期，为自己鼓个掌~&lt;/p&gt;
&lt;p&gt;我梳理了一份数据表，把我推荐过的产品、游戏、文章都放进去了，并且之后会不断更新：&lt;a href=&quot;https://oh-oh-bear.feishu.cn/base/bascndYl8ECUu9T3RczKwHiAYCg&quot;&gt;Airing - Best Product&lt;/a&gt;；此外我也弄了份&lt;a href=&quot;https://oh-oh-bear.feishu.cn/share/base/shrcn6QeZoXbI7bffuCXt2nf4be&quot;&gt;收集表&lt;/a&gt;，如果你有想推荐的产品，欢迎填写表格，我会再分享给大家。毕竟，好东西就是要分享的嘛！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022071001.png&quot; alt=&quot;&quot; /&gt;你也可以扫码填写表格：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022071002.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;那些我喜欢的游戏（第1辑）&lt;/h2&gt;
&lt;p&gt;以下排名没有先后。&lt;/p&gt;
&lt;h3&gt;1. Undertale&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/15447541862261/15447573419246.jpg&quot; alt=&quot;&quot; /&gt;&amp;gt; 你拒绝伤害任何人。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;就算你选择逃跑，
你的脸上也带着微笑。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;中文名：传说之下&lt;/li&gt;
&lt;li&gt;平台：Steam / Nintendo Switch&lt;/li&gt;
&lt;li&gt;时长：6 小时（一周目）&lt;/li&gt;
&lt;li&gt;类型：像素风，RPG，剧情，音乐&lt;/li&gt;
&lt;li&gt;主题：温情（or 邪恶？）/ 感人&lt;/li&gt;
&lt;li&gt;获奖：无数&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;剧情简介：&lt;/p&gt;
&lt;p&gt;很久以前，地球由两个种族均等统治着，分别为人类和怪物 。一日，战鼓击碎了双方之间的和平；在人类近似屠杀式的侵略下，人类大获全胜。人类将怪物驱逐到地下世界，并由七位术士设下了相当强力的魔法结界，将怪物困在地下世界。人们可以在伊波特山进入下界，而须至少需要人类与怪物的灵魂各一个才可离开下界。在故事开始前，没有一个人类活着离开下界过，使伊波特山有登山者有去无回的传闻。&lt;/p&gt;
&lt;p&gt;怪物被困在地下世界中，由 Asgore Dreemurr 统治。怪物死亡后躯体会立即化为灰烬，不留下灵魂或尸体。怪物的灵魂远没有人类强大。&lt;/p&gt;
&lt;p&gt;这个游戏我写过评测，它还是我在知乎的第一个回答。为了不剧透大家一脸，我就不贴评测链接啦。这是一个很感人的故事，音乐也太太太太出色了，**全程玩下来，感觉自己并不是在玩游戏，而是走过了一个善良、温暖的人生。**4年后再忆起，仍能想起他们的音容笑貌，以及那段和他们一起经历的冒险。&lt;/p&gt;
&lt;p&gt;这是一个当之无愧的满分游戏。&lt;/p&gt;
&lt;p&gt;PS. 有些战斗比较难，对手残党不太友好，但是我还是不建议大家一周目的时候看攻略。Switch 版有些贵，而且没有中文，建议购买 Steam 版。&lt;/p&gt;
&lt;h3&gt;2. To the moon&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/15447541862261/15447584173797.jpg&quot; alt=&quot;&quot; /&gt;&amp;gt; 如果你忘记了，或是走丢了呢？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;那么我们总会在月亮上相遇的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;中文名：去月球&lt;/li&gt;
&lt;li&gt;平台：Steam / iOS / Android&lt;/li&gt;
&lt;li&gt;时长：3 小时&lt;/li&gt;
&lt;li&gt;类型：像素风，剧情，音乐，独立作品&lt;/li&gt;
&lt;li&gt;主题：爱情，记忆，人生&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;剧情简介：&lt;/p&gt;
&lt;p&gt;在《去月球》的世界里，存在着借由改变记忆为弥留之际的人们完成愿望的服务。由于这种人工记忆是永久的，在病人醒来的时候会与病人的真实记忆产生冲突，也因此这种技术只能对临死的人实施。&lt;/p&gt;
&lt;p&gt;故事开始于提供这项服务的西格蒙德公司的两位职员伊娃·罗莎莉恩博士与尼尔·沃茨博士准备为垂死的约翰尼·威尔士实现一生的梦想：登陆月球，虽然约翰尼并不知道自己想前往月球的理由。两位博士为了完成这项任务进入约翰尼的记忆中，借由一个个约翰尼生命中的重要物品回朔时间。他们随着见证了约翰尼记忆中的一些重要时刻，渐渐地了解成就约翰尼当前惨状的缘由。在两位博士终于到达约翰尼的童年的之际，他们试图为约翰尼注入去月球的愿望，让约翰尼的内心制造基于这个愿望的新的人生与记忆，以求约翰尼死时没有任何遗憾。&lt;/p&gt;
&lt;p&gt;然而，并非一切都照计划进行，两位医生发现约翰尼的愿望、过去和他已故的妻子莉娃都藏着巨大的玄机。随着时间的一分一秒的流失，罗莎莉恩博士和瓦茨博士必须在约翰尼辞世前解开他过去的秘密，并不惜一切代价将他送往月球。&lt;/p&gt;
&lt;p&gt;《去月球》也是一个很感人的故事，值得称道的是，音乐、剧情、编程、美术，全都是作者一个人完成的！音乐超级好听，很多歌我都单独下载下来听了。剧情也是一级棒，完全是一个可以拍成电影的剧情。据说会出第二部，但是并不期待，因为这一部的结局，已经足够完美了。&lt;/p&gt;
&lt;p&gt;**这是一个游戏，一个好故事，一段纯粹的爱情。**如果人生可以重来，我依然会选择爱上你。我相信，这一切都将教会你，“爱”的意义。&lt;/p&gt;
&lt;p&gt;PS. 这个游戏的收集环节个人认为设计的不够好，如果真的找不到东西的话还是看看攻略吧，不能让收集环节打乱自己看故事的节奏~&lt;/p&gt;
&lt;h3&gt;3. Don&apos;t Starve (Together)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/15447541862261/15447588484452.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中文名：饥荒 &amp;amp; 饥荒联机版&lt;/li&gt;
&lt;li&gt;平台： Steam / WeGame / iOS&lt;/li&gt;
&lt;li&gt;时长：∞&lt;/li&gt;
&lt;li&gt;类型：RPG，合作，生存&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;剧情简介：&lt;/p&gt;
&lt;p&gt;《饥荒》的故事讲述的是关于一名科学家威尔逊被恶魔传送到了异世界荒野。他必需用本人的聪慧在残酷的野外环境中求生。在《饥荒》里，玩家必须利用异世界中的自然资源让自己存活下去，并且抵御各种异世界生物的威胁。&lt;/p&gt;
&lt;p&gt;游戏很好玩，可玩性很高，尤其是联机版，以前和朋友一起玩。我觉得这个游戏还是大家一起玩会比较欢乐，如果只是玩单机版，会更偏向于生存，所以，也会有些孤独。&lt;/p&gt;
&lt;p&gt;PS. 新手还是先看一下攻略，不然会尝试到各种死法，游戏体验不好…&lt;/p&gt;
&lt;h3&gt;4. Darkest Dungeon&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/15447541862261/15447592653514.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中文名：暗黑地牢&lt;/li&gt;
&lt;li&gt;平台：Steam / Nintendo Switch / iOS&lt;/li&gt;
&lt;li&gt;类型：RPG，生存，策略，回合制，克苏鲁题材，Roguelike&lt;/li&gt;
&lt;li&gt;时长：∞&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;剧情简介：&lt;/p&gt;
&lt;p&gt;《暗黑地牢》 是一款 Roguelike 风格的永久死亡玩法的回合制 RPG 游戏。游戏中，一位贵族领主在挖地时不幸挖出一个不断吐出怪物的传送门，引发了一连串惨剧，而作为领主的远亲，恢复家族领土与名誉的担子就这么落到玩家身上，为此，必须招募各色英雄，组成冒险小队，对潜藏着恐怖怪兽的地下城进行扫荡。&lt;/p&gt;
&lt;p&gt;有很多职业可供选择，而且随机事件也特别真实有意思，普通难度就已经很大了，但是这个游戏正因为有难度所以才好玩~&lt;/p&gt;
&lt;p&gt;游戏中，玩家要招募大量千奇百怪的英雄，管理他们的怪癖和能力，然后搭配组团，扫荡各种充满恐怖怪物的地下城。之所以“与众不同”，是因为它刻意地不将设计重心放在英雄的成长、升级上，玩家要面对的，是英雄们沾染到的疾病怪癖，还有最重要的，那个随时会让他们发疯甚至致死的压力系统。简单来说，在这个游戏中，首当其冲的敌人不是那些面目狰狞的怪物，而是每位角色自己的心魔。&lt;/p&gt;
&lt;p&gt;PS. 后期的游戏体验不是特别好，iOS 版本看评论据说很多 BUG。虽然 Switch 版本比 Steam 贵上许多，但是这类游戏，肯定要在掌机上玩才有意思呀~&lt;/p&gt;
&lt;h3&gt;5. Lost Castle&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/15447541862261/15447596747350.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中文名：失落地堡&lt;/li&gt;
&lt;li&gt;平台：Steam&lt;/li&gt;
&lt;li&gt;类型：动作冒险，横版，Roguelike，RPG&lt;/li&gt;
&lt;li&gt;时长：1~2 小时（单局）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;剧情简介：不重要&lt;/p&gt;
&lt;p&gt;这个游戏也是要和好友联机才有意思，以前和朋友经常玩，而且不会沉迷，毕竟一局才一小时~ 虽说是地下城游戏，但莫名觉得画风有点可爱… 据说这个游戏是华南理工大学的一个宿舍的在校学生做出来的，真的超级棒！&lt;/p&gt;
&lt;h3&gt;6. The Stanley Parable&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/15447541862261/15447598661804.jpg&quot; alt=&quot;&quot; /&gt;&amp;gt; 做了选择，就选择了自由。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中文名：史丹利的寓言&lt;/li&gt;
&lt;li&gt;平台：Steam&lt;/li&gt;
&lt;li&gt;类型：第一人称，剧情，多结局，冒险&lt;/li&gt;
&lt;li&gt;主题：哲学，人生，自由&lt;/li&gt;
&lt;li&gt;获奖：很多&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;剧情简介：&lt;/p&gt;
&lt;p&gt;通过对旁白的分析，主角活在一个虚拟的网络中，思维被控制，现实生活里每天过着重复的生活，公司家里，2点一线，思维却一直在系统中。&lt;/p&gt;
&lt;p&gt;旁白操纵着这一切，也许是为了科学实验，或者其他不可告人的目的，或许仅仅是个游戏。&lt;/p&gt;
&lt;p&gt;本游戏没有任何难度，纯粹的故事，但一共有22个结局。这个游戏又不只是游戏，它的意义已经超出了它的本身。漂亮的逻辑和引导，当你觉得旁白在和“你”沟通的时候，你已经融入了角色，旁白打破了这第四面墙，或者说你的身上已经被发掘出了“史丹利”的实质。&lt;/p&gt;
&lt;p&gt;这个游戏没有胜利结局，就像人的一生，总想摆脱命运的束缚，却终有一死。我们从一生下来开始就在不断逃避所谓的事实，但到了最后往往又回到了原点。&lt;strong&gt;游戏所有的结局都是正确的、自由的，因为这是我们自己的选择&lt;/strong&gt;，就像游戏里旁白说的“做了选择，就选择了自由。”无论你是在开始的时候反锁房门草草结束自己的“一生”，还是在旁白的诱惑下连玩四小时的无聊婴儿游戏，这都是你的选择。&lt;strong&gt;当“你”离开房间的那一刻，你就开始了你的“一生”。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;除了这些，游戏中值得我们思考的部分还有很多，这里就不剧透了，希望感兴趣的同学可以静心玩一玩这款不一般的“游戏”。&lt;/p&gt;
&lt;h3&gt;7. 塞尔达传说: 旷野之息&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/15447541862261/15453169453547.jpg-yasuo.jpg&quot; alt=&quot;&quot; /&gt;&amp;gt; 自由之于人类，正如任天堂之于游戏。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;英文名：The Legend of Zelda: Breath of the Wild&lt;/li&gt;
&lt;li&gt;平台：Nintendo Switch&lt;/li&gt;
&lt;li&gt;类型：开放世界，动作冒险&lt;/li&gt;
&lt;li&gt;时长：200 小时（不含 DLC）&lt;/li&gt;
&lt;li&gt;获奖：无数，IGN、GameSpot、Polygon全部10分满分，109家媒体 MC 平均分达97分，位列历史第三。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;剧情简介：&lt;/p&gt;
&lt;p&gt;曾经一场大灾难袭击了海拉尔王国使之灭亡，海拉尔王国灭亡的100年后，林克在地下遗迹苏醒，追寻着不可思议的声音，开始了新的冒险之旅。&lt;/p&gt;
&lt;p&gt;这部必须吹爆，这毋庸置疑是 NS 上最好的一款游戏，没有之一，甚至个人以为，这也是最好玩的一款开放世界游戏。游戏非常自由、真实，风景很美，可玩性 max，内容非常丰富，交互性和细节用心到令人发指的地步，操作友好，新手也很容易上手。游戏不间断地带来的惊喜会让你更加有欲望去探索这个神奇的世界！&lt;/p&gt;
&lt;p&gt;总之，自由、随意和探索才是《荒野之息》最为核心的理念和乐趣。在这款游戏里，你很少能发现一件自己想做却做不到的事情。&lt;/p&gt;
&lt;h3&gt;8. Hollow Knight&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/15447541862261/v2-64560284aca2854743af5dd5cb634376_hd.jpg-yasuo.jpg&quot; alt=&quot;&quot; /&gt;&amp;gt; 空洞骑士天下第一！（塞尔达是天）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中文名：空洞骑士&lt;/li&gt;
&lt;li&gt;平台：Nintendo Switch / Steam&lt;/li&gt;
&lt;li&gt;类型：动画风格，类银河恶魔城，动作游戏&lt;/li&gt;
&lt;li&gt;时长：80 小时（不含 DLC）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;剧情简介：&lt;/p&gt;
&lt;p&gt;本作讲述的是一个名为德特茅斯的衰落小镇下掩埋着一个古老的废弃王国。许多人被这个王国所吸引，开启冒险之旅，寻找财富、荣耀、或古老秘密的答案。&lt;/p&gt;
&lt;p&gt;这是一个由三个人开发的独立游戏，以昆虫为主体，构建了一个完成度令人难以置信的庞大世界，完成度可谓之极高，非常良心非常细心的一个作品，玩上手之后会发现作者真的很用心去做了这款产品，然后会产生疑惑，为什么其他游戏没有这么好的质量呢？游戏中每个场景的层次感和复杂程度都达到了令人惊叹的地步，画风很清新，剧情不错，设定新颖，音乐也超级棒，很多细节和彩蛋，最重要的是价格很良心，仅仅一次付费购买之后后续 dlc 全部免费，且 ns 版就￥30左右，而同等质量的游戏却要￥300多，可谓是一股清流，甚至 Steam 上很多评论要求开发者涨价…&lt;/p&gt;
&lt;p&gt;游戏中的每个 NPC 都很“真实”，上一个带给我这种感觉的还是 undertale。一个是老鹿角虫，即使老也愿意继续工作，直到最后的时光； 一个是奎诺 留下剑在湖边人不见了，如果陪伴他会有一个最后的时光的成就；还有钉子匠，打造最高级的武器之后会有一个委托，他想体验自己打造的武器有多锋利，请你动手……&lt;/p&gt;
&lt;p&gt;另外，这个游戏所带来的成就感是其他游戏无法比拟的，它不像塞尔达、奥德赛等传统游戏去“讨好”玩家，特意降低游戏难度；也不像奇怪的大冒险那样去“戏弄”玩家、“折磨”玩家。网上评价普遍说这个游戏劝退了很多手残玩家，但个人觉得其实还好，努力一下肯定能过，难一点的 boss 打个 10 遍肯定能过，一般的 2-3 遍即可。打过 boss 之后，玩家会得到无法比拟的成就感，而且技术得到了明显的提升，这或许就是游戏吧。&lt;/p&gt;
&lt;p&gt;注：NS 版用手柄玩后期不是很友好，剑技蓄力之前必然会触发攻击影响流畅度，同时准备剑技之时不方便跳跃，这就导致了竞技场第二个 boss 空战会很难打，其他情况下没有影响。&lt;/p&gt;
&lt;h2&gt;本周记录&lt;/h2&gt;
&lt;h3&gt;Recent Viewings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;看过：电影 |《心灵捕手》| ★★★★★&lt;/li&gt;
&lt;li&gt;在读：小说 |《沉默的巡游》&lt;/li&gt;
&lt;li&gt;在看：动漫 |《夏日重现》&lt;/li&gt;
&lt;li&gt;在看：动漫 |《间谍过家家》&lt;/li&gt;
&lt;li&gt;玩过：Switch ｜《宝可梦 · 盾》&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;《心灵捕手》值得后续单独写篇文章谈谈。&lt;/p&gt;
&lt;h3&gt;Recent Code&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TypeScript React  35 hrs 27 mins ██████████████▏░░░░░░  67.7%
TypeScript        14 hrs 46 mins █████▉░░░░░░░░░░░░░░░  28.2%
YAML              41 mins        ▎░░░░░░░░░░░░░░░░░░░░   1.3%
Bash              21 mins        ▏░░░░░░░░░░░░░░░░░░░░   0.7%
JSON              20 mins        ▏░░░░░░░░░░░░░░░░░░░░   0.7%
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-10&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>周刊（第9期）：高效率到高消耗的现象与反思</title><link>https://ursb.me/posts/weekly-9/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-9/</guid><description>反思移动互联网时代从追求高效到陷入高消耗的现象，剖析效率成瘾与自我阉割式生活的根源，主张慢下来感受生活，并推荐《2022 大社交趋势观察报告》与白板应用 Muse 2.0。</description><pubDate>Sun, 03 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;高效率到高消耗的现象与反思&lt;/h2&gt;
&lt;h3&gt;现象：信息汲取的高效率到高消耗&lt;/h3&gt;
&lt;p&gt;之前在 &lt;a href=&quot;https://www.tisi.org/&quot;&gt;腾讯研究院&lt;/a&gt; 看到了一篇文章 &lt;a href=&quot;https://www.tisi.org/23404&quot;&gt;《互联网为什么让我们越来越不开心？》&lt;/a&gt;，文中提到了一个观点——移动互联网从高效率逐渐走向了高消耗。“上网”这件事本身，变得焦虑了。&lt;/p&gt;
&lt;p&gt;今天，互联网成为我们的精神居所，成为我们与世界连接的媒介，我们处在一个“连接社会”，“人”与“物”之间的关系、乃至是人与人之间的“关系”，都被“连接”所取代。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;每一个具体的、有丰富面向的人，沦为了抽象而单薄的数据收发节点，被视为透明得没有情感的流量。——《2022 大社交趋势观察报告》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;回想一下，我们放下手机或关闭电脑的时候，心情是否都是满足、平静、愉悦的？我们上网的本初目的是为了获取信息、学习新知识，因此我们追求高效率的学习方法、想方设法屏蔽垃圾信息的干扰、寻找一个又一个高效的工具。&lt;/p&gt;
&lt;p&gt;一面是试图去高效组织信息，但另一面却是让人不能沉下心，沉迷于“高效”的漩涡无法抽离。&lt;/p&gt;
&lt;p&gt;我们总是想要“快”一点，追求把事情高效地做完——吃饭快一点、走路快一点、生活节奏再快一点，被时间推着走，越来越快。在这个时候，会发现“高效”本身成了一件高心理消耗的事情。&lt;/p&gt;
&lt;p&gt;那为什么我们要越来越快？为什么追求高效变成了一场消耗？&lt;/p&gt;
&lt;h3&gt;原因：追求效率途中的自我阉割&lt;/h3&gt;
&lt;p&gt;在 &lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=MzUxMzk0MjU2Ng==&amp;amp;mid=2247488149&amp;amp;idx=1&amp;amp;sn=7c819c115cfb91b22344d9714a5e6253&quot;&gt;《人生不是一场马拉松》&lt;/a&gt; 一文中提到了“自我阉割”的概念：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;现代人的人生赛道就只有一条，就是财富的成功，所有人都患有成功焦虑症，中国人把人生简化成了一件事，就是寻找一种传说中的圣杯，名曰“财务自由”，一旦找到了这种圣物，就意味着人生通关了。在没有获得财富的成功之前，他们认定自己不配拥有婚姻和孩子。就像玩一场游戏，通关之后才会得到奖励，既然没有通关，那自然不配得到奖励，于是他们选择了自我阉割。——《人生不是一场马拉松》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;追求效率的更深层次的原因是我们对于财富的追求。当然，每个人的目标其实并不一样，这个“财富”不仅仅是钱，也可以是被认可的感觉。&lt;/p&gt;
&lt;p&gt;在茫茫大海中，我们不断地为这场人生的航行锚定航标。这种锚定是我们给自身设定的「航行规则」，我们通过这套规则抵达航标，去寻求那所谓的 「意义感」。&lt;/p&gt;
&lt;p&gt;而我们希望尽可能快地去抵达航标，因此在抵达之前，只顾埋头向前，盲目追求高效，只希望让发动机尽可能变得再快更快。&lt;/p&gt;
&lt;p&gt;而不断地，在这快节奏的生活中，丢掉了眼前的风景。快得来不及感受，快得来不及思考，快得来不及珍惜。&lt;/p&gt;
&lt;p&gt;没有能量的输入，效率变成了消耗。&lt;/p&gt;
&lt;h3&gt;反思：人需要的不只是高效率&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;首先，效率背后的不是工具，而是人。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;要时刻记得，追求效率的本质是想更好地做一件事情，而不是一天换一个 GTD 软件，却总是说忘记做事情；用着最贵的笔记软件，却总是拖延懒惰几天不写一个字。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sspai.com/post/71518&quot;&gt;《我是如何艰难地克服「效率成瘾」的？》&lt;/a&gt; 一文中将这种现象，称之为“效率成瘾”，并提供了五种解决方案。更详细的读者可以自己去阅读原文，这里只介绍其中我感受比较深刻的几个点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;破除工具的执念：能够区分玩具属性和工具属性，该用的时候就好好用，发挥工具的机制。&lt;/li&gt;
&lt;li&gt;回顾工具对自己的价值：尽可能多的去使用工具，并利用它们做好输入输出的统计，回顾反思工具是否真的对自己产生了价值。&lt;/li&gt;
&lt;li&gt;重器轻用：用自己觉得舒适的方式去使用工具，工具的目的是产生价值，而不是为了用而用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;其次，去做自己喜欢的事情。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在追求高效前，要搞清楚热爱的事情，再释放自己的效率能量。别让无谓的琐事，迷失了原本的目标。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;高效本身不是目的，但追求高效可以让我们获得更多有价值的事物&lt;/strong&gt;。追求高效，是为了节省出更多的时间，让我们能够有时间去做自己喜欢的事情、去体验生活、关注自己的身体与娱乐、去感受幸福。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最后，慢下来，去感受。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sspai.com/post/71760&quot;&gt;《效率的背后不是工具，而是人》&lt;/a&gt; 中有一段话说的挺好：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;效率的人生，不是指每一件事情都高效完成，高效地沟通、高效地睡觉、高效地吃饭，这结果听起来就是高效地去死一样。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;因此，要适当慢下来，阶段性地把注意力从手头上在做的事情转移开来，把焦点放在自己身上，沉静下来反思。&lt;/p&gt;
&lt;p&gt;人需要的不只是高效率，我们要追求的也不是“快”，而是“慢”；我们缺的其实也并不是效率，而是舍弃。&lt;/p&gt;
&lt;p&gt;慢下来，去关注自己的思维、情感和身体，好好去品味生活、体验生活，而不是把自己活成一颗螺丝钉。在之前的一篇文章 &lt;a href=&quot;https://me.ursb.me/archives/299.html&quot;&gt;《谈谈存在的价值与人生体验》&lt;/a&gt; 中也不断强调过体验的重要性，这里不再赘述了。&lt;/p&gt;
&lt;p&gt;那么要如何体验世界呢？&lt;/p&gt;
&lt;p&gt;在 L 先生上周的文章 &lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=MzAxNTY0NjEzNg==&amp;amp;mid=2247486949&amp;amp;idx=1&amp;amp;sn=99796e747dc28decf35a0c48cf7dda79&quot;&gt;《停下来，去感受》&lt;/a&gt; 中提到了要培养自己的感知力。感知力能把自己跟他人、跟世界连接起来，形成一个共同呼吸的整体。它包括以下三个部分组成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自我监控：能够敏锐地感受到自己身体内在的细微变化，体会到自己的状态。&lt;/li&gt;
&lt;li&gt;他人共情：能够切身体会到别人的心情、想法、感受，站在别人的立场考虑。&lt;/li&gt;
&lt;li&gt;外部沉浸：能够自主地将注意力集中在外部的环境中，体验和感受外部世界。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;“爱具体的人，不要爱抽象的人；爱生活，不要爱生活的意义。”——陀思妥耶夫斯基&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;高效只是一种个人的选择，只是迈向人生目标的一种手段而已。而同时，也没有人规定过人生是一场马拉松。&lt;/p&gt;
&lt;p&gt;当年明月在《明朝那些事儿》的最后一章，通过&lt;a href=&quot;https://www.zhihu.com/question/47436256/answer/2385014334&quot;&gt;徐霞客的故事&lt;/a&gt; 表达了足以藐视所有王侯将相，最完美的结束语——“&lt;strong&gt;成功只有一个——按照自己喜欢的方式，去度过人生&lt;/strong&gt;”。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;此前，我讲过很多东西，很多兴衰起落、很多王侯将相、很多无奈更替、很多风云变幻，但这件东西，我认为，是最重要的。因为我要告诉你，所谓千秋霸业，万古流芳，以及一切的一切，只是粪土。先变成粪，再变成土。——当年明月&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;毕竟，一切都是外在之物，唯有健康、梦想、记忆和爱，才会伴随我们终生。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最后，愿你不随波逐流，目有可及之爱，心有满溢光彩。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;每周推荐&lt;/h2&gt;
&lt;h3&gt;《2022 大社交趋势观察报告》&lt;/h3&gt;
&lt;p&gt;PDF 报告原文：&lt;a href=&quot;https://docs.qq.com/pdf/DZVV5aXBOSWZ5TEFW?&quot;&gt;2022大社交趋势观察报告-袤则咨询&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;很喜欢这种用研报告的呈现形式和内容结构，每个观察点都包括以下四点组成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What&apos;s new&lt;/li&gt;
&lt;li&gt;Case&lt;/li&gt;
&lt;li&gt;Why&lt;/li&gt;
&lt;li&gt;How&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022070301.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Muse 2.0&lt;/h3&gt;
&lt;p&gt;Muse 前段时间出了 2.0 版本，登录了 Mac。不过，还是期待一波 iPad OS 的新系统出的白板应用。&lt;/p&gt;
&lt;p&gt;PS. Muse 的开发者很 Nice，针对国行特定调低了价格。除此之外，我之前用蹩脚英语给他们发邮件咨询文件同步的功能，他们也很认真地回复了。体验了之后会发现，Muse 着实是一款用心打磨过的好产品。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022070302.png&quot; alt=&quot;&quot; /&gt;扩展阅读：&lt;a href=&quot;https://sspai.com/post/74009&quot;&gt;设计、体验都出彩，白板工具的又一选择：Muse - 少数派&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;本周记录&lt;/h2&gt;
&lt;h3&gt;Recent Viewings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;读完：情感 |《见字如面》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;看过：悬疑 | 《杀人回忆》 | ★★★★★&lt;/li&gt;
&lt;li&gt;在看：动漫 |《间谍过家家》&lt;/li&gt;
&lt;li&gt;在看：纪录片 |《英雄之路》&lt;/li&gt;
&lt;li&gt;在玩：Switch |《十三机兵防卫圈》&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022070303.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Recent Code&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TypeScriptReact  32 hrs 30 mins ███████████████▋░░░░░  74.5%
TypeScript       7 hrs 31 mins  ███▌░░░░░░░░░░░░░░░░░  17.2%
JavaScript       1 hr 35 mins   ▊░░░░░░░░░░░░░░░░░░░░   3.7%
JSON             42 mins        ▎░░░░░░░░░░░░░░░░░░░░   1.6%
Dart             20 mins        ▏░░░░░░░░░░░░░░░░░░░░   0.8%
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-9&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>周刊（第8期）：三幕剧与英雄旅程</title><link>https://ursb.me/posts/weekly-8/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-8/</guid><description>解析三幕剧与英雄旅程的叙事结构，结合《僵尸世界大战》《功夫熊猫》《看不见的客人》等作品说明经典模版与生活横断面式写法的差异，并推荐笔记软件 Obsidian、LogSeq 与 Hepta。</description><pubDate>Sun, 26 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;三幕剧与英雄旅程&lt;/h2&gt;
&lt;p&gt;说三幕剧之前，我们先谈谈如何分析一个故事的组成，以前语文课程学过，总结下有两种方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;要素拆解法&lt;/li&gt;
&lt;li&gt;叙事过程拆解法&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所谓&lt;strong&gt;要素拆解法&lt;/strong&gt;，就是分析「人事时地因」（5W），如果要辅以叙事方法的分析可以再加上「如何叙事」 这个要素，以组成 5W1H：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;人物(Who)&lt;/li&gt;
&lt;li&gt;事件(What)&lt;/li&gt;
&lt;li&gt;时间(When)&lt;/li&gt;
&lt;li&gt;地点(Where)&lt;/li&gt;
&lt;li&gt;为何发生(Why)：故事发生的背景原因&lt;/li&gt;
&lt;li&gt;如何叙事(How)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而所谓&lt;strong&gt;叙事过程拆解法&lt;/strong&gt;，常见的是「起承转合」：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;起：故事的起始，如何开始，事件的触发等等。&lt;/li&gt;
&lt;li&gt;承：故事的延展，剧情的铺陈与持续。&lt;/li&gt;
&lt;li&gt;转：故事的高潮，转变的剧情，预料之外的发展。&lt;/li&gt;
&lt;li&gt;合：故事的结局。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「起承转合」这种讲故事的方法与亚里士多德阐释的“故事基本要素”（即开端、中段和结尾）一脉相承。而&lt;strong&gt;三幕剧&lt;/strong&gt;结构亦是如此。&lt;/p&gt;
&lt;p&gt;经典的三幕式结构又叫戏剧性结构、冲突性结构，将故事分为三个部分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;开始&lt;/strong&gt;（Setup）：又称触发或启程，是三幕剧的第一个部分。是故事的开始和原点， 通常用着将观众带入故事的作用，用来解释故事的设定和背景，以便接下来冲突发展。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对抗&lt;/strong&gt;（Confrontation）：又称冲突或转折，是三幕剧的第二个部分。是故事中角色面临难关，或是重大打击的时刻，第二幕有着将 &lt;strong&gt;角色心境推到低谷&lt;/strong&gt; 以及 &lt;strong&gt;强化戏剧张力&lt;/strong&gt; 的作用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解决&lt;/strong&gt;（Resolution）：又称结尾，是故事的终结，是三幕剧的最后一部分。通常会处理第二幕发生的冲突，无论是克服难关， 或是跨过自身的障碍门槛。第三幕需要做到 &lt;strong&gt;拉抬角色心境&lt;/strong&gt;、 &lt;strong&gt;故事高潮&lt;/strong&gt; 以及 &lt;strong&gt;收尾&lt;/strong&gt; 的作用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220625181542.png&quot; alt=&quot;&quot; /&gt;上图取自维基百科的三幕剧时间轴图，将每幕（Act）链接起来的就是情节节点（Plot），而三个幕的代表点位分别是触发事件（Inciting incident），中点（Midpoint）和高潮（Climax）。&lt;/p&gt;
&lt;p&gt;值得一提的是，在写故事的时候，一个故事不一定只能有一个三幕剧结构，在叙事过程中，将数个三幕剧剧情混在一起，如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;触发 → 冲突 → 解决 → 触发 → 冲突 → 解决 → ……
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;举个例子，《僵尸世界大战》就是这样一部剧，全程无尿点的原因之一就是故事节奏紧凑，由数个三幕剧的副本构成的电影。所以在 B 站看的时候，特别有在玩《求生之路》的既视感，弹幕也特别沉浸（“任务完成”，“第一章结束”）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022062501.png&quot; alt=&quot;&quot; /&gt;观察这部剧的弹幕热度条会发现一个有意思的现象：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022062502.png&quot; alt=&quot;&quot; /&gt;图中每个章节是我自己起的，根据剧情大概可以分成 6个三幕剧，其中每一章中恰会有一个弹幕峰值，这个峰值对应的恰是这一幕故事的高潮情节：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;点 1：第一幕的高潮，大街上爆发丧尸&lt;/li&gt;
&lt;li&gt;点 2：第二幕的高潮，主角团黎明前夕在大楼中逃生&lt;/li&gt;
&lt;li&gt;点 3：第三幕的高潮，主角团在朝鲜机场爆发枪战&lt;/li&gt;
&lt;li&gt;点 4：第四幕的高潮，主角团在以色列遭遇丧尸群突破救世之墙&lt;/li&gt;
&lt;li&gt;点 5：第五幕的高潮&lt;/li&gt;
&lt;li&gt;点 6：第六幕的高潮，不是特别明显，&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;除了三幕剧本身可以叠加，为了突出剧情的连贯性，有时也可将三结构改为五结构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;触发→ 冲突 → 解决冲突 → 冲突 → 解决冲突
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;英雄旅程（Hero’s Journey）是好莱坞编剧提出的「英雄旅程的 12 个阶段」，其是基于神话与常见剧本所整理出的一套英雄主角成长路线的模版：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;平凡世界&lt;/strong&gt;：代表主角的背景和出身，向观众介绍英雄的出场，营造认同感。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;冒险的召唤&lt;/strong&gt;：要求主角上路的各种形式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拒绝召唤&lt;/strong&gt;：凸显旅程的危险和代价，无论主角怎么拒绝最后都还是会上路。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;遇上师傅&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨越第一道门槛&lt;/strong&gt;：第一幕的结尾，英雄来到两个世界的边界，开始上路，故事真正开始。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;试炼、盟友、敌人&lt;/strong&gt;：进入非常世界，英雄开始迎接试炼、结交盟友或树立敌人，三者顺序不拘。敌人也经常以竞争对手取代。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;进逼洞穴最深处&lt;/strong&gt;：即将抵达非常世界的核心，通常更加神秘，展示第二道门槛。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;苦难折磨&lt;/strong&gt;：故事核心，主角重生前夕的难关。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;奖赏（掌握宝剑）&lt;/strong&gt;：死里逃生的主角获得报酬，换得在非常世界中追寻的某种东西。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;归返之路&lt;/strong&gt;：第三幕开头，主角可能继续上路或者回到平凡世界。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复苏&lt;/strong&gt;：故事高潮，对抗最后一个 Boss。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;带着万灵丹归返&lt;/strong&gt;：故事结局，主角带着战利品从非常世界回到平凡世界。若是开放式结局，会让情节继续。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;除此之外，英雄旅程在早期也有其他变体：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220626115259.png&quot; alt=&quot;&quot; /&gt;但无论何种变体，都满足三段结构：启程→启蒙→归返。&lt;/p&gt;
&lt;p&gt;这套模版是非常常见的，如《功夫熊猫》就是经典的英雄旅程。&lt;/p&gt;
&lt;p&gt;然而，大多数时候硬套模版只会荒谬地陷入陈腔滥调。&lt;/p&gt;
&lt;p&gt;其实情节并非就是教条式的“开端、发展、高潮、结局”，许多优秀的文章和剧集代之以“生活的横断面”结构。最明显的是，开端显得非常不重要，往往是从事件的当中讲起，开端退化为后来的某种不着痕迹的交代，更不在乎严格意义上的结尾。&lt;/p&gt;
&lt;p&gt;比如《看不见的客人》，就没有严格意义上的“开端”，情节一环扣一环，将背景潜入故事之中，不断勾起观众好奇，使之沉浸于剧情。&lt;/p&gt;
&lt;p&gt;再比如《孔乙己》，小说中没有交代孔乙己的身份背景，而是将他的故事全都放在场景的交代中去，只写酒店的三个场景，其中一个孔乙己还没有出场。&lt;/p&gt;
&lt;p&gt;优秀的故事没有永恒的公式，《故事》中说道：“&lt;strong&gt;故事是生活的比喻&lt;/strong&gt;。”它的内核来自于创作者对生活的信念，是创作者思想和激情的体现。作品中的每一个情节、每一个瞬间，都必须充盈着富于激情的信念。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;电影就是将精神的东西物化。——约翰·卡彭特&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;所以陈词滥调的根源并不是硬套模版，反而熟练掌握经典叙事模版是每个创作者的基础功力。&lt;/p&gt;
&lt;p&gt;一切陈词滥调的根源可以追溯到一个原因，而且也是唯一的原因——创作者对笔下故事的世界没有深入的了解与洞察。&lt;/p&gt;
&lt;p&gt;要知道，叙事形式不是最重要的，它只是创作者叙事故事的一个载体，最重要的是故事的内核。&lt;/p&gt;
&lt;h2&gt;每周推荐&lt;/h2&gt;
&lt;p&gt;本周推荐一些好用的笔记软件。&lt;/p&gt;
&lt;h3&gt;Obsidian&lt;/h3&gt;
&lt;p&gt;经典的卡片盒式笔记工具，目前我用作 Markdown 写作工具。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022062503.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;LogSeq&lt;/h3&gt;
&lt;p&gt;大纲式双链知识库笔记工具，是 Roam Research 的平替版（甚至做的更好），也是我目前唯一在使用的笔记工具。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022062504.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Hepta&lt;/h3&gt;
&lt;p&gt;作者是一个台湾刚毕业的大学生，对笔记有一套自己的思考，而且他能做到 Hepta 几乎日更，这也是我很佩服的一个点。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220626122915.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;本周记录&lt;/h2&gt;
&lt;h3&gt;Recent Viewings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在读：情感 |《见字如面》&lt;/li&gt;
&lt;li&gt;在看：动漫 |《夏日重现》&lt;/li&gt;
&lt;li&gt;在看：动漫 |《间谍过家家》&lt;/li&gt;
&lt;li&gt;看过：电影 |《隧道》（二刷）&lt;/li&gt;
&lt;li&gt;看过：电影 |《奇异博士 2》&lt;/li&gt;
&lt;li&gt;看过：游戏实况 |《采石场惊魂》&lt;/li&gt;
&lt;li&gt;玩过：Switch ｜《你剪我裁》&lt;/li&gt;
&lt;li&gt;玩过：Switch ｜《糖豆人》&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因为自己很怂，但又很好奇恐怖游戏的剧情，所以很喜欢看别人玩恐怖游戏，还有弹幕护体，一点也不慌。&lt;/p&gt;
&lt;p&gt;By the way，糖豆人免费了 &amp;amp; 登录了 Switch，直连游玩体验 ok，一定要尝试下！（游戏就应该是这种纯粹的快乐呀）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220625180007.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Recent Code&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TypeScript React    40 hrs 12 mins ██████████████▋░░░░░░ 70.1%
TypeScript          13 hrs 43 mins █████░░░░░░░░░░░░░░░░ 23.9%
JSON                1 hr 2 mins    ▍░░░░░░░░░░░░░░░░░░░░  1.8%
JavaScript          41 mins        ▎░░░░░░░░░░░░░░░░░░░░  1.2%
HTML                38 mins        ▏░░░░░░░░░░░░░░░░░░░░  1.1%
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-8&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>周刊（第7期）：即兴发言模型</title><link>https://ursb.me/posts/weekly-7/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-7/</guid><description>梳理五种即兴发言与沟通模型——Yes And 原则、金字塔法则、FFC 赞美法、FFA 汇报法与非暴力沟通的四要素技巧，并推荐动漫《夏日重现》与前端学习网站 The Modern JavaScript Tutorial。</description><pubDate>Sun, 19 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;即兴发言模型&lt;/h2&gt;
&lt;p&gt;这周刷 B 站看到了一个&lt;a href=&quot;https://www.bilibili.com/video/BV16t4y1W7kZ&quot;&gt;视频&lt;/a&gt;，Up 主介绍了一些发言模版，本文归纳总结一下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Yes And 原则&lt;/li&gt;
&lt;li&gt;金字塔法则&lt;/li&gt;
&lt;li&gt;FFC 赞美法则&lt;/li&gt;
&lt;li&gt;FFA 汇报法则&lt;/li&gt;
&lt;li&gt;NVC 技巧&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Yes And 原则&lt;/h3&gt;
&lt;p&gt;适用场景：表达相左观点&lt;/p&gt;
&lt;p&gt;核心思想：不要否定别人，以肯定代替否定&lt;/p&gt;
&lt;p&gt;“Yes! And…” 技巧源于意大利的即兴喜剧， Yes 代表同意对方说的话，And 是在 Yes 的基础上添加自己的观点。因为即兴表演是没有剧本的，因此想要顺利推进情节就需要承接对方的话，然后再添加自己的内容，这样整体的节奏会更加连贯。若是相互否定，就相当于砍掉了观众前文接受的内容，拼凑的情节无法高效连接。&lt;/p&gt;
&lt;p&gt;那么应用于生活之中，即便有人提出自己不认同的观点，请先不要着急否定，即不要着急说“But”。而且是从 “Yes” 的出发点出发，先说自己认同的点，表达肯定、接纳、包容对方的态度，之后再通过 “And” 把自己的其他想法说出去。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A：我觉得这个方案 XXXXX，你看我这个想法怎么样？
B：嗯，我觉得挺好的呀(YES)，并且(AND)我这里还有一个思路，你看看怎么样？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And 和 But 都能表达出自己的观点，但否定容易激起对抗情绪。而在“求同存异“的沟通氛围下，更容易达成共识，也更容易激发新的信息。&lt;/p&gt;
&lt;h3&gt;金字塔法则&lt;/h3&gt;
&lt;p&gt;适用场景：需要吸引受众注意力或高效沟通的场景。如答辩、汇报、写作等。&lt;/p&gt;
&lt;p&gt;核心思想：金字塔原理。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自上而下表达，结论先行&lt;/li&gt;
&lt;li&gt;自下而上思考，总结概括&lt;/li&gt;
&lt;li&gt;纵向总结概括&lt;/li&gt;
&lt;li&gt;横向论点分组&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;吸引受众注意力&lt;/li&gt;
&lt;li&gt;提升受众的信息接收效率，避免浪费时间&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;FFC 赞美法则&lt;/h3&gt;
&lt;p&gt;适用场景：赞美他人&lt;/p&gt;
&lt;p&gt;FFC 赞美法则指在赞美一个人的时候，先用细腻的语言来表达自己的感受（Feeling），然后再进一步通过陈述事实（Facts）来证明自己的感受并非空穴来风，最后再通过一番比较（Compare），来表达对对方的深度认同。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我觉得你今天穿的这件连衣裙真的很有品味、很有范儿啊（Feeling）！因为这件连衣裙的款式和你的气质很搭，同时也非常适合你的肤色和身材（Facts）！说实话，这是我今年入夏以来，看到最好看的一件连衣裙了。（Compare）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不要赞美事实上没有的特质，否则不真诚&lt;/li&gt;
&lt;li&gt;不要和在场的其他人做比较，比较范围要拉大&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;FFA 汇报法则&lt;/h3&gt;
&lt;p&gt;适用场景：职场汇报&lt;/p&gt;
&lt;p&gt;核心思想：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;客观陈述事实 Facts&lt;/li&gt;
&lt;li&gt;表达自己的看法 Feeling&lt;/li&gt;
&lt;li&gt;给出行动方案 Action&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;X 总，这个月销售额下滑了 30% (Facts)，我觉得可能是新人的业务扩展能力有些问题 (Feelings)，下周我会再组织一次业务培训解决一下这方面的问题 (Actions)。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;NVC 技巧&lt;/h3&gt;
&lt;p&gt;适用场景：亲密关系&lt;/p&gt;
&lt;p&gt;Nonviolent Communication 非暴力沟通法则，在《非暴力沟通》中的「爱的语言沟通四要素」中有详细介绍，此处不再赘述。&lt;/p&gt;
&lt;p&gt;核心思想： 爱的语言沟通四要素&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;观察：描述观察&lt;/li&gt;
&lt;li&gt;感受：表达感受&lt;/li&gt;
&lt;li&gt;需要：让对方感受到需求&lt;/li&gt;
&lt;li&gt;请求：提出要求&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;每周推荐&lt;/h2&gt;
&lt;h3&gt;漫画/动漫：夏日重现&lt;/h3&gt;
&lt;p&gt;比起 re0 486 的恋爱轮回，这一部的主角简直是炼狱难度，以凡人之躯对抗超自然生物。&lt;/p&gt;
&lt;p&gt;和《开端》相反，主角轮回有极大的限制，《开端》是每次死亡轮回点会提前，而本作则是延后，因此某些发生的事情已成定局无法改变。本作的反派方亦有着xx（剧透打码）能力，利用情报差压制主角团，甚至一度堵在主角的出生点，令人感到压抑绝望。&lt;/p&gt;
&lt;p&gt;本作主角团和反派智商在线，剧情环环相扣，设定严谨，所有的伏笔都有回收，堪称今年的神作。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220619121615.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;编程：现代 JavaScript&lt;/h3&gt;
&lt;p&gt;偶然间发现的一个免费的学习前端的网站，网站设计精美，并且知识内容的深度和广度皆有，值得新人学习，也值得老人巩固基础。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://javascript.info/&quot;&gt;The Modern JavaScript Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;本周记录&lt;/h2&gt;
&lt;h3&gt;Recent Viewings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在读：情感 |《见字如面》&lt;/li&gt;
&lt;li&gt;在读：哲学 |《存在主义咖啡馆：自由、存在和杏子鸡尾酒》&lt;/li&gt;
&lt;li&gt;在看：动漫 |《夏日重现》&lt;/li&gt;
&lt;li&gt;在看：动漫 |《间谍过家家》&lt;/li&gt;
&lt;li&gt;看完：漫画 |《夏日重现》（三刷）&lt;/li&gt;
&lt;li&gt;看过：电影 |《绿皮书》（二刷）&lt;/li&gt;
&lt;li&gt;玩过：单机 |《黎明前 20 分钟》&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;《黎明前 20 分钟》是一款张弛有度的小品级 Rougelike。Steam 仅售 15 块，10~20 分钟快速游玩一局，在游戏中寻找适合自己的战斗风格是这款游戏的主要乐趣。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220617225658.png&quot; alt=&quot;&quot; /&gt;PS. 想云游戏的玩家可以看看王老菊的视频 → &lt;a href=&quot;https://www.bilibili.com/video/BV18t4y1h7Ck&quot;&gt;王老菊教你黑夜打枪_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Recent Code&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TypeScript React  32 hrs 23 mins █████████████░░░░░░░░  61.9%
TypeScript        18 hrs 50 mins ███████▌░░░░░░░░░░░░░  36.0%
JSON              32 mins        ▏░░░░░░░░░░░░░░░░░░░░   1.0%
JavaScript        10 mins        ░░░░░░░░░░░░░░░░░░░░░   0.3%
Markdown          6 mins         ░░░░░░░░░░░░░░░░░░░░░   0.2%
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-7&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>周刊（第6期）：沟通艺术中的知觉检核</title><link>https://ursb.me/posts/weekly-6/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-6/</guid><description>探讨《沟通的艺术》中的知觉检核概念，分析知觉差异如何在沟通中制造噪声与情绪干扰，并推荐输入法切换工具 Input Source Pro、生词插件 Relingo 及 Snipaste、Shottr、CleanShot X 等截图软件。</description><pubDate>Sat, 11 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;沟通艺术中的知觉检核&lt;/h2&gt;
&lt;p&gt;这周看到一篇&lt;a href=&quot;https://sspai.com/post/73626&quot;&gt;文章&lt;/a&gt;总结了 &lt;a href=&quot;https://book.douban.com/subject/27117578/&quot;&gt;《沟通的艺术》&lt;/a&gt; 的一些观点，本期周刊重点谈谈文中的「知觉」。&lt;/p&gt;
&lt;p&gt;不同的人给这个世界赋予了属于自己的意义，而人类给身处的世界赋予意义的能力叫做「知觉」。因此，同一件事情，在历经过不同的人的知觉过程后，所被赋予的意义都是不同的，这就导致了我们往往不能准确的理解他人，为人与人的之间沟通赋予了无数的噪声。&lt;/p&gt;
&lt;p&gt;文中介绍了知觉的历程：&lt;strong&gt;选择—组织—诠释—协商&lt;/strong&gt;，这四个流程非常类似于去年在&lt;a href=&quot;https://me.ursb.me/archives/265.html&quot;&gt;《如何有效沟通》&lt;/a&gt;一文中介绍的推理阶梯，这里不再赘述。&lt;/p&gt;
&lt;p&gt;接下来看看《沟通的艺术》中介绍的「交流沟通模型」，由图可见：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220611171302.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;消息的发送者与接受者处于不同但又有部分重叠的背景中&lt;/strong&gt;，不重叠的地方称之为代沟，是沟通者双方所独有的背景，包括文化背景，家庭背景，教育背景等因素所产生的差异。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;沟通是双向的，没有纯粹的发送或接受者&lt;/strong&gt;，即便是倾听，也会专注思考或者微微点头、时而皱眉，或者其他的肢体语言也在给对方传递消息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;噪声充斥于整个模型之中&lt;/strong&gt;，不仅仅是沟通者背景上存在噪声，消息传递的渠道、编解码也会存在噪声，与语气语速的不同都会导致理解偏差；除此之外，沟通者自身也存在噪声，这就是知觉差异导致的。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而所谓知觉检核，就是通过尽可能消除知觉差异产生的噪声来增强个人同理心，从而尽可能去理解对方。&lt;/p&gt;
&lt;p&gt;在&lt;a href=&quot;https://me.ursb.me/archives/265.html&quot;&gt;《如何有效沟通》&lt;/a&gt;中我介绍了固有立场的概念，那知觉检核就是去 Check 所有可能立场，从不同立场出发去思考，从而准确的了解对方所要表达含义。所有立场不外乎以下五点：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220611170513.png&quot; alt=&quot;&quot; /&gt;文中还介绍了知觉检核的步骤：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一步：描述自己注意到对方的行为&lt;/li&gt;
&lt;li&gt;第二步：列出至少两个自己对于此行为的诠释&lt;/li&gt;
&lt;li&gt;第三步：请求对方澄清你的诠释&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;需要注意的是，这里的知觉检核的目的是为了 &lt;strong&gt;「准确地了解对方」&lt;/strong&gt; 。而《非暴力沟通》中所提到的「爱的语言沟通四要素」（观察、感受、需要、请求），它的目的是 &lt;strong&gt;「让对方理解自己」&lt;/strong&gt;。沟通是双向的，《沟通的艺术》在这里补足了《非暴力沟通》所缺少的那一环节。&lt;/p&gt;
&lt;p&gt;知觉检核还有一个作用，就是在沟通中尽可能摒除情绪作用产生的噪声。&lt;/p&gt;
&lt;p&gt;在《认知觉醒》中介绍了人类的三重大脑：理智脑、情绪脑和本能脑。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220611172204.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220611172208.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;所有情绪在本质上都是某种行动的驱动力，即进化过程赋予人类处理各种状况的及时计划。—— 《情商1》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本能脑和情绪脑运算速度极快，至少可达 11000000 次/秒，而理智脑的最快运行速度仅为 40 次/秒。所以，综合来看，理智脑对大脑的控制能力很弱，因此，我们在工作和生活中，大部分做决策往往源于本能和情绪，而非理智，这就导致了沟通极大地可能受到情绪的影响。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;能控制好自己情绪的人，比能拿下一座城池的将军更伟大。—— 拿破仑&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;可以笼统的说，&lt;strong&gt;我们的情绪更像是我们想法的结果，而非我们所遭遇的事件的结果&lt;/strong&gt;。而我们给事物赋予不同的意义又会给我们带来不同的感觉，也就是不同的情绪。&lt;/p&gt;
&lt;p&gt;时常做知觉检核可以更好地审视自己，也能够让自己了解到，沟通既是一种谈话技巧，更是一种思维方式，更侧重于挖掘语言背后双方所蕴含的情感与期望。&lt;strong&gt;当我们专注于彼此的观察、感受及需要，而不反驳他人，我们便能发现内心的柔情，对自己和他人产生全新的体会。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这就是非暴力沟通，这就是沟通的艺术。&lt;/p&gt;
&lt;p&gt;扩展阅读：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://sspai.com/post/73136&quot;&gt;沟通的艺术：学校错过的课程，现在补上也不晚 - 少数派&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sspai.com/post/73626&quot;&gt;沟通的艺术：理解对方，管理情绪，展现自我 - 少数派&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://me.ursb.me/archives/265.html&quot;&gt;如何有效沟通——从《齐物论》立场问题切入 - Airing 的小屋&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://book.douban.com/subject/3533221/&quot;&gt;《非暴力沟通》&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;每周推荐&lt;/h2&gt;
&lt;h3&gt;优化输入法体验：Input Source Pro&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://inputsource.pro/zh-CN&quot;&gt;Input Source Pro&lt;/a&gt; 可以根据应用或是网站自动切换输入法，并且在切换窗口的时候还会贴心的提示当前的输入法是什么，比如设置 VSCode、iTerm、Xcode 默认为英文输入法，而笔记软件和企业微信默认为中文输入法，切换软件时再也不需要按 shift 键了！（这款软件安利给同事们之后纷纷点赞，简直程序员刚需）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220611155646.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;渐进式单词学习插件&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://relingo.net/zh/index&quot;&gt;Relingo&lt;/a&gt; 是一款免费的 Chrome 插件，可以自动标注网页里的生词，你可以根据自己的掌握程度来选择性地将它们一键加入到生词本中，通过日常的网页浏览，渐进式地学习英语单词。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/SCR-20220611-m9h.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;截图软件&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://zh.snipaste.com/&quot;&gt;Snipaste&lt;/a&gt; 是我一直在用的免费截图软件，Windows 和 MacOS 都支持，最喜欢的是可以把截图贴在桌面上的能力，如同便签一样，方便我贴重构稿、关键信息、对比代码、二维码等信息到桌面上：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220611154247.png&quot; alt=&quot;&quot; /&gt;&lt;a href=&quot;https://shottr.cc/#/&quot;&gt;Shottr&lt;/a&gt; 是最近新出的又一款 MacOS 平台的截图 App，功能强大、界面美观、而且免费，较于 Snipaste 多了滚动截图、窗口截图、OCR 等能力，但是缺少了我最喜欢的桌面贴图功能，而且个人体验下来，虽然它很美观，但是标注图片时总是不如 Snipaste 用的顺手。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220611154458.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;扩展阅读：&lt;a href=&quot;https://sspai.com/post/71485&quot;&gt;macOS 免费轻量级截图工具 Shottr，帮你滚动截长图、量像素、取色、OCR - 少数派&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://cleanshot.com/&quot;&gt;CleanShot X&lt;/a&gt; 是一款老牌 &amp;amp; 功能强大的 MacOS 平台的截图软件，以上两款软件的功能它都有，除此之外，还有录制视频、录制 GIF、上传图片到云端、顺序标注等独有的能力，界面也很美观，和 Raycast 的联动做的也很好，还有独创的 「all in one」 模式。唯一的缺点是需要付费（现在 618 大促，仅需 ￥104 元/设备）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220611155321.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;本周记录&lt;/h2&gt;
&lt;h3&gt;Recent Viewings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;读完：小说 |《红手指》|  ★★★★&lt;/li&gt;
&lt;li&gt;在读：哲学 |《存在主义咖啡馆：自由、存在和杏子鸡尾酒》&lt;/li&gt;
&lt;li&gt;在看：动漫 |《夏日重现》&lt;/li&gt;
&lt;li&gt;在看：动漫 |《间谍过家家》&lt;/li&gt;
&lt;li&gt;看完：电影 |《这个杀手不太冷》| ★★★★&lt;/li&gt;
&lt;li&gt;玩过：游戏 |《原神》2.7 危途伏事 |  ★★★★&lt;/li&gt;
&lt;li&gt;玩过：游戏 |《Shotgun King》|  ★★★★&lt;/li&gt;
&lt;li&gt;在玩：游戏 |《胡闹厨房 2》&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Shotgun King 是一款很有创意的游戏，魔改了国际象棋，你是黑棋国王，虽孤军奋战，但你有一把霰弹枪。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220611160836.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Recent Code&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TypeScript React   45 hrs 11 mins ███████████████▊░░░░░  75.3%
TypeScript         10 hrs 14 mins ███▌░░░░░░░░░░░░░░░░░  17.1%
Markdown           1 hr 50 mins   ▋░░░░░░░░░░░░░░░░░░░░   3.1%
JavaScript         1 hr 17 mins   ▍░░░░░░░░░░░░░░░░░░░░   2.2%
JSON               1 hr 1 min     ▎░░░░░░░░░░░░░░░░░░░░   1.7%
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-6&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>周刊（第5期）：我在 TME 工作的一天</title><link>https://ursb.me/posts/weekly-5/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-5/</guid><description>记录在腾讯音乐（TME）一天的工作时间安排，并推荐剖析程序设计决策的博客系列文章、体验 1Password 8 的 Electron 新版观感，新增记录每周书影音与编程时长的板块。</description><pubDate>Sat, 04 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;我在 TME 工作的一天&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;7:30，起床&lt;/li&gt;
&lt;li&gt;8:10，出门，坐班车上班&lt;/li&gt;
&lt;li&gt;8:50-9:30，到公司;早饭时间 &amp;amp; 看阅读清单里的文章&lt;/li&gt;
&lt;li&gt;9:30-10:00，整理昨天遗留的与今天要做的事情，开始工作&lt;/li&gt;
&lt;li&gt;10:00，晨会时间；会后开始上午的工作&lt;/li&gt;
&lt;li&gt;12:00，午饭时间&lt;/li&gt;
&lt;li&gt;12:30~13:30，看阅读清单里文章 or 看书&lt;/li&gt;
&lt;li&gt;13:30~14:15，午睡；午休后开始下午的工作&lt;/li&gt;
&lt;li&gt;18:00，晚饭时间&lt;/li&gt;
&lt;li&gt;19:00-21:00，晚上编码时间，直至下班&lt;/li&gt;
&lt;li&gt;22:00-23:30，娱乐时间&lt;/li&gt;
&lt;li&gt;23:30-0:00，睡前看书时间，远离蓝光设备，准备入睡&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;去班车点的路:
&lt;img src=&quot;https://airing.ursb.me/image/blog/20220604114354.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我的工位:
&lt;img src=&quot;https://airing.ursb.me/image/blog/20220604114352.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我的书桌:
&lt;img src=&quot;https://airing.ursb.me/image/blog/20220604114353.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;每周推荐&lt;/h2&gt;
&lt;h3&gt;技术：Why’s THE Design&lt;/h3&gt;
&lt;p&gt;这周看到了个不错的博客网站：&lt;a href=&quot;https://draveness.me/whys-the-design/&quot;&gt;为什么这么设计系列文章 - 面向信仰编程&lt;/a&gt;，博主撰写了一系列关于计算机领域中程序设计决策的文章，在这个系列的每一篇文章中他都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点、对具体实现造成的影响。这种提出问题并去深入研究的学习方法非常值得学习。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220604113130.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;软件：1Password 8&lt;/h3&gt;
&lt;p&gt;作为 1Password 老用户，一直停留在 1Password 7 没有去主动升级上周发布的大版本，因为很久之前看新闻说新版本用 Electron 开发，评论区都在吐槽 Electron 的性能，对抛弃原生开发的做法表示非常不满。但我这周看到  1Password 8 宣传页，深深被新 UI 吸引了，“不争气”地升级到了 8。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220604114351.png&quot; alt=&quot;&quot; /&gt;体验了几天下来发现，作为密码管理软件而言并没有什么要吃性能的地方，整体 Electron 的性能非常流畅。我想如果官方不主动对用户表示新版本换了技术栈，应该也不会有人发现新一代的 1Password 居然不是原生开发的。&lt;/p&gt;
&lt;p&gt;这让我想到了前段时间看的一篇文章（很遗憾我找不到原文了），大意是说开发者把 iOS 原生开发的应用，在新版本中悄悄换成了套壳 PWA，但是用户们全都没有发现。&lt;/p&gt;
&lt;p&gt;用户体验不单单只看软件的理论最优性能，而是要看系统整体交互设计、动画呈现、加载时序的合理性，真正从用户需求的角度出发，感受他们的真实体验和容忍度。然后在这个基础上，再去选择业务合适的、流程高效的技术栈。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PS：我组的 1Password 家庭车还有三个车位，有兴趣的童鞋可以找我加。&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;本周记录&lt;/h2&gt;
&lt;p&gt;本模块为本期起的新增模块，记录个人每周书影音和编程情况，是个人简短的小周报。对于看完的书籍电影会简单打上个人主观评分，而编程记录则读取自 Wakatime，GitHub Action 每周定时会拉一次数据，之后同步到个人 &lt;a href=&quot;https://gist.github.com/airingursb/ca03eaa58db87fc814e0fe6ba3c48215&quot;&gt;Gist&lt;/a&gt; 上。由于是 6.1 才启动的 Wakatime 插件，因此本期编程数据从 6.1 开始。&lt;/p&gt;
&lt;p&gt;之后我会再抽空优化下 Weekly 的 CI，每次推周刊的时候由 CI 去抓豆瓣和 Gist 的记录后自动生成这个「本周记录」模块。&lt;/p&gt;
&lt;h3&gt;Recent Viewings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;读完：小说 |《占星术杀人魔法》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：电影 |《瞬息全宇宙》| ★★★★★&lt;/li&gt;
&lt;li&gt;看完：剧集 |《金宵大厦》| ★★★☆☆&lt;/li&gt;
&lt;li&gt;在读：小说 |《红手指》&lt;/li&gt;
&lt;li&gt;在看：动漫 |《夏日重现》&lt;/li&gt;
&lt;li&gt;在看：动漫 |《间谍过家家》&lt;/li&gt;
&lt;li&gt;在玩：游戏 |《胡闹厨房 2》&lt;/li&gt;
&lt;li&gt;在玩：游戏 |《星际拓荒》&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Recent Code (6.1-6.2)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TypeScript React   11 hrs 3 mins  ██████████████▌░░░░░░  69.5%
TypeScript         4 hrs 45 mins  ██████▎░░░░░░░░░░░░░░  30.0%
Objective-C        3 mins         ░░░░░░░░░░░░░░░░░░░░░   0.3%
Bash               0 secs         ░░░░░░░░░░░░░░░░░░░░░   0.1%
Markdown           0 secs         ░░░░░░░░░░░░░░░░░░░░░   0.1%
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-5&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>周刊（第4期）：个人博客演变史</title><link>https://ursb.me/posts/weekly-4/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-4/</guid><description>回顾个人博客十余年历程：从 Wordpress、Hexo、Typecho 到用 Hugo 搭建独立周刊站的四次技术迁移，并推荐讲解浏览器原理的系列文章、CSS Triggers、悬疑小说《恶意》及番剧《间谍过家家》。</description><pubDate>Fri, 27 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;个人博客演变史&lt;/h2&gt;
&lt;p&gt;熟悉我的朋友都知道我记录的会比说的多，很多人觉得言语比文字更有力量和情感，而我却不这么觉得。情感是真情的投入，和呈现载体无关。这篇周刊，我想谈谈我个人博客的演进记录。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一阶段：Wordpress&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2014 年上半年接触编程，之后想搭建个人网站来承载 QQ 空间上的文章，上小学中学时 QQ 空间上写了蛮多东西的。之后淘到了 ursb.me 这个域名，因为那会应该舍友之间经常会对骂“你是 s* 吗?”，结果一搜还真有这个域名。因此，这四个有含义字母组成的域名，对我来说弥足珍贵。&lt;/p&gt;
&lt;p&gt;之后域名提交备案，然后搞了个“虚拟空间”搭建个人网站（对，当时叫虚拟空间，其实就是和别人同租一台服务器，用户只有某个目录的权限），第一版博客用的框架是 Wordpress，花了很多时间折腾了贼多插件，结果半年过去了文章一篇也没写。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220527231246.png&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;第二阶段： Hexo&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;反思了一下不能这么搞，于是 2015 年由繁入简，改用 Hexo + GitHub Pages 去部署博客，那段时间基本上周更写了蛮多内容的。但折腾劲一点儿也没有消退，还是搞了很多网站分析和评论的插件，这个静态网页的秒开想必也好不到哪去。折腾了这么多，结果一看站点分析，其实根本没有人评论也没有人阅读，pv 少的可怜，那点 pv 还基本都是我自己点的。饶是如此，我还是坚持在更新，没有有人也没关系，重点在于记录。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2014-2016 的具体经历可以看 &lt;a href=&quot;https://zhuanlan.zhihu.com/p/61714125&quot;&gt;从 WordPress 到 Hexo：ursb.me——个人博客折腾笔记&lt;/a&gt; （PS. 这篇文章已经 out 了，2017 年又改了技术方案）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;第三阶段： Typecho&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;直到 2017 年，我一直用的评论插件 “多说” 停止服务了，之后转用难用的网易云评论，结果没两个月也停止服务了。如果用国外的服务，又会影响读者的评论。之后思来想去，找个了轻量级的动态框架 typecho 来搭建新博客——也就是现在的 &lt;a href=&quot;https://me.ursb.me&quot;&gt;Airing 的小屋&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220527231211.png&quot; alt=&quot;&quot; /&gt;老博客近百篇文章没有迁移到新博客，仅存留本地了。新博客目标是不再灌水，记录之上输出自己的思考，所以更新频率很慢，基本上 1-2 个月才有更新，上班之后更新的就更慢了，毕竟平时工作写的技术方案也不可能发表到博客上。&lt;/p&gt;
&lt;p&gt;新博客技术文的评论区冷冷清清，但是 pv 其实和非技术文是差不多的、甚至更高，可能开发者都喜欢白嫖吧。有时候搜 Flutter 的问题，结果发现搜索结果中的第一篇文章就是自己写的，那种成就感还是挺满的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第四阶段： Typecho + Hugo&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;但其实非技术文并不要求那么高的严谨性，如果控制发文的质量反而会减少产出，减少记录的频率，迷失记录本身的目的。因此前段时间开始启动周刊项目（具体可见 &lt;a href=&quot;https://weekly.ursb.me/posts/weekly-1/&quot;&gt;WJ.1: 开刊，为什么写周刊&lt;/a&gt;），也希望自己能用输出倒逼输入。因此用 Hugo 简单弄了个静态网页才存下周刊的文件，同时同步发下公众号：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220527231119.png&quot; alt=&quot;&quot; /&gt;前两天重构下的个人首页 &lt;a href=&quot;https://ursb.me&quot;&gt;Hi, folks | Airing&lt;/a&gt;，它同时指向了我新搭建的 &lt;a href=&quot;https://weekly.ursb.me/&quot;&gt;Airing Weekly&lt;/a&gt; 和  &lt;a href=&quot;https://me.ursb.me&quot;&gt;Airing 的小屋&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220527231137.png&quot; alt=&quot;&quot; /&gt;在搭建 Airing Weekly 的时候使用了 Hugo 和一些 PaaS，工作日晚上忘记了时间折腾到一点多，折腾的时候才发现原来 Web 前端 还是这么有意思。回想起来，这份折腾的初心也恰我当年决定选这个岗位就业的原因呀！&lt;/p&gt;
&lt;h2&gt;每周推荐&lt;/h2&gt;
&lt;h3&gt;技术：Web 浏览器原理解密&lt;/h3&gt;
&lt;p&gt;四篇 Chrome 开发者官网上关于浏览器原理的讲解，图文并茂、深入浅出，值得学习。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/blog/inside-browser-part1/&quot;&gt;Inside look at modern web browser (part 1) - Chrome Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/blog/inside-browser-part2/&quot;&gt;Inside look at modern web browser (part 2) - Chrome Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/blog/inside-browser-part3/&quot;&gt;Inside look at modern web browser (part 3) - Chrome Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/blog/inside-browser-part4/&quot;&gt;Inside look at modern web browser (part 4) - Chrome Developers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;技术：触发 Reflow/Repaint/Composite 的样式&lt;/h3&gt;
&lt;p&gt;上周偶然间看到的一个报告——《 &lt;a href=&quot;https://csstriggers.com/&quot;&gt;CSS Triggers&lt;/a&gt;》，记录了各主流浏览器内核（Blink、Gecko、WebKit、EdgeHTML）会触发回流、重绘、合成的样式。&lt;/p&gt;
&lt;p&gt;这里可以发现不同内核针对不同样式的处理是存在差异的：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220527223520.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;小说：《恶意》&lt;/h3&gt;
&lt;p&gt;上周日二刷了《恶意》，即便是二刷仍然惊叹于其独特的写作手法与峰回路转的剧情发展。&lt;/p&gt;
&lt;p&gt;在不剧透的前提小结一下写作手法的创新点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;书信式第一人称自述&lt;/strong&gt;：融入大量细节与心理描写，代入感强。全程推理紧贴我们读者前文看到的内容，并在最后来一脚绝杀，以至于被绝杀之后仍沉浸于剧情中回味不穷。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;交叉递进式的书信推动剧情&lt;/strong&gt;：剧情推动依然靠书信的交替，交替时会承接上文文末的内容，所以并不突兀。然而每封书信的内容里皆在合理的前提下有着巨大的剧情转变，紧扣心弦，不断激发着读者的好奇心。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;杀人不是目的，而是手段&lt;/strong&gt;：聪明的读者可以很快推理出凶手，甚至于 1/4 篇幅时就抓住了凶手。但杀人动机的推理才是本篇的核心内容，先抓凶手再推理杀人动机，在推理小说中不常见，其中夹杂了嫌疑人的心机诡计，这让被害人的死亡并不是“结束”，而是“开始”。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;纪实：《桶川跟踪狂杀人事件》&lt;/h3&gt;
&lt;p&gt;看之前未曾想到纪实文可以写的比电影还惊心动魄、剧情比小说还跌宕起伏，而恰恰是纪实文，对被害人的遭遇才更有共情、对现实的无奈更感愤懑；而正因为是纪实，我才更加钦佩于作者这样的记者，胸怀正义地投入事业，在黑暗的现实里永远追逐光芒。&lt;/p&gt;
&lt;h3&gt;番剧：《间谍过家家》&lt;/h3&gt;
&lt;p&gt;最近逢人就安利《Spy x Family》，剧中一家三口设定立体、各有萌点，三者身份的冲突，混合在一起之后奇迹般的爆发出魔法般的效果，轻松、诙谐，又带点小温暖。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220527222729.png&quot; alt=&quot;&quot; /&gt;扩展阅读：&lt;a href=&quot;https://www.bilibili.com/read/cv16616137?from=category_4&quot;&gt;【影评】间谍过家家：日常与非日常的二重奏&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;先行者（Pioneers）思想&lt;/h3&gt;
&lt;p&gt;1970 年代的先行者思想的三个要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;放大想象力（Amplify Imagination） ——Alan Kay&lt;/li&gt;
&lt;li&gt;增强智力（Augment Intellect）——Douglas Engelbart&lt;/li&gt;
&lt;li&gt;让思想不限于载体（Expand our Thoughts far beyond text on paper） ——Ted Nelson&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;前两点也是我很看重的，而第三点我没有特别多的感觉，应该指的是要懂得从书本之外会获取知识。&lt;/p&gt;
&lt;p&gt;如果要我写三点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;知识&lt;/li&gt;
&lt;li&gt;敏感&lt;/li&gt;
&lt;li&gt;想象力&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-4&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>周刊（第3期）：花束般的恋爱</title><link>https://ursb.me/posts/weekly-3/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-3/</guid><description>借电影《花束般的恋爱》，写给刚结束的一段20.5天恋情的告别信，探讨爱情的本质、为何需要爱情、维系亲密关系的纽带，以及失去爱情后该如何自处。</description><pubDate>Sat, 21 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本期周刊原本准备的内容并非是这个，昨晚临时换了，决定通宵写这篇。这期周刊是迟来的“官宣”，也是“告别书”，以纪念我刚刚逝去的“花期”仅 20.5 天的爱情。&lt;/p&gt;
&lt;p&gt;虽然认识的时间不长，在一起的时间也很短暂（5.1-5.21），但是很感谢你给予我的一切，这是我经历过的最甜美的感情，满足了我这些年来对爱情一切的幻想。此外，也很想对你补充句对不起，我没有呵护好这段情感让它夭折了，你决绝而又体面地转身离开，让它永远地停留在了最美的日子里。谢谢你。&lt;/p&gt;
&lt;p&gt;这期周刊是迟来的《花束般的恋爱》的观后感，这是我们唯一一场，在电影院里看过的电影。你当时偏要看这部，我却说结局是 BE 不想看。但无论是当时看完、还是此时此刻，《花束般的恋爱》向我展示的那个爱情最甜美的模样，一直一直埋在我心底，成为我的憧憬。之所以一直没写这篇观后感，也是不好意思以文字的形式去表达爱意，也从来没有写过文章去讨论过情感。&lt;/p&gt;
&lt;p&gt;而事已至此，往事已矣。今天假借周刊补上“官宣”，同时结合《花束般的恋爱》来谈谈我对爱情的理解。&lt;/p&gt;
&lt;p&gt;麦和绢是两个极其合拍的人，在一次偶然的机会下两人相遇、相识、相知、相恋，他们度过了一两年极其甜蜜的时光。大学毕业之后，麦沦为社畜改变了很多，顶着升职加薪的压力一直向“钱”，不再记得《宝石之国》的剧情、《黄金神威》追到第七卷之后就没有再看了、不再和绢讨论今村夏子的新作，而绢一如学生时代的少女一般，可以辞掉体面的职业去追逐着自己喜欢的工作、看自己喜欢的话剧、追着小说和漫画。&lt;/p&gt;
&lt;p&gt;节奏的不一致、价值观的分歧，最终导致感情在第五年时走到了终点。分别之际，麦向绢求婚。麦的逻辑是恋爱谈不下去了，就结婚吧；婚姻维持不下去了，生个孩子吧；孩子也不行的话，那就凑合着过吧。反正爱情会变成亲情，不都这样么？&lt;/p&gt;
&lt;p&gt;确实如此呀，喧嚣嘈杂快餐式环境下的现代年轻人在一道一道程序里走过这一生，一次一次受挫之后一次一次地降低标准、不断妥协、一直让步，用一个黑洞堵住另外一个黑洞，直到自己也迷失在无边无尽的黑夜里。&lt;/p&gt;
&lt;p&gt;而绢还是那个纯心依旧的女孩，对爱情有着憧憬的少女，哪怕对方是自己最爱的人，忍着泪也拒绝了求婚，决绝分手了。正印证了那句：“结束的恋爱是必然，不结束是偶然”。麦和绢无比合拍、令人羡慕的一对情侣，最终走向了 BE 结局。&lt;/p&gt;
&lt;p&gt;这便是《花束般的恋爱》的整个故事。&lt;/p&gt;
&lt;p&gt;接下来我将尝试回答四个问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;爱情是什么？&lt;/li&gt;
&lt;li&gt;为什么我们需要爱情？&lt;/li&gt;
&lt;li&gt;爱情的纽带是什么？&lt;/li&gt;
&lt;li&gt;失去爱情之后，要如何自处？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;爱情是什么？&lt;/h2&gt;
&lt;p&gt;首先，尝试回答一个问题没有答案的问题——爱情是什么？&lt;/p&gt;
&lt;p&gt;你一直抱怨是因为麦改变了，所以神仙情侣的爱情走向了终局。但我想说，麦没有错，绢也没有错，这就是现实。爱情本质上不过是荷尔蒙导致的愉悦情绪，这是短暂的、来得快去得也快，如果想要维持爱情，或许可以采用小别胜新欢、更强烈的荷尔蒙刺激等形式来短暂维持，但是最终的最终，它还是会消散。&lt;/p&gt;
&lt;p&gt;在周刊第一期，我曾引用《重庆森林》里的一段话：“不知道从什么时候开始，在每个东西上面都有一个日子，秋刀鱼会过期，肉酱会过期，连保鲜纸都会过期。 我开始怀疑，在这个世界上，还有什么东西是不会过期的？”&lt;/p&gt;
&lt;p&gt;没错，万事万物都是有保质期的，以科学的视角来看，爱情的保质期最长是 18 个月，最短的如你所言，是 21 天。而我们停留在 20.5 天，爱情还在的时刻。&lt;/p&gt;
&lt;p&gt;那在有保质期的大前提下，爱又能是什么呢？&lt;/p&gt;
&lt;p&gt;今泉力哉诠释到“爱是「一瞬の夢」”，灵魂交融的某一瞬间，那如梦似幻瞬间所对应的时刻的精准感受，便是“爱”。&lt;/p&gt;
&lt;p&gt;那一瞬，是看大马戏时身旁的你，欢喜的掌声和笑容。&lt;/p&gt;
&lt;p&gt;那一瞬，是坐火箭过山车时，你尖叫中紧握住我的手。&lt;/p&gt;
&lt;p&gt;那一瞬，是凌晨四点告白时，黄埔大道那不灭的灯火。&lt;/p&gt;
&lt;p&gt;那一瞬，是雨夜珠江边上，一齐撑伞漫步的诗情画意。&lt;/p&gt;
&lt;p&gt;那一瞬，是很多破碎和心痛的开端。&lt;/p&gt;
&lt;p&gt;没错，世界上一切的一切都是有保质期的，而「那一瞬」于我而言，即是永恒。&lt;/p&gt;
&lt;p&gt;那如梦似幻的一瞬，于我而言，便是爱情。&lt;/p&gt;
&lt;p&gt;爱情是一个个发生了积极共鸣的微小瞬间，是发生在彼时彼刻某时刻真实的、积极的、愉悦的体验。也就是说，「“永远”大概只是表达一种程度，“我永远爱你”的意思是，我在那一瞬间觉得我永远爱你了。」爱便是那一瞬间的感觉。&lt;/p&gt;
&lt;p&gt;但需要区别是，这种爱情并不是一瞬间混沌时的冲动，而是我在那一瞬间感觉到的永恒。于是，会去构想未来种种细节，构筑属于我们的爱情大厦。即便未来某一瞬间因为种种原因导致它轰然倒塌了，在难过与痛苦之后，我也不会忘记构筑它时的欣喜和期盼。&lt;/p&gt;
&lt;p&gt;这便是我眼中的爱情，不用纠结过去、永恒与未来，很多事情没有结局，就已经是我们当时力所能及最好的结局。&lt;/p&gt;
&lt;h2&gt;为什么我们需要爱情？&lt;/h2&gt;
&lt;p&gt;第二个问题，尝试解答一下为什么我们需要爱情？严格来说，这是从我的角度来解读的，可能并不能代表普罗大众的爱情诉求。那么问题可能要改成：为什么我需要爱情？&lt;/p&gt;
&lt;p&gt;上一段恋情还是 17 年了，也是匆匆了断，我甚至会想自己是否或许不适合恋爱。这五年来一直在不断追寻，那么为什么我们要追寻爱情？&lt;/p&gt;
&lt;p&gt;于我而言，因为害怕孤独。《岛上书店》有段话我特别喜欢：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;因为从心底害怕自己不值得被爱，我们独来独往。然而就是因为独来独往，才让我们以为自己不值得被爱。有一天，你不知道是什么时候，你会驱车上路。有一天，你不知道是什么时候，你会遇到她。你会被爱，因为你今生第一次真正不再孤单。你会选择不再孤单下去。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;被爱之后，我发现被重视的感觉是多么美好，原来这世界上还可以有一位那么美好的人会重视孤独的我。于是，我一直在寻找那个人。&lt;/p&gt;
&lt;p&gt;快餐时代的恋情讲究广泛捕捞、迅速淘汰，有句话是这么说的：「如果不将就的话，你会一点点变老。生活会变得更艰难，你会更孤单。」&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220522040651.png&quot; alt=&quot;&quot; /&gt;但我不会将就，我期待爱情到来的那一瞬间。但或许吧，不将就或许一辈子也不会遇见什么爱情，不会拥有「一瞬の夢」；也或许永远都不会有人爱我；但也或许，过得怎样，与此无关。&lt;/p&gt;
&lt;p&gt;我寻求的期盼，是真实的体验，不是「一瞬の夢」，而是「一瞬の真实」。&lt;/p&gt;
&lt;p&gt;被人所珍视的感觉，会让我摆脱孤单情愫，会让我的的确确、切切实实的感觉到自己活着。是真实，而不是梦。我不愿回忆起过往，如同虚幻的梦境。我每天都会写日记；和你在一起时额外的还会每天写手账；日程会用「ATracker」记录真实的时间经历到日历中，精确到秒；行走的路径会用「足迹」静默采集我的 GPS 信息。&lt;/p&gt;
&lt;p&gt;为什么我在大数据时代还冒着风险时刻记录自己的行为日志？因为这会让我感觉到，我是真实地在这个世界上存在着。&lt;/p&gt;
&lt;p&gt;除此之外还有一个很重要的原因，我是一个极其注重体验的人，在之前的博客中我曾经写到“生命的意义在于体验”，在于此时此刻最真实的人生体验。&lt;/p&gt;
&lt;p&gt;《岛上书店》有这么一段话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“我们不是我们所收集的、得到的、读到的东西，只要我们还活着，我们就是爱，我们所爱的事物，我们所爱的人。所有这些，我认为真的会存活下去。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;生命的意义并不是由所谓的“人生大事”来赋予的，而是落实到生活中无常的琐碎。这就是我的生命，我的意义。所以我想记录每一个瞬间，无论是快乐的也好、悲伤的也罢，每年年度总结中我都会晒出那一年的心情年历。因为，那就是我那一年最真实的瞬间。每每回忆起那些瞬间时，我都能真切地感受到彼时彼刻的场景与我的情绪，由此，我才能真切地感受到，我是真实地存在着的。&lt;/p&gt;
&lt;p&gt;唯一确信的存在是当下，唯一重要的是现在、是此时此刻的感受。人首先必须存在，才谈得上有关人生的一切。我重视收集回忆的点滴，是因为我重视自己的存在与人生。&lt;/p&gt;
&lt;p&gt;就此话题再回溯一下主题，人与人的灵魂，确实是很难相通的，不是通过简单的特征就能互相打符号标签的。就譬如我是 INFJ，无论怎么测都是 INFJ；你是 ENFP，闭着眼都能看出你是 ENFP。理应是天造地设的一对，但也仅仅只是理论标签的。&lt;/p&gt;
&lt;p&gt;如果剥去我们身上的各种标签，还能依然相爱，且越来越爱，那爱的才是最真实的对方。&lt;/p&gt;
&lt;h2&gt;爱情的纽带是什么？&lt;/h2&gt;
&lt;p&gt;第三个问题，维系亲密关系的纽带是什么？&lt;/p&gt;
&lt;p&gt;这个问题我曾思考过，并写下了七个点发给你：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;情谊&lt;/strong&gt;：彼此之间互有情愫，这是一切的基础&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;真诚&lt;/strong&gt;：真诚的态度，保持坦诚沟通，不要封闭自己的心&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;理解&lt;/strong&gt;：在坦诚的基础上，相互理解，能够体谅对方&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;信任&lt;/strong&gt;：在理解的基础上，彼此相互信任&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;陪伴&lt;/strong&gt;：不离不弃，陪伴是最长情的告白&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分享欲&lt;/strong&gt;：有充足的分享欲，自己亲身体验的一切，都想和对方分享&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同频&lt;/strong&gt;：有共同的兴趣爱好，有相近的成长方向，有一起努力的目标&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;积极&lt;/strong&gt;：乐观开朗，做对方彼此的太阳&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们两人每一个点做的都很好，但还是分开了，可能我这份答卷根本就不对吧。&lt;/p&gt;
&lt;p&gt;确实，亲密关系主要是一个不断磨合、不断升级的、自我披露的互惠过程。在这个过程中，每个人都感觉到自己内心深处被对方验证、理解和关心。当双方都将伴侣最终由此将对方纳入自我，会形成一种相互依存结构，意味着个体对伴侣的爱会成为彼此的动力、彼此生活中最重要的一部分。&lt;/p&gt;
&lt;p&gt;我一旦陷入便会不计后果地全力去爱，但今晚我的朋友和我说这段时间的我已然不像是我了。他说我人生的优先级全都变了，把爱情放于首位其余的全都顺延置后了，而投入的太多，其余的只剩下太少。周末和日常下班鲜有时间去学习，日常鲜有时间陪伴朋友一齐玩耍，甚至于冷漠了一些回应和求助。&lt;/p&gt;
&lt;p&gt;我于此无可奈何，在我心中这个顺位是一定没有问题的。我知道什么是我想要的，知道什么于我而言是最重要的。我时常内省，时常想保持最优秀的自己，不断前进前进。而我遇到爱情时，迷失了前进的方向。&lt;/p&gt;
&lt;p&gt;我不知道这是对是错，可能根本不存在对错。但我也不知道这样的自己会错过什么、会留下什么遗憾，也不知道该用什么方式去实现梦想，我不知道命运会把我带向何方。只能跟着感觉，一步步前行，全由你的爱意提供原动力。&lt;/p&gt;
&lt;h2&gt;失去爱情之后，要如何自处？&lt;/h2&gt;
&lt;p&gt;最后一个问题，失去爱情之后，要如何自处？这其实也是自己现在，最想探讨的问题。&lt;/p&gt;
&lt;p&gt;之前找房时有过感慨，找了这么多中介，最终只有最后一个中介能拿到中介费，哪怕之前的中介再辛苦，给我用心找了再好的房子，带我看了再多的房子，那也极可能是无用功，因为只有最后那个中介能拿到钱。&lt;/p&gt;
&lt;p&gt;对比来看，每段恋情都是下一段的养料，最终只为了那位最正确的对象服务的。因为最终的真爱，能步入婚姻殿堂走向 HE 的，也就只有一位。&lt;/p&gt;
&lt;p&gt;那么之前的一切，就都是没有意义了吗？&lt;/p&gt;
&lt;p&gt;不是的。&lt;/p&gt;
&lt;p&gt;最开始找房的时候，我其实没有标准，一位一位中介不断带我看了房子，我才知道自己喜欢的原来是客厅通阳台、小区有班车、大客厅、阳光卧室的需求。这里面每一个点，都是一次次不断总结出来的，最终才找到了现在的可能是最合适的房子。&lt;/p&gt;
&lt;p&gt;而恋情如果做个不太合适的类比，每一段都给我带来了成长与遗憾。正如我去年玩《寻找天堂》所体会到的那样：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;关于孤独，Faye 离别时说无论如何，孤独的时刻总是会来。可这就是成长的一部分，也是人生的一部分。它让我们与我们所爱的人相处的每个瞬间都无比珍贵，让我们的回忆价值千金。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;关于选择，Sopia 说人的一生如此短暂，我们不可能完成每一件想做的事。无论我们做了什么，总有其他东西值得一试，总有另一条路值得一走。所以到最后，我们能做的，也是必须做的，是满足于自己所选择的路。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;关于遗憾，Colin 临终前说：“那些我错过的机会，那些小意外，和我所有未竟的愿望…是的，它们还是我的遗憾。可它们让我拥有了现在的一切。而我所拥有的一切…无论什么都换不走。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;每个人都身陷孤独，但却恣意妄为。我想，人呢，只要看穿了这个世界的矫饰，世界便会属于你。
珍惜当下，珍惜此时此刻，珍惜身边的一切。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我们会和一个人恋爱，其实只是正好满足了自己某些需要的特质。这种人在世上还会有很多，所以不存在什么命中注定的唯一的爱情。但恰恰就是在那个时刻，我就是遇到了你，而不是什么别的人，这就是缘分。&lt;/p&gt;
&lt;p&gt;但我可能不能和你走到最后，我总是说着全力去爱不要留下遗憾就好。此刻才发现，大概无论怎么选择都还是会遗憾。&lt;/p&gt;
&lt;p&gt;这就是遗憾，是 Colin 临终的遗憾，是 Sopia 没有选择的路，但同时也是 Faye 最最最最珍视的瞬间，也是我最最最最最珍重的体验。&lt;/p&gt;
&lt;p&gt;我们每个人都是独特的个体，每一段记忆都无法被复制，也不可能会重来。我能做的，只剩下去珍视它，把它好好地珍藏在自己的秘密匣子里。当未来某一天，偶然间拿起来它时，我能&lt;/p&gt;
&lt;p&gt;回忆那看大马戏时的一瞬；&lt;/p&gt;
&lt;p&gt;回忆起坐火箭过山车时的一瞬；&lt;/p&gt;
&lt;p&gt;回忆起凌晨四点告白时的一瞬；&lt;/p&gt;
&lt;p&gt;回忆起是雨夜珠江边上的一瞬；&lt;/p&gt;
&lt;p&gt;回忆起那「一瞬の夢」时，还能体验到那真切、由衷的喜悦之情，便是我的人生意义。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220522023008.png&quot; alt=&quot;&quot; /&gt;如果让我再选一次，还是会追上你，哪怕最后的结局只是体面分手。&lt;/p&gt;
&lt;p&gt;回到主题，为什么这部剧、这篇文章叫《花束般的恋爱》？&lt;/p&gt;
&lt;p&gt;我以前很讨厌别人送花，毕业典礼时明确要求好朋友不要送花，哪怕要送也送干花。因为我受不了花朵枯萎的过程，我知道它现在很美丽，但是我忍受不了它枯萎时的模样。&lt;/p&gt;
&lt;p&gt;但是这个刻板印象最终在被我自己打破了，在为你准备鲜花时我才发现——原来鲜花那么美丽、送给那么美好的你是多么美好！&lt;/p&gt;
&lt;p&gt;这或许就是鲜花的价值——即使爱情的花束会凋零，但它还是用力地、无比绚烂地绽放过。尤其，是当这束鲜花是精心的礼物。&lt;/p&gt;
&lt;p&gt;而恋爱最珍贵的纪念物，是你留在我身上的、如同河川留给地形的，你对我造成的改变。&lt;/p&gt;
&lt;p&gt;那些读过的书本、看过的电影、听过的音乐、吃过的美食、逛过的公园、看过的演出、爱过的人，它们早已融入了我的血与肉，塑造了我的现在，成为了我身体的一部分。这 20.5 天的花期，已然融入我的血肉中、我的习惯中，成为我未来生活的一部分。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220522012103.png&quot; alt=&quot;&quot; /&gt;深爱的你消失于分手的那一刻，心中的爱与思念都只是属于自己曾经拥有过的纪念。我知道有些事情是不能遗忘的，有些事情是值得纪念的，有些事情是能够心甘情愿的，而有些事情是无可奈何的。&lt;/p&gt;
&lt;p&gt;我总是不珍惜眼前人，在未可预知的未来里，我以为我们总会保持联系、总会一定再见、总会有机会说一句对不起、总以为过了今天一切都会好起来，但是我从没想过每一次挥手道别都可能是诀别。&lt;/p&gt;
&lt;p&gt;所以最后的最后，请各位珍惜眼前的一切、珍视自己最真实的体验、珍重那「一瞬の夢」。&lt;/p&gt;
&lt;p&gt;谢谢你曾给予我的爱情——花期 20.5 天的美好花束。&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-3&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>周刊（第2期）：重拾失去的好奇心</title><link>https://ursb.me/posts/weekly-2/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-2/</guid><description>结合两篇讨论好奇心的文章,分析好奇心因岁月修剪与技术截除而消退的原因,并以达芬奇为例总结勤于观察、延伸世界接触与拓展思考三种保持好奇心的方法。</description><pubDate>Sat, 14 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;重拾失去的好奇心&lt;/h2&gt;
&lt;p&gt;前两天读到了两篇关于好奇心的文章——&lt;a href=&quot;https://sspai.com/post/72878&quot;&gt;《长大后，如果是时间修剪了我们的好奇心，我们应该责怪时间吗？》&lt;/a&gt;、&lt;a href=&quot;https://sspai.com/post/72993&quot;&gt;《重新理解「好奇心」：学习动机的自救指南》&lt;/a&gt;，那本期周刊就结合这两篇文章来简单谈一谈「好奇心」。&lt;/p&gt;
&lt;p&gt;首先，先来介绍下这两篇文章的核心内容：&lt;/p&gt;
&lt;p&gt;关于好奇心的形成，文章中谈到「好奇心，就是驱使人类去获取知识的情绪动力」，它「被激发时，会同步刺激尾状核，然后分泌让我们快乐的多巴胺，进而让我们产生愉悦感」。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;好奇心是我们通往知识，总结规律的原初动力&lt;/strong&gt;。但让人遗憾的是，随着年龄的增长，我们的好奇心会越变越少，再提不起读书的兴趣。它就像一只精灵，让人捉摸不透，在我们成长的不经意间，就消失不见。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;关于好奇心的失去，文中认为有两点原因：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;内部原因：被岁月修剪&lt;/li&gt;
&lt;li&gt;外部原因：被技术截除&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所谓「被岁月修剪」，文章写道「我们接收到信息一定是有偏颇和误差的，人们更愿意接受和自己想法、立场一致的信息（认知偏差），因而逐渐封闭了自己的认知」。其实就是融入社会之后，有条件地摄取那些符合我们认知模型的信息，由此而形成的信息茧房，让我们不断不断强化信念，从而逐渐失去好奇。「因为社会规训，我们的好奇心被不断修剪；又因为忙碌，我们的好奇心被逐步耗竭。」&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220514120310.png&quot; alt=&quot;&quot; /&gt;所谓「被技术截除」，文中举了个例子：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;互联网的搜索功能和算法功能，可以让你轻松找到任何想获得的信息，你可能刚输入了第一个字，搜索栏下就弹出了你最可能搜索的问题列表，甚至你还没有开始输入，搜索平台就已经呈现出了你想要的内容。就像哆啦 A 梦的任意门，你一起心动念，下一秒就到了你心之向往处。殊不知，去往目的地的沿途的景色，或者中途临时起意地一次探索，更让人惬意和弥足珍贵。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;互联网的高效和瞬时，截除了许多我们对世界的接触的机会，从而截除了我们产生好奇的可能性。&lt;/p&gt;
&lt;p&gt;以上两篇文章还谈及了好奇心的分类与病态型好奇，本期不再扩展去介绍，有兴趣的读者可以直接阅读原文。我这里想谈谈「好奇心的培养」。&lt;/p&gt;
&lt;p&gt;之前看《列奥纳多·达·芬奇传》的时候才发觉到达·芬奇真的很厉害，原本只知他是个画家，但除此之外他在音乐、建筑、数学、几何学、解剖学、生理学、动物学、植物学、天文学、气象学、地质学、地理学、物理学、光学、力学、发明、土木工程等领域都有显著的成就：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;天文学方面，他猜想了「太阳不动」的日心说，这比哥白尼早 40 年；&lt;/li&gt;
&lt;li&gt;物理学方面，他发明了液压的联动器装置，比牛顿早200年提出重力的概念；&lt;/li&gt;
&lt;li&gt;光学方面，他第一个提出光和声音一样是一种波，而且光速是有限的；&lt;/li&gt;
&lt;li&gt;建筑学方面，他是桥梁、教堂、城堡、下水道的设计师，同时他最早提出了人车分流的设计理念；&lt;/li&gt;
&lt;li&gt;气象学方面，发现折射现象并解释天空为什么是蓝色的；&lt;/li&gt;
&lt;li&gt;军事方面，他发明过直升机、飞机、降落伞、机关炮、手榴弹、潜水艇、坦克、起重机和潜水装备。虽然未必都造了出来，但是那些图他早早地就都画好，他做的变速箱就是现在所用的汽车变速箱的原理。&lt;/li&gt;
&lt;li&gt;……等等&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;读到这些的时候，我甚至会产生他是不是穿越过来的人，为什么他一个人能发现、发明这么多东西。书中给出了解释，他的笔记手稿近 3 万余页，从现存的手稿中来看，达·芬奇是一个特别好奇的人，他会抓住一切机会向各式各样的专业人才请教他们专业的问题，每天生活在提问和探寻之中。直到临终前在日记中留下了这样的绝笔：「明天一天要搞清楚啄木鸟的舌头究竟是什么形状」。&lt;/p&gt;
&lt;p&gt;我们现在人有人想过类似的问题吗？或许有，但只要一去搜索引擎去搜索立马就会出来答案。这是一个方便的年代，也是磨灭我们好奇心的年代。达·芬奇始终对这世界一切都饱含着兴趣，但他享受的不仅仅是问题的答案，而是探索答案本身的过程。他曾经画满了169页各种画圆为方的尝试、为探索一个问题几年不曾收手。他是非常愉快地、投入地处在心流状态当中度过他完美的一生。&lt;/p&gt;
&lt;p&gt;上一个给我留下如此深刻印象的人物还是维特根斯坦。哲学的起源亦是对世界的好奇，求知是所有人的本性，人是由于好奇而开始哲学思考的。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;不论现在还是最初，人都是由于好奇而开始哲学思考，开始是对身边所不懂的东西感到奇怪，继而逐步前进，而对更重大的事情发生疑问，例如关于月象的变化，关于太阳和星辰的变化，以及万物的生成。——亚里士多德&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;世界上的大部分知识对我们而言可能不需要知道，因为对生活没有任何实际用处。而这一切只是因为好奇，纯粹的好奇。&lt;/p&gt;
&lt;p&gt;那么于我们而言，如何保持好奇心呢？我小结了三点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;勤于观察，穷追到底&lt;/li&gt;
&lt;li&gt;延伸自己与世界的接触&lt;/li&gt;
&lt;li&gt;拓展思考&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;勤于观察，穷追到底&lt;/strong&gt;。这要求我们要时刻怀有孩童般的惊奇，保持敏锐的心勤于观察，不断地追问，「Stay hungry, stay foolish」，直到满足自己的求知欲。「学问」为什么叫「学问」？就是因为，问，才是更重要的。那么我们要追问什么呢？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;延伸自己与世界的接触&lt;/strong&gt;。对一切新事物不断去思考它是什么？它会带来什么？它意味着什么？它能够跟我产生什么样的联系？ 绝大多数的机会，都是从各种各样的可能性中，孕育、碰撞而产生的，尽量去碰撞出世界之物与我之间的关联，从而产生「触点」。那么得到答案之后，我们要做什么呢？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;拓展思考&lt;/strong&gt;。就是要发现更大的空间和更多的可能性，针对得出答案不断地提出新问题。并且针对这些问题，去寻求信息，更新自己的认知，获取更多的「触点」，将它们连接在一 起，不断拓展自己的认知网络。而不是满足于它所呈现给你的风景，就此止步不前。之前说技术会截除好奇，搜索的便捷性会让我们止步于某处。但其实只要保持拓展思考的意识，主动追寻、善用技术，会发现技术不仅没有挤压好奇心，反而还给好奇心插上翅膀，让我们在信息的海洋和森林里自如穿梭，迸发出更强大的创造力和生命力。&lt;/p&gt;
&lt;p&gt;综上，一切好奇心，皆始于观察。发现惊奇之物，要不断追问它的性质与它与我的联系，从而去碰撞可能性。最后拓展思考，去发现更大的空间和更多的可能性，就像旋转的漩涡一样，越来越大，从而不断循环孕育出更多的好奇。&lt;/p&gt;
&lt;h2&gt;每周推荐&lt;/h2&gt;
&lt;h3&gt;软件：AltTab（macOS）&lt;/h3&gt;
&lt;p&gt;Mac 在不同窗口间切换比较麻烦，Cmd+ Tab 没有预览页面，且只能切换应用，无法切换应用内的各个窗口。&lt;/p&gt;
&lt;p&gt;而 &lt;a href=&quot;https://alt-tab-macos.netlify.app&quot;&gt;AltTab&lt;/a&gt; 可以完美解决 macOS 的这个痛点，使用 HomeBrew 即可安装：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew install alt-tab
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后按住 Alt + Tab 即可切换系统下的各个窗口（同一应用也可），且提供了实时的预览图，方便用户准确切换到自己预期的窗口。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220511221000.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;软件：Context（macOS）&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://contexts.co/&quot;&gt;Contexts&lt;/a&gt; 和 AltTab 属于竞品关系，老牌的「上下文」切换应用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220514133901.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Flutter 3.0 发布&lt;/h3&gt;
&lt;p&gt;周三 Google I/O 上发布了 Flutter 3.0，主要特性为多平台友好， 本版本开始支持构建 macOS 与 Linux App。值得深思 Electron 将何去何从？&lt;/p&gt;
&lt;p&gt;参考阅读：&lt;a href=&quot;https://medium.com/flutter/whats-new-in-flutter-3-8c74a5bc32d0&quot;&gt;What’s new in Flutter 3 | Medium&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;React 状态管理类库&lt;/h3&gt;
&lt;p&gt;最后，推荐一些当下流行的 React 状态管理类库：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://redux.js.org/&quot;&gt;Redux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/pmndrs/zustand&quot;&gt;Zustand&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/pmndrs/jotai&quot;&gt;Jotai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://recoiljs.org/&quot;&gt;Recoiljs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mobx.js.org/README.html&quot;&gt;Mobx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220514133624.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/statelyai/xstate&quot;&gt;XState&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220514133641.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-2&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>周刊（第1期）：开刊，为什么写周刊</title><link>https://ursb.me/posts/weekly-1/</link><guid isPermaLink="true">https://ursb.me/posts/weekly-1/</guid><description>周刊开刊记，说明作者为何决定从耗时费力的长篇博客转向更轻量、更频繁的定期周刊输出，并分享了关于事物必然过期的感悟与任天堂游戏设计理念。</description><pubDate>Sat, 07 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;为什么写周刊&lt;/h2&gt;
&lt;p&gt;我&lt;a href=&quot;https://me.ursb.me/&quot;&gt;博客&lt;/a&gt;中都是些比较「重」的文章，每篇大概 4000 字起步，同时为了保障自己博客文字的质量，写作起来略感负担，需要耗费比较多的精力和时间。&lt;/p&gt;
&lt;p&gt;记得前两年给自己设定了每月写一篇博客的 Flag，但是只坚持了 6 个月便断更了，因为自己工作忙起来之后，实在是抽不出连续的、大段的时间去沉静下来写文章。回顾起来，我能够稳定能输出文章的时间，都是五一长假、国庆长假。如此便导致文字输出的频率太低、同时主题单调，违背了写博客输出的初衷。&lt;/p&gt;
&lt;p&gt;在 &lt;a href=&quot;https://me.ursb.me/archives/2021.html&quot;&gt;2021 年度总结&lt;/a&gt; 一文中，曾说过我这儿知识的「输入—输出」链路——平时阅读时我用「Drafts」快速地做摘录，这是「碎片摄取」；之后以每周为周期再进行「定期整合」，梳理到「LogSeq」中。&lt;/p&gt;
&lt;p&gt;如下图，是简单整理之后的笔记：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220507110437.png&quot; alt=&quot;&quot; /&gt;但我感觉这样还仅仅只是「输入」，并没有发散自己的想法做到好的「输出」，也总有朋友吐槽我的产出太少。写博客是我喜欢的「输出」方式，但是我想要另一种更轻量、更频繁的方法输出自己的文字来表达自我，就像我  2014-2017 年那时候的老博客一样，满是随笔、无需雕琢。&lt;/p&gt;
&lt;p&gt;上周我在博客中偶然发现，自己有个读者的网站里有一个 &lt;a href=&quot;https://4ark.me/post/weekly-01.html&quot;&gt;周刊专栏&lt;/a&gt; ，还发现有一些同学的 &lt;a href=&quot;https://www.codedump.info/post/20220116-weekly-1/&quot;&gt;周刊&lt;/a&gt; 同时也兼顾了一定的深度和思考，我非常喜欢定期输出与分享的这种形式。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;让读书产生好处的最简单办法是，一旦有灵感和想法之后，马上写出来，公开发布在社交媒体上，即使不成熟也没关系。写的过程也是自己深度思考的一个步骤，外人的有价值评论可帮你不断推敲，或给你带来新的线索，积累多了自然会出深刻的洞见。一个人孤立封闭的傻读写笔记，很难迅速提高思考深度。—— &lt;a href=&quot;https://weibo.com/5339148412/L6LhDE7Zu&quot;&gt;硅谷王川的微博&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;思考到最后，我还是决定写周刊。虽然很可能偶尔会鸽那么个一两期，但既然开刊了，就以这种定期输出的方式来鞭策自己前行。它于我的意义，便是反向鞭策自己高效输入，同时拉近读者之间的距离。我发现自己博客中兼顾了生活文和技术文，但读者更喜欢看我的生活文，尤其是每年的年度总结阅读量最高。哈哈，总有同学每年年尾都在催更年度总结。&lt;/p&gt;
&lt;p&gt;好了，现在开刊的动机有了，那么周刊中会分享些什么呢？&lt;/p&gt;
&lt;p&gt;如果单单只是笔记的分享和推荐的堆砌，没有质量起不到输出的效果。因此，每期周刊会分为两个部分：主题思考与推荐分享。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主题思考：会定制一个主题，它是周刊的主体内容，我会分享关于这个主题的现象和思考，如同随笔一般，比如本期的主题其实就是「为什么写周刊」。&lt;/li&gt;
&lt;li&gt;推荐分享：大致会分为技术分享和生活分享，技术分享我看到的好工具、高质量的技术文章、工作中遇到的技术难点和细节；生活分享会分享自己的经历、阅读的内容和思考。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那么接下来就是“安利”环节啦~&lt;/p&gt;
&lt;h2&gt;每周推荐&lt;/h2&gt;
&lt;h3&gt;关于过期&lt;/h3&gt;
&lt;p&gt;上周看完了《悖论 13》，世界末日的场景下主角团遇到了食物过期短缺的问题，由此想到了《重庆森林》里的一段话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;不知道从什么时候开始，在每个东西上面都有一个日子，秋刀鱼会过期，肉酱会过期，连保鲜纸都会过期。 我开始怀疑，在这个世界上，还有什么东西是不会过期的？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在这个世界上，还有什么东西是不会过期的呢？没有永恒的存在。&lt;/p&gt;
&lt;h3&gt;关于任天堂的游戏&lt;/h3&gt;
&lt;p&gt;上周看到了一个关于&lt;a href=&quot;https://www.bilibili.com/video/BV1HS4y1a7ce?spm_id_from=333.880.header_right.fav_list.click&quot;&gt;任天堂的视频&lt;/a&gt;  ，大家只要说到任天堂的游戏，就会立刻想到一个字——「好玩」。而正式横井军平奠基了任天堂的游戏风格：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“回避游戏创意不足的一条捷径就是参与CPU、画质、音质的竞争，用高性能来弥补游戏本身的不足”——横井军平&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;说到底，游戏性才是一个游戏最纯粹地去吸引玩家的东西。而扩大人口战略，也注定了任天堂的游戏都是老少咸宜、甚至是低幼的。关于这一点任天堂美国总裁Reggie Fils-Aime在接受《多伦多星报》采访时表示：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“我们非常高兴我们的竞争对手不关注孩子们和家庭游戏市场，这其实是一个非常重要的市场，因为现在5、6岁的孩子将来他们会长大，当他们十几二十岁时依然会是我们的忠实用户。而当你与你的家人一起玩《星之卡比》《塞尔达传说》或是《超级马里奥赛车》时，更能增进家人间的感情。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;而国内的环境则很难诞生出这样伟大的游戏公司——限发游戏版号，一纸通告就能废掉一个行业，弄人心惶惶，刑不可知，则威不可测。于是大家都想着捞快钱，变着花来玩各种氪金玩法，真的很难再诞生出一款优质的国产游戏了。&lt;/p&gt;
&lt;p&gt;推荐观看：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1HS4y1a7ce?spm_id_from=333.880.header_right.fav_list.click&quot;&gt;这个视频让你明白，任天堂到底有多牛？【生意02】&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1dt411W7Zf?spm_id_from=333.999.0.0&quot;&gt;【游戏众生相】游戏界的唯一神！任天堂的过去、现在与未来！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sohu.com/a/236726930_100161178&quot;&gt;任天堂表示：很高兴我们的竞争对手不关注低龄和家庭游戏市场&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>引擎剖析：JS 中的字符串转数值</title><link>https://ursb.me/posts/js-string-to-number/</link><guid isPermaLink="true">https://ursb.me/posts/js-string-to-number/</guid><description>梳理 JavaScript 中字符串转数值的九种写法及其运行结果与性能差异，并从 V8、JavaScriptCore、QuickJS 等主流引擎源码层面，剖析 parseInt、parseFloat 等方法背后的底层实现原理。</description><pubDate>Tue, 03 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;JS 中，字符串转数值的方式有以下 9 种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;parseInt()&lt;/li&gt;
&lt;li&gt;parseFloat()&lt;/li&gt;
&lt;li&gt;Number()&lt;/li&gt;
&lt;li&gt;Double tilde (~~) Operator&lt;/li&gt;
&lt;li&gt;Unary Operator (+)&lt;/li&gt;
&lt;li&gt;Math.floor()&lt;/li&gt;
&lt;li&gt;Multiply with number&lt;/li&gt;
&lt;li&gt;The Signed Right Shift Operator(&amp;gt;&amp;gt;)&lt;/li&gt;
&lt;li&gt;The Unsigned Right Shift Operator(&amp;gt;&amp;gt;&amp;gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这几种方式对运行结果的差异，如下表所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/media/20220503/covert_string_to_number.png&quot; alt=&quot;&quot; /&gt;&amp;gt; 对比表格的源码发布到了 &lt;a href=&quot;https://airing.ursb.me/web/int.html&quot;&gt;https://airing.ursb.me/web/int.html&lt;/a&gt;，需要可自取。&lt;/p&gt;
&lt;p&gt;除了运行结果上的存在差异之外，这些方法在性能上也存在着差异。在 NodeJS V8 环境下，这几个方法微基准测试的结果如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;parseInt() x 19,140,190 ops/sec ±0.45% (92 runs sampled)
parseFloat() x 28,203,053 ops/sec ±0.25% (95 runs sampled)
Number() x 1,041,209,524 ops/sec ±0.20% (90 runs sampled)
Double tilde (~~) Operator x 1,035,220,963 ops/sec ±1.65% (97 runs sampled)
Math.floor() x 28,224,678 ops/sec ±0.23% (96 runs sampled)
Unary Operator (+) x 1,045,129,381 ops/sec ±0.17% (95 runs sampled)
Multiply with number x 1,044,176,084 ops/sec ±0.15% (93 runs sampled)
The Signed Right Shift Operator(&amp;gt;&amp;gt;) x 1,046,016,782 ops/sec ±0.11% (96 runs sampled)
The Unsigned Right Shift Operator(&amp;gt;&amp;gt;&amp;gt;) x 1,045,384,959 ops/sec ±0.08% (96 runs sampled)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可见，&lt;code&gt;parseInt()&lt;/code&gt;，&lt;code&gt;parseFloat()&lt;/code&gt;，&lt;code&gt;Math.floor()&lt;/code&gt; 的效率最低，只有其他运算 2% 左右的效率，而其中又以&lt;code&gt;parseInt()&lt;/code&gt;最慢，仅有 1%。&lt;/p&gt;
&lt;p&gt;为什么这些方法存在着这些差异？这些运算在引擎层又是如何被解释执行的？接下来将从 V8、JavaScriptCore、QuickJS 等主流 JS 引擎的视角，探究这些方法的具体实现。&lt;/p&gt;
&lt;p&gt;首先来看看 &lt;code&gt;parsrInt()&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;1. parseInt()&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://tc39.es/ecma262/#sec-parseint-string-radix&quot;&gt;ECMAScript (ECMA-262) parseInt&lt;/a&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/media/20220503/Pasted%20image%2020220503111054.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;1.1 V8 中的 parseInt()&lt;/h3&gt;
&lt;p&gt;在 V8  [→ src/init/bootstrapper.cc] 中定义了 JS 语言内置的标准对象，我们可以找到其中关于 &lt;code&gt;parseInt&lt;/code&gt; 的定义：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Handle&amp;lt;JSFunction&amp;gt; number_fun = InstallFunction(isolate_, global, &quot;Number&quot;, JS_PRIMITIVE_WRAPPER_TYPE, JSPrimitiveWrapper::kHeaderSize, 0, isolate_-&amp;gt;initial_object_prototype(), Builtin::kNumberConstructor);

// Install Number.parseInt and Global.parseInt.
Handle&amp;lt;JSFunction&amp;gt; parse_int_fun = SimpleInstallFunction(isolate_, number_fun, &quot;parseInt&quot;, Builtin::kNumberParseInt, 2, true);

JSObject::AddProperty(isolate_, global_object, &quot;parseInt&quot;, parse_int_fun,
 native_context()-&amp;gt;set_global_parse_int_fun(*parse_int_fun);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以见，Number.parseInt 和全局对象的 parseInt 都是基于 &lt;code&gt;SimpleInstallFunction&lt;/code&gt; 注册的，它会将 API 安装到 isolate 中，并将该方法与 Builtin 做绑定。JS 侧调用 &lt;code&gt;pasreInt&lt;/code&gt; 即为引擎侧调用 &lt;code&gt;Builtin::kNumberParseInt&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;Builtin (Built-in Functions) 是 V8 中在 VM 运行时可执行的代码块，用于表达运行时对 VM 的更改。目前 V8 版本中 Builtin 有下述 5 种实现方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Platform-dependent assembly language：很高效，但需要手动适配到所有平台，并且难以维护。&lt;/li&gt;
&lt;li&gt;C++：风格与runtime functions非常相似，可以访问 V8 强大的运行时功能，但通常不适合性能敏感区域。&lt;/li&gt;
&lt;li&gt;JavaScript：缓慢的运行时调用，受类型污染导致的不可预测的性能影响，以及复杂的 JS语义问题。现在 V8 不再使用 JavaScript 内置函数。&lt;/li&gt;
&lt;li&gt;CodeStubAssembler：提供高效的低级功能，非常接近汇编语言，同时保持平台依赖无关性和可读性。&lt;/li&gt;
&lt;li&gt;Torque：是 CodeStubAssembler 的改进版，其语法结合了 TypeScript 的一些特征，非常简单易读。强调在不损失性能的前提下尽量降低使用难度，让 Builtin 的开发更加容易一些。目前不少内置函数都是由 Torque 实现的。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;回到前文 &lt;code&gt;Builtin::kNumberParseInt&lt;/code&gt; 这个函数，在 [→ src/builtins/builtins.h] 中可以看到其定义：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Convenience macro to avoid generating named accessors for all builtins.
#define BUILTIN_CODE(isolate, name) \
  (isolate)-&amp;gt;builtins()-&amp;gt;code_handle(i::Builtin::k##name)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因此这个函数注册的原名是 &lt;code&gt;NumberParseInt&lt;/code&gt;，实现在 [→ src/builtins/number.tq] 中，是个基于 Torque 的 Builtin 实现。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ES6 #sec-number.parseint
transitioning javascript builtin NumberParseInt(
    js-implicit context: NativeContext)(value: JSAny, radix: JSAny): Number {
  return ParseInt(value, radix);
}

transitioning builtin ParseInt(implicit context: Context)(
    input: JSAny, radix: JSAny): Number {
  try {
    // Check if radix should be 10 (i.e. undefined, 0 or 10).
    if (radix != Undefined &amp;amp;&amp;amp; !TaggedEqual(radix, SmiConstant(10)) &amp;amp;&amp;amp;
        !TaggedEqual(radix, SmiConstant(0))) {
      goto CallRuntime;
    }

    typeswitch (input) {
      case (s: Smi): {
        return s;
      }
      case (h: HeapNumber): {
        // Check if the input value is in Signed32 range.
        const asFloat64: float64 = Convert&amp;lt;float64&amp;gt;(h);
        const asInt32: int32 = Signed(TruncateFloat64ToWord32(asFloat64));
        // The sense of comparison is important for the NaN case.
        if (asFloat64 == ChangeInt32ToFloat64(asInt32)) goto Int32(asInt32);

        // Check if the absolute value of input is in the [1,1&amp;lt;&amp;lt;31[ range. Call
        // the runtime for the range [0,1[ because the result could be -0.
        const kMaxAbsValue: float64 = 2147483648.0;
        const absInput: float64 = math::Float64Abs(asFloat64);
        if (absInput &amp;lt; kMaxAbsValue &amp;amp;&amp;amp; absInput &amp;gt;= 1.0) goto Int32(asInt32);
        goto CallRuntime;
      }
      case (s: String): {
        goto String(s);
      }
      case (HeapObject): {
        goto CallRuntime;
      }
    }
  } label Int32(i: int32) {
    return ChangeInt32ToTagged(i);
  } label String(s: String) {
    // Check if the string is a cached array index.
    const hash: NameHash = s.raw_hash_field;
    if (IsIntegerIndex(hash) &amp;amp;&amp;amp;
        hash.array_index_length &amp;lt; kMaxCachedArrayIndexLength) {
      const arrayIndex: uint32 = hash.array_index_value;
      return SmiFromUint32(arrayIndex);
    }
    // Fall back to the runtime.
    goto CallRuntime;
  } label CallRuntime {
    tail runtime::StringParseInt(input, radix);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看这段代码前，先科普下 V8 中的几个数据结构：（V8 所有数据结构的定义可以见 [→ src/objects/objects.h]）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Smi：继承自 Object，immediate small integer，只有 31 位&lt;/li&gt;
&lt;li&gt;HeapObject：继承自 Object，superclass for everything allocated in the heap&lt;/li&gt;
&lt;li&gt;PrimitiveHeapObject：继承自 HeapObject&lt;/li&gt;
&lt;li&gt;HeapNumber：继承自 PrimitiveHeapObject，存储了数字的堆对象，用于保存大整形的对象。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们知道 &lt;code&gt;parseInt&lt;/code&gt; 接收两个形参， 即 &lt;code&gt;parseInt(string, radix)&lt;/code&gt;，此处亦如是。 实现流程如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先判断 &lt;code&gt;radix&lt;/code&gt; 是否没传或者传了 0 或 10，如果不是，那么则不是十进制的转换，就走 runtime 中提供的 &lt;code&gt;StringParseInt&lt;/code&gt; 函数 &lt;code&gt;runtime::StringParseInt&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;如果是十进制转换就继续走，判断第一个参数的数据类型。&lt;/li&gt;
&lt;li&gt;如果是 Smi 或者是没有越界（超 31 位）的 HeapNumber，那么就直接 return 入参，相当于没有转化；否则同样走  &lt;code&gt;runtime::StringParseInt&lt;/code&gt;。注意如果这里越界了就会走 &lt;code&gt;ChangeInt32ToTagged&lt;/code&gt;，其为 CodeStubAssembler 实现的一个函数，会强转 Int32，如果当前执行环境不允许溢出 32 位，那么转换之后的数字就会不合预期。&lt;/li&gt;
&lt;li&gt;如果是 String，则判断是否是 hash，如果是的就找到对应整型 value 返回；否则依然走 &lt;code&gt;runtime::StringParseInt&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那么焦点来到了 &lt;code&gt;runtime::StringParseInt&lt;/code&gt;。[→ src/runtime/runtime-numbers.cc]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ES6 18.2.5 parseInt(string, radix) slow path
RUNTIME_FUNCTION(Runtime_StringParseInt) {
  HandleScope handle_scope(isolate);
  DCHECK_EQ(2, args.length());
  Handle&amp;lt;Object&amp;gt; string = args.at(0);
  Handle&amp;lt;Object&amp;gt; radix = args.at(1);

  // Convert {string} to a String first, and flatten it.
  Handle&amp;lt;String&amp;gt; subject;
  ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, subject,
                                     Object::ToString(isolate, string));
  subject = String::Flatten(isolate, subject);

  // Convert {radix} to Int32.
  if (!radix-&amp;gt;IsNumber()) {
    ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, radix,
                                       Object::ToNumber(isolate, radix));
  }
  int radix32 = DoubleToInt32(radix-&amp;gt;Number());
  if (radix32 != 0 &amp;amp;&amp;amp; (radix32 &amp;lt; 2 || radix32 &amp;gt; 36)) {
    return ReadOnlyRoots(isolate).nan_value();
  }

  double result = StringToInt(isolate, subject, radix32);
  return *isolate-&amp;gt;factory()-&amp;gt;NewNumber(result);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段逻辑比较简单，就不再一行行解读了。值得注意的是，根据标准，如果 &lt;code&gt;radix&lt;/code&gt; 不在 2~36 的范围内，会返回 NaN。&lt;/p&gt;
&lt;h3&gt;1.2 JavaScriptCore 中的 parseInt()&lt;/h3&gt;
&lt;p&gt;接着我们来看看 JavaScriptCore 中的 &lt;code&gt;parseInt()&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;JavaScriptCore 中关于  JS 语言内置对象的注册都在 [→ runtime/JSGlobalObjectFuntions.cpp] 文件中：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;JSC_DEFINE_HOST_FUNCTION(globalFuncParseInt, (JSGlobalObject* globalObject, CallFrame* callFrame))
{
    JSValue value = callFrame-&amp;gt;argument(0);
    JSValue radixValue = callFrame-&amp;gt;argument(1);

    // Optimized handling for numbers:
    // If the argument is 0 or a number in range 10^-6 &amp;lt;= n &amp;lt; INT_MAX+1, then parseInt
    // results in a truncation to integer. In the case of -0, this is converted to 0.
    //
    // This is also a truncation for values in the range INT_MAX+1 &amp;lt;= n &amp;lt; 10^21,
    // however these values cannot be trivially truncated to int since 10^21 exceeds
    // even the int64_t range. Negative numbers are a little trickier, the case for
    // values in the range -10^21 &amp;lt; n &amp;lt;= -1 are similar to those for integer, but
    // values in the range -1 &amp;lt; n &amp;lt;= -10^-6 need to truncate to -0, not 0.
    static const double tenToTheMinus6 = 0.000001;
    static const double intMaxPlusOne = 2147483648.0;
    if (value.isNumber()) {
        double n = value.asNumber();
        if (((n &amp;lt; intMaxPlusOne &amp;amp;&amp;amp; n &amp;gt;= tenToTheMinus6) || !n) &amp;amp;&amp;amp; radixValue.isUndefinedOrNull())
            return JSValue::encode(jsNumber(static_cast&amp;lt;int32_t&amp;gt;(n)));
    }

    // If ToString throws, we shouldn&apos;t call ToInt32.
    return toStringView(globalObject, value, [&amp;amp;] (StringView view) {
        return JSValue::encode(jsNumber(parseInt(view, radixValue.toInt32(globalObject))));
    });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;WebKit 中的代码注释都很详尽易读，这里也不再解读了。最后，会调用 &lt;code&gt;parseInt&lt;/code&gt;，JavaScriptCore 的 &lt;code&gt;parseInt&lt;/code&gt; 的实现全放在了 [→ runtime/ParseInt.h]  中，核心代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ALWAYS_INLINE static bool isStrWhiteSpace(UChar c)
{
    // https://tc39.github.io/ecma262/#sec-tonumber-applied-to-the-string-type
    return Lexer&amp;lt;UChar&amp;gt;::isWhiteSpace(c) || Lexer&amp;lt;UChar&amp;gt;::isLineTerminator(c);
}

// ES5.1 15.1.2.2
template &amp;lt;typename CharType&amp;gt;
ALWAYS_INLINE
static double parseInt(StringView s, const CharType* data, int radix)
{
    // 1. Let inputString be ToString(string).
    // 2. Let S be a newly created substring of inputString consisting of the first character that is not a
    //    StrWhiteSpaceChar and all characters following that character. (In other words, remove leading white
    //    space.) If inputString does not contain any such characters, let S be the empty string.
    int length = s.length();
    int p = 0;
    while (p &amp;lt; length &amp;amp;&amp;amp; isStrWhiteSpace(data[p]))
        ++p;

    // 3. Let sign be 1.
    // 4. If S is not empty and the first character of S is a minus sign -, let sign be -1.
    // 5. If S is not empty and the first character of S is a plus sign + or a minus sign -, then remove the first character from S.
    double sign = 1;
    if (p &amp;lt; length) {
        if (data[p] == &apos;+&apos;)
            ++p;
        else if (data[p] == &apos;-&apos;) {
            sign = -1;
            ++p;
        }
    }

    // 6. Let R = ToInt32(radix).
    // 7. Let stripPrefix be true.
    // 8. If R != 0,then
    //   b. If R != 16, let stripPrefix be false.
    // 9. Else, R == 0
    //   a. LetR = 10.
    // 10. If stripPrefix is true, then
    //   a. If the length of S is at least 2 and the first two characters of S are either ―0x or ―0X,
    //      then remove the first two characters from S and let R = 16.
    // 11. If S contains any character that is not a radix-R digit, then let Z be the substring of S
    //     consisting of all characters before the first such character; otherwise, let Z be S.
    if ((radix == 0 || radix == 16) &amp;amp;&amp;amp; length - p &amp;gt;= 2 &amp;amp;&amp;amp; data[p] == &apos;0&apos; &amp;amp;&amp;amp; (data[p + 1] == &apos;x&apos; || data[p + 1] == &apos;X&apos;)) {
        radix = 16;
        p += 2;
    } else if (radix == 0)
        radix = 10;

    // 8.a If R &amp;lt; 2 or R &amp;gt; 36, then return NaN.
    if (radix &amp;lt; 2 || radix &amp;gt; 36)
        return PNaN;

    // 13. Let mathInt be the mathematical integer value that is represented by Z in radix-R notation, using the letters
    //     A-Z and a-z for digits with values 10 through 35. (However, if R is 10 and Z contains more than 20 significant
    //     digits, every significant digit after the 20th may be replaced by a 0 digit, at the option of the implementation;
    //     and if R is not 2, 4, 8, 10, 16, or 32, then mathInt may be an implementation-dependent approximation to the
    //     mathematical integer value that is represented by Z in radix-R notation.)
    // 14. Let number be the Number value for mathInt.
    int firstDigitPosition = p;
    bool sawDigit = false;
    double number = 0;
    while (p &amp;lt; length) {
        int digit = parseDigit(data[p], radix);
        if (digit == -1)
            break;
        sawDigit = true;
        number *= radix;
        number += digit;
        ++p;
    }

    // 12. If Z is empty, return NaN.
    if (!sawDigit)
        return PNaN;

    // Alternate code path for certain large numbers.
    if (number &amp;gt;= mantissaOverflowLowerBound) {
        if (radix == 10) {
            size_t parsedLength;
            number = parseDouble(s.substring(firstDigitPosition, p - firstDigitPosition), parsedLength);
        } else if (radix == 2 || radix == 4 || radix == 8 || radix == 16 || radix == 32)
            number = parseIntOverflow(s.substring(firstDigitPosition, p - firstDigitPosition), radix);
    }

    // 15. Return sign x number.
    return sign * number;
}

ALWAYS_INLINE static double parseInt(StringView s, int radix)
{
    if (s.is8Bit())
        return parseInt(s, s.characters8(), radix);
    return parseInt(s, s.characters16(), radix);
}

template&amp;lt;typename CallbackWhenNoException&amp;gt;
static ALWAYS_INLINE typename std::invoke_result&amp;lt;CallbackWhenNoException, StringView&amp;gt;::type toStringView(JSGlobalObject* globalObject, JSValue value, CallbackWhenNoException callback)
{
    VM&amp;amp; vm = getVM(globalObject);
    auto scope = DECLARE_THROW_SCOPE(vm);
    JSString* string = value.toStringOrNull(globalObject);
    EXCEPTION_ASSERT(!!scope.exception() == !string);
    if (UNLIKELY(!string))
        return { };
    auto viewWithString = string-&amp;gt;viewWithUnderlyingString(globalObject);
    RETURN_IF_EXCEPTION(scope, { });
    RELEASE_AND_RETURN(scope, callback(viewWithString.view));
}

// Mapping from integers 0..35 to digit identifying this value, for radix 2..36.
const char radixDigits[] = &quot;0123456789abcdefghijklmnopqrstuvwxyz&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;直接贴出了代码，因为 JavaScriptCore 中的 API 都是严格按照  &lt;a href=&quot;https://tc39.es/ecma262/#sec-parseint-string-radix&quot;&gt;ECMAScript (ECMA-262) parseInt&lt;/a&gt; 标准一步一步按流程实现，可读性和注释也很好，强烈建议读者自己阅读一下，此处不再解读。&lt;/p&gt;
&lt;h3&gt;1.3 QuickJS 中的 parseInt()&lt;/h3&gt;
&lt;p&gt;QuickJS 的核心代码都在 [→ quickjs.c] 中，首先是 &lt;code&gt;parseInt&lt;/code&gt; 的注册代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* global object */
static const JSCFunctionListEntry js_global_funcs[] = {
    JS_CFUNC_DEF(&quot;parseInt&quot;, 2, js_parseInt ),
//...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;js_parseInt&lt;/code&gt; 的实现逻辑如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static JSValue js_parseInt(JSContext *ctx, JSValueConst this_val,
                           int argc, JSValueConst *argv)
{
    const char *str, *p;
    int radix, flags;
    JSValue ret;

    str = JS_ToCString(ctx, argv[0]);
    if (!str)
        return JS_EXCEPTION;
    if (JS_ToInt32(ctx, &amp;amp;radix, argv[1])) {
        JS_FreeCString(ctx, str);
        return JS_EXCEPTION;
    }
    if (radix != 0 &amp;amp;&amp;amp; (radix &amp;lt; 2 || radix &amp;gt; 36)) {
        ret = JS_NAN;
    } else {
        p = str;
        p += skip_spaces(p);
        flags = ATOD_INT_ONLY | ATOD_ACCEPT_PREFIX_AFTER_SIGN;
        ret = js_atof(ctx, p, NULL, radix, flags);
    }
    JS_FreeCString(ctx, str);
    return ret;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bellard 大神的代码注释很少，但同时也非常精炼。&lt;/p&gt;
&lt;p&gt;至此，本文介绍完了三个引擎下各自 &lt;code&gt;parseInt&lt;/code&gt; 的实现，三者都是基于标准的实现，但由于代码风格不同，读起来也像是阅读三个风格不同散文大家的作品。&lt;/p&gt;
&lt;p&gt;不过标准和实现，我们可以发现 &lt;code&gt;parseInt&lt;/code&gt; 在真正执行字符串转数字这个操作做了非常多的前置操作，如入参合法判断、入参默认值、字符串格式判断与规整化、越界判断等等，最后再交由 runtime 处理。因此，我们不难推出其效率略低的原因。&lt;/p&gt;
&lt;p&gt;接下来，我们再简单看看 &lt;code&gt;parseFloat&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;2. parseFloat()&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://tc39.es/ecma262/#sec-parsefloat-string&quot;&gt;ECMAScript (ECMA-262) parseFloat&lt;/a&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/media/20220503/Pasted%20image%2020220503110924.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;根据标准，parseFloat 与 parseInt 有两点明显的不同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;仅支持一个入参，不支持进制转换&lt;/li&gt;
&lt;li&gt;返回值支持浮点型&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.1 V8 中的 parseFloat()&lt;/h3&gt;
&lt;p&gt;V8 中 &lt;code&gt;parseFloat&lt;/code&gt; 的相关逻辑都紧挨着 &lt;code&gt;parseInt&lt;/code&gt;，这里直接贴出关键实现：&lt;/p&gt;
&lt;p&gt;[→ src/builtins/number.tq]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ES6 #sec-number.parsefloat
transitioning javascript builtin NumberParseFloat(
    js-implicit context: NativeContext)(value: JSAny): Number {
  try {
    typeswitch (value) {
      case (s: Smi): {
        return s;
      }
      case (h: HeapNumber): {
        // The input is already a Number. Take care of -0.
        // The sense of comparison is important for the NaN case.
        return (Convert&amp;lt;float64&amp;gt;(h) == 0) ? SmiConstant(0) : h;
      }
      case (s: String): {
        goto String(s);
      }
      case (HeapObject): {
        goto String(string::ToString(context, value));
      }
    }
  } label String(s: String) {
    // Check if the string is a cached array index.
    const hash: NameHash = s.raw_hash_field;
    if (IsIntegerIndex(hash) &amp;amp;&amp;amp;
        hash.array_index_length &amp;lt; kMaxCachedArrayIndexLength) {
      const arrayIndex: uint32 = hash.array_index_value;
      return SmiFromUint32(arrayIndex);
    }
    // Fall back to the runtime to convert string to a number.
    return runtime::StringParseFloat(s);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[→ src/runtime/runtime-numbers.cc]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ES6 18.2.4 parseFloat(string)
RUNTIME_FUNCTION(Runtime_StringParseFloat) {
  HandleScope shs(isolate);
  DCHECK_EQ(1, args.length());
  Handle&amp;lt;String&amp;gt; subject = args.at&amp;lt;String&amp;gt;(0);

  double value = StringToDouble(isolate, subject, ALLOW_TRAILING_JUNK,
                                std::numeric_limits&amp;lt;double&amp;gt;::quiet_NaN());

  return *isolate-&amp;gt;factory()-&amp;gt;NewNumber(value);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因标准中的流程更为简易，因此较 &lt;code&gt;parseInt&lt;/code&gt; 而言， &lt;code&gt;parseFloat&lt;/code&gt; 更加简单易读。&lt;/p&gt;
&lt;h3&gt;2.2 JavaScriptCore 中的 parseFloat()&lt;/h3&gt;
&lt;p&gt;在 JavaScriptCore 中，&lt;code&gt;parseFloat&lt;/code&gt; 的逻辑则更加简洁明了：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static double parseFloat(StringView s)
{
    unsigned size = s.length();

    if (size == 1) {
        UChar c = s[0];
        if (isASCIIDigit(c))
            return c - &apos;0&apos;;
        return PNaN;
    }

    if (s.is8Bit()) {
        const LChar* data = s.characters8();
        const LChar* end = data + size;

        // Skip leading white space.
        for (; data &amp;lt; end; ++data) {
            if (!isStrWhiteSpace(*data))
                break;
        }

        // Empty string.
        if (data == end)
            return PNaN;

        return jsStrDecimalLiteral(data, end);
    }

    const UChar* data = s.characters16();
    const UChar* end = data + size;

    // Skip leading white space.
    for (; data &amp;lt; end; ++data) {
        if (!isStrWhiteSpace(*data))
            break;
    }

    // Empty string.
    if (data == end)
        return PNaN;

    return jsStrDecimalLiteral(data, end);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.3 QuickJS 中的 parseFloat()&lt;/h3&gt;
&lt;p&gt;而对比 JavaScriptCore，QuickJS 则短短 12 行：&lt;/p&gt;
&lt;p&gt;[→ quickjs.c]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static JSValue js_parseFloat(JSContext *ctx, JSValueConst this_val,
                             int argc, JSValueConst *argv)
{
    const char *str, *p;
    JSValue ret;

    str = JS_ToCString(ctx, argv[0]);
    if (!str)
        return JS_EXCEPTION;
    p = str;
    p += skip_spaces(p);
    ret = js_atof(ctx, p, NULL, 10, 0);
    JS_FreeCString(ctx, str);
    return ret;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不过对比之后可以知道，QuickJS 这里之所以短小，是没有做 ASCII 和 8Bit 的兼容。阅读 &lt;a href=&quot;https://tc39.es/ecma262/#sec-parsefloat-string&quot;&gt;ECMAScript (ECMA-262) parseFloat&lt;/a&gt; 之后可以发现，QuickJS 这里的处理其实没有什么问题，最新的标准中并没有要求解释器要这样的兼容。&lt;/p&gt;
&lt;h2&gt;3. Number()&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://tc39.es/ecma262/#sec-number-constructor-number-value&quot;&gt;ECMAScript (ECMA-262) Number ( value )&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/media/20220503/Pasted%20image%2020220503110831.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.1 V8 中的 Number()&lt;/h3&gt;
&lt;p&gt;Number 作为全局对象，定义还是在  [→ src/init/bootstrapper.cc] 中，在前文介绍 &lt;code&gt;Number.parseInt&lt;/code&gt; 的注册时已然介绍过，我们回顾下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Handle&amp;lt;JSFunction&amp;gt; number_fun = InstallFunction(
        isolate_, global, &quot;Number&quot;, JS_PRIMITIVE_WRAPPER_TYPE,
        JSPrimitiveWrapper::kHeaderSize, 0,
        isolate_-&amp;gt;initial_object_prototype(), Builtin::kNumberConstructor);
number_fun-&amp;gt;shared().DontAdaptArguments();
number_fun-&amp;gt;shared().set_length(1);
InstallWithIntrinsicDefaultProto(isolate_, number_fun,
                                     Context::NUMBER_FUNCTION_INDEX);

// Create the %NumberPrototype%
Handle&amp;lt;JSPrimitiveWrapper&amp;gt; prototype = Handle&amp;lt;JSPrimitiveWrapper&amp;gt;::cast(
        factory-&amp;gt;NewJSObject(number_fun, AllocationType::kOld));
prototype-&amp;gt;set_value(Smi::zero());
JSFunction::SetPrototype(number_fun, prototype);

// Install the &quot;constructor&quot; property on the {prototype}.
JSObject::AddProperty(isolate_, prototype, factory-&amp;gt;constructor_string(),
                          number_fun, DONT_ENUM);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码处理注册了 &lt;code&gt;Number&lt;/code&gt; 这个对象之外，还初始化了它的原型链，并把构造函数添加到了它的原型链上。构造函数 &lt;code&gt;Builtin::kNumberConstructor&lt;/code&gt; 是 Torque 实现的 Builtin，[→ src/builtins/constructor.tq] ，具体实现如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ES #sec-number-constructor
transitioning javascript builtin
NumberConstructor(
    js-implicit context: NativeContext, receiver: JSAny, newTarget: JSAny,
    target: JSFunction)(...arguments): JSAny {
  // 1. If no arguments were passed to this function invocation, let n be +0.
  let n: Number = 0;
  if (arguments.length &amp;gt; 0) {
    // 2. Else,
    //    a. Let prim be ? ToNumeric(value).
    //    b. If Type(prim) is BigInt, let n be the Number value for prim.
    //    c. Otherwise, let n be prim.
    const value = arguments[0];
    n = ToNumber(value, BigIntHandling::kConvertToNumber);
  }

  // 3. If NewTarget is undefined, return n.
  if (newTarget == Undefined) return n;

  // 4. Let O be ? OrdinaryCreateFromConstructor(NewTarget,
  //    &quot;%NumberPrototype%&quot;, « [[NumberData]] »).
  // 5. Set O.[[NumberData]] to n.
  // 6. Return O.

  // We ignore the normal target parameter and load the value from the
  // current frame here in order to reduce register pressure on the fast path.
  const target: JSFunction = LoadTargetFromFrame();
  const result = UnsafeCast&amp;lt;JSPrimitiveWrapper&amp;gt;(
      FastNewObject(context, target, UnsafeCast&amp;lt;JSReceiver&amp;gt;(newTarget)));
  result.value = n;
  return result;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注释中的 1-6 一一对应着[ECMAScript (ECMA-262) Number ( value )]标准中的流程 1-6，因此本文不再花篇章赘述其实现。需要注意的是，标准中明确说明了 Number 是支持 BigInt 的，各引擎的实现也着重注意了这点，这也证明了我们之前运算对照表中的结果。&lt;/p&gt;
&lt;h3&gt;3.2 JavaScriptCore 中的 Number()&lt;/h3&gt;
&lt;p&gt;JavaScriptCore 中的这段代码则缺少注释，但逻辑上与 V8 一模一样，遵循标准：&lt;/p&gt;
&lt;p&gt;[→ runtime/NumberConstructor.cpp]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ECMA 15.7.1
JSC_DEFINE_HOST_FUNCTION(constructNumberConstructor, (JSGlobalObject* globalObject, CallFrame* callFrame))
{
    VM&amp;amp; vm = globalObject-&amp;gt;vm();
    auto scope = DECLARE_THROW_SCOPE(vm);
    double n = 0;
    if (callFrame-&amp;gt;argumentCount()) {
        JSValue numeric = callFrame-&amp;gt;uncheckedArgument(0).toNumeric(globalObject);
        RETURN_IF_EXCEPTION(scope, { });
        if (numeric.isNumber())
            n = numeric.asNumber();
        else {
            ASSERT(numeric.isBigInt());
            numeric = JSBigInt::toNumber(numeric);
            ASSERT(numeric.isNumber());
            n = numeric.asNumber();
        }
    }

    JSObject* newTarget = asObject(callFrame-&amp;gt;newTarget());
    Structure* structure = JSC_GET_DERIVED_STRUCTURE(vm, numberObjectStructure, newTarget, callFrame-&amp;gt;jsCallee());
    RETURN_IF_EXCEPTION(scope, { });

    NumberObject* object = NumberObject::create(vm, structure);
    object-&amp;gt;setInternalValue(vm, jsNumber(n));
    return JSValue::encode(object);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.3 QuickJS 中的 Number()&lt;/h3&gt;
&lt;p&gt;Number 对象及其原型链的注册代码如下所示：&lt;/p&gt;
&lt;p&gt;[→ quickjs.c]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void JS_AddIntrinsicBaseObjects(JSContext *ctx)
{
//...

/* Number */
    ctx-&amp;gt;class_proto[JS_CLASS_NUMBER] = JS_NewObjectProtoClass(ctx, ctx-&amp;gt;class_proto[JS_CLASS_OBJECT], JS_CLASS_NUMBER);
    
    JS_SetObjectData(ctx, ctx-&amp;gt;class_proto[JS_CLASS_NUMBER], JS_NewInt32(ctx, 0));
    JS_SetPropertyFunctionList(ctx, ctx-&amp;gt;class_proto[JS_CLASS_NUMBER], js_number_proto_funcs, countof(js_number_proto_funcs));
    
    number_obj = JS_NewGlobalCConstructor(ctx, &quot;Number&quot;, js_number_constructor, 1, ctx-&amp;gt;class_proto[JS_CLASS_NUMBER]);
    
    JS_SetPropertyFunctionList(ctx, number_obj, js_number_funcs, countof(js_number_funcs));
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同样的时候，在原型链注册的时候绑上了构造函数 &lt;code&gt;js_number_constructor&lt;/code&gt; ：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static JSValue js_number_constructor(JSContext *ctx, JSValueConst new_target,
                                     int argc, JSValueConst *argv)
{
    JSValue val, obj;
    if (argc == 0) {
        val = JS_NewInt32(ctx, 0);
    } else {
        val = JS_ToNumeric(ctx, argv[0]);
        if (JS_IsException(val))
            return val;
        switch(JS_VALUE_GET_TAG(val)) {
#ifdef CONFIG_BIGNUM
        case JS_TAG_BIG_INT:
        case JS_TAG_BIG_FLOAT:
            {
                JSBigFloat *p = JS_VALUE_GET_PTR(val);
                double d;
                bf_get_float64(&amp;amp;p-&amp;gt;num, &amp;amp;d, BF_RNDN);
                JS_FreeValue(ctx, val);
                val = __JS_NewFloat64(ctx, d);
            }
            break;
        case JS_TAG_BIG_DECIMAL:
            val = JS_ToStringFree(ctx, val);
            if (JS_IsException(val))
                return val;
            val = JS_ToNumberFree(ctx, val);
            if (JS_IsException(val))
                return val;
            break;
#endif
        default:
            break;
        }
    }
    if (!JS_IsUndefined(new_target)) {
        obj = js_create_from_ctor(ctx, new_target, JS_CLASS_NUMBER);
        if (!JS_IsException(obj))
            JS_SetObjectData(ctx, obj, val);
        return obj;
    } else {
        return val;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;值得关注的是 QuickJS 追求精简小巧，因此可以自行配置是否支持 BigInt，其余逻辑依然遵循标准。&lt;/p&gt;
&lt;h2&gt;4. Double tilde (~~) Operator&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://tc39.es/ecma262/#sec-bitwise-not-operator-runtime-semantics-evaluation&quot;&gt;ECMAScript (ECMA-262) Bitwise NOT Operator&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/media/20220503/Pasted%20image%2020220503113745.png&quot; alt=&quot;&quot; /&gt;使用 ~ 运算符利用到了标准中的第 2 步，对被计算的值做类型转换，从而将字符串转成数值。这里我们关注这个环节具体是在引擎中的哪个步骤完成的。&lt;/p&gt;
&lt;h3&gt;4.1 V8 中的 BitwiseNot&lt;/h3&gt;
&lt;p&gt;首先看看 V8 中对一元运算符的判断：&lt;/p&gt;
&lt;p&gt;[→ src/parsing/token.h]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static bool IsUnaryOp(Value op) { return base::IsInRange(op, ADD, VOID); }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;定义在 ADD 和 VOID 范围内的 op，都是一元运算符，具体包括 (可见 [→ src/parsing/token.h])，其中 SUB 和 ADD 定义在二元运算符列表的末端，在 IsUnaryOp 中它们也会命中一元符的判断：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;E(T, ADD, &quot;+&quot;, 12)
E(T, SUB, &quot;-&quot;, 12)
T(NOT, &quot;!&quot;, 0)
T(BIT_NOT, &quot;~&quot;, 0)
K(DELETE, &quot;delete&quot;, 0)
K(TYPEOF, &quot;typeof&quot;, 0)
K(VOID, &quot;void&quot;, 0)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后进入语法分析阶段，解析 AST 树的过程中，遇到一元运算符会做相应的处理，先调用 &lt;code&gt;ParseUnaryOrPrefixExpression&lt;/code&gt; 之后构建一元运算符表达式 &lt;code&gt;BuildUnaryExpression&lt;/code&gt;：&lt;/p&gt;
&lt;p&gt;[→ src/parsing/parser-base.h]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;template &amp;lt;typename Impl&amp;gt;
typename ParserBase&amp;lt;Impl&amp;gt;::ExpressionT
ParserBase&amp;lt;Impl&amp;gt;::ParseUnaryExpression() {
  // UnaryExpression ::
  //   PostfixExpression
  //   &apos;delete&apos; UnaryExpression
  //   &apos;void&apos; UnaryExpression
  //   &apos;typeof&apos; UnaryExpression
  //   &apos;++&apos; UnaryExpression
  //   &apos;--&apos; UnaryExpression
  //   &apos;+&apos; UnaryExpression
  //   &apos;-&apos; UnaryExpression
  //   &apos;~&apos; UnaryExpression
  //   &apos;!&apos; UnaryExpression
  //   [+Await] AwaitExpression[?Yield]

  Token::Value op = peek();
  // 一元运算符处理
  if (Token::IsUnaryOrCountOp(op)) return ParseUnaryOrPrefixExpression();
  if (is_await_allowed() &amp;amp;&amp;amp; op == Token::AWAIT) {
// await 处理
    return ParseAwaitExpression();
  }
  return ParsePostfixExpression();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;template &amp;lt;typename Impl&amp;gt;
typename ParserBase&amp;lt;Impl&amp;gt;::ExpressionT
ParserBase&amp;lt;Impl&amp;gt;::ParseUnaryOrPrefixExpression() {
//...

//...
 // Allow the parser&apos;s implementation to rewrite the expression.
   return impl()-&amp;gt;BuildUnaryExpression(expression, op, pos);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[→ src/parsing/parser.cc]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Expression* Parser::BuildUnaryExpression(Expression* expression,
                                         Token::Value op, int pos) {
  DCHECK_NOT_NULL(expression);
  const Literal* literal = expression-&amp;gt;AsLiteral();
  if (literal != nullptr) {
// !
    if (op == Token::NOT) {
      // Convert the literal to a boolean condition and negate it.
      return factory()-&amp;gt;NewBooleanLiteral(literal-&amp;gt;ToBooleanIsFalse(), pos);
    } else if (literal-&amp;gt;IsNumberLiteral()) {
      // Compute some expressions involving only number literals.
      double value = literal-&amp;gt;AsNumber();
      switch (op) {
    // +
        case Token::ADD:
          return expression;
        // -
        case Token::SUB:
          return factory()-&amp;gt;NewNumberLiteral(-value, pos);
        // ~
        case Token::BIT_NOT:
          return factory()-&amp;gt;NewNumberLiteral(~DoubleToInt32(value), pos);
        default:
          break;
      }
    }
  }
  return factory()-&amp;gt;NewUnaryOperation(op, expression, pos);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果字面量是数值型且一元运算符此刻不是 NOT（!），那么会把 Value 会转成 Number，如果是 BIT_NOT 再转成 INT32 进行取反运算。&lt;/p&gt;
&lt;h3&gt;4.2 JavaScriptCore 中的 BitwiseNot&lt;/h3&gt;
&lt;p&gt;同样在语法分析生成 AST 阶段，处理到 TILDE（~） 这个 token 后，创建表达式时会做类型转换的工作：&lt;/p&gt;
&lt;p&gt;[→ Parser/Parser.cpp]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;template &amp;lt;typename LexerType&amp;gt;
template &amp;lt;class TreeBuilder&amp;gt; TreeExpression Parser&amp;lt;LexerType&amp;gt;::parseUnaryExpression(TreeBuilder&amp;amp; context)
{
//... 省略无关代码
 while (tokenStackDepth) {
 switch (tokenType) {
//... 省略无关代码
// ~
case TILDE:
     expr = context.makeBitwiseNotNode(location, expr);
     break;
     // +
case PLUS:
      expr = context.createUnaryPlus(location, expr);
     break;
//... 省略无关代码
}
}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[→ parser/ASTBuilder.h]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ExpressionNode* ASTBuilder::makeBitwiseNotNode(const JSTokenLocation&amp;amp; location, ExpressionNode* expr)
{
if (expr-&amp;gt;isNumber())
        return createIntegerLikeNumber(location, ~toInt32(static_cast&amp;lt;NumberNode*&amp;gt;(expr)-&amp;gt;value()));
    return new (m_parserArena) BitwiseNotNode(location, expr);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[→ parser/NodeConstructors.h]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;inline BitwiseNotNode::BitwiseNotNode(const JSTokenLocation&amp;amp; location, ExpressionNode* expr)
        : UnaryOpNode(location, ResultType::forBitOp(), expr, op_bitnot)
{
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[→ parser/ResultType.h]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static constexpr ResultType forBitOp()
{
    return bigIntOrInt32Type();
}

static constexpr ResultType bigIntOrInt32Type()
{
    return ResultType(TypeMaybeBigInt | TypeInt32 | TypeMaybeNumber);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.3 QuickJS 中的 BitwiseNot&lt;/h3&gt;
&lt;p&gt;QuickJS 在语法分析阶段，遇到 ~ 这个 token 会调用 &lt;code&gt;emit_op(s, OP_not)&lt;/code&gt;：&lt;/p&gt;
&lt;p&gt;[→ quickjs.c]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* allowed parse_flags: PF_ARROW_FUNC, PF_POW_ALLOWED, PF_POW_FORBIDDEN */
static __exception int js_parse_unary(JSParseState *s, int parse_flags)
{
    int op;

    switch(s-&amp;gt;token.val) {
    case &apos;+&apos;:
    case &apos;-&apos;:
    case &apos;!&apos;:
    case &apos;~&apos;:
    case TOK_VOID:
        op = s-&amp;gt;token.val;
        if (next_token(s))
            return -1;
        if (js_parse_unary(s, PF_POW_FORBIDDEN))
            return -1;
        switch(op) {
        case &apos;-&apos;:
            emit_op(s, OP_neg);
            break;
        case &apos;+&apos;:
            emit_op(s, OP_plus);
            break;
        case &apos;!&apos;:
            emit_op(s, OP_lnot);
            break;
        case &apos;~&apos;:
            emit_op(s, OP_not);
            break;
        case TOK_VOID:
            emit_op(s, OP_drop);
            emit_op(s, OP_undefined);
            break;
        default:
            abort();
        }
        parse_flags = 0;
        break;
//...
}
    //...
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;emit_op&lt;/code&gt; 会生成 OP_not 字节码操作符，并将源码保存在 fd-&amp;gt;byte_code 里。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static void emit_op(JSParseState *s, uint8_t val)
{
    JSFunctionDef *fd = s-&amp;gt;cur_func;
    DynBuf *bc = &amp;amp;fd-&amp;gt;byte_code;

    /* Use the line number of the last token used, not the next token,
       nor the current offset in the source file.
     */
    if (unlikely(fd-&amp;gt;last_opcode_line_num != s-&amp;gt;last_line_num)) {
        dbuf_putc(bc, OP_line_num);
        dbuf_put_u32(bc, s-&amp;gt;last_line_num);
        fd-&amp;gt;last_opcode_line_num = s-&amp;gt;last_line_num;
    }
    fd-&amp;gt;last_opcode_pos = bc-&amp;gt;size;
    dbuf_putc(bc, val);
}

int dbuf_putc(DynBuf *s, uint8_t c)
{
return dbuf_put(s, &amp;amp;c, 1);
}

int dbuf_put(DynBuf *s, const uint8_t *data, size_t len)
{
    if (unlikely((s-&amp;gt;size + len) &amp;gt; s-&amp;gt;allocated_size)) {
        if (dbuf_realloc(s, s-&amp;gt;size + len))
            return -1;
    }
    memcpy(s-&amp;gt;buf + s-&amp;gt;size, data, len);
    s-&amp;gt;size += len;
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;QuickJS 解释执行的函数是 &lt;code&gt;JS_EvalFunctionInternal&lt;/code&gt;，其会调用 &lt;code&gt;JS_CallFree&lt;/code&gt; 进行字节码的解释执行，其核心逻辑是调用的 &lt;code&gt;JS_CallInternal&lt;/code&gt; 函数。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* argv[] is modified if (flags &amp;amp; JS_CALL_FLAG_COPY_ARGV) = 0. */
static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
                               JSValueConst this_obj, JSValueConst new_target,
                               int argc, JSValue *argv, int flags)
{
    JSRuntime *rt = caller_ctx-&amp;gt;rt;
    JSContext *ctx;
    JSObject *p;
    JSFunctionBytecode *b;
    JSStackFrame sf_s, *sf = &amp;amp;sf_s;
    const uint8_t *pc;
// ...省略无关代码

for(;;) {
int call_argc;
JSValue *call_argv;
SWITCH(pc) {
// ...
CASE(OP_not):
{
JSValue op1;
op1 = sp[-1];
// 如果是整型
if (JS_VALUE_GET_TAG(op1) == JS_TAG_INT) {
sp[-1] = JS_NewInt32(ctx, ~JS_VALUE_GET_INT(op1));
// 如果不是整型
} else {
if (js_not_slow(ctx, sp))
goto exception;
}
}
BREAK;
// ...
}
// ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可见，解析到 OP_not 时， 如果是整型就直接取反，否则就调用 &lt;code&gt;js_not_slow&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static no_inline int js_not_slow(JSContext *ctx, JSValue *sp)
{
    int32_t v1;

    if (unlikely(JS_ToInt32Free(ctx, &amp;amp;v1, sp[-1]))) {
        sp[-1] = JS_UNDEFINED;
        return -1;
    }
    sp[-1] = JS_NewInt32(ctx, ~v1);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;js_not_slow&lt;/code&gt; 会尝试转整型，转不了就转 -1，转的了就转整型后取反。&lt;code&gt;JS_ToInt32Free&lt;/code&gt; 转换逻辑如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* return (&amp;lt;0, 0) in case of exception */
static int JS_ToInt32Free(JSContext *ctx, int32_t *pres, JSValue val)
{
 redo:
tag = JS_VALUE_GET_NORM_TAG(val);
switch(tag) {
case JS_TAG_INT:
case JS_TAG_BOOL:
case JS_TAG_NULL:
case JS_TAG_UNDEFINED:
ret = JS_VALUE_GET_INT(val);
break;
// ...
default:
val = JS_ToNumberFree(ctx, val);
if (JS_IsException(val)) {
*pres = 0;
return -1;
}
goto redo;
}
    *pres = ret;
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于字符串，会走到 &lt;code&gt;JS_ToNumberFree&lt;/code&gt;，之后调用 &lt;code&gt;JS_ToNumberHintFree&lt;/code&gt;，涉及到字符串处理的核心逻辑如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static JSValue JS_ToNumberHintFree(JSContext *ctx, JSValue val,
                                   JSToNumberHintEnum flag)
{
    uint32_t tag;
    JSValue ret;

 redo:
    tag = JS_VALUE_GET_NORM_TAG(val);
    switch(tag) {
    // ...省略无关逻辑
case JS_TAG_STRING:
        {
            const char *str;
            const char *p;
            size_t len;
            
            str = JS_ToCStringLen(ctx, &amp;amp;len, val);
            JS_FreeValue(ctx, val);
            if (!str)
                return JS_EXCEPTION;
            p = str;
            p += skip_spaces(p);
            if ((p - str) == len) {
                ret = JS_NewInt32(ctx, 0);
            } else {
                int flags = ATOD_ACCEPT_BIN_OCT;
                ret = js_atof(ctx, p, &amp;amp;p, 0, flags);
                if (!JS_IsException(ret)) {
                    p += skip_spaces(p);
                    if ((p - str) != len) {
                        JS_FreeValue(ctx, ret);
                        ret = JS_NAN;
                    }
                }
            }
            JS_FreeCString(ctx, str);
        }
        break;
// ...省略无关逻辑
}
// ...省略无关逻辑
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以转化的用 &lt;code&gt;JS_NewInt32&lt;/code&gt; 去处理，否则返回 NaN。&lt;/p&gt;
&lt;h2&gt;5. Unary Operator (+)&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://tc39.es/ecma262/#sec-unary-plus-operator-runtime-semantics-evaluation&quot;&gt;ECMAScript (ECMA-262) Unary Plus Operator&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/media/20220503/Pasted%20image%2020220503114251.png&quot; alt=&quot;&quot; /&gt;一元运算符加号是笔者最喜欢用的一种字符串转数值的方式，标准中它没有什么花里胡哨的、非常简介明了，就是用来做数值类型转换的。&lt;/p&gt;
&lt;h3&gt;5.1 V8 中的 UnaryPlus&lt;/h3&gt;
&lt;p&gt;语法分析阶段同 Double tilde (~~) Operator，此处不再赘述。&lt;/p&gt;
&lt;h3&gt;5.2 JavaScriptCore 中的 UnaryPlus&lt;/h3&gt;
&lt;p&gt;语法分析阶段同 Double tilde (~~) Operator，此处不再赘述。&lt;/p&gt;
&lt;h3&gt;5.3 QuickJS 中的 UnaryPlus&lt;/h3&gt;
&lt;p&gt;语法分析阶段同 Double tilde (~~) Operator，此处不再赘述。最后依然走到 &lt;code&gt;JS_CallInternal&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;[→ quickjs.c]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* argv[] is modified if (flags &amp;amp; JS_CALL_FLAG_COPY_ARGV) = 0. */
static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
                               JSValueConst this_obj, JSValueConst new_target,
                               int argc, JSValue *argv, int flags)
{
    JSRuntime *rt = caller_ctx-&amp;gt;rt;
    JSContext *ctx;
    JSObject *p;
    JSFunctionBytecode *b;
    JSStackFrame sf_s, *sf = &amp;amp;sf_s;
    const uint8_t *pc;
// ...省略无关代码

for(;;) {
int call_argc;
JSValue *call_argv;
SWITCH(pc) {
// ...
CASE(OP_plus):
{
    JSValue op1;
uint32_t tag;
op1 = sp[-1];
tag = JS_VALUE_GET_TAG(op1);
if (tag == JS_TAG_INT || JS_TAG_IS_FLOAT64(tag)) {
} else {
if (js_unary_arith_slow(ctx, sp, opcode))
 goto exception;
}
BREAK;
}
// ...省略无关代码
}
}
// ...省略无关代码
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以发现当操作数是 Int 或 Float 时，就直接不处理，和标准中规范的一致。而其他情况就调用 &lt;code&gt;js_unary_arith_slow&lt;/code&gt;，若调用过程中遇到异常就走异常逻辑：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static no_inline __exception int js_unary_arith_slow(JSContext *ctx, JSValue *sp, OPCodeEnum op)
{
    JSValue op1;
    double d;

    op1 = sp[-1];
    if (unlikely(JS_ToFloat64Free(ctx, &amp;amp;d, op1))) {
        sp[-1] = JS_UNDEFINED;
        return -1;
    }
    switch(op) {
    case OP_inc:
        d++;
        break;
    case OP_dec:
        d--;
        break;
    case OP_plus:
        break;
    case OP_neg:
        d = -d;
        break;
    default:
        abort();
    }
    sp[-1] = JS_NewFloat64(ctx, d);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里的 &lt;code&gt;JS_ToFloat64Free&lt;/code&gt; 的内部处理逻辑和和  4.3 时的 &lt;code&gt;JS_ToFloat64Free&lt;/code&gt; 一样，不再赘述。&lt;code&gt;js_unary_arith_slow&lt;/code&gt; 处理完数值转换之后，若运算符是一元运算加号，则直接返回；否则还会根据运算符再做相应的运算处理，如自增符还需要+1 等。&lt;/p&gt;
&lt;p&gt;至此，我们讲解了以下 5 个方法在解释器中的具体实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;parseInt()&lt;/li&gt;
&lt;li&gt;parseFloat()&lt;/li&gt;
&lt;li&gt;Number()&lt;/li&gt;
&lt;li&gt;Double tilde (~~) Operator&lt;/li&gt;
&lt;li&gt;Unary Operator (+)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;除却以上 5 个数值转换方法之外，还有以下 4 个方法，因篇幅问题本文暂且不再详述：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Math.floor()&lt;/li&gt;
&lt;li&gt;Multiply with number&lt;/li&gt;
&lt;li&gt;The Signed Right Shift Operator(&amp;gt;&amp;gt;)&lt;/li&gt;
&lt;li&gt;The Unsigned Right Shift Operator(&amp;gt;&amp;gt;&amp;gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;字符串转数值各有优劣，使用者可根据自己的需要进行选用，以下是我个人总结的一些经验：&lt;/p&gt;
&lt;p&gt;如果返回值只要求整形：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;追求代码简洁和执行效率，对输入值有一定的把握（无需防御），优先选用 Unary Operator (+)&lt;/li&gt;
&lt;li&gt;对输入值没有把握，需要做防御式编程，使用  parseInt()&lt;/li&gt;
&lt;li&gt;需要支持 BigInt， 优先考虑使用 Number() ；如果用 Double tilde (~~) Operator，需要注意 31 位问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果返回值要求浮点型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;追求代码简洁和执行效率，对输入值有一定的把握（无需防御），优先选用 Unary Operator (+)&lt;/li&gt;
&lt;li&gt;对输入值没有把握，需要做防御式编程，使用  parseFloat()&lt;/li&gt;
&lt;li&gt;需要支持 BigInt，使用 parseFloat()&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=js-string-to-number&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>2021，自渡向前</title><link>https://ursb.me/posts/summary-2021/</link><guid isPermaLink="true">https://ursb.me/posts/summary-2021/</guid><description>2021年终总结：完成Flutter Kant开发并集成进QQ音乐，快速晋升T9答辩第一却陷入目标迷茫，反思多线程处理与焦虑情绪，记录多次技术分享与生活点滴。</description><pubDate>Sun, 30 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;又是一年一度的总结之时，总觉得 2021 过得很快，以至于不知道为今年起什么关键词比较合适。想来想去，「自渡向前」蛮不错的。古人说：“行有不得，反求诸己。”当事情遇到阻碍的时候，首先要做的不是归于外因，而是回过头来反省自己。这一年来的个人成长主要来自于内省，而本文的作用也是内省大于总结。正如村上春树一样，我是那种非得亲自动手，将文字落在纸上来才能回溯往事，眺望过去，将它们转换成看得见的文字、读得出声的文章，而“越是书写、越是返回去重读，我越是有一种奇妙的感觉，好像自己正逐渐变得透明。仿佛将手抬到眼前，却能透过它看到对面的微光似的。”希望这个习惯能继续勉励自己向前行进。&lt;/p&gt;
&lt;p&gt;至于 2021，先从工作谈起吧。&lt;/p&gt;
&lt;h2&gt;工作&lt;/h2&gt;
&lt;p&gt;上半年把 Flutter Kant 开发完了，并且把 Flutter 的能力集成到了 QQ 音乐中去，这算是一个里程碑式的项目节点，后续则鲜有机会接触客户端开发，回归为传统的 Web 开发。&lt;/p&gt;
&lt;p&gt;此外，凭借着三连 5 星，年中获得了答 T9 的资格。通过一个月的充分准备，意料之中地通过了答辩，但有些许意料之外的是答辩成绩同期第一。但不管成绩如何，对于答辩而言，结果只有过与不过。入职前，自己未想过仅毕业两年便可达到九级，此刻顺利通过，却无激动之情。不断地成长过程中，早已体会到自己的成长速度大于了毕业时的预期，以至于毕业时 3 年 T9 的目标提前一年完成了。&lt;/p&gt;
&lt;p&gt;在此刻，体验到了失去目标的迷茫感。如果此刻麻木地将下个目标定成来年 T10。如果来年达到了，然后呢？如果达不到呢？需要继续追逐吗？&lt;/p&gt;
&lt;p&gt;这是今年工作中产生的迷茫感，所幸后来找到了解决之道，在后文的「目标」中再详谈。&lt;/p&gt;
&lt;p&gt;今年 Ross 接替 TME CEO，成立了互动直播部门，对应地我这边的工作也从Q 音直播并成了互动直播，部门也搬迁到了科兴。下半年则负责新部门的大项目——懒人专项和 TMELAND 元宇宙。这两个项目做得身心俱疲，涉及跨多部门、跨多业务线、跨多公司之间的远程沟通合作，加班到很晚是家常便饭。百般忙碌，元旦之际，项目都顺利结束了。项目之后，反思了自己在项目过程中的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;多线程事务处理能力薄弱&lt;/strong&gt;。基本上只要事情一多，就忘记「优先级」这回事，基本上谁找的急就先处理谁的事，打断了手上的工作之后「恢复现场」的能力也薄弱。细细想来，我之前一直做的都是「研究型」或者是「专注型」的单一项目，追求心流状态，所以产出效果好。但是，一旦像这般涉及到一个人和 10 端开发、产品、测试对接就会手忙脚乱，乱了阵脚。虽然和 10 端的开发、产品、测试确实事务众多、不好对接，但我也确实毫无处理经验，这也算是一种磨砺吧。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;容易陷入焦虑的负面情绪&lt;/strong&gt;。当事情脱离自己掌控的时候，发现自己会很容易陷入焦虑，从而降低效率并逐渐堕入恶性循环。其实以往很少经历事物摆脱掌控的情况，自己总是牵引着事物发展的那个线，当那根线脱离手中的时候，我也会尽力想办法寻回（如考研初试不如预期，那么就复试好好准备；如高考落榜，那大学就加倍学习研究生考好学校）。但是却未经历过主导权在多个人手上、而不在自己手上，因此眼看事物脱离既定方向，那么自己就陷入焦虑不知所措。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;还有其他我觉得自己做的不够好的地方，比如主人翁意识虽有，但是焦虑之后会失去，没有把它始终放在第一性的位置上。&lt;/p&gt;
&lt;p&gt;两大项目虽已完结，但通过它们意识到了自己的不足之处，让自己未来有了前进的方向。知道自己不够强大，仍需磨砺，这是好事。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/16434480158905/131643536507_.jpg&quot; alt=&quot;&quot; /&gt;年末又获得了五星，四连五星过些日子可以答 10 级了。这次并无多少信心，但结果于我而言并不重要，重要的是过程中可以获得多少经验与成长。&lt;/p&gt;
&lt;h2&gt;生活&lt;/h2&gt;
&lt;p&gt;今年五一的时候丁汀搬走了，转而杰容搬了进来。本科关系极好的舍友，如今再度重逢也是一场缘分。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/16434480158905/111643536492_.jpg&quot; alt=&quot;&quot; /&gt;随之而来的是，家里从之前的猫舍领养了手套的姐姐——小熊猫，一只冷艳的喵，生日和我是同月同日的！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/16434480158905/121643536499_.jpg&quot; alt=&quot;&quot; /&gt;团建去了长沙，和组内的伙伴们躺尸玩 Switch（Switch 果然一个人玩不起来！），疯狂喝茶颜悦色，真是浪荡而又自由的日子呀！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/16434480158905/141643536519_.jpg&quot; alt=&quot;&quot; /&gt;期间去了广州 CVTE 做了一次分享，和书包面基了，只可惜没有吃到心心念念的“摩打食堂”，转而吃了另一家我大学时很喜欢的“从前的小酒馆”。味道不如从前，但或许是缘分，那天过后才知道原来去吃的那晚是小酒馆最后一天营业。&lt;/p&gt;
&lt;h2&gt;书影音&lt;/h2&gt;
&lt;p&gt;电影、动漫、剧集看了不少：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;《开端》：超赞！&lt;/li&gt;
&lt;li&gt;《鬼灭之刃：无限列车》：唯一一部看哭了的动漫 QAQ&lt;/li&gt;
&lt;li&gt;《国王排名》：因为破圈看的，最近几周发现质量大不如前，有烂尾倾向。&lt;/li&gt;
&lt;li&gt;《失控玩家》：GTA5 电影版。&lt;/li&gt;
&lt;li&gt;《入殓师》：节奏缓慢的艺术品，值得反复观看体会。&lt;/li&gt;
&lt;li&gt;《哆啦A梦：伴我同行 2》：看在前作的优异表现才去看的，没想到这部低龄向了。&lt;/li&gt;
&lt;li&gt;《波斯语课》：用优美的假话，讲彻骨的罪恶。&lt;/li&gt;
&lt;li&gt;《怪奇宅》：韩国经典恐怖片，全程闭着眼看完的。&lt;/li&gt;
&lt;li&gt;《明日边缘》：也是一部无限流的电影，值得推荐。&lt;/li&gt;
&lt;li&gt;《明日之战》：……&lt;/li&gt;
&lt;li&gt;《你好世界》：&lt;/li&gt;
&lt;li&gt;《寂静之地 2》：三线并行那段剧情的节奏感拿捏得很好，故事性则一般般，原以为可以更宏大些。&lt;/li&gt;
&lt;li&gt;《心灵奇旅》：蛮符合我价值观的一部电影。&lt;/li&gt;
&lt;li&gt;《海兽之子》：蛮意识流的一部动漫，导演想表达的很多，但觉得有些故作深刻。&lt;/li&gt;
&lt;li&gt;《头脑特工队》：超赞的故事表现力和温柔的想象力，如同魔法一般娓娓道来小女孩的心路历程。&lt;/li&gt;
&lt;li&gt;《洛基》：漫威反英雄之作，超爱女洛基！&lt;/li&gt;
&lt;li&gt;《猎鹰与冬兵》：猎鹰的人物弧光。&lt;/li&gt;
&lt;li&gt;《旺达幻视》：超超超超赞的 idea，也只有漫威敢这么玩还能收获意想不到的效果，强烈推荐一看！（我记得《刺客聂隐娘》用过类似的手法，虽然更为内敛，但是显得更为沉闷，很多观众并不买账）&lt;/li&gt;
&lt;li&gt;《哥斯拉大战金刚》：忘了讲啥，就记得哥斯拉、金刚、机器哥斯拉打了一架…别欺负金刚了。&lt;/li&gt;
&lt;li&gt;《刺杀小说家》：只记得浪费了自己一个周六的上午……&lt;/li&gt;
&lt;li&gt;《你好，李焕英 》：值得带家人一起看。&lt;/li&gt;
&lt;li&gt;《温泉屋的小老板娘》：精心布置的环境、安排的角色，虽不是童话故事，但胜似童话。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;书籍读的不多，大多是听书的，那些就不列了。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;《夏日重现》：六星推荐（满分五星）！今年四月动漫化！一个周末看完的漫画，逻辑自洽，智商在线的无限流超自然悬疑恐怖推理温暖治愈智斗漫！&lt;/li&gt;
&lt;li&gt;《被讨厌的勇气》&lt;/li&gt;
&lt;li&gt;《心》&lt;/li&gt;
&lt;li&gt;《弃猫》&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;分享&lt;/h2&gt;
&lt;p&gt;除了 CVTE 的技术分享，还在组内做了一些短小的 Flutter 分享。还有受邀去深圳 Apple 园区做 iOS Club 分享，以及受邀对本科专业新生的分享。&lt;/p&gt;
&lt;p&gt;前几个偏技术，这里不回顾了，想着重回顾下对新生的分享——那次分享我准备的题目是《何以问学》。&lt;/p&gt;
&lt;p&gt;分享分为三节：感知与真实、学习法、思想与梦想。&lt;/p&gt;
&lt;p&gt;分别回答了三个常见问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为什么要学习(Why)？&lt;/li&gt;
&lt;li&gt;怎样高效学习(How)？&lt;/li&gt;
&lt;li&gt;该学习些什么(What)？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里想记录一下我对第一个问题的解答过程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从「为什么我们无法感知到真实的世界」这个问题入手，分享了「解读世界的模型理论」；&lt;/li&gt;
&lt;li&gt;之后回答「我们解读世界之后，又如何评价行为」这个问题，引出「立场」的概念——如《齐物论》中“自彼则不见，自知（成心/立场）则知之”，只有从立场出发，我们才能对事物有所把握；&lt;/li&gt;
&lt;li&gt;之后探讨「立场真的重要吗」，分析我们为什么要「求真」，得出大脑决策的过程；&lt;/li&gt;
&lt;li&gt;通过分析「逻辑是一个对象在一个概念之下」这个命题，推断出「能够被我们把握到的只是个体的特征，具体的个体则无法把握」，从而得出结论「我们心中一个概念的形成，就是由这些个无数视域融合后的结果。」&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;结合以上论证过程，探讨一下我们为什么要学习？&lt;/p&gt;
&lt;p&gt;我这里总结了四点，记录之，望共勉：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;完善模型&lt;/strong&gt;：正确认识我们所处世界，培养好的三观。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开阔视野&lt;/strong&gt;：提升立足维度，丰富自己的历史文化视域，以便从更高的维度下看待问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;明辨是非&lt;/strong&gt;：知道什么是对的，并且勇于践行对的事情、抵制错的观念。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;培育共情&lt;/strong&gt;：能够体谅世间疾苦，体会周遭情感，也能善于发现幸福与美好。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/16434480158905/101643536454_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;目标&lt;/h2&gt;
&lt;p&gt;文章的最后，写写来年的目标。回过头来看了去年的 Flag，大多未曾完成，就和 lulu 谈论了下年终总结的必要性。每个人写年终总结的目的是不同的，有些人是想通过发现去年的问题，规划好来年的目标，改进自己的不足；有些人则是单纯的记录，想留下去年某刻记忆深刻的场景，以便未来翻阅时能勾起回忆，再度体验那时的心情。而我的目的如同开篇所言，是从记录中反思，以便自己未来不断重温时能体悟到不同的感觉。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/16434480158905/91643536453_.pic.jpg&quot; alt=&quot;&quot; /&gt;这么看来，Flag 并不重要。但也要反思下去年的 Flag 为什么没有完成，想来应该是缺少了及时的回顾机制。因此来年想使用「专项目标+月度回顾」的方式来执行计划，专项目标是动态的、短期的，尽可能控制在一个计划可以在 3 周内完成的量；月度回顾则使用复盘报告的形式输出。&lt;/p&gt;
&lt;p&gt;此外，去年探索了不少好习惯，希望记录下来来年能够继续保持。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;碎片摄取&lt;/strong&gt;：学习的时间除却周末以外并没有其他整段的时间了，但发现走路上下班是一个极棒的听书时间，恰好一天上下班的时间可以听完一本书~而手机上阅读的公众号文章或者 PC 端看的博文、报告等，都使用 Drafts 随手当草稿记录下来。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定期整合&lt;/strong&gt;：但是现阶段快节奏的工作、各类短视频、快餐式娱乐充斥着生活，碎片化地学习很容易让自己变成「碎片人」，盲目追求高效率容易高消耗，人生就变成了空洞的碎片，由此恍然之间的荒谬感才自觉生命形态已经不完整了。因此，每个周六我会定时去整理本周 Draft 的记录，汇成笔记，之后再去看别的。只是碎片采集、碎片摄取，却不定期整合，就会陷入只有输入、没有消化的境地之中。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/16434480158905/81643536452_.pic.jpg&quot; alt=&quot;&quot; /&gt;生活上的目标：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;修炼自己的心性，以感恩的心、谦卑的心接受一切成功与失败。尽可能不为不值得的欲望动心，是孔子「绝粮于陈蔡」淡定、是阳明「以不第动心为耻」的坚定。&lt;/li&gt;
&lt;li&gt;向往东坡式的诗意人生，不是消极的避世，而是超然物外的洒脱，宠辱不惊的淡泊。&lt;/li&gt;
&lt;li&gt;保持好奇，不断地好奇；追求真知，仅为求知而求知。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;工作上的目标，则引用任天堂岩田先生的一句座右铭： “在工作中与人合作， 要让对方说出‘下次也想跟那家伙一起工作’。”&lt;/p&gt;
&lt;p&gt;最后，愿自己的 2022，依然能认真且积极地活着。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/16434480158905/151643536520_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=summary-2021&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>谈谈存在的价值与人生体验</title><link>https://ursb.me/posts/life/</link><guid isPermaLink="true">https://ursb.me/posts/life/</guid><description>从存在主义视角探讨人生意义与价值幻灭的命题，主张人生本无意义、需靠自我锚定赋予意义，并给出体验人生的六条实践建议，包括甘于平凡、拉长视野、多元包容与寻求联结。</description><pubDate>Sun, 11 Jul 2021 00:00:00 GMT</pubDate><content:encoded>从存在主义视角探讨人生意义与价值幻灭的命题，主张人生本无意义、需靠自我锚定赋予意义，并给出体验人生的六条实践建议，包括甘于平凡、拉长视野、多元包容与寻求联结。&lt;img src=&quot;https://ursb.me/api/rss-track?post=life&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>essays</category></item><item><title>Flutter 产物分析与减包方案</title><link>https://ursb.me/posts/flutter-reduce/</link><guid isPermaLink="true">https://ursb.me/posts/flutter-reduce/</guid><description>围绕产物构成分析与减包方案两个主题，分别讲解 iOS 与 Android 两端 Flutter 应用瘦身的原理、哪些内容可以精简，以及被精简部分的还原方法。</description><pubDate>Sat, 01 May 2021 00:00:00 GMT</pubDate><content:encoded>围绕产物构成分析与减包方案两个主题，分别讲解 iOS 与 Android 两端 Flutter 应用瘦身的原理、哪些内容可以精简，以及被精简部分的还原方法。&lt;img src=&quot;https://ursb.me/api/rss-track?post=flutter-reduce&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Roam Research 最佳实践——知识管理与任务管理</title><link>https://ursb.me/posts/roam-research/</link><guid isPermaLink="true">https://ursb.me/posts/roam-research/</guid><description>分享作者使用 Roam Research 一年后摸索出的知识管理与任务管理方法，介绍 Page 与 Block 的双向链接机制、标签体系与阅读笔记技巧，以及每日任务复盘与长期计划管理实践。</description><pubDate>Sat, 03 Apr 2021 00:00:00 GMT</pubDate><content:encoded>分享作者使用 Roam Research 一年后摸索出的知识管理与任务管理方法，介绍 Page 与 Block 的双向链接机制、标签体系与阅读笔记技巧，以及每日任务复盘与长期计划管理实践。&lt;img src=&quot;https://ursb.me/api/rss-track?post=roam-research&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>如何有效沟通——从《齐物论》立场问题切入</title><link>https://ursb.me/posts/homogeneous/</link><guid isPermaLink="true">https://ursb.me/posts/homogeneous/</guid><description>从《齐物论》中的立场问题切入，借助推理阶梯模型分析沟通中态度与判断的形成机制，探讨达成有效沟通与共识的方法。</description><pubDate>Tue, 09 Mar 2021 00:00:00 GMT</pubDate><content:encoded>从《齐物论》中的立场问题切入，借助推理阶梯模型分析沟通中态度与判断的形成机制，探讨达成有效沟通与共识的方法。&lt;img src=&quot;https://ursb.me/api/rss-track?post=homogeneous&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>essays</category></item><item><title>Flutter 异常处理方案——灰度与降级</title><link>https://ursb.me/posts/flutter-downgrade/</link><guid isPermaLink="true">https://ursb.me/posts/flutter-downgrade/</guid><description>梳理 Dart 异常、Framework 异常与 Engine 异常等 Flutter 异常的分类与捕获方式，介绍针对不同异常场景设计的灰度发布与降级容灾方案，用以提升线上应用的稳定性。</description><pubDate>Thu, 18 Feb 2021 00:00:00 GMT</pubDate><content:encoded>梳理 Dart 异常、Framework 异常与 Engine 异常等 Flutter 异常的分类与捕获方式，介绍针对不同异常场景设计的灰度发布与降级容灾方案，用以提升线上应用的稳定性。&lt;img src=&quot;https://ursb.me/api/rss-track?post=flutter-downgrade&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>2020，追逐星火</title><link>https://ursb.me/posts/summary-2020/</link><guid isPermaLink="true">https://ursb.me/posts/summary-2020/</guid><description>2020年终总结：疫情中工作从绿钻转岗直播并全年投入Flutter，总结沟通、思考、复盘等工作方法论，写下两万字长文剖析《光·遇》，学做饭并陪伴爱猫渡过意外。</description><pubDate>Sat, 06 Feb 2021 00:00:00 GMT</pubDate><content:encoded>2020年终总结：疫情中工作从绿钻转岗直播并全年投入Flutter，总结沟通、思考、复盘等工作方法论，写下两万字长文剖析《光·遇》，学做饭并陪伴爱猫渡过意外。&lt;img src=&quot;https://ursb.me/api/rss-track?post=summary-2020&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>《光·遇》之“禅”</title><link>https://ursb.me/posts/sky/</link><guid isPermaLink="true">https://ursb.me/posts/sky/</guid><description>从美学、心理学、解释学与存在主义四个视角，分析游戏《光·遇》的美术意象、核心玩法与禅意社交设计，探讨这类第九艺术游戏带来的情感体验与精神慰藉。</description><pubDate>Thu, 08 Oct 2020 00:00:00 GMT</pubDate><content:encoded>从美学、心理学、解释学与存在主义四个视角，分析游戏《光·遇》的美术意象、核心玩法与禅意社交设计，探讨这类第九艺术游戏带来的情感体验与精神慰藉。&lt;img src=&quot;https://ursb.me/api/rss-track?post=sky&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>essays</category></item><item><title>Flutter 核心原理与混合开发模式</title><link>https://ursb.me/posts/flutter-kant/</link><guid isPermaLink="true">https://ursb.me/posts/flutter-kant/</guid><description>从 Flutter 的绘制原理与整体架构出发，对比三种主流跨端方案的实现思路，并系统梳理四种 Flutter 混合开发模式的原理与工程化探索经验。</description><pubDate>Tue, 30 Jun 2020 00:00:00 GMT</pubDate><content:encoded>从 Flutter 的绘制原理与整体架构出发，对比三种主流跨端方案的实现思路，并系统梳理四种 Flutter 混合开发模式的原理与工程化探索经验。&lt;img src=&quot;https://ursb.me/api/rss-track?post=flutter-kant&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Flutter 混合开发框架模式探索</title><link>https://ursb.me/posts/flutter-hybrid/</link><guid isPermaLink="true">https://ursb.me/posts/flutter-hybrid/</guid><description>分析 Flutter 混合开发框架应具备的路由栈管理、生命周期通知等核心能力，并结合 Flutter Boost、Thrio、QFlutter 等方案探讨其架构设计。</description><pubDate>Sat, 18 Apr 2020 00:00:00 GMT</pubDate><content:encoded>分析 Flutter 混合开发框架应具备的路由栈管理、生命周期通知等核心能力，并结合 Flutter Boost、Thrio、QFlutter 等方案探讨其架构设计。&lt;img src=&quot;https://ursb.me/api/rss-track?post=flutter-hybrid&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Flutter Boost 混合开发实践与源码解析</title><link>https://ursb.me/posts/flutter-boost-android/</link><guid isPermaLink="true">https://ursb.me/posts/flutter-boost-android/</guid><description>介绍闲鱼团队开源的 Flutter Boost 混合开发框架，解析其基于共享引擎实现的容器通信机制、页面生命周期管理与路由栈方案的源码原理。</description><pubDate>Sat, 07 Mar 2020 00:00:00 GMT</pubDate><content:encoded>介绍闲鱼团队开源的 Flutter Boost 混合开发框架，解析其基于共享引擎实现的容器通信机制、页面生命周期管理与路由栈方案的源码原理。&lt;img src=&quot;https://ursb.me/api/rss-track?post=flutter-boost-android&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>2019，走走停停</title><link>https://ursb.me/posts/summary-2019/</link><guid isPermaLink="true">https://ursb.me/posts/summary-2019/</guid><description>2019年终总结：硕士论文完成并入职QQ音乐做产品开发与技术分享，「双生日记3.0」开发跳票，赴美参加WWDC，记录全年的游戏、影视、阅读与养猫日常。</description><pubDate>Thu, 09 Jan 2020 00:00:00 GMT</pubDate><content:encoded>2019年终总结：硕士论文完成并入职QQ音乐做产品开发与技术分享，「双生日记3.0」开发跳票，赴美参加WWDC，记录全年的游戏、影视、阅读与养猫日常。&lt;img src=&quot;https://ursb.me/api/rss-track?post=summary-2019&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>React Hooks 源码解析（4）：useEffect</title><link>https://ursb.me/posts/react-hooks-4/</link><guid isPermaLink="true">https://ursb.me/posts/react-hooks-4/</guid><description>React Hooks 源码解析系列第四篇，剖析 useEffect 为何能取代生命周期方法处理副作用，讲解其用法与依赖数组机制，并结合 mountEffect、updateEffect 源码说明具体实现细节。</description><pubDate>Tue, 03 Dec 2019 00:00:00 GMT</pubDate><content:encoded>React Hooks 源码解析系列第四篇，剖析 useEffect 为何能取代生命周期方法处理副作用，讲解其用法与依赖数组机制，并结合 mountEffect、updateEffect 源码说明具体实现细节。&lt;img src=&quot;https://ursb.me/api/rss-track?post=react-hooks-4&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>React Hooks 源码解析（3）：useState</title><link>https://ursb.me/posts/react-hooks-3/</link><guid isPermaLink="true">https://ursb.me/posts/react-hooks-3/</guid><description>React Hooks 源码解析系列第三篇，聚焦 useState 的用法、设计动机与调用规则，从零动手实现一个简化版 useState，再深入 React 源码逐行解读其真实运行原理与内部机制。</description><pubDate>Sat, 09 Nov 2019 00:00:00 GMT</pubDate><content:encoded>React Hooks 源码解析系列第三篇，聚焦 useState 的用法、设计动机与调用规则，从零动手实现一个简化版 useState，再深入 React 源码逐行解读其真实运行原理与内部机制。&lt;img src=&quot;https://ursb.me/api/rss-track?post=react-hooks-3&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>React Hooks 源码解析（2）: 组件逻辑复用与扩展</title><link>https://ursb.me/posts/react-hooks-2/</link><guid isPermaLink="true">https://ursb.me/posts/react-hooks-2/</guid><description>React Hooks 源码解析系列第二篇，梳理 Mixins、类继承、高阶组件、Render Props 五种组件逻辑复用方案的优缺点，并用代码示例说明高阶组件的两种实现方式。</description><pubDate>Wed, 11 Sep 2019 00:00:00 GMT</pubDate><content:encoded>React Hooks 源码解析系列第二篇，梳理 Mixins、类继承、高阶组件、Render Props 五种组件逻辑复用方案的优缺点，并用代码示例说明高阶组件的两种实现方式。&lt;img src=&quot;https://ursb.me/api/rss-track?post=react-hooks-2&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>React Hooks 源码解析（1）：类组件、函数组件、纯组件</title><link>https://ursb.me/posts/react-hooks-1/</link><guid isPermaLink="true">https://ursb.me/posts/react-hooks-1/</guid><description>React Hooks 源码解析系列第一篇，对比类组件、函数组件与纯组件在使用方式与性能表现上的差异，从 React 源码解读 Component、PureComponent 及其更新判定机制的实现原理。</description><pubDate>Tue, 03 Sep 2019 00:00:00 GMT</pubDate><content:encoded>React Hooks 源码解析系列第一篇，对比类组件、函数组件与纯组件在使用方式与性能表现上的差异，从 React 源码解读 Component、PureComponent 及其更新判定机制的实现原理。&lt;img src=&quot;https://ursb.me/api/rss-track?post=react-hooks-1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>WWDC19 游记</title><link>https://ursb.me/posts/wwdc-19/</link><guid isPermaLink="true">https://ursb.me/posts/wwdc-19/</guid><description>记录作为 Scholar 亲赴美国参加 WWDC19 的旅行见闻，涵盖航班波折、圣何塞与硅谷见闻、结识编程启蒙老师与网红博主的经历，以及对成长、梦想与人生意义的感悟。</description><pubDate>Thu, 13 Jun 2019 00:00:00 GMT</pubDate><content:encoded>记录作为 Scholar 亲赴美国参加 WWDC19 的旅行见闻，涵盖航班波折、圣何塞与硅谷见闻、结识编程启蒙老师与网红博主的经历，以及对成长、梦想与人生意义的感悟。&lt;img src=&quot;https://ursb.me/api/rss-track?post=wwdc-19&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>双生日记开发经验分享</title><link>https://ursb.me/posts/2life-develop-experience/</link><guid isPermaLink="true">https://ursb.me/posts/2life-develop-experience/</guid><description>分享双生日记小程序从立项、设计、开发到维护的完整研发流程与团队协作方法，涵盖脑暴文档整理、设计工具选型、开发环境配置及问题跟踪等具体实践经验。</description><pubDate>Sat, 11 May 2019 00:00:00 GMT</pubDate><content:encoded>分享双生日记小程序从立项、设计、开发到维护的完整研发流程与团队协作方法，涵盖脑暴文档整理、设计工具选型、开发环境配置及问题跟踪等具体实践经验。&lt;img src=&quot;https://ursb.me/api/rss-track?post=2life-develop-experience&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>前端安全 | HPP 的攻击举例与防范</title><link>https://ursb.me/posts/hpp/</link><guid isPermaLink="true">https://ursb.me/posts/hpp/</guid><description>介绍 HTTP 参数污染（HPP）攻击的原理与常见的注入型漏洞利用手法，结合 HackerOne 社交分享按钮的真实漏洞案例，讲解相应的检测与防范措施。</description><pubDate>Wed, 10 Apr 2019 00:00:00 GMT</pubDate><content:encoded>介绍 HTTP 参数污染（HPP）攻击的原理与常见的注入型漏洞利用手法，结合 HackerOne 社交分享按钮的真实漏洞案例，讲解相应的检测与防范措施。&lt;img src=&quot;https://ursb.me/api/rss-track?post=hpp&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>前端安全 | XST 的攻击原理与防御</title><link>https://ursb.me/posts/xst/</link><guid isPermaLink="true">https://ursb.me/posts/xst/</guid><description>解析 XST 跨站追踪攻击的原理：通过 TRACE / TRACK 请求获取网站中 httpOnly Cookie 等敏感请求头信息，并介绍禁用 Trace 方法与浏览器层面拦截等前端防御手段。</description><pubDate>Tue, 09 Apr 2019 00:00:00 GMT</pubDate><content:encoded>解析 XST 跨站追踪攻击的原理：通过 TRACE / TRACK 请求获取网站中 httpOnly Cookie 等敏感请求头信息，并介绍禁用 Trace 方法与浏览器层面拦截等前端防御手段。&lt;img src=&quot;https://ursb.me/api/rss-track?post=xst&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>前端安全 | CSRF 的攻击手段与防范</title><link>https://ursb.me/posts/csrf/</link><guid isPermaLink="true">https://ursb.me/posts/csrf/</guid><description>系统讲解 CSRF 跨站请求伪造的攻击原理与 GET、POST、链接三种攻击类型，并对比同源检测、SameSite Cookie 与 Token 校验等前后端防御方案的适用场景与局限。</description><pubDate>Mon, 08 Apr 2019 00:00:00 GMT</pubDate><content:encoded>系统讲解 CSRF 跨站请求伪造的攻击原理与 GET、POST、链接三种攻击类型，并对比同源检测、SameSite Cookie 与 Token 校验等前后端防御方案的适用场景与局限。&lt;img src=&quot;https://ursb.me/api/rss-track?post=csrf&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>前端安全 | XSS 的攻击手段与防范</title><link>https://ursb.me/posts/xss/</link><guid isPermaLink="true">https://ursb.me/posts/xss/</guid><description>系统讲解反射型、存储型、DOM 型与 JSONP 型四类 XSS 跨站脚本攻击手段的原理与代码示例，并总结输入输出转义、CSP 安全头、HttpOnly Cookie 等前端安全防御方案。</description><pubDate>Sun, 07 Apr 2019 00:00:00 GMT</pubDate><content:encoded>系统讲解反射型、存储型、DOM 型与 JSONP 型四类 XSS 跨站脚本攻击手段的原理与代码示例，并总结输入输出转义、CSP 安全头、HttpOnly Cookie 等前端安全防御方案。&lt;img src=&quot;https://ursb.me/api/rss-track?post=xss&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>人工意识何以可能？</title><link>https://ursb.me/posts/ai-consciousness/</link><guid isPermaLink="true">https://ursb.me/posts/ai-consciousness/</guid><description>从《底特律：成为人类》等科幻作品切入，梳理身心二元论、行为主义、物理主义与功能主义等心灵哲学理论，结合中文屋实验探讨人工意识在理论上能否成立。</description><pubDate>Sat, 09 Mar 2019 00:00:00 GMT</pubDate><content:encoded>从《底特律：成为人类》等科幻作品切入，梳理身心二元论、行为主义、物理主义与功能主义等心灵哲学理论，结合中文屋实验探讨人工意识在理论上能否成立。&lt;img src=&quot;https://ursb.me/api/rss-track?post=ai-consciousness&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>essays</category></item><item><title>文献阅读与论文写作的方法之己见</title><link>https://ursb.me/posts/how-write-essay/</link><guid isPermaLink="true">https://ursb.me/posts/how-write-essay/</guid><description>分享个人在文献阅读与论文写作方面的心得，将过程拆解为收集、阅读、学习、构建与写作五个阶段，供读者参考借鉴。</description><pubDate>Thu, 07 Feb 2019 00:00:00 GMT</pubDate><content:encoded>分享个人在文献阅读与论文写作方面的心得，将过程拆解为收集、阅读、学习、构建与写作五个阶段，供读者参考借鉴。&lt;img src=&quot;https://ursb.me/api/rss-track?post=how-write-essay&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>essays</category></item><item><title>2018，沉淀初心</title><link>https://ursb.me/posts/summary-2018/</link><guid isPermaLink="true">https://ursb.me/posts/summary-2018/</guid><description>2018年终总结：暑期实习拿下QQ音乐录用函并留任，专注哲学硕士论文写作，独立开发心理产品「双生日记」获全国奖项，同时经历分手与对未来的思考。</description><pubDate>Sun, 03 Feb 2019 00:00:00 GMT</pubDate><content:encoded>2018年终总结：暑期实习拿下QQ音乐录用函并留任，专注哲学硕士论文写作，独立开发心理产品「双生日记」获全国奖项，同时经历分手与对未来的思考。&lt;img src=&quot;https://ursb.me/api/rss-track?post=summary-2018&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>「没有你，也很好。」</title><link>https://ursb.me/posts/wreak-it/</link><guid isPermaLink="true">https://ursb.me/posts/wreak-it/</guid><description>借观影《无敌破坏王 2》抒写对友情与成长的感悟，讲述拉尔夫与云妮从相互依赖到学会放手的故事，感叹真正的友谊无需时刻相伴，也能给予彼此持久的力量。</description><pubDate>Wed, 12 Dec 2018 00:00:00 GMT</pubDate><content:encoded>借观影《无敌破坏王 2》抒写对友情与成长的感悟，讲述拉尔夫与云妮从相互依赖到学会放手的故事，感叹真正的友谊无需时刻相伴，也能给予彼此持久的力量。&lt;img src=&quot;https://ursb.me/api/rss-track?post=wreak-it&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>essays</category></item><item><title>Web 模拟终端博客系统</title><link>https://ursb.me/posts/web-terminal/</link><guid isPermaLink="true">https://ursb.me/posts/web-terminal/</guid><description>介绍一个模拟Mac终端界面的Web博客系统，讲解如何用HTML、CSS与JavaScript实现命令输入与渲染逻辑，以及help、clear、ls等命令背后的前端交互与后端接口设计思路。</description><pubDate>Thu, 30 Aug 2018 00:00:00 GMT</pubDate><content:encoded>介绍一个模拟Mac终端界面的Web博客系统，讲解如何用HTML、CSS与JavaScript实现命令输入与渲染逻辑，以及help、clear、ls等命令背后的前端交互与后端接口设计思路。&lt;img src=&quot;https://ursb.me/api/rss-track?post=web-terminal&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>在线学习资源智慧推送系统研究</title><link>https://ursb.me/posts/learning-system/</link><guid isPermaLink="true">https://ursb.me/posts/learning-system/</guid><description>该论文研究如何构建网络学习空间下的智慧学习资源推送系统，涵盖数据存储、学习者建模、知识建模与推送算法设计，并整合 Dijkstra、UserCF、ItemCF、CAS 等算法实现自适应推荐。</description><pubDate>Fri, 02 Jun 2017 00:00:00 GMT</pubDate><content:encoded>该论文研究如何构建网络学习空间下的智慧学习资源推送系统，涵盖数据存储、学习者建模、知识建模与推送算法设计，并整合 Dijkstra、UserCF、ItemCF、CAS 等算法实现自适应推荐。&lt;img src=&quot;https://ursb.me/api/rss-track?post=learning-system&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>再见了，我的大学</title><link>https://ursb.me/posts/summary-2017/</link><guid isPermaLink="true">https://ursb.me/posts/summary-2017/</guid><description>回顾在广州大学的四年：从沉迷游戏到转向技术开发，经历血气胸重病与考研波折，从计算机转考哲学，最终考入中山大学哲学系，告别校园与相遇的人们。</description><pubDate>Sun, 16 Apr 2017 00:00:00 GMT</pubDate><content:encoded>回顾在广州大学的四年：从沉迷游戏到转向技术开发，经历血气胸重病与考研波折，从计算机转考哲学，最终考入中山大学哲学系，告别校园与相遇的人们。&lt;img src=&quot;https://ursb.me/api/rss-track?post=summary-2017&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>6 万部豆瓣电影数据分析</title><link>https://ursb.me/posts/douban-movie-analysis/</link><guid isPermaLink="true">https://ursb.me/posts/douban-movie-analysis/</guid><description>基于抓取的 6 万余部豆瓣电影数据，对比中国电影与其他国家和地区电影的评分分布，分析豆瓣评分是否存在「信用危机」争议中所说的失真问题。</description><pubDate>Mon, 16 Jan 2017 00:00:00 GMT</pubDate><content:encoded>基于抓取的 6 万余部豆瓣电影数据，对比中国电影与其他国家和地区电影的评分分布，分析豆瓣评分是否存在「信用危机」争议中所说的失真问题。&lt;img src=&quot;https://ursb.me/api/rss-track?post=douban-movie-analysis&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>B 站 2000 万用户分析</title><link>https://ursb.me/posts/bilibili-user/</link><guid isPermaLink="true">https://ursb.me/posts/bilibili-user/</guid><description>作者抓取并分析了 B 站全部 2000 万注册用户的数据，从性别、年龄、地区与注册时间等维度呈现平台早期用户画像，发现男女比例接近、用户以九零后学生群体为主。</description><pubDate>Tue, 23 Feb 2016 00:00:00 GMT</pubDate><content:encoded>作者抓取并分析了 B 站全部 2000 万注册用户的数据，从性别、年龄、地区与注册时间等维度呈现平台早期用户画像，发现男女比例接近、用户以九零后学生群体为主。&lt;img src=&quot;https://ursb.me/api/rss-track?post=bilibili-user&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item></channel></rss>