<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>MOYA</title>
    <link>https://moya.plus</link>
    <description>个人博客</description>
    <language>zh-CN</language>
    <lastBuildDate>Mon, 10 Aug 2026 02:54:23 GMT</lastBuildDate>
    <atom:link href="https://moya.plus/data/rss.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title><![CDATA[2024 年终总结｜小草也有比天高的机会]]></title>
      <link>https://moya.plus/article/2024-year-end</link>
      <description><![CDATA[我们热烈的青春，从不困于无风之地。世界就在眼前，它指向的，是你想去的任何地方]]></description>
      <content:encoded><![CDATA[<p><img src="https://cos.moya.plus/article/assets/1784288847880-image.png" alt="1784288847880-image*1091" loading="lazy">
Hi，这里是我的 2024 「年终总结」，主题是：“小草也有比天高的机会”，全文一共 <strong>4372</strong> 字，全部读完大概需要 <strong>15</strong> 到 <strong>21</strong> 分钟，感谢你可以选择继续阅读下去。</p>
<hr>
<p>每次到年末收尾的时候，我都想尝试着去找一句话，或者一个词，来总结自己过去的这一年。</p>
<p>今年的情况，对大部分人而言，是算不上太好的，我也一样：</p>
<blockquote>
<p>我不止一次地爬上山头，也不止一次地发现，我爬错了山头...</p>
</blockquote>
<p>想必大家都懂，2024 年，上山的路确实比以前多了，走哪条路或许也并不重要，毕竟只要到达山顶就好。</p>
<p>但是，<strong>翻过一座山之后才发现，背后是望不到头、更多、更高、更不好爬的山。</strong></p>
<p>对，今年来说，其实真正让我陷入困境的，是这个世界最终并非我所想象，所以我也确实很难找到一句话来总结我过去这一年。</p>
<p>但是这句话，我还是找到了。</p>
<p>12 月 8 号，《雄狮少年 2》点映，其中的一句台词让我触动很深，如果你也认真地看过这部电影，也一定会注意到这句话，这句话就是：<strong>山路望不到头，我只能往前走了。</strong></p>
<p><img src="https://cos.moya.plus/article/assets/1784289119474-image.png" alt="1784289119474-image" loading="lazy">
是的，面对焦虑，躲是躲不掉的，最好的办法，就是去做那些让你焦虑的事。——祝各位在新的一年，可以征服一座又一座的高山。</p>
<p>过去的年终总结，我会把自己过去这一年的所有数据都拉出来，比如看了多少本书、发了多少文章，学了多少课程，「得到」学分又涨了多少等等。</p>
<p>这些可以被具体量化成的数字，对我来说是成绩，但对于读者的你而言，没有任何意义。</p>
<p>所以今年的总结里，我太不想跟你分享这些数字。</p>
<p>我不太想细说今年去旅行路上的见闻，因为这以后会写在其他文章里。</p>
<p>我不太想细说六月份家乡的那场洪灾，让我看到人类在大自然面前显得有多毫无招架之力。</p>
<p>我也不太想细说十月份之后，我的人生轨迹发生了什么样的改变...</p>
<p>因为这样的年终总结，你大概率也看不下去，看完了，你也不会有任何收获。</p>
<p>所以今年的年终总结，我只想和你分享三个我自己亲身经历，并且找到了答案的话题。</p>
<p>第一，如果你现状不满，或许我可以给你一个比较合理的解释；</p>
<p>第二，没人会对自己的收入做到「完全满意」，那决定收入的最关键因素到底是什么？</p>
<p>第三，在去年的总结里，我分享过「时间是唯一的终极生产资料」，毋庸置疑，时间的价值肯定是要大于金钱的，那有没有比时间还要宝贵的财富？</p>
<h3 id="现状不好的本质-是什么">现状不好的本质，是什么？</h3><p>年初的时候我说过，每个月的月底，我都要写一篇月度汇报，总结自己过去一个月有所收获的东西，内容不限，字数随意，有可能是心得体会，也可能是阅读笔记，反正那是我最想跟你说的话。具体的做法是，我将自己看过的书、上过的课、划线的笔记、瞬时的想法，挑出来再分享给你。</p>
<p>就这么「坚持」了 <strong>12</strong> 个月。</p>
<p>加上零零散散发布的其他文章，今年大概写了一共有 <strong>120</strong> 千字，差不多是一本书的量。</p>
<p>你看，人是肯定会成长的，这在过去，我大概要用两三年才能做到写这么多东西，而且在不注重阅读、点赞、评论等数据差的情况下，依然保持良好的心态，继续写下去。</p>
<p>这些年的写作积累，也让我逐渐认识了多数人都不愿意认识的真实世界，以及这个世界最终并非我所想象、现状不好的根本原因是什么。</p>
<p>你有没有思考过这么一个问题：为什么我们绝大多数人，最终都很难赚到很多钱？</p>
<p>其实原因真的很简单——<strong>对于绝大多数人而言，赚钱并不是真正的刚需，他们真正的刚需是花钱</strong>，而并不是赚钱。</p>
<p>几乎每个人都有「发财」、「一夜暴富」这些不切实际的想法，他们自以为赚钱是他们的刚需，于是天天想着怎么「搞钱」，但实际他们内心的想法就暴露了真相——等我有了钱，我就 XXX！。</p>
<p>对，那些有了钱之后想做的事，才是绝大多数人真正的刚需。观察下身边的人，你会发现只有少数人，花钱是为了赚钱（投资），而绝大多数人赚钱是为了花钱（消费），对吧。去餐厅花钱吃一顿饭，这是消费。花钱买本书提升自己，这是投资。</p>
<p>弄清楚什么是自己真正的刚需是非常重要的，我们中国人在学英语上花了多少功夫？小学六年、初中三年，高中再三年，还不够，大学再四年，仍然掌握不了这门语言，因为大多数人学英语的刚需是为了考试，而不是「沟通」。</p>
<p>显然，绝大多数人连自己真正的刚需都搞不清楚，更显然，如果你想要最终有所成就，<strong>最关键的刚需应该是「成长」，而这个过程极度需要——「耐心」。</strong></p>
<p>作家李笑来曾不止一次的说过：<strong>所谓现状，无非是过往的积累。</strong></p>
<p><img src="https://cos.moya.plus/article/assets/1784289153456-image.png" alt="1784289153456-image" loading="lazy">
我们几乎不会对自己的现状感到“非常的满意”的对吧，那既然“现状不好”，肯定是“过往的积累不够”啊，不管是财富的积累，还是知识、人脉的积累。</p>
<p>于是当绝大多数人都急切地想要改变现状，却又缺乏足够的耐心，最终导致现状越差，就越是没有积累，越是急切，就越是没有耐心，然后更加的抱怨自己现状有多不好。</p>
<p>以前到年末的时候，我会特意统计过去一年看了多少本书，以此来衡量自己有没有虚度过去的一年，后来发现这完全没有意义，因为真正尊重知识的人是不太会记得自己看过多少书的，<strong>知识的积累是一种生活习惯，并不是和别人比拼的数字。</strong></p>
<p>就拿阅读来说，其实<strong>阅读本身是没有意义的，阅读之后的思考，思考之后的选择，选择之后的行动才有意义</strong>，绝大多数人，工作之后甚至不具备只字阅读完一本书的能力。</p>
<p>所以吐槽现状不好的同时，不妨回去看看自己过往的积累够不够。</p>
<p>2025 年，我会继续的积累和输出，甚至有写 1-2 个专栏的计划，所以明年写作的量，肯定不会少于一本书。</p>
<p>我能看到的未来，写作是我为数不多可以将同一段时间重复销售很多很多次的选择，同时，<strong>持续写作很可能是锻炼学习能力、锻炼思考能力、锻炼分析能力、锻炼沟通能力的最直接、最低成本的方式。</strong></p>
<h3 id="决定身价的最重要因素-是什么">决定身价的最重要因素，是什么？</h3><p>今年的情况大家是可以直观感受到的，身边不缺乏行业不景气、被裁员等等令人非常焦虑的消息。</p>
<p>一方面，看看 2024 年的大学生毕业人数吧，<strong>1179</strong> 万，这比我读大学那一年足足多了 <strong>430</strong> 多万人，企业不缺大学生资源，校招岗位增多，社招岗位就少了，大学生之间本身的竞争压力也比以往要高很多。</p>
<p>另一方面，2024 年的新生人口可能不足 <strong>900</strong> 万，这还不到我出生那一年的一半。对，这意味着以后孩子少了，就不需要那么多学校了，所有教育行业的岗位都会面临失业的风险。</p>
<p>还有一个不得不关注的——AI 带来的技术革命，确实替代了不少的工作岗位，今年翻译和客服的岗位数量分别下降了 <strong>19</strong>% 和 <strong>16</strong>%。</p>
<p>企业使用 AI 的成本是要远远小于用人成本的，企业跟不上市场节奏，效益不好，选择裁员，企业跟上了市场节奏，用上了人工智能，替代了一部分人力，还是裁员。</p>
<p>我不知道其他人是什么样，反正我今年是沟通了 <strong>2000</strong> 多个岗位，投了 <strong>100</strong> 多份简历，最终只得到一只手都数得过来的面试机会，这就是行情。</p>
<p>这是我初中时代的班长，我上大一那会儿，曾经邀请她和我的朋友们录一些祝福视频，内容是给下一届高考的学弟学妹们加油打气。</p>
<p>今年我在她的文字里，也得到一些启发。</p>
<p>求职和面试过程中，我会不自然的把自己和雇主之间的关系，类比成是情侣之间的关系，就像人生总要经历被分手（被裁员），或者是自己去找新欢（跳槽）。</p>
<p>只要你不被需要，就容易失去一份工作，或者失去一位员工，<strong>只有经历过，思考过，反省过，从中吸取经验和教训，才能认清一些事情的真相。</strong></p>
<p><img src="https://cos.moya.plus/article/assets/1784289194780-image.png" alt="1784289194780-image" loading="lazy">
你说，是咱们自身不够优秀吗？不全是，决定我们能否找到更好的工作，能否遇到更好的人，决定自己身价的最重要因素，肯定不完全取决于自身条件的高低。我们身边不缺这些例子：<strong>大学生毕业找不到工作的不在少数，初中就辍学的农村娃，也能有在大城市的一席之地。</strong></p>
<p>很多人误以为「价格」跟「成本」有直接的关系，它们只是间接相关。毕竟我要掏钱买一个产品，是因为我真的需要，而不是因为这个产品制作成本有多高对吧。</p>
<p>这很明显，在我出手购买之前，这件产品的一切成本都跟我没有半毛钱关系，我也不可能用成本去衡量我具体要掏多少钱，我顶多是要考虑的，也仅仅是我的支付能力而已——也跟成本无关。</p>
<p>在市场上，决定价格的最重要因素，其实是需求。尽管你再优秀，一旦不被需要，那你就是一文不值。一个精通人工智能的高手到了农村是毫无价值的，但是在北上广等一线城市，却可以拿到上百万年薪。</p>
<p><strong>与其选择做一个「牛逼」的人，不如选择做一个「被需要的人」。</strong></p>
<p><img src="https://cos.moya.plus/article/assets/1784289202099-image.png" alt="1784289202099-image" loading="lazy">
想清楚这些事情的真相，其实就能缓解一些焦虑，并且可以清晰的知道具体要怎么做，把这些日常生活中“被误解的概念”纠正回来，就足以让生活发生巨大的变化。</p>
<h3 id="比金钱和时间更宝贵的财富-是什么">比金钱和时间更宝贵的财富，是什么？</h3><p>现到如今，可能仍然只有一小部分的人，会真正的把「时间」当成是自己唯一的生产资料，会真正的把时间视作比金钱更宝贵的财富。</p>
<p>这不难理解，因为我们从小到大接收到的教育，从来都不是怎么才能挣到更多的钱、怎么才能在竞争激烈的社会环境下生存下去。大学教《职业发展与规划》的老师，可能自己都没有找过工作，甚至不少人在工作之后都搞不清楚「五险一金」是什么。</p>
<p>我们有限的人生经历就是刷了那十几年的题，而这十几年教育的最终目的，居然把我们培养成一个直接出售自己的时间的人。</p>
<p>细思极恐，学校只教会我们如何珍惜时间、重视时间，却不会教我们如何提高单位时间的售价、如何把一份时间重复销售多次、如何使用未来的时间、如何廉价的买别人的时间再高价的卖出去。</p>
<p>即便很多人能认识到这一点，仍然只有一小部分人会因此极度的在乎自己的时间如生命一样。</p>
<p>那什么是时间和金钱更宝贵的财富，答案显而易见是：<strong>「注意力」</strong>。</p>
<p>钱肯定不是最重要的，因为金钱可以再生；时间也不是，大家的时间都一样，不会比别人多，也不可能比别人少，本质上时间也不属于你自己，你也管理不了时间，只能尝试着和时间做朋友；<strong>你的注意力，才是真正你拥有最宝贵的资源和财富。</strong></p>
<p>注意力这东西，真的少得可怜，我们每个人一天产生的、可以集中起来的注意力，大概就只有那么两三个小时，而绝大多数人用来干嘛呢？——浪费、凑热闹、操心。</p>
<p><img src="https://cos.moya.plus/article/assets/1784289209827-image.png" alt="1784289209827-image" loading="lazy">
如此的消耗掉自己的注意力，即便是做到“有所收获”也是很难的吧。</p>
<p>其实大家可以扪心自问一下，你每天关注的那些东西，真的跟自己的成长有关吗？如果跟你一点儿关系都没有，那你为什么要花注意力在这上面呢？</p>
<p>所以，<strong>不要去管两公里和五小时之外的事情</strong>，真的是一句挽救你生命的忠告。</p>
<p>某种意义上讲，「广告」是一个极其简单而且可以长期获利的商业模式，因为它可以把大量且廉价甚至免费的注意力集中起来，然后高价的卖掉。</p>
<p>不妨看看，你每天贴身不离，时刻握着的那块屏幕，有多少东西每天都在试图收割你，而你又是怎样主动为他们贡献自己宝贵的注意力的。</p>
<p>认识到了这些，于是你心里就知道什么才是最宝贵的财富：<strong>注意力&gt;时间&gt;金钱</strong>。</p>
<p><img src="https://cos.moya.plus/article/assets/1784289215672-image.png" alt="1784289215672-image" loading="lazy"></p>
<p>这一篇年终总结，你也看出来了，不算是个总结，更像是一堆我特想说的话，本质都是在告诉你一些「世人皆知的秘密」，之所以「世人皆知」，是因为这些“道理”并不高深，大家都懂，之所以是「秘密」，是因为绝大多数人都不知道如何去改变，希望我的这些话，对你有用。</p>
<p>新的一年，我有一堆的计划和待办事项。</p>
<p>我看着屈指可数的时间，感叹为什么一年就只有三百多天。</p>
<p>我轻声敲打着键盘，想着最后一句话，要对你说什么好。</p>
<p>也许这也是你想对我说的话，<strong>我们热烈的青春，从不困于无风之地。世界就在眼前，它指向的，是你想去的任何地方。</strong></p>
<p><img src="https://cos.moya.plus/article/assets/1784289220367-image.png" alt="1784289220367-image" loading="lazy">
2025 新年快乐！下一篇年终总结，我们 365 天后见。</p>
]]></content:encoded>
      <pubDate>Tue, 31 Dec 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/2024-year-end</guid>
    </item>
    <item>
      <title><![CDATA[2025 年终总结｜世道再难，也要畅快呼吸]]></title>
      <link>https://moya.plus/article/2025-year-end</link>
      <description><![CDATA[我时运高，不听鬼叫]]></description>
      <content:encoded><![CDATA[<p>你好，这是我的 2025 年终总结，全文一共 <strong>3101</strong> 字，读完大概需要 <strong>10</strong> 分钟，感谢你愿意花点时间走进我这一年的碎碎念。</p>
<p><img src="https://cos.moya.plus/article/assets/1784289298289-1784289241782-image.png" alt="1784289298289-1784289241782-image" loading="lazy"></p>
<p>先分享今年一个令我印象深刻的故事吧：</p>
<p>说是有一个 8 岁的小朋友在车里，对他叔叔说：“你想不想看我抛一把口袋里的五彩纸屑？”</p>
<p>叔叔赶紧摆手说：“别别别，车里可不能抛，收拾起来太麻烦啦。对了，你口袋里怎么会有这东西？”</p>
<p>小朋友得意地扬了扬口袋说：“这可是我的‘应急纸屑’！我走到哪都带着，就怕有好事突然发生的时候，没东西庆祝呀。”</p>
<p>那天我忽然觉得，这小朋友揣着的哪里是纸屑，这是一种透亮的心态啊：<strong>我始终相信有好事即将发生。</strong></p>
<p>我不知道你怎么样，反正我的 2025 就是，就像这五彩的纸屑一样，一直在兜里揣着，等待着一个好事落下来，然后把它们一股脑抛向天空。</p>
<hr>
<p>从去年开始，我的年终总结就不再是我一年里的各种数据统计，我也开始不关心自己一年看了多少书、写了多少篇文章、提交了多少次代码、得到 APP 的学分涨了多少、考了哪些试（考砸了）等等。</p>
<p>而是将过去一年中我所经历的一些事情，从里边挑几个我最想跟你聊的话题，在年底的最后一天分享给你。</p>
<h3 id="热气腾腾的活着"><strong>热气腾腾的活着</strong></h3><p>三天前，我跑完了人生第一场全程马拉松，净成绩 <strong>4 小时 59 分 53 秒</strong>，在 3000 名选手中排 <strong>1029</strong> 名。原本计划是 5 小时完赛，是的，我快了 <strong>7</strong> 秒！</p>
<p>其实关于这一段我准备了两份文稿：一份是 “没跑完该怎么说”，另一份是 “完赛的喜悦”—— 也就是现在这篇。但领物资那天，我就直接删了没跑完的那一版：这趟，我必须跑到终点，不下牌桌，也不给自己留下遗憾。</p>
<p>跑步这件事真的给我带来了很多，我所在意的也不是配速和距离（跑的慢的都这么说），更重要的是：跑步可以让我真实的感觉到我还活着，而且是那种连呼吸都带着热乎气，热气腾腾的活着。</p>
<p>我们总说“<strong>人生是一场马拉松</strong>”，这句话我们听过多少遍了，有些道理，光听是没有用的，不去跑一次马拉松，也许这辈子都不可能理解到这句话背后的真正含义。</p>
<p><strong>欲文明其精神，先野蛮其体魄</strong>，这句话的含金量一直在上升。</p>
<p>马拉松全长 42.195 公里，我从 16 公里就开始掉速，半马过后，每一公里我都想退赛，后面的路我也不知道是如何跑下去的，也许是每一次补给都能让我再坚持个几百米，撑不住了再硬挪几百米，路人喊一嗓子 “加油”，又能咬着牙再迈几步，就这样一点点的撑到终点。</p>
<p>你看，<strong>很多了不起跟钱一点关系都没有</strong>。</p>
<p><img src="https://cos.moya.plus/article/assets/1784289335428-容器-5@1x.jpg" alt="1784289335428-容器-5@1x" loading="lazy">
跑步的好处是，它可以治愈一个人大大小小的身体上或者心理上的各种难以描述的问题。</p>
<p>在此之前，我最远的距离也就是半马，但报名的时候还是不犹豫的选择了全马，因为我知道，半马我是可以跑完的，全马没试过，这将会是一次我从来没有的过的考验，如果我能安全完赛，我自己都会高看自己一眼，</p>
<p>很多人喜欢说“我做不到，我没时间”，因为说完就可以不做这件事情了，这是穷人的思维。而富人思维是，“我怎样才能做到，我怎样才能抽出时间，我要为此付出多大的代价，我这么做有哪些好处”。</p>
<p>人生中很重要的一件事就是，要把自己从“别人希望我成为的样子”，逐渐变成“我想活成的样子”，而跑步，是任何一个普通人都可以拥有的雕刻自己的刻刀，<strong>任何一个人都可以通过跑步，把自己一点点雕刻成自己想要的样子。</strong></p>
<h3 id="没必要当一个好学生"><strong>没必要当一个好学生</strong></h3><p>你有没有发现，其实我们很多人都被学生时代的自己给困住了，从小开始，学校和父母就要求你做一个好学生——你得好，而且只可以好，绝不允许糟。</p>
<p>于是毕业后依然保持着这种“好学生心态”在社会上生存，只要得不到认可，或者被比下去，搞砸了某件事情，就会产生巨大的挫败感和愧疚感，深陷焦虑和严重的自我怀疑，然后没完没了的内耗下去 ，总之就是一句话：<strong>具备好学生心态的人，都非常在意外界的评价。</strong></p>
<p>我承认我以前也是，觉得学校里的好学生，以后除了社会也一定会是个“好大人”，其实并不是这样的。</p>
<p>我曾经跟很多人一样，害怕犯错失败，苛求完美，习惯性讨好身边人，不懂得拒绝，是个人找我帮忙我都欣然接受。</p>
<p>可结果是，我们这样的人，活成了别人眼里听话懂事、省心、容易相处的样子，但代价却是我牺牲了快乐、自由和原则，因为职场里根本用不到这些，拼命工作的人远没有油嘴滑舌的人过的好，这不就是那些家长眼里的好学生，毕业后都很难在社会上立足的真实写照吗？</p>
<p>于是，<strong>生活试图嚼烂你，却发现你入口即化。</strong></p>
<p>可是我想说，搞砸一次，生活并不会因此崩盘，失败一次，人生也不会因此完蛋，<strong>怕犯错，不妨就犯一次试试看。</strong></p>
<p><img src="https://cos.moya.plus/article/assets/1784289368355-容器-3@1x.jpg" alt="1784289368355-容器-3@1x" loading="lazy"></p>
<p>我们从小就被教育要学会分享，要懂得孔融让梨的故事，但没教我们的是：<strong>分享是把自己多余的分给别人，而不是把自己本就不够的拱手送人。</strong></p>
<p>允许自己比别人差劲，其实也不是什么丢人的事情， 不要把自己放在一个被评价的位置上，不是“别人觉得你好，才是对的”，而是“我觉得好，它就是好的、对的”。</p>
<p>所以要摆脱好学生心态，<strong>所谓的“要听话”，指的是听自己的话。</strong></p>
<p><img src="https://cos.moya.plus/article/assets/1784289400926-容器-4@1x.jpg" alt="1784289400926-容器-4@1x" loading="lazy"></p>
<h3 id="未来邮局"><strong>未来邮局</strong></h3><p>今年我提到最多的一个词是耐心，这是一个学校里不教，却又是非常重要的一个技能，我也不止一次的分享：<strong>许多人在投资市场里赚不到钱，几乎都是拜没有耐心所赐。</strong></p>
<p>而我要说耐心的另外一层意思——<strong>给未来埋下一颗种子。</strong>
<img src="https://cos.moya.plus/article/assets/1784289395377-容器-2@1x.jpg" alt="1784289395377-容器-2@1x" loading="lazy"></p>
<p>很多事情不是立马就能看到成效的，需要足够的时间去沉淀，才能看到最后的那个样子。</p>
<p>十年前，高中毕业后的暑假，我向班里的同学发起了一个活动，主题叫做“给十年后的自己”，一共收到了 32 封信。</p>
<p>十年后，也就是今年的 8 月 19 号，我开发的未来邮局 F.P.O 上线，这 32 封信也如数寄出。</p>
<p>这个在当时非常不起眼的一个活动，我整整记了十年，这不光是对着 32 封信的一个交代，也是给十年前的自己一个轻声的回应，因为当年那颗种子，有了现在未来邮局这个项目。</p>
<p>给未来的自己留一封信，是我觉得特别有意义的一件事。你能想象未来的某一天，收到曾经的自己写给现在的信吗？你有没有过一瞬间，想对未来的自己说点什么，问问未来的自己过的怎么样？</p>
<p>很多人总觉得，自己是<strong>稀里糊涂地来，又身不由己地活，最后茫然地离开</strong>。等有一天回头看时，若觉得自己一事无成，就把走过的过程都贬得毫无意义。</p>
<p>他们会觉得：“吃泡面和吃日料都一样，吃完了，食物和味道就消失了。”、“恋爱和不恋爱都一样，热乎劲儿一过，终究要分道扬镳。”</p>
<p>可是过程本身就是意义，并不是如愿以偿了才叫得到，事实上，但凡<strong>某个东西“滋养”过你，就已经算是得到了。</strong></p>
<p>可口的食物滋养了你的身体，你就得到了这份食物；美丽的风景滋养了你的眼睛，你就得到了那片风景；某个人的出现滋养了你的生命，你就得到过这个人。</p>
<p><strong>活在未来，并充分享受通往未来的所有过程。</strong></p>
<h3 id="我时运高-不听鬼叫"><strong>我时运高，不听鬼叫</strong></h3><p>到明年，我就三十了，这是一个看起来比较残酷的现实，我也不止一次的问自己，我还来得及吗？</p>
<p>我每次都想很久，然后回答：当然。</p>
<p>我是有信心活到一百岁的，我们这一代人，随着医疗和科技水平的提升，想活到一百岁也不是什么痴心妄想的事情，按照这个寿命，我现在也仅仅是过了不到三分之一而已，我怎么会来不及？</p>
<p>纽约时间比加州时间早 3 个小时，难道就意味着加州就慢了吗？</p>
<p>有人 22 岁毕业，等了 5 年才找到好的工作；而有人 25 岁就当上 CEO，却在 50 岁离世；也有人 50 岁才当上 CEO，却活到了 90 岁；奥巴马 55 岁可就退休了，而川普 70 岁才开始当上总统。</p>
<p>着什么急...</p>
<p>身边的人只是看起来走在你前面，实际上，<strong>我们每个人都在自己的时区里，以自己的节奏前进着。</strong></p>
<p>这个认知今年一直在告诉我，别跟任何人去比，也别跟过去的自己较劲，<strong>所谓的虚荣，无非为了让别人的评价来让自己更加的辛苦而已。</strong></p>
<p>要保持耐心，脱离无效社交，既不为还没有兑现的承诺提前开心，也不为尚未发生的事情提前担心，更不为能力范围以外的事情过度闹心，还不为主线任务以外的事情过分热心。</p>
<p>别人的事就是别人的事，关我屁事？我的事就是我的事，关你屁事？</p>
<p>一个人成熟的标志之一就是不争辩，不解释，不追问。</p>
<p>你说：“我会飞”，那我就说：“注意安全”。</p>
<p><img src="https://cos.moya.plus/article/assets/1784289431805-容器-1@1.5x.jpg" alt="1784289431805-容器-1@1.5x" loading="lazy"></p>
<p>以上就是我过去一年最想分享给你的东西，2026 年见！</p>
]]></content:encoded>
      <pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/2025-year-end</guid>
    </item>
    <item>
      <title><![CDATA[JavaScript 异步编程之 async_await 深入剖析]]></title>
      <link>https://moya.plus/article/js-async-await-1</link>
      <description><![CDATA[随着 JavaScript 应用的边界不断拓展，无论是构建交互性强的网页应用，还是开发复杂的后端服务，在处理网络请求、文件读取这类耗时操作时，异步编程的重要性愈发举足轻重。]]></description>
      <content:encoded><![CDATA[<p>在 JavaScript 中，异步编程已然成为每位开发者都必须攻克的关键领域。随着 JavaScript 应用的边界不断拓展，无论是构建交互性强的网页应用，还是开发复杂的后端服务，在处理网络请求、文件读取这类耗时操作时，异步编程的重要性愈发举足轻重。</p>
<p>而 async/await 作为 ES2017 引入的强大异步编程语法糖，为我们编写和理解异步代码开辟了一条更加简洁、直观的道路。</p>
<p>这篇文章会跟你一起探索 async/await 的底层原理与精妙之处。</p>
<h2 id="一-异步编程的前世今生">一、异步编程的前世今生</h2><p>JavaScript 以单线程模式运行，这意味着它在同一时间只能执行一项任务。倘若所有任务都按部就班地同步执行，一旦遭遇网络请求、文件读取等耗时较长的操作，整个程序就会陷入阻塞状态，网页界面也会随之卡顿，这无疑会对用户体验造成极大的负面影响。为了打破这一困境，异步编程应运而生。它允许在执行耗时操作时，主线程不会被阻塞，而是能够继续处理其他任务。待耗时操作完成后，再通过回调函数、Promise 或者 async/await 等方式来处理操作结果，从而实现程序的高效运行与流畅交互。</p>
<h2 id="二-promise-异步编程的基石">二、Promise：异步编程的基石</h2><p>在深入探究 async/await 之前，我们有必要先回顾一下 Promise。Promise 是 ES6 引入的一种用于处理异步操作的核心机制，它代表着一个异步操作的最终完成状态（成功或失败）以及对应的结果值。Promise 存在三种状态：<strong>pending</strong>（进行中）、<strong>fulfilled</strong>（已成功）和 <strong>rejected</strong>（已失败）。一旦 Promise 的状态发生改变，就无法再回溯，状态转变仅存在两种可能：从 <strong>pending</strong> 转变为<strong>fulfilled</strong>，或者从 <strong>pending</strong> 转变为 <strong>rejected</strong>。</p>
<p>下面来看一个简单的 Promise 示例：</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">const</span> promise = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =&gt;</span> {
  <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">const</span> success = <span class="hljs-literal">true</span>;
    <span class="hljs-keyword">if</span> (success) {
      <span class="hljs-title function_">resolve</span>(<span class="hljs-string">&#x27;操作成功&#x27;</span>);
    } <span class="hljs-keyword">else</span> {
      <span class="hljs-title function_">reject</span>(<span class="hljs-string">&#x27;操作失败&#x27;</span>);
    }
  }, <span class="hljs-number">1000</span>);
});
promise.<span class="hljs-title function_">then</span>(<span class="hljs-function">(<span class="hljs-params">value</span>) =&gt;</span> {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(value); <span class="hljs-comment">// 操作成功</span>
}).<span class="hljs-title function_">catch</span>(<span class="hljs-function">(<span class="hljs-params">error</span>) =&gt;</span> {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(error);
});
</code></pre><p>在这个示例中，我们创建了一个 Promise，它会在 1 秒后根据 success 的值来决定是调用 resolve 函数表示操作成功，还是调用 reject 函数表示操作失败。随后，通过then方法来处理操作成功的情况，通过 catch 方法来捕获并处理操作失败时的错误。</p>
<p>Promise 的出现成功解决了回调地狱的难题，使得异步代码的结构更加清晰、易于维护。然而，在处理多个异步操作时，链式调用的代码结构有时仍显得较为繁琐，而 async/await 正是在 Promise 的基础上进一步优化而来，旨在提供更加简洁、高效的异步编程体验。</p>
<h2 id="三-async-await-基础语法详解">三、async/await 基础语法详解</h2><p>async关键字用于定义一个异步函数，这类函数始终会返回一个 Promise 对象。而await关键字则只能在async函数内部使用，它的作用是等待一个 Promise 对象的状态变为 <strong>fulfilled</strong> 或 <strong>rejected</strong>，并暂停async函数的执行，直到所等待的 Promise 被解决。</p>
<p>以下是一个简单的 async/await 示例：</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">asyncFunction</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">try</span> {
    <span class="hljs-keyword">const</span> value = <span class="hljs-keyword">await</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve</span>) =&gt;</span> {
      <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> {
        <span class="hljs-title function_">resolve</span>(<span class="hljs-string">&#x27;异步操作结果&#x27;</span>);
      }, <span class="hljs-number">1000</span>);
    });
    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(value); <span class="hljs-comment">// 异步操作结果</span>
  } <span class="hljs-keyword">catch</span> (error) {
    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(error);
  }
}

<span class="hljs-title function_">asyncFunction</span>();
</code></pre><p>在这个示例中，asyncFunction 是一个异步函数，其中的 await 关键字等待 Promise 的解决，待 Promise 成功解决后，将结果赋值给value变量，最后将结果打印输出。如果 Promise 被拒绝，catch 代码块会捕获并处理相应的错误信息。</p>
<h2 id="四-async-await-的显著优势">四、async/await 的显著优势</h2><ol>
<li><strong>代码简洁直观</strong>：async/await 使得异步代码的书写风格与同步代码极为相似，大大提升了代码的可读性与可维护性。开发者无需再花费大量精力去梳理复杂的异步操作流程，代码逻辑更加清晰明了。</li>
<li><strong>错误处理便捷高效</strong>：借助 try...catch 代码块，我们可以统一处理异步操作过程中可能出现的各种错误，而无需像使用 Promise 时那样通过链式调用catch方法来捕获错误，这使得错误处理更加集中、高效。</li>
<li><strong>顺序执行一目了然</strong>：await 关键字会暂停 async 函数的执行，直至所等待的 Promise 被成功解决，这使得异步操作的顺序执行更加直观、易于理解，有效避免了因异步操作顺序混乱而导致的逻辑错误。</li>
</ol>
<h2 id="五-async-await-与-promise-的协同应用">五、async/await 与 Promise 的协同应用</h2><p>async/await 是建立在 Promise 基础之上的，因此它们能够完美地协同工作。在实际应用中，我们既可以在async函数内部返回一个 Promise 对象，也可以在使用await等待一个 Promise 对象解决后，继续进行链式操作。</p>
<p>以下是一个展示 async/await 与 Promise 结合使用的示例：</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">asyncPromiseCombination</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">const</span> result1 = <span class="hljs-keyword">await</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve</span>) =&gt;</span> {
    <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> {
      <span class="hljs-title function_">resolve</span>(<span class="hljs-string">&#x27;第一个异步操作结果&#x27;</span>);
    }, <span class="hljs-number">1000</span>);
  });
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(result1);
  <span class="hljs-keyword">const</span> result2 = <span class="hljs-keyword">await</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve</span>) =&gt;</span> {
    <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> {
      <span class="hljs-title function_">resolve</span>(<span class="hljs-string">&#x27;第二个异步操作结果&#x27;</span>);
    }, <span class="hljs-number">1000</span>);
  });
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(result2);
  <span class="hljs-keyword">return</span> result1 +<span class="hljs-string">&#x27;&#x27;</span> + result2;
}

<span class="hljs-title function_">asyncPromiseCombination</span>().<span class="hljs-title function_">then</span>(<span class="hljs-function">(<span class="hljs-params">finalResult</span>) =&gt;</span> {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(finalResult); <span class="hljs-comment">// 第一个异步操作结果 第二个异步操作结果</span>
});
</code></pre><p>在这个示例中，我们在 async 函数 asyncPromiseCombination 中依次执行了两个异步操作，通过 await 关键字分别等待它们的结果。待两个异步操作都完成后，将两个结果拼接起来并返回。最后，在外部通过 then 方法来处理最终拼接后的结果。</p>
<h2 id="六-async-await-进阶技巧">六、async/await 进阶技巧</h2><h3 id="一-并发与并行操作">（一）并发与并行操作</h3><p>在处理多个异步任务时，我们可以利用 Promise.all 来实现并发操作。Promise.all 接受一个 Promise 数组作为参数，当所有 Promise 都被解决时，它返回一个包含所有结果的新 Promise；只要有一个 Promise 被拒绝，整个 Promise.all 就会被拒绝。</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">concurrentTasks</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">const</span> promise1 = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve</span>) =&gt;</span> <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> <span class="hljs-title function_">resolve</span>(<span class="hljs-string">&#x27;任务1结果&#x27;</span>), <span class="hljs-number">1000</span>));
  <span class="hljs-keyword">const</span> promise2 = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve</span>) =&gt;</span> <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> <span class="hljs-title function_">resolve</span>(<span class="hljs-string">&#x27;任务2结果&#x27;</span>), <span class="hljs-number">2000</span>));
  <span class="hljs-keyword">const</span> [result1, result2] = <span class="hljs-keyword">await</span> <span class="hljs-title class_">Promise</span>.<span class="hljs-title function_">all</span>([promise1, promise2]);
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(result1, result2);
}
</code></pre><p>如果希望所有任务都能执行完成，无论成功或失败，可以使用 Promise.allSettled。它会返回一个新的 Promise，该 Promise 在所有输入的 Promise 都已被解决（包括成功和失败）时被解决，返回的结果数组中每个元素都会包含任务的状态（status 为 <strong>fulfilled</strong> 或 <strong>rejected</strong>）以及对应的结果或错误。</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">allSettledTasks</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">const</span> promise1 = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve</span>) =&gt;</span> <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> <span class="hljs-title function_">resolve</span>(<span class="hljs-string">&#x27;任务1结果&#x27;</span>), <span class="hljs-number">1000</span>));
  <span class="hljs-keyword">const</span> promise2 = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">reject</span>) =&gt;</span> <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> <span class="hljs-title function_">reject</span>(<span class="hljs-string">&#x27;任务2失败&#x27;</span>), <span class="hljs-number">2000</span>));
  <span class="hljs-keyword">const</span> results = <span class="hljs-keyword">await</span> <span class="hljs-title class_">Promise</span>.<span class="hljs-title function_">allSettled</span>([promise1, promise2]);
  results.<span class="hljs-title function_">forEach</span>(<span class="hljs-function">(<span class="hljs-params">result, index</span>) =&gt;</span> {
    <span class="hljs-keyword">if</span> (result.<span class="hljs-property">status</span> === <span class="hljs-string">&#x27;fulfilled&#x27;</span>) {
      <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`任务<span class="hljs-subst">${index + <span class="hljs-number">1</span>}</span>成功，结果:`</span>, result.<span class="hljs-property">value</span>);
    } <span class="hljs-keyword">else</span> {
      <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`任务<span class="hljs-subst">${index + <span class="hljs-number">1</span>}</span>失败，错误:`</span>, result.<span class="hljs-property">reason</span>);
    }
  });
}
</code></pre><h3 id="二-处理异步迭代器">（二）处理异步迭代器</h3><p>async/await 可以很好地与异步迭代器配合使用。异步迭代器是一种特殊的迭代器，它的 next() 方法返回一个 Promise。例如，我们有一个异步生成器函数，它会异步生成一系列数字：</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span>* <span class="hljs-title function_">asyncGenerator</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">yield</span> <span class="hljs-keyword">await</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve</span>) =&gt;</span> <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> <span class="hljs-title function_">resolve</span>(<span class="hljs-number">1</span>), <span class="hljs-number">1000</span>));
  <span class="hljs-keyword">yield</span> <span class="hljs-keyword">await</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve</span>) =&gt;</span> <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> <span class="hljs-title function_">resolve</span>(<span class="hljs-number">2</span>), <span class="hljs-number">1000</span>));
  <span class="hljs-keyword">yield</span> <span class="hljs-keyword">await</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve</span>) =&gt;</span> <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> <span class="hljs-title function_">resolve</span>(<span class="hljs-number">3</span>), <span class="hljs-number">1000</span>));
}
<span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">iterateAsyncGenerator</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">const</span> gen = <span class="hljs-title function_">asyncGenerator</span>();
  <span class="hljs-keyword">let</span> result = <span class="hljs-keyword">await</span> gen.<span class="hljs-title function_">next</span>();
  <span class="hljs-keyword">while</span> (!result.<span class="hljs-property">done</span>) {
    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(result.<span class="hljs-property">value</span>);
    result = <span class="hljs-keyword">await</span> gen.<span class="hljs-title function_">next</span>();
  }
}
</code></pre><h2 id="七-async-await-调试技巧">七、async/await 调试技巧</h2><h3 id="一-使用-debugger-关键字">（一）使用 debugger 关键字</h3><p>在 async 函数中，我们可以使用 debugger 关键字来暂停代码执行，以便在调试工具中查看变量状态和执行流程。例如：</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">debugAsyncFunction</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">const</span> value = <span class="hljs-keyword">await</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve</span>) =&gt;</span> <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> <span class="hljs-title function_">resolve</span>(<span class="hljs-string">&#x27;异步操作结果&#x27;</span>), <span class="hljs-number">1000</span>));
  <span class="hljs-keyword">debugger</span>;
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(value);
}
</code></pre><p>当代码执行到 debugger 时，会在浏览器的开发者工具或 Node.js 的调试环境中暂停，我们可以查看value的值以及函数调用栈等信息。</p>
<h3 id="二-合理使用日志输出">（二）合理使用日志输出</h3><p>在 async 函数中，通过 console.log、console.error 等日志输出函数，可以帮助我们了解异步操作的执行过程和结果。比如在错误处理时，详细的错误日志可以帮助我们快速定位问题：</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">logAsyncFunction</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">try</span> {
    <span class="hljs-keyword">const</span> value = <span class="hljs-keyword">await</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =&gt;</span> {
      <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> <span class="hljs-title function_">reject</span>(<span class="hljs-string">&#x27;异步操作失败&#x27;</span>), <span class="hljs-number">1000</span>);
    });
    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(value);
  } <span class="hljs-keyword">catch</span> (error) {
    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">error</span>(<span class="hljs-string">&#x27;异步操作出现错误:&#x27;</span>, error);
  }
}
</code></pre><h3 id="三-利用调试工具的断点功能">（三）利用调试工具的断点功能</h3><p>无论是浏览器的开发者工具还是 Node.js 的调试工具，都支持设置断点。我们可以在 async 函数的关键位置设置断点，逐步调试代码，观察变量的变化和异步操作的执行情况。例如在 Chrome 浏览器中，在 async 函数的代码行左侧点击即可设置断点，然后刷新页面或执行函数，代码就会在断点处暂停。</p>
<p>async/await 无疑为 JavaScript 异步编程带来了前所未有的便利，它让我们能够以更加优雅、简洁的方式处理复杂的异步操作。通过深入理解其原理与用法，掌握进阶技巧和调试方法，我们能够编写出更加高效、易读的异步代码，为打造高性能的 JavaScript 应用奠定坚实基础。希望本文能帮助大家更好地掌握 async/await 这一强大工具，在 JavaScript 编程的道路上更进一步。</p>
]]></content:encoded>
      <pubDate>Wed, 23 Apr 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/js-async-await-1</guid>
    </item>
    <item>
      <title><![CDATA[JavaScript 设计模式之单例模式在前端应用]]></title>
      <link>https://moya.plus/article/js-design-mode-single</link>
      <description><![CDATA[JavaScript 设计模式为我们提供了一系列解决问题的思路和方案，其中单例模式凭借其独特的特性，在前端应用中发挥着重要作用。]]></description>
      <content:encoded><![CDATA[<p>在前端开发的复杂世界里，如何高效地管理资源、优化代码结构是开发者们始终关注的重点。JavaScript 设计模式为我们提供了一系列解决问题的思路和方案，其中单例模式凭借其独特的特性，在前端应用中发挥着重要作用。今天，就让我们一同深入探索 JavaScript 单例模式在前端开发中的应用。</p>
<h2 id="一-单例模式基础概念">一、单例模式基础概念</h2><p>单例模式是一种创建型设计模式，它确保一个类只有一个实例，并提供一个全局访问点。在 JavaScript 中，由于没有类的概念（ES6 之前），我们通过对象字面量和闭包来实现单例模式。单例模式具有以下几个关键特点：</p>
<ol>
<li><strong>唯一性</strong>：整个应用程序中，单例对象只有一个实例。这意味着无论在何处请求该对象，得到的都是同一个实例，避免了资源的重复创建和浪费。</li>
<li><strong>全局访问</strong>：提供一个全局的访问点，方便在应用的各个部分获取和使用单例对象。</li>
</ol>
<h3 id="简单实现示例">简单实现示例</h3><pre><code class="hljs language-javascript"><span class="hljs-comment">// 简单的单例模式实现</span>
<span class="hljs-keyword">const</span> <span class="hljs-title class_">Singleton</span> = (<span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
  <span class="hljs-keyword">let</span> instance;，
  <span class="hljs-keyword">function</span> <span class="hljs-title function_">createInstance</span>(<span class="hljs-params"></span>) {
    <span class="hljs-keyword">const</span> object = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Object</span>(<span class="hljs-string">&#x27;我是单例实例&#x27;</span>);
    <span class="hljs-keyword">return</span> object;
  }
  <span class="hljs-keyword">return</span> {
    <span class="hljs-attr">getInstance</span>: <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
      <span class="hljs-keyword">if</span> (!instance) {
        instance = <span class="hljs-title function_">createInstance</span>();
      }
      <span class="hljs-keyword">return</span> instance;
    }
  };
})();

<span class="hljs-comment">// 获取单例实例</span>
<span class="hljs-keyword">const</span> instance1 = <span class="hljs-title class_">Singleton</span>.<span class="hljs-title function_">getInstance</span>();
<span class="hljs-keyword">const</span> instance2 = <span class="hljs-title class_">Singleton</span>.<span class="hljs-title function_">getInstance</span>();
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(instance1 === instance2); <span class="hljs-comment">// true，说明是同一个实例</span>
</code></pre><h2 id="二-单例模式在前端状态管理中的应用">二、单例模式在前端状态管理中的应用</h2><p>在前端开发中，状态管理是一个重要环节。单例模式可以用于创建全局状态管理对象，确保状态在整个应用中唯一且可全局访问。</p>
<h3 id="应用场景">应用场景</h3><p>想象一个多页面的 Web 应用，用户的登录状态、用户信息等需要在各个页面之间共享和同步。使用单例模式创建一个全局状态管理对象，可以方便地管理这些状态。</p>
<h3 id="具体实现">具体实现</h3><pre><code class="hljs language-javascript"><span class="hljs-comment">// 基于单例模式的简单状态管理</span>
<span class="hljs-keyword">const</span> <span class="hljs-title class_">StateManager</span> = (<span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
  <span class="hljs-keyword">let</span> instance;
  <span class="hljs-keyword">let</span> state = {
    <span class="hljs-attr">user</span>: <span class="hljs-literal">null</span>,
    <span class="hljs-attr">isLoggedIn</span>: <span class="hljs-literal">false</span>
  };
  <span class="hljs-keyword">function</span> <span class="hljs-title function_">createInstance</span>(<span class="hljs-params"></span>) {
    <span class="hljs-keyword">return</span> {
      <span class="hljs-attr">setState</span>: <span class="hljs-keyword">function</span> (<span class="hljs-params">newState</span>) {
        state = {...state,...newState };
      },
      <span class="hljs-attr">getState</span>: <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
        <span class="hljs-keyword">return</span> state;
      }
    };
  }
  <span class="hljs-keyword">return</span> {
    <span class="hljs-attr">getInstance</span>: <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
      <span class="hljs-keyword">if</span> (!instance) {
        instance = <span class="hljs-title function_">createInstance</span>();
      }
      <span class="hljs-keyword">return</span> instance;
    }
  };
})();
<span class="hljs-comment">// 使用状态管理</span>
<span class="hljs-keyword">const</span> stateManager = <span class="hljs-title class_">StateManager</span>.<span class="hljs-title function_">getInstance</span>();
stateManager.<span class="hljs-title function_">setState</span>({ <span class="hljs-attr">user</span>: { <span class="hljs-attr">name</span>: <span class="hljs-string">&#x27;张三&#x27;</span> }, <span class="hljs-attr">isLoggedIn</span>: <span class="hljs-literal">true</span> });
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(stateManager.<span class="hljs-title function_">getState</span>()); <span class="hljs-comment">// { user: { name: &#x27;张三&#x27; }, isLoggedIn: true }</span>
</code></pre><p>这样，在应用的任何地方，都可以通过StateManager.getInstance()获取状态管理对象，对状态进行读取和修改，保证了状态的一致性和唯一性。</p>
<h2 id="三-单例模式在弹窗组件中的应用">三、单例模式在弹窗组件中的应用</h2><p>弹窗是前端应用中常见的交互元素，如登录弹窗、提示弹窗等。使用单例模式创建弹窗组件，可以确保在整个应用中，同一个类型的弹窗只有一个实例，避免多次创建造成的性能问题。</p>
<h3 id="应用场景">应用场景</h3><p>在一个电商应用中，商品详情页和购物车页面都可能需要弹出登录弹窗。如果每次都创建一个新的登录弹窗实例，不仅会增加内存消耗，还可能导致样式和行为的不一致。</p>
<h3 id="具体实现">具体实现</h3><pre><code class="hljs language-html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">&quot;en&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">&quot;UTF - 8&quot;</span>&gt;</span>
    
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;openPopup&quot;</span>&gt;</span>打开弹窗<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;popup&quot;</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;loginPopup&quot;</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>登录<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">form</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text&quot;</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">&quot;用户名&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;password&quot;</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">&quot;密码&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;submit&quot;</span>&gt;</span>登录<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">form</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre><p>通过单例模式，无论在应用的哪个部分调用PopupManager.getInstance().open()，都是打开同一个登录弹窗实例，有效提升了应用的性能和用户体验。</p>
<h2 id="四-单例模式在前端缓存中的应用">四、单例模式在前端缓存中的应用</h2><p>前端缓存是优化页面加载速度的重要手段，单例模式可以用于创建缓存管理对象，统一管理应用中的缓存数据。</p>
<h3 id="应用场景">应用场景</h3><p>在一个新闻资讯应用中，需要缓存用户浏览过的新闻列表，避免重复请求服务器。使用单例模式创建的缓存管理对象可以方便地管理这些缓存数据。</p>
<h3 id="具体实现">具体实现</h3><pre><code class="hljs language-javascript"><span class="hljs-comment">// 基于单例模式的缓存管理</span>
<span class="hljs-keyword">const</span> <span class="hljs-title class_">CacheManager</span> = (<span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
  <span class="hljs-keyword">let</span> instance;
  <span class="hljs-keyword">const</span> cache = {};
  <span class="hljs-keyword">function</span> <span class="hljs-title function_">createInstance</span>(<span class="hljs-params"></span>) {
    <span class="hljs-keyword">return</span> {
      <span class="hljs-attr">set</span>: <span class="hljs-keyword">function</span> (<span class="hljs-params">key, value</span>) {
        cache[key] = value;
      },
      <span class="hljs-attr">get</span>: <span class="hljs-keyword">function</span> (<span class="hljs-params">key</span>) {
        <span class="hljs-keyword">return</span> cache[key];
      }
    };
  }
  <span class="hljs-keyword">return</span> {
    <span class="hljs-attr">getInstance</span>: <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
      <span class="hljs-keyword">if</span> (!instance) {
        instance = <span class="hljs-title function_">createInstance</span>();
      }
      <span class="hljs-keyword">return</span> instance;
    }
  };
})();
<span class="hljs-comment">// 使用缓存管理</span>
<span class="hljs-keyword">const</span> cacheManager = <span class="hljs-title class_">CacheManager</span>.<span class="hljs-title function_">getInstance</span>();
cacheManager.<span class="hljs-title function_">set</span>(<span class="hljs-string">&#x27;newsList&#x27;</span>, [<span class="hljs-comment">/* 新闻列表数据 */</span>]);
<span class="hljs-keyword">const</span> cachedNewsList = cacheManager.<span class="hljs-title function_">get</span>(<span class="hljs-string">&#x27;newsList&#x27;</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(cachedNewsList);
</code></pre><p>这样，在应用的不同模块中，可以通过CacheManager.getInstance()获取缓存管理对象，进行缓存的设置和读取，提高数据获取的效率。</p>
<h2 id="五-单例模式在前端路由管理中的应用">五、单例模式在前端路由管理中的应用</h2><h3 id="应用场景">应用场景</h3><p>在单页应用（SPA）中，路由负责管理页面的导航和组件的渲染。使用单例模式创建路由实例，可以确保整个应用中路由配置的唯一性和一致性。例如，在一个使用 Vue.js 开发的单页应用中，路由实例需要全局唯一，以便在不同组件之间进行页面跳转和参数传递。如果创建多个路由实例，可能会导致路由配置冲突，页面跳转异常等问题。</p>
<h3 id="具体实现-以-vue-router-为例">具体实现（以 Vue Router 为例）</h3><pre><code class="hljs language-javascript"><span class="hljs-keyword">import</span> <span class="hljs-title class_">Vue</span> <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;vue&#x27;</span>;
<span class="hljs-keyword">import</span> <span class="hljs-title class_">Router</span> <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;vue - router&#x27;</span>;
<span class="hljs-keyword">import</span> <span class="hljs-title class_">Home</span> <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;./views/Home.vue&#x27;</span>;
<span class="hljs-keyword">import</span> <span class="hljs-title class_">About</span> <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;./views/About.vue&#x27;</span>;
<span class="hljs-title class_">Vue</span>.<span class="hljs-title function_">use</span>(<span class="hljs-title class_">Router</span>);
<span class="hljs-keyword">const</span> routerInstance = (<span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
  <span class="hljs-keyword">let</span> instance;
  <span class="hljs-keyword">function</span> <span class="hljs-title function_">createInstance</span>(<span class="hljs-params"></span>) {
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Router</span>({
      <span class="hljs-attr">routes</span>: [
        {
          <span class="hljs-attr">path</span>: <span class="hljs-string">&#x27;/&#x27;</span>,
          <span class="hljs-attr">name</span>: <span class="hljs-string">&#x27;home&#x27;</span>,
          <span class="hljs-attr">component</span>: <span class="hljs-title class_">Home</span>
        },
        {
          <span class="hljs-attr">path</span>: <span class="hljs-string">&#x27;/about&#x27;</span>,
          <span class="hljs-attr">name</span>: <span class="hljs-string">&#x27;about&#x27;</span>,
          <span class="hljs-attr">component</span>: <span class="hljs-title class_">About</span>
        }
      ]
    });
  }
  <span class="hljs-keyword">return</span> {
    <span class="hljs-attr">getInstance</span>: <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
      <span class="hljs-keyword">if</span> (!instance) {
        instance = <span class="hljs-title function_">createInstance</span>();
      }
      <span class="hljs-keyword">return</span> instance;
    }
  };
})();
<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> routerInstance.<span class="hljs-title function_">getInstance</span>();
</code></pre><p>在上述代码中，通过单例模式创建了 Vue Router 实例。在整个 Vue 应用中，无论哪个组件需要进行路由跳转，都可以通过引入这个唯一的路由实例来实现，保证了路由管理的统一性和稳定性。</p>
<h2 id="六-单例模式在日志记录中的应用">六、单例模式在日志记录中的应用</h2><h3 id="应用场景">应用场景</h3><p>在前端开发中，记录日志对于调试和监控应用的运行状态非常重要。使用单例模式创建日志记录对象，可以确保整个应用中日志记录的一致性和集中管理。例如，在一个大型 Web 应用中，不同模块可能会产生各种类型的日志信息，如错误日志、操作日志等。如果每个模块都自行创建日志记录对象，可能会导致日志格式不一致，难以统一分析和管理。</p>
<h3 id="具体实现">具体实现</h3><pre><code class="hljs language-javascript"><span class="hljs-keyword">const</span> <span class="hljs-title class_">Logger</span> = (<span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
  <span class="hljs-keyword">let</span> instance;
  <span class="hljs-keyword">function</span> <span class="hljs-title function_">createInstance</span>(<span class="hljs-params"></span>) {
    <span class="hljs-keyword">return</span> {
      <span class="hljs-attr">log</span>: <span class="hljs-keyword">function</span> (<span class="hljs-params">message</span>) {
        <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`[<span class="hljs-subst">${<span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>().toISOString()}</span>] <span class="hljs-subst">${message}</span>`</span>);
      },
      <span class="hljs-attr">error</span>: <span class="hljs-keyword">function</span> (<span class="hljs-params">message</span>) {
        <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">error</span>(<span class="hljs-string">`[<span class="hljs-subst">${<span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>().toISOString()}</span>] ERROR: <span class="hljs-subst">${message}</span>`</span>);
      }
    };
    
  }
  <span class="hljs-keyword">return</span> {
    <span class="hljs-attr">getInstance</span>: <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
      <span class="hljs-keyword">if</span> (!instance) {
        instance = <span class="hljs-title function_">createInstance</span>();
      }
      <span class="hljs-keyword">return</span> instance;
    }
  };
})();
<span class="hljs-comment">// 使用日志记录</span>
<span class="hljs-keyword">const</span> logger = <span class="hljs-title class_">Logger</span>.<span class="hljs-title function_">getInstance</span>();
logger.<span class="hljs-title function_">log</span>(<span class="hljs-string">&#x27;This is a log message&#x27;</span>);
logger.<span class="hljs-title function_">error</span>(<span class="hljs-string">&#x27;An error occurred&#x27;</span>);
</code></pre><p>通过单例模式创建的日志记录对象，在应用的任何地方都可以方便地调用Logger.getInstance()获取日志记录实例，进行日志的记录和管理，使得日志信息更加规范和易于维护。</p>
<p>单例模式在 JavaScript 前端应用中有着广泛的应用场景，通过确保对象的唯一性和提供全局访问点，为前端开发带来了诸多便利，如优化资源管理、提升代码的可维护性和性能等。作为前端开发者，深入理解和掌握单例模式，能够更好地应对复杂的前端开发需求，打造出更优质的 Web 应用。</p>
]]></content:encoded>
      <pubDate>Wed, 30 Apr 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/js-design-mode-single</guid>
    </item>
    <item>
      <title><![CDATA[Node.js 事件驱动架构解析：如何利用非阻塞 I_O 实现高效后端服务]]></title>
      <link>https://moya.plus/article/node-event-io</link>
      <description><![CDATA[随着 JavaScript 应用的边界不断拓展，无论是构建交互性强的网页应用，还是开发复杂的后端服务，在处理网络请求、文件读取这类耗时操作时，异步编程的重要性愈发举足轻重。]]></description>
      <content:encoded><![CDATA[<p>在当下互联网应用开发的激烈竞争环境中，后端服务的高效性已然成为决定产品成败的关键因素之一。随着用户规模的急剧膨胀以及业务逻辑愈发错综复杂，传统的同步 I/O 模型在应对高并发、低延迟的严苛要求时，逐渐显得力不从心。Node.js 作为一款依托 Chrome V8 引擎的 JavaScript 运行时环境，凭借其别具一格的事件驱动架构以及非阻塞 I/O 特性，在后端开发领域迅速崛起，为打造高效能后端服务提供了极具潜力的解决方案。接下来，本文将全方位、深层次地剖析 Node.js 的事件驱动架构，深入探讨如何借助非阻塞 I/O 来实现高效的后端服务，并且通过丰富详实的实际代码示例，助力大家透彻理解相关技术要点。</p>
<h2 id="理解事件驱动架构">理解事件驱动架构</h2><h3 id="什么是事件驱动架构">什么是事件驱动架构</h3><p>事件驱动架构本质上是一种软件架构模式，在该模式下，系统的各项行为皆由事件触发。在这种架构体系里，应用程序并非主动去执行任务，而是时刻处于等待状态，等待各类事件的发生。一旦某个事件被触发，与之对应的事件处理程序便会被迅速调用并执行相应操作。以常见的网页应用为例，用户点击按钮这一操作就是一个典型的事件。当用户点击按钮时，浏览器会即刻调用预先编写好的点击事件处理函数，进而执行诸如提交表单、切换页面等一系列后续动作。这种基于事件触发的机制，使得应用程序能够灵活响应用户的各种操作，极大地提升了交互体验。</p>
<h3 id="node-js-中的事件驱动模型">Node.js 中的事件驱动模型</h3><p>Node.js 坚定地采用了事件驱动的编程模型。在 Node.js 的运行环境中，几乎所有涉及 I/O 的操作，包括但不限于文件读取、网络请求等，都被设计为异步执行。具体而言，当一个 I/O 操作被发起时，Node.js 并不会傻等该操作完成，而是迅速继续执行后续代码。只有当 I/O 操作顺利完成后，才会触发一个特定事件，及时通知 Node.js 执行预先设定好的回调函数。这种巧妙的机制赋予了 Node.js 强大的并发处理能力。在面对大量并发请求时，Node.js 不会因为某个 I/O 操作的阻塞而导致整体服务陷入停滞，从而能够有条不紊地处理其他请求，大大提升了系统的并发处理性能。例如，在一个大型在线商城系统中，同时可能有数千甚至上万用户发起商品查询、订单提交等请求，Node.js 的事件驱动模型能够确保这些请求被高效处理，不会出现因个别请求的 I/O 操作延迟而影响其他用户体验的情况。</p>
<h2 id="非阻塞-i-o-的原理与优势">非阻塞 I/O 的原理与优势</h2><h3 id="阻塞-i-o-与非阻塞-i-o-的区别">阻塞 I/O 与非阻塞 I/O 的区别</h3><p>在传统的同步 I/O 模型中，进程的行为相对较为刻板。当一个进程发起 I/O 操作时，它会被强制阻塞，进入等待状态，直到该 I/O 操作彻底完成。比如，当一个进程执行文件读取操作时，它会全神贯注地等待文件内容被完整读取，在这一过程中，该进程无法执行其他任何任务，就像被 “冻结” 了一样。这种同步阻塞的方式在 I/O 操作耗时较长时，会极大地浪费系统资源，降低系统的整体运行效率。</p>
<p>与之形成鲜明对比的是，在非阻塞 I/O 模型中，进程的行为更加灵活高效。当进程发起 I/O 操作后，它不会被阻塞，而是立刻返回执行其他任务。进程可以继续在系统中忙碌地处理各种事务，而当 I/O 操作最终完成时，系统会通过特定的事件通知进程。以网络请求为例，在非阻塞 I/O 模型下，发起网络请求的进程在发出请求后，无需等待响应结果，就可以继续处理其他网络请求或者执行本地的计算任务，只有当服务器返回响应数据时，进程才会被通知进行后续处理。</p>
<h3 id="非阻塞-i-o-在-node-js-中的优势">非阻塞 I/O 在 Node.js 中的优势</h3><p>Node.js 以非阻塞 I/O 为基石构建自身运行机制，这一特性使其在处理高并发请求方面展现出无与伦比的优势。由于 I/O 操作不会阻塞主线程，Node.js 能够在同一时刻轻松应对大量的并发请求，而无需像传统方式那样，为每个请求单独创建新的线程或进程。这种轻量级的处理方式，不仅大幅减少了系统资源的不必要开销，还显著提升了系统的响应速度和吞吐量。例如，在一个热门的社交平台后端，每天可能会产生数以亿计的用户请求，包括发布动态、点赞评论、查看好友信息等。使用 Node.js 的非阻塞 I/O 技术，能够确保该社交平台在高并发的情况下依然保持流畅运行，快速响应用户请求，避免出现卡顿或延迟现象，为用户提供优质的使用体验。</p>
<h2 id="代码示例-利用-node-js-实现高效后端服务">代码示例：利用 Node.js 实现高效后端服务</h2><h3 id="简单的-http-服务器示例">简单的 HTTP 服务器示例</h3><p>下面我们通过一个简洁明了的 Node.js HTTP 服务器示例，直观展示如何巧妙运用事件驱动架构和非阻塞 I/O 来构建高效的后端服务。</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">const</span> http = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;http&#x27;</span>);
<span class="hljs-comment">// 创建一个HTTP服务器</span>
<span class="hljs-keyword">const</span> server = http.<span class="hljs-title function_">createServer</span>(<span class="hljs-function">(<span class="hljs-params">req, res</span>) =&gt;</span> {
  <span class="hljs-comment">// 设置响应头，表明返回的数据类型为纯文本</span>
  res.<span class="hljs-title function_">writeHead</span>(<span class="hljs-number">200</span>, { <span class="hljs-string">&#x27;Content-Type&#x27;</span>: <span class="hljs-string">&#x27;text/plain&#x27;</span> });
  <span class="hljs-comment">// 模拟一个耗时的I/O操作，这里使用setTimeout模拟，实际场景可能是复杂的数据库查询或文件读取</span>
  <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> {
    res.<span class="hljs-title function_">end</span>(<span class="hljs-string">&#x27;Hello, World!&#x27;</span>);
  }, <span class="hljs-number">2000</span>);
});
<span class="hljs-comment">// 让服务器监听3000端口，一旦启动成功，会在控制台输出提示信息</span>
server.<span class="hljs-title function_">listen</span>(<span class="hljs-number">3000</span>, <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&#x27;Server running at port 3000&#x27;</span>);
});
</code></pre><p>在这个示例里，我们借助 Node.js 的http模块成功创建了一个简易的 HTTP 服务器。当服务器接收到客户端发来的请求时，它会迅速设置好响应头，随后模拟一个耗时 2 秒的 I/O 操作（通过setTimeout函数模拟真实 I/O 操作的延迟）。值得注意的是，在这 2 秒的模拟 I/O 操作执行期间，服务器并不会被阻塞，依然能够自如地处理其他新涌入的请求。这正是非阻塞 I/O 特性的生动体现，通过事件驱动的方式，使得服务器能够高效地应对并发请求，确保系统的高可用性和流畅运行。</p>
<h3 id="文件读取示例">文件读取示例</h3><p>接下来，我们通过一个文件读取的示例，进一步深入理解非阻塞 I/O 在 Node.js 中的具体应用。</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">const</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;fs&#x27;</span>);
<span class="hljs-keyword">const</span> http = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;http&#x27;</span>);
<span class="hljs-keyword">const</span> server = http.<span class="hljs-title function_">createServer</span>(<span class="hljs-function">(<span class="hljs-params">req, res</span>) =&gt;</span> {
  res.<span class="hljs-title function_">writeHead</span>(<span class="hljs-number">200</span>, { <span class="hljs-string">&#x27;Content-Type&#x27;</span>: <span class="hljs-string">&#x27;text/plain&#x27;</span> });
  <span class="hljs-comment">// 使用fs.readFile进行非阻塞文件读取操作</span>
  fs.<span class="hljs-title function_">readFile</span>(<span class="hljs-string">&#x27;example.txt&#x27;</span>, <span class="hljs-string">&#x27;utf8&#x27;</span>, <span class="hljs-function">(<span class="hljs-params">err, data</span>) =&gt;</span> {
    <span class="hljs-keyword">if</span> (err) {
      <span class="hljs-comment">// 如果读取文件过程中出现错误，向客户端返回错误提示信息</span>
      res.<span class="hljs-title function_">end</span>(<span class="hljs-string">&#x27;Error reading file&#x27;</span>);
    } <span class="hljs-keyword">else</span> {
      <span class="hljs-comment">// 若文件读取成功，将读取到的数据返回给客户端</span>
      res.<span class="hljs-title function_">end</span>(data);
    }
  });
});
server.<span class="hljs-title function_">listen</span>(<span class="hljs-number">3000</span>, <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&#x27;Server running at port 3000&#x27;</span>);
});
</code></pre><p>在这个示例中，我们运用fs.readFile方法来读取一个文件。fs.readFile是 Node.js 提供的一个典型的非阻塞文件读取方法，它接收一个回调函数作为参数。当文件读取操作顺利完成后，会自动触发该回调函数，将读取到的数据传递给后续处理逻辑，进而返回给客户端。在文件读取的整个过程中，服务器可以毫无阻碍地继续处理其他请求，不会因为文件读取这一 I/O 操作而陷入阻塞状态。这一特性在实际应用中非常重要，比如在一个在线文档管理系统中，用户可能同时请求读取不同的文档，Node.js 的非阻塞 I/O 能够确保这些请求都能被及时处理，提升系统的整体性能。</p>
<h2 id="总结">总结</h2><p>Node.js 的事件驱动架构与非阻塞 I/O 特性相辅相成，为构建高性能的后端服务提供了坚实有力的支撑。通过深入理解事件驱动架构的核心原理，熟练掌握非阻塞 I/O 的实际应用技巧，开发者能够充分发挥 Node.js 的优势，构建出能够从容应对高并发请求、响应速度极快的后端服务。在实际项目开发过程中，根据具体的业务需求，合理运用 Node.js 的这些特性，能够显著优化应用的性能表现，为用户带来更加流畅、高效的使用体验。希望本文深入浅出的解析以及丰富的代码示例，能够帮助大家更好地领悟和运用 Node.js 的事件驱动架构和非阻塞 I/O 技术，为构建卓越的后端服务筑牢根基。</p>
]]></content:encoded>
      <pubDate>Wed, 23 Apr 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/node-event-io</guid>
    </item>
    <item>
      <title><![CDATA[Web 开发中减少 HTTP 请求的性能优化技巧]]></title>
      <link>https://moya.plus/article/web-jianshaoqingqiu</link>
      <description><![CDATA[如果你要打造高效、流畅用户体验，性能优化必不可少。而减少 HTTP 请求，则是性能优化中最为核心的一招，它的重要性怎么强调都不为过。]]></description>
      <content:encoded><![CDATA[<p>在瞬息万变的 Web 开发领域，性能优化是每一个开发者手中的 “秘密武器”，如果你要打造高效、流畅用户体验，性能优化必不可少。而减少 HTTP 请求，则是性能优化中最为核心的一招，它的重要性怎么强调都不为过。</p>
<p>想象一下，每一次 HTTP 请求就像是派遣一位信使，穿越漫长的网络 “高速公路”，去远方的服务器获取资源。</p>
<p>这个过程不仅耗时，还会消耗大量的网络带宽和服务器资源。如果我们能巧妙地减少这些请求，就如同给网页加载速度安装了一台超级引擎，让它能够飞速响应，给用户带来前所未有的流畅体验。接下来，我将提供给你 8 个减少 HTTP 请求的技巧，希望可以帮助你在项目开发中，提升一定的性能。</p>
<h2 id="一-合并文件-化零为整">一、合并文件、化零为整</h2><p>在前端开发中，我们常常会遇到这样的情况：项目中散落着众多的 CSS 文件和 JavaScript 文件，它们各自为政，每一个文件都需要一次 HTTP 请求才能被加载到页面中。这就好比我们要寄送一堆小包裹，每个包裹都要单独计费，不仅效率低下，还会增加成本。</p>
<p>合并文件的操作，就像是将这些小包裹整合打包成一个大包裹再进行投递。这样一来，投递次数大幅减少，效率自然就提高了。</p>
<h3 id="一-css-文件合并">（一）CSS 文件合并</h3><p>假设我们有三个 CSS 文件：style1.css、style2.css 和 style3.css。</p>
<pre><code class="hljs language-css"><span class="hljs-comment">/* style1.css */</span>
<span class="hljs-selector-tag">body</span> {
  <span class="hljs-attribute">background-color</span>: lightblue;
}
</code></pre><pre><code class="hljs language-css"><span class="hljs-comment">/* style2.css */</span>
<span class="hljs-selector-tag">h1</span> {
  <span class="hljs-attribute">color</span>: red;
}
</code></pre><pre><code class="hljs language-css"><span class="hljs-comment">/* style3.css */</span>
<span class="hljs-selector-tag">p</span> {
  <span class="hljs-attribute">font-size</span>: <span class="hljs-number">16px</span>;
}
</code></pre><p>我们完全可以将它们合并成一个allStyles.css文件：</p>
<pre><code class="hljs language-css"><span class="hljs-selector-tag">body</span> {
  <span class="hljs-attribute">background-color</span>: lightblue;
}
<span class="hljs-selector-tag">h1</span> {
  <span class="hljs-attribute">color</span>: red;
}
<span class="hljs-selector-tag">p</span> {
  <span class="hljs-attribute">font-size</span>: <span class="hljs-number">16px</span>;
}
</code></pre><p>在 HTML 文件中，只需要引入这一个合并后的文件：</p>
<pre><code class="hljs language-html"><span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">&quot;stylesheet&quot;</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;allStyles.css&quot;</span>&gt;</span>
</code></pre><p>通过这种方式，原本需要三次 HTTP 请求才能加载的 CSS 文件，现在只需要一次就可以了。这在小型项目中或许效果不太明显，但在大型项目中，可能会涉及到几十甚至上百个 CSS 文件，通过合并操作，能够极大地减少 HTTP 请求的数量，显著提升页面的加载速度和用户体验。</p>
<h3 id="二-javascript-文件合并">（二）JavaScript 文件合并</h3><p>同理，对于 JavaScript 文件，假设我们有script1.js、script2.js 和 script3.js。</p>
<pre><code class="hljs language-javascript"><span class="hljs-comment">// script1.js</span>
<span class="hljs-keyword">function</span> <span class="hljs-title function_">sayHello</span>(<span class="hljs-params"></span>) {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&#x27;Hello&#x27;</span>);
}
</code></pre><pre><code class="hljs language-javascript"><span class="hljs-comment">// script2.js</span>
<span class="hljs-keyword">function</span> <span class="hljs-title function_">sayWorld</span>(<span class="hljs-params"></span>) {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&#x27;World&#x27;</span>);
}
</code></pre><pre><code class="hljs language-javascript"><span class="hljs-comment">// script3.js</span>
<span class="hljs-keyword">function</span> <span class="hljs-title function_">sayHelloWorld</span>(<span class="hljs-params"></span>) {
  <span class="hljs-title function_">sayHello</span>();
  <span class="hljs-title function_">sayWorld</span>();
}
</code></pre><p>将它们合并成一个allScripts.js：</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">sayHello</span>(<span class="hljs-params"></span>) {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&#x27;Hello&#x27;</span>);
}
<span class="hljs-keyword">function</span> <span class="hljs-title function_">sayWorld</span>(<span class="hljs-params"></span>) {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&#x27;World&#x27;</span>);
}
<span class="hljs-keyword">function</span> <span class="hljs-title function_">sayHelloWorld</span>(<span class="hljs-params"></span>) {
  <span class="hljs-title function_">sayHello</span>();
  <span class="hljs-title function_">sayWorld</span>();
}
</code></pre><p>在 HTML 中引入合并后的文件：</p>
<pre><code class="hljs language-html">
</code></pre><p>合并 JavaScript 文件，不仅能够减少 HTTP 请求，还能使代码结构更加清晰，便于后续的维护和管理。不过，在合并过程中，一定要特别注意文件之间的依赖关系，确保合并后的代码能够正常运行，避免出现因依赖问题导致的功能异常。</p>
<h3 id="三-打包产物优化">（三）打包产物优化</h3><p>试试构建工具的魔法，把CSS/JS文件打包成全家桶套餐。</p>
<pre><code class="hljs language-javascript">src/
  ├── header.<span class="hljs-property">js</span>
  ├── carousel.<span class="hljs-property">js</span>
  └── footer.<span class="hljs-property">js</span>
↓ 打包后 ↓
dist/bundle.<span class="hljs-property">js</span> 
</code></pre><h2 id="二-使用雪碧图-css-sprites">二、使用雪碧图（CSS Sprites）</h2><p>在网页设计中，我们经常会用到各种各样的小图标，比如关闭图标、菜单图标、搜索图标等等。如果每个图标都单独作为一个图片文件进行加载，那么就会产生大量的 HTTP 请求，这无疑会拖慢页面的加载速度。</p>
<p>雪碧图（CSS Sprites）的出现，完美地解决了这个问题。它就像是一个精心整理的图标百宝箱，将多个小图标合并成一张大图片。当我们需要某个图标时，借助 CSS 的background - position属性，就能够像在地图上精准定位一样，快速找到并显示我们需要的图标。</p>
<p>首先，我们把这些小图标合并成一张大图片sprite.png。然后在 CSS 中这样运用：</p>
<pre><code class="hljs language-css"><span class="hljs-comment">/* 关闭图标 */</span>
<span class="hljs-selector-class">.close-icon</span> {
  <span class="hljs-attribute">width</span>: <span class="hljs-number">20px</span>;
  <span class="hljs-attribute">height</span>: <span class="hljs-number">20px</span>;
  <span class="hljs-attribute">background</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">&#x27;sprite.png&#x27;</span>) no-repeat -<span class="hljs-number">20px</span> <span class="hljs-number">0</span>;
}
<span class="hljs-comment">/* 菜单图标 */</span>
<span class="hljs-selector-class">.menu-icon</span> {
  <span class="hljs-attribute">width</span>: <span class="hljs-number">20px</span>;
  <span class="hljs-attribute">height</span>: <span class="hljs-number">20px</span>;
  <span class="hljs-attribute">background</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">&#x27;sprite.png&#x27;</span>) no-repeat -<span class="hljs-number">40px</span> <span class="hljs-number">0</span>;
}
<span class="hljs-comment">/* 搜索图标 */</span>
<span class="hljs-selector-class">.search-icon</span> {
  <span class="hljs-attribute">width</span>: <span class="hljs-number">20px</span>;
  <span class="hljs-attribute">height</span>: <span class="hljs-number">20px</span>;
  <span class="hljs-attribute">background</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">&#x27;sprite.png&#x27;</span>) no-repeat -<span class="hljs-number">60px</span> <span class="hljs-number">0</span>;
}
</code></pre><p>在 HTML 中：</p>
<pre><code class="hljs language-html"><span class="hljs-tag">&lt;<span class="hljs-name">i</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;close-icon&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">i</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">i</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;menu-icon&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">i</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">i</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;search-icon&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">i</span>&gt;</span>
</code></pre><p>通过这种方式，一张图片就满足了多个图标需求，有效减少了 HTTP 请求。在使用雪碧图时，我们要特别注意图片的尺寸和布局，确保每个图标都能清晰显示，并且定位准确无误。此外，随着前端技术的不断发展，现在已经有许多自动化工具可以帮助我们更方便地生成和管理雪碧图，大大提高了开发效率。</p>
<h2 id="三-利用浏览器缓存让网页加载-快人一步">三、利用浏览器缓存让网页加载 “快人一步”</h2><p>大家都知道，我们在日常生活中，会在家里储备一些常用的物品，这样在需要的时候就可以直接取用，无需再去外面购买。在 Web 开发中，利用浏览器缓存的原理与之类似。</p>
<p>我们可以通过设置 HTTP 头信息，让浏览器预先存储一些常用的文件，比如 CSS 文件、JavaScript 文件、图片等等。当下次用户再次请求相同的文件时，浏览器就可以直接从本地缓存中读取，而无需再向服务器发送请求，这无疑大大提高了页面的加载速度。</p>
<p>在 Node.js 中，使用 Express 框架设置缓存头信息非常简单：</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">const</span> express = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;express&#x27;</span>);
<span class="hljs-keyword">const</span> app = <span class="hljs-title function_">express</span>();
<span class="hljs-comment">// 设置静态文件缓存时间为1小时</span>
app.<span class="hljs-title function_">use</span>(express.<span class="hljs-title function_">static</span>(<span class="hljs-string">&#x27;public&#x27;</span>, { <span class="hljs-attr">maxAge</span>: <span class="hljs-number">3600</span> }));
<span class="hljs-keyword">const</span> port = <span class="hljs-number">3000</span>;
app.<span class="hljs-title function_">listen</span>(port, <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`Server running on port <span class="hljs-subst">${port}</span>`</span>);
});
</code></pre><p>这样，当浏览器访问public目录下的静态文件时，这些文件会被缓存 1 小时。在这 1 小时内再次请求相同文件，浏览器会直接从本地缓存中读取，无需向服务器发送请求。</p>
<p>不过，在使用浏览器缓存时，我们也需要注意一个问题：当我们更新文件时，如何确保用户能够获取到最新的版本？这时候，我们可以通过修改文件名、添加版本号等方式，强制浏览器重新获取最新文件，避免用户访问到旧版本的文件，从而保证用户始终能够享受到最新的功能和体验。</p>
<h2 id="四-懒加载-lazy-loading-的智慧">四、懒加载（Lazy Loading）的智慧</h2><p>懒加载的原理非常简单，就像我们点外卖一样，只有当我们真正下单后，外卖才会被送达。在 Web 开发中，懒加载就是只有当用户真正需要某个资源时，才进行加载。</p>
<p>以图片懒加载为例，在 HTML 中：</p>
<pre><code class="hljs language-javascript">&lt;!<span class="hljs-variable constant_">DOCTYPE</span> html&gt;
<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">&quot;en&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">&quot;UTF-8&quot;</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;placeholder.jpg&quot;</span> <span class="hljs-attr">data-src</span>=<span class="hljs-string">&quot;real-image.jpg&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;lazy-load&quot;</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;placeholder.jpg&quot;</span> <span class="hljs-attr">data-src</span>=<span class="hljs-string">&quot;another-real-image.jpg&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;lazy-load&quot;</span> /&gt;</span>
    
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span></span>
</code></pre><p>这里我们先使用一个占位图片placeholder.jpg，当图片进入视口（也就是被用户看到）时，才通过 JavaScript 将真实图片地址赋给src属性，加载真实图片。这样就减少了初始页面加载时的 HTTP 请求，大大提高了页面的加载速度。</p>
<p>懒加载不仅适用于图片，还广泛应用于视频、脚本文件等资源的加载。在实际应用中，我们要根据项目的具体需求和用户体验，合理设置懒加载的触发条件和加载时机，以达到最佳的性能优化效果。</p>
<h2 id="五-使用-cdn-内容分发网络">五、使用 CDN（内容分发网络）</h2><p>CDN，全称 Content Delivery Network，也就是内容分发网络。它就像是一个遍布全球的超级大仓库，在世界各地都设有分仓库。当用户请求资源时，CDN 会智能地从离用户最近的分仓库快速送达资源，不仅传输速度极快，还能有效减轻源服务器的压力。</p>
<p>市面上有许多知名的 CDN 服务提供商，如七牛云、又拍云、阿里云 CDN 等，它们都能提供稳定可靠的服务。</p>
<p>比如我们要引入一个 JQuery 库，使用 CDN 的话，在 HTML 中这样编写：</p>
<pre><code class="hljs language-html">
</code></pre><p>这样就无需从自己的服务器发送请求获取 JQuery 库，而是直接从 CDN 的服务器获取，极大地减少了 HTTP 请求。</p>
<p>在使用 CDN 时，我们要选择信誉良好、节点分布广泛的服务商，并注意 CDN 服务的稳定性和兼容性。同时，对于一些对安全性要求较高的项目，要确保 CDN 服务不会带来安全隐患，比如数据泄露、恶意篡改等问题。</p>
<h2 id="六-内联资源">六、内联资源</h2><p>内联资源，就是将一些小的 CSS 或 JavaScript 代码直接嵌入 HTML 文件中，而不是单独存放于外部文件。这样做的好处是，能够减少对外部文件的请求，从而提高页面的加载速度。</p>
<p>比如有一个简单的 CSS 样式，用于设置按钮的背景颜色和文字颜色：</p>
<pre><code class="hljs language-html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">&quot;en&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">&quot;UTF-8&quot;</span>&gt;</span>
    
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">button</span>&gt;</span>点击我<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre><p>通过这种方式，原本需要单独引入 CSS 文件的操作被省略，减少了一次 HTTP 请求。</p>
<p>不过需要特别注意的是，内联资源只适用于代码量较小的情况。如果代码量过大，会使 HTML 文件变得臃肿不堪，不仅会影响页面的加载速度，还会降低代码的可维护性。因此，在实际应用中，我们要根据代码规模和项目需求，谨慎选择是否使用内联资源。</p>
<h2 id="七-小文件的编码使用-data-url">七、小文件的编码使用 Data URL</h2><p>Data URL 是一种将小文件（比如图片）直接编码成字符串，然后巧妙嵌入到 HTML、CSS 或 JavaScript 文件中的技术。它的出现，为我们减少 HTTP 请求提供了一种新的思路。</p>
<p>例如，有一个小的图标文件icon.png，我们可以借助在线工具将它转换为 Data URL：</p>
<pre><code class="hljs language-css"><span class="hljs-selector-class">.icon</span> {
  <span class="hljs-attribute">background-image</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">&#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==&#x27;</span>);
}
</code></pre><p>在 HTML 中使用这个类：</p>
<pre><code class="hljs language-html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;icon&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre><p>这样就无需对icon.png发送 HTTP 请求，直接在文件中使用编码后的字符串来显示图标。</p>
<p>使用 Data URL 时，我们要注意编码后的字符串长度，因为过长的字符串可能会影响文件的加载和解析速度。通常情况下，Data URL 适用于一些体积非常小的图标或图片资源，对于较大的文件，还是建议使用传统的文件加载方式。</p>
<h2 id="八-缓存接口数据">八、缓存接口数据</h2><p>给常用 API 买个“记忆面包”吧：</p>
<pre><code class="hljs language-javascript"><span class="hljs-comment">// 简单粗暴的缓存示例</span>
<span class="hljs-keyword">const</span> <span class="hljs-title function_">cachedFetch</span> = <span class="hljs-keyword">async</span> (<span class="hljs-params">url</span>) =&gt; {
  <span class="hljs-keyword">const</span> cacheKey = <span class="hljs-string">`cache_<span class="hljs-subst">${url}</span>`</span>;
  <span class="hljs-keyword">const</span> cachedData = <span class="hljs-variable language_">localStorage</span>.<span class="hljs-title function_">getItem</span>(cacheKey);
  
  <span class="hljs-keyword">if</span> (cachedData) <span class="hljs-keyword">return</span> <span class="hljs-title class_">JSON</span>.<span class="hljs-title function_">parse</span>(cachedData);

  <span class="hljs-keyword">const</span> freshData = <span class="hljs-keyword">await</span> <span class="hljs-title function_">fetch</span>(url);
  <span class="hljs-variable language_">localStorage</span>.<span class="hljs-title function_">setItem</span>(cacheKey, <span class="hljs-title class_">JSON</span>.<span class="hljs-title function_">stringify</span>(freshData));
  <span class="hljs-keyword">return</span> freshData;
}
</code></pre><p>掌握了这些减少 HTTP 请求的性能优化技巧，就等于掌握了提升 Web 项目性能的关键钥匙。它们能够帮助我们打造出更加高效、流畅的网页应用，在竞争激烈的 Web 开发领域中脱颖而出。</p>
]]></content:encoded>
      <pubDate>Tue, 22 Apr 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/web-jianshaoqingqiu</guid>
    </item>
    <item>
      <title><![CDATA[Web 无障碍设计中语义化 HTML 的重要性]]></title>
      <link>https://moya.plus/article/web-yuyihuasheji</link>
      <description><![CDATA[为什么说语义化HTML是无障碍设计的最低成本方案与最高收益投资？]]></description>
      <content:encoded><![CDATA[<p>当你在网页中随手写下<code>&lt;div&gt;</code>时，可能有20%的用户永远无法正常使用你的功能——这不是危言耸听！全球超<strong>10亿残疾人用户</strong>、老龄化群体、临时受伤者都在通过无障碍技术访问网络。而看似简单的HTML标签选择，就是打开这扇大门的金钥匙。这篇文章将通过真实案例深度剖析：为什么说语义化HTML是无障碍设计的<strong>最低成本方案</strong>与<strong>最高收益投资</strong>？</p>
<hr>
<h2 id="一-触目惊心的反例-一个按钮引发的用户流失"><strong>一、触目惊心的反例：一个按钮引发的用户流失</strong></h2><p>我们先做个小测试：看看下面两段代码哪个用户体验更好？</p>
<pre><code class="hljs language-html"><span class="hljs-comment">&lt;!-- 魔鬼实现方案 --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;btn&quot;</span>&gt;</span>立即购买<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-comment">&lt;!-- 天使实现方案 --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;button&quot;</span>&gt;</span>立即购买<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
</code></pre><p>对普通人来说视觉上毫无差异，但对键盘用户和屏幕阅读器：</p>
<ul>
<li><strong>键盘操作</strong>：<code>&lt;div&gt;</code>按钮无法通过<code>Tab</code>键聚焦，直接流失所有键盘用户</li>
<li><strong>屏幕阅读器</strong>：普通的<code>&lt;div&gt;</code>会被识别为&quot;分组区域&quot;，用户根本不知道这是个按钮</li>
<li><strong>触屏设备</strong>：<code>:hover</code>效果无法触发，手指误触率提高30%</li>
</ul>
<p>更可怕的是，这种代码每天还在成千上万的网站中诞生...</p>
<hr>
<h2 id="二-解剖html标签的四大-quot-能力基因-quot">二、解剖HTML标签的四大&quot;能力基因&quot;</h2><h3 id="2-1-天生自带的语义化spa"><strong>2.1 天生自带的语义化SPA</strong></h3><p>每个HTML标签都是浏览器和辅助设备约定的「通信协议」：</p>
<table>
<thead>
<tr>
<th>语义标签</th>
<th>传达的信息</th>
<th>对应的ARIA角色</th>
</tr>
</thead>
<tbody><tr>
<td><code>&lt;nav&gt;</code></td>
<td>这是导航区域</td>
<td>role=&quot;navigation&quot;</td>
</tr>
<tr>
<td><code>&lt;article&gt;</code></td>
<td>独立内容块</td>
<td>role=&quot;article&quot;</td>
</tr>
<tr>
<td><code>&lt;button&gt;</code></td>
<td>这是一个可操作按钮</td>
<td>role=&quot;button&quot;</td>
</tr>
<tr>
<td><code>&lt;header&gt;</code></td>
<td>页面/区块头部</td>
<td>role=&quot;banner&quot;</td>
</tr>
<tr>
<td><code>&lt;input type=&quot;search&quot;&gt;</code></td>
<td>搜索框</td>
<td>role=&quot;searchbox&quot;</td>
</tr>
</tbody></table>
<p><strong>对比实验</strong>：用不同设备访问以下结构</p>
<pre><code class="hljs language-html"><span class="hljs-comment">&lt;!-- 语义化版本 --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">nav</span> <span class="hljs-attr">aria-label</span>=<span class="hljs-string">&quot;主菜单&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;/&quot;</span>&gt;</span>首页<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">button</span>&gt;</span>搜索<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span>
<span class="hljs-comment">&lt;!-- div地狱版本 --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;nav&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;list&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;item&quot;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>首页<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;item&quot;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;btn&quot;</span>&gt;</span>搜索<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre><p>视障用户的真实反馈：</p>
<blockquote>
<p>&quot;第一个版本我能清晰听到&#39;主菜单导航区域，列表包含两项...&#39;，第二个版本就像在讲&#39;分组区域，分组区域包含分组区域...&#39;&quot;</p>
</blockquote>
<h3 id="2-2-免费的键盘交互系统"><strong>2.2 免费的键盘交互系统</strong></h3><p>语义化元素天生支持以下特性：</p>
<ul>
<li>键盘聚焦（Tab键导航）</li>
<li>键盘事件响应（Enter/Space键触发）</li>
<li>焦点样式维护（<code>:focus</code>状态）</li>
</ul>
<p><strong>危险案例</strong>：自定义模态框的可访问灾难</p>
<pre><code class="hljs language-html"><span class="hljs-comment">&lt;!-- 错误实现 --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;modal&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;content&quot;</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;close&quot;</span>&gt;</span>X<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-comment">&lt;!-- 正确版本 --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">role</span>=<span class="hljs-string">&quot;dialog&quot;</span> <span class="hljs-attr">aria-labelledby</span>=<span class="hljs-string">&quot;modalTitle&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;content&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">h2</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;modalTitle&quot;</span>&gt;</span>提示信息<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">aria-label</span>=<span class="hljs-string">&quot;关闭&quot;</span>&gt;</span><span class="hljs-symbol">&amp;times;</span><span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre><h3 id="2-3-自动关联的数据纽带"><strong>2.3 自动关联的数据纽带</strong></h3><p>语义标签能建立隐式的关联关系：</p>
<p><strong>智能联动案例</strong>：</p>
<pre><code class="hljs language-html"><span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">for</span>=<span class="hljs-string">&quot;username&quot;</span>&gt;</span>用户名：<span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text&quot;</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;username&quot;</span>&gt;</span>

<span class="hljs-comment">&lt;!-- 错误示范 --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>用户名：<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;input&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre><p>测试对比结果：</p>
<table>
<thead>
<tr>
<th>方案</th>
<th>点击标签能否聚焦输入框</th>
<th>屏幕阅读器播报关联</th>
</tr>
</thead>
<tbody><tr>
<td>语义化版本</td>
<td>✔️</td>
<td>✔️</td>
</tr>
<tr>
<td>div版本</td>
<td>✖️</td>
<td>✖️</td>
</tr>
</tbody></table>
<hr>
<h2 id="三-语义化实战-让页面-开口说话">三、语义化实战：让页面“开口说话”</h2><h3 id="3-1-视觉隐藏却不影响朗读的技巧"><strong>3.1 视觉隐藏却不影响朗读的技巧</strong></h3><p>不要用<code>display:none</code>隐藏提示文字！试试：</p>
<pre><code class="hljs language-css"><span class="hljs-selector-class">.sr-only</span> {
  <span class="hljs-attribute">position</span>: absolute;
  <span class="hljs-attribute">width</span>: <span class="hljs-number">1px</span>;
  <span class="hljs-attribute">height</span>: <span class="hljs-number">1px</span>;
  <span class="hljs-attribute">padding</span>: <span class="hljs-number">0</span>;
  <span class="hljs-attribute">margin</span>: -<span class="hljs-number">1px</span>;
  <span class="hljs-attribute">overflow</span>: hidden;
  <span class="hljs-attribute">clip</span>: <span class="hljs-built_in">rect</span>(<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>);
  <span class="hljs-attribute">border</span>: <span class="hljs-number">0</span>;
}
</code></pre><h3 id="3-2-landmark地标构建页面结构"><strong>3.2 Landmark地标构建页面结构</strong></h3><p>正确的文档结构能让用户快速定位：</p>
<pre><code class="hljs language-html"><span class="hljs-tag">&lt;<span class="hljs-name">header</span> <span class="hljs-attr">role</span>=<span class="hljs-string">&quot;banner&quot;</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">header</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">nav</span> <span class="hljs-attr">role</span>=<span class="hljs-string">&quot;navigation&quot;</span> <span class="hljs-attr">aria-label</span>=<span class="hljs-string">&quot;主菜单&quot;</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">main</span> <span class="hljs-attr">role</span>=<span class="hljs-string">&quot;main&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">article</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">article</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">main</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">aside</span> <span class="hljs-attr">role</span>=<span class="hljs-string">&quot;complementary&quot;</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">aside</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">footer</span> <span class="hljs-attr">role</span>=<span class="hljs-string">&quot;contentinfo&quot;</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">footer</span>&gt;</span>
</code></pre><h3 id="3-3-动态内容的实时播报"><strong>3.3 动态内容的实时播报</strong></h3><p>使用<code>aria-live</code>区域实现“画外音”：</p>
<pre><code class="hljs language-html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">aria-live</span>=<span class="hljs-string">&quot;polite&quot;</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;liveMsg&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre><hr>
<h2 id="四-残酷真相-为什么程序员总在重复造轮子">四、残酷真相：为什么程序员总在重复造轮子？</h2><p>根据WebAIM对百万首页的分析：</p>
<ul>
<li>89.3%的按钮由<code>&lt;div&gt;</code>或<code>&lt;span&gt;</code>冒充</li>
<li>72%的表单没有正确关联<code>&lt;label&gt;</code></li>
<li>每增加一个层级<code>&lt;div&gt;</code>，可访问性评分下降5分</li>
</ul>
<p><strong>开发者普遍存在的三大迷思</strong>：</p>
<ol>
<li><strong>&quot;视觉效果优先&quot;</strong><br>设计师给出的PSD中没有屏幕阅读器标注</li>
<li><strong>&quot;反正用户不多&quot;</strong><br>误以为残障用户占比低，实际上：<ul>
<li>老龄化人口突破18%（中国60岁以上超2.6亿）</li>
<li>全球色盲用户超3亿</li>
<li>短期残障人士（如手臂骨折）常被忽视</li>
</ul>
</li>
<li><strong>&quot;有ARIA就够了&quot;</strong><br>事实上ARIA是胶带而非银弹：</li>
</ol>
<pre><code class="hljs language-html"><span class="hljs-comment">&lt;!-- 反面教材 --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">role</span>=<span class="hljs-string">&quot;button&quot;</span> <span class="hljs-attr">tabindex</span>=<span class="hljs-string">&quot;0&quot;</span>&gt;</span>保存<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-comment">&lt;!-- 需要手动处理键盘事件、焦点样式、状态管理 --&gt;</span>

<span class="hljs-comment">&lt;!-- 更优做法 --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">button</span>&gt;</span>保存<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
</code></pre><hr>
<h2 id="五-拯救计划-从今天开始的五项承诺">五、拯救计划：从今天开始的五项承诺</h2><h3 id="5-1-启用-quot-强制戒断div训练-quot"><strong>5.1 启用&quot;强制戒断DIV训练&quot;</strong></h3><p>安装ESLint规则：</p>
<pre><code class="hljs language-html">{
  &quot;rules&quot;: {
    &quot;vue/no-static-inline-styles&quot;: &quot;error&quot;,
    &quot;jsx-a11y/no-static-element-interactions&quot;: &quot;error&quot;,
    &quot;jsx-a11y/no-noninteractive-element-interactions&quot;: &quot;error&quot;
  }
}
</code></pre><h3 id="5-2-建立组件开发checklist"><strong>5.2 建立组件开发checklist</strong></h3><p>在PR模板中加入：</p>
<pre><code class="hljs language-html">- [ ] 可通过Tab键操作所有交互元素
- [ ] 所有图片有alt描述
- [ ] 表单域关联label
- [ ] 色觉敏感度通过检查
- [ ] 屏幕阅读器测试通过
</code></pre><h3 id="5-3-开展无障碍压力测试"><strong>5.3 开展无障碍压力测试</strong></h3><p><strong>黑暗体验法</strong>：<br>👉 拔掉鼠标只用键盘操作<br>👉 开启Chrome屏幕阅读器（F12 -&gt; More tools -&gt; Rendering -&gt; Emulate vision deficiencies）</p>
<p><strong>自动化检测工具</strong>：</p>
<pre><code class="hljs language-html"># 使用axe-core自动化扫描
npm install axe-core --save-dev
</code></pre><hr>
<h2 id="六-设计系统赋能-让-quot-善意的病毒-quot-扩散">六、设计系统赋能：让&quot;善意的病毒&quot;扩散</h2><p>观察Ant Design无障碍实践：</p>
<pre><code class="hljs language-html"><span class="hljs-tag">&lt;<span class="hljs-name">a-button</span>
  <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;primary&quot;</span>
  <span class="hljs-attr">aria-disabled</span>=<span class="hljs-string">&quot;false&quot;</span>
  <span class="hljs-attr">aria-label</span>=<span class="hljs-string">&quot;主要操作&quot;</span>
  <span class="hljs-attr">tabindex</span>=<span class="hljs-string">&quot;0&quot;</span>
&gt;</span>
  提交
<span class="hljs-tag">&lt;/<span class="hljs-name">a-button</span>&gt;</span>
</code></pre><p><strong>你可以立即采取的三大行动</strong>：</p>
<ol>
<li>在Button组件中自动添加<code>role=&quot;button&quot;</code></li>
<li>为Icon组件强制要求<code>aria-label</code>属性</li>
<li>在Form组件模板中自动生成相关labels</li>
</ol>
<hr>
<h2 id="七-意外的投资回报率-roi">七、意外的投资回报率（ROI）</h2><p>当某金融网站完成无障碍改造后：</p>
<ul>
<li>SEO流量提升40%（语义化天然的SEO友好）</li>
<li>老年用户注册转化率提高22%</li>
<li>客服咨询量下降17%</li>
<li>荣获政府数字无障碍认证</li>
</ul>
<blockquote>
<p>&quot;那些原本为了合规而做的改造，最终带来了远超预期的商业价值&quot;</p>
</blockquote>
<hr>
<h2 id="别让用户在我们的代码里-quot-装假肢-quot">别让用户在我们的代码里&quot;装假肢&quot;</h2><p>当我们选择<code>&lt;button&gt;</code>而不是<code>&lt;div class=&quot;btn&quot;&gt;</code>时，就是在为无数用户搭起数字世界的桥梁。你的代码不该是某些群体需要翻越的高墙，而应是通往美好体验的平坦大道。正如Web之父Tim Berners-Lee所说：</p>
<p><strong>“网络的力量在于其普适性。对每一个人的可访问性，无论残障与否，是最基本的。”</strong></p>
]]></content:encoded>
      <pubDate>Mon, 21 Apr 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/web-yuyihuasheji</guid>
    </item>
    <item>
      <title><![CDATA[WebAssembly 在游戏前端开发中的应用案例]]></title>
      <link>https://moya.plus/article/web-webAssembly-game</link>
      <description><![CDATA[WebAssembly。这项技术凭借其独特的优势，正在悄然改变游戏开发的格局，让玩家的游戏体验实现质的飞跃。接下来，就让我们一起深入了解它的神奇之处。]]></description>
      <content:encoded><![CDATA[<p>这篇文章介绍一个在游戏前端开发领域堪称 “秘密武器” 的技术 ——WebAssembly。这项技术凭借其独特的优势，正在悄然改变游戏开发的格局，让玩家的游戏体验实现质的飞跃。接下来，就让我们一起深入了解它的神奇之处。</p>
<h2 id="一-webassembly-是什么">一、WebAssembly 是什么</h2><p>简单来讲，WebAssembly 是一种专门为现代 Web 浏览器量身定制的二进制指令格式，旨在确保代码能够安全、快速且高效地运行。以往，我们主要依赖 JavaScript 进行浏览器端的开发，但 WebAssembly 的出现打破了这一局限。现在，开发者可以使用 C、C++、Rust 等多种编程语言编写代码，然后将其编译成能在浏览器中直接运行的二进制格式。这就好比给浏览器安装了一个强力 “插件”，使其能够轻松驾驭那些原本复杂的应用程序，像游戏引擎、专业的图像处理软件等，都不在话下。这一变革为开发者开辟了全新的创作空间，带来了前所未有的开发体验。</p>
<h2 id="二-webassembly-在游戏开发中的优势">二、WebAssembly 在游戏开发中的优势</h2><ol>
<li><strong>接近原生的卓越性能</strong>：大家在玩网页游戏时，想必都曾被卡顿问题困扰。WebAssembly 的诞生，彻底解决了这一痛点。它能让游戏的运行速度无限接近原生应用，游戏画面流畅顺滑，玩家再也不用担心在关键时刻出现掉帧、卡顿的情况，游戏体验直线上升。无论是将大型 3A 游戏移植到网页端，还是开发复杂的 2D 游戏，WebAssembly 都能显著提升游戏性能，让游戏更加稳定、流畅。</li>
<li><strong>多语言支持，释放开发潜能</strong>：对于开发者而言，WebAssembly 带来的多语言支持是一大福音。从此，我们不再局限于 JavaScript 这一种编程语言。C++、Rust 等语言凭借其出色的性能和强大的安全性，为开发者提供了更多的选择。以 Rust 为例，它的内存安全机制和高性能特性，能够帮助开发者构建更加稳定、高效的游戏逻辑，减少代码中的潜在错误，让开发过程更加顺畅。</li>
<li><strong>跨平台性，一次编写，处处畅玩</strong>：“一次编写，到处运行”，WebAssembly 让这一梦想照进现实。通过 WebAssembly 编译的游戏代码，能够在各种支持它的浏览器上完美运行，无论是桌面端的 Chrome、Firefox，还是移动端的浏览器，都能为玩家提供一致的游戏体验。这大大降低了跨平台开发的成本和难度，让游戏能够触达更广泛的用户群体，无疑是开发者的 “得力助手”。</li>
</ol>
<h2 id="三-webassembly-在游戏开发中的应用场景">三、WebAssembly 在游戏开发中的应用场景</h2><ol>
<li><strong>大型 3A 游戏的网页化变革</strong>：随着 Web 技术的飞速发展，将原本只能在 PC 或主机上运行的大型 3A 游戏移植到网页端已成为现实。借助 WebAssembly，开发者可以使用 C++ 编写游戏的核心逻辑，然后将其编译成 WebAssembly 格式。玩家只需通过浏览器，就能尽情畅玩 3A 大作，无需再下载体积庞大的游戏客户端，真正实现了便捷游戏、随时畅玩。</li>
<li><strong>2D 小游戏开发的新宠儿</strong>：在轻量级 2D 小游戏开发领域，WebAssembly 同样表现出色。以贪吃蛇、俄罗斯方块等经典小游戏为例，使用 WebAssembly 结合 HTML5 的 Canvas API 进行开发，不仅能够实现快速加载，还能保证游戏运行的流畅性。这些小游戏还能轻松集成到各种网页应用中，为网页增添更多的趣味性和互动性，让用户在浏览网页的同时，能够随时享受小游戏带来的乐趣。</li>
<li><strong>游戏引擎开发的新助力</strong>：如今，Unity、Unreal Engine 等众多知名游戏引擎纷纷开始支持 WebAssembly。开发者可以利用这些引擎进行游戏开发，然后将游戏编译成 WebAssembly 格式发布到网页上。这不仅简化了游戏开发流程，还拓宽了游戏的分发渠道，让游戏能够被更多的玩家所发现和喜爱。</li>
</ol>
<h2 id="四-webassembly-在游戏开发中的应用示例">四、WebAssembly 在游戏开发中的应用示例</h2><h3 id="一-用-rust-和-webassembly-打造-2048-游戏">（一）用 Rust 和 WebAssembly 打造 2048 游戏</h3><ol>
<li><strong>项目介绍</strong>：“2048 WebAssembly” 是经典数字拼图游戏 2048 的现代化升级版本。该项目采用 Rust 语言进行编写，并结合前端框架 Yew，将代码编译成 WebAssembly 模块。在浏览器中运行时，它不仅性能卓越，还能实现底层控制，为玩家带来更加流畅和个性化的游戏体验。</li>
<li><strong>技术分析</strong>：<ul>
<li><strong>Rust</strong>：Rust 以其出色的内存安全性和高性能而闻名，为游戏逻辑提供了坚实可靠的基础。其静态类型和所有权系统使得代码易于维护和调试，大大提高了开发效率，就像有一位专业的代码卫士时刻守护着开发过程。</li>
<li><strong>Yew</strong>：Yew 是一个类似于 React 的 JavaScript 库，它允许开发者使用 Rust 编写高效的前端应用。Yew 与 WebAssembly 的完美结合，让开发者在浏览器环境中也能享受到接近原生应用的开发体验，为前端开发带来了新的思路和方法。</li>
<li><strong>WebAssembly (WASM)</strong>：作为二进制指令格式，WebAssembly 能够让 Rust 代码被浏览器准确理解并执行。这一过程极大地提升了 2048 游戏在网页上的运行速度，有效减少了延迟，让玩家能够更加流畅地享受游戏的乐趣。</li>
</ul>
</li>
<li><strong>应用场景</strong>：<ul>
<li><strong>教学示例</strong>：对于正在学习 Rust、Web 开发或 WebAssembly 的开发者来说，“2048 WebAssembly” 是一个绝佳的实践项目。通过参与这个项目，开发者可以直观地了解后端语言如何与前端开发相结合，加深对相关技术的理解和掌握。</li>
<li><strong>游戏平台</strong>：该游戏可以轻松嵌入到任何网站中，为用户提供轻量级的游戏体验，有效增加网站的互动性和吸引力。无论是个人博客、企业网站还是电商平台，都可以通过集成这款小游戏，提升用户的停留时间和参与度。</li>
<li><strong>实验性项目</strong>：对于那些勇于探索现代 Web 技术边界的开发者来说，特别是对 WASM 集成感兴趣的人群，“2048 WebAssembly” 是一个极具价值的实验性项目。通过对该项目的研究和实践，可以深入了解 WebAssembly 在实际应用中的潜力和挑战。</li>
</ul>
</li>
</ol>
<h3 id="二-使用-wasm-4-开发乒乓游戏">（二）使用 wasm - 4 开发乒乓游戏</h3><ol>
<li><strong>项目介绍</strong>：wasm - 4 是一款基于 WebAssembly 实现的底层虚拟游戏机，主要用于构建小型复古游戏。接下来，我们以一款支持多人游玩的乒乓游戏为例，详细介绍如何利用 wasm - 4 开发小型游戏。</li>
<li><strong>环境配置</strong>：<ul>
<li>wasm - 4 runtime 可以通过 npm 轻松安装，为开发提供了便捷的环境搭建方式。</li>
<li>新建一个 moonbit 项目，并将 wasm4 binding 作为依赖添加到项目中，确保项目能够顺利调用 wasm - 4 的相关功能。</li>
<li>修改 moon.pkg.json 文件，在 linking 配置中导出 start 和 update 方法，以供 wasm - 4 调用。需要注意的是，对于 wasm 后端，在 0x0000~0x19be（6590，开区间）范围内的地址是分配给 wasm4 abi 的，而 moonbit 的堆在该区间之后。如果使用 wasm - gc 后端，则无需进行此项配置。根据 abi 的规范要求，必须导出 start 和 update 方法。其中，start 方法仅在游戏初始化时执行一次，负责完成一些静态初始化工作，如初始化调色板等；update 方法则会以游戏刷新率（60hz）的频率持续执行，用于处理游戏中的动态逻辑，如玩家操作、游戏状态更新等。在 moonbit 中，通过将函数的可见性修改为 pub，即可实现方法的导出功能。</li>
</ul>
</li>
<li><strong>游戏开发步骤</strong>：<ul>
<li><strong>绘制乒乓球</strong>：使用 oval 函数在指定的中心位置 (ball_x,ball_y) 处绘制椭圆。当椭圆的长轴和短轴相等时，便成功绘制出了一个直径为 (ball_size) 的圆，也就是我们游戏中的乒乓球。</li>
<li><strong>为元素上色</strong>：wasm - 4 的调色板寄存器（palette，在 moonbit 的绑定中对用户不可见）一次只能存储 4 种颜色，但可以通过特定的操作随时更改，以引入新的颜色。在本项目中，我们使用 set_palette 函数来配置调色板，这里采用默认颜色配置。需要注意的是，内置绘图函数并不直接访问 palette 寄存器，而是访问同样能够存储 4 个颜色的 draw_colors 寄存器（同样对用户不可见）。这两个寄存器的关键区别在于，draw_colors 寄存器中的 4 个颜色具有不同的用途。对于内置的 oval 和 rectangle 形状绘制，第一个颜色用于填充图形内部，第二个颜色则用于绘制图形的边框。</li>
<li><strong>处理撞击情况</strong>：在 wasm - 4 的坐标系中，原点位于左上角，纵轴方向向下。乒乓球的撞击情况主要分为三种：未发生撞击时记为 0；当与左侧挡板撞击时，乒乓球会弹向右侧，记为 1；当与右侧挡板撞击时，乒乓球会弹向左侧，记为 - 1。我们将左右侧挡板分别记为 y_1 和 y_2（挡板在游戏中只能进行上下移动）。在编写处理撞击的函数时，需要确保该函数能够准确返回球撞击后的方向（或 0），即 0、1 或 - 1。</li>
<li><strong>移动挡板</strong>：移动挡板的操作实际上就是更新 y_1 和 y_2 的值。在 wasm - 4 中，用户输入通过 gamepads 获取。一个 gamepad 包含 4 个方向键和两个动作键，总共支持 4 个 gamepads，这意味着最多可以支持 4 名玩家同时游玩。默认情况下，gamepad1 最先被使用。在 moonbit 中，我们使用特定的方法来访问 gamepad，当按键按下时返回 true，否则返回 false。通过这种方式，我们可以根据玩家的按键操作来实时更新挡板的位置。</li>
<li><strong>多人游戏功能</strong>：wasm - 4 的多人游戏功能底层采用 webrtc 技术实现，这使得开发者无需自行处理复杂的网络栈问题。玩家在游戏中通过对应的 gamepads 进行标识，当有新玩家加入时，游戏会按照 gamepads 的数字顺序为其分配对应的控制设备。例如，当 gamepad1 已被占用时，后续加入的玩家将被分配 gamepad2。在这款乒乓游戏中，我们将 gamepad1 绑定到右侧挡板，gamepad2 绑定到左侧挡板。默认情况下，左侧挡板的位置会根据乒乓球的上下位置自动调整，就像一个智能的 AI 对手，始终与玩家保持竞争态势。同时，我们还可以通过内置的方法来确认多人游戏功能是否启用。如果启用，则允许玩家使用 gamepad2 进行操作；否则，左侧挡板将由 AI 完全控制。</li>
<li><strong>音效反馈</strong>：wasm - 4 内置了具有怀旧风格的八位机游戏音效（tone）。播放一个 tone 时，通常需要使用内置的 frequency（频率，用于度量音调的高低）、duration（时长，由 envelope 记录，envelope 用于记录声音随时间的变化，这里的 adsr 指定了 envelope 的四个参数：attack、decay、sustain 和 release，分别表示声音的起始、衰减、持续和释放阶段）、volume（音量大小）和 flags（包括 channel、dutycycle 和 panning，对于本乒乓游戏，我们采用默认值即可）。例如，在乒乓球发生撞击时，我们可以通过判断 paddle_collision 返回值是否非零来决定是否播放音效；当球撞击屏幕顶部或底部时，球会回弹并同时触发相应的音效反馈，为玩家带来更加真实和沉浸式的游戏体验。</li>
</ul>
</li>
</ol>
<h3 id="三-将-pygame-开发的游戏变成-web-可玩">（三）将 Pygame 开发的游戏变成 Web 可玩</h3><ol>
<li><strong>项目介绍</strong>：本项目以使用 python 和 pygame 库开发的简单贪吃蛇游戏为例，展示如何运用 WebAssembly 将 python 游戏成功转换为基于 Web 的应用程序，让传统的单机游戏能够在网页上焕发出新的活力。</li>
<li><strong>实现步骤</strong>：<ul>
<li>首先，安装 pygbag 模块，该模块是实现将 python 代码编译为 WebAssembly 字节码的关键工具。</li>
<li>对现有的 python 代码进行适当的修改，使其能够更好地适应 WebAssembly 的运行环境和要求。</li>
<li>运行 pygbag 命令，将修改后的 python 代码编译为 WebAssembly 字节码，完成游戏从传统格式到 Web 格式的转换。</li>
<li>转换完成后，打开 web 浏览器，访问localhost:8000，即可对游戏进行测试。此外，还可以将 build/web 文件夹中的文件上传到自己的 web 服务器，或者使用专业的托管服务，实现在线共享游戏，让更多的玩家能够体验到这款游戏的乐趣。</li>
</ul>
</li>
</ol>
<h2 id="五-总结">五、总结</h2><p>WebAssembly 在游戏前端开发中的应用，为整个游戏行业带来了全新的机遇和广阔的发展方向。它不仅显著提升了游戏的性能和玩家的体验，还极大地拓展了开发语言的选择范围和游戏的分发渠道。随着技术的不断发展和完善，WebAssembly 在游戏开发领域必将发挥更加重要的作用，为玩家带来更多精彩纷呈的游戏作品。无论是大型 3A 游戏的网页化进程，还是小型休闲游戏的创新开发，WebAssembly 都展现出了巨大的潜力，值得广大开发者深入研究和积极应用。</p>
<p>今天的分享就到这里啦！希望通过这篇文章，大家对 WebAssembly 在游戏前端开发中的应用有了更全面、更深入的了解。如果你在相关领域有独特的开发经验或有趣的想法，欢迎在评论区留言分享，让我们一起交流探讨，共同进步！</p>
]]></content:encoded>
      <pubDate>Sun, 20 Apr 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/web-webAssembly-game</guid>
    </item>
    <item>
      <title><![CDATA[WebRTC 实现视频通话的前端开发步骤]]></title>
      <link>https://moya.plus/article/web-webrtc</link>
      <description><![CDATA[深入掌握 WebRTC 实现视频通话的开发流程，能够为用户打造出更加丰富多元、即时高效的互动体验。]]></description>
      <content:encoded><![CDATA[<p>你好，我是木亦。我不知道你是否了解过 WebRTC（Web Real - Time Communication），但不得不承认，WebRTC 凭借其无需安装插件、支持浏览器间直接通信的显著优势，已成为实现网页端视频通话的不二之选。对于前端开发者而言，深入掌握 WebRTC 实现视频通话的开发流程，能够为用户打造出更加丰富多元、即时高效的互动体验。这篇文章将会向你介绍使用 WebRTC 实现视频通话的开发步骤。</p>
<h2 id="一-项目初始化">一、项目初始化</h2><p>在开启开发之旅前，首要任务是创建一个全新的前端项目。你可以借助常见的项目初始化工具，像create-react-app（适用于 React 项目）、vue-cli（适用于 Vue 项目），或者直接创建一个简洁的 HTML 页面。</p>
<h3 id="使用-create-react-app-初始化项目">使用 create-react-app 初始化项目</h3><pre><code class="hljs language-bash">npx create-react-app webrtc-video-call
<span class="hljs-built_in">cd</span> webrtc-video-call
</code></pre><h3 id="使用-vue-cli-初始化项目">使用 vue-cli 初始化项目</h3><pre><code class="hljs language-bash">npm install - g @vue/cli
vue create webrtc-video-call
<span class="hljs-built_in">cd</span> webrtc-video-call
</code></pre><p>如果选择直接创建 HTML 页面，其基本结构如下：</p>
<pre><code class="hljs language-html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">&quot;en&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">&quot;UTF - 8&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>WebRTC Video Call<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-comment">&lt;!-- 后续添加视频通话相关元素 --&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre><h2 id="二-引入-webrtc-库">二、引入 WebRTC 库</h2><p>WebRTC 作为现代浏览器的内置功能，无需额外引入第三方库。在编写 JavaScript 代码时，可直接调用 WebRTC 提供的 API。</p>
<h3 id="检测浏览器支持">检测浏览器支持</h3><pre><code class="hljs language-javascript"><span class="hljs-keyword">if</span> (<span class="hljs-string">&#x27;RTCPeerConnection&#x27;</span> <span class="hljs-keyword">in</span> <span class="hljs-variable language_">window</span> &amp;&amp; <span class="hljs-string">&#x27;RTCSessionDescription&#x27;</span> <span class="hljs-keyword">in</span> <span class="hljs-variable language_">window</span> &amp;&amp; <span class="hljs-string">&#x27;navigator.mediaDevices&#x27;</span> <span class="hljs-keyword">in</span> <span class="hljs-variable language_">window</span>) {
  <span class="hljs-comment">// 浏览器支持WebRTC</span>
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&#x27;WebRTC is supported&#x27;</span>);
} <span class="hljs-keyword">else</span> {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&#x27;WebRTC is not supported in this browser&#x27;</span>);
}
</code></pre><p>通过上述代码，可快速判断当前浏览器是否支持 WebRTC，确保开发工作在兼容的环境下进行。</p>
<h2 id="三-获取媒体设备权限">三、获取媒体设备权限</h2><p>实现视频通话的第一步，是获取用户摄像头和麦克风的使用权限。</p>
<h3 id="使用-navigator-mediadevices-getusermedia">使用 navigator.mediaDevices.getUserMedia ()</h3><pre><code class="hljs language-javascript"><span class="hljs-keyword">const</span> constraints = {
  <span class="hljs-attr">video</span>: <span class="hljs-literal">true</span>,
  <span class="hljs-attr">audio</span>: <span class="hljs-literal">true</span>
};
navigator.<span class="hljs-property">mediaDevices</span>.<span class="hljs-title function_">getUserMedia</span>(constraints)
  .<span class="hljs-title function_">then</span>(<span class="hljs-function">(<span class="hljs-params">stream</span>) =&gt;</span> {
    <span class="hljs-comment">// 成功获取媒体流，可用于视频显示</span>
    <span class="hljs-keyword">const</span> videoElement = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">&#x27;video&#x27;</span>);
    videoElement.<span class="hljs-property">srcObject</span> = stream;
    videoElement.<span class="hljs-property">autoplay</span> = <span class="hljs-literal">true</span>;
    <span class="hljs-variable language_">document</span>.<span class="hljs-property">body</span>.<span class="hljs-title function_">appendChild</span>(videoElement);
  })
  .<span class="hljs-title function_">catch</span>(<span class="hljs-function">(<span class="hljs-params">error</span>) =&gt;</span> {
    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">error</span>(<span class="hljs-string">&#x27;Error accessing media devices:&#x27;</span>, error);
  });
</code></pre><p>在这段代码中，constraints对象明确指定了需要获取视频和音频权限。getUserMedia()方法返回一个 Promise，当操作成功时，会返回包含媒体流的stream对象，随后便可将其绑定到video元素上，实现本地视频的实时显示。</p>
<h2 id="四-建立对等连接">四、建立对等连接</h2><p>WebRTC 通过 RTCPeerConnection 对象建立对等连接，实现双方媒体数据的高效传输。</p>
<h3 id="创建-rtcpeerconnection-对象">创建 RTCPeerConnection 对象</h3><pre><code class="hljs language-javascript"><span class="hljs-comment">// 创建RTCPeerConnection对象</span>
<span class="hljs-keyword">const</span> peerConnection = <span class="hljs-keyword">new</span> <span class="hljs-title class_">RTCPeerConnection</span>({
  <span class="hljs-attr">iceServers</span>: [
    { <span class="hljs-attr">urls</span>:<span class="hljs-string">&#x27;stun:stun.l.google.com:19302&#x27;</span> }
  ]
});
</code></pre><p>这里借助了 STUN（Session Traversal Utilities for NAT）服务器辅助建立连接，<a href="http://stun.l.google.com:19302" rel="noopener noreferrer">stun.l.google.com:19302</a>是 Google 提供的公共 STUN 服务器，能有效帮助穿越网络地址转换（NAT）设备。</p>
<h3 id="处理-ice-候选">处理 ICE 候选</h3><p>在连接建立过程中，处理 ICE（Interactive Connectivity Establishment）候选至关重要，这有助于寻找到最佳的连接路径。</p>
<pre><code class="hljs language-javascript">peerConnection.<span class="hljs-property">onicecandidate</span> = <span class="hljs-function">(<span class="hljs-params">event</span>) =&gt;</span> {
  <span class="hljs-keyword">if</span> (event.<span class="hljs-property">candidate</span>) {
    <span class="hljs-comment">// 将ICE候选发送给对方</span>
    <span class="hljs-comment">// 这里需要实现发送逻辑，例如通过信令服务器</span>
    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&#x27;ICE candidate:&#x27;</span>, event.<span class="hljs-property">candidate</span>);
  }
};
</code></pre><p>当有 ICE 候选生成时，需及时将其发送给对方，实际应用中通常借助信令服务器完成这一操作。</p>
<h3 id="交换-sdp-session-description-protocol">交换 SDP（Session Description Protocol）</h3><p>SDP 用于详细描述媒体会话的各项参数，双方需交换 SDP 以协商媒体格式、编解码方式等关键信息。</p>
<pre><code class="hljs language-javascript"><span class="hljs-comment">// 创建Offer</span>
peerConnection.<span class="hljs-title function_">createOffer</span>()
  .<span class="hljs-title function_">then</span>(<span class="hljs-function">(<span class="hljs-params">offer</span>) =&gt;</span> {
    <span class="hljs-keyword">return</span> peerConnection.<span class="hljs-title function_">setLocalDescription</span>(offer);
  })
  .<span class="hljs-title function_">then</span>(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-comment">// 将本地的SDP发送给对方</span>
    <span class="hljs-comment">// 这里需要实现发送逻辑，例如通过信令服务器</span>
    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&#x27;Local SDP:&#x27;</span>, peerConnection.<span class="hljs-property">localDescription</span>);
  })
  .<span class="hljs-title function_">catch</span>(<span class="hljs-function">(<span class="hljs-params">error</span>) =&gt;</span> {
    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">error</span>(<span class="hljs-string">&#x27;Error creating offer:&#x27;</span>, error);
  });
<span class="hljs-comment">// 接收对方的SDP并设置为远程描述</span>
peerConnection.<span class="hljs-title function_">setRemoteDescription</span>(<span class="hljs-keyword">new</span> <span class="hljs-title class_">RTCSessionDescription</span>(receivedSDP))
  .<span class="hljs-title function_">then</span>(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-comment">// 接收对方的Offer后，创建Answer</span>
    <span class="hljs-keyword">return</span> peerConnection.<span class="hljs-title function_">createAnswer</span>();
  })
  .<span class="hljs-title function_">then</span>(<span class="hljs-function">(<span class="hljs-params">answer</span>) =&gt;</span> {
    <span class="hljs-keyword">return</span> peerConnection.<span class="hljs-title function_">setLocalDescription</span>(answer);
  })
  .<span class="hljs-title function_">then</span>(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-comment">// 将本地的Answer发送给对方</span>
    <span class="hljs-comment">// 这里需要实现发送逻辑，例如通过信令服务器</span>
    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&#x27;Local SDP (Answer):&#x27;</span>, peerConnection.<span class="hljs-property">localDescription</span>);
  })
  
  .<span class="hljs-title function_">catch</span>(<span class="hljs-function">(<span class="hljs-params">error</span>) =&gt;</span> {
    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">error</span>(<span class="hljs-string">&#x27;Error setting remote description or creating answer:&#x27;</span>, error);
  });
</code></pre><p>这部分代码展示了创建 Offer、设置本地描述、发送本地 SDP，以及接收对方 SDP 并创建 Answer、设置本地描述、发送本地 Answer 的完整流程。</p>
<h2 id="五-显示远程视频">五、显示远程视频</h2><p>当双方成功建立连接并完成 SDP 交换后，便可接收对方的媒体流，实现远程视频的显示。</p>
<h3 id="监听-track-事件">监听 track 事件</h3><pre><code class="hljs language-javascript">peerConnection.<span class="hljs-property">ontrack</span> = <span class="hljs-function">(<span class="hljs-params">event</span>) =&gt;</span> {
  <span class="hljs-keyword">const</span> remoteVideoElement = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">&#x27;video&#x27;</span>);
  remoteVideoElement.<span class="hljs-property">srcObject</span> = event.<span class="hljs-property">streams</span>[<span class="hljs-number">0</span>];
  remoteVideoElement.<span class="hljs-property">autoplay</span> = <span class="hljs-literal">true</span>;
  <span class="hljs-variable language_">document</span>.<span class="hljs-property">body</span>.<span class="hljs-title function_">appendChild</span>(remoteVideoElement);
};
</code></pre><p>一旦接收到对方的媒体流，ontrack事件就会被触发，此时将接收到的媒体流绑定到新创建的video元素上，即可实时显示远程视频画面。</p>
<h2 id="六-信令服务器的作用与实现">六、信令服务器的作用与实现</h2><p>在 WebRTC 视频通话中，信令服务器承担着交换 SDP 和 ICE 候选等关键信息的重要职责。尽管 WebRTC 实现了媒体数据的直接传输，但信令的交互仍需借助服务器来完成。</p>
<h3 id="信令服务器的选择">信令服务器的选择</h3><p>可选用 WebSocket、Socket.IO 等技术搭建信令服务器。以 Socket.IO 为例，搭建一个简易信令服务器的步骤如下：</p>
<pre><code class="hljs language-bash">npm install socket.io
</code></pre><h3 id="简单的-socket-io-信令服务器示例">简单的 <a href="http://Socket.IO" rel="noopener noreferrer">Socket.IO</a> 信令服务器示例</h3><pre><code class="hljs language-javascript"><span class="hljs-keyword">const</span> io = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;socket.io&#x27;</span>)(<span class="hljs-number">3000</span>);
io.<span class="hljs-title function_">on</span>(<span class="hljs-string">&#x27;connection&#x27;</span>, <span class="hljs-function">(<span class="hljs-params">socket</span>) =&gt;</span> {
  socket.<span class="hljs-title function_">on</span>(<span class="hljs-string">&#x27;offer&#x27;</span>, <span class="hljs-function">(<span class="hljs-params">offer</span>) =&gt;</span> {
    <span class="hljs-comment">// 这里可以实现将offer转发给目标客户端</span>
    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&#x27;Received offer:&#x27;</span>, offer);
  });
  socket.<span class="hljs-title function_">on</span>(<span class="hljs-string">&#x27;answer&#x27;</span>, <span class="hljs-function">(<span class="hljs-params">answer</span>) =&gt;</span> {
    <span class="hljs-comment">// 这里可以实现将answer转发给目标客户端</span>
    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&#x27;Received answer:&#x27;</span>, answer);
  });
  socket.<span class="hljs-title function_">on</span>(<span class="hljs-string">&#x27;ice - candidate&#x27;</span>, <span class="hljs-function">(<span class="hljs-params">candidate</span>) =&gt;</span> {
    <span class="hljs-comment">// 这里可以实现将ice - candidate转发给目标客户端</span>
    <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&#x27;Received ice - candidate:&#x27;</span>, candidate);
  });
});
</code></pre><p>在前端代码中，需引入 Socket.IO 客户端库，并精心编写与服务器的通信逻辑，实现将 SDP 和 ICE 候选发送至服务器，以及从服务器接收对方的 SDP 和 ICE 候选。</p>
<p>WebRTC 实现视频通话的前端开发涵盖多个关键环节，从项目初始化、获取媒体设备权限，到建立对等连接、交换 SDP 和 ICE 候选，再到显示远程视频和搭建信令服务器。通过逐步掌握这些核心步骤，前端开发者能够构建出功能完备的视频通话应用，为用户提供流畅、实时的视频通信体验。在实际开发过程中，还需依据具体需求和应用场景，对代码进行优化与扩展，以充分满足多样化的业务需求。</p>
]]></content:encoded>
      <pubDate>Tue, 22 Apr 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/web-webrtc</guid>
    </item>
    <item>
      <title><![CDATA[Webpack 代码拆分与懒加载的高级配置]]></title>
      <link>https://moya.plus/article/webpack-split-code</link>
      <description><![CDATA[合理运用代码拆分与懒加载技术，能够显著减少应用的初始加载代码量，大幅提升页面加载速度，为用户带来更加丝滑流畅的使用体验。]]></description>
      <content:encoded><![CDATA[<p>搭建大型 Web 应用的时候，你一定想过，如何才能高效地优化代码加载与执行效率，而 Webpack 作为一款功能强大的模块打包工具，其具备的代码拆分与懒加载功能，已经成为了提升 Web 应用性能的核心手段。合理运用代码拆分与懒加载技术，能够显著减少应用的初始加载代码量，大幅提升页面加载速度，为用户带来更加丝滑流畅的使用体验。</p>
<p>这篇文章将向你介绍 Webpack 代码拆分与懒加载的高级配置技巧。</p>
<h2 id="一-代码拆分与懒加载基础回顾">一、代码拆分与懒加载基础回顾</h2><p>在深入探讨高级配置前，我们先来简单回顾一下代码拆分与懒加载的基础概念。所谓代码拆分，就是把一个庞大的 JavaScript 文件切割成多个小型文件，等到实际需要时再进行加载。而懒加载则是一种延迟加载机制，只有当用户真正需要某个模块时，系统才会去加载它，而不是在页面加载之初就一股脑儿全部加载完毕。</p>
<p>在 Webpack 中，实现代码拆分与懒加载最常用的方式是借助splitChunks插件和动态导入语法。splitChunks插件能够将公共代码抽离出来，单独打包成一个文件，从而有效避免公共代码的重复加载。例如：</p>
<pre><code class="hljs language-javascript"><span class="hljs-variable language_">module</span>.<span class="hljs-property">exports</span> = {
  <span class="hljs-comment">//...其他配置</span>
  <span class="hljs-attr">optimization</span>: {
    <span class="hljs-attr">splitChunks</span>: {
      <span class="hljs-attr">chunks</span>: <span class="hljs-string">&#x27;all&#x27;</span>
    }
  }
};
</code></pre><p>这段配置会将所有模块中的公共代码提取出来，生成一个独立的 chunk 文件，这样在后续的加载过程中，相同的公共代码只需加载一次，大大节省了加载时间和带宽资源。</p>
<p>动态导入语法则为我们在代码中实现动态加载模块提供了便利，进而达成懒加载的效果。例如：</p>
<pre><code class="hljs language-javascript"><span class="hljs-comment">// 动态导入lodash模块</span>
<span class="hljs-keyword">import</span>(<span class="hljs-string">&#x27;./lodash.js&#x27;</span>).<span class="hljs-title function_">then</span>(<span class="hljs-function">(<span class="hljs-params">{ <span class="hljs-keyword">default</span>: _ }</span>) =&gt;</span> {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(_.<span class="hljs-title function_">join</span>([<span class="hljs-string">&#x27;Hello&#x27;</span>, <span class="hljs-string">&#x27;Webpack&#x27;</span>], <span class="hljs-string">&#x27;-&#x27;</span>));
});
</code></pre><p>当程序执行到import(&#39;./lodash.js&#39;)时，Webpack 会自动将lodash.js单独打包，并在需要的时刻进行加载，这种按需加载的方式有效减少了初始加载的负担。</p>
<h2 id="二-多入口应用的代码拆分高级配置">二、多入口应用的代码拆分高级配置</h2><p>在多入口应用场景中，为了确保每个入口的代码都能得到合理的拆分与加载，我们需要进行更为精细的控制。</p>
<h3 id="一-根据入口点拆分">（一）根据入口点拆分</h3><p>借助splitChunks的cacheGroups选项，我们可以依据入口点来进行代码拆分。假设我们有两个入口app1和app2，想要分别提取它们各自的公共代码，配置如下：</p>
<pre><code class="hljs language-javascript"><span class="hljs-variable language_">module</span>.<span class="hljs-property">exports</span> = {
  <span class="hljs-attr">entry</span>: {
    <span class="hljs-attr">app1</span>: <span class="hljs-string">&#x27;./src/app1.js&#x27;</span>,
    <span class="hljs-attr">app2</span>: <span class="hljs-string">&#x27;./src/app2.js&#x27;</span>
  },
  <span class="hljs-attr">optimization</span>: {
    <span class="hljs-attr">splitChunks</span>: {
      <span class="hljs-attr">cacheGroups</span>: {
        <span class="hljs-attr">app1Vendor</span>: {
          <span class="hljs-attr">test</span>: <span class="hljs-regexp">/[\\/]node_modules[\\/]/</span>,
          <span class="hljs-attr">name</span>:<span class="hljs-string">&#x27;vendors - app1&#x27;</span>,
          <span class="hljs-attr">chunks</span>: <span class="hljs-function">(<span class="hljs-params">chunk</span>) =&gt;</span> chunk.<span class="hljs-property">name</span> === <span class="hljs-string">&#x27;app1&#x27;</span>
        },
        <span class="hljs-attr">app2Vendor</span>: {
          <span class="hljs-attr">test</span>: <span class="hljs-regexp">/[\\/]node_modules[\\/]/</span>,
          <span class="hljs-attr">name</span>:<span class="hljs-string">&#x27;vendors - app2&#x27;</span>,
          <span class="hljs-attr">chunks</span>: <span class="hljs-function">(<span class="hljs-params">chunk</span>) =&gt;</span> chunk.<span class="hljs-property">name</span> === <span class="hljs-string">&#x27;app2&#x27;</span>
        }
      }
    }
  }
};
</code></pre><p>通过这样的配置，app1和app2的第三方依赖会分别被提取到vendors - app1.js和vendors - app2.js文件中，有效避免了不同入口之间公共代码的重复加载，提高了代码的加载效率。</p>
<h3 id="二-公共代码提取">（二）公共代码提取</h3><p>除了按入口点拆分代码，我们还可以将所有入口的公共代码统一提取到一个单独的文件中。只需在cacheGroups中添加一个公共组即可实现：</p>
<pre><code class="hljs language-javascript"><span class="hljs-variable language_">module</span>.<span class="hljs-property">exports</span> = {
  <span class="hljs-comment">//...其他配置</span>
  <span class="hljs-attr">optimization</span>: {
    <span class="hljs-attr">splitChunks</span>: {
      <span class="hljs-attr">cacheGroups</span>: {
        <span class="hljs-attr">commons</span>: {
          <span class="hljs-attr">name</span>: <span class="hljs-string">&#x27;commons&#x27;</span>,
          <span class="hljs-attr">chunks</span>: <span class="hljs-string">&#x27;initial&#x27;</span>,
          <span class="hljs-attr">minChunks</span>: <span class="hljs-number">2</span>
        }
      }
    }
  }
};
</code></pre><p>这段配置会将所有入口中被至少两个入口引用的模块提取到commons.js文件中，进一步减少了代码的冗余，提升了整体的加载性能。</p>
<h2 id="三-懒加载的高级优化">三、懒加载的高级优化</h2><h3 id="一-动态导入语法优化">（一）动态导入语法优化</h3><p>在使用动态导入时，我们可以借助 Webpack 的魔法注释来进一步优化懒加载的行为。比如，给动态导入的模块添加预加载提示：</p>
<pre><code class="hljs language-javascript"><span class="hljs-comment">// 预加载lodash模块</span>
<span class="hljs-keyword">import</span>(<span class="hljs-comment">/* webpackPreload: true */</span> <span class="hljs-string">&#x27;./lodash.js&#x27;</span>).<span class="hljs-title function_">then</span>(<span class="hljs-function">(<span class="hljs-params">{ <span class="hljs-keyword">default</span>: _ }</span>) =&gt;</span> {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(_.<span class="hljs-title function_">join</span>([<span class="hljs-string">&#x27;Hello&#x27;</span>, <span class="hljs-string">&#x27;Webpack&#x27;</span>], <span class="hljs-string">&#x27;-&#x27;</span>));
});
</code></pre><p>webpackPreload: true这个魔法注释会告知浏览器在空闲时间段提前加载lodash.js，这样当真正需要使用该模块时，就能迅速获取，极大地提高了加载速度，让用户几乎感受不到延迟。</p>
<h3 id="二-路由懒加载优化">（二）路由懒加载优化</h3><p>在单页应用中，路由是管理页面的常用方式。对路由组件进行懒加载，可以显著加快页面的初始加载速度。以 React Router 为例：</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">import</span> <span class="hljs-title class_">React</span>, { lazy, <span class="hljs-title class_">Suspense</span> } <span class="hljs-keyword">from</span><span class="hljs-string">&#x27;react&#x27;</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-title class_">BrowserRouter</span> <span class="hljs-keyword">as</span> <span class="hljs-title class_">Router</span>, <span class="hljs-title class_">Routes</span>, <span class="hljs-title class_">Route</span> } <span class="hljs-keyword">from</span><span class="hljs-string">&#x27;react - router - dom&#x27;</span>;
<span class="hljs-keyword">const</span> <span class="hljs-title class_">Home</span> = <span class="hljs-title function_">lazy</span>(<span class="hljs-function">() =&gt;</span> <span class="hljs-keyword">import</span>(<span class="hljs-string">&#x27;./components/Home&#x27;</span>));
<span class="hljs-keyword">const</span> <span class="hljs-title class_">About</span> = <span class="hljs-title function_">lazy</span>(<span class="hljs-function">() =&gt;</span> <span class="hljs-keyword">import</span>(<span class="hljs-string">&#x27;./components/About&#x27;</span>));
<span class="hljs-keyword">function</span> <span class="hljs-title function_">App</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">return</span> (
    <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">Router</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">Routes</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">Route</span> <span class="hljs-attr">path</span>=<span class="hljs-string">&quot;/&quot;</span> <span class="hljs-attr">element</span>=<span class="hljs-string">{</span>
    &lt;<span class="hljs-attr">Suspense</span> <span class="hljs-attr">fallback</span>=<span class="hljs-string">{</span>&lt;<span class="hljs-attr">div</span>&gt;</span>Loading...<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>}&gt;
    <span class="hljs-tag">&lt;<span class="hljs-name">Home</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">Suspense</span>&gt;</span>
} /&gt;
  <span class="hljs-tag">&lt;<span class="hljs-name">Route</span> <span class="hljs-attr">path</span>=<span class="hljs-string">&quot;/about&quot;</span> <span class="hljs-attr">element</span>=<span class="hljs-string">{</span>
  &lt;<span class="hljs-attr">Suspense</span> <span class="hljs-attr">fallback</span>=<span class="hljs-string">{</span>&lt;<span class="hljs-attr">div</span>&gt;</span>Loading...<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>}&gt;
  <span class="hljs-tag">&lt;<span class="hljs-name">About</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">Suspense</span>&gt;</span>
} /&gt;
  <span class="hljs-tag">&lt;/<span class="hljs-name">Routes</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">Router</span>&gt;</span></span>
);
}
</code></pre><p>通过lazy和Suspense组件的配合，只有当用户访问对应的路由时，相应的组件才会被加载。同时，Suspense组件提供的加载时占位提示，比如显示 “Loading...”，让用户在等待组件加载的过程中不会感到迷茫，极大地提升了用户体验。</p>
<h2 id="四-代码拆分与懒加载的性能监控与优化">四、代码拆分与懒加载的性能监控与优化</h2><h3 id="一-使用-webpack-bundle-analyzer">（一）使用 Webpack Bundle Analyzer</h3><p>Webpack Bundle Analyzer 是一款十分实用的可视化工具，它能够帮助我们深入分析 Webpack 打包后的文件大小以及依赖关系。通过该工具，我们可以直观地看到哪些模块占据了较大的体积，从而有针对性地进行优化。</p>
<p>安装并配置 Webpack Bundle Analyzer 的步骤如下：</p>
<p>首先，通过 npm 安装：</p>
<pre><code class="hljs language-bash">npm install webpack - bundle - analyzer --save - dev
</code></pre><p>然后，在 Webpack 配置中添加如下代码：</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">const</span> <span class="hljs-title class_">BundleAnalyzerPlugin</span> = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;webpack - bundle - analyzer&#x27;</span>).<span class="hljs-property">BundleAnalyzerPlugin</span>;
<span class="hljs-variable language_">module</span>.<span class="hljs-property">exports</span> = {
  <span class="hljs-comment">//...其他配置</span>
  <span class="hljs-attr">plugins</span>: [
    <span class="hljs-keyword">new</span> <span class="hljs-title class_">BundleAnalyzerPlugin</span>()
  ]
};
</code></pre><p>运行 Webpack 后，会生成一个可视化报告，详细展示每个 chunk 的大小、包含的具体模块等关键信息，为我们后续的优化工作提供了有力的数据支持。</p>
<h3 id="二-根据性能报告进行优化">（二）根据性能报告进行优化</h3><p>依据 Webpack Bundle Analyzer 生成的性能报告，我们可以采取一系列优化措施。如果发现某个第三方库体积过大，我们可以思考是否存在更轻量级的替代品；对于一些使用频率较低的模块，我们可以进一步优化懒加载策略，延迟其加载时间，从而让有限的资源得到更合理的分配。</p>
<p>Webpack 的代码拆分与懒加载高级配置为我们优化 Web 应用性能提供了强大的技术支持。通过合理配置多入口应用的代码拆分、持续优化懒加载策略，并借助性能监控工具，我们能够打造出加载速度更快、用户体验更优的 Web 应用。作为前端开发者，持续深入学习和实践这些技术，将有助于我们在构建大型 Web 应用时从容应对各种性能挑战，为用户带来更出色的产品体验。</p>
]]></content:encoded>
      <pubDate>Tue, 22 Apr 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/webpack-split-code</guid>
    </item>
    <item>
      <title><![CDATA[响应式网页设计中媒体查询的进阶运用]]></title>
      <link>https://moya.plus/article/xiangyingshi-media</link>
      <description><![CDATA[响应式网页开发是不可或缺的核心技能。它可以确保网页在各类屏幕尺寸与设备上完美呈现的重任，致力于为用户打造始终如一且优质的浏览体验]]></description>
      <content:encoded><![CDATA[<p>对于一名前端开发工程师而言，响应式网页开发是不可或缺的核心技能。它可以确保网页在各类屏幕尺寸与设备上完美呈现的重任，致力于为用户打造始终如一且优质的浏览体验。以淘宝为例，无论用户是在电脑端精挑细选商品，还是用手机便捷下单，页面都会智能适配屏幕，清晰展示商品图片，同时提供便捷的操作按钮，让购物流程无缝衔接。而媒体查询作为实现响应式设计的关键技术，我们不仅要掌握其基础用法，更要深入探索它的进阶应用，从而让网页设计跃上新的台阶。</p>
<h2 id="一-媒体查询基础回顾">一、媒体查询基础回顾</h2><p>在深入探讨进阶运用之前，我们先来简单回顾一下媒体查询的基础知识。媒体查询赋予我们依据设备特性（如屏幕宽度、高度、分辨率、方向等）应用不同 CSS 样式的能力。它的基本语法如下：</p>
<pre><code class="hljs language-css"><span class="hljs-keyword">@media</span> (media - feature) {
  <span class="hljs-comment">/* CSS样式 */</span>
}
</code></pre><p>例如，当屏幕宽度小于 600px 时，将页面主体的背景颜色修改为淡蓝色：</p>
<pre><code class="hljs language-css"><span class="hljs-keyword">@media</span> (max - <span class="hljs-attribute">width</span>: <span class="hljs-number">600px</span>) {
  <span class="hljs-selector-tag">body</span> {
    <span class="hljs-attribute">background</span> - <span class="hljs-attribute">color</span>: lightblue;
  }
}
</code></pre><p>这是媒体查询最为常见的用法，通过巧妙设置不同的断点，能让网页在不同屏幕尺寸下展现出截然不同却又恰到好处的布局与样式。许多资讯类网站就是很好的例子，在 PC 端展示时，文章正文与侧边栏可以同时呈现，方便用户获取多元信息；而在手机端，为了让用户专注于阅读内容，侧边栏会自动隐藏，文章内容则铺满整个屏幕，这种流畅的体验背后，正是媒体查询设置断点在发挥作用。</p>
<h2 id="二-多条件组合媒体查询">二、多条件组合媒体查询</h2><p>在实际的开发工作中，我们常常需要依据多个条件来精准应用样式。媒体查询支持使用逻辑运算符（and、or、not）来组合多个媒体特性，从而实现更细腻的样式控制。</p>
<h3 id="一-使用-and-运算符">（一）使用 “and” 运算符</h3><p>“and” 运算符用于连接多个媒体特性，只有当所有特性都满足时，对应的 CSS 样式才会生效。比如，当屏幕宽度处于 600px 到 900px 之间，且设备为横向模式时，将图片的显示尺寸调整为宽度占比 50%，高度自适应：</p>
<pre><code class="hljs language-css"><span class="hljs-keyword">@media</span> (min - <span class="hljs-attribute">width</span>: <span class="hljs-number">600px</span>) <span class="hljs-keyword">and</span> (max - <span class="hljs-attribute">width</span>: <span class="hljs-number">900px</span>) <span class="hljs-keyword">and</span> (<span class="hljs-attribute">orientation</span>: landscape) {
  <span class="hljs-selector-tag">img</span> {
    <span class="hljs-attribute">width</span>: <span class="hljs-number">50%</span>;
    <span class="hljs-attribute">height</span>: auto;
  }
}
</code></pre><p>以淘宝移动端为例，当用户使用平板设备且处于横屏状态，同时屏幕宽度处于特定区间时，商品展示图片会自动调整为合适的尺寸。这样一来，既能保证图片清晰展示商品细节，又能合理利用屏幕空间，让用户在一屏内看到更多商品信息，有效提升购物效率。</p>
<h3 id="二-使用-or-运算符">（二）使用 “or” 运算符</h3><p>“or” 运算符表示只要其中一个媒体特性满足，CSS 样式就会生效。例如，当屏幕宽度小于 600px 或者设备处于纵向模式时，隐藏某个导航栏：</p>
<pre><code class="hljs language-css"><span class="hljs-keyword">@media</span> (max - <span class="hljs-attribute">width</span>: <span class="hljs-number">600px</span>), (<span class="hljs-attribute">orientation</span>: portrait) {
  <span class="hljs-selector-tag">nav</span> {
    <span class="hljs-attribute">display</span>: none;
  }
}
</code></pre><p>在一些社交类网站中，当用户使用手机竖屏浏览，或者屏幕宽度较小时，底部复杂的导航栏会被隐藏，取而代之的是简洁的侧边栏菜单。这一设计极大地方便了用户单手操作，轻松在不同页面间切换，提升了交互的便捷性。</p>
<h3 id="三-使用-not-运算符">（三）使用 “not” 运算符</h3><p>“not” 运算符用于取反条件，即当媒体特性不满足时，应用对应的 CSS 样式。比如，当设备不是打印设备时，显示网页的侧边栏：</p>
<pre><code class="hljs language-css"><span class="hljs-keyword">@media</span> <span class="hljs-keyword">not</span> print {
  <span class="hljs-selector-tag">aside</span> {
    <span class="hljs-attribute">display</span>: block;
  }
}
</code></pre><p>许多在线文档类网站，在用户正常浏览网页时，侧边栏会展示详细目录，方便用户快速定位到所需内容；但当用户进行打印操作时，为了避免打印出无关内容造成纸张浪费，侧边栏会自动隐藏，确保打印内容简洁明了。通过这些逻辑运算符的灵活组合，我们能够实现极为复杂且精准的样式控制，满足各种多样化的设计需求。</p>
<h2 id="三-媒体查询与-css-变量结合">三、媒体查询与 CSS 变量结合</h2><p>CSS 变量的诞生为我们的样式管理带来了前所未有的便利，将媒体查询与 CSS 变量相结合使用，更能进一步提升代码的可维护性与灵活性。</p>
<p>我们可以先定义一些 CSS 变量，然后在媒体查询中依据不同条件来动态修改这些变量的值。例如：</p>
<pre><code class="hljs language-css"><span class="hljs-selector-pseudo">:root</span> {
  <span class="hljs-attr">--main</span> - <span class="hljs-attribute">font</span> - size: <span class="hljs-number">16px</span>;
<span class="hljs-attr">--main</span> - <span class="hljs-attribute">color</span>: black;
}
<span class="hljs-keyword">@media</span> (max - <span class="hljs-attribute">width</span>: <span class="hljs-number">600px</span>) {
  <span class="hljs-selector-pseudo">:root</span> {
    <span class="hljs-attr">--main</span> - <span class="hljs-attribute">font</span> - size: <span class="hljs-number">14px</span>;
  <span class="hljs-attr">--main</span> - <span class="hljs-attribute">color</span>: gray;
}
}
</code></pre><p>在 HTML 中使用这些变量：</p>
<pre><code class="hljs language-css">&lt;<span class="hljs-selector-tag">body</span> style=&quot;<span class="hljs-attribute">font</span> - size: <span class="hljs-built_in">var</span>(--main - font - size); <span class="hljs-attribute">color</span>: <span class="hljs-built_in">var</span>(--main - color);&quot;&gt;
&lt;!-- 网页内容 --&gt;
&lt;/<span class="hljs-selector-tag">body</span>&gt;
</code></pre><p>以一些电商网站为例，在大屏幕设备上，较大的文字字号和鲜明的文字颜色能够保证用户清晰阅读商品信息；而在小屏幕手机上，通过媒体查询修改 CSS 变量，适当减小字号、调整文字颜色，使其更好地适应小屏幕的显示区域，同时有效避免用户阅读时产生眼睛疲劳。如此一来，当屏幕宽度发生变化时，只需修改 CSS 变量的值，就能轻松实现全局样式的统一调整，避免了在多个地方重复编写相同的样式代码，大大提高了开发效率。</p>
<h2 id="四-动态媒体查询">四、动态媒体查询</h2><p>在传统的媒体查询中，样式是依据页面加载时的设备状态来应用的。但在某些特定场景下，我们期望能够根据用户的实时操作动态调整样式，这就需要借助 JavaScript 来实现动态媒体查询。</p>
<p>通过 JavaScript 的matchMedia方法，我们可以获取媒体查询的匹配状态，并为其添加事件监听器。例如，当屏幕宽度小于 600px 时，切换网页的主题：</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">const</span> mediaQuery = <span class="hljs-variable language_">window</span>.<span class="hljs-title function_">matchMedia</span>(<span class="hljs-string">&#x27;(max - width: 600px)&#x27;</span>);
<span class="hljs-keyword">function</span> <span class="hljs-title function_">handleMediaQueryChange</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">if</span> (mediaQuery.<span class="hljs-property">matches</span>) {
    <span class="hljs-variable language_">document</span>.<span class="hljs-property">body</span>.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">&#x27;dark - theme&#x27;</span>);
  } <span class="hljs-keyword">else</span> {
    <span class="hljs-variable language_">document</span>.<span class="hljs-property">body</span>.<span class="hljs-property">classList</span>.<span class="hljs-title function_">remove</span>(<span class="hljs-string">&#x27;dark - theme&#x27;</span>);
  }
}
mediaQuery.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;change&#x27;</span>, handleMediaQueryChange);
<span class="hljs-title function_">handleMediaQueryChange</span>();
</code></pre><p>对应的 CSS 样式：</p>
<pre><code class="hljs language-css"><span class="hljs-selector-class">.dark</span> - theme {
  <span class="hljs-attribute">background</span> - <span class="hljs-attribute">color</span>: black;
  <span class="hljs-attribute">color</span>: white;
}
</code></pre><p>以一些阅读类 APP 对应的网页版为例，当用户在浏览文章时，缩小浏览器窗口，页面会自动切换到夜间模式。这一贴心设计方便用户在光线较暗的环境下阅读，即使在页面加载后，用户改变浏览器窗口大小，网页也能实时响应并切换主题，为用户带来更加智能、人性化的交互体验。</p>
<h2 id="五-媒体查询在不同设备上的优化">五、媒体查询在不同设备上的优化</h2><p>不同类型的设备（如手机、平板、电脑、智能手表等）各自具备独特的特性，我们需要根据这些特性来针对性地优化媒体查询，以实现最佳的用户体验。</p>
<h3 id="一-针对高分辨率屏幕">（一）针对高分辨率屏幕</h3><p>对于高分辨率屏幕（如视网膜屏），我们可以使用min - resolution媒体特性来提供更高质量的图片。例如：</p>
<pre><code class="hljs language-css"><span class="hljs-keyword">@media</span> (min - <span class="hljs-attribute">resolution</span>: <span class="hljs-number">2dppx</span>) {
  <span class="hljs-selector-tag">img</span> {
    <span class="hljs-attribute">background</span> - <span class="hljs-selector-tag">image</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">high - res - image.jpg</span>);
  }
}
</code></pre><p>在一些摄影作品展示网站上，当用户使用高分辨率屏幕访问时，页面会展示高清大图，让用户能够尽情欣赏摄影作品的每一处细腻细节，极大地提升了视觉体验，仿佛身临其境。</p>
<h3 id="二-针对平板电脑">（二）针对平板电脑</h3><p>平板电脑的屏幕尺寸和使用场景介于手机和电脑之间，我们可以根据其特点进行专门的样式优化。比如，在平板电脑上，当屏幕宽度大于 768px 时，将网页布局调整为两栏模式：</p>
<pre><code class="hljs language-css"><span class="hljs-keyword">@media</span> (min - <span class="hljs-attribute">width</span>: <span class="hljs-number">768px</span>) <span class="hljs-keyword">and</span> (max - <span class="hljs-attribute">width</span>: <span class="hljs-number">1024px</span>) <span class="hljs-keyword">and</span> (<span class="hljs-attribute">orientation</span>: landscape) {
  <span class="hljs-selector-tag">main</span> {
    <span class="hljs-attribute">display</span>: flex;
    <span class="hljs-attribute">flex</span> - <span class="hljs-attribute">direction</span>: row;
  }
  <span class="hljs-selector-tag">section</span> {
    <span class="hljs-attribute">width</span>: <span class="hljs-number">50%</span>;
  }
}
</code></pre><p>以在线教育平台为例，当用户使用平板横屏且屏幕宽度符合条件时，页面会一边展示课程视频，另一边展示课程大纲。这种布局方便用户对照学习，随时把握课程进度，通过这样的优化，能够更好地契合平板电脑的屏幕尺寸和使用习惯，提升学习效率。</p>
<h3 id="三-针对智能手表等小型设备">（三）针对智能手表等小型设备</h3><p>对于智能手表等小型设备，屏幕空间极为有限，我们需要大幅简化网页布局，突出关键信息。可以通过媒体查询检测设备的屏幕宽度和高度，当满足特定条件时，隐藏一些非关键元素，调整文字大小和布局。例如：</p>
<pre><code class="hljs language-css"><span class="hljs-keyword">@media</span> (max - <span class="hljs-attribute">width</span>: <span class="hljs-number">200px</span>) <span class="hljs-keyword">and</span> (max - <span class="hljs-attribute">height</span>: <span class="hljs-number">200px</span>) {
  <span class="hljs-selector-tag">nav</span>, <span class="hljs-selector-tag">footer</span> {
    <span class="hljs-attribute">display</span>: none;
  }
  <span class="hljs-selector-tag">p</span> {
    <span class="hljs-attribute">font</span> - size: <span class="hljs-number">12px</span>;
  }
}
</code></pre><p>一些天气查询网站在智能手表上展示时，会只保留关键的天气信息和温度数据，去除多余的装饰和广告，同时缩小文字以适应小屏幕。通过针对不同设备的优化，能够确保网页在各种设备上都能提供最佳的用户体验，无论设备大小，都能为用户提供便捷、高效的服务。</p>
<p>媒体查询的进阶运用为响应式网页设计开辟了更为广阔的可能性。通过多条件组合、与 CSS 变量结合、动态调整以及针对不同设备的优化，我们能够打造出更加灵活、高效、用户友好的网页。作为前端开发者，持续不断地探索和掌握这些技术，将助力我们在响应式设计的道路上稳步前行，为用户带来更卓越的网页浏览体验。</p>
]]></content:encoded>
      <pubDate>Mon, 30 Jun 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/xiangyingshi-media</guid>
    </item>
    <item>
      <title><![CDATA[一月，在没有意义的事情里，找到属于自己的意义。]]></title>
      <link>https://moya.plus/article/202401-mouth-end</link>
      <description><![CDATA[在没有意义的事里找到意义，暂停时间本是神技，而摄影让我们有了窥探神的技能。]]></description>
      <content:encoded><![CDATA[<p>你好，我是木亦。</p>
<p>从 3 年前开始，我每到年终都会写一篇自己的年终总结，跟你分享我一年来重要的事情。从今年开始，我会在每个月的最后一天，跟你分享我的一个月以来的事情，内容不限，字数随意，可能是心得体会，也可能是阅读笔记，总之，那是我最想跟你说的话。</p>
<p>这是我 2024 年的第 <strong>5</strong> 篇原创文章，也是我的一月总结。</p>
<hr>
<h3 id="为什么要做这件事">为什么要做这件事</h3><p>每一个经历过职场的人都深有体会，写总结是一件费事费脑还写不好的事情。但这偏偏又是职场非常吃香的一个技能，有句话说的好——“就凭人家比咱会汇报，就能过得比咱好。”</p>
<p>很讽刺对吧。</p>
<p>但是我选择每个月写一篇自己的月度总结，不是为了让自己学会去汇报，我也不写任何关于我工作的事情，那是给资本家看的东西，我要写，那就一定不能是记流水账，我想写点对你有用的东西。所以这也倒逼我每一天的行动，意味着我要更多的阅读，更多的积累，更多的迭代，我需要用更多的输入去向你更好的输出。</p>
<p>我们每个人都差不多，一年到头都在忙，等忙完了回头一看，每天都干什么了，未必记得，见过什么人，读过什么书，吃什么喝什么，有过什么会心一笑，又有过几次深夜难眠，可能都忘了。</p>
<p>毕竟一年太长了，年终总结呈现的时候，会下意识地缩短篇幅，只挑重要的讲。一个月一次，就会更加细腻一些。其实这个想法其实也就是昨天洗澡的时候来的灵感，希望对你有用。</p>
<h3 id="一场病">一场病</h3><p>从罗胖跨年演讲那晚结束，走出会场，乙流的症状突然袭来，接下来的两周，症状就一直反复的折磨着，带来的直接影响，就是我一月份的跑量，比计划中落下了一大半，没有人会傻到会在身体虚弱的时候去长跑的对吧。所以我一个月大半的时间都在比较低效的病期中度过，期间也需要应对各种各样的工作，再次去跑的时候，状态已经远不如以前。</p>
<blockquote>
<p>晚上在温暖的被窝里想象自己能够征服山峰、跑完马拉松是很容易的，但在清醒的时候这又是另外一回事了。从一个梦想者到一个实干家，你不得不像训练身体一样训练你的心理。——《爱上跑步的 13 周》</p>
</blockquote>
<h3 id="一场年会">一场年会</h3><p>每个打工人心心念念的公司年会，也终于在一月份陆陆续续地召开了。</p>
<p>说实话，你真的期待年会吗。我的答案是：期待。</p>
<p>为什么？那可是允许一部分人展示自己才艺和技能的地方，对于这一类人来说，他可以获得展示自己的舞台、大型活动相关的工作能力、尝试新事物的机会、以及公司有没有重视自己发展的可能。</p>
<p>因为大部分年会的工作人员和表演的节目，都是从企业内部选择，忙一年了，谁不希望获得更多的机会去锻炼和展示自己。我就属于这一类人，我愿意去做一些摄影的工作，我对抽奖和奖项不抱有任何期待，对领导的饼也不会有任何胃口，我唯一能获得的，是锻炼自己的摄影能力的机会，我可以不受约束的去记录所有人的瞬间，顺便提升我的审美能力、我的摄影技能，这对一个摄影爱好者来说，是个不大不小的诱惑。</p>
<p>对于另一部分人来说，年会的意义，更多的是可以靠抽奖获得一笔意外之财，仅此而已。年会，不过是少数人的狂欢，多数人的一场梦遗。</p>
<p>所以你看，<strong>任何一件事，你希望它是什么，它在一定意义上，就可以是你希望的那个东西</strong>，既然不能逃避，那就想办法，总能在里边找到一些你喜欢的东西，你觉得有意义的事。实在不行，那就多吃点菜。</p>
<h3 id="一个意义">一个意义</h3><p>电视剧《士兵突击》里许三多有句台词——有意义就是好好活，好好活就是做有意义的事。</p>
<p><strong>什么是有意义的事？给老板打工算吗？不算。为自己工作才算。</strong></p>
<p>我也曾经不止一次的想过，摄影的意义是什么？是为了留住美好瞬间？还是为了将时光冻结为永恒？</p>
<p>都算。对每一个摄影爱好者来说，拍照是业余的，调色也是业余的，但记录生活，一定是认真的。我尝试翻我的相册，找出了以下几张照片，试着从里面探寻快门被按下的时候，我所看到的东西。</p>
<p><img src="https://cos.moya.plus/article/assets/1784295672615-746A6669_1.JPG" alt="1784295672615-746A6669_1" loading="lazy"></p>
<p>在佛山南风古灶，天冷，还飘着雨，抓拍到了一个小男孩投喂鸽子的画面，跟其他人不一样的是，他走的更近一步，单膝跪地，并且保持一动不动，不说话，也不过多的引诱，就在那安安静静的等着鸽子前来吃食。</p>
<p><img src="https://cos.moya.plus/article/assets/1784295685907-746A4189.JPG" alt="1784295685907-746A4189" loading="lazy"></p>
<p>第二张照片，是在香港坚尼地城，迎面来了一位推着货物费力爬坡的工人，坡不是很陡，但货物很沉重，推起来前行的速度极慢，我绕到他身后，按下快门记录了这个瞬间。</p>
<p><img src="https://cos.moya.plus/article/assets/1784295697019-746A4125.JPG" alt="1784295697019-746A4125" loading="lazy"></p>
<p>这一张也是在香港，我在天桥上寻找导航的路线，一回头，空无一车的道路上，一位阿婆拉着小推车闯了红灯，周围都是游客，这一刻，整条路都属于她。</p>
<p><img src="https://cos.moya.plus/article/assets/1784295708569-746A4046.JPG" alt="1784295708569-746A4046" loading="lazy"></p>
<p>香港尖沙咀，疫情结束后的国庆，我在合影的人群中偷拍，一位戴眼镜的阿姨选择了我的镜头，那一刻，主角感一下就有了。</p>
<p><img src="https://cos.moya.plus/article/assets/1784295716458-IMG_5491.JPG" alt="1784295716458-IMG_5491" loading="lazy">
最后一张照片，是一个跨度 5 年的同一地点的对比。5 年时间，树还是那棵树，路还是那条路，人，也依然是那个人，但故事，早就画上了句号。</p>
<p>也许，这就是摄影对我的意义吧，我是在用它写日记，每次按下快门之前，都要想好拍摄的主体、构图、影调，做人也一样，每一张照片背后都是回不去的从前，<strong>暂停时间本是神技，而摄影让我们有了窥探神的技能。</strong></p>
]]></content:encoded>
      <pubDate>Wed, 31 Jan 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202401-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[七月｜「早」本身，根本不是决定性因素]]></title>
      <link>https://moya.plus/article/202407-mouth-end</link>
      <description><![CDATA[「早」固然好，但当你意识到问题时，早不早已不重要——知识和金钱一样有利息，晚了反而有更多巨人肩膀可以踩。]]></description>
      <content:encoded><![CDATA[<p>我们通常形容时间的流逝的时候，用的都是感叹的语气，感慨着时间过的很快，回头看看，自己好像什么事也没做成。</p>
<p>这好像也是我们每到一个时间段结束的时候会有的一种心情，写周报月报的时候就深有体会，画好大力气才能想起过去一段时间都经历了些什么。</p>
<p>所以来到我的第七个月度汇报，想和你分享下几个有关于时间和知识关系的话题。</p>
<hr>
<p>第一件事：七月六号，我去参加了 VueConf 2024 线下技术会议，也如愿见到了 EvanYou。</p>
<p>很感慨，Vue 作为一个华人开发的前端框架，居然已经有十年了。</p>
<p>这里我也不去讨论会议上的内容，感兴趣的读者可以自行访问 VueConf 官网查看。</p>
<p>我更想说的是，现场有一个 13 岁的小男孩引起了我的注意，他是 B 站的一个 UP 主，那天他跟着母亲从杭州来到深圳参加这次会议，活动结束后，Vue 作者尤雨溪也跟他有了一次短暂的交流。</p>
<p><img src="https://cos.moya.plus/article/assets/1784295536532-image-(4).png" alt="1784295536532-image-(4)" loading="lazy"></p>
<p>13 岁的年纪，他比大多数人要表现的更为自信，可能是父母给予他的成长环境，让他可以接触到前端这个领域并且当做兴趣的一部分发展。</p>
<p>这对于那些对于线下技术会议不屑一顾的相关从业者来说，简直就是降维打击——起点没人家“早”不说，还不如人家小孩子努力。</p>
<p>第二件事：这个月的某一天中午，上班的路上突然下起了大雨，我无奈的跑到公交站避雨。</p>
<p>跟我有同样遭遇的，是一个老外，他像是刚从北站出来，就被这场大雨逼进了公交站台无路可去。</p>
<p>我俩对视几次后，便破防开始尬聊了起来。</p>
<p>我的英语词汇量和口语水平，在聊完家乡和工作的话题之后，就显得捉襟见肘了。</p>
<p>于是后面的所有交流，都只能依靠实时翻译软件。</p>
<p>所以每次遇到这种情况的时候，我们都不难发现，英语对于每一个接受过高等教育的中国学生来说，水平差到什么样的地步。</p>
<p>我们小学 6 年，初中 3 年，高中再 3 年，还不算完，加上大学 4 年，居然绝大多数人的英语水平都不行，而且是听说读写译全方面的不行。</p>
<p>并且，绝大多数出来工作之后意识到这个问题的人，都会后悔——为什么没有“早点”把这件事干成？</p>
<p>当我们每次遇到类似上面场景的时候，都会闪过这样的念头：</p>
<blockquote>
<p>我要是早点学习就好了...</p>
<p>我要是早接触这些就好了...</p>
<p>我要是早知道就好了...</p>
</blockquote>
<p>事实上，所有人都有过这些念头，但是，很少有人会去认真思考，<strong>这些究竟意味着什么？有什么样的影响？如果这个影响不好？又要怎么做才能避免以后带来同样的影响？</strong></p>
<p>“早”固然好，是个重要因素。但实际上，也并不是最重要，且唯一的因素，至少当<strong>你意识到这个问题已经出现的时候，早不早，已经没那么重要了。</strong></p>
<p>所谓“先发优势”，是可以抢占不少先机，但与此同时，不也增加了你成为“先烈”的概率吗？那些大家眼里的成功人士，仔细观察就能发现，他们其实也未必是最早出发的那些人。</p>
<p>他们只是刚好在正确的时间，出现在正确的位置，并且有能力把事情做对。</p>
<p>如果你有接触过投资，买过基金或者股票，那么可以回顾下自己以往的投资经历，有多少是没有经过独立思考的行动，别人买什么你就买什么？又有多少，是在自己学习、思考之后选择的结果？</p>
<p>在刚接触自己一无所知领域的时候，绝大多数人都是拿着真金白银去冒险，举着火把冲进弹药库，即便最后能活着出来，那你也是个莽夫。</p>
<p>说一个绝大部分人至今都不能接受一个简单的事实：钱这个东西，天然就是有利息的。你可以这么理解：<strong>利息就是钱的时间价值。</strong></p>
<p>但是绝大多数人都憎恨那些收取利息的人，这一类人，贪婪、物质。而且还理直气壮的指责别人贪婪、物质...</p>
<p>同样，对于知识而言，也是有利息的，<strong>知识和金钱一样，都能产生利息。</strong></p>
<p>金钱可以产生负利息，知识也一样。那些占据了你脑容量，却错误、或者模糊不清定义不准的概念或者认知，每天产生的，同样也是负利息。</p>
<p>我们对待知识的态度，实在是比对待金钱的态度狠多了，狠太多了！</p>
<p>所以当你觉得自己已经晚了的时候，不妨提醒自己：</p>
<p><strong>我有更多的巨人肩膀可以踩一踩</strong></p>
]]></content:encoded>
      <pubDate>Wed, 31 Jul 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202407-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[三月，想看到日出，要么守到拂晓，要么鸡鸣而起]]></title>
      <link>https://moya.plus/article/202403-mouth-end</link>
      <description><![CDATA[哪怕是挣扎也要活在未来，能用钱买到的东西一定是最便宜的。]]></description>
      <content:encoded><![CDATA[<p>2024 年就这么过去了四分之一，最近的一个月，各种各样不好的消息接踵而至，我们每个人，可能过的都不是那么的爽。</p>
<p>一方面，国内的畜生已经不分年龄，国外呢，也不太安全；另一方面，我们每个人的不确定性都在不断增加，时代冲击带来的焦虑感越来越发的不可收拾。</p>
<p>恰当且足够剂量的焦虑是必要的，它被叫做“危机感”，<strong>没有危机感的人注定是变成无用之人的行尸走肉</strong>。</p>
<p>从今年开始，我要求自己每周要写一篇文章，并在每个月的月底，写一篇自己的总结，内容不限，字数随意，总之，就是要倒逼自己每天都要有所积累，然后把自己积累的东西，从学到、选择、相信，到践行之后，分享出去。</p>
<p>不知不觉，这已经轻松坚持下来了。</p>
<p>从四月开始，我将开启我接下来的几个计划，具体是什么，我先按此不表，会在每个月的最后一天，跟你汇报。</p>
<p>所以，我 2024 年的第 <strong>13</strong> 篇原创文章，来到我的三月份总结，向第一季度，挥手作别。</p>
<hr>
<h3 id="几件事">几件事</h3><p>先汇报几件我的工作进展吧，第一，基于 RemixIcon 的 Vue3 图标组件库——BirdpaperIcon 发布了 v0.1.0，也算正式开源出去了，后面的工作还不少，离发布一个主版本的还有许多事情要做。</p>
<p>第二，BirdpaperUI 也发布了 v2.2.x 次更新版本，进一步丰富了组件库，尽管后面的工作还很多很多...顺便说下，通过 BirdpaperUI 这个开源项目，我也申请到了 JetBrains 全套开发工具的免费使用授权，这直接给我省了一笔不小的费用，感谢 JetBrains 对开源项目作者的支持，谢谢。</p>
<p>第三，我的个人博客也趋近于完成基础功能的开发，差不多是可以正式上线了，具体什么时候，需要根据最近的本职工作状态决定。</p>
<p>第四，呃...不方便说，按此不表，实现了再说。</p>
<h3 id="几个认知升级">几个认知升级</h3><p>今年在得到平台上又购入了不少课程，李笑来老师的《通往财富自由之路》是其中一个，这门课发布的很早，到现在有 30 多万人学习了这门课。</p>
<p>那我为什么到今年才决定买下这门课程呢，其实原因非常的可笑，就是被这门课的名字给骗了嘛，觉得这课程过于假大空，里面无非是一些理财投资相关的知识，财富自由是一件想都不敢想的事情，仅此而以。</p>
<p>但实际上，<strong>这不是教你怎么实现财富自由的课，而是一个又一个改变你认知观念的方法，进而重构大脑的操作系统。</strong></p>
<p>我是直到去年的得到线下活动上见到李笑来本人，听完他关于时间与财富的演讲之后，才开始有所以醒悟，就是有些观点其实我是有践行的，但我不知道居然还可以这样。</p>
<p>于是我开始一遍遍地、逐字不差地读完他的书，从《把时间当做朋友》、《让时间陪你慢慢变富》到今年的新书《财富的真相》，还有就是通往财富自由这门课。</p>
<p>我也在尝试把这门课分享给身边的朋友，几乎是会遭到冷眼和拒绝的，这很正常，跟不读书的人一样，你给他们推荐书籍，他们是会不屑一顾的。这一类人，<strong>明明不甘平庸，却又不思进取。</strong></p>
<p>但我相信，哪怕他们愿意半小时的时间学完其中的一两节，他们一定会说，你怎么不早告诉我有这好东西呢。</p>
<p>事实上我也偶尔会将学到的，并且践行了的几个观念写成文章分享出来，这个月就有两篇，我知道，虽然没几个人看，阅读量少的非常可怜。</p>
<p>我也知道，有没有人愿意听你说话，看你的文章，很可能不取决于你分享的东西对不对，而在于你有没有这个资格。</p>
<p>而这就是我不断要积累，要去实现的东西。</p>
<p><strong>想要别人主动接近你，最好的方法，除了必要的积累之外，就要时不时做出点令人敬佩的事情。</strong></p>
<h3 id="付费就是捡便宜">付费就是捡便宜</h3><p>这个月初在重庆，由于是凌晨抵达的航班，为了省下一晚住宿的费用，就索性在机场睡了一晚，实际情况是根本没睡，能躺着的位置基本已经被躺满了，即便是要吹着寒风挨冻的椅子，也躺满了裹紧大衣睡觉的人，所以我是既没有得到良好的休息，而且不能干任何事情，</p>
<p>这是我非常懊悔的一件事，即便我不是第一次睡机场和高铁站，但我仍然觉得这非常的不值，我虽然省下了一笔费用，但我失去了远比这比费用更重要的东西——宝贵的时间，和第二天无法集中的注意力。我犯了一个错。</p>
<p>在我的价值观下，金钱其实是最便宜的东西，如果能用钱省下来时间，是一笔不错的交易，用低价值的东西换取高价值的东西，这不难理解。</p>
<p>如果能用钱保证自己的注意力可以集中不被分散，那就是更划算的生意，对吧。</p>
<p>一个人单位时间内所能创造的价值是趋于无限大的，如果花钱买下来的时间和注意力，可以给你带来更有价值的东西，那这笔账其实是很容易算清楚的。</p>
<p>你想想，你可以通过不断的学习和积累，去提高自己单位时间内的价值，我们这么努力，不就是为了把自己卖给公司的那每天八个小时，变得跟贵一些吗？</p>
<p>所以，<strong>能用钱买到的东西，一定是最便宜的。</strong></p>
<p>从这个角度看，花钱请助理、花钱提高睡眠质量、花钱喝一杯咖啡，让自己可以更好的集中精力干成一件事，这些行动都是完全正确的，买来的更多自己时间和注意力，足以让你做成更多的事情。</p>
<h3 id="活在未来">活在未来</h3><p>另一个认知升级，是“活在未来”。</p>
<p>现在的你，还会觉得“活在当下”是个好的人生建议吗？</p>
<p>这当然不会是个好建议，甚至是个损招儿。因为“活在当下”就是被永恒的困住，“活在过去”就是被困在更差的一个地方，所以，<strong>即便是挣扎，也要活在未来，哪怕是“部分活在未来”。</strong></p>
<p>而活在未来这四个字，你觉得这件事有多扯，做起来就有多简单。</p>
<p>想要活在未来，第一，<strong>你对未来得有个大概的预测，并且这个预测的结果，是需要一定时间实现的，你可以活到那个时间。</strong></p>
<p>第二，<strong>你笃信，你的预测都是正确的。然后你开始提前按照你预测的结果去思考、选择、行动。</strong></p>
<p>第三，<strong>证明你的预测是正确的。</strong></p>
<p>大部分人不敢活在未来的原因，几乎都是害怕自己的预测是错的。</p>
<p>所以，不要企图一次就预测对所有事情，过度预测的意义并不大，因为这其中不可控的因素太多，如果暂时没有什么自信，就不要判断太远的未来，在行动中验证，并不断修正自己的想法，从而慢慢的培养自己的预测能力。</p>
<p>在我们生活周遭，喊的不在少数的一句“知识就是力量”，其实就是一个预测，并且是社会明确拱到你手上的预测之一。</p>
<p>这句口号喊了这么多年，最终其实没有多少人真正收益，绝大多数人只是停留在口头认可，并没有落实到行动中去，虽然尝试了学习知识，实际却没有做到持续的积累。</p>
<p><strong>很多事情上，做一点点是没有用的，因为大部分人也都会这么做。重要的是，能不能持续的积累，让自己的优势体现出来，这更为关键。</strong></p>
<h3 id="什么是落后">什么是落后</h3><p>每个人的感觉永远都是有偏差的，例如：<strong>接近 90% 的人认为自己的驾驶水平处于平均水准之上。</strong></p>
<p>因为我们并不能直接感知这个世界，我们只能通过感知自己的周遭，从而判断自己是否处于平均水准以上。</p>
<p>也就是说，你的结论，其实是出自于一个非常局限，远非全部的周遭而已，一个井底之蛙在它的世界里确实处于平均水准之上，那又如何呢？</p>
<p>在教育里，及格线被定在 60 分，而不是平均的 50 分，为什么？</p>
<p>多出来的 10 分，可以算是一种修正参数，虽然有点残酷，明明已经平均以上了，但那个及格线就是要告诉你，你做不到前 40%，就是落后。</p>
<p>当我们步入社会以后，我们但凡不傻，也都发现了，这个社会，光及格是几乎完全没有用的，实际上，20%之后都算是落后，因为根据二八定律，20%的人掌握了这世界上有限的 80%的资源。</p>
<p>还有一个更残酷的事实，就是弄不好，百分之一之后，全是落后。</p>
<p><strong>过去，百分之四十之后是落后；</strong></p>
<p><strong>现在，你以为百分之二十之后是落后；</strong></p>
<p><strong>现在，实际上很可能百分之一之后都是落后；</strong></p>
<p><strong>将来，有可能千分之一、万分之一之后都是落后……</strong></p>
<p>这特么太恐怖了。</p>
<p>好，三月就到此结束，最后一天，再说点题外话。</p>
<p>我非常喜欢郭老师的一句话，就是<strong>古往今来，要饭都没有要早饭的，因为他但凡起得来，他就不至于要饭。</strong></p>
<p>对，你连早起都做不到，凭什么指望自己比别人过得好。</p>
<p>想要看到日出，比起熬夜死守，打早起可能会是个更好的人生选择。</p>
]]></content:encoded>
      <pubDate>Sun, 31 Mar 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202403-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[九月｜人生本就是个减法，哪有什么来日方长]]></title>
      <link>https://moya.plus/article/202409-mouth-end</link>
      <description><![CDATA[世人皆知的秘密不在于知道什么，而在于怎么做——What不算秘密，How才是。人生是减法，见一面少一面。]]></description>
      <content:encoded><![CDATA[<p>九月结束，又是一个月末，2024 年，只剩下最后的四分之一了。</p>
<p>我打开 flomo，从中选了三篇笔记整理出来，和你分享这个月我记录的三个想法，希望对你有用。</p>
<hr>
<h3 id="世人皆知的秘密">世人皆知的秘密</h3><p>几乎每个人都非常清楚，投资成功的核心，无非是显而易见的四个字：</p>
<blockquote>
<p><strong>低买高卖</strong></p>
</blockquote>
<p>仅此而已，清晰地令人发指，一共就四个字。</p>
<p>但是，绝大多数人都没有这个耐心，他们非常沉迷于当下的“即时反馈”中无法自拔。</p>
<p>你看是不是这样，大多数人希望投资获得的收益，是那种可以立即看得到，而且数额还不小的当下回报。</p>
<p>这个世界往往就是这么运行的，越是简单的事情，越是清晰的逻辑，越是大家都懂的道理，就越是少有人可以把它做好...</p>
<p>一个最直观的例子，就是我们从小被教育的那句绝对正确的话——“<strong>知识改变命运</strong>”。可是有多少人，在毕业工作之后，就停止了学习，他们再也没翻过一本书，再也没有投资过自己的成长。即便他们仍然相信这句话。</p>
<p><strong>知识，本身就是有利息的，本身就具有“复利”效应。</strong></p>
<p>这是我们绝大多数人所知道的“秘密”，也是绝大多数人死活都做不到的“秘密”。</p>
<p>一切“世人皆知的秘密”之所以成为了“秘密”，不在于他是什么，而在于怎么做。What 不算是秘密，因为很多人都知道。How 才是真正的秘密，因为很多人不知道。</p>
<p>理解了这点，也就理解了为什么懂得了很多道理，还是过不好这一生了吧？因为根本<strong>不去践行，不知道怎么才能做到，哪怕你知道的再多，不也一点用都没有。</strong></p>
<h3 id="打工人的清醒时刻">打工人的清醒时刻</h3><p>我想，对于今年有找过工作的朋友来说，可能最明显的感受就是所谓的行情变差了，好工作越来越难找了。</p>
<p>确实，对于职场老人来说，求职是件比较痛苦的事情，大厂更热衷于校招，论性价比怎么也拼不过那些应届生，哪怕是当初嗤之以鼻的外包岗位，现在也要求你得是全日制本科，甚至你得是 985、211 名校。</p>
<p>我今年也面试了不少公司，难度一个比一个大，越来越卷，八股文越背越多，面试官上来二话不说，直接就是手写算法，各种场景题，面试一个前端岗位，恨不得所有涉及编程的技术栈原理都要问一遍。</p>
<p>实在太难了。</p>
<p>记得 Vue 作者尤雨溪有次直播时说过，有次面试他被问到原型链，没答上来，面试挂了。（哈哈）</p>
<p>对码农来说，很多技术是用到了才会去学，而不是系统的学了一遍才想着怎么去用，是为了解决问题而去提升技术，而不是禁锢在已有的能力里去找解决问题的办法。</p>
<p>现在的处境，就像是攀岩的时候，遇到了一块大石头挡在面前，必须要挪动地方才能继续往上爬，可这是攀岩，总不能直接跳到其他地方对吧，正确的办法应该是手脚并用，一步一步的挪过去。</p>
<p>对于跳槽或者转行，也是同样的道理。</p>
<p><strong>任何一个人的定位，都可以用行业 × 企业 × 职位三个要素锁定</strong>，比如我是电商行业某个公司的程序员。如果我决定要转行，正确的做法，一次就只改变其中的一个要素，慢慢的跨越过去，而不是完全丢掉、一次性跳走，否则大概率会摔的很惨。</p>
<p>——这条笔记，写在看完《不上班咖啡馆》某一小节后，在这里推荐下这本书，希望你会喜欢。</p>
<h3 id="人生减法">人生减法</h3><p>有一年春节，班长在高中同学群里发了一条消息，原话我记不太清楚，大概意思是：大家都好久没见面了，出来聚一聚吧，想你们了。</p>
<p>那是 2020 年，懂得都懂，这个聚会被迫取消，大家在很长的一段时间里，出行受到了各种各样的限制。</p>
<p>之后，这场聚会再也没有人提起过，群里一屏就能看完的消息，时间却跨越了好多年。</p>
<p>毕业多年，偶尔会刷到他们的动态，看着似曾相识又有点陌生的面孔，感叹时间真的过得太瘦了，从指甲缝中溜走，即便我用上两只手，也不可能把它握住。</p>
<p>时间和我们都在往前走，每个人的人生，其实都是在做减法。<strong>饭，吃一碗少一碗，路，走一天少一天，人，见一面，也就少一面。</strong></p>
<p>——写在 9 月 12 号，教师节。</p>
]]></content:encoded>
      <pubDate>Mon, 30 Sep 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202409-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[二月，乐观的设想，悲观的计划，愉快的执行]]></title>
      <link>https://moya.plus/article/202402-mouth-end</link>
      <description><![CDATA[计划的最大价值不是计算明天，而是笃定今天。财富自由的重点不在财富，而在自由。]]></description>
      <content:encoded><![CDATA[<p>5 天前，我们刚热闹完了元宵；11 天前，我们开始陆续复工，望着熟悉的工位又感到些许陌生；19 天前，我们度过了这几年最后一个大年三十，29 天前，这个月的第一缕拂晓，才刚刚渐显。</p>
<p>一年中日子最少的一个月，还是如期过去了，这是我2024年的第 <strong>9</strong> 篇原创文章，也是我的二月总结。最后一天，我想跟你分享下过去的一个月我最想讲的东西，还有一些我自己具体的事儿。</p>
<hr>
<h3 id="你真的有-拖延症-吗">你真的有“拖延症”吗？</h3><p>我最近获得的启发之一，是来自许岑的《如何成为有效学习的高手》中的一节课，就是拖延症的确诊与治疗，有很多人说自己有拖延症对吧，但实际情况真的是这样吗？</p>
<p>拖延症的学名全称，叫做<strong>注意力缺陷多动障碍</strong>，对，拖延只是一种表现，它的本质问题，其实是你的注意力没有办法集中。</p>
<p>首先，问题是怎么确定自己是不是真的有拖延症呢？其实只需要你清醒一点，确认一下自己拖延的那些事，如果那些被你拖延的事情对你影响不大，那其实你就没有拖延症，**只要你有一些是能够按时完成的事，那你就真的没有拖延症。**因为一个人总不可能一直什么事都不干，对吧。</p>
<p>拿我自己来说，我可以做到早睡早起，哪怕天再冷我也不会多睡会懒觉，马上起床，但是我经常不会起床后立即执行那一套流程，就是洗漱，原因有二，一是天气真的太冷，出租房的自来水流出来是冰冷的，即便我再是条汉子，也会在面对寒冷的水刷牙洗脸的时候犹豫再三，一拖再拖；其二，是我起床后都会去跑步或者其他运动，那既然要洗漱，运动完再洗对我来说是更好的选择。</p>
<p>所以你看，我也有拖延的时候，但我并不属于拖延症。我只知道，这件事对我影响不大，所以晚点去做，拖延一下也无所谓，我可以利用这空出来的时间去做别的事情，或者干脆好好休息下。</p>
<p>第二，就算**那些自认为或者被别人认为他们有拖延症的人，其实也活的好好的，他们并没有被拖死，**而且很重要的一点，对于注意力缺陷多动障碍这个病，相关的描述有这么一条，说真正患有这个病的人，能完成中学学业的就非常少，能够大学毕业的更是寥寥无几。所以其实没什么好担心的，如果你已经大学毕业，那你大概率就不是拖延症，事情远没有你想象的那么糟糕。</p>
<p>那怎么解决拖延的问题呢，其实就一件事，就是<strong>将任务“严峻化”，设定小目标，形成惯性。</strong></p>
<p>如果你要做一场演讲，演讲的对象可能就是你几个亲朋好友，那你是有可能会拖延的，因为不是特别重要。如果你的演讲对象是你的老板，并且演讲的质量意味着你能否升职加薪，这可能会让你的拖延表现有所改善，你开始重视起来了。如果演讲对象是成百上千人呢？像罗胖的跨年演讲一样，你可能就不敢拖延了，因为你知道如果没有圆满的完成这场演讲，你会损失一大批用户。</p>
<p>所以我非常喜欢许岑老师的这门课，也在此推荐给你，欢迎你下载得到 APP 学习。</p>
<h3 id="你真的懂-财富自由-吗">你真的懂“财富自由”吗？</h3><p>对于很多人眼里都闪烁着光芒的“财富自由”这四个字，我也同样对它投以期望的目光。</p>
<p>我们其实是不知道自己所追求的财富自由是什么概念的，为什么？因为**我们大多数人并不清楚自己想要什么，但有意思的是，又非常清楚自己不想要什么。**所以在面对财富自由这个东西的时候，我们可能连它的最基本的定义都搞不清楚。</p>
<p>在维基百科，财富自由的定义是指，那种<strong>无须再为生活开销而努力为钱工作的状态。</strong></p>
<p>说的对，但不够清晰，因为你即便知道了这个状态，也不知道自己该干什么，对吧。</p>
<p>在女性领导力专家高琳的《不被定义》这本书中，我找到了一些答案，好，我慢慢阐述给你听。</p>
<p>钱这个东西，能带来尊严，以及自由。所以<strong>财富自由的重点不在于财富，而是在“自由”</strong>，也就是只要能给你带来自由的东西，都是你的财富，金钱只是其中的一种而已。这个自由，也<strong>并不是你想做什么就做什么，而是不想做什么就不做什么。</strong></p>
<p>你要知道，追求财富自由，他本质并不是“贪财”。贪财只注重短期的变现，这些人只会想着有了钱以后要做什么，却从不想过要因此放弃什么，因为它是受欲望驱使的。</p>
<p>而追求财富自由是受希望驱使的，它是个长期投资，你知道你想要的自由是什么，并很清楚的知道要因此付出什么和放弃什么。</p>
<p>所以，目标有了，是自由，那怎么去实现？反正靠打工是不行的，打工的本质是出售自己的时间，它只能勉强解决买房子买车的问题，<strong>靠售卖自己时间是永远无法实现财富自由的。</strong></p>
<p>**不是贫穷限制了我们想象如何花钱，而是认知限制了我们想象如何赚钱。**这里要分享的内容，来自于李笑来老师在某场演讲里，我在去年的年终总结里也提到过。</p>
<blockquote>
<p>时间是唯一的终极生产资料，今天绝大多数人在讨论时间的时候，都不会有这样的定义。</p>
</blockquote>
<p>我们绝大多数人一生中能够合理合法出售的时间仅为 10%，然而我们竟然直接把这 10% 的生产资料直接给出售了。</p>
<p>我们需要用时间赚钱，直接出售是一种方式，对，就是给别人工作。我们还可以把自己的时间无限复制出去，就是用一份时间获得多份收益。你会发现大多数实现个人财富自由的人都是这么干的，包括作家、演讲者、编剧、导演，甚至网红主播。</p>
<p>还有没有更进一步的方式，有，就是买别人的时间，用别人的时间挣自己的钱，老板们不就是这么干的对吧。</p>
<p>到这你也看出来了，<strong>所谓个人财富自由，其实指的就是再也不用为了满足生活必须而出售自己的时间</strong>，我们可以用自己已经复制出去的时间挣钱，也可以用别人的时间获得自己的收益。</p>
<h3 id="设想-amp-计划-amp-执行">设想&amp;计划&amp;执行</h3><p>万维刚说过，**“你有你的计划，世界另有计划”。**对，我们总有自己的计划，却经常赶不上变化，最终导致跟最初设想的目标大相径庭的情况。</p>
<p>说到这，很多人说为什么要做计划，未来那么多的不确定性，我都避免不了，关键不还得看执行，我有做计划的功夫，可能已经把活干完了。</p>
<p>但我还是坚持认为计划很重要，因为**计划的最大价值，不是为了计算明天，而是为了笃定今天。**当然，前期的设想和后期的执行也很重要。</p>
<p>设想是理想化的，落实到每一个计划清单里，需要一条条实现目标的有效路径，以及各种备用方案，也就是悲观的计划，最后，不管计划怎么样，都是为了执行的时候更加的专注，方向更加的清晰，更愉快的去执行下去。</p>
<p>说说我自己的事吧，最近一个月，忙的东西太多了，离自己计划的截止日期也越来越近，这对我来说意味着很多，但我现在还不能跟你说，我会在以后的月度报告，或者其他文章里跟你分享。其中包括一个新项目 —— Birdpaper Icon.</p>
<p>一直以来，birdpaper-ui 都在使用 RemixIcon 作为图标库，随着 v2.2.x 的开发，意味着不能再像以前那样，使用 IconFont 的方式引入，因为这意味着会增加制品库的体积。</p>
<p>所以将 SVG 图标转为 Vue3 组件的方式引入，是当下最佳的方案，即便 Remix Icon 官方已经支持了该种使用方式，但为了可以更好的切合用户实际需求，我还是决定基于 Remix 的 SVG 图标进行二次开发。
由于担心二次开发的版权问题，所以在月初我就和 RemixIcon 的作者-萧醇进行了许可咨询，感谢作者，打消了我的疑虑并且同意了我的开发申请。	
<img src="https://cos.moya.plus/article/assets/1784289513347-feb.png" alt="1784289513347-feb" loading="lazy"></p>
<p>预告下，Birdpaper Icon  Vue3 图标组件库已经完成大部分功能开发，将于 <strong>3 月底之前发布并开源。</strong></p>
<p>好，写到这，我在二月份最想跟你分享的东西就到这了，篇幅有限，还没完，来不及的部分，我也会在后面的文章中更新给你，希望对你有用。</p>
<p>最后再写一句，来自天使投资人李笑来在某个课程里的原话，他说：<strong>阅读本身，几乎是没有任何价值的。阅读后的思考，思考后的选择，选择后的行动才有价值。</strong></p>
<p>感谢你的阅读，我们下个月末，再见！</p>
<p>参考引用：</p>
<ul>
<li>许岑·《如何成为有效学习的高手》</li>
<li>李笑来·《通往财富自由之路》</li>
<li>高琳·《不被定义》</li>
<li>罗辑思维·启发俱乐部 第 236 期｜计划的用处</li>
</ul>
<p><img src="https://cos.moya.plus/article/assets/1784289536789-IMG_8283.JPG" alt="1784289536789-IMG_8283" loading="lazy"></p>
]]></content:encoded>
      <pubDate>Thu, 29 Feb 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202402-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[五月｜我重新理解了什么是「刚需」]]></title>
      <link>https://moya.plus/article/202405-mouth-end</link>
      <description><![CDATA[成长才是正确的刚需——习惯不过是刚需的另一种说法。]]></description>
      <content:encoded><![CDATA[<p>每到月底的这一天，我都会长舒一口气。</p>
<p>一方面，是感叹这时间过得可真快啊，就这么到月底了，得赶紧看看自己都积累了什么，有什么值得分享出来的东西。</p>
<p>另一方面，即将开始新的一个月，对于计划中即将要做的事，有种终于开始的兴奋感。</p>
<p>人在很多时候就是这样，可以把本来没有意义的事情，主观的加入时间这一终极的生产资料作为约束，然后作为自己生命中比较重要的一部分，于是便有了希望和所谓的仪式感。</p>
<p>我在今年开始，约束自己每周至少写一篇文章，到月底的最后一天，要把自己这一个月所积累的东西，选择性挑重点的分享出来，内容是什么不重要，总之那是我最想说的话。</p>
<p>回顾过去的 5 个月，我一共写了 5 万多字，差不多是半本书的量，而具体落实到每一天，其实也不过三百来字，任何一个职场人士每天敲键盘的字数都要比这多的多。</p>
<p>可我是怎么坚持下来的，怎么做到持续做一件事，而且写的东西，没有人看，没有任何积极的反馈，居然还能厚着脸皮继续写...为什么？</p>
<p>这也是我五月份，最想和你分享的东西--正确的刚需是一切驱动力的源头。</p>
<hr>
<p>刚需这个东西，每个人都不一样，其实你也不难发现，刚需是建立在价值观之上的。</p>
<p>同样一个东西，对你来说是绝对的刚需，对别人来说可能不是，因为你俩的价值观大不相同，价值观几乎决定着一个人的一切。</p>
<p>那些喜欢当着别人面前表现自己的「表现型人格」，他们更在乎的是别人眼中的自己，所以对他们来说，表面上成功的状态，就是他们的刚需，他们时时刻刻都希望在别人面前都能留下好印象。</p>
<p>还有一部分与之相对立的人格，叫「进取型人格」，他们不关心别人眼中的自己是什么样的，因为他们更在乎自己到底有没有进步，有没有变化，于是不怎么在乎自己当前的表现，那么内在的成长，就是他们的刚需。</p>
<p>这不难理解吧。</p>
<p>实际上，成功不过是人生某个时刻里的某一个值得骄傲的状态；而成长则是伴随一生过程，成长才更重要，更应该是我们正确的刚需。</p>
<p>如果你能正确地认识到这一点，你的每次选择都会不由自主的发生变化，从而养成「习惯」，而习惯，不过是刚需的另一种说法而已。</p>
<p>举个例子，绝大多数人挣不到非常多的钱，是因为挣钱这件事，并不是他的刚需，他们赚钱是为了花钱，也就是消费，花钱才是他们真正的刚需。</p>
<p>这一类人经常说的话就是— —等我有了钱，我就 x x x！</p>
<p>而只有少数人可以做到，花钱是为了赚钱，也就是投资。比如对于自考这一类人来说，他们那么多的钱，那么多的时间，目的就是为了可以挣到更多钱，让自己产生复利，从而挣到比别人多得多的财富。</p>
<blockquote>
<p>投资标的，不一定只有理财和股票——还有自我成长，尤其是在那些只有学会才能站在资本背后的技能上。</p>
</blockquote>
<p>刚需是可以自主选择的，前提就是培养自己正确的价值观，否则按照人类的天性，懒惰和贪婪才是生物本身的刚需，那这样下去，不就成了罪人了吗。</p>
<p>所以，究其本质，一切对自己成长有利的东西，都是刚需。</p>
<p>提升学历，学到更多东西对自己一定有利，这就是刚需。</p>
<p>坚持运动对自己的身体有利，那锻炼就是刚需。</p>
<p>这些刚需有很多，而且都会很「难受」对吧，但是你想想，你是愿意每天跑步难受，还是以后在住院大楼看着医生对你上下其手难受？你是愿意学习的时候难受，还是因为学历问题找不到好工作难受？</p>
<p>这些都是可以选择的，而且这些道理，你以前也一定听过，就是那句“不愿吃学习的苦，就吃生活的苦”，只是由于各种原因导致没有去践行，最终成就了你的现状— —身不由己。</p>
<p>什么是现状，本质上看，现状就是“过往的积累”。</p>
<p>之所以你对现状不满意，那肯定是“过往的积累不够”。然后现状越差，越没有积累，越心急。</p>
<p>因此引出另一个问题：在培养正确的刚需的时候，最为关键的核心是什么？</p>
<p>答案是：耐心。</p>
<p>你有没有发现，绝大多数人是没有耐心的，尽管嘴上不说，但是会不自主的表现出来对目标的达成有着非常急切的心理。</p>
<p>比如大部分人在描述自己目标时，会有一些前提条件：马上...、x 天内...、今年一定要...，也就是短期的期望太高了。</p>
<p>这是典型的没有耐心的表现，学习了几天没有明显的提升，练习了几天感觉又累又苦，就想着给自己找个理由放弃，这是几乎所有半途而废的原因。</p>
<p>对于这些人而已，马上生效就是他们的刚需，哪怕是感觉不能马上生效，他们都会立刻选择放弃。</p>
<p>所以在今后的选择上，降低短期内的预期，在制定目标的时候，可以加个限制条件，就是：不要求马上见效。</p>
]]></content:encoded>
      <pubDate>Fri, 31 May 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202405-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[八月｜我极其努力爬上了山头，才发现爬错了山头。]]></title>
      <link>https://moya.plus/article/202408-mouth-end</link>
      <description><![CDATA[选择先于努力，方向错了越努力越糟糕。]]></description>
      <content:encoded><![CDATA[<p>对于每个想写点什么的人来说，写好开头算是一件不太容易的事，往往很多人在前一秒思绪泉涌，下一秒却发现连个文章开头都写不出来。</p>
<p>于是，很多人半途而废，甚至，不敢开始...</p>
<p>这篇文章的标题和开头，其实就是写给我自己的。</p>
<p>选择先于努力，努力的方向只要是对的，哪怕慢一点也无所谓，方向一旦选错，越努力，就会越糟糕。</p>
<p>尽管穷极一生爬上了山头，也是错误的。</p>
<p>我谈不上对这句话有多深刻的理解，但确实可以很好地形容我最近的状态：我很焦虑（因为爬错了山头），我也知道解决焦虑的具体行动（赶紧下山，换一座山爬），但还是很焦虑（担心又一次爬错山）。</p>
<hr>
<p>八月份，我的生活节奏有了一些不小的改变，我的精力输出再一次跟不上我的日常需求，我很不喜欢这种供需不平衡的无力感...</p>
<p>每天除去上班的时间，我还要完成其它更多的开发工作，我还要跑步、写作，学完当天的英语、复习年底的考试、准备两个人的一日三餐，与此同时，我还要尽可能的每天抽出时间阅读、积累点什么，让自己变得更值钱...</p>
<p>你可能会问，每天把自己累成这样有什么用？</p>
<p>说实话，我也不知道有什么用，尽管我自己是个长期主义者，但我也不知道，这个长期有多长，我能不能活到那个长期结束。</p>
<p>我只知道，我每一天的生活，真实到可以触摸它，具体到可以看见它。这具象的过程，可以给我非常切身的反馈，让我真真切切的感受到，我还活着，我还比别人活的更有生命力一些。</p>
<p>这些生活中焦虑带来的动力，再进一步成为新的焦虑，这种往复循环的过程，令我上瘾...</p>
<p>而我精力跟不上生活的需求，这是我自己的问题，我能想到的正确且唯一的做法，就是不断的成长，让自己可以更好的适应这种生活。</p>
<p>作家冯唐说过关于人生的三个基本目标：不作恶，开心，还能自己养活自己。如果可以达到，那就是很好的一生了。</p>
<p>看起来简单的逻辑，背后需要付出多少才可以实现，只有真正努力过，跟生活硬刚过的人才知道。</p>
<p>我喜欢的生活方式，是那种让肉身低消耗地活着，享受那些简单本真的喜悦，接纳一切发生。让灵魂高消耗地活着，学习、成长、为自己工作，最后，干干净净离开。</p>
<p>而成长，无非就是每天都进步一点点嘛！</p>
<p>学到的知识，掌握的原理，不管怎么样，最终都会为你所用，足够的输入，一定程度上就可以让你变得更值钱，进而，用自己的积累去换取更多的财富。</p>
<p>很多的时候，当人们懂了一个道理，就想把它应用到任何地方。</p>
<p>手里有个锤子的时候，看什么都觉是个钉子。</p>
<p>再看看周遭，多少人是在廉价的贩卖自己的时间和精力，他们把生命都献给了那些跟自己毫无意义的事情上，每天熬夜，晚睡晚起，吃着不干不净的外卖，刷着不痛不痒的短视频。</p>
<p>他们很多人大学毕业后，就再也没完整的看过一本书，参加过一场考试，为自己的成长投资过一分钱，然后给自己安了个“躺平”、“摆烂”的生活方式，心安理得的活着。</p>
<p>然后，这些人嘴上还不乏说出“这个世界没什么机会了”、“找不到挣钱的路子”、“没有上升通道了”这一类的话，说的再直接点，就是想花钱，想挣更多钱，但不想为此而努力，因为他们也不知道，努力和成长，能不能带来他们想要的结果。</p>
<p>明明不甘平庸，却又不思进取。</p>
<p>富人看不起穷人，穷人能知道，有知识的人看不起无知的人，无知者压根儿不知道。</p>
]]></content:encoded>
      <pubDate>Sat, 31 Aug 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202408-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[六月｜生活原本沉闷，但跑起来就会有风]]></title>
      <link>https://moya.plus/article/202406-mouth-end</link>
      <description><![CDATA[生活原本沉闷，但跑起来就会有风——机会一直在，关键在于每天的积累。]]></description>
      <content:encoded><![CDATA[<p>六月过满，年过一半。</p>
<p>月初的时候，我在笔记中写过一段关于我对故乡的定义：</p>
<blockquote>
<p>所谓故乡，对我来说，就是占据了童年生活一半以上，祖祖辈辈都埋葬在这的地方。</p>
</blockquote>
<p>几天后，这个占据了我童年生活一半以上的地方，遭遇了一场罕见的洪灾，哪怕是老一辈的人，都说他们从来没见发这么大的水。</p>
<p>洪水冲破河堤，漫过村庄，淹没一层层房屋。两天后，洪水逐渐褪去，留下一片沉寂和和满地的淤泥——损失惨重。</p>
<p>亲历过灾难的人，多少都会在心里想——“为什么这种事会发生在我身上”。</p>
<p>这更多是悲观主义者才会有的心理活动，对于那些乐观的人来说，他们宁愿被困难击败，也不会被困难定义。</p>
<p>所以，以后再遇到不如意，不妨试着把“为什么这种事发生在我身上”的思想换成了“遇到这种事究竟想教会我什么”。</p>
<p>生活本是沉闷的，但只要跑起来，风会去拥抱你。</p>
<p>你好，这里是我的六月份，也是我的 2024 半年度总结。想和你聊聊我最近的一些心得体会。</p>
<p>我会在月度汇报里提到的东西或者概念，一定是我从某本书、某个课程里学到，然后选择、思考、践行之后，觉得对你有用，才会在这分享给你，好，我们开始。</p>
<hr>
<h3 id="所谓的冒险-其实是避险">所谓的冒险，其实是避险</h3><p>我们在长大的过程中，所接受的教育都在告诉我们，以胆怯、懦弱为耻，以勇敢、坚强为荣，如果某个孩子拥有冒险精神，还可能会被冠以「勇气可嘉」的名号。</p>
<p>但是你不觉得吗，这个世界所存在的风险并不可怕，可怕的是你根本不知道自己在冒险。</p>
<p>我们处在不同的观察角度，对于冒险的概念，理解起来也是截然相反的。</p>
<p>想想看，我们在观看激进运动员在做高风险运动的时候，他的每一个动作看起来都无比的危险，稍有不慎，那可是直接丧命的，在观察者的角度看，他的每一个举动都是在冒险。</p>
<p>而对于运动员这个行动者本身，他的目标是避开所有的风险，成功地完成动作，而不是冒险。他的每一次训练，目的都是积攒经验，从而有效地避险。</p>
<p>对，再仔细想想，行动者所积攒的丰富经验，更可能是“避险经验”，而不是“冒险经验”，如果没有认知存在，导致理解出现偏差，而误以为他们的成功是得益于“冒险经验”，那会把自己推向更多的未知风险当中，这不难理解，对吧。</p>
<h3 id="找借口">“找借口”</h3><p>我们人类的大脑都有一个“自我保护机制”，它有个目的，就是用各种各样的方法保证自己不会产生“心理崩溃”。</p>
<p>“找借口”就是其中一个表现，虽然这种说法比较勉强，但也算得上准确。</p>
<p>所谓“找借口”，就是为一个“无法接受的现实”，去千方百计的找一个里令自己“心安理得”的解释。</p>
<p>不信你看，上学的时候，其实不是所有成绩不好的学生都会自卑，相反，他们有一套属于自己的说辞：“成绩好很了不起吗，实际什么都不会...”，“成绩好以后不也是出来打工，现在好不代表将来就过得好”。</p>
<p>长大后，尤其是这一句：“有钱了不起啊？”。我们也经常听到“不是什么都可以用钱买来的”。</p>
<p>这是事实，确实钱不能买来所有的东西，于是你会觉得，“有钱”和“没钱”都不算是优势，最后的结果是，“没钱”依然是劣势，起码那些“能用钱买到的东西”都买不到。</p>
<p>时至今日，我身边依然有人认为学历无用，“自考本科没用的，外面公司不认”、“读完研究生你都多大了，没用的”。</p>
<p>可问题是，虽然表述出来的“不一定”真实存在，但结果却是不相同的——八成的概率也是“不一定”，两成的概率还是“不一定”，这怎么可能是一回事儿呢？</p>
<p>当我们没钱、没资源、不求上进的时候，这种“自我保护机制”就会跳出来，给自己找一个“心安”的解释，不行的话，就换一个解释，总能找到合适的“借口”。</p>
<h3 id="永远不要抱怨-没机会">永远不要抱怨“没机会”</h3><p>很多人经常会抱怨的一件事，就是所谓的“机会太少”，或者压根“没有机会”，事实上，机会总是以足够多的数量存在，而且就摆在那，只不过绝大多数人终其一生都没能发现，对此视而不见。</p>
<p>我们对这种视若无睹的现象，有一个非常形象的词汇：叫“睁眼瞎”。</p>
<p>仔细想想就会发现，我们很多人希望得到的“机会”，是那种看起来非常明显、不用费多大力气、而且容易抓住的机会。</p>
<p>但真相是，绝大多数的机会，是模糊、不确定、看不出逻辑、可能还分析不出结果的。大多数人看来，这不仅不是“机会”，反而觉得是个障碍，避而远之，最终一次次机会就是这么从身边溜走的。</p>
<p>而决定一个人是否有能力看清机会、抓住机会的关键，是源自于每天的积累而不断提升的分析能力。而一个人的分析能力，最终决定他能拥有多少财富，而能否抓住主要信息，看清某个事件背后的真正逻辑，是一个人能否抓住机会的重要标准之一。</p>
<p>所以，永远不要抱怨“没机会”，那是另外一群人做的事情，不是咱们。</p>
<p>本篇完，我们下月见</p>
]]></content:encoded>
      <pubDate>Sun, 30 Jun 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202406-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[十一月｜挣扎着认识事情真相]]></title>
      <link>https://moya.plus/article/202411-mouth-end</link>
      <description><![CDATA[决定价格的是需求而非成本，选择比努力更重要——挑最被需要的事情做。]]></description>
      <content:encoded><![CDATA[<p>七年就是一辈子，这句话来自李笑来的同名书籍，这本书也曾用过“新生”和“重生”作为书名，但我还是觉得七年就是一辈子更为合适且准确。</p>
<p>至于为什么说七年就是一辈子，生物学的解释，是人体的细胞完整的更新一次，大概就是七年的时间，肉体获得了一次“重生”。</p>
<p>还有一种解释，就是人可以通过学习一项技能或者进入一个新领域，完成一次自我的更新迭代，也会是一次“重生”，变成另外一个人。</p>
<p>七年前，2017 年的 12 月 1 号，大三的第三个月结束，我来到深圳，真正地开始扎入职场。</p>
<p>来之前我还解散了当时干的还算有点起色的工作室，我们这群人甚至连散伙饭都没吃，因为...大家都没分到什么钱。再加上我在中山这个城市，真的找不到工作——没人要。</p>
<p>在深圳的这“一辈子”，有记录的面试大概有 60 多次，差不多 40 家公司，有在签合同发现不对劲跑路的经历，也干过第一天就提离职的工作，在前程无忧实习半年，才算知道怎么才能写好一份简历，才开始明白一个显而易见，却又一不小心就忘掉的道理——<strong>在市场上，决定你能否卖得出去的因素，不是你的能力，而是需求。</strong></p>
<p>这也是我这七年，一直深信，但是又由于很多原因，而一直偏离这个真相。哪怕不断的纠正，但离真正的可以满足所谓的需求，还有很大的一段距离。</p>
<p>这是我这个月最想和你分享的东西，之一。</p>
<p>“真正让你陷入困境的，是这个世界最终并非你所想象。”</p>
<p>确实是这样，这个世界很容易“一不小心”就成为另一副模样，我们也确实很容易“一不小心”，就忘记了我们对这个世界而言，最重要的是什么。</p>
<blockquote>
<p>我都这么努力了，懂得了这么多道理，为什么还是过不好这一生？</p>
</blockquote>
<p>我们换个角度，举个你可以理解的例子，就是：**成本和价格不是直接相关的，它们只是间接相关。**我们掏钱购买一个产品或者一份服务，一定是出于我们真正的需要，而不是这个产品或者服务的成本有多高，消费者更不可能用成本去衡量我具体要掏多少钱。</p>
<p>成本和所谓的情怀跟我们没有关系，即便是有情怀，那也应该被称作是捐赠，而非“购买”。</p>
<p>这也就不难理解为什么付出和回报不成正比了，能不能获得相应的回报，其实跟付出的程度大小没什么直接关系。</p>
<p>那真正跟价格有直接关系的是什么？</p>
<p>答案也显而易见，就是：<strong>真正的被需要。</strong></p>
<p>倘若你真的需要，自然会提高他在你心中的价值，就这么简单，反过来也一样，做个对世界真正有用的人，这个世界也自然会更加重视你，甚至不惜高估你。</p>
<p>如果你觉得成本决定价格，那你一定会走向一条错误的道路，你会不顾一切的去做事，甚至不惜一切代价，最终成为“我为你付出了这么多，你却没有感动过”的大冤种。</p>
<p>但如果你现在反应过来了，真正决定价格的，是需求，而非成本，那么之后努力的，就完全是另一个方向了。选择比努力更加重要，因为努力谁都会，选择才是决定性因素，方向错了，越努力就会越糟糕。</p>
<p>对这个世界描述的越清楚，越有指导意义，显然，我们有且仅有，且唯一且正确的行动，就是：</p>
<blockquote>
<p><strong>挑最被需要的事情做。</strong></p>
</blockquote>
<p>我们十多年的教育体系里，没有教过如何识别、检索需求，几乎每一个人都要经历一段靠直接出售自己时间而获利的日子，那不妨，去做一个让这个世界，这个社会，这个市场真正需要的人，而不是去做一个感动自己，觉得自己有多不容易的人。</p>
<p>另外，坚持锻炼，保持健康体重，少生病，时刻保持能干活的状态，也是这个世界真正需要你的特质，这也是成事人的另一个基本要求。</p>
]]></content:encoded>
      <pubDate>Sat, 30 Nov 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202411-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[十二月｜学会对无关紧要的事情漠不关心]]></title>
      <link>https://moya.plus/article/202412-mouth-end</link>
      <description><![CDATA[与其不停强化熬夜的弊端，不如切实体会早起的快感。对无关紧要的事情漠不关心，把注意力留给真正重要的事。]]></description>
      <content:encoded><![CDATA[<p>这是 2024 年的最后一篇月度总结，今晚过后，就是新的一年了。</p>
<p>我们人类总会在地球公转一周后，重新给自己立下一些新的目标和愿景，最后有没有做到是另一回事，但是愿意给自己立目标、许愿望的人，终归是一个心态乐观，积极向上的人。</p>
<p>这是绝大多数人都能做到，我们来说说绝大多数人做不到的，因为这才是人与人之间产生差距的原因。</p>
<p>绝大多数人做不到的，是设定目标之后如何实现，甚至可能连设定目标可能都不太会，更别提如何实现目标了。</p>
<p>这次的月底总结，我想和你分享我是如何决定做一件事情的。</p>
<p>大概四年前，我突然决定，非自身原因下，绝不熬夜，十点就睡觉。</p>
<p>这听起来特别困难对吧，对于一个在一线城市，干的还是程序员工作的人来说，熬夜基本上是不可能避免的事情。</p>
<p>绝大多数人都知道熬夜的坏处，或者已经有了这些坏处：加剧衰老、肥胖、内分泌紊乱、猝死。</p>
<p>但是绝大多数人不知道早起的好处，因为对于他们来说，多睡一会儿，就是天大的好处，他们根本不知道早起可以带来什么样的收益。</p>
<p>所以，如果你想要克服熬夜的习惯，与其不停强化熬夜的弊端，不如切实体会一下早起的快感。一旦你发现，每天早起半小时可以给你带来的好处时，你会自然而然地放弃熬夜的习惯。</p>
<p>但我还有一种克服熬夜习惯的方法，其实这个方法，也同样适用于其他地方，就是：对无关紧要的事情漠不关心。</p>
<p>不妨问问自己：</p>
<p>你真的需要那么多的无效社交吗？</p>
<p>你真的需要靠玩游戏获得成长吗？</p>
<p>你真的需要吃那么多的瓜吗？</p>
<p>你真的没能力在睡觉前完成当天的工作吗？</p>
<p>那些对你无关紧要的事情，每天在浪费你多少可以利用的时间和精力？以至于你要为自己的熬夜找借口——我没办法，生活所迫，不得不熬夜。</p>
<p>所谓的“找借口”，就是为一个“无法接受的现实”千方百计地去找一个令自己“心安理得”的解释。</p>
<p>你每天的时间用在哪里？你每天的注意力花费在哪里？其实都是比“你把钱用到哪里”更重要的事情，那就完全没必要浪费在跟自己无关紧要的事情上才对。</p>
<p>所以在这四年里，戒掉熬夜本身带给我的收益，已经远超过我的预期，我不会有十点以后的社交活动，我也绝不会再游戏上浪费我该有的时间，我对大事和与我相关之外的八卦毫不关心，我也能在十点前完成当天工作，毕竟我绝大多数想做的事，都通过早起完成了。</p>
<p>长时间下来，能让我熬夜通宵的次数，一年可能不超过 5 次，而且往往都是被动原因造成的，这样的极度低频的被动的熬夜，也不会给我带来过多的损耗。</p>
<p>这就是我为什么希望你，学会对自己「无关紧要」的事情，做到「漠不关心」。</p>
<p>所以多数人都不愿意认识真实的世界，而那少数挣扎着前进的人最终获得了成长。</p>
]]></content:encoded>
      <pubDate>Tue, 31 Dec 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202412-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[十月｜为什么说，要给自己打工？]]></title>
      <link>https://moya.plus/article/202410-mouth-end</link>
      <description><![CDATA[真正的财富自由，是有朝一日不用为了生活所需而出售自己的时间。给自己打工，同一份时间出售两次。]]></description>
      <content:encoded><![CDATA[<p>不光是在我看来，很多人都有过这么一个疑问，有时候，甚至会觉得像是一个“阴谋”。</p>
<p>你发现没有，那些生活中真正有用，真正不可或缺的技能，在我们过去长达十几年的学校教育经历里面，几乎不教，就算教，也教的很烂，甚至会把你教坏。</p>
<p>比如怎么找到好工作、怎么挣钱、怎么理财，还有，为人处事、职场、婚姻、性生活、识人、育人等等。</p>
<p>很讽刺对吧。</p>
<p>大学给我们上就业指导课的老师可能他自己都没有上过班；上学不让你恋爱，说早恋会影响学习，然后这期间就是不教你怎么谈好一段恋爱，怎么经营一段感情生活，走出社会，突然就要你结婚、生娃、生好几个娃...</p>
<p>我们花了那么多钱，花了那么长时间，上了那么多课，而学校教育的最终目的，居然就是把你培养成一个直接出售自己时间，然后廉价卖掉的人——给别人打工。</p>
<hr>
<h3 id="如何获得双倍收入">如何获得双倍收入</h3><p>我们绝大多数的普通人在最开始，都是给别人打工的，这难免是我们都要经历的一个过程，但是这没办法做到花一份时间，实现两倍的收益，<strong>最好的做法，就是给别人打工的同时，也给自己打工。</strong></p>
<p>给自己打工，和给别人打工是有实质性区别的，而且区别巨大，最重大的一个区别就是：</p>
<blockquote>
<p>给别人打工的人，特别在意薪水，会不由自主的把自己工作结果和质量，跟每个月到账的金钱回报挂钩...</p>
</blockquote>
<p>他们经常会说这样的话，比如：</p>
<blockquote>
<p>你才挣几个钱，搞那么累干嘛...</p>
<p>干这么久也没有涨过薪资，摆烂吧...垃圾 xx</p>
<p>我要让老板知道，一分价钱一分货，便宜就是没好货...</p>
</blockquote>
<p>我在以前某段时间，其实也差不多是这种状态，经常衡量自己拿到手的薪水是否值得自己为别人的理想努力。</p>
<p>而如果是给自己打工，那么在生活中的每一个选择，每一个行动，都是有另外一层标准的——就是我给自己打工，<strong>哪怕不挣钱，也要有成长。</strong></p>
<p>我在过去的将近四年的时间里，即便是在给老板打工的那份环境里有多么的不如意，即便薪资一如既往，各种条件都不怎么样的情况下，依然做到了把时间尽可能的投资到自己身上，我们九点上班，但我平均到公司的时间，基本都在八点前，我尽可能的在给别人打工完成之后，选择给自己再打一份工，我用那份时间，重新投入到对自己成长有利的任何事情上，<strong>摆烂可以，但不能真的菜。</strong></p>
<p>于是，我把同一份时间出售了两次：</p>
<blockquote>
<p>一次出售给了老板，获得薪水</p>
<p>一次出售给了自己，获得成长</p>
</blockquote>
<p>其实做法很简单，无非就是不管是给别人打工，还是给自己打工的时候，做到这几点：<strong>认认真真做好自己的事情，仔仔细细完成每一个任务，并且永远不停止地学习。</strong></p>
<p>这在那些所谓摆烂、躺平的人眼里，就是个“傻子”。</p>
<p>因为那些人从来没有为自己打过工，觉得一份薪资足矣，给的多，就多干些，给的少，就少干些。也不难发现，这些人的内心里，其实是瞧不上那些孜孜不倦、乐于提升自己的人的。</p>
<p>他们经常挂在嘴边的话，经常是这样的：</p>
<blockquote>
<p>专升本没用的，现在考研也来不及了吧？我都这年纪了...</p>
<p>那么认真干嘛，公司又不是我家的，我也没股份...</p>
</blockquote>
<p>这一类人里，其实也不缺想着搞钱，想着终有一日实现财富自由的人，你看，<strong>明明不甘平庸，却又不思进取</strong>...</p>
<p>财富自由，实际跟拥有多少金钱没关系。<strong>真正的财富自由，是有朝一日，不用为了生活所需而出售自己的时间。</strong></p>
<p>也就是说，比起现在挣大钱，更重要的，是先让自己成为配得上大钱的人，有朝一日，你不断地积累学习，才能有机会给你带来与你相匹配的薪水。</p>
]]></content:encoded>
      <pubDate>Thu, 31 Oct 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202410-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[四月｜我挣扎着，不让这个世界对我完全得手]]></title>
      <link>https://moya.plus/article/202404-mouth-end</link>
      <description><![CDATA[彻底戒掉抱怨——若你认真生活，你的世界也会认真对待你。]]></description>
      <content:encoded><![CDATA[<p>终于还是来到第四个月份了，最后一天，深圳，雨。</p>
<p>这个月，好像每一天都在下雨，每一天，我都要担心能不能出去跑步。这事儿挺无奈的对吧，因为我既没有掌控天气的能力，也没有冒雨跑步回来，还能不感冒的体质。</p>
<p>有人说，你可以去健身房啊，跑步机可是不会受天气影响的，</p>
<p>这看起来是个不错的选择，但对于热爱跑步运动的跑者来说，<strong>不能欣赏沿途的风景就罢了，怎么能允许自己原地踏步呢？</strong></p>
<p>这是我 2024 的第 <strong>17</strong> 篇原创文章，来到我的第四篇月度总结。</p>
<hr>
<p>《宝贵的人生建议》里有这么一条：</p>
<blockquote>
<p>不快乐，源自想要别人拥有的东西。而快乐，源自想要自己已经有的东西。</p>
</blockquote>
<p>由于这篇文章可见度的原因，有些事儿我也不能全盘地说出来，反正就是那一句话：</p>
<p><strong>我想过很难，但没想过会这么难。</strong></p>
<p>这就是我整个四月在经历的事儿，几乎每天，我都在极度自信和极度自卑之间徘徊，工作这么多年，我再一次的为自己的职业生涯感到无比担忧。</p>
<p>这个社会居然就是这样，我们花了那么多的钱，那么多的时间，上了那么多年的学，然后学校和老师却从不教给我们如何获取财富，如何规划自己的职业，反而教育的最终目的，居然是让我们成为一个直接出售自己时间的人。</p>
<p>在学校，检测好与坏是有一个标准的，就是考试，你的付出可以立即反馈在学习成绩上，分数摆在哪里，一眼就可以看出。离开学校后，这个标准消失了，我们不管做的好与坏，也不可能立即的体现在工资和福利待遇上。</p>
<p>所以大部分人的生存模式，还是沿用着学生时期的行为，认为我只要努力了，付出了，就一定要在某些方面可以得到反馈，否则我就白干了，然后发现这个世界并不是这么运转的，于是开始各种抱怨，<strong>最后，世界还是那个世界，自己却成为了第一个否定自己的人。</strong></p>
<p>我很长一段时间也是这么生存的，直到最近，我突然意识到，这是完全错误的方式，更可怕的是，早在我念大学的时候，我就已经知道这是错误的方式了，但是由于各种原因，这个观念在我身边一闪而过，不了了之。</p>
<p>**有些观念真的很重要，要么会因为太过违背直觉而无法理解，要么会因为太多与简单，被人们轻视。**于是，我可能不止一次的错过了自己转折、升级的机会。</p>
<p>对，你可能看出来了，我要说的，以及我要做的，就是<strong>彻底戒掉“抱怨”。</strong></p>
<p>抱怨是没有用的，甚至只会给你带来更消极的东西，凭什么这个世界就得给你正反馈呢？很多时候我们抱怨说这个世界太不公平了，其实这不是这个世界的问题，也不是社会的问题，甚至都不是公不公平本身的问题，而是我们配不配得上被公平对待的问题。</p>
<p>所以，这里借用李笑来老师的原话吧，<strong>若是你能善待你的世界，你的世界大抵上可以给你足够的善待，若是你能宽容你的世界，你的世界大抵上能够给你足够的宽容，若你是个非常认真生活的人，你的世界也会非常认真地对待你。</strong></p>
<p>最后，说下我接下来要做的事情吧，远的先不说，咱说近一点的。</p>
<p>我会在 5 月份写一个课程，名字暂且叫做《高效的真相》，我会从各个方面，带你一起学习如何成为一个高效的人，内容虽然付费，但全部加起来，顶天也不会超过一杯咖啡的价格。</p>
<p>为什么会做这件事，其实就是我一直以来持续做的那几件事之一而已，就是<strong>学习-积累-践行-输出</strong>中的最后一项——输出。</p>
<p>我没有什么特殊的背景，对你来说，我大概率也不会是那种特别优秀的人，很难让人信服，确实，信任的建立往往需要时间和过程。我要捧出来并需要你付费分享的东西，来自于我个人的积累，持续不断的学习，我看过的每一个书，上过的每一门课，请教过的每一个老师，然后，将他们整理、归纳、打包，最后送到你手上，希望会对你有用。</p>
]]></content:encoded>
      <pubDate>Tue, 30 Apr 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202404-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[一月｜「选择」的秘诀是什么]]></title>
      <link>https://moya.plus/article/202501-mouth-end</link>
      <description><![CDATA[做选择的秘诀：去掉非必要条件，直到只剩下必要条件。所谓纠结，就是价值观不明确。]]></description>
      <content:encoded><![CDATA[<p>关于「选择」，我听到最多的话，可能就是有些选择真的太难了，因为稍有差错，那可就是完全不一样的人生啊。</p>
<p>是的，要说人生大事，除了生死，就是「选择」。</p>
<p>而每个人做选择的唯一根基，就是他的价值观，价值观不同，就会做出不同的选择。</p>
<p>那些看到别人就选什么的那些人，不算是自己做出的选择。</p>
<p>那有没有方法，可以帮助我们提高「选择」的效率和准确性，答案是有的，所以这 2025 年的第一篇月度文章，我们聊聊关于选择的一些秘诀。</p>
<p>以下内容来自我得到 APP 中的笔记，经过整理后写成这篇文章分享给你，希望对你有用。</p>
<hr>
<p>“你知道剩男剩女都是怎么被剩下的吗？”</p>
<p>其实他们绝大多数人都一样，在选择另一半的要求上，“自认为”要求不高，但实际上，他们往往都是这样想的：</p>
<ul>
<li>长相怎么着，也得中等偏上吧？</li>
<li>个子不能太矮吧？</li>
<li>收入不能太低吧？</li>
<li>学历怎么也得本科以上吧？</li>
<li>......</li>
</ul>
<p>对，这里面的每一个要求，看似都不高，都是非常一般的要求，基本都是只要满足 1/3 就足够了，但为什么就是找不着对象呢？</p>
<p>仔细看看，每个要求都只剩下 <strong>1/3</strong> 的选择，全部加起来，其实只剩下差不多 <strong>4‰</strong> 的选择，你知道吗，每个人这辈子，能够深入了解的人数，平均也不超过 <strong>150</strong> 人，这还包括同性，按照这个概率，得活上好几辈子才能遇到一个满足所有条件的、心仪的人。</p>
<p>这还不算完，因为，对方也在挑...！</p>
<p>所以，聪明的人都是怎么做选择的？</p>
<p>答案显而易见，就是<strong>去掉非必要的条件，直到最后只剩下必要的条件，或者在最开始，就只添加必要的条件。</strong></p>
<p>咱先看个例子：亚马逊在成立之初买的第一个商品是书，为什么是书？</p>
<p>他之所以可以成为现在的互联网巨头，选择卖的第一个商品肯定是经过深思熟虑的对吧，否则这家公司很可能就夭折了。</p>
<p>贝索斯在一次分享中谈到当年他们为什么选择书作为他们的主营产品，其中只有那么几个必要的条件：</p>
<ul>
<li>市场要够大</li>
<li>具有长期的成长性</li>
<li>复购率要高</li>
<li>售后成本低</li>
</ul>
<p>仔细看，是不是书这个品类，都符合这些必要的条件，只有满足这些必要条件，才能把一个初创的电商企业的经营风险降到最低对吧。</p>
<p>其实做选择无非是一个简单的数学题，能够有能力去掉绝大多数错误、非必要的选项，剩下的选择，也就变得简单了起来，简单也未必就代表容易，这里有个大前提，就是你的价值观驱动你可以做出“容易”的选择的基础，是你能够不断地打磨自己的认知能力——想到那些必要的条件。</p>
<p><strong>所谓的「纠结」，其实就是「价值观不明确」。</strong></p>
<p>因为你没有明确的价值观，所以当面临选择的时候，你不知该如何抉择，于是乎越想越乱，最终只能不停地“纠结”。</p>
]]></content:encoded>
      <pubDate>Fri, 31 Jan 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202501-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[七月｜你永远有机会和过去的自己告别，长出新的模样]]></title>
      <link>https://moya.plus/article/202507-mouth-end</link>
      <description><![CDATA[我人生的收益没有一个是短期奋斗获得的，你永远有机会跟过去的自己告别，长出新的模样。]]></description>
      <content:encoded><![CDATA[<p>2018 年的六月份，我从前程无忧离职，结束了半年多的实习工作，期间由于各种原因，我被学校延毕了半年左右，我印象非常深刻，因为我收到毕业证那天，刚好就是 2018 年的最后一天。</p>
<p><img src="https://cos.moya.plus/article/assets/1784295390516-IMG_1360@1.5x.jpg" alt="1784295390516-IMG_1360@1.5x" loading="lazy"></p>
<p>从前程无忧离开之后，我在没有毕业证的前提下，给自己找到了一份全职的工作，这其实很不容易的，因为几乎没有公司会要一个已经毕业但是没有毕业证的大专生，他们会认为，你指定有问题才导致毕不了业。</p>
<p>但是，这样的工作，我还是凭运气找到了。</p>
<p><img src="https://cos.moya.plus/article/assets/1784295401593-IMG_1366@1.5x.jpg" alt="1784295401593-IMG_1366@1.5x" loading="lazy">
那还是国内第一批做互联网黄金的公司，我当时心里还有点暗喜，觉着自己赶上了。</p>
<p>不过没赶上风口，而是赶上了政策变化，公司被迫转型，一头扎进了珠宝行业，我也就顺其自然的加入了新成立的创业公司。</p>
<p>我记得那会最忙的时候，996 已经是见怪不怪了，特别是在接近产品内测那段时间，我们下半夜还在公司熬夜改 Bug。</p>
<p>公司离深圳湾很近，经常凌晨下班后，慢悠着走过去，绕过一片红树林，如果运气够好的话，还可以赶上一场完美的日出。</p>
<p>我在这家公司工作了一年，整整一年的高强度工作，很累，也很扎实。七年后的今天，回想起来，还是很感慨，如果<strong>没有经历过一段自己觉得艰苦的日子，未来察觉幸福的能力是要差一些的。</strong></p>
<p>投资人李笑来曾经写过一本书，叫做《七年就是一辈子》，换种说法就是，人得七年经历一次“大升级”，让自己变得跟以前“不一样”，从生物学的角度来说，除了神经细胞，人的肉身在七年里至少会经历一次完整的更新，也就是说，<strong>现在的你，和七年前的你，肉身已经完整的更新了一回，你，永远是最新的你。</strong></p>
<p><img src="https://cos.moya.plus/article/assets/1784295415817-IMG_1365@1.5x.jpg" alt="1784295415817-IMG_1365@1.5x" loading="lazy">
临近春节，有一回凌晨四点半下班，看着同事们都陆续打车回家后，我犹豫了几秒，还是取消了司机刚接的单；</p>
<p>困意其实早就已经过了，身体沉重但却充满着力气，我一边往西走，一边回头看着越来越小的写字楼逐渐淹没在居民楼栋里，我算了下，那栋楼里最便宜的房子，哪怕我工资不吃不喝全攒下来，也得攒 50 年才能买得起。</p>
<p>走到深圳湾，穿过隧道，我找了个椅子坐着，期待着再过两小时，会有一个温暖的日出，可以让我眯着眼好好欣赏一会。</p>
<p>...没有。</p>
<p>云层太厚，天是从四面八方逐渐亮起来的，朝阳的金黄很无力，刺不破这天空，被融入到了冬天的一片惨白之中。人在很多时候就是这样，<strong>动机是一回事，预期是一回事，而结果往往又是另一回事。</strong></p>
<p><img src="https://cos.moya.plus/article/assets/1784295425339-746A1497-已增强-NR@1.5x.jpg" alt="1784295425339-746A1497-已增强-NR@1.5x" loading="lazy"></p>
<p>七年后的今天，要和上一辈子的自己挥手作别，以前着急有所成就，现在学会了如何走好每一步。</p>
<p>有人说你这就是经历过一些事情后，棱角被磨平了，有些东西看淡了而已。</p>
<p>不是，我只是变得更有<strong>耐心</strong>了而已，换个词就是，<strong>我越来越相信长期主义了，我人生的收益没有一个是短期奋斗获得的。</strong></p>
<p><img src="https://cos.moya.plus/article/assets/1784295439187-IMG_1372@1.5x.jpg" alt="1784295439187-IMG_1372@1.5x" loading="lazy">
<strong>有多少普通人，这一生都很难达到财富自由的里程碑，几乎都是拜没有耐心所赐</strong>，他们喜欢押上全部，喜欢炫技，最终导致错误的判断一连串的发生。</p>
<p>即便在运气好有过成功的时候，也没有能力留得住收益，就像<strong>一个人举着火把经过炸药库，即便他能活着走出来，他也是个大傻子。</strong></p>
<p><img src="https://cos.moya.plus/article/assets/1784295448221-IMG_1455@1.5x.jpg" alt="1784295448221-IMG_1455@1.5x" loading="lazy"></p>
<p>写到这，我又回想起 2018 年的最后一天，那晚罗胖在跨年演讲中有一句话，叫做：</p>
<blockquote>
<p>普通人的努力，在长期主义的复利下，会积累成奇迹。</p>
</blockquote>
<p>我没能买得起进入场馆的门票，于是在场馆外看了会直播，刚好就是这一句，让我在最容易迷茫的那个年纪，可以意识到，我就是一个普通人，学历也不占优势，所以一时半会的努力不会有什么成效。</p>
<p>但是我相信复利这个极其朴素且简单的逻辑，我恨不得将我所有的生产资料，也就是我的时间和注意力，都花在任何一个可以给我带来收益的地方去。</p>
<p>这么想可能很难做到，但是可以反过来却很容易，就是<strong>绝对不在任何无收益的事情上浪费自己的生命</strong>，这样即便你没有得到足够的收益，但是也避免了很多可能导致的巨大亏损。</p>
<p><strong>任何事情只要加上“长期”的维度，然后保持耐心、持续积累、就能产生复利</strong>，这是所有普通人都够得着的能力。你得知道，人生其实是有后悔药的，<strong>你永远有机会跟过去的自己告别，长出新的，让自己满意的模样。</strong></p>
<p><img src="https://cos.moya.plus/article/assets/1784295457595-DJI_0079@1.5x.jpg" alt="1784295457595-DJI_0079@1.5x" loading="lazy"></p>
]]></content:encoded>
      <pubDate>Thu, 31 Jul 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202507-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[三月｜历史不会重复，但他总是押韵]]></title>
      <link>https://moya.plus/article/202503-mouth-end</link>
      <description><![CDATA[历史不会重复，但总是押韵。面对不确定性，可以向历史要答案，它是理解现实的坐标系。]]></description>
      <content:encoded><![CDATA[<h2 id="引言">引言</h2><p>三月份，得到上线了一门新课，叫做《全球史高级研修班》，这是得到跟复旦大学合作的一门课程，也是复旦大学历史系唯一一个对外官方授权的课程。</p>
<p>不到三百块钱的「学费」，就能让复旦大学的三十多位名师给你上原汁原味的历史学课，上哪找这样的好事儿去对吧。</p>
<p>历史学这一门课程，我谈不上有非常巨大的兴趣，但我知道，<strong>历史的钟摆会来回摆，一会儿朝左，一会儿朝右，它有一定的规律，很多时候，在历史的长河里，其实藏着当下问题的标准答案。</strong></p>
<p>所以我突然意识到，当我面对不确定性，其实是可以向历史要答案的，这也是我三月份最值得拿出来告诉你的一件事情。</p>
<hr>
<h2 id="为什么要学习历史">为什么要学习历史</h2><p>多年以前读任志刚老师的《为什么是毛泽东》，有过这么一个感受。</p>
<p>就是毛泽东思想跟中国革命的关系，其本质上，是马克思主义的真理和中国具体国情相结合产生的，一个互相辩证的关系。</p>
<p>这种结合很有意思，你会发现，如果只从世界史，或者只从中国近代史这两个角度的其中一个去看，难免会产生一些基本的错误，比如会以为中国今天的一切成就似乎都是理所应当的。</p>
<p>但其实，要想真正地了解毛泽东的伟大，需要深刻地结合世界近代史和中国近代史，脱离其一都不行。</p>
<p>例如当时毛泽东在全球殖民体系瓦解的关键阶段，提出“<strong>农村包围城市</strong>”的道路，他非常清楚中国革命不光是中国自身的事，也是世界的事，即“中国革命是世界革命的一部分”。</p>
<p>当同时期的印度还在实行非暴力不合作运动的时候，毛泽东就在这个世界革命的背景下，将马克思主义暴力革命理论跟殖民地半殖民地国家实际结合，推广土改、群众路线、统一人民战线，这种理论创新，也直接影响了越南、古巴等国的革命进程。</p>
<p>你看，如果你学习全球史，其实是可以避免从单一的角度去思考类似的问题的。</p>
<p>但是对于绝大多数人，学习历史、了解历史，最起码可以知道，我从哪里来，我属于哪一个群体，我可以从历史中找到一个属于自己的认同感，对吧，没有基础的历史知识，我们可是会被说“数典忘祖”的。</p>
<h2 id="从历史中寻认同">从历史中寻认同</h2><p>对我自己来说，了解自己的姓氏和祖源，可以帮助我探寻自己的名族认同，我可以知道我的祖先是谁，他们什么时候在这片土地生根发芽、繁衍后代，以及在他们身上，都发生过那些故事。</p>
<p>我姓李，全国第二大姓，我知道在宋朝的时候有一个官员叫李火德，他是部分李氏的始祖，1232 年，他考取进士，在福建宁化一代当官，直到年迈，整个人生也没有什么特别伟大的壮举，为官清廉，作风朴素。</p>
<p>但有一点值得拿出来说，就是他跟原配是没有子嗣的，一直平平淡淡、恩爱的生活到晚年，这也让他受到了不少的偏见。在他六十三岁的时候，他的夫人就怂恿他，想办法给他取了一个“小老婆”——陈氏，这个“小老婆”当时可才十九岁。</p>
<p>之后的九年里，李火德跟这个陈氏，一共生了三个儿子和两个女儿，这年纪还能生育，挺厉害的对吧。于是在那之后，李火德的后代就开始呈现指数级的增长，遍地开花。</p>
<p>在他的第九世，也就是他孙子的孙子的孙子，到了华昌公这一代，迁徙到了现今梅州石扇一代，现如今，华昌公的墓地早已被当地村民盖了房子。</p>
<p>到了清康熙三年，也就是 1664 年，其后代的其中一条支线又分迁到了石窟河下游的南岸，在这开基定居，这个地方叫湖秋墩，村民大概三百多户，这也是我的故乡。</p>
<p>你看，了解历史，我可以知道我的来源，通过溯源，知道自己是李火德的第二十七世，也知道自己是唐太宗李世民的第五十四世。</p>
<p>如今南方地区李氏的绝大多数人都是李火德的后代，但并不是所有人都知道自己从哪里来，自己的根在哪里。</p>
<h2 id="从历史中找答案">从历史中找答案</h2><p>其实我们都有一个基本的认知，就是现代文明是在过去历史的基础上，经过层层积淀、逐步发展而来的结果，历史的经验教训是可以给现代社会提供参考价值的。</p>
<p>当然，历史也并不完全能够一对一、一个萝卜一个坑的给你提供经验，让你可以直接使用去应付未来发生的事情，它能提供的，是一个「参考答案」，绝非是「标准答案」。</p>
<p>刚开始推广实行“垃圾分类”的时候，上海静安区的社区工作人员想了这么一个招，就是将“垃圾分类”变成了沪剧——《垃圾要回家》，然后开始在社区巡演，于是对于垃圾分类这件事情，居民的参与率居然从 60%提升至了 92%。</p>
<p>你说这是怎么想出来的办法？翻翻历史就知道了，延安时期的时候，共产党为了推广土改，破除封建迷信等陋习，就是将这些东西改变成了大家喜闻乐见的秧歌、戏剧等形式，才得以顺利开展，这难道不是一个很好的参考答案嘛？</p>
<p>另外，多读历史还有一个好处，多读一些命运比较坎坷的名人的传记，你会发现，自己遇到的很多所谓的“艰难困苦”，真的只是鸡毛蒜皮的小事儿。</p>
<h2 id="最后总结">最后总结</h2><ul>
<li>得到新课程《全球史高级研修班》值得推荐，感兴趣的可以去看看。</li>
<li>历史具有周期性，拥有全球史的视角，可以帮助你突破单一维度的认知局限。</li>
<li>历史认同是名族文化传承的根基，学习历史可以避免“数典忘祖”。</li>
<li>历史经验具有创造性转化的应用价值，历史本身就是理解现实的坐标系。</li>
</ul>
]]></content:encoded>
      <pubDate>Mon, 31 Mar 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202503-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[九月｜关于“大多数人不会理财”这个事实]]></title>
      <link>https://moya.plus/article/202509-mouth-end</link>
      <description><![CDATA[投资最重要的是什么都不做。在投资的世界里，赚钱是不靠努力的。]]></description>
      <content:encoded><![CDATA[<p>前一阵子看到的消息，香港汇丰已经全面停止了对内地居民开设汇丰 One 账户的申请，这意味着内地用户过香港开设零门槛的汇丰 One 账户将成为历史，汇丰也仅保留高净值客户专属的卓越理财通道。</p>
<p>也就是说，对于那些想通过开港卡投资港美股的投资者而言，这一条路变得困难了一些。</p>
<p>我是在今年 2 月份赴港开了一张汇丰 One，后面也开了扣账卡，并陆续持有了小米、苹果等公司的股票。</p>
<p>我印象特别深刻，由于导航的一些问题，我到汇丰办理地点的时候，已经超过我之前预约的时间了，但汇丰的经理还是给予了很热情地进行了接待。</p>
<p>面签过程中会问到开卡后的用途，我说日常消费和投资，他也顺带嘴的问了一句，他说：你觉得投资最重要的是什么？</p>
<p>我回答：“<strong>最重要的事情？那当然是投资后什么都不做</strong>”。</p>
<p>对，在<strong>投资的世界里，赚钱是不靠努力的</strong>，“什么都不做”不光是最重要的事情，而且也是最难的一件事情。</p>
<p>我在之前的文章里分享过一个认知，就是在投资理财这件事，运气占主导，而非技能。即便你的理财技能再强，也有运气不好而导致失败的时候，而且这个运气不好的情况，还可能非常的多。</p>
<p>绝大多数不会理财的人呢，都是在这件事上花了过多的技能，有多少投资者是在那天天盯盘，研究这个琢磨那个，各种分析和预测，到最后花了大量的时间和精力，也没挣到有多少的收益。</p>
<p>他们喜欢玩“短线操作”，希望买入一只股票后，明天就得涨，跌了就骂，动不动就加杠杆，对投资这件需要长期主义才能胜利的事情，缺乏足够的耐心。</p>
<p>你看，<strong>很多道理，讲一遍是没有用的</strong>。他们把“努力就能成”的思维，带进了一个“运气占大头”的游戏里。</p>
<p>这其实很容易理解，你看我们从小接受的教育都是在告诉我们，任何事情只要通过“刻意训练”，那就大概率能做成，但投资这件事跟抛硬币一样，不会因为你抛出的次数积累而改变它某一面朝上的概率。</p>
<p>我不得不承认，在最开始投资基金的时候，我也是这样的心态，代价就是超心理预期的本金亏损，简直是“傻的没边”。于是从那之后我开始训练自己的理财能力——什么都不做。</p>
<p>如果一件事情在我能力范围之内，那我肯定做，但是一个东西明天涨还是跌，明显在我的能力范围之外，<strong>既然我无法改变，那就从容的接受它。</strong></p>
<p>我翻了翻我的阅读笔记，找到了这句话，我觉得非常适合每一个投资者：</p>
<blockquote>
<p>愿上帝赐予我从容去接受我不能改变的，</p>
<p>赐予我勇气去改变我可以改变的，</p>
<p>并赐予我智慧去分辨这两者间的区别。</p>
</blockquote>
<p>我从“什么都不做”之后，不仅回正了以往错误操作导致的亏损，并且这几年的整体收益也维持在了 20% 以上。</p>
<p>更重要的，是我在投资理财这件事情上，几乎没有任何成本——买完我就不看了，涨跌也不关心，不占用自己的情绪，我可以腾出更多的时间和精力去做那些“技能”主导的事情上。</p>
<p>投资的定义，是将当前的购买力在当下转移给其他人，并有理由期望他在未来可以给我带来更高的购买力，如果你足够信任这个人，那最好的操作，可不就是什么都不做嘛，非要有操作，那有且只有一个，就是**“定投”**。</p>
<p><strong>如果一个投资项目需要你不停地努力操作，一定程度上，你就是不相信这家公司可以给带来预期的收益，很可能你从一开始，就不应该进入。</strong></p>
<p>作为一个普通人，你只能选择那些可以长期投资、长期持有的投资项目，这才是万无一失的选择，要尽可能的“长期持有”，而不是“半途而废”，心态和情绪不跟着涨跌起伏，这是最基本的理财态度。</p>
<p>很多人说自己不会理财，总是在投资的世界里亏钱，把股市比喻成“赌场”，抱怨这么重要的东西，学校、老师、父母都不教。但是如果你问他：大概坚持多少天，或者本金亏损多少，你可能会选择放弃？他们很多人都可以给出准确的预估，有些可能短期内没挣到钱就放弃了。</p>
<p>你看，“学校里没教”并不是理由，因为学校里教的他们也没全学会——“耐心”可是做任何事情都需要具备的品质，“半途而废”可是小学就学过的成语，“复利”的计算也仅需要一点加法和乘法而已。</p>
]]></content:encoded>
      <pubDate>Tue, 30 Sep 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202509-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[二月｜希望到底是什么样的一个东西]]></title>
      <link>https://moya.plus/article/202502-mouth-end</link>
      <description><![CDATA[所谓希望，是相信明天会因今天的努力而变得更好。乐观不是天生的，而是一种选择和能力。]]></description>
      <content:encoded><![CDATA[<p>去年的这个时候，我发了一篇文章，题目是：乐观的设想，悲观的计划，愉快的执行。</p>
<p>里面有一句话：<strong>我们大多数人并不清楚自己想要什么，但有意思的是，又非常清楚自己不想要什么。</strong></p>
<p>对，人类大概是地球上唯一会反向操作的物种了吧，二十岁前脱口而出不想要什么，三十岁后却支支吾吾说不出想要什么。</p>
<p>我们往往对于自己想要的东西没有一个明确的定义，更多时候，是根本不知道自己想要什么，也就是不知道什么是自己的「刚需」。</p>
<p>绝大多数人追求财富自由，自以为「挣钱」才是的刚需，而实际上「花钱」才是他们真正的刚需，不信你看他们经常挂在嘴边的一句话就知道了——“当我有了钱，我就 xxx”。</p>
<p>同样，很多人对于“希望”的定义也是不明确的，你要知道，一个人如果对某样东西没有足够明确、清晰、且准确的概念的话，往往是越努力，其结果越糟糕。</p>
<p><strong>所谓希望，无非是一个人相信自己的明天会因为今天的努力而变得更好。</strong></p>
<p>看起来很简单的一句话对吧，但是很少有人可以准确地描述它：希望得是相信未来比现在更好，把自己的当下跟看不到的未来产生差距，这个差距得是「更好」的，最重要的——是因为自己的努力，跟别人没有关系，别人的世界变得更好跟咱半毛钱关系都没有。</p>
<p>绝大多数人都忽略了自己的努力，盲目的把希望寄托在除了自己的其他事物或者人身上，他们也并未学会怎么“呵护自己的希望”，随便一阵轻风，或者路过的人走的快了一些，就把自己希望的烛光扑灭了。</p>
<p>因此，呵护自己希望最好的方式，就是保持乐观，有时候，甚至是“盲目地乐观”。事实上，<strong>乐观并不是天生的，而是一种选择，是一种能力，一种相信明天会更好的选择和能力。</strong></p>
<p>那为什么要“盲目的乐观”？</p>
<p>你要知道，在现在的社会，只要你在进步，过得比别人好，那么就会有无数的人冒出来打击你，嘲讽你，甚至暗害你，只要有机会，他们就恨不得把你的乐观心态都弄成徒劳，让你的希望破灭。</p>
<p>所以，不要用尚未发生的结果去表现、去证明自己，要时刻呵护自己的希望，不被外界影响，长期持续的行动，大概率是会带来预期结果的，即便没有，那也大概率是运气不好的原因，并不是自己不够努力造成的。</p>
<p>「希望」是自己对时间的敬畏，我们每时每刻都在酿造未来的酒，种未来的树， 我们不知道什么时候可以启封，什么时候可以吃到果子，但每一个发酵的过程、施肥浇水的劳动，都一一作数。</p>
<p>电视剧《士兵突击》有句经典台词——“只要今天比昨天好，这不就是希望吗？”，今后，在这句话后面再补一句：“<strong>因为自己的努力</strong>”。</p>
]]></content:encoded>
      <pubDate>Fri, 28 Feb 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202502-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[五月｜那些宝贵的人生建议]]></title>
      <link>https://moya.plus/article/202505-mouth-end</link>
      <description><![CDATA[你并不需要更多时间，因为你已经拥有了所有时间；你需要的是更专注。保护好你效率最高的那段时间。]]></description>
      <content:encoded><![CDATA[<p>许多年前读过凯文凯利的一本书，叫做《宝贵的人生建议》，里面都是一些他写给子女的一些“人生建议”，对，就是老一辈的人能够教给晚辈的一些人生经验、价值观和美德。</p>
<p>这本书很不怎么厚，内容并不多，更像是一个答案之书，随手翻开，或许就可以解决你当下遇到的问题。</p>
<p>其中有几条建议，我觉得非常好，说的太对了，它们一直躺在我的笔记里，这个月的最后一天，我把它们拿出来，分享给你。</p>
<p><strong>如果你陷于人生困境，去一个你从未听说过的地方旅行。</strong></p>
<p>我想，旅行的意义不在于去多远的地方，不见得就得提前做好攻略，准备好一堆东西，买张机票，然后到另一个地方拍个照打个卡。</p>
<p>旅行最大的意义在于，一个陌生环境对人的治愈机制，一个“从未听说过的地方”，可以是世界的尽头，也可以是你所在城市的某个角落。</p>
<p>当你处在一个陌生的地方，看着陌生的地图，吃着不怎么熟悉的食物，跟陌生的人交流时，大脑会被迫的从当下困境中抽离出来，转向对当下体验的专注。这种“感官觉醒”会触发大脑的奖赏系统，分泌多巴胺，缓解焦虑情绪。</p>
<hr>
<p><strong>人生中只有很少的遗憾，是遗憾自己做了什么。几乎所有的遗憾都是遗憾自己没有做什么。</strong></p>
<p>绝大多数人经常挂在嘴边的一句话是：“如果我当时 ____ 就好了...”。</p>
<blockquote>
<p>如果我高中再努力一点就好了...</p>
<p>如果我当时诚恳的道歉就好了...</p>
<p>如果我当时再退一步就好了...</p>
<p>如果我当时投资比特币就好了...</p>
</blockquote>
<p>人生中的每一个阶段，都会有类似“拍断大腿”的遗憾，几乎所有的遗憾，都是因为各种各样的原因，而没有去做的事情，只有极少数是遗憾自己做了什么。</p>
<p>所以，以后在面对选择“做，还是不做”的时候，尽可能的选择去做，这样以后留下遗憾的概率也会小很多。</p>
<p><strong>写出一本好书的唯一方法是，先写一本糟糕的书。</strong></p>
<p>互联网从业者都知道一个词，叫“迭代”，其含义是指上一次的输出作为下一次的输入，往复叠加，最终慢慢成型的一个过程。</p>
<p>人也一样，没有人可以在一件事情上第一次就完成的非常完美，都是在上一次的基础上，慢慢积累经验和技能，才能把事情做好的。你所能看见的所有成事的人，背后可能是更多的失败经历——人家只是不愿意告诉你而已。</p>
<p>所以这条建议对我来说最大的启示在于，做任何事，允许自己犯错，不要指望一次就做好，对自己有足够的宽容，但不能纵容，允许犯错，但不允许接二连三的错。</p>
<p><strong>找出一天中你效率最高的时间段，并保护好那段时间。</strong></p>
<p>拿我自个举例，我效率最高的时间段是在早上醒来到上午 10 点左右，这段时间通常精神饱满，精力充沛，特别适合工作和学习，相信很多人也是一样。</p>
<p>但是绝大多数人是如何处理这段时间的？我知道有不少是浪费在了通勤上，特别是在一线城市，上班通勤半小时以上的不在少数。</p>
<p>但更多的人，是选择把这段时间给“睡”了，不信你看看周围多少人是晚上一二点才睡，早上八点多才醒的，醒来也没时间弄个早餐就上班了，到了公司一边啃着早餐一边浪费剩下的高效率时间。</p>
<p>我们正常上班时间是九点，但我经常八点不到就到公司，这么早干嘛？就是为了保护这段效率最高的时间。</p>
<p>其实只要你能算明白账就知道了，每天哪怕只有半小时的时间，一年下来，按照 8 小时工作制算，也有整整的一个月的时间，请问，这一个月你干什么干不成？</p>
<p><strong>你并不需要更多时间，因为你已经拥有了你的所有时间；你需要的是更专注。</strong></p>
<p>很多人都想成为一个时间管理的高手，但问题是，时间是不可能被管理的，每个人的时间总量都一样，不可能多，也不可能少，谁都没办法管理时间，只能尝试和时间做朋友，让它为你所用。</p>
<p>而注意力是可以被管理的，注意力是比时间和金钱还要宝贵的基础生产资料，且每个人都拥有。而绝大多数人是如何管理自己的注意力的——他们把自己的注意力廉价的卖了出去。</p>
<p>你仔细想想是不是这么回事，大多数人把数量本就不多的注意力，都拿来刷短视频、玩游戏、聊天八卦、上班摸鱼，然后还希望自己可以事业有成，有朝一日实现财富自由——这怎么可能嘛！</p>
<p>话说这个世界一直都存在着一种简单且长期有效的商业模式，就是把大量的注意力以廉价的方式收集起来，再以高价卖出去（比如广告和短视频）。</p>
<p>所以你缺的时间吗？答案肯定不是，只要你想，你总能利用好你的时间，把你的注意力投入到你的成长上去，你若是胆敢不在乎你的注意力，那么你的注意力就会被无情的收割起来被卖掉。</p>
]]></content:encoded>
      <pubDate>Sat, 31 May 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202505-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[八月｜未来邮局 F.P.O 上线！]]></title>
      <link>https://moya.plus/article/202508-mouth-end</link>
      <description><![CDATA[十年前寄出的32封信，是对过去的自己一个轻声的回应；十年后，再给未来留下一颗种子。]]></description>
      <content:encoded><![CDATA[<p>12 天前，2025 年的 8 月 19 号，农历六月二十六，这一天，我开发的未来邮局 F.P.O 第一版上线。</p>
<p>上线第一天，寄出了 32 封来自十年前的信，这 32 封信，跟随了我十年，十年后，我终于如数寄出，到他们每一个人的手上。</p>
<p>这一天，访问次数（PV）是 145 次，访问用户数（UV）是 64，新增用户：2 个。</p>
<p>这件事做了也就罢了，不做，在我心里永远是个不大不小的遗憾。因为这已经不是一个什么遵守承诺相关的东西了，而是我对十年前的自己，一个轻声的回应。</p>
<p>未来邮局在不断的迭代和优化，我也会投入不少精力在这件事上，给十年后的自己，留下一颗种子，等待十年后开枝散叶，给这颗种子，一个轻声的回应。</p>
<p>所以八月的最后一天，我也想分享下未来邮局背后的一些故事，以及一些设计细节。</p>
<h2 id="照片-photo">照片 Photo</h2><p>十年前，2015 年的 8 月，高中毕业后的暑假，我向班里的同学发起了一个活动，主题叫做“给十年后的自己”，后面也陆续收到了 32 封他们写给未来的信。</p>
<p>在 32 封信件的活动页，放了一张当时班里拍摄的一张集体照，之所以选择这一张照片，是因为这是我们唯一一张正经拍摄、人数最全的照片。</p>
<p><img src="https://cos.moya.plus/article/assets/1784290092739-16-pic@4x-(1).jpg" alt="1784290092739-16-pic@4x-(1)" loading="lazy">
那是距离高考不到 100 天的一节体育课，当时正值实习的体育老师，在临近下课集合的时候，给我们拍摄了这张照片。当时的天气其实还不错，不过加了几层滤镜，让这张照片显得更有年代感，更值得回味。</p>
<p>我们在十年后几乎都换了个模样，十年的时间，身体的细胞早已全量更新了一次，我们这些人，后来成为了的护士、程序员、老师、创业者、孩子的爸妈。</p>
<h2 id="单号-no">单号 No</h2><p>跟常规单号规则不同，这 32 封信，都有一个唯一的信件单号，前缀均是 GMMZZX201516，也就是广东梅州中学，2015 届 16 班，再后面两位，是他们的座位号。</p>
<p>我在高中时期当了三年的劳动委员，到了要大扫除的时候，我就会在草稿纸上记上迟到人员的座号，每迟到一个，我就写一个，时间长了，就导致我现在都还记得他们每个人对应的座号。
<img src="https://cos.moya.plus/article/assets/1784290112468-IMG_1533.jpg" alt="1784290112468-IMG_1533" loading="lazy">
这是我们在学生时期的一个身份 ID，是人生某个时间段内，自己身体的一部分，这些唯一单号也是。</p>
<h2 id="卡片-card">卡片 Card</h2><p>除了可以查看信件内容，我也给这 32 封信设计了 32 张卡片，将信件信息以卡片的形式展现，也方便保存，如果你仔细看，会发现卡片背景有他们各自名字的首拼。</p>
<p><img src="https://cos.moya.plus/article/assets/1784290136898-image-(3).png" alt="1784290136898-image-(3)" loading="lazy"></p>
<p>这些卡片的设计，没有用到任何 AI 辅助，就是写代码累了就这画一笔，那画一笔，改来改去，最终确定了最后的卡片样式。</p>
]]></content:encoded>
      <pubDate>Sun, 31 Aug 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202508-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[六月｜所谓的自律，无非是驾驭好你的多巴胺]]></title>
      <link>https://moya.plus/article/202506-mouth-end</link>
      <description><![CDATA[真正的自律不是消灭欲望，而是驾驭多巴胺、学会延迟满足。谁赢得了早晨，谁就赢得了一天。]]></description>
      <content:encoded><![CDATA[<p><strong>我是个极其无趣的人</strong>——这是很多身边人对我的一致看法。</p>
<p>在他们眼里，我像老人一样早睡早起，自律，即不社交，也不聚会，不爱说话，没酒肉朋友，生活中缺乏趣味。好像看起来我活得很痛苦，也有人说我跟修仙一样，怎么看都不像是这个年纪和这个环境应该有的样子。</p>
<p>2025 年已过一半，这个月，我想和你聊聊关于「自律」。</p>
<h3 id="驾驭好你的多巴胺">驾驭好你的多巴胺</h3><p>前一阵子读刘润老师的文章，他说，“<strong>所谓的自律，无非是驾驭好你的多巴胺</strong>”。</p>
<p>多巴胺是什么？这是一种由人类大脑分泌的神经递质，它在传递神经信号中起重要作用，能让人产生愉悦感和满足感。当人们体验到积极的情绪时，比如享受美食、进行运动、参与社交活动或从事自己喜欢的事情时，大脑会释放多巴胺，这种神经递质的释放，通常会让人感受到快乐和奖励。</p>
<p>总有人天天在喊，要自律，要自律。可是，自律本身就是一件反人性的事情啊，不自律才是「正常」的人性表现，毕竟我们的基因就是这么设计的。</p>
<p>所以真正的自律，从来都是不是消灭自己的欲望，去做那些反人性的事情，而是<strong>训练自己可以拥有“驾驭”多巴胺这种可以带来即时奖励的能力，这种能力也通常叫做——延迟满足。</strong></p>
<p>这种能力，会让你能够用理性，去掌控那些底层的、渴望即时满足的冲动。会让你能告诉自己，等会儿，那个更大的、更长远的快乐，才是我真正想要的。</p>
<p>所以，我也不是什么别人眼中的“自律”，我只是会算账，知道什么东西更重要而已。</p>
<p>能懒会床睡晚一点当然很满足，可是我知道，训练自己提升睡眠质量，然后<strong>每天早起两小时，一旦这种能力得以保持，一年下来可足足比别人多了一个月的时间，并且那可是不吃不喝不睡的一个月。</strong></p>
<p><strong>谁赢得了早晨，谁可就赢得了一天。</strong></p>
<h3 id="远离无意义的社交">远离无意义的社交</h3><p>我上一次的聚餐，还是在公司年会，将近半年的时间，我都没有在外面跟任何朋友同事有过饭局，这样的饭局，我基本一年也不会超过三次。</p>
<p>所以导致我工作这么长时间，混成了没人找我吃饭，没人找我喝酒，没人喊我聚会，微信消息都没几个。别人聚会轰趴问要不要喊上我，一旁就有人拉住说，那小子十点就睡觉了，算了吧，别打扰老人家休息。</p>
<p>我这一副看似被社会抛弃的样子，真的是我人缘变差了吗？当然不是，我心底里非常清楚，**当我不再被这些无意义的社交消耗时，我才有机会创造真正的价值。**我的人缘从来不体现在人家吃饭叫不叫你的地方。</p>
<p>所以，这哪是什么越混越差嘛，这不是真正的觉醒吗，没有人是靠无效社交活着的对吧。</p>
<p>我不聚餐，不参加酒局饭局，我避开了多少次可以让我身体变糟糕的风险，那些<strong>所谓的热闹，无非是精心设计过的表演而已。</strong></p>
<p>我拒绝无效社交，不把时间和精力浪费在人情世故、游戏、一切我看不到有收益的地方，我避开了社会中的大部分垃圾，并且把这些时间和精力归我所用。</p>
<p>不少人问过，那你乐趣都来自于哪？你这样活着我看着都累挺...</p>
<p>答：我也不知道，反正我也不靠一些廉价的快乐活着，不知道从什么时候起，那些不能给我带来收益或者成长事情，我就一点兴趣都提不起来。谁不希望通过学习获得无尽的能力，而最<strong>可怕的能力就是获得能力的能力。</strong></p>
<p>也有人问过，那你周末都去哪玩？都怎么过的？</p>
<p>答：工作或者学习，在家或者图书馆，偶尔外出旅游，但也很少偶尔。这篇文章就是周末写的，写到这的时候，是 6 月 28 号，在深圳图书馆北馆 4F，对面的大姐在看《一起去冰岛》。</p>
<p>还有人问过，你这么“无趣”，肯定没有女朋友吧。</p>
<p>答：今年领证了。</p>
]]></content:encoded>
      <pubDate>Mon, 30 Jun 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202506-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[十一月｜耐心，学校里教不会的事情]]></title>
      <link>https://moya.plus/article/202511-mouth-end</link>
      <description><![CDATA[没有耐心的人什么都干不成。在投资市场里，最重要的是避险精神，而非冒险精神。]]></description>
      <content:encoded><![CDATA[<p>过去的一个多月里，对于投资了港美股和比特币的人来说，可能过得不是很好。</p>
<p>对，这看起来好像不是什么好消息，美国政府停摆，不降息，几乎所有资金都在避险，港股美股情绪降低，比特币也跌到了 8w 美金，较十月初的高点，跌幅达到了 33%，超十万名交易者爆仓，血本无亏。</p>
<p>这对于大部分投资者来说，这是一场损失不小的灾难，我也一样，几乎把上半年的收益全给亏光了。</p>
<p>很多人都在骂、都在抱怨——这个市场烂透了，这其实也是<strong>韭菜的日常：涨了就夸，跌了就骂。</strong></p>
<p>而我什么也没有做，不仅没有因为市场的恐慌而抛售，也没有跟随下跌趋势去逢低加仓，就是这样，除了看了下收益，什么也没有做。</p>
<p>为什么？因为我对此拥有<strong>足够的耐心。</strong></p>
<p>短期的涨跌太正常不过了，比特币在过去几年回调幅度 20%以上的差不多有 10 次，平均 1-2 年一次。尽管每次都有人认为比特币要完了，但每次回调后的结果都是一次新高。</p>
<p>很多人都是如此，对待自己的投资，往往表现的毫无耐心，<strong>许多人在投资市场里赚不到钱，几乎都是拜没有耐心所赐。</strong></p>
<p>你看是不是这样，绝大多数人买完股票，就希望它下周就能涨...甚至买完之后就得涨（觉得自己抄到了底）。</p>
<p>像这样没有耐心的人，他们都更倾向于选择**“终点式思维”**，他们都希望快一点看到结果，还没开始就已经臆想到这个结果到来后的另一个世界了。</p>
<p>耐心这个东西，学校里不教，长辈也无法传授，只能靠自学，还没法直接学，必须得通过其他的“元认知”去增强自己对所有事情的耐心。</p>
<p>没有耐心的人只能想到短期收益，穷其精力去搞各种研究，做 T，短期的预测股价，这跟赌博有什么区别吗？在股票市场过度的关注估值而不是价值，甚至！他们还用上了杠杆，最大程度的增加了风险。</p>
<p>我曾经不止一次的说过我的理财操作，很简单，拿出一笔“丢了也无所谓的钱”，挑选一家自己认为可以长期创造价值的公司，买他家股票，然后什么都不做，如果非要有操作，那只有一个，就是：<strong>定投。</strong></p>
<p>就是一件极其简单的事，让我可以避免了绝大部分市场风险，什么都不做的好处是，我可以<strong>把时间和注意力都用在自己自己该做的事情上。</strong></p>
<p>什么是最该做的事情？排在第一的，肯定是<strong>学习和积累。</strong></p>
<p>只要你学习过<strong>概率</strong>，你就该知道“彩票”是一种侮辱智商的商品，几乎等同于向你要钱。</p>
<p>只要你学习过<strong>避险</strong>，你就该知道<strong>在投资市场里，最重要的是避险精神，而非冒险精神</strong>，就像极限运动员，外人看起来他们实在冒险，可对运动员来说，他们做的每一件事，其实都是在避险。</p>
<p>只要你学习过<strong>努力</strong>，你就该知道，投资是一件运气占大头的事情，他跟我们从小接受的“努力就能成功”的道理不一样，<strong>在投资的世界里，赚钱不靠努力的。</strong></p>
<p>每天打磨自己的元认知能力，培养自己的耐心，做好充足的准备，绝不是为了简单地偶遇某个大机会，而是让自己成为看得到机会并且抓住机会的人。</p>
<p>总之，<strong>没有耐心的人，什么都干不成。</strong></p>
<p>财富积累是一个长期的过程，需要自律、勤奋和足够的耐心。这世界上绝对没有快速致富的妙方。</p>
]]></content:encoded>
      <pubDate>Sun, 30 Nov 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202511-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[十二月｜我的人生首马]]></title>
      <link>https://moya.plus/article/202512-mouth-end</link>
      <description><![CDATA[42.195公里，每一步都是对自己的回应。人生首马，跑过终点才知道自己能走多远。]]></description>
      <content:encoded><![CDATA[<p><img src="https://cos.moya.plus/article/assets/1784289653135-2025-12.png" alt="1784289653135-2025-12" loading="lazy"></p>
]]></content:encoded>
      <pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202512-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[十月｜所谓运气，无非是识别并且抓住机会的能力]]></title>
      <link>https://moya.plus/article/202510-mouth-end</link>
      <description><![CDATA[相信运气是一种缺乏自制力的表现，所谓运气，无非是识别并且抓住机会的能力。]]></description>
      <content:encoded><![CDATA[<p>我们总是喜欢把一个人的成功归功于“运气”，对，你可能自己有时候也会感叹“他不过是恰巧碰到了好时机而已”，你也可能会羡慕“别人的机会怎么总是比自己多”。</p>
<p>于是，有的人可能就越发的觉得自己是个倒霉蛋，什么好事都轮不到自己，结果生活变得更加糟糕。如果一个人相信好运气，可能他的生活并不会因此变得更好或者更差，可是反过来，如果一个人一直觉得自己是个倒霉蛋，那么他的生活一定会因此变得更糟糕。</p>
<p>所以，<strong>相信运气其实是一种缺乏自制力的表现。</strong></p>
<p>细想一下，那些人真的是碰到了好时机吗？他们的真的是纯粹的“运气好”吗？不一定的。更多的人是碰到了，却识别不出来那是一个好时机、好运气。</p>
<p>我之前看到过一个热搜话题，叫做“如果重生，请记住以下时间点”，大概就是：</p>
<blockquote>
<p>1977 年，去参加高考</p>
<p>1982 年，去深圳谋生</p>
<p>1993年，用银行的钱购置上海浦东的房</p>
<p>1995年，在北京购置几套四合院</p>
<p>2001 年，买入茅台股票</p>
<p>2009 年，投资比特币</p>
<p>2018 年，投身自媒体</p>
<p>2023 年，投资黄金</p>
</blockquote>
<p>你看，所谓的很多“机会”，几乎是每个人都遇到过的，但是仅有极少的一部分人在当时认识到这是个机会，而又有极少一部分人在当时抓住了这个机会。——这哪里是什么运气好不好的问题。</p>
<p><strong>所谓运气，无非是识别并且抓住机会的能力。</strong></p>
<p>能够识别机会的人，他一定热爱学习、善于积累且对新事物充满好奇心的人。</p>
<p>而能够抓住机会的人，一定既<strong>具备洞察能力又具备极高的实践能力，两种能力缺一不可。</strong></p>
<p>倘若你真的纯靠“运气”获得了“成功”，也必须具备足够的能力，才能维持运气所得给自己带来的收益。不信你看有多少例子：某些“成功人士”早年靠运气挣的钱，最后都凭本事输掉了。</p>
<p><strong>那趋势、那机会，完全不属于心急火燎、没耐心的那帮人</strong>；那趋势、那机会明明是那些有意无意已经准备好的人的。平日里整天挂在嘴边的那句话“机会属于有准备的人”到了这个时候就好像完全没听说过似的，为什么？还不是因为平时一点积累都没有。</p>
<p>所以，不要去抱怨没有机会，抱怨自己运气不好——<strong>真正有本事的人不愁没机会</strong>（这才是真相），把努力能够获得回报的事情交给自己，把需要依靠运气的部分交给时间就行了。</p>
<p>如果碰到了“付出就有回报”的事情，那就要好好把握。</p>
<p>如果你发现了一件事情，这里的运气因素非常少，只要你投入了相应的精力和时间，就会有所产出的时候，一定要好好把握，因为这是为数不多能够最大化工作效率的机会。</p>
<p><strong>所以，永远不要抱怨“运气不好”，那是另外一群人做的事情，反正不是我们。</strong></p>
]]></content:encoded>
      <pubDate>Fri, 31 Oct 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202510-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[四月｜在投资的世界里，赚钱不靠努力]]></title>
      <link>https://moya.plus/article/202504-mouth-end</link>
      <description><![CDATA[投资是运气主导的游戏，把努力交给自己，把运气交给时间。赚钱不靠努力，靠的是"什么都不做"。]]></description>
      <content:encoded><![CDATA[<p>你有没有想过，投资的世界到底长什么样？在投资的世界里，真正决定你能否挣钱的因素是什么？</p>
<p>虽然投资这个领域很泛，可以细分成很多小领域——包括债券、基金、期货、股票、贵金属等等，我也不是什么投资专家，但不能否认的是，谁都想从里面挣到足够多的钱，获取足够多的收益。</p>
<p>现实是什么？，现实是<strong>亏钱才是绝大多数投资者的日常。</strong></p>
<p>更显而易见的是，绝大多数新人在刚步入投资领域的时候，雄赳赳气昂昂，研究这个研究那个，最后亏的负债累累——因为他们根本不知道，在<strong>投资的世界里，赚钱完全不靠努力。</strong></p>
<p>为什么会这样？</p>
<p>在我们有限的教育体系里，**有些通用的知识，越早知道越好。**这些知识，学校不教，老师不教，直到有一天你突然认识到这是你必学的之后，然后开始后悔为什么没有“早点知道”。</p>
<p>虽然我们所从事的活动大不相同，但是做成一件事，其实是有一定公式的，即：<strong>技能+运气</strong>，也就是说，<strong>所谓的成功，无非是解答题高手，做对了选择题。</strong></p>
<p>其实人们所做的每一件事情，基本都是技能和运气的组成，只不过两者所占的权重各不相同。</p>
<p><img src="https://cos.moya.plus/article/assets/1784295488777-容器-12@4x.jpg" alt="1784295488777-容器-12@4x" loading="lazy"></p>
<p>如图，我们将技能和运气按照权重从 0% 到 100%依次排列，从左往右，所需要的运气成分更大，从右往左，所需要的技能要求就越高。</p>
<p>你看到了吧，在类似下棋、运动等这类活动中，技能占了将近 100%，根本没有什么运气的空间；而在右侧，类似抛硬币这种纯靠运气的活动中，技能发挥不了什么作用，你不管怎么研究抛硬币的角度和力度，其中一面朝上的概率永远都是二分之一。</p>
<p>很容易看懂吧，在右侧，即便你的技能再强，也有运气不好而导致失败的时候，而且这个运气不好的情况，还可能非常的多。<strong>所以绝大多数投资者的困境，其实是把 &quot;努力就能成&quot; 的思维，带进了一个 &quot;运气占大头&quot; 的游戏里。</strong></p>
<p>而投资呢，其实更靠近 &quot;抛硬币&quot; 这一边！比如你精心研究三个月选中一只股，结果刚买就遇到政策变动暴跌；隔壁大爷随手买了只基金放半年，反而赶上行业风口赚了钱 —— 这就是运气在搞事情啊！</p>
<p>我们从小到大，不管是学习，还是生活，基本都是在完成左侧的事情，也就是那些更加依赖技能的活动，而投资本身是在右侧的，也就是更偏向于运气的那一部分，这个时候，只要是愿意启动你的认知去思考就会发现：</p>
<blockquote>
<p>在左侧运用右侧的策略是不对的</p>
<p>在右侧运用左侧的策略很可能是致命的...</p>
</blockquote>
<p>这就是为什么绝大多数投资者，自作聪明，尽管他们在左侧积累了大量的经验，以为这些经验在右侧同样适用，最终把自己的优势变成了劣势，因为在右侧，<strong>努力对运气的影响几乎可以忽略不计。</strong></p>
<p>在投资的世界里，赚钱是不靠努力的，最好的做法是**“什么都不做”，这不仅是最重要的事情，而且还是最难做到的事情。**</p>
<p>对于没有基本的投资常识，以及没有基础理财知识的人而言，极有可能因此而成为“韭菜”，判断自己是不是“韭菜”也很简单，就看你在投资的世界里，有没有以下任何一个想法，但凡有一个，你就是“韭菜”，确定无疑的“韭菜”</p>
<blockquote>
<p>xxx 靠谱吗，能不能涨？你觉得怎么样？</p>
<p>xxx 已经是很贵了，现在买不值得吧？</p>
<p>真倒霉，一买就跌一卖就涨！</p>
<p>你们运气真好，我运气真差</p>
<p>今天赚麻了，吃顿好的</p>
<p>今天跌麻了，心情不好，吃顿好的吧...</p>
<p>股市都是骗子...再也不玩了！</p>
</blockquote>
<p>这些想法，我也有过，很长一段时间，盲目的投资，频繁操作，天天盯着涨跌，浪费了自己宝贵的时间和注意力，要多傻 x 有多傻 x。</p>
<p>所以，在一个运气导向的事情里，拼命的注入自己的努力和勤奋，把自己打造成一个专业理论知识过硬的“散户”，是一件完全没有任何意义的事情。</p>
<p>倒不如<strong>把努力能够获得回报的事情交给自己，把需要依靠运气的部分交给时间</strong>，这才是智慧人类应该做出的选择。</p>
]]></content:encoded>
      <pubDate>Wed, 30 Apr 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202504-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[一月｜理解道理最好的方式是什么？]]></title>
      <link>https://moya.plus/article/202601-mouth-end</link>
      <description><![CDATA[理解道理最好的方式，那就是亲身经历它。坚持在42公里面前毫无意义，真正的人生含义是不犯错、长期主义、重新定义自己。]]></description>
      <content:encoded><![CDATA[<p>我们小时候大概率都听过这么一句话，叫“人生是场马拉松，不要在意一时的输赢快慢，也不要在意起点的位置，谁能撑到最后，谁就是胜利者”。</p>
<p>这样类似的话，我听过好多版本，可是那时候的自己，什么是马拉松都不知道，只知道是长跑，跑多远，不知道，更没跑过，可能跟你说这个道理的人也没跑过，然后跟你说你的人生是场马拉松...</p>
<p>所以我只能尝试从字面理解这背后的含义——坚持？对，应该就是坚持吧...</p>
<p><strong>未亲身经历一件事情，是不可能理解到背后的真正含义的。</strong></p>
<p>我有几年的跑步习惯，终于在我三十岁前报名并中签了一场马拉松，我不是专业的运动员，也没有任何专业的训练计划，我更不知道我能不能完赛 42.195 公里。</p>
<p>我按照我平时跑步的配速，再预估了一些意外情况，给自己定了一个目标：5 小时内安全完赛。</p>
<p>我很清楚，不管我能不能跑完，只要我一上赛道，我就可以亲身体验“人生是场马拉松”这句话的真正含义。</p>
<p>真的是「坚持」两个字吗？</p>
<p>当然不是，坚持在 42 公里面前毫无意义，坚持下去能怎样？等你跑完颁奖仪式都已经结束了，你顶多可以获得一个完赛奖牌和完赛包，里面有瓶饮料有根香蕉，没了。</p>
<p>而且硬抗下去的话，可能意味着受伤，可能意味着造成不可挽回的身体伤害，所以实在不行，该退出就退出，上收容车并不丢人，马拉松的真正含义不是坚持。</p>
<p>理解道理最好的方式，那就是亲身经历它。</p>
<p><strong>跑马拉松背后的真正的人生含义，是不犯错，是长期主义，是重新定义自己。</strong></p>
<p>在马拉松赛场上，不犯错误是完赛的基本条件，你肯定不希望在赛道上频繁上厕所或者出现肠胃不舒服的情况吧；人这一生也是，不犯错是能跑得远跑得久的基本条件，任何一个错误的选择都可能会耽误你很长时间。</p>
<p>戒掉无效社交，戒掉坏习惯，训练自己的「避险」精神，才是人生得以长久发展的基础条件。</p>
<p>跑马拉松是一件长期主义的事，马拉松不是简单的跑 42 个 1 公里，这需要你有刻苦的训练，足够的跑量储备，基本能完赛马拉松的跑者，月跑量都在 200km 以上。</p>
<p>更重要的，是你有机会重新定义自己，跑马拉松是绝大部分普通人可以证明自己的机会，这个证明不是给谁看，是给自己看的。</p>
<p>你完全可以将自己认为不可能的事变成可能，如果你自卑，那就去试试看，如果你人生不如意，那就去试试看，如果有人瞧不起你，那更要试试看，当你可以安全完赛马拉松，跨过 42.195 终点线的一刻，<strong>我看谁还敢说你弱不禁风吃不了苦</strong>。</p>
]]></content:encoded>
      <pubDate>Sat, 31 Jan 2026 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202601-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[三月｜马拉松，真的是极限运动吗]]></title>
      <link>https://moya.plus/article/202603-mouth-end</link>
      <description><![CDATA[跑马拉松不是目的，目的是要拥有一个可以跑马拉松的身体。只关注心率和身体舒适度，而非配速和距离。]]></description>
      <content:encoded><![CDATA[<p>一个星期前的晚上，我在跟同事跑完步回家后，看到了张雪峰老师离世的消息，离世原因是：<strong>心源性猝死</strong>。</p>
<p>实在难以置信，虽然我没有考研，熟悉他也是在高考之后，但他的演讲也确实不止一次的激励过我。我第一次跑马拉松，看到30公里标识牌的时候，想起的也全是他的话。</p>
<p>每次有类似新闻出现的时候，总会有一堆人出来贬低跑步和马拉松，认为这是一项极限、反人类的运动，是会死人的，普通人绝对不要轻易尝试。</p>
<p>真的很讨厌这些因噎废食的结论，<strong>总有人觉得跑步猝死的概率很大，然后给自己一个心安理得不去运动的借口。</strong></p>
<p>事实上，<strong>马拉松猝死的概率仅为0.44-1.54例/10万人</strong>，而全国普通人心源性猝死的概率大概是40例/10万人，将近高出70倍，更值得注意的是，长期久坐不动人群的猝死风险，是规律运动人群的5倍以上，<strong>长期规律跑步，反而能降低心血管死亡的概率。</strong></p>
<p>作为大众业余跑者，我想告诉你的是，在全球专业的运动分类中，马拉松压根就没被划入“极限运动”的范畴，它的定义是高风险、高技术、高容错的运动。</p>
<p>对普通人而言，马拉松就是一个全面健身项目，因为我们压根也不是专业的运动员，不是为了竞赛，更不可能有机会能够站在领奖台上。那些在马拉松赛场的猝死事件，本质都是<strong>潜在基础心脏疾病+不当运动行为叠加</strong>的结果。</p>
<p>我的跑步建议是，要规律，要适度，<strong>只关注心率和身体舒适度，而非配速和距离</strong>，这是一个突破自己，让自己身体变得更好的运动，而不是一时半会在朋友圈炫耀的资本。<strong>跑马拉松不是目的，目的是要拥有一个可以跑马拉松的身体</strong>。</p>
<p>而且，跑步不光是对身体的锻炼，同时也是对大脑的锻炼。</p>
<p>西班牙的一个研究团队曾发表过一项研究。他们发现人们在跑完马拉松后，大脑中“髓鞘”，也就是大脑中的一种包裹在神经突触外面的结构水平有所下降。</p>
<p>跑完马拉松后，人的髓鞘减少了25%左右。因为人在长跑的时候，主要靠消耗糖原来提供能量，但当肌肉中的糖原耗尽时，身体会开始消耗脂肪。</p>
<p>他们的研究证明，在人体极限状态下，大脑中的脂肪很可能也会变成其燃料。没错，<strong>马拉松，是一项很“烧脑”的运动，这真的就是字面意思上的烧脑。</strong></p>
<p>那这可以说明长跑会伤害大脑吗？并不能。</p>
<p>长跑对髓鞘的消耗是可逆的。根据研究人员发现，两个月后，这些马拉松选手大脑中的髓鞘又恢复到了原本的水平。</p>
<p>而且，长跑对髓鞘的短暂消耗是个好事。本质就是大脑在极限运动时动用了自己的“战略储备”，然后又迅速补充回来，这个过程会锻炼大脑的新陈代谢机制。</p>
<p>就相当于是那些经历过大起大落的人，心理韧性会变强。而经常长跑的人，大脑的韧性会变强。<strong>假如你觉得长跑之后脑子更清醒、更敏锐、更豁达，这并不是错觉，而是大脑的新陈代谢机制在变强。</strong></p>
]]></content:encoded>
      <pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202603-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[二月｜人生没有绝对的绝境，哪怕命运给了你最烂的剧本]]></title>
      <link>https://moya.plus/article/202602-mouth-end</link>
      <description><![CDATA[哪怕在最身不由己的处境里，人依然有选择向善、选择认错、选择重新开始的权力。人生没有绝对的绝境。]]></description>
      <content:encoded><![CDATA[<p>一月份去北京，逛故宫的时候，我总是会想到一个人，对，他就是溥仪，中国最后一个皇帝。</p>
<p>我走在皇宫里，看到那些被锯掉的的门槛，脑子里浮现着溥仪骑着自行车的画面，这么一个传奇人物的生平经历就这么一帧帧的在我脑海闪过。</p>
<p>1908 年，溥仪三岁当了皇帝，直到 1912 年退位，1924 年离开紫禁城后还做了一段傀儡皇帝直到 1945 年日本投降被捕。新中国成立后被监禁在抚顺，1959 年获特赦，担任中央文史研究馆馆员等职务，1967 年在北京因尿毒症逝世，享年 61 岁。</p>
<ul>
<li>他极致的命运起伏，也是中国近现代史的一个缩影，我想对此有更深入的了解，于是回来之后我把《我的前半生》这本书又看了一遍。八月｜未来邮局 F.P.O 上线！</li>
</ul>
<p>所以二月份，我想向你推荐这本溥仪的自传——《我的前半生》，给你几个读这本书的理由，以及适合读这本书的人群。</p>
<hr>
<p>理由之一，这可是中国两千多年帝制史上，唯一一部由皇帝本人撰写、完整记录自己从登基到退位、从帝王到平民全人生轨迹的自传。</p>
<p>溥仪的一生，经历了晚清、民国、伪满、新中国四大历史阶段，更是慈禧和光绪去世、宣统登基、张勋复辟、冯玉祥逼宫、九一八事变、伪满建国、日本投降、战犯特赦等重大历史事件的核心当事人，如果你要了解这些关键事件的历史，这本书无可厚非是首选。</p>
<p>理由之二，极致的人生落差，从末日皇帝到平民百姓，从九五至尊到叛国战犯，整本书溥仪都没有美化自己的过去，也没有卖惨博同情，更多的是苛刻的自我批评、自我反思。这种毫无保留的自我剖析，能让读这本书的人看见权力对一个人的影响，也能看见普通人都有的挣扎和执念。</p>
<p>理由之三，给身处低谷的人极致的精神力量。这本书最珍贵的意义，是当一个人的命运被彻底裹挟的时候，还有没有选择的权力，溥仪的一生，看似全程被历史洪流推着走，没有自主的余地，但书里清晰地写了他的每一次主动选择：为了复辟皇权，他主动选择投靠日本；为了逃避罪责，他主动选择隐瞒过往；为了获得新生，他主动选择认罪、学习、劳动、改造。这本书告诉读者，<strong>哪怕在最身不由己的处境里，人依然有选择向善、选择认错、选择重新开始的权力。</strong></p>
<p>这本书适合什么群体去阅读，首先，如果你是中国近代史的爱好者和研究者，这本书一定是绕不开的经典，包含了大量的正史、档案和心理活动，是历史研究的一手核心资料。</p>
<p>其次，如果你喜欢人物传记，喜欢真实的人生故事，这本书的戏剧性和冲击力你一定会喜欢，虽然没有华丽的文字和特意的套路，但全是最真实、最赤裸的人性剖析。</p>
<p>最后，如果你处在人生低谷，面临人生的重大转折，这本书或许能给你极强的精神共鸣与力量。溥仪用自己的一生证明：人生没有绝对的绝境**，哪怕命运给了你最烂的剧本，你依然有选择如何面对、如何翻盘的权力。**</p>
]]></content:encoded>
      <pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202602-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[五月｜自由的本质是时间自主权，财富只是工具而已。]]></title>
      <link>https://moya.plus/article/202605-mouth-end</link>
      <description><![CDATA[打翻了牛奶别蹲在那里哭，收拾干净，把杯子捡起来再倒一杯就好了。]]></description>
      <content:encoded><![CDATA[<p>最近整理得到里的笔记，看了下这两个月断断续续记下的几十条划线内容，看着看着突然发现，这其实就是我最近这段时间里，对生活、工作最鲜活的样子。</p>
<p>一、别把终点当目标，要把成长当日常</p>
<p>我们这代人好像从小就把「财富自由」当成了人生终极目标，总觉得挣足够多的钱才能够“出人头地”。</p>
<p>我目前这份烂透了的工作，看不到前景的职场环境，以及有一大堆能随时能把我替代的AI，换做是以前的我，会越来越觉得这是所谓的财富自由是件遥不可及的事情，因为我压根也挣不到足够多的钱。</p>
<p>但翻完笔记，我更加坚信这不是不可能达到的事情，因为我从一开始就很清楚财富自由的定义：所谓的个人财富自由，指的是某个人再也不用为了满足生活必需而出售自己的时间了。</p>
<p>对，自由的本质是时间自主权，财富只是工具而已。</p>
<p>很多人都没搞明白这件事情的定义，所以这辈子很难挣到“非常多”的钱（虽然我搞清楚了也暂时没有），但我知道，我的重心应该是把我的时间和注意力，当做是唯一的生产工具去对待，对它加以“生产”的动作，而不是每天8个小时去换一笔勉强维持生计的工资。</p>
<p>你发现没有，很多人挂在嘴边的一句话是：「等我赚够了钱，我就去xxx」，具体xxx是什么，你尽管想，很多。</p>
<p>反正，这一类人的目的都不是挣钱，而是花钱，花钱才是他们的终极目标，那哪还有心思去想挣钱呢。</p>
<p>二、清醒活下去，比什么都重要</p>
<p>关于工作，一句话戳醒我：「工作」是别人告诉你要做什么，「事业」是你自己告诉自己要做什么，与其总想着怎么减少花在工作上的时间，不如找到那件你愿意主动多花时间的事业。</p>
<p>我们是早上九点上班，但我差不多7点多就到了公司，为了方便通勤，我特意搬到了公司附近。我非常清晰的知道，早到的那点时间，虽然不长，一天一个多小时，但是足以让我干很多事情，不管是学习还是工作，都能获得不小的成就。</p>
<p>这其实不是累不累的问题，而是我能清醒的算好这笔账，一天比别人多一个小时，一年下来的话，那可是足足一个多月，每天8小时的，完全属于自己的时间，这笔账很划算的。</p>
<p>你再看看有多少人，搬到公司附近是为了能多睡会懒觉的。</p>
<p>很多人想创业，其实也搞错了逻辑：创业原本就是优秀的人在原有岗位没法充分施展才华才去做的事，不是单纯不想上班、想赚快钱的退路35。你努力半天，最后也不会换来一帆风顺，真正创过业的人都明白，那是一条铺满尸骨的道路。</p>
<p>三、越放过自己，越能过得开心</p>
<p>我们总容易误以为「没走的那条路开满了鲜花」，总忍不住说「要是当初选那个就好了」，但真相是，每条路都有人在后悔，哪怕换一条你选，大概率还是会有遗憾。</p>
<p>打翻了牛奶别蹲在那里哭，收拾干净，把杯子捡起来再倒一杯就好了。</p>
]]></content:encoded>
      <pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202605-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[六月｜打碎滤镜之后，我们才真正开始活着]]></title>
      <link>https://moya.plus/article/202606-mouth-end</link>
      <description><![CDATA[祛魅到最后，不是世界变糟了，而是你终于看见了世界本来的样子。在清醒的世界里，把日子过得扎实又明亮。]]></description>
      <content:encoded><![CDATA[<p>李敖先生有一条经典的祛魅心法：“美人便秘，与常人无异
哈哈，对，很多人祛魅的过程都是这样：曾经深信不疑的道理突然失效，曾经仰望的人悄然走下神坛，曾经心心念念的人，才发现不过如此。</p>
<p>成长的本质是不断认清现实，也就是一场不断持续祛魅的过程，这条路从不好走，它总要先穿过刺骨的残忍，再路过绵长的失望，最后才能抵达真正的清醒。</p>
<h2 id="祛魅的初期-是猝不及防的残忍">祛魅的初期，是猝不及防的残忍</h2><p>我们长大的过程都要经历很多次“圣诞老人时刻”，就像听了十几年圣诞故事的小孩，突然在某个冬夜撞见父母踮着脚往袜子里塞礼物。那一瞬间没有拆礼物的惊喜，只有整个童话世界轰然坍塌的错愕 —— 原来烟囱里不会爬来红衣服的老人，原来驯鹿的铃声只存在于故事里。</p>
<p>我不知道你是什么时候发现，努力未必能换来想要的结果这一残酷的事实，但这意味着你开始认清这个世界的真相，真心未必能换回真诚，好人有好报，也仅仅是一句美好的祝愿而已。</p>
<h2 id="中期-是浪漫消解的失望">中期，是浪漫消解的失望</h2><p>你听说过彼岸花吗？就是那个花语是生死相隔，惊艳了很多人整个青春的彼岸花，实际上，它的学名叫“石蒜”，田间地头随处可见，后人赋予它浪漫的花语，但滤镜一碎，只剩下平平无奇的真相。</p>
<p>所谓的网红打卡的绝美小店，食物味道平平无奇；别人朋友圈里光鲜的生活，关上门也是一地鸡毛而已；我曾经向往的光鲜职业，现在才知道背后是数不清的加班、绩效和内耗；</p>
<p>所谓的美好，只不过是我们现实与想象的距离而已。</p>
<p>一旦凑近了看，都逃不开 “不过如此” 的失落。这种失望不尖锐，却很磨人，它一点点消解掉你对世界的浪漫滤镜，让你慢慢接受：大多数事物的本质，都是朴素甚至乏味的。</p>
<h2 id="尽头-是难得的清醒">尽头，是难得的清醒</h2><p>很多看起来光鲜亮丽的人，其实是戴着体面的面具，演着 “高风亮节” 的戏码；
有一天你终于明白，很多你拼尽全力追逐的生活，拿掉华丽的装饰，剩下的也只是鸡零狗碎的日常；
你终于懂得，很多你曾看得无比重要的东西，本质上只是被别有用心之人吹起来的泡沫 —— 看似绚丽夺目，实则一戳就破。</p>
<p>这个清醒看起来很消极，实际是认清世界后，还能积极面对的乐观；从这一刻开始，不再盲目羡慕别人的光环，因为知道光环底下也有阴影；不再执念于虚幻的期待，因为明白真实的生活本就泥沙俱下；不再为了别人定义的 “成功” 内耗，因为看清了什么才是自己真正想要的。祛魅到最后，不是世界变糟了，而是你终于看见了世界本来的样子。</p>
<p>在清醒的世界里，把日子过得扎实又明亮</p>
]]></content:encoded>
      <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202606-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[四月｜向AI提问，都有哪些技巧]]></title>
      <link>https://moya.plus/article/202604-mouth-end</link>
      <description><![CDATA[AI不是一个完美的智能工具，而是一个能力强、不怕麻烦、24小时待命的学霸实习生，你的角色就是带好它的领导。]]></description>
      <content:encoded><![CDATA[<p>前一阵子小龙虾开始大火的时候，我看到有不少人跟风去装了，然后发现对自己没什么实际的作用，没多久又把它给卸了。
这里面的绝大多数人，其实连豆包都没怎么用明白，甚至不知道怎么向AI问对问题，于是对谁都来一句：AI也就那样，回答的全是正确的废话，又臭又长。
为什么就你的AI不好用？很有可能是你压根就不会问问题，还没学会跟AI“打交道”。他跟我们人与人之间的交流不一样，你不能让它心领神会，能猜透你的意图，更重要的，是你要掌握几个跟他沟通的技巧。</p>
<h2 id="技巧一-说清楚">技巧一：说清楚</h2><p>向 AI 提问时，绝大多数人都会犯的一个错误，就是把话说不明白。
要知道，跟 AI 沟通和跟人沟通并不一样。甚至很多人在人际沟通中也常犯这个错，比如热恋中的情侣常说：“为什么你又这样做？我以为你懂我！”如果 AI 有表情，大概也是一脸愕然：我怎么就懂你了？你自己不说！</p>
<p>所以，向 AI 提问时，千万不要把你自以为的常识信息省略掉。尽可能包含 5W1H 要素，也就是：</p>
<ul>
<li>Who：目标受众是谁？</li>
<li>What：具体要做什么？</li>
<li>Why：为什么要做这件事？（帮助 AI 理解核心目标）</li>
<li>When：时间要求 / 适用场景？</li>
<li>Where：使用平台 / 环境？</li>
<li>How：输出格式 / 风格要求？</li>
</ul>
<p><img src="https://cos.moya.plus/article/assets/1784289714659-ChatGPT-Image-2026年4月30日-14_22_31.png" alt="1784289714659-ChatGPT-Image-2026年4月30日-14_22_31" loading="lazy">
切忌“帮我写个文案”，而是“帮我写一篇小红书文案，推广一款适合上班族的便携保温杯。目标受众是 25-35 岁女性白领，风格亲切可爱，突出保温 12 小时、颜值高、轻便易携带，字数控制在 200 字左右，结尾加 3 个相关话题标签”。</p>
<p>切忌“帮我制定马拉松训练计划”，而是“我下个月 28 号要参加第一次全程马拉松，请帮我制定参赛前的备赛训练计划。我今年 29 岁，男，体重 64kg，身高 174cm 左右，最长跑过 32km，月跑量大概 100km。请给我一份以每日行动为形式、目标是完赛全马的训练计划”。</p>
<p>切忌“帮我开发个图片轮播组件”，而是“你是一个有 5 年经验的前端开发工程师，擅长编写高性能、可复用的 Vue 组件。技术栈使用 Vue3 + TS。组件需支持自动播放（3 秒切换，可配置）、手动切换、循环轮播和图片懒加载；图片宽高比限定 16:9；切换动画为淡入淡出。请给我完整组件代码和示例代码，关键逻辑用中文注释”。</p>
<p>去试试看，AI 给你的绝对是两种截然不同的回答。</p>
<h2 id="技巧二-给场景">技巧二：给场景</h2><p>或者换句话说，就是角色扮演。对 AI 来说，限定一个角色和场景，比如“请扮演一个 XXX 的角色”，就这一句话，往往能大幅提升输出的专业度和针对性。</p>
<p>例如你问：“分析一下 XX 产品的优势和劣势。”它输出的结果，往往和你直接百度到的差异不大。
但如果你说：“你是一个有 10 年经验的互联网产品经理，曾主导多个千万级用户产品设计，擅长从用户视角分析问题。现在请你分析一下 XX 产品的优势和劣势。”</p>
<p>相信我，这是提升提问效率的高价值方法。让 AI 扮演一个角色，它会自动调整语气和风格，模拟这个角色的思考方式和行为。</p>
<p>常用的高价值场景例如：</p>
<ul>
<li>你是一个有 X 年经验的前端开发工程师，精通 Vue3+、TypeScript、Tailwind CSS</li>
<li>你是一个高考数学阅卷老师，熟悉高考评分标准和答题技巧</li>
<li>你是一个 HRBP，擅长招聘、绩效考核和员工关系管理</li>
<li>你是一个心理咨询师，擅长情绪疏导和压力管理</li>
</ul>
<h2 id="技巧三-举例子">技巧三：举例子</h2><p>哪怕在人与人的交流中，举例子也是非常重要的沟通方式。一个好例子，能快速帮对方降低理解成本；对 AI 也是如此。
在对话中加入适当的例子，往往能更精准地得到你想要的答案。</p>
<p>AI 的本质是模式匹配机器，它对“具体例子”的理解能力，往往强于“抽象描述”。</p>
<ul>
<li>例如“代码要简洁”，可以改成“可以用类似一行箭头函数实现，避免冗余变量声明”。</li>
<li>例如“帮我写一个风格可爱的小红书文案”，可以改成“写一个类似这样风格的小红书文案：颜值还超高，奶fufu的白色，爱了爱了✨”。</li>
</ul>
<p>同样的问题，给例子和不给例子，输出结果会很不一样。很多时候，AI 对问题的理解并不会非常深刻，哪怕你描述得很详细，也未必比直接给一个例子更有效。</p>
<h2 id="技巧四-反复问">技巧四：反复问</h2><p>绝大多数人在向 AI 提问时，都希望一次回答就精准解决问题，这显然不太现实，也反映出很多人缺乏足够耐心。</p>
<p>在同一个会话中，第一次输出很少能完全符合预期。这时你往往要做的，不是重新提问，而是基于上一次输出进行迭代式、针对性的修改。</p>
<p>例如：</p>
<ul>
<li>你说的这个我都知道了，有没有更具体的策略或可执行方案？</li>
<li>比如你提到的间歇跑，具体是什么跑法，能进一步展开说说吗？</li>
<li>能不能详细讲讲你上一步回答中 XXX 的具体要领和注意事项？</li>
<li>就这样，从一个模糊问题开始，不断迭代、追问、反复几轮，才能越来越接近你真正想要的答案。</li>
</ul>
<p>你发现了吧，AI的定义，从来都不是一个完美的智能工具，而更像是一个能力强、不怕麻烦、24小时全天候待命的学霸实习生，而你的角色，就是带好这个实习生的领导，对你的要求只有一个，就是领导力——这可是很多领导都没有的东西...
你要做的，就是把事情交代明白，给他们分配任务、验收、辅导，不断迭代，直到把事情做成。</p>
]]></content:encoded>
      <pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202604-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[2024，像老年人一样拼命投资自己]]></title>
      <link>https://moya.plus/article/2024-old-man</link>
      <description><![CDATA[一个人越到生命的尽头，就越能珍惜自己的身体。]]></description>
      <content:encoded><![CDATA[<p>曾经好几次，当我身边的人得知我的作息时间后，他们都一脸的诧异，说你怎么活的跟老年人一样，我奶都没你起得早。</p>
<p>尽管我很不愿意别人说我老，但我得为自己辩解一下，就是我之所以保持着早睡早起的作息时间，其实是因为我对待时间的态度，是跟老年人一样的，用句大白话说，我每一天都当做是最后一天去活。</p>
<p>这是我2024年的第 <strong>8</strong> 篇原创文章，跟你简单聊聊我为什么会像老年人一样，保持自己的作息。</p>
<hr>
<h3 id="越是尽头-越是珍惜">越是尽头，越是珍惜</h3><p>每次回家，我都会去人民广场，然后去后面的梅花山跑一遍，山不高，可以很轻松地跑上去。</p>
<p>每次我都能看见这么一副场景，特别普通，但却能让我不得不对此感到焦虑，话说今年回家，我又因此焦虑了一遍。</p>
<p>就是我看到，能早起晨练，爬山，跑步的人，几乎很少有年轻人，绝大部分是老年人。我每次跑到山顶，就已经看见有老人在练嗓，或者已经是在擦汗休息，按照这个时间推算，他们天还没亮就已经爬上山了。</p>
<p>对，我不难发现，<strong>一个人越到生命的尽头，就越能珍惜自己的身体。</strong></p>
<p>问你一个问题，如果你的生命只剩下最后几天的时间，你会怎么安排？</p>
<p>我想你一定会倾尽所有资源，列举出自己想做的每一件事，认真的计划每一秒要做什么，恨不得把所有时间和财富都一分不剩的花在自己身上。</p>
<p>那再来看看现在作为绝大部分年轻人的我们，都是怎么浪费自己时间的。</p>
<p>我们有太多的无效社交，我们把大量的时间浪费在对自己毫无意义的事情上；我们缺乏锻炼，但凡不用上班，就可以睡到下午再起床；我们可以把一整天的时间都花在短视频和各个游戏里面。</p>
<p>我们的生命，即便《百岁人生》这本书中提到过，我们这一代人，有 50% 的几率能活过 100 岁，那又怎样？左不过也就剩下几十年的时间，难道我们真的要到暮年的时候，才想起珍惜自己的身体，珍惜自己的时间，然后不荒废一分一秒，努力锻炼让自己可以活的更久吗？</p>
<p>都是选择睡觉八小时，为什么不能是 22:00-06:00，而非得是 02:00-10:00？如果你不能通过熬夜工作实现自己的价值，那也就完全没必要因为熬夜减少我们生命的长度。</p>
<p>何况对于年轻人来说，最佳的睡眠时长是 6-8 小时，也就是说，如果你坚持运动并保持的良好的作息习惯，从而提高你的睡眠质量，睡 6 个小时，是完全足够的。每天比别人多活 2 个小时，这笔账难道不划算吗？同样是看日出，难道早期不比熬夜好吗？</p>
<p>那为什么我们不能现在就像老年人一样，当下，现在，立即就开始，<strong>像老年人珍惜自己最后时光一样，把时间这个唯一的生产资料，让它的收益尽可能的最大化，拼了命的投资自己呢？</strong></p>
]]></content:encoded>
      <pubDate>Mon, 22 Jan 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/2024-old-man</guid>
    </item>
    <item>
      <title><![CDATA[什么是每个人都拥有、最重要、却被人忽视了的宝贵财富]]></title>
      <link>https://moya.plus/article/which-is-important</link>
      <description><![CDATA[如果你胆敢，不在乎你的注意力，那么它将会被无情的收割，然后廉价的卖掉。]]></description>
      <content:encoded><![CDATA[<p>最近在得到上学习李笑来的课程，这门课发的很早，到现在依然很受欢迎，以至于我极度后悔为什么没有早点购入学习起来，不到两百的价格，一共三百多讲，几乎可以称得上是免费。</p>
<p>所以，一边在学习中醍醐灌顶的同时，我也会偶尔把里面的几个观点，在这分享给你。注意我的描述，我不是转述，更不是洗稿，我是向你分享我觉得对你有用的东西。</p>
<p>这是我 2024 年的第 <strong>11</strong> 篇原创文章，聊聊什么是我们最宝贵的财富。</p>
<hr>
<h3 id="最宝贵的财富">最宝贵的财富</h3><p>其实说起财富这两个字，大多数人第一反应是金钱，金钱是最宝贵的财富吗？当然不是，钱不是最重要的，它毕竟是身外之物，而且可以再生；</p>
<p>是时间吗？时间固然重要，但其实也不是最重要的，本质上，时间不属于我们自己，我们也没办法去管理时间，只能试着和它做朋友，和它一起去实现某些人生价值。</p>
<p>正确答案是——注意力。</p>
<p><strong>我们的注意力，真的很稀缺</strong>，稀缺到什么程度，我们一天只有 24 小时，但是其中真正可以集中起来产生价值的注意力，可能只有两三个小时，效率低一点的，可能一两个小时都没有。</p>
<p>那奇了怪了，我们大多数的注意力都花在了什么地方？</p>
<h3 id="三个大坑">三个大坑</h3><p>李笑来总结了绝大多数人都会掉进去的<strong>三个大坑——凑热闹、随大流、还有瞎操心。</strong></p>
<p>对，我们竟然把自己最宝贵的注意力都浪费在了这三个方面，我们逐一探讨，先说说凑热闹。</p>
<p>现在上网的频率远远大于以前上街的频率，我们可以足不出户吃到各种各样的瓜。网上多热闹啊对吧，跟在大街上看热闹不同，在网上凑热闹的你完全可以舒舒服服的坐下来，喝杯咖啡，摆好姿势地围观他们。</p>
<p>最近轰轰烈烈的农夫与哇哈哈之争，有多少人打着自己爱国的旗号在凑这个热闹，他们居然就有空，把所有的好奇心和精力都花在了上面，有什么收获吗？没有。</p>
<p>关键是，这跟你有什么关系呢？你是真的没有什么正事儿可做吗？<strong>一天天闲的要死，连读书都不愿意。</strong></p>
<p>第二个大坑，是随大流。这一类人，是要比凑热闹那一堆人是要务实一些的。具体表现于，某个“趋势”出现后，心急火燎的去追随，扎堆儿创业。碍于平时根本没有任何积累，<strong>总是凑热闹，最终的结果，就是一事无成。</strong></p>
<p>事实上，任何一个趋势出现的时候，一定有一批人早就准备好了，虽然他们未必是故意准备的。如果内容创业是大趋势，那明显十年以前就开始写文字的人是最合适上场的，这个时候心急火燎的开始，怎么可能是他们的对手。</p>
<p>第三个大坑，叫瞎操心，而且是操别人的心。其实就俩字儿，闲的。</p>
<p>这个我想不必做多解释，你肯定懂，有多少月薪几千的每天在操心身价过亿的那些人的那些糟烂事儿。请问别人怎么样跟你一分钱关系吗？<strong>你的注意力确实不应该花在这种毫无价值的事情上面。</strong></p>
<h3 id="最有价值的建议">最有价值的建议</h3><p>你现在知道了，你的注意力花在哪，决定了你所有的价值。它容易被你忽视，容易掉进三个大坑里面久久不能出来，对于这个与生俱来的能力，我们最好的选择，当然是把注意力都集中花在自己身上。问题是，花在自己哪儿身上？</p>
<p><strong>答案其实非常明确，且唯一，就是「成长」。</strong></p>
<p>我很喜欢电视剧《士兵突击》里史今的一句台词：</p>
<blockquote>
<p>只要今天比昨天好，这不就是希望吗...</p>
</blockquote>
<p>每个人都一样，活着的目的就是为了成长，不管你是到了什么年纪，没有成长的生活毫无意义，这是任何一个有正确价值观正常智商的成年人都应该可以理解的一个观念。</p>
<p>广告的商业模式，其实就是吸引人们的注意力，然后把这些海量且廉价的注意力集中起来，高价卖掉。这是一种长盛不衰的商业模式，那些营销大号，各种热搜，本质都是想让你主动贡献自己的注意力。</p>
<p>所以建议就是，**如果你胆敢，不在乎你的注意力，那么它将会被无情的收割，然后廉价的卖掉。**那你可真就成了，“牺牲我一人幸福另一人”的勇士。</p>
]]></content:encoded>
      <pubDate>Wed, 26 Jun 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/which-is-important</guid>
    </item>
    <item>
      <title><![CDATA[当你遇到一扇被锁着的门，你应该去哪里找钥匙？]]></title>
      <link>https://moya.plus/article/how-you-find-thd-key</link>
      <description><![CDATA[如果方向错了，越是努力，结果可能就越糟糕。]]></description>
      <content:encoded><![CDATA[<p>当我们遇到问题的时候，我们把这个问题类比成一把上了锁的门锁，为了成功解开这把锁，我们无疑需要找到与之匹配的钥匙。</p>
<p>好，问题来了，<strong>请问，你应该去哪里找到这把钥匙。</strong></p>
<p>这是我2024年的第 <strong>16</strong> 篇文章，与你分享一把“万能钥匙”。</p>
<hr>
<p>显然这把钥匙不可能在门锁里插着对吧，否则这个锁头实际上是开的，我<strong>们所需要的那把钥匙，那就一定是在别的什么地方。</strong></p>
<p>当我们遇到问题的时候，也是一样的道理，那个急需被解决的问题，就像是被上锁的锁头，而解决办法也像钥匙一样，绝不可能在门锁里插着，否则，这就不是问题了。</p>
<p>当我们尝试去解决问题的时候，只盯着问题看、想，盯着问题找解决方案，往往是无济于事的，因为能解决问题的那把钥匙，一定是在别的地方。</p>
<p>所以我们要把注意力和时间都换个方向，<strong>如果方向错了，越是努力，结果可能就越糟糕。</strong></p>
<p>这个道理不难理解吧，可越是简单，越是没什么人可以掌握这个能力，因为这需要不断的去练习，锻炼的你的元认知能力，然后不断的实践，积累才可能存在的东西。</p>
<p>2017 年，我来到深圳求职，第一家公司，入职当天我就提了离职，原因很简单，因为完全不是自己想要的工作，而当时答应入职的理由，其实也很无奈，就是我实在是找不到工作了，病急乱投医，入职了这么一家包括老板在内只有 3 个人的小作坊，一天 80 块钱。</p>
<p>这就是我当时面临的问题，就是我无论怎么着，也没有一家公司愿意要我这么一个还没毕业且毫无实战经验的程序员，哪怕是实习。</p>
<p>傻傻的等毕业吗，这显然不是办法，在这之前所尝试过得办法，除了是让简历看起来优秀那么一点之外，就是疯狂的投，疯狂的面试，然后疯狂的落选。</p>
<p>也就是说，我明明知道我这样求职下去肯定是找不到心仪工作，还往这个错误的方向不断努力着。</p>
<p>离职的当晚，我改变了方向，把求职意向中岗位那一栏，改成了「人力资源实习生」。我想，既然找不到合适的工作，那就干脆去深入了解下怎么样才能找到适合自己的工作。</p>
<p>对，我当时的想法，其实就是想看看 HR 都是怎么招聘的，是怎么思考的。</p>
<p>后面发生的事都在意料之中，我很快就入职了前程无忧，工作内容就是给客户公司招聘人才，更幸运的是，我所接触的岗位，也几乎是我想熟悉的技术类的岗位。</p>
<p>在前程无忧实习的半年期间，我几乎每天都要看上千份的简历，给上百个候选人电话沟通，想进一起办法，尽可能地把他们挖走。</p>
<p>这一下子给我积累了大量的经验，然后我再回去看我当时的简历，那简直就是漏洞百出，毫无亮点，我再回想我的面试过程，那就是牛犊子不怕虎，直言不讳，完全是一个不会面试的状态。</p>
<p>没错，我用半年时间，学会了怎么去写好一份简历，也学会了正确的求职沟通的方法，更重要的，是我知道了自己和现实的差距有多大，而且我在实习的那半年期间也每天保证了一定的代码量，这给我后面找工作提供了不少帮助，我顺利地给自己的职业道路找到了一把合适的钥匙。</p>
<p>所以，你看懂了吗？</p>
<p>绝大多数人找不到自己喜欢的工作，不是在找工作这件事儿上不够努力，而是方向完全就是错的，正确的解决问题的思路，就应该是我想要的岗位需要我有什么样的能力，那我就想尽办法，去拥有这个能力。</p>
<p>与其抱怨自己什么也不会，学历不够，倒不如现在就开始行动，能力不够就去学，学历不够就去自考。<strong>真正做事的人，他一定会把注意力放到自身能力的提高上。</strong></p>
<p>这把“万能钥匙”，其实就是一句话可以概括的认知：</p>
<blockquote>
<p><strong>当你遇到被锁上的锁头的时候，要想到你应该去别的地方找钥匙......</strong></p>
</blockquote>
<p>这是来自李笑来老师在某个课程里的一个概念，这把“万能钥匙”也可以用在很多很多地方，以下是几个例子：</p>
<p>比如，英语学不好是很多人非常苦恼的一件事，这里面不缺那些每天背单词背句式非常努力的人群，但就是学不好，可是，这钥匙其实就在别的地方——他们的语文，也就是他们的母语，可能就很差啊...</p>
<p>再比如，父母总是很苦恼自己的孩子做什么事都没有耐心，问题可能不是在孩子身上，而是作为父母的他们，本身就是没有耐心的，孩子其实是在复制父母的行为。</p>
<p>还有，很多人抱怨“这个世界太不公平了”，这些人从来没想过，这可能不是这个世界的问题，也不是社会的问题，甚至，都不是公不公平的问题，而是他们是否配得上被公平对待的问题。</p>
]]></content:encoded>
      <pubDate>Mon, 22 Apr 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/how-you-find-thd-key</guid>
    </item>
    <item>
      <title><![CDATA[我在人间凑数的日子]]></title>
      <link>https://moya.plus/article/The-days-when-I-was-merely-existing-in-this-world</link>
      <description><![CDATA[摘自《我在人间凑数的日子》]]></description>
      <content:encoded><![CDATA[<ul>
<li><p><strong>美应该是纯粹的，不是脸上涂那么多的腻子粉就是美。</strong></p>
</li>
<li><p><strong>你试图以离开来引起别人的注意，却不知道你是真的离开了。并没有任何人记住你。</strong></p>
</li>
<li><p><strong>小时候发誓长大以后要踏着七彩祥云去迎娶我的公主，没想长大了买个电驴还是按揭的</strong></p>
</li>
<li><p><strong>我知道有人是爱我的 但我好像已经失去了爱一个人的能力</strong></p>
</li>
<li><p><strong>这个感受我常有，我眼睁睁看着她走向深渊，我拦不住，她的心已经在深渊里了，我有什么办法？我没办法，我太难了，哦对了，我太胖了[灵光一闪]</strong></p>
</li>
<li><p><strong>历史洪流总在向前推进，而我只能随波逐流，根本改变不了什么！</strong></p>
</li>
<li><p><strong>我一野马，不知归途 浪子一枚，何谈余生 生命不息，折腾不止</strong></p>
</li>
<li><p><strong>我于昨晚去世，走时心如止水。我于今早重生，来时心怀暖阳。敬你岁月无波澜，敬我余生不悲欢！</strong></p>
</li>
<li><p><strong>笑着笑着就哭了，哭着哭着就没心没肺的笑了</strong></p>
</li>
<li><p><strong>这辈子最大的遗憾就是隔着屏幕认识你，隔着屏幕失去你，然后还瞒着所有人继续爱着你</strong></p>
</li>
<li><p><strong>没有人能陪你走到最后 有些事只能一个人做 路上的艰辛只有自己知道</strong></p>
</li>
<li><p><strong>我一直都觉得，最难过的瞬间，一定不是爱而不得，而是我明白，我和这个人真的没有以后了。以后，你给过我的，没有给过我的，都要给另外一个人了。而我，眼红的资格都没有。</strong></p>
</li>
<li><p><strong>我有趣的灵魂在你离开时便已消散，只剩下这疲倦不堪的躯体在苟延残喘。</strong></p>
</li>
<li><p><strong>骨气不等于尊严，人不能为了尊严连钱都不要了</strong></p>
</li>
<li><p><strong>她喜欢我，四个字给我无穷的勇气，哪怕它是谎言</strong></p>
</li>
<li><p><strong>他说，“我对这世间唯一的不满 就是这世间总是让更懂事的人承受更多。”</strong></p>
</li>
<li><p><strong>小时候想当个透明人，现在好了，自己本来就是个透明人，谁会去管你呢</strong></p>
</li>
<li><p><strong>以前我觉得是兄弟就能抛开一切，两肋插刀！现在明白了维系情义也要大家实力相当</strong></p>
</li>
<li><p><strong>最难过的瞬间一定不是你爱而不得的时候，而是你明白，你和这个人真的没有以后了，以后，他给过你的没有给过你的，都要给另一个人了，而你，连眼红都没有资格。</strong></p>
</li>
<li><p><strong>日子如白驹过隙一样流逝，我们在生活的挣扎中生长，这笑容如明媚的阳光，给你我带来温暖，带来生的希望。</strong></p>
</li>
<li><p><strong>小时候微笑是一种心情，长大后微笑是一种表情</strong></p>
</li>
<li><p><strong>你眼中的星河烂漫 是我不曾见过的世外桃源</strong></p>
</li>
<li><p><strong>那一夜，我喝醉了拉着你的手，胡乱的说话。早上醒来发现，花生米吃完了，趴在我身上的只有我家的哈士奇。</strong></p>
</li>
<li><p><strong>若你我在人间凑数的日子般，挣扎着贪恋着，若它只为贪恋深秋的最后一抹绿，那你我又贪恋着什么?</strong></p>
</li>
<li><p><strong>我已经记不清她的模样，我试图让自己想起她的容颜，即使我在努力也记不起她的模样。</strong></p>
</li>
<li><p><strong>后来我们发现了，俩个人在一起并不是社会环境迫使我们相爱，在对的时间在一起又在对的时间分开，总结就是，你的无能留不住你想留的人</strong></p>
</li>
<li><p><strong>条条大路通罗马，可有的人出生在罗马。</strong></p>
</li>
<li><p><strong>我爱你，你不爱我。</strong></p>
</li>
<li><p><strong>大家都散了吧，她家老穷了，刚刚我私信跟她表白，她说门都没有</strong></p>
</li>
<li><p><strong>少操无用的心！多操心爱的人！</strong></p>
</li>
<li><p><strong>小的时候觉得世界很美好，后来长大了，人间不值得了，很多东西都归财神爷管了。</strong></p>
</li>
<li><p><strong>两个人能否走在一起，时机很重要。你出现在她想要安定的时候..那么你就胜算很大。你出现在她对这个世界充满了好奇的时候.. .那么就算你多美多优秀都是徒劳无用。爱得深,爱得早,都不如爱的时候刚刚好。如果可以，就让- 我们，晚点在一起，然后一辈子。</strong></p>
</li>
<li><p><strong>我就这么坐着 生活给我什么我就接着 拿走什么我就看着他说。</strong></p>
</li>
<li><p><strong>我忘了好久都没看过这样单纯的笑容，就像当年你看我时，那种发自内心满眼是我，腼腆而又害羞的微笑……</strong></p>
</li>
<li><p><strong>小时候家里穷，从小就立志长大要赚钱，以后要搬到城里去，现在长大了，我的愿望都已经实现了，今年刚满29，已经在城里终于有房了，就是媳妇不同意结婚，房东老板差点发现我两的事。</strong></p>
</li>
<li><p><strong>很多道理我都懂，结果我能想到也能接受，但是，我就是难受</strong></p>
</li>
<li><p><strong>她笑了，我不经愣神，忘了多久以前我也有这样的笑容，我多久没笑了？我也忘了</strong></p>
</li>
<li><p><strong>小时候发誓长大以后不会成为像老爸那样的人，可长大发现我原来想多了</strong></p>
</li>
<li><p><strong>这几天我做梦梦到了你，梦里的我俩是多么完美的一对，我每次想牵着你的时候你总是离我远远的，然后想靠近你的时候我就被闹钟吵醒了，为了能和你在梦里的生活变得更加长久，我选择了一个清凉的早晨离开了，走的时候我应- 该是笑着的</strong></p>
</li>
<li><p><strong>他说，自从长大了就再也没有笑过，因为这世界的不友好让我笑不起来。</strong></p>
</li>
<li><p><strong>五点了，再不睡觉容易猝死</strong></p>
</li>
<li><p><strong>早上从公司出来休班 搭了动车往家赶 看着窗外的景物都被车甩在了脑后，想到 这正如往事吧 一场场一幕幕仿佛经历了 也就落幕了 。不经意间可能是年轻吧突发奇想 蹩着眼睛贴着窗户想远眺一眼前方的景色 可看到的却是一- 片深邃 满眼未知！似乎有所顿悟的我赶忙朝后撇了一眼，满目皆是熟悉的景物 渐渐的变得模糊…… 我心慌抽搐 我好像已经忘了来时的路。</strong></p>
</li>
<li><p><strong>“你的眼睛很美！犹如我的眼睛里有星空、有未来、还有你。”</strong></p>
</li>
<li><p><strong>未曾想努力的或者只为了成为一个普通人</strong></p>
</li>
<li><p><strong>我们终于长成了普普通通的大人。可是﹉明明不想这么普通的啊！</strong></p>
</li>
<li><p><strong>原来现在爱情不归月老管了，归财神爷了。</strong></p>
</li>
<li><p><strong>这人间，我来过。</strong></p>
</li>
<li><p><strong>其实这个世界上太多这样的普通人，没有高薪，没有好看的颜值，没有完美的身躯。身在这个社会的大染缸里，我们都身不由己。这东西看缘分吧，只是时候未到而已，慢慢等吧，总有一天你会老的。</strong></p>
</li>
<li><p><strong>有时候命运就爱和你开一个幽默的玩笑，把一个人放进你的心里，却残忍的让你没理由继续守护她，命运可能笑了，所以我笑着，但心碎了，所以我笑着哭了</strong></p>
</li>
<li><p><strong>戴着耳机听歌听到耳朵痛了，躺着看视频看到眼睛疼了，手机玩到没电了，头晕想吐了。我不是悲观主义者，只是有时候，真的感觉自己孤独的像条狗</strong></p>
</li>
<li><p><strong>我忘了好久都没看过这样单纯的笑容，就像当年你看我时，那种发自内心满眼是我，腼腆而又害羞的微笑……</strong></p>
</li>
<li><p><strong>早知道当初不应该下凡，饱受人间疾苦，饱尝世间冷暖，一个人的出身基本定格你整个人生，有的东西你出生有你就有，你出生没有那就很难通过后期努力得到了</strong></p>
</li>
<li><p><strong>她说民谣太穷了，一听就是一根烟，一听就是一瓶酒。而我只有一根烟了，还要撑一夜，只剩一点爱了，还要过一生。</strong></p>
</li>
<li><p><strong>小时候很穷但是我很快乐，可是长大后我虽然总笑，可是我心里却空了</strong></p>
</li>
<li><p><strong>我把那条头绳做成了手链，戴到了现在，心里也一直没放下。在最错的时间遇到了一个差一点就对了的人，可能这才是最单纯也最忘不了的爱情吧，只是现在，两个人的愿望只能靠我一个人实现了。　　那天我走出医院，也走回了- 这场生活，才发现这个城市里好像从来没有过星星，只有闪耀的路灯。</strong></p>
</li>
<li><p><strong>小时候的笑容，真的想再对着镜子看一次，可是无论如何也模仿不出来，小时候的朋友真的想见一次，可是再也没有他们的音讯，小时候堆得小雪人真的想再堆一次，可是怎么堆都和记忆中的不一样，小时候看着天想着我好想长- 大，可是长大以后才发现我小时候向往的那个大人的世界不过是好梦一场！！！</strong></p>
</li>
<li><p><strong>当我们开始觉得我们像父亲的时候，我们是真的长大了-</strong>-</p>
</li>
<li><p><strong>你试图以离开来引起别人的关注，但是事实上无人在意你是否离开</strong></p>
</li>
<li><p><strong>有些人25岁就死了，直到75岁才埋</strong></p>
</li>
<li><p><strong>无数次的感动，无数次的流泪，看到你眼里的浩瀚星海，依然不敢有半点污浊的思想</strong></p>
</li>
<li><p><strong>后来才知道，原来我也是个普普通通的人呀</strong></p>
</li>
<li><p><strong>据说一生中会遇到四种人:1、爱你，但你不爱的。 ；2、你爱，但不爱你的人。 ；3、明明相爱。却没能在一起的人。 ；4、未必真爱。但却合适的人</strong></p>
</li>
<li><p><strong>后来我终于渐渐明白，成熟也许就是我们没有再继续等待，你也朝着更好的方向去努力去生活，日后我们见或者不见，已经不再重要，只要你生活的好。如果真的无法相见，那以后的日子里，请你多保重。</strong></p>
</li>
<li><p><strong>在最无能为力的年纪 遇见了一生都想保护的人。可，并没有什么结果 连开头俩个人都没能有些许故事</strong></p>
</li>
<li><p><strong>我就是这样一个平凡的人，长着一张平凡的脸，出生在一个平凡的家庭，过着平凡的童年、少年、青年，上着平凡的学校，考着平凡的成绩，毕业后做着平凡的工作，拿着平凡的工资，或许有一天，在家人的催促下，找了一个平凡的女人，平凡的结了婚，生了一个平凡的依旧平凡的孩子，然后像其他平凡的人一样，为着平凡的生活平凡的奋斗着，一直到老，到死，结束了这平凡的一生，我就是这样一个平凡的人，在这个不平凡的世界里，平凡的活着，这世界- 很精彩，但下辈子不来了，因为人间不值得。</strong></p>
</li>
<li><p><strong>纯粹的过客.我们不是神而着人!而且是一个人，一个人孤清苍苦、仅为一个人，于是我们学会做,学会不是一个人 。在廖若星晨的世界里，找个人2个人或是很多，等谁来拯救我们或我们救赎了维?</strong></p>
</li>
<li><p><strong>那时候的我，什么都不懂；如今，我什么都懂了，却什么又不懂了</strong></p>
</li>
<li><p><strong>每年冬天回家都会发现有一些新的面孔，还有一些熟悉的面孔却再也见不到，不经想到自己再过多久也会消失，随着时间慢慢淡忘直到再也没有人记得你的样子，再也没有人提起你的名字</strong></p>
</li>
<li><p><strong>鸡叫了天会亮，鸡不叫天也会亮，天亮不亮不是鸡说了算，关键是谁醒了。醒来的过了一天，没醒的过了一生。有个人买了一箱梨，天气热怕梨坏了可惜，每天挑几个最差的吃掉，最后却吃了一箱烂梨。总结一下，作幅对联:上联:放着好的吃烂的下联:吃了烂的烂好的横批:永远吃烂的感悟:人生亦如吃梨，因为在意每天不开心的事，一辈子都得糟心下去；把糟心的事放下扔掉，每天阳光一点，你就灿烂一辈子！珍惜当下，积极快乐！没人天生就懂得控制情绪。- 真正有智慧的人，是时刻留意，不要让自己栽在坏情绪中！</strong></p>
</li>
<li><p><strong>我如繁星一般追随如同朗月的你，你却转身离去寻找你的太阳哥哥</strong></p>
</li>
<li><p><strong>每个人都很难，但愿不要为难彼此。</strong></p>
</li>
<li><p><strong>人生苦短 当及时行乐 呵呵</strong></p>
</li>
<li><p><strong>偶尔羡慕情侣，偶尔庆幸自由</strong></p>
</li>
<li><p><strong>其实我很纳闷，我没有做过什么坏事儿，可是生活总会给我开一些我接受不了的玩笑。</strong></p>
</li>
<li><p><strong>人是为活着本身而活着的，而不是为活着之外的任何事物所活着</strong></p>
</li>
<li><p><strong>别人再好是别人的，自己好才是自己的</strong></p>
</li>
<li><p><strong>终于变成了年少时最讨厌的人</strong></p>
</li>
<li><p><strong>生活就是一边选择 ，一边放弃</strong></p>
</li>
<li><p><strong>上帝对每个人都是公平的，因为他对每个人都不公平。</strong></p>
</li>
<li><p><strong>我喜欢喝可乐，去超市发现可乐没有了，找了好久也没有，我随手拿了瓶牛奶，到门口结账时突然发现了可乐，可我不想换了</strong></p>
</li>
<li><p><strong>我也曾想与你白头到老，却没想本应陪着你的我，却被养了你二十年的男人否定！</strong></p>
</li>
<li><p><strong>理想本为粉碎你而来，你却当它是暗夜里唯一的光</strong></p>
</li>
<li><p><strong>有些谎话说的多了，便也成真了</strong></p>
</li>
<li><p><strong>只要的肯回头，一定会发现我还站在原地不曾离开过</strong></p>
</li>
<li><p><strong>人心难测，冷暖自知</strong></p>
</li>
<li><p><strong>不知道为什么，我会有那么一瞬间想哭的冲动，但生活阻止了这种想法</strong></p>
</li>
<li><p><strong>你的一句想我啦！让我觉得我做对的一件事就是喜欢你。</strong></p>
</li>
<li><p><strong>世人万千，再难遇我</strong></p>
</li>
<li><p><strong>生活多年的城市，也就在那座城市里的你让我念念不忘了</strong></p>
</li>
<li><p><strong>虽然很羡慕情侣，但是我还是喜欢孤身一人</strong></p>
</li>
<li><p><strong>不甘愿孤独，却又喜欢一个人的自由</strong></p>
</li>
<li><p><strong>清晨的粥比深夜的酒好喝</strong></p>
</li>
<li><p><strong>卧槽</strong></p>
</li>
<li><p><strong>我一直以为最伤心的一句话是我不爱你，没想到更伤心的是对不起我忘不了他！</strong></p>
</li>
<li><p><strong>我本以为早踏入社会是一件多么美好的事，但是现在才知道社会多么的残酷无情。</strong></p>
</li>
<li><p><strong>可惜我啊，相貌平平，一事无成，惊艳不了谁的岁月，温暖不了谁的人生。</strong></p>
</li>
<li><p><strong>每天早上都想干翻这个世界，晚上回到家被这个世界干的服服帖帖，被生活疯狂折磨，但依然热爱生活</strong></p>
</li>
<li><p><strong>我遗憾的是从来没有拥有过任何女孩子的青春。而我接下来遇见的都是爱过别人的女孩子</strong></p>
</li>
<li><p><strong>渔夫每次出海前都不知道鱼在哪里，但他还是坚持出海，因为他相信自己一定能满载而归</strong></p>
</li>
<li><p><strong>人间的真话本就不多， 一个女子的脸红胜过一大片情话。可后来有了胭脂，便分不清是真情还是假意。但现在又有了腮红， 更遑论谁是有意无意。</strong></p>
</li>
<li><p><strong>我曾夜间行走，却不见尽头。我曾笑容灿烂，却满眼忧愁。”</strong></p>
</li>
<li><p><strong>“有些人二十岁就死了，等到八十岁才被埋葬”</strong></p>
</li>
<li><p><strong>这人间失常已是必然，我来到人间确是偶然。</strong></p>
</li>
<li><p><strong>你总是以为未来可期、爱人温心，相信眼前的苟且只是一时而已，于是怀着满腔热血努力生活，可是谁都不愿意等你，就连时间也仿佛开挂一般跑的飞快！</strong></p>
</li>
<li><p><strong>我在每天深夜点了一支又一只的烟，我的感情得到了满足，过了一会却又感到了失落</strong></p>
</li>
<li><p><strong>以后呀我们要是有幸在一起了我们家务活一定要分工明确你收拾屋子 我收拾你</strong></p>
</li>
<li><p><strong>每次回家可以给爸爸递根烟了！可以和爸爸一起喝酒聊天了！却没有成长为他所期待的样子！</strong></p>
</li>
<li><p><strong>许多美好的人事物往往只有第一眼最惊艳</strong></p>
</li>
<li><p><strong>天堂与地狱，没有我选择的机会，只有我被选择的命运。</strong></p>
</li>
<li><p><strong>我从没拥有过哪个女孩子的青春，后来遇见的都是别人的青春</strong></p>
</li>
<li><p><strong>我昨天在路上看到一个人，很像你，好像是你，又好像不是你，我回头看了很久</strong></p>
</li>
<li><p><strong>在世间需要掌握两种能力，稳定情绪和好好说话</strong></p>
</li>
<li><p><strong>以前我可爱笑了，后来没爱了，只剩下笑了</strong></p>
</li>
<li><p><strong>你未必忠诚只是没钱去浪 你未必痴情 只是没颜去放荡-</strong></p>
</li>
<li><p><strong>人间真好，再也不想来了。</strong></p>
</li>
<li><p><strong>他们都说大海最深邃干净，我想那是他们没见过你的眼睛。</strong></p>
</li>
<li><p><strong>幼稚青涩的时候总觉得世界万物应为我而生，后来家道败落，爱的人离去，亲人离世，才觉得原来自己这样无助..</strong>.</p>
</li>
<li><p><strong>一直没有人懂我，我习惯假装坚强，习惯了一个人面对所有。</strong></p>
</li>
<li><p><strong>“我的地板下有一具尸体，和我长得一模一样，却多了一丝稚气与天真。不知何时木板被人打开了，我并不担心，毕竟这是大家让我埋的。他是我，我不是他。扭头出门，又是繁忙的一天。”</strong></p>
</li>
<li><p><strong>这个江湖不太适合我，我太念旧了。</strong></p>
</li>
<li><p><strong>对不起！我不是一个优秀的演员，做不到微笑旁观你们的暧昧。</strong></p>
</li>
<li><p><strong>看到她笑，想到了儿时的公主，那是真住魔法城堡的公主，现在长大了，慢慢发现富丽堂皇的地方也藏着公主，想到这儿，我很难受</strong></p>
</li>
<li><p><strong>如果我有什么意外，我一定会把我有用的器官全部捐献，遗体捐赠，这样我就会一直陪着你们了。</strong></p>
</li>
<li><p><strong>生孩子已经很辛苦了，就不要问是谁的了。</strong></p>
</li>
<li><p><strong>时间是个庸医，却号称包治百病</strong></p>
</li>
<li><p><strong>我只顾着喜欢你，却忘了不合适。</strong></p>
</li>
<li><p><strong>年少时，不顾一切带着满腔孤勇奔向你。本以为会和幸福抱个满怀，却撞向了死胡同。我没死，青春替我抵了命。我以为我早已走出来了，但是很久以后发现，连喜欢上别人的勇气都没有了。岁月悠悠，原来我始终困在死胡同里，- 慢慢腐朽消沉，连头顶都冒出了蔫巴巴的蘑菇。</strong></p>
</li>
<li><p><strong>我其实并不孤僻，简直可以说开朗活泼，但大多时候我很懒，懒得经营一个关系，还有一些时候，就是爱自由，觉得任何一种关系都会束缚自己，当然最主要的，还是知音难觅。我老觉得跟大多数人交往，总是只能拿出自己的一个- 维度，很难找到和自己一样兴趣一望无际的人。</strong>.</p>
</li>
<li><p><strong>她对你挑三拣四，要求你收敛脾气，要求你不能任性，要求你百依百顺，要求你懂事，却不知道以前有个人只要你快乐.</strong></p>
</li>
<li><p><strong>卧槽，你们都说完了，让我说什么。</strong></p>
</li>
<li><p><strong>笑对我来说只是一个表情，与快乐无关</strong></p>
</li>
<li><p><strong>鱼与熊掌不可兼得，唯独穷和单身可以</strong></p>
</li>
<li><p><strong>青涩不及当初，聚散不由你我，红颜已是过往，恩怨皆是云烟。</strong></p>
</li>
<li><p><strong>远赴人间惊鸿宴，一睹人间盛世颜</strong></p>
</li>
<li><p><strong>我编辑几百字删除几百只，我编辑几十字又删除几十字，我编辑几个字再删除几个字。纵满腹心事，竟空无一字。</strong></p>
</li>
<li><p><strong>原来异地这么苦，当初不招惹你就好了</strong></p>
</li>
<li><p><strong>孤独的人更渴望温暖，见过太阳的人，将再也不能忍受黑暗。</strong></p>
</li>
<li><p><strong>生活在给你打开了一扇门的时候，又给你关进了一辆拉猪车。</strong></p>
</li>
<li><p><strong>把理想卖了还是买不起柴米油盐</strong></p>
</li>
<li><p><strong>你吃了个草莓觉得很甜，有一天你碰到了苦瓜说，你要是和草莓一样甜就好了，苦瓜说“那我存在的意义呢？</strong></p>
</li>
<li><p><strong>大多数嘴上说着不想谈恋爱的人，其实心里都装着一个得不到的人， 你说 对吗？</strong></p>
</li>
<li><p><strong>以为自己只是不想找对象，后来发现我tm是根本找不到</strong></p>
</li>
<li><p><strong>爷爷没有输给战火，父亲没有输给贫穷，我却输给了和平年代的生活和爱情，以及太过自由</strong></p>
</li>
</ul>
]]></content:encoded>
      <pubDate>Tue, 08 Oct 2019 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/The-days-when-I-was-merely-existing-in-this-world</guid>
    </item>
    <item>
      <title><![CDATA[所以，要如何从平庸走向卓越]]></title>
      <link>https://moya.plus/article/from-0-to-1</link>
      <description><![CDATA[所谓的成长，也就是不断把别人比下去的过程。]]></description>
      <content:encoded><![CDATA[<p>我们从小到大接收到的教育，绝大多数都是在告诫我们同一件事，就是做什么事情都要专一，是吧，不能一心两用，不能同时照顾着做好几件事情，不能捡了芝麻，然后丢了那个大西瓜。</p>
<p>一方面，这说的有一定的道理，因为他强调的是注意力要合理的分配。</p>
<p>另一方面，这个道理却又成了禁锢我们思维的枷锁，就是觉得自己一辈子就该干好一件事，只追求一个维度、或者一个职业方向的发展，而忽略了其它更多的可能性。</p>
<p>这是我 2024 年第 <strong>15</strong> 篇原创文章，来聊聊一个从平庸走向卓越的人生策略——<strong>多维度发展。</strong></p>
<hr>
<h3 id="关于-比较">关于“比较”</h3><p>很多时候，比较是一个大坑，因为比较是相对的，而相对是永远不可能会有尽头的。</p>
<p>从这个角度看，<strong>所谓的成长，也就是不断把别人比下去的过程。</strong></p>
<p>要么把别人比下去，这当然挺好的，比不下去就难受了，这意味着自己被别人比下去了。</p>
<p>所以，当你真切的感受到自己被比下去的时候，那种难受的心情，像不像是对手在对你千刀万剐，踩在地上不断摩擦。</p>
<p>那最好的办法是什么？</p>
<p>就是尽可能的想办法让自己可以无需比较就可以获得成就、快乐和幸福。</p>
<p>那就意味着，我们需要开扩多个维度，而不是一个维度上去跟别人死磕，死磕是一个策略，但一定不是一个好策略。</p>
<p>多个维度的比较，举个容易理解的例子</p>
<ul>
<li><strong>单个维度上，比的是“长度”</strong></li>
<li><strong>两个维度上，比的是“面积”</strong></li>
<li><strong>三个维度上，比的是“体积”</strong></li>
</ul>
<p>我们的人生肯定不会是一个维度的吧，肯定是立体的，不可能是平面，更不可能是一根线。否则怎么会拿“一根筋”去形容一个人的不聪明呢。</p>
<p><strong>在所有的单一维度的比较上，“第一名”永远只有一个人，“少数人”会成为名列前茅，剩下的所有，都是“落后”。</strong></p>
<p>关键最可怕的是，当了第一，又能怎么样呢?</p>
<h3 id="开扩新维度">开扩新维度</h3><p>毕业之后，不难发现，那些真正有出息的，往往都不是学习成绩最好的那几个。</p>
<p>——一些老师在许多年之后慨叹道</p>
<p>他们慨叹的原因，是因为<strong>没想到，除了考试成绩之外，竟然想不到还有很多其他的人生维度可以选择。</strong></p>
<p>我高中时期，成绩算是不好不坏，运气好点，能排进班级前 40%，这对我来说已经很不容易了，我知道我无论在学习成绩上怎么死磕下去，在高考之前也不可能会有多好的效果。</p>
<p>我开始寻找我其他的人生选择，在保持本身学习成绩不下降的情况下，去给自己的未来争取更多的可能性。</p>
<p>我高中担任了三年的劳动委员，我能感到自豪的是，我是一个深得人心的劳动委员。</p>
<p>卫生值日安排表，开始是由班主任安排的，而且一看就是随机搭配的，带来的问题是什么呢？</p>
<p>由于某些关系，有些人不愿意跟一起搭配的人值日；由于某些原因，有些人就不情愿干脏活累活，比如扫厕所，倒垃圾；由于某些安排，有些人就无法干好他该干好的事情。</p>
<p>这些是班主任的信息盲区，却是我这个同学非常清楚的底细。我非常清楚谁跟谁关系好，把他们搭配到一起值日效率会更高；我知道谁谁谁不愿意碰脏活，但不怕累，那就安排她每节下课后去擦黑板，她也乐意干；我知道谁谁谁早上经常迟到，所以每周一次的大扫除工作会更适合他。</p>
<p>我锻炼人际关系和资源分配的能力不就开始了嘛。</p>
<p>再者，我开始接触编程，高二开始给班级开设了一个网站，大学毕业后，这竟然成了我的本职工作，我可以靠这个养活自己，成为了一名还不错的程序员。</p>
<p>这些例子太多了。</p>
<p>所以你看，<strong>单一维度，拼死也就 100 分，如果是两个维度，哪怕各自都只有 50 分，面积也有 2500 了，如果是三个维度都是 50 分，125,000...这些数字“意象”，足够说明一些事实了。</strong></p>
<h3 id="开拓的前提">开拓的前提</h3><p>发现了吧，<strong>每一次跨界，都是给自己拓展一个新的维度。</strong></p>
<p>但这有个非常重要的前提，就是你至少得在一个维度上有足够突出。</p>
<p>做什么事都是有成本的，如果你已经积累的财富不足以去支撑你去做其它消耗成本的事，也就是不满足“生活必须开支”，那就不应该去立即开扩一个新维度。</p>
<p>处处都平庸肯定是不行的，但起码要有一个地方足够突出，哪怕是满足基础需求都行，你才能够去争取其他更多的可能性。</p>
<p>多维度发展，一个人也可以是一个团队，前提得至少是满足一个人。</p>
<p><strong>跨界的成本越大，获得的收益，大概率也就会更高。</strong></p>
<p>如果暂时没有足够突出的维度，那就好好打磨自己的技能；如果已经在某一维度足够优秀，不要沉浸于已有的成绩中，不妨换个维度去突破一下自己的局限。</p>
]]></content:encoded>
      <pubDate>Thu, 26 Sep 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/from-0-to-1</guid>
    </item>
    <item>
      <title><![CDATA[所谓的现状，无非是“过往的积累”]]></title>
      <link>https://moya.plus/article/what-i-need</link>
      <description><![CDATA[什么才是绝对正确的刚需？]]></description>
      <content:encoded><![CDATA[<p>之前的文章提到过：一切驱动力的源头，是正确的刚需。</p>
<p>刚需这个东西实际是建立在价值观之上的，而价值观几乎决定了一个人的一切。— —价值观决定命运。</p>
<p><strong>那什么才是绝对正确的刚需？</strong></p>
<p>这里先举个足够让人震惊的例子：绝大多数人，终其一生也赚不到非常多的钱，成为所谓的富翁，是因为什么？</p>
<p>李笑来老师有个解释，就是对于绝大部分人来说，赚钱不是刚需，花钱才是。</p>
<p>你想想，有过发财梦想的人是不是都这样，发财并不是他们的刚需，发财之后怎么花钱才是。比如他们经常说</p>
<blockquote>
<p>等我有了钱，我就 x x x！</p>
</blockquote>
<p>而只有少数的人，花钱是为了投资，投资才是他们的刚需。而不是像绝大多数人那样，赚钱是为了花钱，这是消费。</p>
<p>也就是这个差别，造成了财富分配上的巨大差异。</p>
<p>不能否认的是，刚需是可以主动选择的，如果顺着人类的天性，那么懒惰、贪婪、嫉妒就是刚需。</p>
<p>人们总是相信命运这个东西，觉得一切都是命运的安排，“人在江湖，身不由己”，但真实的世界不是这样的，你是握着选择权的，哪怕你真的“身不由己”想要自杀，不还得给自己选个舒服的死法不是吗？</p>
<p>其实，一切对自己成长有利的东西，都是刚需。</p>
<p>提升学历，学到更多东西对自己一定有利，这就是刚需。</p>
<p>坚持运动对自己的身体有利，那锻炼就是刚需。</p>
<p>这些刚需有很多，而且都会很「难受」对吧，但是你想想，你是愿意每天跑步难受，还是以后在住院大楼难受？你是愿意学习的时候难受，还是因为学历问题吃不上饭难受？</p>
<p>这些都是可以选择的，而且这些道理，你以前也一定听过，就是那句“不愿吃学习的苦，就吃生活的苦”，由于各种原因导致没有去践行，最终成就了你的现状— —身不由己。</p>
<p>所以你现在知道了，什么是现状，本质上看，现状就是“过往的积累”。</p>
<p>之所以你对现状不满意，那肯定是“过往的积累不够”。然后现状越差，越没有积累，越心急。</p>
<p>因此引出另一个问题：在培养正确的刚需的时候，最为关键的核心是什么？</p>
<p>答案是：耐心。</p>
<p>你有没有发现，绝大多数人是没有耐心的，尽管嘴上不说，但是会不自主的表现出来对目标的达成有着非常急切的心理。</p>
<p>比如大部分人在描述自己目标时，会有一些前提条件：马上...、x 天内...、今年一定要...，也就是短期的期望太高了。</p>
<p>这是典型的没有耐心的表现，学习了几天没有明显的提升，练习了几天感觉又累又苦，就想着给自己找个理由放弃，这是几乎所有半途而废的原因。</p>
<p>绝大部分人生没有耐心的，短视的，无论做什么，都想能马上生效，马上生效就是他们的刚需，哪怕是感觉不能马上生效，他们都会立刻选择放弃。</p>
<p>所以在今后的选择上，第一，降低短期内的预期，在制定目标的时候，可以加个限制条件，就是：不要求马上见效。第二，选择正确的难受方式，比如当你跑步的时候，很累，没有动力，那你就得选择</p>
<blockquote>
<p>因为太苦太累而难受-&gt;（不跑了，躺平吧）-&gt;错误</p>
<p>因为自己身体素质没有进步而难受-&gt;（再多跑一会，下次就可以跑的更好）-&gt;正确</p>
</blockquote>
]]></content:encoded>
      <pubDate>Wed, 26 Jun 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/what-i-need</guid>
    </item>
    <item>
      <title><![CDATA[为什么我总说，要像老年人一样投资自己？]]></title>
      <link>https://moya.plus/article/be-like-old-man</link>
      <description><![CDATA[所有乐观的人，前提都是一个珍惜自己身体的人]]></description>
      <content:encoded><![CDATA[<p>好多人一听到我的作息时间，那表情就跟见了鬼似的，一脸不可思议地问：“你这年纪轻轻的，咋跟个老大爷老大妈似的，居然能做到早睡早起啊？”</p>
<p>我也很诧异，因为如果一个人认为早睡早起是什么很不寻常的事的话，那这个人大概率不怎么聪明。</p>
<p>去年的文章里我提到：<strong>一个人越到生命的尽头，就越能珍惜自己的身体。</strong></p>
<p>那为什么这个「珍惜自己身体」的动作，不能尽早做出呢？干嘛非得等到头发和牙齿都掉光的时候，才想着自己的身体一天不如一天了，然后去问哪款保健品可以「救我的狗命」呢？</p>
<p>总之，在年轻的时候就像老年人一样，把时间和精力都充分的投资到自己身上，多活一天是一天，总不会错的。</p>
<p>而这篇文章，我想从另外一个角度告诉你，为什么要像老年人一样投资自己，换成大白话就是，为什么我们要尽可能的活的久一些...</p>
<p>先说个你不得不面对的基本事实：<strong>不管你是谁，不管你多大年纪，我们这一代人，都有一半的概率活到 100 岁</strong>，你可别不信，这在发达国家已经成真了，发展中国家也正迎面赶上。</p>
<p>这样一来，我们过去的先上学、再工作、然后退休的模式就不再适用了。</p>
<p>退休？那是计划经济时代遗留的产物，到了我们这一代，65 岁，那可是正直壮年，我有的是人生阅历和人脉，有的是时间和足够的钱，你就让我退休？你就让我跟这个社会脱离？这怎么可能的事情嘛。</p>
<p>2024 年诺贝尔化学奖得主哈萨比斯有个预测：<strong>由于 AI 的进展，所有的疾病，在十年内，都有可能被治愈。</strong></p>
<p>这是个多好的消息，咱只要活过这十年，未来的所有疾病，咱都有得治。</p>
<p>今年罗胖的跨年演讲还提到一个词，叫“买三送一”，就是<strong>只要你凭自己的努力多活三年，现代医学和科技的进步，就会帮助你又多活一年。</strong></p>
<p>这难道不是更好的消息吗？多活一年和多挣一笔钱，聪明的人都会选择后者。</p>
<p>我们这一代人，每多活十年、五年，哪怕只有一年，就能享受到古人无法想象的科技文明。</p>
<p>古代的皇帝厉害吧，哪怕有再多的资源和权利，他也吹不着空调，晚上没有电灯，更别说手机和互联网了，我们轻而易举享受到的东西，可是古代的皇帝都想象不到的。</p>
<p>所以你还有理由不努力，让自己活得更久一些吗？</p>
<p><strong>所有乐观的人，前提都是一个珍惜自己身体的人</strong>，早睡早起，多运动，不熬夜。从今天开始，<strong>先想办法延长生命的长度，再考虑拓宽生命的广度。</strong></p>
<p>再一个角度，跟我们息息相关，就是「老龄化」。</p>
<p>现在我们国家 60 岁以上的人口，已经超过总人口的 20% 了，到 2050 年，中国每两个 65 岁以下的劳动人口，就要养一个 65 岁以上的老人。</p>
<p><strong>这意味着什么？意味着一大笔钱。</strong></p>
<p>这件事是已经确定的，很多人都把老龄化当成是个不好的消息，是个坏消息。</p>
<p>但是你想想看，只有 3% 的老人会去养老院，剩下的 97% 都得依靠社区解决养老的问题，这是个多大的产业。</p>
<p>你可能会说，这不就是所谓的“养老行业”吗，那对这个行业当然是个好消息。但其实这也是个“未来产业”，咱们现在所有的产业，都能借着老龄化的 “东风”，重新洗牌、再做一遍。</p>
<p>这是一批什么样的老人？他们拥有充足的社会阅历，四十几年的人生经验，又有时间，又有消费能力，又有确切的需求，上哪才能找到这么优质的用户群体，你说是不是。</p>
]]></content:encoded>
      <pubDate>Thu, 26 Jun 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/be-like-old-man</guid>
    </item>
    <item>
      <title><![CDATA[关于创业的选择]]></title>
      <link>https://moya.plus/article/about-choose</link>
      <description><![CDATA[投有成长率的公司、找有成长率的人做朋友，自己也做一个有成长率的人。]]></description>
      <content:encoded><![CDATA[<p>在毕业之后的很长时间，即便是在去年，在大环境人人都说“很不好”的情况下，我身边还是有不少人都想着要去「创业」。</p>
<p>其中也有不少的朋友找过我，想让我加入，他们的项目小到餐饮，大到人工智能，非常丰富。他们找我不光是我有一些可以帮得上忙、且免费的开发技术，更多是因为他们知道我曾经创业且失败「不止一次」，希望在我身上找到一些可以吸取的经验和教训。</p>
<p>所以我们这次聊聊关于「创业」，应该追求什么样的创业选择。</p>
<p>以下内容来自我的珍藏的笔记，认同、践行、整理后，分享给你。</p>
<p>我从高考结束开始，倒腾过分销、卖过虚拟产品，上了大学之后，开过店、修过电脑、收过快递、办过网站、以及开过一家摄影工作室。</p>
<p>很多年后我才意识到，当初年轻无畏干的所有事情，其实严格来说，都算不上是「创业」，更准确的说，是「生意」，再准确点描述，就是连温饱都满足不了的「经营」。</p>
<p>这个观念转变也是我最想分享给你的。</p>
<p>我一直很认同一个识人的技巧，这个技巧来自投资人李笑来，就是看一个人是否聪明，可以看他脑子里有多少<strong>清晰、准确、必要的概念</strong>，并且，这些清晰、准确、必要的概念之间，<strong>有多少清晰、准确、必要的关联…</strong></p>
<p>因此，那些几乎都不知道自己在做些什么，甚至不清楚什么是创业，仅仅以为放弃工作出去另谋出路就算创业的人，我基本不会有跟对方聊下去的欲望，在我看来，这完全就是「无知者无畏」。</p>
<p>所以，如果你现在正有想法，想出去创业，或者你现在正处于创业阶段，不妨先问问自己，你现在做的事情，到底算不算是「创业」。</p>
<p>可能「创业」这个词对于很多人来说，有点晦涩难懂，知道大概，但说不上具体的定义，那咱就换个词汇，叫做「生意」。</p>
<p>「生意」词倒是很多人都能理解，很多人对生意可能只有「好生意」和 「坏生意」的区分，但实际上，生意其实可以分为：</p>
<ul>
<li>可以满足温饱的生意</li>
<li>温饱之余还能赚更多钱的生意（富余）</li>
<li>能够成长的生意（富余越来越多）</li>
<li>能够做到成长率不断提高的生意......</li>
</ul>
<p>在看到这个观点之前，我所认为的「创业」，就是到第三条，就是认为能够不断成长的生意，就叫创业，这已经很难做到了对吧。</p>
<p>而更糟的情况是，绝大多数人，只能看到第一条：认为能赚钱的生意就是创业。事实上，赚不到钱的根本不叫生意，赚的不够多的，都叫差生意，因为企业生存本身也是需要成本的，<strong>仅能裹腹，满足温饱的生意，不叫创业。</strong></p>
<p>而另一方面：企业的所有成本，也几乎都是在不断成长的，房租、人力，竞争者数量等等，也就是说，在当下温饱之余能赚钱的生意，最终可能都不能「长期赚钱」。</p>
<p>因此，<strong>不能不断成长的生意，根本谈不上是「创业」。</strong></p>
<p>真正厉害的创业者，日夜思考的，从来都不是“怎么赚钱？”，而是“怎么成长？”。如果没有成长，那就容易退回成“仅能满足温饱”的生意，因为这其中还有“通货膨胀”这个要素的存在，即，现在的一百块钱，和未来的一百二十块钱，买到的东西如果一样多，那么这「增值」出来的二十块钱所体现的价值，就是零。</p>
<p>所以，创业者在思考“怎么成长”的同时，还应该思考“怎么长期成长”，也就是追求「成长率」。</p>
<p>「追求成长」和「追求成长率」是两个完全不同的结果，在时间的维度下，成长率不断提高的生意，即便这个成长率极小，最后的收益也是极其吓人的。</p>
<p>例如，今天赚 100 块，明天赚 110 块，后天赚 121 块，这是成长，也就是每天的成长都是 10 %；而追求成长率 10%是什么结果呢，就是今天赚 100 块，明天赚 100 块，后天赚 122 块，再后一天，赚 137 块...</p>
<p><img src="https://cos.moya.plus/article/assets/1784422832814-image-(1).png" alt="1784422832814-image-(1)" loading="lazy"></p>
<p>你看到了吧，成长率 10%，在「长期」的作用下，在「复利」的作用下，得到的收益有多吓人，只有那些每天都在琢磨怎么保持成长率的创业者，才有可能成为头部领先。</p>
<p>同时，没有「成长率」的创业公司，风险投资也不舍得进入，<strong>在风险投资者的眼里，你不光要能挣钱，还要不断的挣钱，而且是明年挣的钱要比今年挣得更多，最好的是，你成长的速度还要越来越快。</strong></p>
<p>你发现了吧，**当你追求成长率的时候，即便最后收效甚微，也比大多数连成长都没有的人要强得多。**我们都学过物理，知道物体向着一个方向前进，需要有速度，否则只会原地不动，但是如果希望物体运动的越来越快，就必须要引入加速度才行。有了加速度，即便最开始的那个初速度很慢，最终也可以达到理想中的速度。</p>
<p>最后，希望你读懂了这篇文章，形成了自己对于「创业」的清晰、准确、必要的概念，哪怕你没有创业的想法，你也可以认识到「成长率」的重要性，即便不去选择做有成长率的创业，也要学着怎么去<strong>投有成长率的公司、找有成长率的人做朋友，自己也做一个有成长率的人。</strong></p>
]]></content:encoded>
      <pubDate>Tue, 26 Aug 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/about-choose</guid>
    </item>
    <item>
      <title><![CDATA[绝多数人直到大学毕业，也没搞懂上学、读书、学习之间的区别]]></title>
      <link>https://moya.plus/article/school-read-learn</link>
      <description><![CDATA[以前年轻不懂事，早知道就多念点书了...]]></description>
      <content:encoded><![CDATA[<p>先问一个问题——你还有在坚持读书吗？</p>
<p>每次问到这个问题，我都会看到，几乎所有的回答者都会犹豫片刻，眼神不自主的飘向窗外，脑子里费劲扒拉地在想上一次翻开书本是什么时候...最后支支吾吾的说了一句——没有。</p>
<p>不奇怪吧，很多人小学毕业之后就不再读书了，去谋生，然后，又有一批人初中毕业之后就不再读书了，还是去谋生，还有一批人，高中毕业之后就不再读书了...不读书的选择，还是一样——出去谋生！</p>
<p>我敢肯定的是，这些人在当初做决定选择不读书的时候，是没有把「学习」和「挣钱」这两件事放在一起做关联的，他们打心眼里认为上课学习不能让自己以后可以挣到钱，于是当他们真正进入社会，不得不接受这个更加悲惨的事实——<strong>没有知识储备，自己可以售卖的时间单价非常低。</strong></p>
<p>不仅如此，<strong>绝多数人直到大学毕业，也没搞懂上学、读书、和学习的区别</strong>，他们往往以为“不再上学”就是“不再学习”了，一毕业，离开学校，放弃学习，书都懒得翻，对身边继续上学、自考升学历的人，眼里充满了不屑一顾，结果就是这一放弃，就是一辈子。</p>
<p>这一类人其实有个明显的特点，就是觉得上学读书“没有必要”，或者是毕业后继续上学读书“没有必要”，他们往往会这么想：我本来就是打工的，只是恰好读了几年书而已。</p>
<p>你也应该见过很多人，在三十多四十岁的时候说过这样类似的话：</p>
<blockquote>
<p>以前年轻不懂事，早知道就多念点书了...</p>
</blockquote>
<p>他们觉得自己彻底回不去了，更加无奈的是，他们会把同样的话讲给自己的孩子听，这当然是为了孩子好，眼里充满着真诚，但是却没有任何可能让自己的孩子明白这么做的意义。</p>
<p><strong>上学，是规定人生中的一部分时间，在特定的场所，通过特定的方式去获取知识，读书，是允许你可以在任意的场所，自由地从书本里汲取自己需要的知识，而学习，更简单粗暴——就是为了获取知识。</strong></p>
<p>所谓知识，就是那些<strong>能够指导我们做出更好的决策，且长期看来更可能会给我们带来更好结果的那些信息。</strong></p>
<p>我们从小到大都听过一句话——“知识改变命运”，很多人因此感到兴奋，并且也非常努力通过学习知识来改变自己的命运，但不是所有人的结果都尽如人意——读书，没有让自己获得“财富自由”。</p>
<p>于是开始改变自己的认知，觉得“读书无用”——这真的很傻。</p>
]]></content:encoded>
      <pubDate>Sat, 22 Feb 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/school-read-learn</guid>
    </item>
    <item>
      <title><![CDATA[遇到贵人之前，你首先得是个贵人]]></title>
      <link>https://moya.plus/article/be-a-good-man</link>
      <description><![CDATA[你不优秀，就不可能会有有效的社交]]></description>
      <content:encoded><![CDATA[<p>为什么？为什么有的人他总是有贵人的相助，作为大多数的我们却没有，他们是运气好吗？不一定吧。</p>
<p>对，当然不一定，遇到贵人，其实是有一套科学方法的，这篇文章咱们好好聊聊这个话题。</p>
<p>这是我 2024 年的第 <strong>12</strong> 篇原创文章，跟你分享来自李笑来老师的观点，怎么才能遇到贵人？</p>
<hr>
<h3 id="纠正认知偏差">纠正认知偏差</h3><p><strong>理解一个概念，有时候不光要知道它是什么，更重要的，是知道它不是什么。</strong></p>
<p>在我们绝大多数人的成长环境里，“向人求助”那就是“麻烦别人”，别人向你求助，你也会觉得是在找你麻烦对吧。</p>
<p>但实际上，帮助他人从来就不是谁赢谁输的问题，它本质上是场交易，是共同进步的过程，在讨论如何遇到贵人之前，我们需要一步步的把内心里错误的观念纠正过来才行。</p>
<p>“求助”不是“乞讨”、“添麻烦”的事，它是一件隐蔽且意义巨大的交易行为，贵人之所以会帮助你，一定是因为他看到了你身上的价值，要么，你的价值可以给他带来价值，要么，你的价值在未来有着某种可能性，具体是什么，不知道，所以他愿意拉你一把。</p>
<p>如果你自己本身做过别人的贵人，那你一定懂得这里面的道理，就是</p>
<p><strong>在你出手相助的那一瞬间，你已经得到了自然的回报——这也很可能是你乐于相助的根本原因。</strong></p>
<h3 id="自己先成为贵人">自己先成为贵人</h3><p>事实上，能够遇到贵人在一定程度上是偶然也是必然的，它是自己生活的一面镜子。</p>
<p>你自己是个贵人，自然就会更招贵人。</p>
<p>所以，“遇到贵人”其实不是我们最终要最求的目的，因为这并不受我们控制，<strong>“成为贵人”才是我们这一生应该努力的方向。</strong></p>
<p>即便我们运气真的很差，这辈子就真的一个贵人都没有遇到，其实这种情况也非常的少，但即使如此，你也成长起来了不是，然后你会发现，自己其实就成为了自己的贵人。</p>
<p>所以这个道理通俗易懂，自己首先得是个贵人，才能遇到贵人，甚至是更多的贵人。就像<strong>你不优秀，就不可能会有有效的社交</strong>一样，这个道理朴素、简单，且永远有效。</p>
<h3 id="遇到贵人的方法">遇到贵人的方法</h3><p>我这一生，直接或着间接遇到的贵人，其实不在少数，我从小到大的成长轨迹其实就是在贵人相助的环境下，这里不展开细说，但归根结底，其实遇到贵人的方法也一样的朴素简单且有效，这里直接引用李笑来老师的原话：</p>
<ul>
<li>乐观的人更容易成为他人的贵人；</li>
<li>贵人更容易遇到贵人；</li>
<li>能帮助他人进步的才是真正的贵人；</li>
<li>优秀的人，值得尊重的人更容易获得帮助；</li>
<li>乐于分享的人更容易获得帮助；</li>
<li>不给他人制造负担的人更容易获得帮助；</li>
<li>不耻于求助的人更容易获得帮助；</li>
<li>求助的时候不宜仅用金钱作为回报，帮助他人的时候不宜收取金钱回报；</li>
<li>贵人不一定是牛人，牛人常常只不过是自顾自地牛，贵人不一样，他们常常“以和为贵”，更懂得“独贵贵不如众贵贵”；</li>
<li>很多时候，人们的成功，源自于大量的人希望看到他成功。反过来，若是有大量的人不愿意看到某人成功，那么此人很难获得所谓的“贵人相助”；</li>
<li>正在做正确事情的人，更容易获得贵人相助，所谓得道多助，说的就是这个；</li>
<li>活在未来的人更容易遇到贵人，因为别人能在他的身上看到未来。</li>
</ul>
]]></content:encoded>
      <pubDate>Mon, 26 Aug 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/be-a-good-man</guid>
    </item>
    <item>
      <title><![CDATA[难过的时候，去哪里天空都挂着泪水]]></title>
      <link>https://moya.plus/article/to-class-master</link>
      <description><![CDATA[生活沉闷，但跑起来就有风]]></description>
      <content:encoded><![CDATA[<blockquote>
<p>这篇文章是在 24 年的时候，偶然的机会读到了初中时期的班长写的一篇文章，跟在朋友圈看到的她不同，文章里是她鲜为人知的另一面，像是我曾经一段时间内活过的样子，于是写了这篇文章，算是给曾经的自己以及有过这些困境的人，一封回信。</p>
</blockquote>
<hr>
<p>关于你“停滞的四年”那篇文章，我反复看了好多遍。</p>
<p>或许是因为产生了不少共鸣，又或许是觉得，这个在照片上笑得如此开朗、曾经在讲台上一句话就可以震住全班的女孩，怎么也跟我以前一样，要抑郁了。</p>
<p>确实，人在接近抑郁的时候，不仅容易否定自己，还容易想着结束自己。</p>
<p>几年前，我也是这么一个状态...</p>
<p>那会我也经历了被分手，很长一段时间也没有走出来，新的感情生活更是让我感到窒息。</p>
<p>紧接着疫情，没了工作。再重新入职，面对长时间的996和PUA，加上由于说了些大实话，得罪了某些领导，所以直到现在也被冷落和针对着。</p>
<p>很长一段时间，我要靠咖啡和各种功能饮料去强撑着。直到我渐渐发现情况越来越不对劲……</p>
<p>我开始失眠，吃得少却不断的肥胖，异常焦虑，以及不明原因的肠胃炎。</p>
<p>再后来，我发现我对一切曾经感兴趣的东西，居然提不起一丁点的欲望，哪怕是最基础的欲望...站在公司的阳台往下看，会有高空抛物甚至自己往下跳的冲动。</p>
<p>经常在深圳湾，或者海山，找个椅子，一坐一整天。</p>
<p>我知道我应该是抑郁了，而且病的不轻，得赶紧自救。</p>
<p>我的自救措施，其实非常简单，一个是<strong>早睡早起</strong>，另一个，就是<strong>跑步</strong>。</p>
<p>对我的作用也很直观，一个是让自己避开情绪低落的时间，另一个，是可以让自己产生足够的多巴胺去对抗抑郁。</p>
<p>我相信很多人都做不到长期坚持这两件事情，我最开始每天十点睡，然后第二天四点爬起来跑步，也是痛不欲生的，具体花了多长时间才适应，我也忘了，让人痛苦的事，忘掉就忘掉吧。</p>
<p>于是，坚持下去就有了意义，早睡让我避开了所有的无效社交，也避免了所有能在出现半夜产生的消极情绪和欲望，早起让我每天可以比别人多出至少两个小时的时间，坚持一年，就比别人多活了将近一个月。</p>
<p>我不喜欢夜市的灯火，那种热闹让我感到跟这个世界格格不入，我更喜欢凌晨空无一人的街道，因为柏油路上车很少，我可以撒欢的跑。</p>
<p>我时常能回忆起初三在操场上，有次陈琳在背后对着走路的我说：“不要走，跑起来”。所以我经常走着走着就小跑了起来，最开始，在北站附近跑，现在，整个民治街道，几乎没有我没跑过的地方。</p>
<p>后来，跑步就真的把我治愈了，跑步这件事给了我许多与内心单独相处的时间。很快发现，渐渐地，一公里不是问题了；渐渐地，三公里不是问题了；渐渐地，十公里也不是问题了。<strong>身体很贱，只要你给他足够的时间适应，他总能给你意想不到的事情。</strong></p>
<p>早起多出来的时间、通过跑步治愈的身体和抗压的能力，以及精力管理这件事，我也总能给别人分享我的经验和心得，这全是在自救过程中带来的收益。</p>
<p>2024，我平均一个月只能约到一家公司的面试，最后都是因为各种原因被拒，跳槽失败，那又怎样？明年继续呗。</p>
<p>2024，老家遭遇洪灾，损失严重，第一次体会到？重新开始未必不是一件好事。</p>
<p>2024，我依然经历了不少冷眼和诋毁，那又怎样？我的世界里只有两种事，一种叫关我屁事，一种叫关你屁事，任何不能给我带来成长的事情，都是 xx。</p>
<p>所以班长，这个还有两个月不到就结束的 2024 ，其实只要跑起来，找到能让自己分泌多巴胺和内啡肽的事情，就不算是“一事无成”。</p>
<p>既然，做什么事都是消耗一生，那还不如去做点自己喜欢的事。</p>
<p>既然，世界要痛吻以你，那你就抬起手，给他一巴掌。</p>
<p>既然，生活沉闷，但跑起来，不就有风了么。</p>
]]></content:encoded>
      <pubDate>Thu, 31 Oct 2024 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/to-class-master</guid>
    </item>
    <item>
      <title><![CDATA[2023 年终总结：学习是投资回报率最高的行为]]></title>
      <link>https://moya.plus/article/2023-year-end</link>
      <description><![CDATA[我的生存之道，其实就是大胆且无情地拒绝低质量的社交]]></description>
      <content:encoded><![CDATA[<p>2023 年 12 月 5 号，深圳，天气舒适。我开始着手写这篇年终总结。</p>
<p>一年前的今天，深圳发布：所有社区小区、办公场所、餐饮商超及各类公共场所，凭绿码通行，不再查验核酸证明。六天后，取消三天三检三不，深圳全面放开，就此告别新冠疫情。</p>
<p>我们一年前，还在猜疫情结束了会是什么样子，一年以后，我们已经快忘了采核酸时前面那没有尽头的队伍，也忘了被健康码和行程码支配的恐惧，就连下意识掏出手机扫场所码的动作，也成了像是前世才有的记忆。</p>
<p>无论是谁，都最终在某一刻意识到时间的珍贵，并且几乎注定会因懂事太晚而多少有些后悔。回头看，新冠疫情，那已经是一年前的事了，这一年，百般滋味，而你，有没有好好珍惜生活？</p>
<p>今年的总结，我不想像以前的一样，去收集我这一年来各方面的数据，比如读了几本书，跑了多少公里，做了些什么事，然后堆起来呈现。倒不如，我用一个出门在外漂泊一年好友身份，年底了，我们面对面坐着，分享一些我这一年来的体会。</p>
<p>好，我们开始。</p>
<h3 id="学习是投资回报率最高的行为">学习是投资回报率最高的行为</h3><p>今年对我来说比较重要的一件事，就是在 4 月份终于取得了华师管理学学位。自考这件事不容易，没有上过课，一边工作，还要一边挤出时间把十几个科目啃下去。我记得最后一科，我总共考了 4 次，花了 3 年时间，学得特别扎实。今年 11 月份，我也顺利通过了人资四级的考试。</p>
<p>所以身边很多人特别不理解，一个程序员为什么选择了企业管理，还有我业余时间自学的东西，看起来都是那样的毫无意义。也就难免会听到一些风凉话说，花那么多钱学这干嘛，多睡会觉、搓顿好的，难道不比这好。</p>
<p>当然不好，很多人常常拒绝学习，他们拒绝学习的理由和那些痴迷学习的人一样，其实就是不知道它有什么用。一个不读书的人，他肯定也无法体会到，那些喜欢泡在书堆里的人，读书是如何将他与别人拉开差距的。</p>
<p>俞敏洪在和罗胖的一次对话中说到，一个月能读三本书，这样的人没有放弃自己对未来更好的期待。</p>
<p>对，读书这件事本身，可能不会带来任何的既得利益，读书是在我们心中种下一颗颗种子，我们不知道这些种子什么时候会发芽，但当我们在关键时刻使用上，就会改变一些东西。就像夏天来临时，河里的荷花会自然开花一样，但如果我们没有把那些种子种在心里，不管四季如何变化，水面上也不会长出荷花。</p>
<p>学习是可以直接获取收益的，我们掌握一门新技能，是可以直接拿来换取回报的，学习一个新技巧，是可以直接提升工作效率的，通过继续教育提升自己的学历，开除老板跳槽的时候，是肯定会有更多选择的。好消息是，任何知识的获取，都是不可逆的。学习就是人类所有能力的延伸，决定一个人能力的下限，并且这些往往主要取决于你花费的时间和精力。
<img src="https://cos.moya.plus/article/assets/1784681741651-画板-2.png" alt="1784681741651-画板-2" loading="lazy"></p>
<h3 id="一事无成的根本原因就是放弃">一事无成的根本原因就是放弃</h3><p>今年我一直在坚持的事，依旧是坚持早睡早起，坚持跑步，坚持阅读，坚持做好自己想做的事。和大多数内向者一样，我的生存之道，其实就是大胆且无情地拒绝低质量的社交。</p>
<p>如果不是放在心里沉甸甸的朋友，否则毫无意义的社交活动我一定不会去参加。大吃一顿远不够跑十公里给我带来的快乐来的更加满足，尽管今年怎么看怎么不如意，人生的谷底越往下探越是不见底，根本不知道什么时候可以触底反弹，唯一的选择，就是坚持该坚持的事，这样破局的时候才有足够的力量。</p>
<p>今年的下半年开始，我大部分的时间和精力，都是在做一件事，其实就是准备自己的简历。</p>
<p>写完一份个人简历不会很花时间，花时间的，是要努力地往简历上累起一块块敲门砖。自我提升、继续教育，所有对未来有高收益的事情，都值得我当下去投资。因为我知道自己目前所处的环境糟透了，也知道自己如果要想触底反弹，就必须要积累足够的能量，机会要有，肌肉也要有。所以我要努力经营好自己的现在，然后等待未来向我飞奔而来。</p>
<p>8 月 12 号，我的开源组件 birdpaper-ui 发布了 2.x 版本，目前也在有规划的迭代当中，尽管它不是一个完善的解决方案，是犊子中的犊子，但这几年一直坚持的结果也积累了近 8k 的安装量，与其同步进行的，包括完全自己开发的个人博客 Moya、业务组件库、以及中台解决方案等等，也会在明年陆续完成。能力和时间实在有限，做这些的目的，不是非得通过开源实现什么形而上的成就，那些是要靠时间才能印证的东西。直接可以带来提升的，是我的工作效率和能力、产品设计能力，以及完整的项目开发能力，这可都是跳槽的时候拿得出手的大招。</p>
<p>所以努力，和坚持努力，其实并不像传说中的那么辛苦，说出来只不过是每天至少专心学习、工作 6 个小时，做好三四月份该做的事，到八九月自有答案。
<img src="https://cos.moya.plus/article/assets/1784681759606-画板-1.png" alt="1784681759606-画板-1" loading="lazy"></p>
<h3 id="算好时间这笔账">算好时间这笔账</h3><p>为什么我说要算好时间这笔账，其实大家稍微关注下身边的人，就会发现，其实没有人会把时间计入到会计账本的。我们都知道时间这个东西是有成本的，我们作为一个生命个体最为重要的东西，就是时间，没有之一，但即便如此，也没有人会把时间计入到自己的会计账户里。</p>
<p>而我想说的是，如果你能算好时间这笔账，你就不怕找不到做事的动力。</p>
<p>前面我说到我一直坚持早睡早起，由于这几年一直维持着比较好的睡眠质量，所以我在早起这件事上，每天可以比别人多出 2 个小时以上的时间，这 2 个小时我可以用来干吗？</p>
<p>我可以把日常的家务活干完，做个早餐，吃掉，顺便再把午餐给备好，出门跑步半小时，做完这些事情，出门上班，尽管我们打卡时间是 9 点，但我基本可以在八点前就到公司，然后专注于我自己的想做的事情上面，刷完「得到」某个课程的某一小节，听完一本书，还能阅读 15 分钟，然后看着同事们卡点上班，在工位上匆忙的把早餐往嘴里送。</p>
<p>所以你看，哪怕一天多出 2 个小时，其实可以干很多事情。一个动作重复 365 次，就足以凑成一些改变。我们从小就知道积少可以成多的道理，但很少人可以做到坚持早起去积累自己的时间账户。</p>
<p>我们来稍微算下这笔账，一天 2 个小时，一年下来，可就是 30 天，而且是不吃不喝不睡，状态最好的 30 天。如果按照八小时工作制计算，那可是连周末都不休息的三个月，这笔账，但凡是个智力正常的人，很难不心动吧。</p>
<p>“没时间了”，跟“没钱了”一样，其可怕程度无异于死亡。那些经常嚷嚷着没有属于自己时间的人，跟不努力工作还想过的好的人一样，本质上其实都是没有经营好自己的会计账本。
<img src="https://cos.moya.plus/article/assets/1784681786469-Web-1920-1.png" alt="1784681786469-Web-1920-1" loading="lazy"></p>
<h3 id="终极生产资料">终极生产资料</h3><p>今年 5 月份，得到同学节在龙华文体中心举办，我当然不能错过这个机会，去现场听了一整天。包括罗胖在内的 12 位同学和老师，在我面前不过十几米的舞台上进行他们的分享，其中最令我惊坐起的，是来自李笑来老师的《时间与财富》，其中提到了时间是终极的生产资料，在得到 App 上可以找到当时的演讲视频和文稿，感兴趣的可以去听下。</p>
<p>为什么说时间是终极的生产资料，我们知道，要获得财富，无非三种形式：生产、销售和投资，而这三种形式，每个都需要同一个生产资料，就是时间。</p>
<p>时间是我们唯一的终极生产资料，干什么都需要这个，而大部分人的选择，却是把时间给直接出售——打工，卖给老板们。</p>
<p>举个例子，泥巴是可以造砖头的，那你说是卖泥巴赚钱，还是卖砖头赚钱？当然是卖砖头赚钱，我们需要对时间这个生产资料发出“生产”的动作，才是一个智慧人类的操作。但是我们从小到大花了这么多钱，上了这么长时间的学校，所接受的教育，竟然是让我们成为一个直接销售生产资料的人。这是我们大多数人面临的核心困境。</p>
<p>每一个不选择放弃，乐观的人，都应该好好想想，你这一生，可用于生产的时间有多少？如何获得更多的时间、如何复制时间，以及如何避免直接销售我们的时间——这个极其宝贵的生产资料。</p>
<p><img src="https://cos.moya.plus/article/assets/1784681801040-AIV21f833b5ea4aad989caa1f601486f0dcc51920.jpg" alt="1784681801040-AIV21f833b5ea4aad989caa1f601486f0dcc51920" loading="lazy"></p>
<h3 id="时间的朋友">时间的朋友</h3><p>今年罗胖的 2024《时间的朋友》跨年演讲，将在深圳湾体育中心春茧体育馆举办，这也是我第一次去现场参加。我尽管不是罗胖的粉丝，跨年演讲线上也可以看，但是我和跨年演讲这个 IP 却有着说不出来的种种联系，去一次现场，用这种方式告诉身边的人，我没有躺平。</p>
<p>2017 年《时间的朋友》第一次在深圳，我还在读大学。</p>
<p>2019 年第二次在深圳，就是讲小趋势那一回，我在加班，加完班回去的路上，在春茧场馆外逗留了一下，就当是去过了吧。</p>
<p>2023 年第三次在深圳，地点选在了离我住处不到 6 公里的深圳书城，其实就是我经常跑步的龙华大道那条路，但是没有对外售票，也就没能去成。</p>
<p>2024 年，终于给自己圆满了一次。后天，也就是 31 号晚上，我将去现场听罗胖 4 个小时的演讲，期待他向 27 位创业者请教的结果。</p>
<p>时间是做事的人的朋友，是不做事人的敌人。感谢你能够读到这里，这篇年终总结，是我这一年值得跟你分享的某些书、某些时刻、某些人生经验，凝聚成这三千多字给你。差不多到这，新的一年，我将通过公众号、掘金、以及我即将上线的个人博客，继续分享更多内容，希望你们有人喜欢。</p>
<p>每个人都应该写一份自己的总结，我所说的总结，不是老板领导们想看的那些屁话，不是那些投在荧幕上花枝招展的 PPT。真正的总结，在相册里的每一个瞬间，在脑海里的每一段画面，在读过的每一本书，看过的每一部电影，跑过的每一条路，交往过的每一个知己；每一个深夜里，楼下传来的烟火气；凌晨四点，晨跑中看过的每一场日出；回访母校，不断唤起的种种回忆；还有餐桌对面，你那许久未见心里沉甸甸的人。</p>
<p>写到最后，刚好也是小米汽车技术发布会结束，2024 迫在眉睫，努力投资自己吧，不断向前的成就，就是对人生最好的奖励。</p>
<p>对于大多数人来说，一年太短了，比小弟弟还短，上个两百多天的班，瞎编五十多份周报，看过十几部烂片，哭过三四次撕心裂肺，闹过一两回肚子，喝掉几百杯奶茶和咖啡，用光二十几卷手纸，挣个十几万再花个二十几万，然后进入下一年的轮回，运气好，再轮回个七八十年，尘归尘，土归土，乌龟王八鳖。</p>
<p><img src="https://cos.moya.plus/article/assets/1784681815665-67971c7f4b472c784ea0822bc28185d6.jpg" alt="1784681815665-67971c7f4b472c784ea0822bc28185d6" loading="lazy"></p>
]]></content:encoded>
      <pubDate>Sun, 31 Dec 2023 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/2023-year-end</guid>
    </item>
    <item>
      <title><![CDATA[木亦：我的 2022 年终总结]]></title>
      <link>https://moya.plus/article/2022-year-end</link>
      <description><![CDATA[富人看不起穷人，穷人能知道，有知识的人看不起无知的人，无知者压根儿就不知道]]></description>
      <content:encoded><![CDATA[<blockquote>
<p>“富人看不起穷人，穷人能知道，有知识的人看不起无知的人，无知者压根儿就不知道。”</p>
</blockquote>
<p>12 月 1 号下午六点，离下班还有半小时。我坐在工位上，呆呆的望着窗外驶过的四号线。</p>
<p>心里盘算着这一年来发生过的事、自己的成长、糟心的经历，还有一些让我觉得醍醐灌顶的时刻。</p>
<p>我开始着手写我这篇年终总结，用文字去记录我这一年看到的东西。</p>
<p>开头引用的那句特别扎心的话，来自于罗胖今年发售的《阅读的方法》。</p>
<p>他在书里说，这句话是他读书的重要动力之一，现在，它也是我今年在得到划线的句子中，最喜欢的一句。</p>
<p>进一寸，有一寸的欢喜。上一层，看一层的风光。</p>
<h3 id="一些遗憾">一些遗憾</h3><p>过去的这一年，我变的比去年懒散了许多，受疫情的影响，这一年我几乎没怎么离开过深圳，导致很多事情没能够去做，自然也就留下了不少遗憾。</p>
<p>有想见的人，也一直没见上面，云烟早就成了雨，落下，滋润着每一颗思念的心。</p>
<h3 id="一些坚持">一些坚持</h3><p>但是一直有在坚持的东西，也在今年不断给我带来收获，跑步就是其中一个。</p>
<p>在 keep 上记录的跑步数据显示，我总共跑了 570 公里，行走 900 公里。从去年初 2km 都无法坚持跑完的状态，到现在可以轻松跑完十公里。</p>
<p>跑步治愈了我身体或者心理上各种难以描述的问题，并且一定程度上提升了我的心肺功能，让我可以用更充沛的精力去应对生活和工作。</p>
<p>第二个是早睡早起，这已经成为了一种习惯，不仅给我带来了还算不错的睡眠质量，我还能有更多时间花在自己身上。</p>
<p>我会提前一小时左右到公司上班，这个习惯也坚持了将近两年，利用这一小时，我可以比别人更快进入工作状态，效率更高的完成工作，或者读完十几页的书。</p>
<p>第三，是阅读。我忘了是谁，但是他说过这么一句话，就是投资自己成本最低的方式，就是阅读。这是一种能让你持续向上的习惯，是区别无知者和有知者的途径。</p>
<p>截止到 12 月 20 号，我今年在得到读完了 31 本书，学完 24 门课，听书 25 本，累计学习824 小时，收藏划线笔记441 条，在这篇总结的结尾，我会分享一些我今年最喜欢的几本书。</p>
<h3 id="关于工作和职场">关于工作和职场</h3><p>今年在职场经历了一些糟心事，这些糟心事也彻底打掉了我在本职工作上的所有干劲，也产生了在计划时间内必须离职的念头。</p>
<p>作为技术团队的其中一员，我深刻体会到为什么同样是技术团队，其他企业的团队氛围可以是那么的好，而在这却如此的沉闷。</p>
<p>各有各的圆滑，敢说真话的人很少，反馈问题会被当做是抱怨，沟通断层，甚至看不到晋升的空间和希望，绩效没有幸福感，更也起不到激励作用。</p>
<p>我很感谢这其中有一个月左右的轮岗工作，在完成工作目标之余，也通过强调自测工作，提升了团队一定的工作质量，我也确实从中学到了一些东西。</p>
<p>在轮岗分享会上，我也提出需要照顾到下属的情绪价值，对这一届的年轻人来说，传统的管理方式，是行不通的。</p>
<p>对于这一届的年轻人来说，谁赋予他们情绪价值，他们就会信任谁，这跟谁给他发工资没关系。</p>
<p>对于一个组织来讲，最有效的一定是发声，只有想办法发声才能改变，同时对组织有利。</p>
<h3 id="关于-birdpaper-design">关于 Birdpaper Design</h3><p>今年以来，这个开源项目其实就一直处于半停滞的状态，只更新了三次，期间有不少来自掘金和其他开源社区的小伙伴来跟进动态，但我也只能说，真的太忙了。</p>
<p>目前整个项目计划也被重新整理和排期，新的 UI 也已经设计完成，预计会在明年 3 月前完成。</p>
]]></content:encoded>
      <pubDate>Sat, 31 Dec 2022 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/2022-year-end</guid>
    </item>
    <item>
      <title><![CDATA[Table 组件自定义列宽实现核心方法]]></title>
      <link>https://moya.plus/article/table-custom-col-width</link>
      <description><![CDATA[如果你打算自己手动实现一个 Table 组件，并且对支持定义列宽属性的实现毫无头绪，那这篇文章大概率可以帮你梳理一些逻辑和核心方法的实现]]></description>
      <content:encoded><![CDATA[<p>如果你使用过类似于 ElementUI 的组件库，一定对如下的 API 属性不眼生，例如：</p>
<pre><code class="hljs language-html"><span class="hljs-comment">&lt;!-- Element UI --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">el-table-column</span> <span class="hljs-attr">prop</span>=<span class="hljs-string">&quot;date&quot;</span> <span class="hljs-attr">label</span>=<span class="hljs-string">&quot;日期&quot;</span> <span class="hljs-attr">min-width</span>=<span class="hljs-string">&quot;150&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">el-table-column</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">el-table-column</span> <span class="hljs-attr">prop</span>=<span class="hljs-string">&quot;name&quot;</span> <span class="hljs-attr">label</span>=<span class="hljs-string">&quot;姓名&quot;</span> <span class="hljs-attr">width</span>=<span class="hljs-string">&quot;200&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">el-table-column</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">el-table-column</span> <span class="hljs-attr">prop</span>=<span class="hljs-string">&quot;province&quot;</span> <span class="hljs-attr">label</span>=<span class="hljs-string">&quot;省份&quot;</span> <span class="hljs-attr">width</span>=<span class="hljs-string">&quot;200&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">el-table-column</span>&gt;</span>

<span class="hljs-comment">&lt;!-- and-design for vue --&gt;</span>
 cols: [
    { title: &#x27;日期&#x27;,dataIndex: &#x27;date&#x27;,key: &#x27;date&#x27;, minWidth: 150 },
    { title: &#x27;姓名&#x27;,dataIndex: &#x27;name&#x27;,key: &#x27;name&#x27;, width: 200 },
    { title: &#x27;省份&#x27;,dataIndex: &#x27;province&#x27;,key: &#x27;province&#x27;, width: 200 },
],
</code></pre><p>上面的例子中，Table 组件支持自定义最小宽度<code>min-width</code>和固定宽度<code>width</code>，如果不设置，则默认填充剩余宽度。</p>
<p>如果你打算自己手动实现一个 Table 组件，并且对支持定义列宽属性的实现毫无头绪，那这篇文章大概率可以帮你梳理一些逻辑和核心方法的实现。</p>
<p>注：这也许不是最佳的实现方案。</p>
<h3 id="一些准备工作">一些准备工作</h3><p>这里假定使用的是类似于<code>and-design for vue</code>的实现方式，即列的属性配置是通过额外的数组对象传入的，</p>
<p>除了<code>title</code>-列表头名，<code>key</code>-列值对应的键外，还有这篇文章涉及到的最小宽度<code>minWidth</code>和固定宽度<code>width</code>，并通过组件属性<code>cols</code>传入。</p>
<h3 id="colgroup-和-col">colgroup 和 col</h3><p>这里需要用到<colgroup>和<col>标签，以便更好的去控制每列的属性信息，两个标签均支持传入<code>width</code>属性控制列宽度，不同的是，<col>控制的是单列的宽度，而<colgroup>可以控制所包含在内的<col>。</p>
<p>除此之外，这两个标签还有如下注意事项：</p>
<ul>
<li><code>colgroup</code>需在 table 标签中</li>
<li><code>col</code>需在 colgroup 标签中，且只能包含 <col> 标签</li>
<li>两者均无法为表格创建列，仅控制列的展现形式</li>
<li>在 xhtml 中，<code>col</code>必须含有结束标签</li>
</ul>
<p>根据我们的需求，我们需要单独控制每一列的宽度展示，并在浏览器宽度变化时实时的重新计算并且重新渲染列。</p>
<p>大致的功能如下：</p>
<ul>
<li>含有<code>width</code>的列，宽度固定，不随浏览器宽度变化而变化</li>
<li>含有<code>minWidth</code>的列，在大于设定值时，自动填充 table 剩余宽度，小于设定值时，固定该宽度</li>
<li>不包含<code>width</code>和<code>minWidth</code>的列，自动填充 table 剩余宽度</li>
</ul>
<p>最终实现如下渲染</p>
<pre><code class="hljs language-html"><span class="hljs-tag">&lt;<span class="hljs-name">template</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">colgroup</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">col</span>
                 <span class="hljs-attr">v-for</span>=<span class="hljs-string">&quot;(item, index) in columns&quot;</span>
                 <span class="hljs-attr">:key</span>=<span class="hljs-string">&quot;`table-tr-${index}`&quot;</span>
                 <span class="hljs-attr">:name</span>=<span class="hljs-string">&quot;`table_tr_${index}`&quot;</span>
                 <span class="hljs-attr">:width</span>=<span class="hljs-string">&quot;`${item.width}px`&quot;</span>
                 /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">colgroup</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">template</span>&gt;</span>
</code></pre><h3 id="核心实现">核心实现</h3><h4 id="一些常量-变量定义">一些常量/变量定义</h4><pre><code class="hljs language-javascript"><span class="hljs-comment">/** Table 实例 */</span>
<span class="hljs-keyword">const</span> bpTable = <span class="hljs-title function_">ref</span>(<span class="hljs-literal">null</span>);

<span class="hljs-comment">/** 最终用于渲染的 columns 表头列表 */</span>
<span class="hljs-keyword">const</span> columns = <span class="hljs-title function_">ref</span>([]);

<span class="hljs-comment">/** 表格所占的实际宽度 px */</span>
<span class="hljs-keyword">const</span> _table_width = <span class="hljs-title function_">ref</span>(<span class="hljs-string">&quot;&quot;</span>);

<span class="hljs-comment">/** 在没有设定宽度时，可用于撑开剩余宽度的列数 */</span>
<span class="hljs-keyword">let</span> _remainder_col = <span class="hljs-number">0</span>;

<span class="hljs-comment">/** 固定宽度（包含自定义的宽和最小宽的总和） */</span>
<span class="hljs-keyword">let</span> _fixed_width = <span class="hljs-number">0</span>;

<span class="hljs-comment">/** 各列最小宽度数组 */</span>
<span class="hljs-keyword">let</span> _min_width_list = [];

<span class="hljs-comment">/** 表格各列宽度数组 */</span>
<span class="hljs-keyword">let</span> _col_width_list = [];

<span class="hljs-comment">/** 单列最小宽度 */</span>
<span class="hljs-keyword">const</span> _min_column_width = <span class="hljs-number">80</span>;
</code></pre><h4 id="初始化表头列表-initcolumns">初始化表头列表 initColumns</h4><p>在表格整体渲染结束，能获取 table 实际宽度后，需要执行表头列表初始化，对传入的<code>props</code>中的<code>cols</code>进行处理，计算实际每一列需要<code>width</code>值。</p>
<pre><code class="hljs language-javascript"><span class="hljs-comment">/**
 * 初始化表头列表
 * <span class="hljs-doctag">@returns</span> <span class="hljs-variable">Array</span>
 */</span>
<span class="hljs-keyword">const</span> <span class="hljs-title function_">initColumns</span> = (<span class="hljs-params"></span>) =&gt; {
    <span class="hljs-keyword">const</span> el = bpTable.<span class="hljs-property">value</span>;
    <span class="hljs-keyword">const</span> { cols } = props;
    
    <span class="hljs-comment">/** 每次需要初始化的一些值 */</span>
    _fixed_width = <span class="hljs-number">0</span>;
    _remainder_col = cols.<span class="hljs-property">length</span>;
    _min_width_list = [];
    
    <span class="hljs-comment">// 1. 处理含有固定宽度和最小宽的列</span>
    
    <span class="hljs-comment">// 2. 获取各列宽度，并组成一个数组</span>
            
            <span class="hljs-comment">// 计算需要自适应的列宽度</span>

    <span class="hljs-comment">// 3. 输出 columns</span>
}
</code></pre><h4 id="处理含有固定宽度和最小宽的列">处理含有固定宽度和最小宽的列</h4><p>如果含有自定义的宽和最小宽，则需要单独处理这些列，使其不参与剩余宽度自适应当中，处理逻辑如下：</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; cols.<span class="hljs-property">length</span>; i++) {
    <span class="hljs-keyword">const</span> { width, minWidth } = cols[i];

    <span class="hljs-keyword">if</span> (width) {
        _fixed_width += <span class="hljs-title class_">Number</span>(width);
        _remainder_col--;
    }
    minWidth &amp;&amp; _min_width_list.<span class="hljs-title function_">push</span>(minWidth)
}
</code></pre><h4 id="获取各列宽度-并组成一个数组-getwidthlist">获取各列宽度，并组成一个数组 getWidthList</h4><p>这个方法目的返回一个数组，包含各列的宽度值，最后匹配到<code>columns</code>中。</p>
<pre><code class="hljs language-javascript"><span class="hljs-comment">/**
 * 获取各列宽度，并组成一个数组
 * <span class="hljs-doctag">@returns</span> Array width_list
 */</span>
<span class="hljs-keyword">function</span> <span class="hljs-title function_">getWidthList</span>(<span class="hljs-params"></span>) {
    <span class="hljs-keyword">const</span> { cols } = props;

    <span class="hljs-comment">/** 各列宽度数组 */</span>
    <span class="hljs-keyword">let</span> width_list = [];

    <span class="hljs-comment">/** 自适应列宽 */</span>
    <span class="hljs-keyword">let</span> adapt_width = <span class="hljs-title function_">getAdaptWidth</span>();

    <span class="hljs-comment">/**
     * 当表格中含有设置最小宽度的列时，需要挨个比较自适应宽是否小于最小宽度
     * 如果小于，则重新设置各个值并重新计算自适应宽度
     */</span>
    <span class="hljs-keyword">if</span> (_min_width_list.<span class="hljs-property">length</span>) {
        _min_width_list.<span class="hljs-title function_">map</span>(<span class="hljs-function">(<span class="hljs-params">item, index</span>) =&gt;</span> {
            <span class="hljs-keyword">if</span> (adapt_width &gt; item) {
                _fixed_width += item;
                _remainder_col--;
                _min_width_list.<span class="hljs-title function_">splice</span>(index, <span class="hljs-number">1</span>);
                adapt_width = <span class="hljs-title function_">getAdaptWidth</span>();
            }
        });
    }

    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; cols.<span class="hljs-property">length</span>; i++) {
        <span class="hljs-keyword">const</span> { width, minWidth } = cols[i];

        <span class="hljs-comment">// 设置成固定宽度</span>
        <span class="hljs-keyword">if</span> (width) { width_list.<span class="hljs-title function_">push</span>(width); <span class="hljs-keyword">continue</span>; }

        <span class="hljs-comment">// 是否设置成最小宽度：当含有最小宽度属性并且最小宽度大于计算得出的最大列宽</span>
        <span class="hljs-keyword">const</span> hasMinWidth = minWidth &amp;&amp; minWidth &gt; adapt_width;
        <span class="hljs-keyword">if</span> (hasMinWidth) { width_list.<span class="hljs-title function_">push</span>(minWidth); <span class="hljs-keyword">continue</span>; }

        <span class="hljs-comment">// 如果没有定义宽度和最小宽，则设置成自适应宽度或者最小预设宽度</span>
        width_list.<span class="hljs-title function_">push</span>(adapt_width &lt; _min_column_width ? _min_column_width : adapt_width);
    }
    <span class="hljs-keyword">return</span> width_list;
}
</code></pre><h4 id="计算需要自适应的列宽度-getadaptwidth">计算需要自适应的列宽度 getAdaptWidth</h4><p>在表格整体渲染结束，能获取 table 实际宽度后，需要计算允许列自适应的宽度有多少，如果所有列都没有设置宽度值，这时候自适应的列宽即为 table 的实际宽度，列宽平均分布就行了。</p>
<pre><code class="hljs language-javascript"><span class="hljs-comment">/**
 * 根据表格实际宽度、已固定的列宽、以及剩余自适应列数，计算得出自适应列宽
 * <span class="hljs-doctag">@returns</span> Number width
 */</span>
<span class="hljs-keyword">function</span> <span class="hljs-title function_">getAdaptWidth</span>(<span class="hljs-params"></span>) {
    <span class="hljs-keyword">let</span> width = (_table_width.<span class="hljs-property">value</span> - _fixed_width) / _remainder_col;
    <span class="hljs-keyword">return</span> <span class="hljs-title class_">Number</span>(width).<span class="hljs-title function_">toFixed</span>(<span class="hljs-number">2</span>);
}
</code></pre><h4 id="监听屏幕变化和树形更新">监听屏幕变化和树形更新</h4><p>触发<code>initColumns</code>的时机有三个</p>
<ul>
<li>初次加载表格组件</li>
<li>列属性有更新时</li>
<li>屏幕宽度变化时</li>
</ul>
<pre><code class="hljs language-javascript">  <span class="hljs-title function_">watch</span>(<span class="hljs-function">() =&gt;</span> props.<span class="hljs-property">cols</span>, <span class="hljs-function">() =&gt;</span> { <span class="hljs-title function_">initColumns</span>() });

  <span class="hljs-title function_">onMounted</span>(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-title function_">nextTick</span>(<span class="hljs-function">() =&gt;</span> {
      <span class="hljs-title function_">initColumns</span>();
      <span class="hljs-title function_">on</span>(<span class="hljs-variable language_">window</span>, <span class="hljs-string">&#x27;resize&#x27;</span>, <span class="hljs-title function_">throttle</span>(<span class="hljs-function">() =&gt;</span> <span class="hljs-title function_">initColumns</span>(), <span class="hljs-number">400</span>));
    });
  });

  <span class="hljs-title function_">onBeforeUnmount</span>(<span class="hljs-function">() =&gt;</span> <span class="hljs-title function_">off</span>(<span class="hljs-variable language_">window</span>, <span class="hljs-string">&#x27;resize&#x27;</span>, <span class="hljs-function">() =&gt;</span> <span class="hljs-title function_">initColumns</span>()));
</code></pre>]]></content:encoded>
      <pubDate>Mon, 31 Oct 2022 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/table-custom-col-width</guid>
    </item>
    <item>
      <title><![CDATA[前端实战｜接口请求参数混淆方案分享]]></title>
      <link>https://moya.plus/article/api-encrypt-fun</link>
      <description><![CDATA[在一些接口请求的场景中，我们希望携带的数据不希望是以明文的方式提交的，也就是需要对参数做一些混淆或者加密处理，后端拿到数据后再进行解密，得到真实数据]]></description>
      <content:encoded><![CDATA[<h3 id="写在前面">写在前面</h3><p>在一些接口请求的场景中，我们希望携带的数据不希望是以明文的方式提交的，也就是需要对参数做一些混淆或者加密处理，后端拿到数据后再进行解密，得到真实数据。</p>
<p>其目的是为了保护数据的安全，以及提高被识破成明文的门槛。在例如用户登录的接口请求中，如果账号和密码是以明文传输的，会容易导致一些安全性问题，同时，我们也不希望谁都可以伪造参数对接口发起请求，因此前端参数混淆非常有必要，这里分享一个自用的方案。</p>
<h3 id="什么接口的参数需要做处理">什么接口的参数需要做处理</h3><p>从安全角度出发，这里一致认为，只要是对数据库有新增、修改、删除操作的，一律需要做混淆/加密，这一类接口，多为<code>post</code>、<code>put</code>、<code>delete</code>等请求。</p>
<p>而对于<code>get</code>请求，如果是规范化的接口，一般只是获取数据，不会对数据库有直接的操作，故不需要做参数处理。</p>
<p>当然还有<code>post</code>请求，却不希望做参数处理的接口，需要特殊处理，以及在开发环境中，为了方便调试，也不需要做处理。</p>
<h3 id="参数处理">参数处理</h3><p>因为<code>Rsa</code>在处理数据量较大时优势不明显，所以对参数数据的处理采用了<code>Aes</code>加密，而参与加密的密钥<code>key</code>则采用<code>Rsa</code>非对称加密提高破解难度。</p>
<p>这里使用的方案是，先将原始数据处理为<code>query</code>形式的字符串，然后将其使用随机字符串作为密钥，参与<code>Aes</code>加密，并截取特定的字符串，作为原始密钥，再进行一次<code>Aes</code>加密，最后将原始密钥使用与后端约定好的公钥进行<code>Rsa</code>加密处理，具体算法如下：</p>
<pre><code class="hljs language-javascript"><span class="hljs-comment">/**
* 加密请求数据
* <span class="hljs-doctag">@param</span> {<span class="hljs-type">Object</span>} rawData 原始数据
* <span class="hljs-doctag">@returns</span> {<span class="hljs-type">data, key</span>}
*/</span>
<span class="hljs-keyword">export</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">encryptRequestData</span>(<span class="hljs-params">rawData</span>) {
 <span class="hljs-comment">// 字典排序并赋值</span>
 <span class="hljs-keyword">var</span> result = {}, str = [], arr = <span class="hljs-title class_">Object</span>.<span class="hljs-title function_">keys</span>(rawData).<span class="hljs-title function_">sort</span>();
 arr.<span class="hljs-title function_">map</span>(<span class="hljs-function"><span class="hljs-params">m</span> =&gt;</span> { result[m] = rawData[m] });

 <span class="hljs-comment">// 处理成 query 形式字符串</span>
 <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> p <span class="hljs-keyword">in</span> result)
     result.<span class="hljs-title function_">hasOwnProperty</span>(p) &amp;&amp; str.<span class="hljs-title function_">push</span>(<span class="hljs-built_in">encodeURIComponent</span>(p) + <span class="hljs-string">&quot;=&quot;</span> + <span class="hljs-built_in">encodeURIComponent</span>(result[p]));
     result = str.<span class="hljs-title function_">join</span>(<span class="hljs-string">&quot;&amp;&quot;</span>);

 <span class="hljs-comment">// 参与 Aes 加密的密钥，将处理后的字符串用 16 位随机码对称加密，再从第 3 位开始获取 16 位原始密钥</span>
 <span class="hljs-keyword">const</span> rawKey = <span class="hljs-title function_">aesEncrypt</span>(result, <span class="hljs-title function_">randomString</span>(<span class="hljs-number">16</span>)).<span class="hljs-title function_">substr</span>(<span class="hljs-number">3</span>, <span class="hljs-number">16</span>);

 <span class="hljs-comment">// 输出最后的加密参数</span>
 <span class="hljs-keyword">const</span> data = <span class="hljs-title function_">aesEncrypt</span>(<span class="hljs-title class_">JSON</span>.<span class="hljs-title function_">stringify</span>(rawData), rawKey);
 <span class="hljs-keyword">const</span> key = <span class="hljs-title function_">rsaEncrypt</span>(rawKey);

 <span class="hljs-keyword">return</span> { data, key }
}
</code></pre><h3 id="处理时机">处理时机</h3><p>我们需要在请求拦截的时候对参数做混淆处理，这里只针对<code>post</code>请求以及非本地环境，另外，在实例上还增加了<code>uncrypt</code>来标识哪些接口可以不参与处理。</p>
<pre><code class="hljs language-javascript"><span class="hljs-comment">// 请求拦截</span>
instance.<span class="hljs-property">interceptors</span>.<span class="hljs-property">request</span>.<span class="hljs-title function_">use</span>(
    <span class="hljs-function"><span class="hljs-params">config</span> =&gt;</span> {
        config.<span class="hljs-property">headers</span>.<span class="hljs-property">c</span>

        <span class="hljs-keyword">const</span> token = local.<span class="hljs-title function_">get</span>(<span class="hljs-string">&#x27;token&#x27;</span>)
        token &amp;&amp; (config.<span class="hljs-property">headers</span>.<span class="hljs-property">Authorization</span> = token)

        <span class="hljs-keyword">const</span> { method, uncrypt = <span class="hljs-literal">false</span>, data = {} } = config;
        (method === <span class="hljs-string">&#x27;post&#x27;</span> &amp;&amp; !uncrypt &amp;&amp; cfg.<span class="hljs-property">NODE_ENV</span> === <span class="hljs-string">&#x27;development&#x27;</span>) &amp;&amp; (config.<span class="hljs-property">data</span> = <span class="hljs-title function_">encryptRequestData</span>(data));

        <span class="hljs-keyword">return</span> config
    },
    <span class="hljs-function"><span class="hljs-params">error</span> =&gt;</span> <span class="hljs-title class_">Promise</span>.<span class="hljs-title function_">error</span>(error)
)
</code></pre><h3 id="后端实现">后端实现</h3><p>前端参数处理后以<code>data</code>和<code>key</code>组成的对象提交至后端，服务层接受后进行解密，这里以 Egg.js 的实现为例子。</p>
<h4 id="rsa解密"><code>Rsa</code>解密</h4><pre><code class="hljs language-javascript"><span class="hljs-comment">// RSA 解密</span>
<span class="hljs-title function_">rsaDecrypt</span>(<span class="hljs-params">data</span>) {
    <span class="hljs-keyword">let</span> dataObj;
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-keyword">function</span> (<span class="hljs-params">resolve, reject</span>) {
        <span class="hljs-comment">// 私钥存放在app/extend/pem/private.pem</span>
        fs.<span class="hljs-title function_">readFile</span>(<span class="hljs-string">&#x27;app/extend/pem/private.pem&#x27;</span>, <span class="hljs-keyword">function</span> (<span class="hljs-params">err, pem</span>) {
            <span class="hljs-keyword">const</span> key = <span class="hljs-keyword">new</span> <span class="hljs-title class_">NodeRSA</span>(pem, <span class="hljs-string">&#x27;pkcs8-private&#x27;</span>);
            key.<span class="hljs-title function_">setOptions</span>({ <span class="hljs-attr">encryptionScheme</span>: <span class="hljs-string">&#x27;pkcs1&#x27;</span> });
            <span class="hljs-keyword">try</span> {
                dataObj = key.<span class="hljs-title function_">decrypt</span>(data, <span class="hljs-string">&#x27;utf8&#x27;</span>);
            } <span class="hljs-keyword">catch</span> (e) {
                <span class="hljs-keyword">const</span> second = <span class="hljs-keyword">new</span> <span class="hljs-title class_">NodeRSA</span>(pem, <span class="hljs-string">&#x27;pkcs8-private&#x27;</span>);
                <span class="hljs-keyword">try</span> {
                    dataObj = second.<span class="hljs-title function_">decrypt</span>(data, <span class="hljs-string">&#x27;utf8&#x27;</span>);
                } <span class="hljs-keyword">catch</span> (error) {
                    <span class="hljs-title function_">reject</span>(<span class="hljs-string">&quot;Rsa 解密失败&quot;</span>);
                }
            }
            <span class="hljs-title function_">resolve</span>(dataObj);
        });
    });
}
</code></pre><h4 id="aes解密"><code>Aes</code>解密</h4><pre><code class="hljs language-javascript"><span class="hljs-comment">// Aes 解密</span>
<span class="hljs-title function_">aesDecrypt</span>(<span class="hljs-params">data, customer_key = <span class="hljs-string">&quot;&quot;</span></span>) {
    <span class="hljs-keyword">var</span> key = <span class="hljs-title class_">CryptoJS</span>.<span class="hljs-property">enc</span>.<span class="hljs-property">Utf8</span>.<span class="hljs-title function_">parse</span>(customer_key || <span class="hljs-variable language_">this</span>.<span class="hljs-property">config</span>.<span class="hljs-property">secret</span>.<span class="hljs-property">aes</span>.<span class="hljs-property">key</span>);
    <span class="hljs-keyword">var</span> decrypt = <span class="hljs-title class_">CryptoJS</span>.<span class="hljs-property">AES</span>.<span class="hljs-title function_">decrypt</span>(data, key, {
        <span class="hljs-string">&quot;mode&quot;</span>: <span class="hljs-title class_">CryptoJS</span>.<span class="hljs-property">mode</span>.<span class="hljs-property">ECB</span>,
        <span class="hljs-string">&quot;padding&quot;</span>: <span class="hljs-title class_">CryptoJS</span>.<span class="hljs-property">pad</span>.<span class="hljs-property">Pkcs7</span>
    });
    <span class="hljs-keyword">return</span> <span class="hljs-title class_">CryptoJS</span>.<span class="hljs-property">enc</span>.<span class="hljs-property">Utf8</span>.<span class="hljs-title function_">stringify</span>(decrypt);
}
</code></pre><h4 id="处理中间件">处理中间件</h4><p>新建解密处理的中间件<code>app/middleware/security.js</code></p>
<pre><code class="hljs language-javascript"><span class="hljs-variable language_">module</span>.<span class="hljs-property">exports</span> = <span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> (<span class="hljs-params">ctx, next</span>) {
        <span class="hljs-keyword">const</span> { helper, request } = ctx;
        <span class="hljs-keyword">const</span> { ajaxMsg } = helper;

        <span class="hljs-keyword">const</span> { key, data } = request.<span class="hljs-property">body</span>;
        <span class="hljs-keyword">if</span> (!key || !data) <span class="hljs-keyword">return</span> <span class="hljs-title function_">ajaxMsg</span>(ctx, <span class="hljs-string">&quot;-1&quot;</span>, <span class="hljs-string">&quot;请求参数错误&quot;</span>, <span class="hljs-literal">null</span>, <span class="hljs-number">400</span>);

        <span class="hljs-keyword">let</span> rawKey;
        <span class="hljs-keyword">try</span> {
            rawKey = <span class="hljs-keyword">await</span> helper.<span class="hljs-title function_">rsaDecrypt</span>(key);
        } <span class="hljs-keyword">catch</span> (error) {
            <span class="hljs-keyword">return</span> <span class="hljs-title function_">ajaxMsg</span>(ctx, <span class="hljs-string">&quot;-1&quot;</span>, <span class="hljs-string">&quot;密钥解析失败&quot;</span>, <span class="hljs-literal">null</span>, <span class="hljs-number">400</span>)
        }
        <span class="hljs-keyword">if</span> (!rawKey) <span class="hljs-keyword">return</span> <span class="hljs-title function_">ajaxMsg</span>(ctx, <span class="hljs-string">&quot;-1&quot;</span>, <span class="hljs-string">&quot;密钥解析失败&quot;</span>, <span class="hljs-literal">null</span>, <span class="hljs-number">400</span>);

        <span class="hljs-keyword">const</span> decryptData = <span class="hljs-title class_">JSON</span>.<span class="hljs-title function_">parse</span>(helper.<span class="hljs-title function_">aesDecrypt</span>(data, rawKey));
        <span class="hljs-keyword">if</span> (!decryptData) <span class="hljs-keyword">return</span> <span class="hljs-title function_">ajaxMsg</span>(ctx, <span class="hljs-string">&quot;-1&quot;</span>, <span class="hljs-string">&quot;安全验证未通过&quot;</span>, <span class="hljs-literal">null</span>, <span class="hljs-number">400</span>);

        request.<span class="hljs-property">body</span> = decryptData;

        <span class="hljs-keyword">await</span> <span class="hljs-title function_">next</span>();
    };
};
</code></pre><h4 id="路由中使用">路由中使用</h4><pre><code class="hljs language-javascript"><span class="hljs-keyword">const</span> { router, controller, middleware } = app;
<span class="hljs-keyword">const</span> security = middleware.<span class="hljs-title function_">security</span>(); <span class="hljs-comment">// 接口参数加密</span>

router.<span class="hljs-title function_">post</span>(<span class="hljs-string">&#x27;/common/user/login&#x27;</span>, security, controller.<span class="hljs-property">common</span>.<span class="hljs-property">user</span>.<span class="hljs-property">login</span>); <span class="hljs-comment">// 登录</span>
</code></pre>]]></content:encoded>
      <pubDate>Thu, 31 Oct 2019 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/api-encrypt-fun</guid>
    </item>
    <item>
      <title><![CDATA[用四年时间，书香润身，看红楹渐落，终有所成。]]></title>
      <link>https://moya.plus/article/2023-for-susan</link>
      <description><![CDATA[与其在宿舍乘凉，不如去试试自己可以做成些什么事]]></description>
      <content:encoded><![CDATA[<p>——写在 Susan 大一开学之际</p>
<p>九月，对于大一新生来说，那种扑面而来的未知和自由，会让他们肾上腺素一直保持高位，以此来面对即将到来的人生中各种挑战，以及这个社会的复杂关系。</p>
<p>这些复杂的心情其实可以归结为一个词语，就是：美好。</p>
<p>八年前，我也怀着这份对未知环境所谓的美好，以及满脑子不切实际的想法，一头扎进了大学校园。</p>
<p>印象中我持续了很长时间的兴奋状态，对周围同学充满了好奇，对各种课程都有蹭课的欲望，只要不讨厌的社团，都尽可能地递交了报名申请，军训的时候跑到呕吐，也要挤进特殊方队训练。</p>
<h4 id="试一试-无论结果如何-至少有个结果">试一试，无论结果如何，至少有个结果</h4><blockquote>
<p>面对未知的东西，极佳的态度就是不断的去尝试，青春是用来挥霍的，更是用来试错的。</p>
</blockquote>
<p>在校媒体中心的面试，大家在播音房盘腿坐着，对面是上一届的师兄师姐，跟其他社团一样，与其说是面试，更像是通过自我介绍和聊天，挑个顺眼的留下来。</p>
<p>我在前面的面试中有过几次的自我介绍，所以说的倒也自信。他们不知道的是，那几句流畅的自我介绍，是经过前面几次的磕磕巴巴，一次次改进的结果。</p>
<p>我很顺利地进入了栏目部扛机子，摸到摄影机的第二天就去参与校运会的报道拍摄。同时也顺利的进了学生会的宣传部，在这两个组织的工作也为我的创业经历提供了不少帮助。</p>
<p>所以，对大学生来说，最能浪费的就是时间。修满学分之余，创业也好，或者选择一个社团锻炼自己，这并不是什么特别坏的事情。<strong>与其在宿舍乘凉，不如去试试自己可以做成些什么事。</strong></p>
<h4 id="让自己变得更好-是解决一切问题的关键">让自己变得更好，是解决一切问题的关键</h4><blockquote>
<p>所谓充实的生活，就是在回复自己做过的事情时，能有一种持续的、比较久的满意感。</p>
</blockquote>
<p>与周围人拉开差距不是一件特别容易的事情，能在同一所大学，说明大家的智商差不了多少。没有好捷径，只有笨办法，就是利用别人休息的时候，让自己不断的升级迭代。</p>
<p>我真正在教室上课的时间其实很少，以至于我记忆中没有多少听课的画面。更多的时间，花在了创业、工作室、还有各种兼职。军训结束，就被舍友带着报了名，在饭堂打了一年的大白米饭。可以挣点钱，同时也有免费的餐食，这事划算。</p>
<p>后来跟同学接了创业园的店铺，修过的电脑比认识的同学多，摸过的快递比打过的饭多。</p>
<p>时间比生活费金贵，把 24 小时掰开，揉碎了之后分配到各个琐事的事情上，导致精力不够，休息时间减少。尽管修满了学分，大部分成绩也较为靠前，但这也让我明白，<strong>想做的事情很多，但一天只有 24 小时，不管再忙，都别熬夜。</strong></p>
<h4 id="遇好书-至少读十遍">遇好书，至少读十遍</h4><blockquote>
<p>书是在我们心中种下了一颗又一颗思想的、价值的、眼光的、胸怀的、判断力的种子，我们不知道这些种子什么时候就会被调取出来，但当我们在关键时刻使用上，就会改变人生。</p>
</blockquote>
<p>我在大学只去过四次图书馆，这是我感到遗憾的事情之一，甚至一本书都没有去借阅过，整整三年唯一读完的，也只有默里的《风雨哈佛路》。</p>
<p>所以工作之后我也尽可能的把落下的阅读量补上，每天保证至少阅读十五分钟。富人看不起穷人，穷人能知道。有知识的人看不起无知的人，无知者压根就不知道。</p>
<p>毕业之后，面对的世界是真实且残酷，大学是个不错的可以提前适应这种残酷的环境。高考是最后一次较为公平的竞争，之后会发现，尽管别人各方面可能都没自己优秀，但他所掌握资源足以顶的上大部分人的十年寒窗苦读。</p>
<p>读书是少数可以让自己内心变得更为强大，且门槛低的生活方式。<strong>一个月能读三本书，这样的人没有放弃自己对未来更好的期待。</strong></p>
<h4 id="简历不是大四写的-是用大学四年写的">简历不是大四写的，是用大学四年写的</h4><blockquote>
<p>为什么家长、老师和社会都要求孩子在学习上要肯吃苦，肯努力？</p>
<p>因为他们认为，努力学习之后，必有一个体面光鲜的人生。</p>
<p>然而，现实的残酷之处在于：并不是所有的努力都有回报。</p>
</blockquote>
<p>对于应届生，简历上所体现的，不太可能有丰富的工作经历，以及项目经验，可以跟其他候选人拉开差距的无非三点：<strong>技能证书、社团经历，以及获得的奖项。</strong></p>
<p>这全是靠在大学每一天的积累，才能有的东西。</p>
<p>我大学确实干过不少脑子发热的事，比如大二还没结束，就敢拿着简历叫嚣着找一份全职工作。</p>
<p>那是一份我自己精心设计的简历，从 Photoshop 导出最高分辨率，在中环广场的一家印刷店，5 块钱一张的卡纸，一口气印出去好几顿伙食费，对当时的我来说这可是笔不菲的投资。</p>
<p>包括学校老师的企业，我一共面试了十几次，具体多少家公司倒忘了，尽管没有一家公司肯要我，但幸运的是经过那段日子的磨炼，面试的心态好了许多，抗打击能力也更强了。</p>
<p>人事脚旁垃圾桶里，耷拉着我被对半撕碎的简历。每面试一次，对自身不足的认识就更深一次。因为我并不是真的急需谋求一份工作，而是借着机会锻炼自己的面试经验。</p>
<p>我始终以创业者的心态去经营自己，大学三次创业经历让我深刻认识到，<strong>创业者就像上了发条的钟，你停了，别人还在跑，那你就死了。</strong></p>
]]></content:encoded>
      <pubDate>Sat, 09 Sep 2023 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/2023-for-susan</guid>
    </item>
    <item>
      <title><![CDATA[七月｜越是没耐心的人，越是嘴上挂着长期主义]]></title>
      <link>https://moya.plus/article/202607-mouth-end</link>
      <description><![CDATA[真正的长期主义，是做了再说，甚至做了也不说]]></description>
      <content:encoded><![CDATA[<p>我见过很多没有耐心的人，他们跟我以前一个样。在做一件事之前大张旗鼓，把长期主义当做口头禅，喜欢通过朋友圈分享自己又&quot;长期&quot;了一天。</p>
<p>但其实真正长期主义的人，是不会向外透露任何信息的。因为真正的做事的过程，是安静的，是不需要观众的。</p>
<p>你看身边是不是总有这样的人？早起一两天，就恨不得让全世界知道，发个朋友圈配文&quot;早安，又是元气满满的一天&quot;；刚办完健身房的卡，就确信自己以后裸着能够好看，已经开始物色明年的海边度假目的地了；刚买入一只股票，就希望下周就可以大涨，却又天天跟朋友说自己是&quot;价值投资&quot;。</p>
<p>你看，越是什么事都沉不住气的人，越爱把&quot;长期主义&quot;四个字挂在嘴边。</p>
<p>张口闭口&quot;价值投资、长期持有&quot;，股价波动到三天就坐不住了。账面上少了几百块钱，就开始怀疑人生，开始在网上搜索&quot;要不要止损&quot;。这哪里是什么长期主义，分明就是投机心态披着长期主义的外衣。</p>
<p>真正的长期主义者是什么样的？他们懂得一个道理：复利曲线前面那一段，是平缓的、甚至是看不到任何回报的。但他们不会因此焦虑，不会因此怀疑自己，更不会因此放弃。因为他们知道，只要你坚持下去，到了某个临界点，曲线就会陡然上升，而那一段的回报，可比之前所有的加起来还要多。</p>
<p>所以长期主义者都善于把握&quot;复利曲线&quot;的最后一段，于是极具耐心地度过前面平稳的一大段。这段时间可能是几个月，也可能是几年，但他们都甘之如饴。</p>
<p>但这里有个前提，也是很多人忽略的一点：你的身体得撑得住。</p>
<p>任何一次病倒，都是乱了大计的事情。不仅浪费你自己的时间和金钱，还会浪费你家人甚至朋友的时间和金钱。你以为生病只是你一个人的事？不是的，你的家人要照顾你，你的朋友要担心你，你手上的工作要别人帮你顶着。</p>
<p>最要命的是，长期主义者都最害怕的事情：赚不到最有价值的那一段。你前面熬过了那么多平淡无奇的日子，眼看着就要到那个临界点了，结果身体垮了，一切归零。这种感觉，就像你辛辛苦苦种了一棵树，眼看着就要结果了，结果一场暴风雨把它连根拔起。</p>
<p>所以你看，真正的长期主义者，首先得是一个懂得照顾自己的人。他们不会为了短期的快感而透支身体，不会为了所谓的&quot;拼搏&quot;而牺牲健康。因为他们知道，健康才是长期主义的基石，没有这个基石，一切都是空中楼阁。</p>
<p>还有一点很有意思。那些天天喊着长期主义的人，往往是最着急看到结果的。他们把长期主义当成了一种速成的方法论，以为只要自己喊几句口号，发几条朋友圈，结果就会自动到来。但现实是，长期主义恰恰是反速成的，它要求你放下对即时反馈的渴望，要求你忍受漫长的寂寞，要求你在看不到希望的时候依然坚持。</p>
<p>因为真正的长期主义，是做了再说，甚至做了也不说。</p>
]]></content:encoded>
      <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/202607-mouth-end</guid>
    </item>
    <item>
      <title><![CDATA[Inkword 七月更新｜新域名、素材库上线！]]></title>
      <link>https://moya.plus/article/inkword-update-202607</link>
      <description><![CDATA[2026-07 Inkword 产品更新]]></description>
      <content:encoded><![CDATA[<p>整个七月，Inkword 一共更新了 5 次迭代，作为个人开发者，我在工作之余也尽可能的保证了每周有一次功能更新。</p>
<p>以下是具体的更新内容：</p>
<h2 id="01">01.</h2><p><strong>开放编辑器免登录使用</strong></p>
<p>之前使用 Inkword 编辑器需要先注册账号，这个门槛让不少想要快速体验产品的用户止步。这次更新彻底移除了这个限制，现在你可以直接打开编辑器，无需注册或登录，即可使用公众号排版编辑器的大部分核心功能。</p>
<p>这意味着你可以：</p>
<ul>
<li>零门槛体验编辑器的排版能力</li>
<li>快速完成一次公众号文章的排版，再决定是否注册</li>
<li>让 Inkword 回归「即开即用」的本质</li>
</ul>
<p>与此同时，编辑器的整体性能体验也得到了进一步的优化。文件读取速度明显提升，大文档的加载和编辑过程更加流畅，卡顿感显著减少。无论你是新用户还是老用户，都能感受到更丝滑的编辑体验。</p>
<p><img src="https://cos.moya.plus/article/assets/1785718045844-image.png" alt="1785718045844-image" loading="lazy"></p>
<h2 id="02">02.</h2><p><strong>丰富编辑器组件库</strong></p>
<p>组件是 Inkword 编辑器的核心能力之一，这次更新在组件库中新增了多个实用组件，包括：</p>
<ul>
<li><strong>阅读统计组件</strong>：在文章末尾展示阅读量、点赞数等互动数据，增强读者的参与感</li>
<li><strong>数据统计组件</strong>：用于展示关键数据指标，适合产品发布、年度总结等场景</li>
</ul>
<p>除了新增组件，我们也对现有组件进行了持续打磨：</p>
<ul>
<li>提供更多可自定义的样式选项，让你能更灵活地调整组件的外观</li>
<li>修复了多个组件在不同主题下的样式适配问题</li>
<li>优化了组件的交互体验，拖拽、编辑、预览都更加顺畅</li>
</ul>
<p>更新目标是让每一个组件都足够好用、好看，帮你节省排版时间，把精力留给内容创作本身。</p>
<p><img src="https://cos.moya.plus/article/assets/1785718256942-image.png" alt="1785718256942-image" loading="lazy"></p>
<h2 id="03">03.</h2><p><strong>素材库上线</strong></p>
<p>在此之前，Inkword 已经支持配置自定义图床（如 COS、OSS 等），但对于没有图床或者不想折腾配置的用户来说，使用门槛依然偏高。</p>
<p>现在，素材库正式上线。你可以在 Inkword 内直接上传、管理你的图片素材，并在编辑组件中一键引用。整个流程无需离开编辑器，素材管理与内容创作完全打通。</p>
<p>素材库的核心能力包括：</p>
<ul>
<li><strong>云端存储</strong>：图片上传后自动存储在云端，多端同步，随时随地可用</li>
<li><strong>组件内直用</strong>：在图片、封面、头图等组件中直接从素材库选择图片，无需手动复制链接</li>
<li><strong>可视化管理</strong>：支持预览、搜索、删除等操作，素材再多也不怕找不到</li>
</ul>
<p>此外，为了让更多用户能无负担地开始使用，新用户注册的存储额度也从原来的 20MB 提升到了 <strong>200MB</strong>，翻了一倍。对于日常的公众号图文创作来说，这个额度已经足够充裕。</p>
<p><img src="https://cos.moya.plus/article/assets/1785718432300-image.png" alt="1785718432300-image" loading="lazy"></p>
]]></content:encoded>
      <pubDate>Sat, 01 Aug 2026 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://moya.plus/article/inkword-update-202607</guid>
    </item>
  </channel>
</rss>