普通视图

发现新文章,点击刷新页面。
昨天以前Jim Luo's blog

城与书

作者 JimLuo
2025年6月30日 08:00
回看我在notion中整理六十余本看过的书,结合当时我所在的地点,能够还原出我当时的精神状态。至于为什么,多半是我感到被“困”住了,希望能借阅读来寻找答案。

深圳

说起深圳这座城市可能想到的是“来了就是深圳人”抑或是所谓的“年轻”和“包容”等词汇。城市确实是很年轻,年轻得容不下行动不便的老人、也容不下不求“上进”的平凡人。这座城市绕不过两个字——“搞钱”。我在深圳的那段日子里,无论是午饭时间还是周末爬山的路上,都从路人的只言片语中听到了“职级”、“大包”以及一些让人羡慕的数字。在我耳濡目染这些词语后,我鬼使神差地开始看起了《富爸爸穷爸爸》、《穷查理宝典》等投资理财方面的书籍,随即开了美股账户一点点地实践,经历一些大起大落后虽最终没跑赢大盘,也算是有可观的被动收入。
有段日子,我对工作的热情减退了,开始关注周边的人。午饭时,因就餐的餐厅在商场一楼的缘故,我通常会选择靠窗的位置,隔着玻璃看路边的行人——行色匆匆的外卖小哥、躺在树下神情落寞的务工人员、喝着奶茶相谈甚欢的职场人士。在我的描述中,他们的身份都被工作所标注了,当没有工作的时候他们是谁?
当时,我的消费欲望很高涨加上投资才刚开始。如果没了工作,我就没持续和稳定的入金来维持当前的消费水平。如果碰上技术变革抑或是廉价劳动力的出现,那样我就会处于一种无法维持生活也无法成为“合格”劳动者的尴尬局面。所以我在读了《工作、消费主义和新穷人》,发现了自己原来是被困在一种人为的“不安”感之中:工作-> 赚钱 -> 消费满足欲望 -> 继续工作的循环;我不消费后,我的标签是什么; 我不消费后,我又如何去获得满足。从消费中的快乐并不是真正的快乐,只是欲望短暂的满足,之后很快就会被新的欲望给填补。最后,我变卖了绝大部分不需要的东西,便前往下一个目的地。

广州

来到广州,第一反应就是又能讲粤语了,此前在深圳生活时一点粤语都用不上让我有点无奈。我选择了定居在老城区,因为那我能感受到些人情味,而且美食多多。说到美食,老城区中的美食数不胜数,而且价格也不错。那一年应该是我在吃这方面最“挑剔”的日子,我指的不是食物的本生,而是就餐的“环境”。早餐,我一般选择在小学门口的肠粉店;午餐,我事儿在烧腊店,事儿在快餐店;晚上如果我不fasting便选择在大排档。正如上面提到的,我喜欢观察周围的人和事,这些地点正是绝佳的场所。彼时我读《非暴力沟通》,懂得了在校门口父母与小孩那些源于父母对孩子的要求没达到满足的争吵,在对话的一开始便是父母撂下的一道道命令而不是请求。
我的作息有时候会出现一个断层,一个月中有一两个晚上会无法入睡。我也无法集中注意到代码上,便一两点时下楼骑上共享单车,开始进行“人间观察”。夜里,我感受到了街头宵夜的如火如荼、听到顾客们的欢声笑语;也感受到街尾医院门口送餐的人们和在医院门口透气、眼里满是焦虑的家属。有时我会去宵夜摊上点些小炒静待这座城市的苏醒,有时我会驻足医院门口对面,感受“人生无常”。我看了《人生的智慧》和《控糖革命》,从饮食上摒弃之前不规律的进食,也时常fasting(断食)来让血糖平稳、 让身体“平静”。从反面去评价,宵夜摊里吃东西的人有说有笑,此时笑得多的人便是幸福;街尾医院门口的患者及其家属说说笑笑,庆幸只是小病而不是重症,此时他们也是幸福的。

伦敦

未完待续……

2024年终总结

作者 JimLuo
2024年12月25日 08:00
更迭似乎是不可避免的主题,我又一次孤身一人开始了新的旅途,遂留下些许笔墨全当旅行日志。因本人过去经历使然,里面会有几分自嘲的话语,望各位海涵。

工作与学习

 
每次更换新的平台时,结识新的朋友亦或是组员,总难免产生“冒名顶替”的自我怀疑。每个人都有非常出色的能力,相比之下,觉得自己能踏入这个平台纯粹是因为运气,但运气不能让我走得更远。所幸后来几次交谈后,我受益良多,开始向他们看齐,也在之后的组会里也有所许突破。
在工作的内容方面,我也放下所追求的“掌控感”,开始把自己熟悉领域的部分‘outsourcing’给别人,自己专注于一些探索性的工作。即便他人的执行结果不如人意,我也能及时出手做为backup plan。之前的工作经历给我带来的启示我也一直沿用至今:
  • 对一同共事的伙伴予以足够的信任
  • 给予足够的自由度
  • 多鼓励新的实现和做法
或许有人听我说过自己很“菜”,你可以说是Dunning–Kruger effect,但我更倾向是:因为我把“知道”某样东西的标准定得较高——能了解基本知识点的同时能提出建设性的问题并能跟领域从业人员“聊上两句”;愈发深入一个领域,越会感受到自身知识的渺小和局限。正如闫老在games 101中提过自己学到后面发现自己其实“什么都不懂”,可能这就是所谓的“知道的越多知道的越少”。

娱乐

阅读

 
notion image
由于本人文化水平有限,今年只读了15本书。除此之外,有些博客和paper让我印象深刻,比如Paul Graham的 writes and write-nots,讲的是作者对今后写作人群的预测和见解,作者预测今后只有两类人群:一类是善于写作者,一类是完全不写者,介乎二者之间的人群将会消失,而写作本质上即是思考的具象化,因此这一预测实则是对思考群体的一种划分;一篇叫 The opponent-process theory of acquired motivation: The costs of pleasure and the benefits of pain. 的论文,主要是讲了对立过程理论在获得性动机方面的解释。简单来讲,可以通过些许自己不想做的事情来强化自己想做某项事情上的动机。
在这些阅读的过程中,我也掌握了点技巧,现在读英文书的速度也和中文书差不多。比如读些英文畅销书籍我会把what is it 放在首位,即文章的论点,因为有的论据的例子有些牵强甚至生硬;读小说我会专注于故事的框架和人物描写和情节刻画上的细腻功夫;读paper就看看abstract、introduction和conclusion来高效筛选其内容是否值得继续阅读。

音视频

 
notion image
今年听了很多有关Beatles的歌,多半源于去年年底那首最终单曲的Now And Then和看了Get Back这部纪录片。由于我的歌单是自小学开始就保存并迭代到现在,所以不时也切回去听听张国荣的歌怀旧一下。
播客方面,我还是听Lex Fridman Podcast较多,主要是因为嘉宾的“段位”都很高,如Jeff Bezos、Cursor Team、Sam Altman等,印象比较深刻的是采访Jeff Bezos那集,我来回听了几遍,其中Go Last 和 One-way Door这两part我很喜欢,在自己做决策的时候也用作参考。中文podcast我只听了《代码之外》,主持风格独树一帜——风趣而不失深度,主打一个心灵“马杀鸡”。
 
notion image
本着摸鱼要搞清楚品种的精神,我takeout了今年的视频数据跑了个词云图,虽然效果一般,但窥见些许特征——除开我经常听的歌曲外,我比较喜欢看WSJ和一些Reaction的视频。
 
notion image
因为近几年都在“搞钱”的缘故,对金融理财相关的书、播客、电影方面比较感兴趣,这个可以从图片的信息看出。在中过几次“Number 降”后,我遇到了大空头这部电影,让我的投资体系脱离“孩童期”,开始通过“做功课”、结合阅读的书籍与听过的播客慢慢形成属于自己的投资体系。电影内有些金融术语,也用打破第四面墙的方式做了解释,在这推荐给各位读者。
 
notion image
上个世纪80、90年代的番因为比较细致的美术风格深得我心。其中,星际牛仔更是锦上添花——在精美画风基础上加入了出色的blues配乐。主线剧情有点浪漫主义色彩,支线便对不同的哲学问题比如存在主义进行探讨。

游戏

notion image
2024上半年,我的游戏时光颇为精彩,完结了许多故事——冲了一波荒坂塔,替大卫和强尼终结了亚当重锤(Cyberpunk 2077);当了一波跑遍“美国”的孤独快递员(Death Stranding);击败薪王,熄灭了那终将熄灭的火焰(Dark Souls 3)等等,具体可以在我的steam主页里一看究竟。
 
notion image
最开心的莫过于跟Geekplux等一众好哥哥好姐姐一起开荒了Elden Ring的DLC,大家一起讨论build、游戏里的装备、boss的打法等等。之后我也完成了该游戏的全成就和补了它的“采风点”——一个名叫berserk(剑风传奇)的番。但随后因搬家我不得不把游戏设备尽数变卖,便没能尝试黑神话悟空这一充满话题性的作品,只能当个云玩家。
 
notion image
从演出来看,黑神话的boss战设计精妙,特别是最终boss战我看了很多遍,重新编曲的“云宫迅音”和“敢问路在何方”瞬间唤起我的诸多回忆;夕阳下的对垒意境非常到位,大圣的动作让我想起了大话西游的结尾。
以我浅薄的“知识储备”和短暂游玩虚幻引擎的经历来看,黑神话用了UE5的Lumen系统。虽尽管真实感显著提升,但在黑暗环境中,光照效果仍显单薄,尤其是盘丝洞章节,对地形光源的布置的功底有一定的要求。对明年的游戏,我只期待来年2月的文明7和秋季发布的GTA6,希望历时能又遇上一群志趣相投的朋友。

生活

notion image
  • 发现自己的身体素质因长时间伏案工作每况愈下,所以开始定期出入健身房调整体态。运动后体内多巴胺水平会提高,让我更容易去解决一些难题和应对焦虑情绪。
  • 找到了缓解压力的方法——烹饪,在我看来烹饪像是训练模型一样,不断地调整配料和烹饪技艺(Hyperparameter optimization)使得成品适合自己(local minimum)又适合普罗大众(global minimum),而且还能为35后创业做打算(不是。
  • 把以前的黑卡鸟枪换炮成了Fujifilm X-T5,强大的cmos让成片在crop之后依旧保留很好的细节,富士的胶片模拟也为我省下了不少后期的工作,方便我继续记录目之所及的世界。
  • 夜深人静或郁闷焦虑的时候会看黄子华做栋笃笑的原因来勉励自己。
  • 购置了一把Fender的电吉他,妄图拓展一下“黑客与画家”中的“画家”部分。
  • 交友方面逐渐脱离I need to 到 I want to阶段,会因为他人一些特质而主动去结识。
  • 来北美“大农村”感受简单的生活和风土人情。
  • 体验过“一身正气”都无法抵御的严寒——零下15度在外搭公交。

本人不喜将世俗意义上的成功作为目标,更喜欢“向内看”,内心坦荡、满意就好。从现在回看,赫然发现我向往的东西似乎自本科开始就未曾改变——单车、阳光、海边、书房,若能兼得其二,便已心满意足。今年也总算是下定决心告别了各种“浅尝辄止”,选择viz和cg方向继续深入了解,这是我的兴趣使然,至于未来能走多远,且听其自然。
对于不可预测的风险降临在自己身上时,我认为最重要的不是沉溺于纠结它为什么出现,而是及时审视自己的可控领域,冷静判断出接下来的选项然后move on。以我浅薄的经验来看,做决定就是在意愿与顾虑间tradeoff,既要权衡利弊也要承担风险,正如黑神话里老猴子的话“想安逸,又想名利;想快意江湖,又想成佛做祖,哪有这样的好事“。
以上便是我的年度总结,接下来便是我的肥宅假期——习琴、阅读和观影,希望来年大家能成为更好的自己,预祝大家新年快乐。
notion image

Scratch The Surface

作者 JimLuo
2024年10月17日 08:00

1

When I was in high school, I really liked deriving formulas. I wanted to know what they were using and what problem they could solve. One time I got a bad grade on a test in which I used some formulas from calculus. Teachers told me calculus formulas were not allowed to be used in high school. It made me upset, I got shackles in exploring new formulas. I had to obey the scope of knowledge. My discovery was stopped under the prohibitions.
After the college entrance examination, My parents were shocked because of how bad my math grade was. But I knew why I performed badly: If a bird has been trapped in a birdcage for a long time, will it still want to fly?

2

I had to face my leader's 'fun' ideas because of working in a start-up company. I needed to make decisions about whether we can make these ideas work. As a software engineer, I liked a slogan called 'talk is cheap, show me the code'. So I did research after work and built tones of demos. I would show them to my leader to prove their availability. I felt pain while I was building these demos because part of them required me to do research in areas where I had never met before. I was nervous but satisfied when I saw what I did.
After I owned a project, the experience I got from side projects was back in my head, I felt confident about what tech stacks we chose and what we needed to do in more detail. Sometimes my colleagues were surprised by what I knew about new technologies. This was a hallucination because it came from my experience. At last, they called me a 'full stack developer'.
Being a full-stack developer means that you can quickly adopt new technologies as much as you need as if you know everything. --How I became a full-stack developer

3

I listened to the newest episode of Beyond Code, it reminds me of a sentence called 'Scratch The Surface'. The host talked about the mental statement while doing demos which has appeared in my mind before. I didn't regard doing side projects as a method to improve my technical skills. Instead, I used it as a tool to make my ideas on the ground.
After that, I thought backwards a bit: Were my skills improved after scratching the surface? No, I met some people who dived into technology or academics. They created many awesome things, and I just adapted the technologies by projects. I have never tried to dive into some areas which counter to my goal of self-actualization. My skills can help me do my job till now, I don't know if the quality is bad or not.
I think I need more time to think, to practise, and to create something, instead of scratching the surface.

Reference

 

Zustand 和 React Context

作者 JimLuo
2024年6月14日 08:00
本文是对原文的翻译,如有疏漏还望指正。
notion image
Zustand 是一个很棒的全局客户端状态管理的库。它简单、快捷而有着较小的包体积。不过,有一点我不太喜欢:
状态仓库是全局的
好吗?但这不就是全局状态管理的意义之所在吗?让你的状态在你的应用各个地方都是可用的?
有时,我认为是这样的。然而,当我回看我最近几年使用zustand的经历,我经常意识到,我需要一些状态在一个组件子树中全局可用而不是整个应用。使用zustand,是完全可以 - 甚至是鼓励 - 去按照功能来创建多个小型的状态仓库。所以,如果我只需要在面板路由中使用面板筛选器的状态,为什么我需要我的面板过滤器仓库全局可用呢?当然,我可以无痛地去使用它,但我发现一些使用全局状态仓库的弊端:

通过Props来初始化

全局的状态仓库是在React 组件生命周期外创建的,所以我们无法利用一个prop中的值来初始化我们的状态仓库。在一个全局状态仓库中,我们需要通过一个已知的默认状态来创建,然后利用useEffect来从props到store同步状态:
除了不想写useEffect,还有两个原因使它表现不理想:
  1. 当我们初次在触发effect之前使用bears: 0去初始化<RestOfTheApp />,然后在正确的initialBears赋值上后会导致不止一次的渲染。
  1. 我们不需要利用initialBears去初始化我们的状态仓库 - 我们只是用于同步。所以如果initialBears发生改变,我们会看到我们的状态仓库同步更新。

测试

我发现zustand的测试文档十分让人困惑且复杂。这的测试都是关于模拟zustand和重置其状态仓库等。我认为这一切都源于状态仓库是全局的这点。如果它被限定于一个组件子树中,我们可以渲染那些组件的同时使其状态仓库保持隔离,不需要任何那些所谓的“变通”方法。

可复用性

不是所有的状态仓库都是我们在我们的应用或特定路由中使用一次的单例。有时,我们想zustand的状态仓库可以在组件中复用。其中一个例子是过去我们设计系统中的一个复杂、多选组件。它使用本地状态通过React Context自上而下传递来管理内部多选的状态。当它有50或更多选项被选中的时候就会变得迟缓。它迫使我发了这条推文:
 
 
如果一个zustand状态仓库是全局的,我们将无法在没有共享和覆盖彼此状态的情况下多次实例化组件。

有趣的是,有一种方法能解决所有这类问题:

React Context

React Context就是那个方法在这显得很滑稽和讽刺,因为使用Context作为状态管理工具会立马出现上述的问题。但这不是我推荐的。这样做只是通过React Context共享状态仓库实例 - 而不是仓库中的状态本身。
概念上,这就是React Query在<QueryClientProvider>上的实现,redux对它的单一状态仓库也是如此。因为状态仓库的实例是静态的单例,不会经常改变,我们把他们放到React Context中非常容易且不会导致重渲染的问题。然后,我们依旧可以为状态仓库创建订阅者,这些订阅者将通过zustand进行优化。这就是具体实现的样子:
v5 语法 在这篇文章中,我将会展示v5的语法去整合zustand和 React Context。在此之前,zustand有一个明确的createContext函数,导出自zustand/context。
主要的不同在于我们没有像之前一样使用开箱即用的create函数来创建实例。相反,我们以来纯zustand的createStore函数,这将更好地来创建一个状态仓库。同时我们可以在任何地方这么做 - 甚至在组件内部。然而,我们必须确保创建状态仓库的行为只会发生一次。我们可以用ref来解决,但我更倾向于用useState。如果你想知道为什么,我有一篇单独的文章专门解答。
因为我们在组件内部创建了状态仓库,我们可以停止像initialBears这类props,把他们传递到createStore中作为真正的初始值。使用useState初始化方法只会调用一次,所以prop的更新将不会传递到状态仓库中去。然后,我们把状态仓库实例化并传递给一个简单的React Context。这里就不会有zustand的约束了。

之后,当我们想要从状态仓库中取出一些值进行消费时,都会用到这个上下文。为此,我们需要传递storeselector给从zustand中拿到的useStore钩子。这是一个对应自定义钩子的最佳抽象:
然后,我们就能像之前一样使用useBearStore钩子并利用一些原子选择器导出其中的自定义钩子:
向较于创建一个全局的状态仓库来说多了一些代码,但它解决了三个问题:
  1. 正如例子中所示,我们可以利用props来初始化我们的状态仓库,因为我们从React 组件树内部创建的。
  1. 测试变得小菜一碟,因为我们可以选择渲染一个包含了BearStoreProvider的组件,或我们可以渲染一个用于测试的组件。在这些场景中,已创建好的状态仓库能完全隔离测试,所以无需测试间无需重置状态仓库。
  1. 现在一个组件可以渲染一个BearStoreProvider来给它的子组件提供封装好的zustand状态仓库。我们可以在一个页面中随心所欲地渲染这个组件 - 每个实例将有它独立的状态仓库,从而我们实现了可复用。
最后即便zustand文档自豪称无需Context Provider来访问一个状态仓库,我认为有必要了解如何整合状态仓库的创建和React Context,这能够让你得心应手地处理一些需封装可复用的场景。就我而言,我使用这一抽象概念的次数比全局zustand状态仓库还多。😄

这就是今天我想聊的。如果你有任何问题,欢迎在twitter上找我,或是在评论区底下留言。⬇️

Think Backwards A Bit

作者 JimLuo
2024年4月29日 08:00
A couple of days ago, I watched Ali's video. There is a thinking model in the video which leaves a deep impression on me. Here are two of my thoughts from the video.

Know the cards on your hand

When we set up a goal or thought, we need to think backwards a bit to figure out whether it is reachable or not. We have to know what cards are on our hands before we next move.
For instance, if your goal is to achieve financial freedom, think through questions like How much income would be required to cover my living expenses? What are my current assets and cash flow? How can I sustain this freedom long-term after reaching it? Answering these helps reveal your true starting point and forces you to map out a viable path forward.
With practice, you can master the advanced skill of thinking backwards repeatedly, almost like peeling an onion. But you can use the skill as a sequence from your goal to what you have. This sequential analysis illuminates any gaps that need adjusting in your plan.
For example, if financial freedom for you means earning $2,000/month to cover costs in a certain city, you could:
  1. Explore passive income strategies like index fund investing
  1. Research historical returns and determine $240,000 in capital is needed to generate $24,000 annually from the S&P 500 at 10% growth
  1. Therefore, your starting requirement is accumulating that $240,000 principal
  1. Work backwards from there to your current savings, income, budget, etc.
In essence, thinking backwards equips you to deconstruct goals into actionable plans grounded in reality, not just ideals. By truly understanding your circumstances, you can map out the most viable path to succeed.

Something makes sense

When we watch news or online videos, we may sometimes feel confused about the speakers' main points or underlying reasons. This thinking model can help us analyze their perspectives more critically.
Take sponsored content or product recommendations from YouTubers, for example. When they offer a discount code for a product they endorse, we shouldn't take it at face value. Using this thinking model, we can think backwards a bit to explore potential motivations behind the promotion:
Why are they giving a discount through their affiliate link? Is the discounted price truly the lowest available, or just a basic percentage off? Could this be part of a marketing strategy to drive sales and conversions?
These questions represent hypotheses - possible explanations that require further evidence to validate. But by Training ourselves to think this way, we become better equipped to resist persuasive tactics and make more objective decisions.

25岁,风再起时

作者 JimLuo
2023年9月25日 08:00
 
如果以100作为终点的话,我的“彩虹”已经绘制了近四分之一,也是时候留下些许文字标记这个时间节点。窗外的雨不知何时停,望着远方,耳机里循环播放着Hotel California。是啊,生活在“幻想”之中,一切繁华终归只是泡影。
今年的工作和生活没有什么很大的变化,像海面不时掀起波澜最后又归于平静。对工作和生活的体悟更深了些,开始明白工作的意义和自己真正想要什么。
我 浮沉了十數年
在星空裡閃 帶著惘然 這個茫然困惑少年 願一生以歌 投入每天永不變
—— 張國榮《風再起時》

工作

虽说步入工作的时间不长,但我已经历从忙碌到稳定再到现在麻木三个阶段。忙碌是源于公司是家startup,立项完就马上忙着hack一个MVP发布,再通过用户反馈来polish产品。很多技术之前都没接触过,不停地穿梭各种文档学习之余,也感叹自己之前“井底之蛙”,巨大的泡泡不是全部,外面还有更广阔的天空。
工作的“蜜月期”总是短暂的,项目和技术相对稳定后,工作又变回了谋生手段而不是实现自我价值。有那么一段时间,我心里都在抱怨诸如“这份工作不能让我成长”、“项目技术栈稳定,缺乏与时俱进”之类的问题,也留下些许文字分别对工作的一些感悟。对这份工作的麻木源于对管理层只重视快速launch MVP而忽视用户反馈,也不认可开发者迭代方面的付出,导致开发者和用户两边都不讨好,最后项目不了了之。
也试过换工作,但由于学历和经验等问题,很多时候也就投完简历后石沉大海。有一天晚上失眠,我望着天花板,想通了很多东西:
  • 工作只是个谋生手段,不是每个人都能从事自己喜欢的工作,也不是每个人都能从工作中获得技术上的进步;
  • 自我价值的实现源于八小时之外的生活比如side projects、成为influencer;
  • 重要的不是解决问题的工具,而是其中所运用的方法和思想;
  • meet users' needs 才是产品走长远的关键。

生活

  • 一成不变的日常或许推波助澜了我对工作的麻木与倦怠:每天住处公司两点一线,三餐都在沿途的便利店解决,下班就学习英语、看看hacker news。直到一天,台风来了,我被困在了小吃店里无法返回。地上的小水洼被落下的雨滴掀起阵阵涟漪,那时我留下了眼泪,因为被困住的自己,也因为我又听到了内心的声音。生活原本是彩色的,只是重复和平淡让它变成单调的黑与白。
  • 小时候的一场大病,因服用了许多激素药物导致我成为周围人眼中的“肥仔”,受尽旁人嘲讽与奚落。我变得“安静”、“沉默”,不愿与外界沟通,对各种外号内心安慰自己道:他们知道那外号代表的是我就行了。所幸后来也遇到一些朋友,他们不嫌弃我的体型也帮助了我许多。虽说后来把体重降了下来,但内向却挥之不去,也给我的生活上多了些坎坷。我还记得找工作的第一场面试是面阿里,支支吾吾地半天才把问题回答完;第一次找外教练口语,单词一个个从嘴里蹦出来,自己听着都觉得尴尬。
  • 每个阶段间的转变总有事件触动我,让我触底反弹。还记得初中的时候,本是中游水平的我原本不对未来抱有任何希望,却意外地考到前列,原来努力一点就有“丰厚”的回报,便下苦功最后考上市里的重点高中;好几次语言考试成绩都不是很理想,暗自下了最后通牒,最后再push自己一次,结果却意外地高于我的预期,我好像也没有想象中的那么烂;去年有一段时间陷入迷茫,技术上不知道怎么提高,当时的环境又让我感到焦虑和不安,身边也没有朋友能解答我的疑虑,便抱着破罐子破摔的心态在社交网络私信和邮件了一些“陌生人”,所幸收获了许多热心解答,也看到了异步社交的美好,或许这个世界没有想象中的那么冷漠。
However big the problem ,tell your heart ,"all is well.pal." ——《3 Idiots》

尾声

回过头来,现在的我便是过去的参数作用的结果,可能我参数调得不好,也可能我这个模型本来就不善于处理“人生”这类问题。人这一生,还真是捉摸不透啊。这次“调参”,我能变成更好的自己吗?
Again, you can't connect the dots looking forward; you can only connect them looking backwards. —— Steve Jobs
感谢在社交媒体中和我产生交集的人们,你们的慷慨我永远都会记住,愿你们生活顺利、幸福。
Goodbye 24. 25, nice to meet you.
 

离线React Query

作者 JimLuo
2023年1月8日 08:00
本文是对原文的翻译,如有疏漏还望指正。
我已经说了一遍又一遍——React Query 是一个异步的状态管理器。就像你给它一个Promise,不管是resolved 还是rejected,它都会很开心。你不用在乎Promise是从哪里来的。
产生Promise有太多方式,但就目前而言最大的用处便是获取数据。这非常频繁,但请求需要一个有效的网络连接。但有时,特别是在移动设备上的网络连接并非十分可靠,你需要你的应用在上述的情况下也能正常运行。

v3中的问题

React Query 非常适合处理离线的场景。因为它提供了缓存层,当缓存被填入,就能在无网络连接的情况下运行。让我们看一些在v3无法如期运行的边缘应用场景。我会用基本的发布列表 / 在文档中发布详细例子用于阐述:

1)缓存中无数据

正如我说的,在v3中,只要缓存被填入,应用就能很好地运行。一个奇怪的边缘应用场景如下:
  • 你有良好的网络并跳转到列表视图
  • 你在无连接的情形下点击文章
notion image
发生了什么使你的query查询会一直处于 loading 直到你重新获取到网络连接。当然,你也可以在浏览器的开发者工具中看到一个网络请求失败。那时因为React Query 会一直触发第一个请求,如果发送失败了,在离线情况下它将会暂停重试。
再者,React Query Devtools 会显示你的query 是 fetching ,这并不完全对。那query 实际上是 paused ,但我们没有一个概念去表示这个状态 —— 这是一个隐藏的实现细节。

2)没有重试

同样,如果你在上述场景中同时关闭了重试,你的query会马上转为error 状态且无法阻止。
notion image
为什么在我无网络的情况下,我们的query 需要 重试 才能 暂停 🤷‍♂️ ?

3)queries并不需要网络

queries并不需要网络来运行(如:因为它们在web worker 中进行了代价昂贵的异步处理)如果它们因为一些其它的原因失败了,它们会暂停直到你重新获取到网络连接。同时,那些queries在窗口聚焦时无法运行,因为当你无网络连接时那功能是完全无法使用的。

总的来说,有两个主要问题:在一些情况下,React Query 在可能不需要网络连接的情况下假定为需要(情况3),和在一些别的场景下,React Query 会触发请求即便是它可能不需要的情况下(情况1和2)。

新的NetworkMode

在v4中,我们已经尝试使用新的 networkMode 配置来完全地解决这些问题。有了新的 networkMode ,我们就能清晰地区分 onlineoffline 的queries。它是 useQueryuseMutation 中的一个选项,这就意味着你能针对全局或每一查询进行设置。毕竟,你可能有些需要网络连接的queries,有些则不需要。

online

这是v4中新的默认配置,正如我们所料大多数用户使用React Query结合数据获取。简而言之,有了这个配置,我们就假定一个query只能在有可用网络的情形下运行。
那么如果我没有可用网络但又运行一个query会发生什么呢?这个query会进入一个新的 paused 状态。这个 paused 状态仅次于 idleloadingsuccesserror 等主状态,因为你可以在任何时候脱离网络连接。
这意味着你的query可以同时处于 successpaused 状态。例如,你已经成功获取了一次数据但是后台的refetch 是 paused 状态。
或者,你可以处于 loadingpaused 状态如果一个query是首次挂载的情况。

fetchStatus

我们一直使用 isFetching 标志来指明一个query是正在运行的。类似于新的 paused 状态,一个query可以同时处于 successfetching 状态,或者它可以是 errorfetching 状态。后台重新获取(refetch)为你创造 许多 可能的状态(👋 状态机)。
正如 fetchingpaused 是互斥的那样,我们把它们整合进 useQuery 新的返回 fetchStatus 中去:
  • fetching :query在执行中 —— 请求正在进行。
  • paused:query未在执行中 —— 它被暂停了,直到重获网络连接。
  • idle:query当前并未在运行中。
就经验而言,query的 status 会给你相关 data 的信息:success 意味着你将一直拥有数据,loading 意味着你尚未拿到数据。我有想过把 loading 状态重命名为 pending ,但最后认为,这可能“too breaking”了。 😅
另一方面,fetchStatus 为你提供了 queryFn 的信息:它是不是正在运行?isFetchingisPaused 标志正是从 fetchStatus 中派生出去的。

让我们看看上面的情况1 在v4中会怎么样。请注意RQ devtools中新的切换网络模式的按钮。这很酷对吧因为它并没有真正地切断你的网络 —— 这只是让 React Query 相信 这是一个无网络环境以达到测试的目的。当然,我也以此为豪。😊
notion image
由于新的紫色标志,我们能够清楚地看到query的状态为(paused)。一旦我们重新开启网络环境,首次请求便会完成。

always

在此模式下,React Query不再关心你的网络连接与否。Queries 将会始终触发,永不暂停。当你使用React Query进行一些其它的获取数据操作时将会非常管用。

offlineFirst

此模式与React Query在v3中情况非常类似。始终 发出首次请求,如果失败,再次发送便会暂停。此模式适用于你有像浏览器缓存等类似的附加缓存层在 React Query之上。
让我们以GitHub repo API 为例。它发送如下响应头:
这意味着在接下来的60秒内,如果你再次请求资源,响应的数据将会来自于浏览器缓存。巧妙的是它也可以离线使用。Service workers,例如离线优先的PWAs,以类似的方式运行,通过拦截网络请求并在有可用缓存的情况下返回缓存的响应。
在React Query决定 触发请求时这些都不会发生,因为你处于无网络状态,就像默认的 online 那样。拦截一个获取数据请求的话才会发生 :) ,所以如果你有额外的缓存层,请确保使用 networkMode : offlineFirst .
如果第一个请求打出的同时命中了缓存 —— 真棒,你的query 将会是 success 状态,你将会获取到数据。如果命中缓存失败,你将可能被返回一个网络错误的error, 之后React Query将暂停再次获取并将你的query 置为 paused 状态。二者均对世界有益。🙌

这一切对我来说究竟意味着什么

没什么,除非你想这么做。你依旧可以决定忽略新的 fetchStatus 并只检查 isLoading 状态 —— React Query 将一如既往地做出反应(那么,在情况2 会表现更好,因为你将不会看见任何网络错误)。
然而,如果你想让你的应用在无网络连接的情况下保持健壮并以此为首要目标时,你就可以选择在对暴露出来的 fetchStatus 做出反应并采取行动。
对新的状态采取什么措施取决于你。我迫不及待地想看到那些在用户体验领域的人们在此之上会构建出什么。🚀

After watching Severance Season 1

作者 JimLuo
2022年8月12日 08:00
With growing leisue time, I have binge-watched the Serverance which I had wanted for a long time. I was really impressed scriptwriter's imagination after i watched. The Serverance also caused me to reflect the relationship between work and life. I want to share my rethink here with you. It's my first time write english post, hope you guys can correct my poor writing in english.

Does work-life need to be separated completely?

The bigest selling point about Lumen ( the company in the series ) is work-lif seperated totally. That means employees' memories of going to and from work are different except the management. The employees and their colleagues talk and laugh at work, but they don't know each other after work. It seems to suit everyones asking in work life balance perfectly, but it ignores the "buffer" or overemphasizes the boundary. It will make employees creativeless and indiiferent in company. Everyone have their own "inertia". It's hard to switch mod when taked the elevator or clocked in attendance. In Serverance, Mark felt confused and puzzled when his ex-leader intrude into his own life and the book given by his relatives which apear in his work place by accident. When he contact with the "interlacing" of the work and life, he also have "inertia symptom" .
work-life seperated brings annother problem: Who leads body? Innie or outie? When you felt burn out at work or you job didn't make you happy, you wanted to resign but outie rejected innie's request. In this case, innie is a vassal? Or a slave trapped in the box of "work"? Or just like the congressman's wife at childbirth in Serverance ,a beast trapped by nagative emotions and pain? When innie's time exceeds outie's time, which got the dominant power of body?

Order and religious corporate culture

Lumen set up the various regulations and inspection procedures to prohibit the intersection between innie and outie. The working places also were separated th various departments and created fabricates perjury to make bostile relations between departments intentionally by Lumen. The content of Mark's work is to classify the number on the screen according to their different feelings, but Mark and his colleagues do not know what the purpose or goal of the work. With the order of various rules, it is difficult to make employees willingly work for such a company, some of them accept the environment, some of them show a strong willing of resistance just like the new employee Helly. I thought that i am working in a small company with a lot of rules and low level technical content. When i first joined this company, several colleagues left because of strict rules, but i stayed with a small reason which is the need of an income. When i thought my work everyday, there would be tears appear in my eye sockets. In addition to the absolute order and subdivision of work to make each employee like "screw". Lumen also used the greatness of the founders to create a religious company culture that made employees willing to be "screws".
Mark's boos(she didn't get surgery) was decisive and vigorous in decision-making, but she was a devout believer of Lumen. She built a altar to worship. There is an environment of loyal, every departments had employee handbook like the Bible. After Helly's unsuccessful resination, Irving proposed that Mark should take everyone to Eternalwing. The Eternal Wing likes a museum, showing the glorious deeds of Lumen's CEOs. Irving, a veteran employee, would be hesitant to repeat the founder's quotes, even have different interpretations of different version employee handbook.
The order restricts employee where they go in physically, the company culture imprisons employees' mind. Employees' bodies and minds when they go to work are totally controlled by the company. They reduced to machines completely on assembly line without soul.

Enslavement

In China, some companies use 9-9-6 (go to work at 9 am and go from work 9 pm ,working 6 days a week) or 0-0-7 working hour system to exploit their employees, but i saw enhancive way of that in Lumen. If you want to resign in Lumen, the resignation should be submit by outie. It seems to illustrate indirectly the question of "who is in charge of the body?". When Helly threat to talk to outie by cutting her fingers, innie didn't expect that the outie refuse the request with no hesitate and said "I am a person, you are not, the choice can only be done by me." I think the sentence is the most thoughtful and terrifying one in the whole series. The outie seems to regard innie as a tool to complete some goals, but the carrier of the tool is self. if you can't stand 9-9-6 or 0-0-7, you can submit your resignation in real life. Lumen told you that you can make work life balance, but you can't make your own decision becaues of "yourself".

Lastly

There are my thoughts and reflections after watching "Serverance Season 1" above. The words are slightly arbitray. If there is any mistake, I hope you can tell me. You can also leave comments or messages below. I’m Jim Luo. See you next time, peace!
 
 

观《Severance Season 1》

作者 JimLuo
2022年8月9日 08:00
最近由于闲暇时间变多,便把之前一直想看的serverance(又名:人生切割术)一口气追完。看完后不禁感叹编剧的脑洞之大,也引起了我的一些反思,想借此分享出来,属于想到哪写到哪,行文可能算不上优雅、细腻,还望各位海涵。

工作与生活需要完全分离吗?

Lumen(剧中的企业)最大的“卖点”便是工作和生活的完全分离:上班和下班时的记忆完全分离,和同事上班时嘻嘻哈哈,下班后便行同陌路人。看似很完美地契合各位了work life balance(工作生活平衡)的诉求,事实上这忽略了“缓冲区”或是过分地强调boundary(边界)。我们每个人都有维持现状的“惯性”,难以坐到每天坐电梯/ 打卡后迅速切换状态。主角Mark一开始接触前上司在下班时闯入自己生活和亲戚赠予的书阴差阳错地出现在工作场地等工作和生活环境事物的“交错”,也表现出困惑、不解等“惯性”。
工作与生活完全分离后引发的另一个问题——“谁才是身体的主导?”当你在工作中屡屡受挫,对工作毫无激情和兴趣,想要辞职却被告知下班后的你不允许,在这种情况下,上班的自我是附庸?是困在“工作”这盒子中的奴隶?还是说正如议员妻子生产时的人格一般只是一头被负面情绪或痛苦所困的野兽?当上班的时间超过生活的时间那主导权在哪边?

绝对的秩序与宗教式的公司文化

主角所在的公司除了为禁止工作中的自我和工作外的自我产生交集而设下种种条例和检查手续外,工作环境也有意无意地将各个部门分开,甚至捏造伪证来造成部门间的敌对关系。主角工作中的内容是将屏幕中的数字按照自身不同的感受进行分类,主角与同事并不知道这工作的最终目的是什么,加上种种的条条框框的秩序,很难让人心甘情愿地为这样的公司工作,就像新员工Helly表现出强烈的反抗情绪。联想到自己目前也是在一家条条框框很多的小公司中工作,刚入这家公司就有几个同事受不了严厉的规矩而离职,但我由于急需一份收入遂留了下来,有些神伤。
除了绝对的秩序和细分的工作来让每个员工变成所谓的“螺丝钉”外,Lumen还利用创始人的伟大来营造一种宗教式的公司文化来让员工甘愿成为“螺丝钉”。Mark的上司在公司决策果断、雷厉风行,下班后却是公司虔诚的信徒,自建祭坛来朝拜,部门办公室中也放有字典般厚的员工手册。在Helly辞职未果后,老员工Irving提议Mark带大家一起去“永恒翼”。“永恒翼”就像是个博物馆,展示Lumen历代总裁和创始人的光辉事迹,老员工Irving对创始人的语录倒背如流,甚至当Mark带领同事做出违反规则的事情时也犹豫再三。
绝对的秩序限制人的物理空间,公司文化囚禁人的思想空间,员工上班时的身心被公司牢牢掌控,完全沦为流水线上的机器,没有灵魂。

奴役

现实生活中有的公司使用996或007的工时制度对员工进行剥削与压迫,但在Lumen,我却看到了更高级的形式。Lumen中的辞职必须是工作外的自我提出申请才可被允许,这间接地说明了的剧中“谁才是身体的主导”问题。当新员工Helly用切手指的威胁来求得与工作外的自己对话以求辞职来解脱,没想到生活中的Helly却毫不犹豫地拒绝了工作中Helly的要求并落下“我是人,你不是,选择只能我来做。”这一句我认为全剧最细思恐极的话。生活中的自我似乎把工作中的自我当成是完成某项目的的工具,但工具的载体却是自己。如果说你受不了996或007这种折磨身体的加班,你可以提出辞职,但在Lumen,虽说是work life balance但做决定可真由不得“自己”。

最后

以上便是我看完《Severance Season 1》后的一些想法和反思,行文略有些随意,如有出错还望指正,欢迎在下面的评论区留言。I’m Jim Luo. See you next time, peace!
 

当看清自己平凡后

作者 JimLuo
2022年6月15日 08:00
在进入大学之前,我都是凭借这所谓的「小聪明」以及些许努力去获取自己想要结果。随着身处环境中变量越来越多,旧时的线性模型开始愈发不可靠,也看到了自己与别人的差距,认识到了自己的平凡,但这并不影响我学习某项技术或追逐我的梦想。
本文主要从我毕业到最近工作的这段心路历程、反思到重拾信心来谈谈看清自己平凡后如何找回那份干劲。

找工作时的心碎

我有两段找工作的经历,第一次是在大三找实习。那时朋友圈遍布都是大厂的内推和同学们炫耀自己拿了哪个大厂的offer。我也投了些许内推,几乎都倒在了笔试和手撕算法环节,看到那时招聘网站上同学讨论某家大厂的笔试AC了几道,内心也看到同龄人之间的差距,心里很焦虑也很沮丧。后来哪怕刷了将近400道的leetcode,我也不敢保证笔试算法能通过。
第二次便是年初考研失败后那将近三个月求职,学校、经验甚至是技术均很普通的我,在求职市场里被一次次否定,然后我便开始焦虑、抑郁甚至情绪失控,时常莫名其妙地流眼泪。每天埋头在刷面试题和做demo中麻痹自己:“我还在产出,我在进步,一切都会好起来的。”
notion image

反思

在这些求职经历中,我看到了自己的“极限”,也看清了自己手里的牌,我不可能手上拿着19点就觉得自己稳赢庄家。从公司或者是HR的角度来说,一个背景、经验都很普通的求职者会选择吗?不会,同样的薪酬条件下公司肯定是希望能聘请到上手就能干活的人,而不是还需要引导、培训的新人,更何况毕业后将近一年没有工作本身就是减分项。
难道看清自己的平凡后就意味着从此浑浑噩噩、不求上进了吗?不,当然不是,我还有理想,同时编程让我看到了实现的可能。我喜欢编程带来的那种“build something”的感觉,喜欢创造出来的东西能帮到他人甚至“change the world”。
要发掘自己的长处并自信地展示出来。在工作中,难免会遇到问题并寻求解决方案,有人的情商高能打通同事间关系帮忙解决、有的人技术实力强handle得了遇到的问题。没有人是十全十美的,平凡不以为着没有过人之处,要看自己的长处,也要让别人看到你的长处。

今后

虽然最后入职了一家待遇不是很好的小公司,但闲暇时间多,足以让我开启side projects。尝试让自己从囫囵吞枣的「技术消费者」转型为「技术生产者」,这期间必然带来着“痛苦”,就像李沐所说的:
 
坚持走。不管你的目标多复杂,随机梯度下降都是最简单的。每一次你找一个大概还行的方向(梯度),然后迈一步(下降)。两个核心要素是方向和步子的长短。但最重要的是你得一直走下去,能多走几步就多走几步。 痛苦的卷。每一步里你都在试图改变你自己或者你的模型参数。改变带来痛苦。但没有改变就没有进步。你过得很痛苦不代表在朝着目标走,因为你可能走反了。但过得很舒服那一定在原地踏步。需要时刻跟自己作对。
希望今年能找到好一点码头,搞到多一点的薯条吧。
即便是芸芸众生中平凡的一员,也不要忘记那点点“spark”。
 
 
 
 
 
❌
❌