<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Log4D</title>
  <link href="https://blog.alswl.com/index.xml" rel="self"/>
  <link href="https://blog.alswl.com/"/>
  <updated>2026-02-08T23:16:56+08:00</updated>
  <id>https://blog.alswl.com/</id>
  <author>
    <name>alswl</name>
  </author>
  <generator>Hugo -- gohugo.io</generator>
  <entry>
    <title type="html"><![CDATA[2025 年终总结 - 临界点]]></title>
    <link href="https://blog.alswl.com/2026/02/my-2025/"/>
    <id>https://blog.alswl.com/2026/02/my-2025/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2026-02-08T23:16:56+08:00</published>
    <updated>2026-02-08T23:16:56+08:00</updated>
    
    <content type="html"><![CDATA[<blockquote>
<p>好是卓越的敌人。</p>
<p>吉姆·柯林斯，《从优秀到卓越》</p></blockquote>
<p>年终总结拖到二月才动笔。想写的东西很多，落笔时又觉得这一年很难用几句话收束，像是被推着走到某个坎上，迈了一步。</p>
<hr />
<h2 id="生活">生活</h2>
<p>2025 年，我继续用照片来记录生活。
不同的光影，落在过去一年的不同时刻。
有些旅行源于一时心动，说走就走；有些则是酝酿已久的奔赴。</p>
<p>经历不同的旅途，遇见各异的风景，触摸历史的温度，也投身自然的怀抱。
转一圈回来，还是要回到自己的生活里，平淡亦浓烈。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/fuji-yamanakako.jpeg" alt="fuji-yamanakako"  />


</p>
<p><small>富士山山中湖，摄于日本山梨县。</small></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/national-mosque-of-malaysia.jpeg" alt="national-mosque-of-malaysia"  />


</p>
<p><small>国家清真寺，摄于马来西亚吉隆坡。</small></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/langkawi.jpeg" alt="langkawi"  />


</p>
<p><small>霞光落日，摄于马来西亚兰卡威。</small></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/dali.jpeg" alt="dali"  />


</p>
<p><small>婚礼的蓝调时光，摄于大理云想山。</small></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/dalian.jpeg" alt="dalian"  />


</p>
<p><small>海鸥，摄于大连星海广场。</small></p>
<p>家中小朋友已经过了随便做什么都显得可爱的年龄。
他开始收到学业的要求：课业、体育、音乐，各类教育轮番上阵。
训练大模型固然困难，训练家中小模型也挺不容易的，
尤其这个小模型一开始就是智力涌现，并且叛逆因子还挺高。😄</p>
<p>家庭生活中，双方亲密关系永远是最重要的支柱。
我和我老婆在温暖、摩擦、包容、依赖中不断调整，寻找更舒服的相处方式。
伴侣是最接近世界上另一个我的形态，好的亲密关系会相互扶持，一起探索和体验世间。</p>
<p>年初设定的 OKR 明显落后，主要受精力投入影响，今年可支配时间比我预期还要少：
阅读与开源项目进展良好，健康与投资几乎停滞。
年底精简了目标，计划再砍掉一批 KR，只保留职业、家庭关系与身体三类。
减少目标帮助更稳定更聚焦，也不用再持续占用注意力去权衡优先级。</p>
<h2 id="工作">工作</h2>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/a-park.jpeg" alt="a-park"  />


</p>
<p>回看这一年时，很难用单一词汇去概括。
这既是忙碌的一年，也是成长的一年。</p>
<p>我挑了三个关键词：跃升 / 黑天鹅 / Be True。
它们对应三种感受：能力变化、环境变化，以及对人的重新理解。</p>
<p>年初我启动了一个基础设施项目，负责集团算力资源交付。
在 AI 推理规模快速增长的背景下，这块业务增长速度惊人。
24 年年中我接手了集团的算力交付，一度也是站到悬崖边缘，
穿越风雨，历经艰难才稳住。</p>
<p>困难并不在技术和工程本身，更多是问题定义、持续履约、螺旋严谨。
跨 BU 协作、历史系统复杂、责任边界模糊，却要求极高稳定性。
好在这个项目在资源投入、关注度提升、技术持续升级下，年底有了不错的结果。</p>
<p>年中时我接手团队，尽管业务、工程我都相当熟悉，但如何成事、成人对我来说都是新的命题和挑战。
我一度做梦时都在思考业务和产品发展路线。
还好一段时间就恢复到平静，发展不是靠大炼钢铁，还是要回到工程和产品原则，回到时代发展脉搏上。
我持续在思考到底如何经营好团队，最后我得到两个词：Be True，做正确的事情，做真实的自己，对人对己。</p>
<p>我捋了一份团队和组织的书籍清单，放到这里：
<a href="https://www.douban.com/doulist/163363861/">Be True 团队和组织</a></p>
<p>12 月遇到一次黑天鹅生产事故，细节不再阐述，但影响很深远。
这件事并非真正随机。历史债务、责权、安全生产意识不足，必然会在某个时间点集中爆发。
所谓黑天鹅，更多是复杂系统不可预测性的体现。</p>
<p>如何去应对这种不确定性？工程上的问题始终回到第一性原理，去定义问题，去解问题。
业务和团队上，则是要持续围绕客户、解决真实问题，变化只会改变路径。
穿过风暴时，不要被定义，而是自己把定义想清楚。</p>
<p>这一年，AI 对工程工作的影响开始变得具体。
6 月份时我还对 AI Coding 存疑，以为基础设施领域会有更长缓冲期，因为上下文复杂且依赖经验，
但实际体验下来并非如此。使用 AI Coding 工具后，开发效率明显提升，重复劳动减少，探索成本下降。
写代码（Code Typing）未来会成为低效的工程方式，AI Native 应该成为默认选项。
AI 降低执行门槛，同时放大决策质量差异。
能力差距没有被抹平，而是被加速放大：工程师价值逐渐从实现能力转向问题选择与约束设计能力。</p>
<h2 id="个人成长">个人成长</h2>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/beach.jpeg" alt="image"  />


</p>
<p>今年基本没写博客，虽然在内网还是保持每个月有点文字输出，但在社区和自我成长关注上投入非常有限。</p>
<p>回想今年，倒是年初春节时候动心起念，决定一年内完成多邻国英语流程。
130 级打完花了 278 天，起于初春，结束在秋。
接下来我主要围绕 YouTube 和 Bilibili 的原声听力做练习。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/duolingo.png" alt="duolingo"  />


</p>
<p>书籍继续是我思想的避风港，不管工作如何繁忙，还是可以在书本中寻找到智慧和答案。
去年给自己的期望是深刻又朴素，今年在读书选择上，更多添加了一些哲思、组织的输入。</p>
<p>前主管每个月都在大团队分享会给出他的读书心得，我也获益蛮多。
这是一种蛮难得的体验，我一直觉得读书是一件有点私密的事情，但这种形式也让我受益匪浅，
好几本书都丰富了我的读书范围。
未来我也会学习一下这种思想碰撞和交流方式，不用太在意反馈，回到自己初心。</p>
<h3 id="不拘一格--网飞的自由与责任工作法"><a href="https://book.douban.com/subject/35102294/">不拘一格 : 网飞的自由与责任工作法</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/image-20260222183632645.png" alt="image"  />


</p>
<p>Netflix 采用了一种与众不同的人才观。
他们提供行业顶尖的薪酬标准，没有采用末位淘汰制，
而是以是否达到岗位标准作为人才留存的核心依据。
在组织决策方面，Netflix 给予员工较高的信任度，
并通过事后审查的方式进行补充。
基于目标（北极星），日常决策采用情境决策模式，而非领导拍板式决策，
Context, not Control。</p>
<p>对管理者而言，有哪些可以立即执行的行动？
第一，提供更多的信息透明度，给予成员更多的技术决策机会，
同时做好事后的效果追踪和复盘工作。
第二，在各种会议中，特别是月会、周会，不断明确和校准团队的「北极星」目标。</p>
<h3 id="仿生人会梦见电子羊吗"><a href="https://book.douban.com/subject/36701790/">仿生人会梦见电子羊吗?</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/image-20260222184438705.png" alt="image"  />


</p>
<p>自然人和人造人的边界到底是什么。
长得像鸭子，叫声像鸭子，什么都像鸭子，真的是鸭子么？
穿过时间叩问一众 LLM 和 Agent。</p>
<h3 id="松本行弘的程序世界"><a href="https://book.douban.com/subject/6756090/">松本行弘的程序世界</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/image-20260222184428378.png" alt="image"  />


</p>
<p>松本行弘这本书我在十几年前就想读，
彼时的我甚至还去面试了一家使用 Ruby 的创业公司。
没想到读完居然是十几年后了。</p>
<p>书中以高手的姿态评点了当时比较热门的语言，
介绍了自己设计 Ruby 时候的思考和品味判断。
书中也讨论了云的出现、算力的增长、分布式的严谨对技术的影响。
高屋建瓴的视角让大部分知识即便放到今天还是不过气。</p>
<p>时光荏苒，物是人非，Ruby 还是局限在 Web 领域，
Python 则靠 AI 打了翻身仗。
NoSQL 也是进入了稳态，GPU 占领了计算模式高低，
Dart 已经完蛋了，笑。</p>
<p>真希望松本行弘能再出一本新的点评书。</p>
<h3 id="西方思想史十二讲"><a href="https://book.douban.com/subject/34971549/">西方思想史十二讲</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/image-20260222184408610.png" alt="image"  />


</p>
<p>探索宇宙，探索自身，探索存在和真理，这是西方思想史的研究命题。
历史上提出了许多主张，这些主张都需要逻辑自洽，
要么能够服务人的意义感，要么服务于宗教或者国家，
总之是适应时代、适应威权。
我想，学哲学（思想）的朋友是不是会感慨哲学发展的太慢，
几十年几百年才能演进一点点，有种脱离感，脱离当下朝夕发展的科技速度。
但反过来想，正是因为发展太快，变化太多，
我们更需要寻找到一些自我和世界的确定感和稳定感。</p>
<h3 id="从优秀到卓越"><a href="https://book.douban.com/subject/1059769/">从优秀到卓越</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/image-20260222184348960.png" alt="image"  />


</p>
<p>这本书虽然看上去是写给卓越公司管理者的，
谁又不是从一开始就想持续卓越呢，后进生也该看看优等生如何获得成功。
秘诀是：人、思想、行为、持续积累和发展，这是本书的核心结构。
卓越公司需要五级经理人（谦逊、意志、持续贯彻）。
需要去设定方向、远景、战略。
使用刺猬三环分析出：优势、热情、经济增长引擎。
认清信念（憧憬成功）和原则（面对困难）。
经典书籍，常读常新。</p>
<h3 id="格鲁夫给经理人的第一课"><a href="https://book.douban.com/subject/27178870/">格鲁夫给经理人的第一课</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/image-20260222184326348.png" alt="image"  />


</p>
<p>面向管理本质展开：提升团队杠杆率；识别业务限制步骤；目标管理、时间管理、绩效管理。</p>
<h3 id="看见孩子--洞察共情与联结"><a href="https://book.douban.com/subject/36427596/">看见孩子 : 洞察、共情与联结</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/image-20260222184251100.png" alt="image"  />


</p>
<p>没有真正不合格的孩子。
关键是通过耐心和理解去回应真实需求，
即使在困难和变化的时候，也尽量保持自身情绪的稳定去承载孩子的情绪。
这样做其实不仅仅是教育孩子，也在某种程度上再次养育自己。</p>
<h3 id="小米创业思考"><a href="https://book.douban.com/subject/36057097/">小米创业思考</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/image-20260222184235053.png" alt="image"  />


</p>
<p>无比真诚，相当受用。
本来对小米故事不抱多高的预期，以为是讲故事讲奋斗。
读完之后发现雷军真的是敞开心扉说亮话：
从创业的使命问题到战略问题，从宏观方向到微观管理，
都做了不藏着掖着的分享。
有时候觉得讲企业管理已经变成一个显学，
但是从身边的实际感受来看，世界真的是一个草台班子，有大草台班子小草台班子。
雷军的分享是将管理学很多经典著作映照到现实。
这些道理和经验就应该持续讲，反复讲，持续学习，反复学习。</p>
<h3 id="我看见的世界--李飞飞自传"><a href="https://book.douban.com/subject/36672955/">我看见的世界 : 李飞飞自传</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/image-20260222184149026.png" alt="image"  />


</p>
<p>见今年仅有的几篇博客之一：
<a href="https://blog.alswl.com/2025/06/li-feifei/">李飞飞如何获得成功？ - 读「我看见的世界」 | Log4D</a></p>
<h3 id="置身事内--中国政府与经济发展"><a href="https://book.douban.com/subject/35546622/">置身事内 : 中国政府与经济发展</a></h3>
<p>五星评价，看懂中国经济。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/image-20260222184127615.png" alt="image"  />


</p>
<h3 id="芯片浪潮--纳米工艺背后的全球竞争"><a href="https://book.douban.com/subject/36462444/">芯片浪潮 : 纳米工艺背后的全球竞争</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/image-20260222184104291.png" alt="image"  />


</p>
<p>这本书几乎是台积电发展史，
从台湾当局招商引凤凰，到张忠谋到台湾，
再从代工模式发展到纳米时代各项突破，看得叫一个惊心动魄。
时代给机遇，也需要强人能够抓住。
冒着计算过的风险，跨越式发展，美式管理风格都让人印象深刻。
对中芯国际也有了更深的认识。加油吧。</p>
<h3 id="卓有成效的管理者"><a href="https://book.douban.com/subject/1322025/">卓有成效的管理者</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/image-20260223150150345.png" alt="image"  />


</p>
<p>推荐给所有电脑前工作者阅读。</p>
<p>不仅仅带团队的 TL 是管理者，知识工作者也是管理者。
德鲁克提出了 5 个核心要点：时间管理、看重贡献、发挥长处、要事优先、有效决策。
对于普通知识工作者来说，我觉得先从时间管理入手，再做好 OKR 管理和关键决策，
关键决策核心点是充分调研、找到核心问题、明确优势、面向未来。
如果有机会管理团队，则要持续关注团队成员长处。</p>
<p>几个主题我也写过一些文字：
时间管理 <a href="https://blog.alswl.com/2023/02/gtd/">https://blog.alswl.com/2023/02/gtd/</a>；
决策（技术决策）https://blog.alswl.com/2023/07/architecture-design-the-easy-way/ 。
今年争取再写一个关于目标管理的。</p>
<p>每次学习，都感受到德鲁克洞察本质的思考，常读常新。</p>
<h3 id="我的重生日记"><a href="https://book.douban.com/subject/37467106/">我的重生日记</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/image-20260222183452774.png" alt="image"  />


</p>
<p>要是人生像大梦一场，关关卡，困难重，到底该怎么办？
书里写的是作者生病的经历。
现在大家活得越来越久，生病这事，自己或家人都很可能碰上，
这本书就像个真诚的朋友，把生病后的种种感受和经历，一点不藏地告诉我们。
作者生病后日子特别难熬，书里把这些痛苦都写出来了。
他一边和病魔斗争，一边在心里给自己打气，
这些描写很真实，让我们能感受到他的害怕、坚持和对活下去的渴望。
面对风暴的办法只有一个，穿过去。</p>
<h3 id="简读日本史"><a href="https://book.douban.com/subject/35540708/">简读日本史</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/image-20260222183138418.png" alt="image"  />


</p>
<p>富士山的壮丽美景都历历在目。
漫步在东京国立博物馆中，我曾隐隐觉得其历史底蕴稍显单薄，
部分瓷器藏品也显得简陋，直至幕府时代的展品出现，才让人眼前一亮，印象深刻。
而读完这本书我才明白，在大化改新之前，日本的开化程度确实较低，
这也解释了博物馆早期展品相对逊色的缘由。</p>
<p>「山川异域，风月同天」这句诗我们并不陌生，甚至有人说中日同文同种。
但事实上，日本的发展历程有着自己的曲折轨迹，
它历经无序、混乱、贫苦与自卑，也有过爆发式的变革。
如今，日本已然成为东亚文明的重要代表之一，
拥有独特的精神内核与国民性，
与中国既有文化传承上的关联，又走出了截然不同的发展道路。</p>
<h3 id="devops实践指南第2版"><a href="https://book.douban.com/subject/36868981/">DevOps实践指南（第2版）</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/image-20260222183109381.png" alt="image"  />


</p>
<p>我一开始有点轻视这本书，想着自己搞了这么久，工程和方法论应该都是耳熟能详。
但细看之后感觉挺高屋建瓴的，写得很简练精要，
有一些观念梳理比自己想要结构化很多。</p>
<p>有几个印象深刻和反直觉的点：</p>
<ol>
<li>价值流对 DevOps 落地很重要，要帮助上下游团队解决他们的问题</li>
<li>多大的权利解决多大的问题，设定目标很关键</li>
<li>20% 时间用来创建用户不可见的正面价值</li>
<li>形成流动，从 Source 到 Product 的流动</li>
<li>指派运维联络人，不要多点联系</li>
<li>建设反馈机制，前期研发 Owner 要自己运维，如果服务质量下降要做退还托管机制</li>
</ol>
<h3 id="资本论"><a href="https://book.douban.com/subject/4267216/">资本论</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/image-20260222183955397.png" alt="image"  />


</p>
<p>资本不是洪水猛兽，资本主义也不是洪水猛兽。
资本主义的终局最终会发生么？
有没有可能进入一个多种资方互相平衡的状态。
政府也出台了反垄断法来避免资本无限扩张，
通过基本的人道主义保障来兜底最底层。
第三册写到资本逐利是根本的问题。
但逐利是一个组织存在的基本要素，人也是逐利的，
商业组织逐利有什么问题么？
逐利是生命体的表现，是存在的体现，只要不成为社会的癌细胞就行。
金融危机一定是坏事么？
是不是一个去泡沫、降温过程，那是不是只要是有序的反而是一件好事？
总体来说，马克思描述了一种在无序、小政府、割据政权下面，
资本主义会走向一个什么最差的结果，以及最终会被社会主义替代。
资本主义是家养野兽，需要套上项圈，让政府进行管制，
不管这个政府是三权分立的还是中央政权。
我怀疑在可预见未来改良式资本主义一直存在，
靠政府治理、反垄断保持着平衡。</p>
<h3 id="论中国"><a href="https://book.douban.com/subject/26607419/">论中国</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202602/image-20260222183026761.png" alt="image"  />


</p>
<p>《论中国》这本书基本可以分成两个部分。</p>
<p>第一部分是清末到新中国建立的中国对外外交史。</p>
<p>第二部分就是基辛格自己参与的中美关系发展史。基辛格是一个很有意思的人，他既流露出一种看上去的亲华派，但骨子里还是国家利益至上。他是幸运的，和中国四代（甚至可能是五代）领导人都有近距离的接触，堪称近代历史活化石。</p>
<p>把历史的进程拉近视角，以一个外交官（事实上）的视角呈现出来，可以更有血有肉地反映时代的细节。</p>
<p>相关阅读推荐：B 站大象放映室的晚清最后 13 年，邓小平时代，他改变了中国。（似乎找不到一本有代表性的书来介绍毛泽东晚年的历史。）</p>
<h2 id="尾注">尾注</h2>
<p>2026 将继续探索发现世界，持续的亲子陪伴和家庭经营，并在 Infra + AI Infra 领域有更多输入输出。</p>
<p>临界不是终点，蓄势待发。</p>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[实用软件项目管理最佳实践]]></title>
    <link href="https://blog.alswl.com/2025/08/project-management/"/>
    <id>https://blog.alswl.com/2025/08/project-management/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2025-08-24T10:04:24+08:00</published>
    <updated>2025-08-24T10:04:24+08:00</updated>
    
    <content type="html"><![CDATA[<h2 id="概述">概述</h2>
<p>本文阐述一套适用于工程应用开发项目的迭代管理实践，重点解决如何高效低成本推进项目的问题。该方案适用于小型团队协作，核心特征在于<strong>固定产研节奏、标准化交付物以及高频异步协作机制</strong>。</p>
<p>本文仅针对技术方案与实施路径明确的项目场景，不涉及工程决策或目标管理范畴。本文也更注重实操，注重立即可以上手实施，不会花太多篇幅去解释这套方案背后的思考和原因。</p>
<p>关于<strong>实用（Pragmatic）</strong> 的定位：该理念贯穿于我的多项实践方案，包括
<a href="https://blog.alswl.com/2023/07/architecture-design-the-easy-way/">架构设计 the Easy Way</a>
<a href="https://blog.alswl.com/2023/04/web-api-guidelines/">实用 Web API 规范</a>
<a href="https://blog.alswl.com/2021/06/prr/">如何做好 PRR（Production Rediness Review）？</a>
等等。实用意味着注重可操作性和实际效果，要领是简单易实施落地，任何人都可以上手执行操作。我对实用的追求来自于《The Pragmatic Programmer》这本书。</p>
<p>注：本文不特定区分项目（Project）和产品迭代（Product Sprint）区别，可以将这里项目管理等同于研发过程管理。</p>
<p>免责申明：没有银弹，本文方法论不一定适合所有场景，并且方案也在持续迭代。如果你的项目有 PM，请优先咨询 Ta。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202508/image-20250824100608820.png" alt="image-20250824100608820"  />



Mural of La Bre Tar Pits（C.R. 奈特雷阿的焦油坑壁画)，图片被人月神话所引用。</p>
<h2 id="在软件项目管理中我们遇到什么问题">在软件项目管理中我们遇到什么问题</h2>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202508/image-20250824100620884.png" alt="image-20250824100620884"  />


</p>
<p>软件项目管理常面临各类挑战。就个人经验而言，最直接的困境在于项目无法按期交付。其原因可归纳如下：</p>
<ul>
<li>我的协作方依赖方有问题，他没时间没空或者方案无法满足我</li>
<li>需求频繁变更，没想清楚做着做着要改方案，或者实施过程中插入新的需求</li>
<li>产出的东西质量不达标，测试阶段一堆问题，迟迟无法交付</li>
<li>产出的东西不是想要的，和需求方一对发现偏差太大</li>
<li>依赖资源未能及时到位</li>
<li>项目计划过于乐观，过度承诺，交付时间比预计的要长，工作量比预期大，难以完成</li>
<li>工程难度大，实施过程遇到技术风险，成本高或者难以完成，</li>
<li>多项目进行，人力资源挤占</li>
<li>多项目并行导致工程上无法满足</li>
<li>项目成员的档期不一致，无法有效协作</li>
</ul>
<p>问题不可怕，定义清楚问题就成功了一半，回到问题本身，让我们来看如何解决。</p>
<h2 id="问题根因分析">问题根因分析</h2>
<p>现实中遇到的问题可能更多，我分分类说到底是这么几个原因：</p>
<ul>
<li><strong>需求问题</strong>：描述模糊、频繁变更及沟通未对齐</li>
<li><strong>协作问题</strong>：衔接断层、预期差异及信息同步失效</li>
<li><strong>时间问题</strong>：周期限制及过程中突发需求插入</li>
<li><strong>工程问题</strong>：技术实现难度超预期或成本制约</li>
</ul>
<h2 id="我的项目管理最佳实践">我的项目管理最佳实践</h2>
<p>基于上述问题分析，我将这些问题的解法归到几个方向：<strong>节奏、交接物、协作</strong>。</p>
<p>注意，本文不聚焦解决工程难度问题，也不解决架构师要解决的问题，最多能从项目管理的思路来降低技术风险。</p>
<p>另：对架构问题如何处理问题请移步
<a href="https://blog.alswl.com/2023/07/architecture-design-the-easy-way/">架构设计 the Easy Way</a>
；遇到了具体工程难题的同学请咨询团队技术专家。</p>
<h2 id="节奏---固定产研节奏比-ddl-更重要">节奏 - 固定产研节奏比 ddl 更重要</h2>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202508/image-20250824100635582.png" alt="image-20250824100635582"  />


</p>
<p>什么是项目的节奏，什么是好项目节奏？</p>
<p>项目节奏的本质在于建立<strong>可预期的周期化交付机制</strong>。相较于单纯设定最终截止期限（Deadline），采用 Scrum 敏捷框架中的冲刺（Sprint）模式更为有效。每个冲刺构成包含需求分析、设计、开发、测试及上线的完整闭环。良好的迭代节奏具备三重价值：1. 建立明确的时间预期，实现周期化交付；2. 强制需求拆解，推动产品从最小可行版本（MVP）向完善形态演进，避免关门憋大招，最后拉了一泡稀的；2. 规避长期封闭开发导致的交付风险，最怕大搞 58 天，最后 2 天都交不了货</p>
<h3 id="双周迭代">双周迭代</h3>
<p>一个好的迭代周期多长比较合适呢？在小型团队协作里面，最长不要超过 1 个月，<strong>尽量保持在 2 周</strong>，最好能做到 1 周。以一次迭代的周期来看，我自己体感是 1/2 时间用来设计， 1/2 用来建设（开发测试和上线）。不要低估设计花费时间，投入少了后面想追也追不会来。</p>
<p>迭代管理需设置专职<strong>迭代经理</strong>，该角色承担三项核心职责：规划迭代排期、协调各类会议安排、核验交付材料规范性（依据标准化模板执行，不负责方案质量，材料质量由架构师+下游签收）。此岗位实质承担部分项目管理职能，若短期内无合适人选，应由项目负责人兼任。迭代经理通常从项目成员中产生，建议实施轮值机制。轮岗制度具有双重价值：使成员亲身体验管理挑战，促进跨角色理解；同时通过岗位实践识别流程瓶颈，推动协作机制优化。执行时需确保轮值期间管理职能的完整履行。</p>
<p>高频迭代带来的不少附加优势：直接化解了需求插入问题（任何需求最长等待周期 ≤1 周），紧急需求则通过紧急修复流程（hotfix）处理；大型需求必须进行拆分验证，无法拆解者需通过概念验证（PoC）先行评估技术风险。</p>
<h3 id="迭代中评估需求耗时">迭代中评估需求耗时</h3>
<p>这是一个一直被提及的问题，我有两个方案来解决，第一个是提供一个需求时间评估公式：工作量 = （最乐观 + 最悲观） / 2。</p>
<p>第二个是避免搞大需求，所有需求需要评估一下规模，我提供这几种级别标准，extra-large（月级别）/ large（周级别） / medium（天级别） / small（小时级别），我不接受 xl / l 需求，必须拆成 m / s。</p>
<p>需求时间评估是一个普遍存在的挑战，我提出两种解决方案。</p>
<p>第一种方案采用工作量估算公式：工作量 = （最乐观 + 最悲观） / 2。这个公式相当实用，比单一指标更多考虑到不确定性。（其实我还有一套更复杂的通过技术采纳性角度的评估方式，但是不如上一个公式简单易操作）</p>
<p>第二种方案聚焦需求规模控制，要求所有需求划分规模级别，包括 extra-large（月级别）、large（周级别）、medium（天级别）和 small（小时级别）。迭代中要尽量避免 extra-large 与 large 规模需求，将其拆解为 medium 或 small 规模后再行处理。</p>
<h3 id="迭代范例">迭代范例</h3>
<p>我们的一个实际<strong>案例分享</strong>，这是 我负责 产品的 7 月 两个迭代，分成 07a 和 07b 两个迭代。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202508/image-20250824100659418.png" alt="image-20250824100659418"  />


</p>
<h2 id="交接物---标准化每个环节输入和交付物">交接物 - 标准化每个环节输入和交付物</h2>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202508/image-20250824100711540.png" alt="image-20250824100711540"  />


</p>
<p>软件的<strong>不可见性和抽象性</strong>是导致软件复杂性的根本原因。</p>
<p>清楚明确的交接物可以有效降低不可见性和抽象性，这是用来抵抗交付复杂性的核心武器。掌握这个核心武器的最重要口诀是：<strong>写下来</strong>。</p>
<p>把你的长远需求规划写下来，不管是年度计划，还是月度计划。把你的需求明细写下来；把你的系统设计写下来；把你的发布功能写下来；</p>
<p>整个过程中，我推荐使用到这些面向项目管理的<strong>交接物</strong>，大部分交接物我们都耳熟能详，但请特别注意我这里的最佳实践：<strong>需求清单</strong>和 <strong>Release Note</strong>。</p>
<table>
  <thead>
      <tr>
          <th>阶段</th>
          <th>输入 / 输出</th>
          <th>备注</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>产品规划</td>
          <td>产品项目 OKR</td>
          <td></td>
      </tr>
      <tr>
          <td>产品思路</td>
          <td>需求清单</td>
          <td>需求清单是一个非常特别的形式，是我个人发明的，正面对抗一句话需求。</td>
      </tr>
      <tr>
          <td>产品需求</td>
          <td>需求文档</td>
          <td>我们产品经常不配置 PD，所以需要自己写需求文档。我们有两种文档格式：文字型 / 配图型</td>
      </tr>
      <tr>
          <td>系统设计</td>
          <td>系统设计</td>
          <td>文字内容设计结构必须是明确的，大家应该使用相同的模式来进行文字创作。比如系统设计文档可以使用语雀自带的模板。</td>
      </tr>
      <tr>
          <td>开发</td>
          <td>自测报告</td>
          <td>截图证明你可以。</td>
      </tr>
      <tr>
          <td>测试</td>
          <td>测试报告</td>
          <td></td>
      </tr>
      <tr>
          <td>发布</td>
          <td>发布计划</td>
          <td></td>
      </tr>
      <tr>
          <td>上线</td>
          <td>Release Note</td>
          <td>Release Note 做轻薄一些，尽量链接到产品功能使用文档。</td>
      </tr>
      <tr>
          <td>日常使用</td>
          <td>产品说明文档</td>
          <td>多截图，常更新，跟随产品上线发布。</td>
      </tr>
  </tbody>
</table>
<p>下面我会展示一些我实践的需求范例（可能来自不同的产品和迭代）。</p>
<h3 id="需求清单范例">需求清单范例</h3>
<p>这是我使用的需求清单范例：</p>
<table>
  <thead>
      <tr>
          <th></th>
          <th></th>
          <th></th>
          <th></th>
          <th></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>功能描述</strong></td>
          <td><strong>Owner</strong></td>
          <td><strong>优先级</strong></td>
          <td><strong>前端页面数</strong></td>
          <td><strong>质量介入</strong></td>
      </tr>
      <tr>
          <td>用户 A 可以使用 功能 B 完成授权</td>
          <td>狗哥</td>
          <td>高</td>
          <td>2 页</td>
          <td>是</td>
      </tr>
      <tr>
          <td>用户 B 可以使用 功能 C 查看报表</td>
          <td>谢宝</td>
          <td>高</td>
          <td>2 页</td>
          <td>否</td>
      </tr>
      <tr>
          <td>用户 C 可以使用 功能 C 发布视频</td>
          <td>落九</td>
          <td>高</td>
          <td>很少</td>
          <td>是</td>
      </tr>
  </tbody>
</table>
<h3 id="需求文档范例">需求文档范例</h3>
<p><strong>需求文档模板</strong>：</p>
<blockquote>
<p>需求标题：简洁明了地描述需求
用户角色：谁会使用这个功能
用户目标：用户想要达成什么
前置条件：使用该功能需要满足的条件
主要流程：详细描述用户如何使用该功能
替代流程：描述可能的例外情况
验收标准：如何判断需求已经被正确实现</p></blockquote>
<p>一个<strong>需求文档范例（文字型）</strong>：</p>
<blockquote>
<p><strong>视频发布流程 MVP</strong></p>
<p><strong>用户角色</strong>：内容运营者
<strong>需求标题</strong>：用户上传视频并完成自动化发布流程
<strong>用户目标</strong>：</p>
<ul>
<li>运营者通过标准化流程完成视频从上传到发布的完整生命周期管理。</li>
<li>关键步骤自动化处理（如转码、审核），减少人工操作，关键节点保留人工确认机制。</li>
<li>支持异常处理（如审核失败、转码错误），允许人工介入重试或跳过。</li>
</ul>
<p><strong>主要流程</strong></p>
<ol>
<li><strong>创建视频发布任务</strong>
<ul>
<li>用户上传原始视频文件（支持主流格式：MP4/MOV/AVI）</li>
<li>填写基础元数据（标题、分类、标签、封面图）</li>
</ul>
</li>
<li><strong>自动化预处理</strong>
<ul>
<li><strong>转码引擎</strong>：自动生成多分辨率版本（1080P/720P/480P）</li>
<li><strong>内容审核</strong>：
<ul>
<li>AI自动审核（敏感画面、违禁内容）</li>
<li>若AI审核通过 → 进入发布队列</li>
<li>若AI审核失败 → 暂停流程并通知人工复审</li>
</ul>
</li>
</ul>
</li>
<li><strong>人工确认节点</strong>（流程暂停点）
<ul>
<li><strong>人工复审</strong>：运营者在后台查看AI标注的违规片段，选择：
<ul>
<li>通过（继续流程）</li>
<li>驳回（需编辑视频后重新上传）</li>
<li>强制跳过（需填写跳过原因）</li>
</ul>
</li>
</ul>
</li>
<li><strong>发布执行</strong>
<ul>
<li>自动推送至指定发布渠道（Web/APP/第三方平台）</li>
<li>生成可跟踪的发布ID（用于效果分析）</li>
</ul>
</li>
<li><strong>异常处理机制</strong>
<ul>
<li><strong>转码失败</strong>：自动重试（≤3次）→ 仍失败则通知人工</li>
<li><strong>发布中断</strong>：支持手动重试/跳过/终止任务</li>
</ul>
</li>
</ol>
<p><strong>替代流程</strong></p>
<ul>
<li><strong>转码模块不可用</strong>：允许上传预转码视频文件（需符合分辨率规范）</li>
<li><strong>AI审核服务宕机</strong>：切换为全人工审核模式（需在SOP中注明应急预案）</li>
</ul>
<p><strong>验收标准</strong></p>
<ol>
<li><strong>全流程验证</strong>：
<ul>
<li>运营者从上传到发布成功耗时 ≤15分钟（不含人工审核等待）。</li>
<li>模拟审核失败场景，人工强制跳过步骤后流程可继续。</li>
</ul>
</li>
<li><strong>异常处理验证</strong>：
<ul>
<li>转码失败时，系统自动告警并允许手动替换文件。</li>
<li>发布中断后重试，视频状态可恢复至中断前节点。</li>
</ul>
</li>
<li><strong>文档交付</strong>：
<ul>
<li>提供《视频发布SOP手册》，含人工操作指引及故障处理方案（A负责维护）。</li>
</ul>
</li>
</ol></blockquote>
<h3 id="产品-release-note-范例">产品 Release Note 范例</h3>
<p>Discord 的 Change Log（Release Note）发布大纲，没有前端产品用那么多 emoji。





<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202508/image-20250824100749328.png" alt="image-20250824100749328"  />


</p>
<p>妙言 <a href="https://github.com/tw93/MiaoYan">tw93/MiaoYan</a> 的某个 Release 更新日志：</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202508/image-20250824100805177.png" alt="image-20250824100805177"  />


</p>
<h3 id="产品使用手册范例">产品使用手册范例</h3>
<p>我建议可以使用基于 Git 仓库管理的 markdown 方案，比如 <a href="https://www.mkdocs.org/">MkDocs</a> 这类方案：</p>
<p>我推荐的范例是 NebulaGraph Operator 的文档范例，注意这仅仅是 NebulaGraph 的其中一个子产品，但是规模更小更适合起步。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202508/image-20250824100817905.png" alt="image-20250824100817905"  />


</p>
<p>关于交付物，特别是文档类型的交付物，虽然我列了这么多类型，但是我认为一定不要写多写复杂，<strong>提纲挈领，量少为宽</strong>。</p>
<h2 id="高频异步沟通---同步和异步-风险和透明">高频异步沟通 - 同步和异步 风险和透明</h2>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202508/image-20250824100844728.png" alt="image-20250824100844728"  />


</p>
<p>不要陷入巴别塔。</p>
<p>在分布式协作场景下，需建立「<strong>异步为主、同步为辅</strong>」的沟通范式，重点解决信息孤岛、风险滞后及依赖阻塞三大痛点。有效的协作机制应包含三个核心要素：<strong>全局可视化任务管理、结构化风险预警及精准化依赖协调</strong>。</p>
<p>我讨厌开会，甚至从某种意义上我痛恨开会。我之前写过关于会议的暴论：</p>
<p>这个月代码写得太少了，会议时间占据了 1/3，这很可怕。</p>
<p>会议很低效，很低效，很低效。有些会缺少材料准备，问题不聚焦，主持人不控场，一拉一大把人，不少人又不好意思走就硬挂着。</p>
<p>如果我有权利，我甚至想禁止公司开会，全都回归到基于文档的异步交互模式。</p>
<p>还是多建设，少空谈，有明确主张，材料提前分发，开会不当聋哑人，非干系勇敢离开会议。让大家回到方案设计和代码上吧。</p>
<p>有效沟通需规避信息失真，核心在于建立风险透明机制与依赖协同体系。具体实施包含三个维度：全局可视化看板：实时呈现任务进度与风险状态；精准进度追踪：量化每个节点的完成度；异步协作平台：通过在线任务管理工具（如 Jira）实现全周期信息同步。</p>
<h3 id="开两种会---方案评审和日会">开两种会 - 方案评审和日会</h3>
<p>我们不需要开会了么？还要，但是只要两种：<strong>方案评审会与日会</strong>。</p>
<p>评审会的要点在于：</p>
<ol>
<li>明确评审会的对象是谁，<strong>谁负责为方案点头</strong>，没有人负责点头的会不用开，既没有对抗又没有讨论，是纯走过长</li>
<li>不要做无准备的讨论，在方案宣讲之前，尽量先和受众对象达成一致，让评审会变成一个<strong>宣讲会</strong></li>
<li>评审会要有结论，通过还是不通过要有人确认。通知之后的执行项全部落入在线协作平台，特别是需求类，一定要记录，这是未来日会跟踪的依据</li>
</ol>
<p>日常进度沟通模式，我推荐<strong>每日站会沟通</strong>，最少也得双日沟通（每周二、四）。每天都进行站会同步，每次 15m 搞定。一般一个项目成员在 7 人左右（披萨原理），每人一两分钟。</p>
<p><strong>站会的主持人很重要</strong>，要引导参与人同步进度，同步风险，寻求帮助，帮助需要有明确的接收方。</p>
<h3 id="基于看板的在线沟通">基于看板的在线沟通</h3>
<p>核心准则：<strong>以文档异步协同为基础</strong>，将同步会议压缩至必要场景，最大化建设性工作时间。</p>
<p>下面是会议看板范例，根据迭代过滤，根据 Assginee 分组（其实也很普通，没什么特别的）：





<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202508/image-20250824100907586.png" alt="image-20250824100907586"  />


</p>
<p>每天迭代经理在日会上面就是拿着这个看板，先明确我们几号提测几号上线，再挨个成员自述进展如何，最后挨个问有没有上线风险。</p>
<h2 id="最后">最后</h2>
<p>没有万灵的项目管理机制，根据自己面临的问题进行实际调整。本文的命题对我（一个开发工程师）来说也是极具挑战。我在过去有多次因为项目无法交付问题失眠无法入睡。现在来看，其实大可不必，平常心来应对问题，<strong>对预期内问题建立预案，对计划外变更保持弹性</strong>。当团队已完成可行性范围内的最大努力，即应视作有效交付。项目管理的终极目标，是在资源约束下实现可持续的技术价值输出。</p>
<h2 id="扩展阅读">扩展阅读</h2>
<p><a href="https://book.douban.com/subject/1102259/">人月神话 (豆瓣)</a>
软件工程项目管理的圣经，20 年后读起来仍然觉得字字珠玑。</p>
<p><a href="https://book.douban.com/subject/4058336/">项目管理修炼之道 (豆瓣)</a>
这是我的项目管理入门指导书，更通用更适合 PM。我写过一个读书笔记 <a href="https://blog.alswl.com/2014/08/manage-it/">《项目管理修炼之道》笔记 | Log4D</a>。</p>
<p><a href="https://book.douban.com/subject/24284853/">代码之殇 (豆瓣)</a>
作者是微软高级架构师/管理者，而本书实际上是一个随笔式的文章集合。尽管如此，书中的许多观点犀利且具有独特的见解，展现了从一线到高层的全方位视野。其中关于工程过程管理（比如死亡行军）事项，确实值得深思。</p>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[李飞飞如何获得成功？ - 读「我看见的世界」]]></title>
    <link href="https://blog.alswl.com/2025/06/li-feifei/"/>
    <id>https://blog.alswl.com/2025/06/li-feifei/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2025-06-24T07:14:49+08:00</published>
    <updated>2025-06-24T07:14:49+08:00</updated>
    
    <content type="html"><![CDATA[<blockquote>
<p>读一本好书，就是和许多高尚的人谈话 - 歌德</p></blockquote>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202506/the-worlds-i-see.png" alt="img"  />


</p>
<p>第一次听闻李飞飞的名字，是在 2013 年与前公司 CTO 的中午干饭闲谈中。
彼时他正深耕 CUDA 并行计算领域，反复提及 ImageNet 竞赛与 AlexNet 的突破性表现，
而我对这场即将席卷全球的深度学习革命尚处懵懂——当时全身心投入业务系统优化，
面对「算法黑箱」既无暇探究，更难预见其对技术世界的重构力量。</p>
<p>如今读到李飞飞自传，方觉这场对话暗藏玄机：那个曾被视作实验室小众技术的计算机视觉项目，
竟成为改写 AI 发展轨迹的关键节点。在学科交叉处开疆拓土的战略眼光，在技术拐点期破除质疑的前瞻判断，
以及贯穿始终的&quot;北极星&quot;式价值锚点——这些要素如何在特定历史坐标中交汇，
最终塑造李飞飞成为改变机器认知方式的科学家。</p>
<h2 id="李飞飞如何获得成功">李飞飞如何获得成功</h2>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202506/triangle.png" alt="triangle"  />


</p>
<h3 id="好奇心是原动力">好奇心是原动力</h3>
<p>李飞飞的成就源于多重维度的深度交织。其科研旅程始于对世界本质的探索欲。父亲带她
观鸟、捕捉昆虫的经历，在她心中种下好奇的种子，而母亲引导的跨学科阅读（涵盖海洋
生物、机器人、神话等）则拓宽了她的认知边界。中学时期她对航空航天等冷门领域的痴
迷，更展现出对抗性别偏见的独立思考能力。这种探索精神在普林斯顿大学攻读物理学时
得到深化，她将物理视为「西方科学最高深的创造性学科」，以此锤炼逻辑思维。这种对
知识本质的追求，成为她转向人工智能研究的底层动力。</p>
<h3 id="逆境中的坚韧与适应力">逆境中的坚韧与适应力</h3>
<p>逆境中的韧性塑造了她的核心竞争力。移民美国初期，语言障碍与经济压力如影随形。她
通过多重兼职（中餐馆打杂、家庭保洁、干洗店经营）维持生计，却仍以 SAT 数学满分的
成绩进入普林斯顿。更艰难的是母亲重病期间，她在手术室旁穿着隔离服完成学业，同时
充当医患翻译，展现出极限压力下的抗压与时间管理能力。外界质疑（如教师贬低女性数
理能力）反而强化了她「超越现实障碍」的信念。</p>
<h3 id="大平台才能让你起飞">大平台才能让你起飞</h3>
<p>顶尖平台的阶梯式跃迁为研究提供了关键支撑。普林斯顿时期奠定其学术基础，并促使她
转向计算机科学。加州理工学院攻读博士期间，她选择当时冷门的计算机视觉方向，在神
经科学与 AI 的交叉研究中确立「让机器理解人类视觉世界」的核心命题。斯坦福大学时
期，她创立人工智能实验室（SAIL），将 ImageNet 从构想变为现实。后续在谷歌的产业
实践，则加速了技术落地与应用转化。</p>
<h3 id="风口与机遇">风口与机遇</h3>
<p>把握技术拐点的决断力最终引爆突破。2006 年 AI 寒冬期，创建海量数据集被视为「学术
自杀」。面对终身教职可能受阻的警告，她创新采用亚马逊众包模式，发动全球数万人协
作标注，解决人工需耗时百年的难题。2012 年 ImageNet 竞赛中，GPU 算力支撑的
AlexNet 以压倒性优势胜出，验证了数据驱动路线的正确性，直接推动深度学习革命。</p>
<h3 id="ai-科学与人文融合">AI 科学与人文融合</h3>
<p>李飞飞独特的 AI 哲学观始终指引其技术路径。她批判当时学界对算法的过度专注，提出
计算机视觉的瓶颈在于缺乏「视觉常识」。ImageNet 的构建（1500 万图像/2.2 万类别）
本质是为机器建立认知世界的「视觉图谱」，其初衷是赋予 AI 感知现实的能力，而非单
纯追求技术指标。这种将人文认知融入技术设计的理念，后来成为斯坦福「以人为本人工
智能研究院」（HAI）的核心理念。</p>
<h2 id="作为父母我应该如何教育小孩">作为父母我应该如何教育小孩</h2>
<p>李飞飞的成长轨迹为家庭教育提供了深刻启示：她的父母并非教育专家，却以最朴素的方
式践行了「守护好奇心」与「培养独立人格」的核心理念。</p>
<p><strong>关注孩子对自然世界的探索</strong>。父亲是李飞飞科学启蒙的「引路人」。他带着女儿在成
都街头观鸟、捕捉竹节虫、观察水牛，将自然视为开放的实验室。这种实践教育不仅培养
了她对生命现象的敏锐观察力，更塑造了「提问—探索—验证」的科学思维雏形。当同龄人
被规训于课本知识时，李飞飞已通过昆虫的复眼结构理解光学原理，从鸟类迁徙模式感知
生态系统的复杂性。这种源于真实世界的认知体验，远比抽象概念更深刻地影响了她日后
选择计算机视觉作为研究方向的决策。</p>
<p>母亲则是李飞飞精神世界的「守护者」。面对中学教师对其阅读《不能承受的生命之轻》
等「非主流书籍」的质疑，母亲断然反驳：「我的努力只是为了成为更好的自己」，并以
此教导女儿<strong>不必迎合外部标准</strong>。这种教育哲学解构了传统权威的绝对性——当老师公开
贬低女生数理能力时，母亲的态度成为李飞飞对抗偏见的心理支柱：「他们无法阻止我在
这里上场参赛，我暗下决心，一定要赢」。更关键的是，父母始终以行动传递价值观：在
移民美国后陷入经济困境时，他们拒绝向现实妥协，反而将生存压力转化为家庭凝聚力，
让李飞飞在干洗店账本间隙研读学术期刊成为可能。</p>
<p>回归到教育的本质 - 培育「<strong>反叛的底气</strong>」。20 后是 AI Native 小孩，需要去成功
AI Master 而不是 AI Slave，不要去被 AI 替代而要不 AI 赋能，很大的一个要点是要有
<strong>独立思考能力，有思辨、批判精神</strong>，从而去指挥 AI。李飞飞父母的教育智慧，在于将
探索精神与批判性思维内化为孩子的生存本能。他们既不刻意塑造「完美人设」，也不焦
虑于短期得失，而是通过持续支持孩子的兴趣选择（如允许剪短发、痴迷航空航天设
计），让独立人格在真实生活场景中自然生长。这种教育模式的当代启示在于：真正的素
质教育不是资源堆砌，而是父母能否在物质匮乏时仍坚持精神富养，在世俗标准前守护孩
子的独特性。正如李飞飞在 ImageNet 项目受质疑时所展现的韧性，其根源正是童年期形
成的「质疑—坚持—突破」的行为模式。</p>
<h2 id="你找到你的北极星了么">你找到你的北极星了么？</h2>
<p>李飞飞在自传中反复提及指引她前行的「北极星」——
一种<strong>超越短期利益与外界评价的内在驱动力</strong>。对她而言，
这颗星是对知识本质的追问与对人文价值的坚守的融合。
从成都街头的观鸟少年到斯坦福实验室的领航者，她始终以「探索未知」与「服务人类」
为双轴校准方向：在华尔街高薪诱惑前，她选择回归科学本心；在算法主导的 AI 浪潮中，
她坚持构建让机器理解现实世界的视觉常识库；当技术突破引发伦理争议时，
她强调「AI 的胜利必须是人文的胜利」。这种贯穿始终的清醒，
源于父母传递的价值观——母亲病榻上的灵
魂拷问「人工智能还能如何帮助他人」，最终化作她推动医疗环境智能研究的持久动力。</p>
<p>真正的北极星，从来不是某个具体目标，而是驱动人穿越迷雾的底层信念：
对李飞飞而言，那是永远追问「为什么」的好奇心，与永远不忘「为了谁」的责任感。</p>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[2024 年终总结]]></title>
    <link href="https://blog.alswl.com/2025/01/2024-review/"/>
    <id>https://blog.alswl.com/2025/01/2024-review/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2025-01-11T13:52:48+08:00</published>
    <updated>2025-01-11T13:52:48+08:00</updated>
    
    <content type="html"><![CDATA[<h2 id="生活---show-me-your-photos">生活 - Show me your photos</h2>
<p>地球不停息绕太阳一周，时光交替中，我们与生活擦肩，带着过去的记忆，迎接未来的未知。</p>
<p>去年，我给自己设立了一个关于生活的目标：<strong>家庭和陪伴</strong>。其中，一项是「高质量陪伴」，而另一项则是“学会摄影糖水片”。每次出行时，我希望通过照片记录下光与影的交织，捕捉那一瞬间的温度。今年，这个部分的主题便是 - <strong>Show me your photos</strong>。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/9C5FC713-AE62-40DF-9346-9959BFB73460_1_105_c.jpeg" alt="image"  />


</p>
<p><small>2024 新年伊始，海边的灯塔。</small></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/2D5E7F7F-D848-431E-BCA8-35F66E2B2A42_1_105_c.jpeg" alt="image"  />


</p>
<p><small>春寒料峭，拎着一个喜气的龙灯出来转转。</small></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/52514E49-D7FA-435E-9D2C-6F63ADDC7BE3_1_105_c.jpeg" alt="image"  />


</p>
<p><small>从烟火气潮汕到宗教多元的泉州。</small></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/0626DA1D-13EB-4E84-BBD5-F1E917A43F1E_1_105_c.jpeg" alt="image"  />


</p>
<p><small>京都清水寺，小朋友许了一个有禅意的愿：我希望佛天天开心。</small></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/2F9CE840-12AD-4530-94BA-4F6547432939_1_105_c.jpeg" alt="image"  />


</p>
<p><small>丽水，浙南梯田</small></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/8EF8406E-C56F-4520-A486-F253792E6A4E_1_105_c.jpeg" alt="image"  />


</p>
<p><small>壶口瀑布，红旗招展，黄河怒吼。</small></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/20CE5D94-12A4-4BE6-B326-9130FC654C7B_1_102_o.jpeg" alt="image"  />


</p>
<p><small>迪士尼，年末的花火。</small></p>
<h2 id="工作---基建狂魔">工作 - 基建狂魔</h2>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/D2C3997C-CDA6-4518-90B4-2214E7F79449_1_105_c.jpeg" alt="image"  />


</p>
<p><small>草原上的加特林烟花。</small></p>
<p>去年，我从一名探索者转变为有组织推进系统演进的人。在年初的时候，我甚至隐隐觉得大厦的框架已经显现，接下来就是持续建设，让飞轮稳步前进，甚至开始规划探索 AIGC 上的一些新方向，想要在这个领域找到新的突破。</p>
<p>然而，现实很快给了我一个巨大的逼兜。随着 AIGC 急速发展，见证历史的同时，也面临着算力需求的剧烈增长。一波又一波的压力压下来，新需求和旧债交织在一起，给基础设施交付带来了巨大的挑战。这期间几位在这个领域的核心同僚几个月内相继离开。人走了，工作还得继续做。从 6 月份开始，我便与一群兄弟们直接走上了战场。</p>
<p>我甚至感到自己一度快要被压垮了，写了一系列关于「<a href="https://x.com/alswl/status/1791341868439195945">死亡行军</a>」的故事。</p>
<p>痛苦总是让人深思，尤其在那些看似无法承受的时刻，它反而带来了更多的洞察。一切接近触底时反而能迎来反弹的力量。有一个瞬间我终于明白，问题是阶段性的，真正在持久修炼的是正面看待问题和以清明的心态面对困难的内心力量。</p>
<p>无需惧怕外界的评价，也不必厌倦合作中的复杂性，现状和问题本就存在于那里，解决的方案并非高深莫测，关键在于直面问题本身。保持平和的心态和现实的预期，便能在混乱中看到问题的根源，在困难中捕捉到机遇，在当下洞察到未来的可能。真正的力量，是从每一次挑战中提取智慧，从每一个困境中找到前行的勇气。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/2DF11EEA-9872-4B84-8723-AFF155E951B6_1_105_c.jpeg" alt="image"  />


</p>
<p><small>摄于苏州美人腿附近</small></p>
<h2 id="业余---聊胜于无">业余 - 聊胜于无</h2>
<p>今年被工作挤占了几乎所有的时间，也导致业务已经没有精力产出内容。只有两个很小的产品。</p>
<p><a href="https://github.com/alswl/dbml-editor">dbml-editor</a> ，一个免费的 DBML 在线编辑器。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/dbml-editor.png" alt="img"  />


</p>
<ul>
<li>支持 dbml 语法检查和反馈，DBML 是一门描述关系型数据库的 Schema，面向终态，比 SQL 要更易读</li>
<li>支持 Web 响应式</li>
<li>所见即所得</li>
<li>支持导入导出 SQL</li>
</ul>
<p><a href="https://github.com/alswl/random-apple-music">random-apple-music</a> 是一个播放列表，随机挑选 Top250 的豆瓣音乐专辑，并且可以一键跳转到 Apple Music 播放。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/random-apple-music.png" alt="Image"  />


</p>
<ul>
<li>🎵 音乐迷们，快来发现新宝藏！</li>
<li>🍏 随机播放豆瓣音乐Top250，一键跳转Apple Music！</li>
<li>🎧 享受音乐的无限可能！</li>
</ul>
<p>今年在 X（Twitter）上面的最受欢迎的内容是：</p>
<ul>
<li>169k <a href="https://x.com/alswl/status/1742558249260286368">学英语技巧</a></li>
<li>83k <a href="https://x.com/alswl/status/1781907605239238759">分布式系统工程实践</a></li>
<li>75k <a href="https://x.com/alswl/status/1748941468277100617">代理协议转换 gost</a></li>
<li>56k <a href="https://x.com/alswl/status/1791341868439195945">死亡行军</a></li>
<li>52k <a href="https://x.com/alswl/status/1754053512877781012">endoflife 信息</a></li>
<li>46k <a href="https://x.com/alswl/status/1769195102126153880">红警 on Steam</a></li>
<li>44k <a href="https://x.com/alswl/status/1753269221872771463">Git rebase 合并技巧</a></li>
<li>43k <a href="https://x.com/alswl/status/1780990211885023699">dbdiagram.io</a></li>
<li>40k <a href="https://x.com/alswl/status/1754759307172962496">cors.sh</a></li>
<li>38k <a href="https://x.com/alswl/status/1748941468277100617">每年的 24 个问题</a></li>
<li>37k <a href="https://x.com/alswl/status/1764671403872383348">如何扩大工作影响力</a></li>
<li>21k <a href="https://x.com/alswl/status/1791747889628430632">如何写好文档</a></li>
</ul>
<h2 id="读书---意外之喜">读书 - 意外之喜</h2>
<p>今年，买了 Boox 文石之后，读书量一下子就上来了。总共读了 34 本书，大多数是非虚构类书籍，其中有 10 本我给了 5 星评价。Kindle 离开中国，只能拥抱微信读书。虽然无法拥有实体书，但读书成本大大降低，每月上传两本书，已经足够了。更有意思的是。我也逐渐改变了对听书的看法，曾经对它嗤之以鼻，但现在，我发现做家务或者在路上听书，成了提高大脑利用率的好方式。</p>
<p><a href="https://book.douban.com/subject/26925171/">大明王朝1566 (豆瓣)</a></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/s29249996.jpg" alt="大明王朝1566"  />


</p>
<p>太牛了，原来演员的词几乎不用改就能直接用。</p>
<p><a href="https://book.douban.com/subject/36328704/">太白金星有点烦 (豆瓣)</a></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/s34544956.jpg" alt="太白金星有点烦"  />


</p>
<p>妙趣横生。</p>
<p><a href="https://book.douban.com/subject/26874220/">华为内训 (豆瓣)</a></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/s29042375.jpg" alt="华为内训"  />


</p>
<p>华为的经营哲学与阿里巴巴的&quot;六脉神剑&quot;在客户至上和目标导向上有共通之处。尽管理念相似，但华为的手册缺乏案例支撑，而企业文化往往是在解决实际冲突中塑造的。书中强调的几个关键点，如明确方向、专业精神、执行力和自我批评，对企业成长至关重要。华为从网络设备市场起步，现已成为多元化的科技巨头，其硬件基因可能助其稳健发展。相比之下，阿里巴巴等互联网公司近年来在资本市场的表现略显逊色。</p>
<p><a href="https://book.douban.com/subject/35328607/">起源 (豆瓣)</a></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/s33804010.jpg" alt="起源"  />


</p>
<p>很推荐，讲述了宇宙的起源，生命的诞生和演进。让我想起了小时候看的一部纪录片，宇宙与人。如果有时间的话，我想仔细研究里面的术语，囊括了宏观物理、微观物理、化学、生物。</p>
<p><a href="https://book.douban.com/subject/36449803/">这就是ChatGPT (豆瓣)</a></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/s34566250.jpg" alt="这就是ChatGPT"  />


</p>
<p>武林泰斗亲自下场，给新人们介绍秘笈心法。之前读论文比较枯燥，一些知识和细节理解不连贯，借本文可以梳理脉络。 关于 Transformer 注意力机制介绍的比较少，好在热心的读者评论里面提供了更多信息。</p>
<p><a href="https://book.douban.com/subject/30270959/">深度学习入门 (豆瓣)</a></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/s29815955.jpg" alt="深度学习入门"  />


</p>
<p>这是一本相当不错的深度学习入门书。不同于 How to use，本书着重 How to build，书中通过 Python 实现了一套简单的框架，并将这个框架应用在手写识别上。文章深入浅出非常详细的介绍每一层网络解决什么问题，相关的数学公式和原理是什么。 虽然已经出版了接近五年，但是书中内容并没有过期，甚至在最后面的展望描述的场景，包括物体识别，RNN（GPT 基础）在当下异常火热。</p>
<p><a href="https://book.douban.com/subject/35876121/">纳瓦尔宝典 (豆瓣)</a></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/s34241855.jpg" alt="纳瓦尔宝典"  />


</p>
<p>本书像是提供精神 massage，片刻愉悦之后还是得落到知行二字。 有时候精神困顿，也需要按摩解乏。比如读到情绪管理这章，就回忆起上周工作冲突失控愤怒上头怼人时刻。我并非不知道要点，也许早一点读到纳瓦尔这一章我就可以唤醒理性，好书还是需要常读常新。 财富和判断力这两章给我的输入和触动最大：做高杠杆效应事情，积累财富；使用稳定可靠心智模型，学习数学，特别是概率和统计。</p>
<p><a href="https://book.douban.com/subject/30175059/">李光耀观天下 (豆瓣)</a></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/s33687518.jpg" alt="李光耀观天下"  />


</p>
<p>作为政治家，有意愿有行动力，思想有深度视野开阔不受框架束缚已经是一流。 难能可贵是李光耀还如此坦诚。我想应该是和新加坡人口规模和民众素质有关系。 这本书是书友评论密度很高的一本书，靠书友补充了很多视角（以及后来发生的事情）。</p>
<p><a href="https://book.douban.com/subject/26171466/">筚路维艰 (豆瓣)</a></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/s33986279.jpg" alt="筚路维艰"  />


</p>
<p>这本书是一本神作，作者用相当大的尺度在讨论从建国到现在政治路线和经济路线的纷争。作为党史研究员，作者不避讳描述毛泽东，让我看到一位急迫地想一把到位共产主义，并且留下一个无阶级矛盾的国家，为此不断发起运动、斗争。好在邓公拨乱反正改革开放。 感慨，看过去一代人的牺牲，一个数字代表一个家庭的破碎。希望未来少一些宏大叙事，多一些关注日常民生。</p>
<p><a href="https://book.douban.com/subject/35317149/">在峡江的转弯处 (豆瓣)</a></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/s33945521.jpg" alt="在峡江的转弯处"  />


</p>
<p>从无人知晓过来。 文字之间跳跃着一股真诚质朴，数次为其感动眼眶湿润。被陈行甲正直、热情、生命活力感动。 有人质疑这是表演，我倒更愿意相信其诚朴，相信愿意相信的，坚持自己坚持的。</p>
<p><a href="https://book.douban.com/subject/36480389/">不败者 (豆瓣)</a></p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202501/s34996310.jpg" alt="不败者"  />


</p>
<p>不败者，一本让我挺惊喜的国内科幻小说集。 墨熊的风格有一种深入宇宙边界的探索力，截取了一小段太空歌剧的碎片展现出来，将遥远星际故事拉到读者身边。 《信鸽》有种软硬结合的科幻感，被光速约束的理性和感性的理念交付。 《白鬼篇》有点爽文既视感。 《不可战胜者》让我想起了神秘博士里的哭泣天使，以一种跨越时间线方式进行绞杀。绞杀的方式和破解的方式都精巧且出乎意料。</p>
<h2 id="last">Last</h2>
<p>期望新的一年可以热烈又恬静，深刻又朴素。</p>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[2023 年终总结]]></title>
    <link href="https://blog.alswl.com/2024/01/2023-review/"/>
    <id>https://blog.alswl.com/2024/01/2023-review/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2024-01-08T23:38:59+08:00</published>
    <updated>2024-01-08T23:38:59+08:00</updated>
    
    <content type="html"><![CDATA[<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202401/flower.png" alt="flower"  />


</p>
<blockquote>
<p>时间已做了选择，太多感受，绝非三言两语能形容</p></blockquote>
<h2 id="生活---陪伴和成长">生活 - 陪伴和成长</h2>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202401/boy.png" alt="boy"  />


</p>
<p>这是第 35 个年头，我熟悉地扮演着多个角色，父亲、丈夫、儿子，每一刻都在陪伴和成长中交织。
生活的步伐似乎匆匆，但我努力让自己拥有一颗年轻的心，渴望保持对世界的好奇和激情。</p>
<p>时光大多被生活所占据，只有地铁上和饭桌上我能成为时间主宰。
好在我并未感到疲惫或沉闷，反而逐渐适应了这个身份的变化。
或许，正是在这些琐碎的日常中，我找到了一种生活的节奏，一种平和而温馨的状态。</p>
<p>今年我们走过了北京、汉中、西安、淳安、长沙、张家界、台州。
新年即将到来，准备给孩子办理一下护照，走出去看看。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202401/tower.png" alt="tower"  />


</p>
<p>在陪伴孩子的过程中，参与各种自然知识课程，参观各种展览，我发现在陪伴的同时，我们也在不知不觉中共同成长。
生活中的另一个领域，我从母亲那里薅了两只相机，终于决心好好学习摄像，
我把 Canon 6D 出售，保留了 SONY a6500 这支轻便的 APS-C 相机。
期望摄影成为我表达内心、记录生活的一种方式，每一张照片都是时光的凝固，是岁月的见证。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202401/five.png" alt="five"  />


</p>
<p>游戏的世界中，我似乎进入了一段电子阳痿期。购买的游戏几乎只能玩上一个小时就变得索然无味，
也许现实生活才是最引人入胜的游戏吧。</p>
<p>或许，人生就是一场不断变化的冒险。在时间的舞台上，我们扮演着各色角色，
演绎着属于自己的故事。</p>
<h2 id="工作---精进">工作 - 精进</h2>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202401/balloon.png" alt="balloon"  />


</p>
<p>工作上一直压力和张力巨大，我开始进一步成为探索者。
这两年，我在工作中不断推动项目的上线，部门推出的新产品中的一半是我负责的，我很喜欢这个领域，也确实想把事情做好。</p>
<p>但有时候，我感觉自己有点像是公司招进来的清理工，身处于一个「散多垂」的状态，
面对复杂的环境，解决问题绝非易事。在整理垃圾的过程中还在自动产生垃圾，而清理的工作永远不会终结。
现实往往是，大家注意力持续被新事物（比如 AIGC）吸引走，对现存的问题更容易选择性忽视。</p>
<p>企业的大环境在不断变化，一些老朋友选择离开，大部门也经历了一些变革。
从面向风险的团队 re-org 到面向算力的基础设施团队。我认为这是一个好的信号，
AI Infra将继续裹挟着整个 Infra 领域前进，算力管理将成为一个新的命题。</p>
<h2 id="业余---更多连接">业余 - 更多连接</h2>
<p>在 Github 数据的细碎图形中，映射出一年的自娱自乐，可惜的是，未给开源社区更多的贡献。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202401/contributions.png" alt="contributions"  />


</p>
<p>今年，我在开源领域主要的贡献是 <a href="https://github.com/alswl/excalidraw-collaboration">alswl/excalidraw-collaboration</a>。
这个 self-host 的 Excalidraw 版本集协作和中文化字体于一身。这个项目以及相关项目吸引了近300个
star，成为我个人最有影响力的开源项目之一，尽管它是一个前端产品。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202401/excalidraw-collboration.png" alt="excalidraw-collboration"  />


</p>
<p>在暑假期间，趁着家中小神兽不在，我开发了一个关于起名的小程序。虽然这款产品目前有点烂尾，
亏损严重，但我依然希望花更多时间进行开发和改进。一个美好的名字可以给家庭带来无限愉悦，
希望这个项目可以养活服务器资源~</p>
<p>另外，今年我重新活跃在 Twitter 上，分享一些技巧和心得。我的 Follower 从几百人增长到近 4000 人，
虽然离有影响力的推友还有差距，但与许多有趣的朋友交流本身就是一种有趣的事情。</p>
<p>今年一年最受欢迎的内容是：</p>
<ul>
<li>167k 转载：对抗软件复杂度的战争 <a href="https://twitter.com/alswl/status/1714467723567329309">X</a></li>
<li>160k 英语学习经验介绍 <a href="https://twitter.com/alswl/status/1742558249260286368">X</a></li>
<li>127k 介绍 Lightboard <a href="https://twitter.com/alswl/status/1726526339568795667">X</a></li>
<li>120k Web 框架讨论 - Kratos <a href="https://twitter.com/alswl/status/1666118124276699136">X</a></li>
<li>90k 介绍 dumi <a href="https://twitter.com/alswl/status/1684951997752168448">X</a></li>
</ul>
<p>今年最具价值的文章是介绍「许世伟的架构课」<a href="https://twitter.com/alswl/status/1738411522756665350">X</a>，赚了几个月 Twitter 的订阅费。</p>
<p>今年我还重新开始听播客，聆听了一大半「内核恐慌」的存档，虽然未能赶上他们活跃的时期。
幸运的是，在外滩大会上我有机会参与了他们的聚会，与 Rio 和吴涛面对面交流。搞笑的是，虽然现场还有一位同事，
但我们却没有互相认出来，令人感叹在庞大的公司中，有时即便共事也未必能够相识（我们一起担任 Go 语言评委）。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202401/panic.png" alt="panic"  />


</p>
<p>除了内核恐慌，我还一直在听「硬地骇客」，一集都没拉，最近还开始听「有知有行」的播客。</p>
<p>在博客输出方面，我分享了两篇关于工程实践心得的文章，希望能够对读者有所帮助。</p>
<ul>
<li><a href="https://blog.alswl.com/2023/04/web-api-guidelines/">实用 Web API 规范</a></li>
<li><a href="https://blog.alswl.com/2023/07/architecture-design-the-easy-way/">架构设计 the Easy Way</a></li>
</ul>
<p>我最想分享的是 Obsidian Tasks 插件，详细信息可以在我的博客文章中找到，
<a href="https://blog.alswl.com/2023/02/gtd/">从 Toodledo 到 Obsidian Tasks - 我的 GTD 最佳实践</a>。我也很高兴成为 Obsidian Tasks 的 Sponser。</p>
<p>回顾一年的时间，我意识到自己在业余时光中的每周时间仅有10小时左右，非常宝贵。
期许着未来能够实现财务自由，以获得更多的自由时间，投入更多的兴趣爱好。</p>
<h2 id="读书">读书</h2>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202401/cup.png" alt="cup"  />


</p>
<p>读书仍然大部分都是非虚构类书籍。</p>
<p><a href="https://book.douban.com/subject/26318286/">牛棚杂忆 (豆瓣)</a></p>
<p>士可杀亦可辱；过去带来惆怅，现在带来迷惘，未来带来希望。</p>
<p><a href="https://book.douban.com/subject/26628557/">素书 (豆瓣)</a></p>
<p>讲述做人做事的道理，古人的智慧。常读常新，尤其烦躁时候可以翻出来静一下。</p>
<p><a href="https://book.douban.com/subject/26279084/">翻译乃大道 (豆瓣)</a></p>
<p>就是为了看 中文的常态与变态。</p>
<p><a href="https://book.douban.com/subject/26836970/">沙丘 (豆瓣)</a></p>
<p>老男爵举家迁新球，贵公子初入沙漠星。 老皇帝密授哈克南，雷托族全体遭判断。 小保罗掌权弗雷曼，杰西卡诞下遗腹子。 穆阿迪布反攻沙丘，娶伊勒朗再封帝位。</p>
<p><a href="https://book.douban.com/subject/30147790/">跌荡一百年 (豆瓣)</a></p>
<p>国、企、民、央、地。 悲观。</p>
<p><a href="https://book.douban.com/subject/36150914/">被讨厌的勇气 (豆瓣)</a></p>
<p>好希望自己能在 20 岁时候读到这本书。（现在的我已经不需要啦）。教读者如何和自己、周边、世界相处，如何和自己对话以及改变自己。和遇见未知的自己属于同一个路数。</p>
<p><a href="https://book.douban.com/subject/24530465/">旧制度与大革命 (豆瓣)</a></p>
<p>治乱循环在反复。群体的无意识；民主和精英政治是否是解药？评估稳定性一个指标是贫富差距。极权下也孕育变革风险。</p>
<p><a href="https://book.douban.com/subject/5401859/">门后的秘密 (豆瓣)</a></p>
<p>管理入门快速操作手册</p>
<p><a href="https://book.douban.com/subject/33438811/">为什么 (豆瓣)</a></p>
<p>这本书我给不出星级，超出了我的评价范围。 它可能是一个新学科（因果推断）理论，也可能是统计学中的一个星火闪烁。 作者 Pearl 是统计学大拿，也是人工智能领域权威专家，他确在晚年提出了反对自己过去一系列方法路线。 今天为我们所熟知的大部分机器学习技术，都是基于概率上相关性，从啤酒和尿布，到今天 GPT 大杀四方，AIGC 智能涌现。Peral 认为真正有意义的是提出「为什么」，即解释因果关系。因果关系的论述需要智能能够想象不存在的事物，而这正是当前人工智能无法理解的（Maybe？） 本书成于 2019 年，作者今年已经 87 高龄，不知道他对当前 AIGC 风起云涌是怎么看待的。</p>
<p><a href="https://book.douban.com/subject/3248513/">为什么中国人勤劳而不富有 (豆瓣)</a></p>
<p>作者说的正确但是不全面。</p>
<h2 id="flag">Flag</h2>
<blockquote>
<p>高质量陪伴家人，放下手机，走向户外</p></blockquote>
<p>执行了周三、周五家庭日给小朋友陪伴；每天早上送小朋友上学；周末一定有一天陪出行。</p>
<p>陪伴小孩这块我做的不如我老婆好，感谢老婆对家庭的贡献。</p>
<blockquote>
<p>每月输出文章，特别是 Kubernetes / 研发设计领域可以写一些心得</p></blockquote>
<p>今年输出 6 篇文章，达标率 50%。其中两篇 <a href="https://blog.alswl.com/2023/04/web-api-guidelines/">实用 Web API 规范</a> 和 <a href="https://blog.alswl.com/2023/07/architecture-design-the-easy-way/">架构设计 the Easy Way</a> 我都是很满意的。</p>
<blockquote>
<p>经历了新冠，今年计划安排个私教教我健身房运动</p></blockquote>
<p>没有完成。</p>
<blockquote>
<p>投资收益率能做到 10%，今年新手阶段投资以股票型基金为主，投资收益 3.9%，跑赢了大盘和余额宝</p></blockquote>
<p>今年投资收益率 -1.35%，刚出新手村就被暴击，我还是缺乏对市场和商业的理解。</p>
<p>新的一年 Flag：</p>
<ul>
<li>高质量陪伴家人，走向户外，一起参与</li>
<li>持续高质量输出文章，特别是 Kuberntes / PaaS 领域</li>
<li>更多运动</li>
<li>学习投资的基本框架，建立常识和投资逻辑</li>
</ul>
<h2 id="last">Last</h2>
<p>每段经历，每次重逢，每本书籍，都是独特的命运线。新的一年已经来临，
期待着与家人、朋友一同继续探寻生活的真谛，去体验伟大与渺小。</p>
<p>往年总结：</p>
<ul>
<li><a href="https://blog.alswl.com/2022/12/2022-review/">2022 年终总结</a></li>
<li><a href="https://blog.alswl.com/2022/01/20-21/">20 21</a></li>
<li><a href="https://blog.alswl.com/2020/03/2019/">再见 2019</a></li>
<li><a href="https://blog.alswl.com/2019/04/2018/">从 2018 到 2019</a></li>
<li><a href="https://blog.alswl.com/2018/01/2017-2018/">从 2017 到 2018</a></li>
<li><a href="https://blog.alswl.com/2015/01/2014/">2014 惑</a></li>
<li><a href="https://blog.alswl.com/2013/01/my_2012/">My 2012</a></li>
<li><a href="https://blog.alswl.com/2011/12/my-2011/">My 2011</a></li>
</ul>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[如何免费用云服务搭建博客评论系统]]></title>
    <link href="https://blog.alswl.com/2023/11/build-blog-comment-system-based-on-free-cloud-service/"/>
    <id>https://blog.alswl.com/2023/11/build-blog-comment-system-based-on-free-cloud-service/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2023-11-25T17:23:35+08:00</published>
    <updated>2023-11-25T17:23:35+08:00</updated>
    
    <content type="html"><![CDATA[<h2 id="问题">问题</h2>
<p>博客自 2012 年从 WordPress 迁移到静态站点后，就选择了 Disqus 作为评论系统。
但最近 Disqus 硬广告过于频繁，迫切<mark>寻找新的评论系统</mark>。</p>
<p><a href="https://help.disqus.com/en/articles/1717119-ads-faq">Disqus 官方</a> 明确说明，要去掉广告就付费。</p>
<blockquote>
<p>What if I want to remove Ads?
If you&rsquo;d like to remove Disqus Ads from your integration, you may purchase and ads-free subscription from your Subscription and Billing page. More information on Disqus ads-free subscriptions may be found here.</p></blockquote>
<p>OK，那再见吧 Disqus，我会找到可靠、免费、易用的评论系统。
最后既然是寻找新的评论系统，现在 2023 年了，
我希望这个新系统<mark>充分使用云服务的便利</mark>，要做到
<mark>免费、可靠、易运维</mark>。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202311/no-disqus-twitter.png" alt="no-disqus-twitter"  />


</p>
<h2 id="选型原则">选型原则</h2>
<p>在进入探索之前，我先梳理一下自己的原则和选型要求：</p>
<ul>
<li>数据自有是核心要求
<ul>
<li>确保评论数据完全归属于博主，不会因为使用第三方服务而失去对数据的控制。</li>
</ul>
</li>
<li>服务部署和存储是难点
<ul>
<li>考虑到服务的稳定性和成本，选择一个易于部署且存储成本较低的方案。</li>
</ul>
</li>
<li>访问速度是考虑项
<ul>
<li>评论系统的访问速度直接关系到用户体验，
因此需要选择一个能够提供较快访问速度的系统。</li>
</ul>
</li>
</ul>
<p>从功能上面分析需要的能力：</p>
<ul>
<li>邮件通知</li>
<li>Markdown</li>
<li>内容安全：No Injection</li>
<li>评论审核和删除</li>
<li>授权登录（Optional）</li>
</ul>
<p>非功能需求：</p>
<ul>
<li>低成本：控制在 12 元 / 年</li>
<li>系统稳定</li>
</ul>
<p>通过明晰这些原则和要求，可以更有针对性地选择合适的评论系统，确保满足核心功能和非功能需求。接下来，将根据这些原则，继续探讨如何选择和搭建评论系统。</p>
<h2 id="初步方案探索">初步方案探索</h2>
<p>现在我们初步试验一些方案并进行一些探索，以方便我们熟悉一下当前常见系统的<mark>特性和水准</mark>。</p>
<h3 id="utterances"><a href="https://utteranc.es/">utterances</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202311/utterances.png" alt="utterances"  />


</p>
<ul>
<li>经常见到的一个评论系统，流行于程序员群体，基于 Github Issues 系统因此免费，需要使用 Github 账号登录</li>
<li>7.8k star</li>
<li>托管在 Github Issues</li>
</ul>
<h3 id="twikoo"><a href="https://twikoo.js.org/quick-start.html">Twikoo</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202311/twikoo.png" alt="twikoo"  />


</p>
<ul>
<li>国产方案，基于云服务展开，需要寻找云函数部署环境（大部分收费）</li>
<li>880 star</li>
</ul>
<h3 id="cusdis"><a href="https://cusdis.com/">Cusdis</a></h3>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202311/cusdis.png" alt="cusdis"  />


</p>
<ul>
<li>国产方案，提供免费的 Cloud 服务（但是额度比较受限）</li>
<li>2.4k star</li>
<li>支持迁移</li>
<li>手工通过评论</li>
<li>活跃度不高</li>
</ul>
<p>我同时还看了一些外部的一些方案评测报告：</p>
<ul>
<li><a href="https://gohugo.io/content-management/comments/">Comments | Hugo</a></li>
<li><a href="https://cloud.tencent.com/developer/article/2196035?areaSource=&amp;traceId=">静态博客评论系统的选择 - 腾讯云开发者社区-腾讯云</a></li>
<li><a href="https://sspai.com/post/73412">轻量级开源免费博客评论系统解决方案 （Cusdis + Railway） - 少数派</a></li>
</ul>
<p>根据初步方案探索，我可以明确部署形态基本如下：</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202311/comment-system-deploy-diagram.png" alt="comment-system-deploy-diagram"  />


</p>
<h2 id="横向对比">横向对比</h2>
<p>这是一个横向对比表格，列举我一些关心的特性以及候选者在这些特性方面的表现。除了上述提到几款常见软件，
我还额外调研了<mark>海外常用的评论 SaaS 服务</mark>：</p>
<table>
  <thead>
      <tr>
          <th>Name</th>
          <th>self-host</th>
          <th>Official SaaS</th>
          <th>SaaS Free</th>
          <th>Star</th>
          <th>Import Disqus</th>
          <th>export data</th>
          <th>Comments</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Utterances</td>
          <td>x</td>
          <td>v</td>
          <td>v</td>
          <td>7.8k</td>
          <td></td>
          <td>v</td>
          <td>Github account required</td>
      </tr>
      <tr>
          <td>Cusdis</td>
          <td>v</td>
          <td>v</td>
          <td>v?</td>
          <td>2.3k</td>
          <td>v</td>
          <td>v?</td>
          <td>import from Disqus failed</td>
      </tr>
      <tr>
          <td>Cactus Comments</td>
          <td>v</td>
          <td>v</td>
          <td></td>
          <td>100</td>
          <td></td>
          <td></td>
          <td>Matrix Protocol, blocked</td>
      </tr>
      <tr>
          <td>Commento</td>
          <td>x</td>
          <td>v</td>
          <td>$10/month</td>
          <td></td>
          <td>v</td>
          <td>v</td>
          <td></td>
      </tr>
      <tr>
          <td>Graph Comment</td>
          <td></td>
          <td>v</td>
          <td>Free to $7</td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>Hyvor Talk</td>
          <td>x</td>
          <td>v</td>
          <td>$12/month</td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>IntenseDebate</td>
          <td></td>
          <td>v</td>
          <td>?</td>
          <td></td>
          <td>x</td>
          <td></td>
          <td>too old</td>
      </tr>
      <tr>
          <td>Isso</td>
          <td>v</td>
          <td>x</td>
          <td></td>
          <td>4.8k</td>
          <td>v</td>
          <td></td>
          <td>sqlite storage</td>
      </tr>
      <tr>
          <td>Mutt</td>
          <td></td>
          <td>v</td>
          <td>$16/month</td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>Remark42</td>
          <td>v</td>
          <td>x</td>
          <td></td>
          <td>4.3k</td>
          <td>v</td>
          <td>v</td>
          <td>full featured, one file storage</td>
      </tr>
      <tr>
          <td>ReplyBox</td>
          <td></td>
          <td>v</td>
          <td>$5/month</td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>Staticman</td>
          <td>v</td>
          <td></td>
          <td></td>
          <td>2.3k</td>
          <td></td>
          <td>v</td>
          <td>using github as storage</td>
      </tr>
      <tr>
          <td>Talkyard</td>
          <td></td>
          <td>v</td>
          <td>€4.5/ month</td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>Waline</td>
          <td>v</td>
          <td></td>
          <td></td>
          <td>1.5k</td>
          <td>v</td>
          <td>v</td>
          <td>Multi Storage / Service Provider supported</td>
      </tr>
      <tr>
          <td>Twikoo</td>
          <td>v</td>
          <td>x</td>
          <td></td>
          <td>1.1k</td>
          <td>v</td>
          <td>v</td>
          <td>FaaS / MongoDB</td>
      </tr>
  </tbody>
</table>
<p>根据横向对比我们可以得出几个结论：</p>
<ul>
<li>海外传统评论系统数据透明度低，风格也是是古早型系统</li>
<li>官方提供 SaaS 服务普遍需要收费</li>
<li>self-host 的几个产品需要自己搭建服务，没有一键使用免费的 Cloud Provider 路径</li>
</ul>
<p><strong>小结</strong></p>
<p>符合我需求的几款产品是：Utterances、Cusdis、Waline。</p>
<h2 id="poc-和实施">PoC 和实施</h2>
<p>我最后选择了 utterances 和 Waline 进行 PoC，
其中我的<a href="https://en.blog.alswl.com/">英文博客</a>使用了 utterances，
<a href="https://blog.alswl.com/">中文博客</a>使用了 Waline。</p>
<p>为什么不选择 Cusdis 和 Twikoo？因为 Cusdis 使用 PostgreSQL，
而 Twikoo 存储使用腾讯云函数（免费额度有限）或者 MongoDB，
存储上 Waline 选择更多。
另外，作为同类型方案，Waline 是三者贡献者数量最多的，Commit 数量也最多，
社区更有保障。</p>
<h3 id="waline-实施">Waline 实施</h3>
<blockquote>
<p>一个搞笑的点，如果这里使用 h3 标题叫做「Waline」，会直接在这里插入一个当前博客的评论框</p></blockquote>
<ul>
<li>优点
<ul>
<li>多平台部署</li>
<li>多数据库支持（MongoDB、sqlite、PostgreSQL、MySQL）</li>
<li>评论功能强大</li>
<li>导入工具</li>
<li>活跃度尚可</li>
</ul>
</li>
<li>缺点
<ul>
<li>功能太多，不够克制（好在可以自定义配置）</li>
<li>国产产品</li>
</ul>
</li>
<li>接入流程：
<ul>
<li>找个 Storage 供应商（我选择 <mark>LeanCloud</mark>）</li>
<li>找个 Server 供应商部署（我选择 <mark>Vercel</mark>）</li>
<li>找个邮件发送供应商（我选择了 <mark>Brevo</mark>（原来叫 SendinBlue））</li>
<li>前端部署（Hugo 内集成一下）</li>
</ul>
</li>
</ul>
<p>部署图：</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202311/waline.png" alt="waline"  />


</p>
<p>具体操作，跟随官方文档即可：</p>
<ul>
<li><a href="https://waline.js.org/guide/get-started/">快速上手 | Waline</a></li>
<li><a href="https://waline.js.org/guide/deploy/vercel.html#%E5%A6%82%0E4%BD%95%E9%83%A8%E7%BD%B2">Vercel 部署 | Waline</a></li>
<li>绑定 CName</li>
<li>导入数据
<ul>
<li>转换 <a href="https://waline.js.org/migration/tool.html">数据迁移助手 | Waline</a></li>
<li>导入 <a href="https://console.leancloud.app/apps/yours/storage/import-export">https://console.leancloud.app/apps/yours/storage/import-export</a></li>
</ul>
</li>
<li>配置页面
<ul>
<li>参考配置系统禁用一些评论功能 <a href="https://waline.js.org/reference/client/props.html">https://waline.js.org/reference/client/props.html</a></li>
<li>启用 SMTP
<ul>
<li>配置 <code>AUTHOR_EMAIL</code></li>
<li>配置 <code>SENDER_NAME</code></li>
<li>配置 <code>SENDER_EMAIL</code></li>
</ul>
</li>
<li>服务端配置 <a href="https://waline.js.org/reference/server/config.html#tgtemplate">https://waline.js.org/reference/server/config.html#tgtemplate</a></li>
</ul>
</li>
<li>遇到的问题
<ul>
<li>Disqus 导出的用户数据没有邮箱，导致 gravatar 没有照片显示，无解</li>
<li>邮箱配置需要额外配置环境变量，否则会暴露自己的个人邮箱</li>
</ul>
</li>
</ul>
<p>实施 PR（仅包含前端，因为后端代码包含了密钥，不便于分享）：
<a href="https://github.com/alswl/blog.alswl.com/commit/e34e34810298fd0d716d4c4a467fada25b3a6622">feat: comments on waline · alswl/blog.alswl.com@e34e348</a></p>
<h3 id="utterances-实施">Utterances 实施</h3>
<p>utterances 的部署则更为简单，一个 PR 就可以启用。
<a href="https://github.com/alswl/en.blog.alswl.com/commit/29028f677e362570a8bcaf5316847ddfa3e9d685">feat: comment using utteranc · alswl/en.blog.alswl.com@29028f6 (github.com)</a></p>
<p>也没有什么特色，主打简单省事，考虑我英文博客访问量极低，就简单方案。</p>
<h2 id="小结">小结</h2>
<p>最后我选择了 Waline / utterances 作为我的评论系统，两者的部署成本都是 0。</p>
<p>妥协牺牲了一些访问速度、安全性，但进一步增强了数据可控性，完成了 self-host。
从稳定性上面来看，尽管这个系统链路变复杂了，单机上也存在可用性风险，
但依托 Vercel / LeanCloud / Brevo 三家 SaaS 服务商，整体风险可控。</p>
<p>毕竟只是一个小小评论系统，0 成本 + 正常工作就行了。</p>
<p>欢迎在下面评测测试一下哦~</p>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[GitOps 和版本管理]]></title>
    <link href="https://blog.alswl.com/2023/09/gitops-and-version-management/"/>
    <id>https://blog.alswl.com/2023/09/gitops-and-version-management/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2023-09-23T18:22:27+08:00</published>
    <updated>2023-09-23T18:22:27+08:00</updated>
    
    <content type="html"><![CDATA[<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202309/car.png" alt="car"  />


</p>
<p><small>image via <a href="https://www.shipvehicles.com/step-by-step-guide-for-state-to-state-transport/">shipvehicles</a></small></p>
<p>使用 GitOps 管理交付内容是一个常见的 DevOps 使用模式。
我们会使用 Git 进行版本管理，
并通过 Git Tag 来跟踪部署软件的版本。
虽然这看上去可以工作，但在云原生技术的推动下，版本的概念远非如此简单。</p>
<h2 id="版本问题">版本问题</h2>
<p>在引入 GitOps 到 DevOps 流程后，我们可以借助 GitOps 的能力进行持续集成和持续交付。
GitOps 解决了三个核心问题：<strong>内容</strong>、<strong>版本</strong> 和 <strong>协作</strong>。然而，我们经常将注意力集中在内容上，却经常忽略了版本管理问题。</p>
<p>在 GitOps 过程中，有哪些版本管理问题需要解决呢？</p>
<p>一套完整的 GitOps 解决方案包括内容描述（Manifest）、构建方案（Builder）和生效方案（Applier）。其中，内容描述衍生出多种描述语言，从最传统的 <a href="https://www.ansible.com/">Ansible</a> / <a href="https://www.chef.io/products/chef-infra">Chef</a>，到云计算和云原生流行起来的 <a href="https://www.terraform.io/">Terraform</a>、<a href="https://helm.sh/">Helm</a>、<a href="https://kustomize.io/">Kustomize</a> 等。引入了这么多内容描述方式之后，当我们想要明确一个应用的版本时，变得非常复杂。</p>
<p>当提到版本时，我们是<mark>指应用源代码的版本？还是指镜像的版本？或者是指某个基础设施即代码（IaC）仓库的版本</mark>？进一步地，如果我们要发布一组相互关联的应用，例如前端和后端，或者由多个后端应用组成的系统，如何清晰地描述它们之间的<mark>版本依赖关系</mark>？</p>
<p>一旦版本描述不准确，就会引入一系列问题，例如错误的上线版本、混乱的应用依赖关系、无法回滚等。</p>
<p>大多数团队对于这个问题的解决方案比较模糊：发布最新的版本，先发布后端再发布前端。然而，在一个复杂的业务团队或需要同时保留多个稳定版本的团队中，这种粗暴的方案是无法接受的。</p>
<p>版本管理不仅解决了<mark>版本定位</mark>的问题，还可以用于管理应用之间的<mark>依赖关系</mark>。因此，GitOps 版本管理需要解决以下问题：</p>
<ul>
<li>如何构建交付给客户的制品，如何定义这些制品的版本以及如何展示所有版本的制品。</li>
<li>如果有一组软件存在版本依赖关系，如何解决这些依赖问题。</li>
<li>如果一组软件形成了一个系统，如何描述这个系统。</li>
</ul>
<p>在所有的交付产品中，版本管理都是一个重要问题。我们将逐步拆分版本管理这个命题，并从原始问题过渡到 GitOps 的版本管理最佳实践。</p>
<h2 id="gitops-简介">GitOps 简介</h2>
<p>在开始正文之前，我将简要介绍 GitOps，以避免对关键概念的理解出现分歧。</p>
<p>GitOps 最核心的技术是<mark>基础设施即代码（IaC）</mark>，即使用声明式描述来取代命令式描述。
通常，IaC 的内容基于某种范式，用于描述特定目标的期望状态。这个范式可以是 Terraform、Kubernetes YAML、<a href="https://www.pulumi.com/">Pulumi</a>，甚至是 Ansible。而特定目标可以是云服务、Kubernetes，甚至是物理机。
直观的说，通过使用 YAML 取代过去的 Bash 命令，我们可以大大提高变更的准确性和可控性。</p>
<p>对于 GitOps 来说，是否使用 Git 并不是最重要的，我们也可以使用 SVN 来实现 GitOps。只是 Git 具有更广泛的适用范围，并可以充分发挥 Git 仓库在团队协作和持续集成/持续部署中的能力。</p>
<p>引入 Git 仓库后，我们还同时拥有了基于 Git Revision / Tag / Branch 的版本管理能力，这体现在业务上就是版本记录、多版本并行管理等方面。</p>
<p>简单地基于 Git Revision 进行描述还不足以满足我们的实际需求。</p>
<h2 id="问题的源头---二进制文件和启动配置文件版本">问题的源头 - 二进制文件和启动配置文件版本</h2>
<p>在探索版本的源头时，我们会发现最原始的版本是代码的版本。</p>
<p>代码的版本是什么？是代码仓库的版本还是代码编译出来应用的版本。
这个版本并不是代码所在的版本管理系统（如 Git / Mercurial / SVN 等）的版本。尽管这两者经常相关，但事实上，一份代码本身只是一组代码文件，只要构建成功，就会有一个版本。如果没有定义，版本就是未知的，此时与仓库管理没有关联。</p>
<blockquote>
<p>注意：下文我们不再区分 Git / Mercurial / SVN 多种版本管理方案，统一使用 Git 进行描述</p></blockquote>
<p>还需要注意的是，中文中有两个概念（库 Libray 和仓库 Repository）。
无论是哪种定义，都没有表示一个库一定是一个版本化（Git / SVN）仓库，
这意味着我们并没有假设代码库一定是被版本化管理的。当我们将代码文件打包成一个 zip 文件时（GitHub 的 zip 下载就是这种形式），即使这个 zip 文件失去了所有的 Git 历史，它仍然是一个代码库。</p>
<p>代码的版本实质上是<mark>应用的版本</mark>，这是作者的意图表达。这个版本往往是 <code>vx.y.z</code> 这种形式，而不是 Git commit hash，
最常见的管理方案是基于<a href="https://semver.org/">语义化版本</a>。</p>
<p>我推荐的版本存储方式是使用一个 <code>VERSION</code> 文件将版本存储在代码目录中。例如，Git 的 <a href="https://github.com/git/git/blob/master/GIT-VERSION-GEN">Version</a> 文件可以清楚地看到当前 Git 的版本是：</p>
<pre tabindex="0"><code>GVF=GIT-VERSION-FILE
DEF_VER=v2.42.GIT
</code></pre><p>其中的 <code>.GIT</code> 也明确说明了这个代码是一个开发模式下的版本。如果我们切换到一个发布版本的代码，例如 <a href="https://github.com/git/git/blob/v2.39.3/GIT-VERSION-GEN">v2.39.3</a> 版本，我们可以看到 <code>DEF_VER=v2.39.3</code>，这是一个遵循标准的制品（Artifacts）格式。这里还有两个最佳实践：</p>
<ul>
<li>使用文件来保存源代码的版本。</li>
<li>源代码中的版本文件始终处于 <code>dev</code> 模式，只有在进行标记封版之后才会成为正式版本号。</li>
</ul>
<p>源代码的最终产物不仅包括二进制文件、可执行文件和动态库（<code>.dll</code> / <code>.so</code> / <code>.dylib</code>），还包括相应的启动配置文件。这些启动配置文件通常与对应的版本一起进行管理。例如，Nginx 的启动文件 <code>nginx.conf</code> 和 Redis 的启动文件 <code>redis.conf</code>，这些启动配置文件也应该纳入版本管理。</p>
<p>从源代码仓库构建出来的内容就是制品（Artifacts）。制品已经具有两个版本：</p>
<ul>
<li>源代码版本，即使用 <code>VERSION</code> 文件中定义的版本。</li>
<li>源代码仓库版本，即 Git Revision</li>
</ul>
<h2 id="制品版本管理">制品版本管理</h2>
<p>引入制品版本管理后，问题变得更加复杂，因为制品带来了更多的问题：</p>
<ul>
<li>制品是什么，由什么构成？（上文已经回答）</li>
<li>制品如何进行安装，安装程序（Installer）是什么，运行时（Runtime）是什么？</li>
<li>制品信息如何进行集中管理，数据如何管理？</li>
<li>制品之间是否存在依赖关系，如何处理依赖关系，版本如何约束？</li>
</ul>
<p>制品的概念非常重要，其中最核心的一个理念是：<mark>制品可以通过打包器形成新的制品</mark>。</p>
<p>由于制品具有版本，而新的制品将形成新的版本，我们将进入多层嵌套。为了避免最原始的版本信息丢失，我们将 Version 的概念扩展为 <mark>Upstream Version</mark>，这是软件作者人为指定的版本，是所有版本的源头。</p>
<p>为什么制品可以形成新的制品呢？我举一个 Kubernetes 容器环境下的例子。
容器是一种交付形式，它将可执行文件和启动配置文件写入镜像文件中，并可以在容器环境中运行。形成的镜像文件存在于镜像仓库中，本身也是一种制品。</p>
<p>另外，Helm / Kustomize 也是一种交付形式（打包工具链）。
每个构建层解决其特定问题，并且可以在特定环境（例如容器、Kubernetes、云基础设施）中运行。</p>
<p>每个制品都需要构建，过程中会有自己的<mark>额外描述信息（Packaging Info）</mark>，这些额外的描述信息本身也会发生变化，因此会增加一个版本。在实践中，我们希望制品的版本与其上游版本绑定。每种打包机制可能会包含自己的一些定义配置，但仍然遵循上游的版本。例如，Kubernetes 的 Workload 包含一个镜像，Workload 的描述是附加信息，而镜像仍然受到上游控制。</p>
<p><mark>Artifact + Packaging Info = New Artifact</mark>，制品经过打包可以形成新的制品。直到最后的 Installer 放置到相应的环境中生效。</p>
<p>如果这些制品可以通过文件（IaC）进行描述，就形成了各种 IaC 仓库，这些仓库成为了 GitOps 的核心对象。</p>
<h2 id="概念梳理">概念梳理</h2>
<p>让我们来理清一下这些略有晦涩的概念：</p>
<table>
  <thead>
      <tr>
          <th>中文</th>
          <th>英文</th>
          <th>解释</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>源代码</td>
          <td>Source Code</td>
          <td>程序、应用的源文件集合</td>
      </tr>
      <tr>
          <td>代码仓库</td>
          <td>Source Code Repo</td>
          <td>源代码放到版本管理系统中的管理单元</td>
      </tr>
      <tr>
          <td>版本</td>
          <td>Version</td>
          <td>源代码对应的应用版本，人为定义，语义化，有些场景会说 Upstream Version</td>
      </tr>
      <tr>
          <td>可执行文件</td>
          <td>Executable File</td>
          <td>源代码构建出来的结果，一般是 ELF 可执行文件，也可以是 Lib 文件</td>
      </tr>
      <tr>
          <td>启动配置文件</td>
          <td>Configuration File</td>
          <td>配套 ELF / Lib 的启动配置文件，区别于广泛意义上的配置文件（比如 Kubernetes YAML）</td>
      </tr>
      <tr>
          <td>制品</td>
          <td>Artifact</td>
          <td>包含可执行文件和启动配置文件的集合，可以运行在运行时下面，一般是文件形态。制品可以嵌套制品。</td>
      </tr>
      <tr>
          <td>安装器</td>
          <td>Installer</td>
          <td>将制品安装到运行时的工具</td>
      </tr>
      <tr>
          <td>运行时</td>
          <td>Runtime</td>
          <td>制品的运行环境，比如特定操作系统，Kubernetes，Docker Engine。</td>
      </tr>
      <tr>
          <td>打包器</td>
          <td>Packer</td>
          <td>将制品打包成特定格式（新的制品）的工具</td>
      </tr>
      <tr>
          <td>打包附属信息</td>
          <td>Packaging Info</td>
          <td>制品打包时候需要的额外信息，比如容器的操作系统，进程的运行容量，默认环境变量等</td>
      </tr>
  </tbody>
</table>
<p>这些概念共同构成了制品版本管理的核心要素，帮助我们管理和跟踪制品的不同版本，以及它们之间的关联和依赖关系。</p>
<h3 id="打包器-packer">打包器 Packer</h3>
<p>打包器是一种工具，通过打包操作（Packaging）将制品组织成特定的格式，形成全新的制品。
打包的过程涉及编译、链接、合并和存档等常见概念。</p>
<p>它通常以上游（Upstream）作为输入，上游可以是源码，也可以是其他系统生成的制品（Artifacts）。</p>
<p>例如，在打包 Docker Compose 时，输入是镜像（Image），而对于 Helm，输入则包括镜像、启动配置文件和 Helm 模板，而输出则是 YAML 文件。</p>
<h3 id="制品-artifacts">制品 Artifacts</h3>
<p>制品是一种数据集合，可以在特定环境中运行。
它由可执行文件和启动配置文件等组成，通常以文件形式存在，并且可以在运行时环境下运行。制品具有嵌套的能力，可以包含其他制品。</p>
<p>最常见的形态是二进制文件（ELF），也可以是适用于特定环境的运行物，如容器镜像。</p>
<p>制品通常以文件形式进行传输。</p>
<h3 id="安装器-installer">安装器 Installer</h3>
<p>安装器是一种工具，用于将制品安装到运行时环境中。
它负责将制品部署到目标环境并确保其正常运行。
例如，dpkg、Pacman 是常见的安装器工具，而在 Windows 平台上，我们常见自引导的安装器。</p>
<p>对于特定的环境如 Kubernetes，我们可以使用 kubectl 命令进行安装，而 Helm 则使用<code>helm</code>命令来进行安装。</p>
<h2 id="linux-社区实践">Linux 社区实践</h2>
<p>当我们理解了这些概念后，我们或许会惊讶地发现，这些概念与 Linux 社区多年来的实践是如此相似。抛开云原生等新概念，Linux 社区早就拥有了完整的解决方案。</p>
<p>每一层制品都会引入新的配置（Config）/ 扩展（Extension）/ 值（Values）/ 环境变量（Env）等等，无论如何称呼，
我们统一称之为配置。
这些新加入的 Packaging Info 的描述在大规模集群管理下也带来了新的问题。</p>
<blockquote>
<p>自豪地使用 ArchLinux。</p></blockquote>
<h3 id="arch-linux-社区的实践">Arch Linux 社区的实践</h3>
<p>Arch Linux 使用 <a href="https://wiki.archlinux.org/title/Pacman">Pacman</a> 作为包安装器，并且拥有一套完整的<a href="https://wiki.archlinux.org/title/Arch_build_system">构建方案</a>。</p>
<p>在 Arch Linux 中，<code>PKGBUILD</code> <a href="https://wiki.archlinux.org/title/PKGBUILD">link</a>用于描述包的构建方式，它本身是 Bash 的子集，是描述包的核心文件。</p>
<p>版本管理方面，Arch Linux 提供了清晰明确的方案，并且设计了完整的<mark>制品嵌套</mark>解决方案。
在 <code>PKGBUILD</code> 中，<code>pkgver</code> 表示上游版本，并经过适当的修正，使用 <code>_</code> 替代 <code>-</code>，并调整了时间戳的格式。而 <code>pkgrel</code> 则表示发布号，而不是构建号，每次发布都会增加该号码，用于管理 Arch Linux 的发布动作。当大部分 <code>PKGBUILD</code> 发生变化时，发布号都会发生变化。</p>
<p>此外，<code>epoch</code> 是一个强制构建版本的机制，默认为 0 并且隐藏起来。使用 <code>epoch</code> 是一种兜底的解决方案，通过破坏版本对比来强制进行新版本的升级。</p>
<p>另外，在 <code>PKGBUILD</code> 中，使用了版本依赖的方式来优雅地解决模块的问题。
例如，<code>base-devel</code> 包是对 26 个基础软件的依赖，而<a href="https://gitlab.archlinux.org/archlinux/packaging/packages/base-devel/-/blob/main/PKGBUILD">该包本身</a>并<mark>没有具体的内容</mark>。这种方案非常优雅，避免了引入一个新的模型（比如叫做 Group / 产品）。</p>
<h2 id="基于-gitops-的版本管理解决方案">基于 GitOps 的版本管理解决方案</h2>
<p>最后让我们回归到 GitOps 版本管理本身，让我们重新面对文中的几个问题，通过以上的分析和调研，是否已经解决了这些问题呢？</p>
<ul>
<li>交付给客户的制品如何构成，如何定义这个制品的版本，以及如何呈现所有版本的制品？
<ul>
<li>使用 <code>VERSION</code> 文件来确定软件版本，也就是上游版本（Upstream Version）</li>
<li>不同形式的制品有独立的版本号，这些版本号需要与上游版本关联。例如，可以使用 <code>v1.2.3-afe12c</code> 的形式来追踪 Git 仓库中的版本，使用 <code>v1.2.3-afe12c-b1</code> 来追踪镜像构建物的版本。</li>
</ul>
</li>
<li>如果存在一组软件，如何解决这组软件之间的版本依赖问题？
<ul>
<li>这个问题可以交给具体的安装器处理，一般这些元信息会在对应的打包信息（Packaging Info）中定义，并由 Installer 识别和处理。</li>
</ul>
</li>
<li>如果一组软件形成了一套体系，如何表达这个体系？
<ul>
<li>创建一个没有上游版本的新制品，其中交付的内容可能为空，但包含相应的打包信息和依赖信息。</li>
<li>（或者）也可以真正抽象出一个新的概念来进行管理，这取决于打包器和安装器之间的协作。</li>
</ul>
</li>
</ul>
<h2 id="总结">总结</h2>
<p>版本管理的智慧，其实已经体现在当年的 RPM / DEB / PKGBUILD 中。
我们通过明确版本定义权交给应用作者，提出制品嵌套的概念，允许版本的概念进行多层嵌套。</p>
<p>我们希望，最后运行的制品版本仍然是原始应用版本（Upstream Version）的衍生。毕竟，
让每个运行的程序都知道自己来自何处、自己是谁，在大规模集群管理下已经变得相当重要。</p>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[架构设计 the Easy Way]]></title>
    <link href="https://blog.alswl.com/2023/07/architecture-design-the-easy-way/"/>
    <id>https://blog.alswl.com/2023/07/architecture-design-the-easy-way/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2023-07-29T14:54:27+08:00</published>
    <updated>2023-07-29T14:54:27+08:00</updated>
    
    <content type="html"><![CDATA[<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202307/arch-easy.png" alt="arch-easy"  />


</p>
<p><small>image via <a href="https://pixabay.com/photos/child-tower-building-blocks-blocks-1864718/">Pixabay</a></small></p>
<h2 id="概览">概览</h2>
<p>前几日，我在团队内部举行了一场技术分享，我介绍了关于架构设计的最佳实践。将这些实践凝练成了 <mark>20 字口诀</mark>：</p>
<ol>
<li>架构看问题</li>
<li>需求看用例</li>
<li>设计看模型</li>
<li>细节看时序</li>
</ol>
<p>我将顺口溜转到了 <a href="https://twitter.com/alswl/status/1683778487726006272">Twitter</a>，不少朋友对这些顺口溜产生了浓厚兴趣，希望深入了解。因此，我将我分享中的观点扩展成了这篇文章。</p>
<h2 id="架构设计和系统分析">架构设计和系统分析</h2>
<p>让我们首先澄清 <mark>什么是架构设计和系统分析</mark>（简称系分）。有些朋友对前者很熟悉，对后者却不太了解。
不过没关系，以下是维基百科上的介绍：</p>
<blockquote>
<p>架构，<strong>软件架构</strong>是有关软件整体结构与组件的抽象描述，用于指导大型软件系统各个方面的设计。</p>
<p>系统分析，旨在研究特定系统结构中各部分（各子系统）的相互作用，系统的对外接口与界面，以及该系统整体的行为、
功能和局限，从而为系统未来的变迁与有关决策提供参考和依据。</p></blockquote>
<p>来看一下英文定义可能会更清晰：</p>
<ul>
<li>架构 = 软件架构（设计） = Software Architecture <a href="https://en.wikipedia.org/wiki/Software_architecture">Software architecture - Wikipedia</a></li>
<li>系分 = 系统分析 = System Analysis
<a href="https://en.wikipedia.org/wiki/Systems_analysis">Systems analysis - Wikipedia</a> + <a href="https://en.wikipedia.org/wiki/Systems_design">Systems design - Wikipedia</a></li>
</ul>
<p>我们有时候提到的设计文档，可能涵盖整个设计过程，包括架构设计、系统分析以及其他设计活动（交流、PoC）。</p>
<p>软件架构（设计）= Software Architecture</p>
<ul>
<li>设计和实现软件系统的基本结构和组织形式</li>
<li>在业务层面：明确问题，厘定概念，呈现价值</li>
<li>在技术层面：确定基础框架，将不确定性转化为确定性</li>
<li>工程层面：识别边界和拆分各个模块，提高应用开发效率</li>
</ul>
<p>系统分析 = System Analysis</p>
<ul>
<li>对业务需求和问题进行分析和研究的过程</li>
<li>在业务层面：需求收集、需求分析</li>
<li>在技术层面：建模，绘制流程图、数据流图和接口设计</li>
<li>工程层面：在应用、系统框架内实现需求</li>
</ul>
<p>最后，我来解释一下我对这两者边界的理解。实际上，我认为<mark>架构设计和系统分析并没有明显的界限</mark>。
一个系统或模块不管如何都会进行系统分析，而当出现以下几个特征时，就开始考虑架构设计问题：</p>
<ul>
<li>当有超过 3 个团队在协作时，因为这时涉及到利益和边界的问题。</li>
<li>当开始主动或被动引入不确定性。</li>
<li>当开始平衡取舍，需要先做到什么程度，再做到什么程度。</li>
<li>当不系统过于复杂，太容易达成一致，开始有解释成本时。</li>
<li>当能够提供别人不了解的信息。</li>
</ul>
<h2 id="什么是架构">什么是架构</h2>
<p>在这里，我们讨论的是技术架构，不会涉及业务架构或产品架构等方面。
技术方面的讨论重点是<mark>如何更高效地利用技术能力和方法来解决特定类型的问题</mark>。</p>
<p>进一步地，技术架构可以分为两种：一种是<mark>从顶层向下</mark>看，包括业务、战略和框架划分；
另一种是<mark>关注工程实现（编码）</mark>层面需要解决的架构问题。</p>
<p>那些经验丰富的人常常有较宏观的视角，使用的常见名词有：全局、宏观、领域、战略、平衡、规划。我将这些词汇整理成了一个词云如下：</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202307/word-cloud-arch-biz.png" alt="word-cloud-arch-biz"  />


</p>
<p><small>generted by <a href="https://tendcode.com/tool/word-cloud/">https://tendcode.com/tool/word-cloud/</a></small></p>
<p>以上这些概念在架构设计和系统分析中都非常重要，因为它们帮助我们在整体上考虑问题，甚至超越技术层面，
从业务价值、商业策略和业务战略的角度思考问题。</p>
<p>另一种架构偏重于工程设计和实现。常见的关键词有：领域建模、UML、GoF23，SOLID，高内聚低耦合等等。对应的词云如下：</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202307/word-cloud-arch-impl.png" alt="word-cloud-arch-impl"  />


</p>
<p><small>generted by <a href="https://tendcode.com/tool/word-cloud/">https://tendcode.com/tool/word-cloud/</a></small></p>
<p>架构的话题非常广泛，本文选择从一个切入点出发：<mark>通过实践和方法论，使架构意识在日常工作中发挥作用，以满足 80%的工程设计开发场景</mark>。
我称之为「架构设计 the easy way」。</p>
<h2 id="极简架构设计---架构看问题">极简架构设计 - 架构看问题</h2>
<p>理解架构的第一步，也是最重要的一步，就是关注「问题」。也就是说，<mark>你遇到了什么问题，你将如何去解决它</mark>？</p>
<p>通常情况下，如果我们的业务和系统都稳定运行，没有遇到任何问题，我们就不太需要进行架构设计。但是，只要涉及到架构设计，
必定是因为我们遇到了问题。这些问题可能源自新的需求，也可能是外部环境的变化，
亦或是系统自身随着时间的发展而出现的。无论问题的来源如何，我们都遇到了问题。</p>
<p>遇到问题之后，我们该如何解决？就像将大象装进冰箱一样，需要分成几个步骤。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202307/elephant.png" alt="把大象装进冰箱"  />


</p>
<p><small>image via unkown</small></p>
<p>因此，解决问题也有三个步骤：第一步是将问题描述清楚，第二步是进行协商和决策达成一致，第三步则是着手解决问题。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202307/q-n-a.png" alt="问题-一致-行动"  />


</p>
<p>我还想问一个听上去很愚蠢的问题：为什么不能直接解决问题？</p>
<p>因为问题是复杂的，有许多解决路径，不同的解决方案各有优劣和成本。在架构设计中，我们需要完成这些决策。</p>
<p>那为什么不直接进行决策，甚至直接开始动手？</p>
<p>首先可能涉及到职权问题，架构师未必有最终决策权，需要有决策权的人来做最后的决定。
第二个原因是架构师未必是方方面面的专家，设计一个复杂系统时候需要协调多个部分和领域专家来一起评估决策。</p>
<h3 id="案例">案例</h3>
<p>我举 Prometheus 的架构设计来作为例子。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202307/prometheus-architecture.png" alt="Prometheus architecture"  />


</p>
<p><small>image via <a href="https://prometheus.io/docs/introduction/overview/">Prometheus</a></small></p>
<p>这个架构图回答了很多问题，我举几个例子：</p>
<ul>
<li>问题：数据采集使用 Push 还是 Pull？使用什么存储？如何设计告警链路？</li>
<li>决策：采用 Pull（少量情况下使用 Pushgateway）；使用自己实现的 TSDB；使用 Alertmanager 与外部系统对接</li>
<li>ROI：采用 Pull 降低 Target 观测成本，不需要使用 Push-based 的 Registry；
没有现成的外部实现（当时）；提供 Router / Sub 的告警机制以便灵活接入外部系统</li>
</ul>
<h3 id="小结">小结</h3>
<p>问题驱动架构变化，架构方案应对问题，架构评审统一解决方案。</p>
<p>关于决策拍板问题。我强烈推崇架构师根据自己具备的领域知识、对行业的判断以及对现状的了解，
做出自己的思考和独立判断。这些思考过程应该有因果关系的支持，<mark>一个优秀的架构师必定拥有自己的观点</mark>。</p>
<p>最后，我补充一个小问题：为什么这里没有提到架构分层、模块分层？</p>
<p>不是因为分层和框架不重要，而是在因为大家都很专业。分层和模块化已经是基本常识和技能，因此反而往往不会成为争论和决策的焦点。
如果分层和框架无法快速形成一致，有可能团队构成上存在问题，也可能问题过于复杂已经不是 80% case。</p>
<p>在本阶段，产出的成果包括架构图以及对问题、价值、成本、风险和分工达成一致的认识。</p>
<h2 id="极简架构设计---需求看用例">极简架构设计 - 需求看用例</h2>
<p>需求是对问题的解答。我个人喜欢用<mark>思维导图或白纸来画图</mark>，将需求讲清楚。
画什么内容呢？理清角色，并列出各种动作和行为。</p>
<p>那有什么技巧可以将事项都整理出来呢？我经常使用<mark>主谓宾状从</mark>的方法。
也就是说，明确哪些人，在什么场景（可选），以什么状态（可选）做着什么事情。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202307/gramma.jpg" alt="主谓宾"  />


</p>
<p><small>image via unkown</small></p>
<p>通过用例将需求清晰地拆解，并在这个过程中不断与需求提供方进行交流和沟通。</p>
<p><mark>Demo 稿是产品经理的武器，而需求用例则是工程师的武器。</mark></p>
<p>有些初入职场的研发人员会不自然地变成需求的执行者。我比较果断地判断，不了解业务的工程师和外包没什么区别。而需求分析环节是最重要的，
是对业务输入进行理解、梳理、重新设计的机会。通过用例的整理，我们可以将一些不切实际、不可靠的需求反馈给需求方。</p>
<p>这是少数可以推动（反馈）需求方的阶段，一定要珍惜。</p>
<h3 id="案例-1">案例</h3>
<p>这里有一个产品用例的范例：</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202307/netease-music.png" alt="网易云音乐"  />


</p>
<p><small>image via <a href="https://www.woshipm.com/evaluating/3493594.html">网易云音乐产品分析报告</a></small></p>
<p>实际上，这个用例是敌对势力那边总结的 😄，但仍然能够体现用例的重要性。</p>
<h3 id="小结-1">小结</h3>
<p>除了使用主谓宾的方式来进行设计，还有一些其他技巧：</p>
<ul>
<li>使用动线（行动路线）：想象用户（或行动者）完成他们目标的行动路线</li>
<li>可以优先考虑解决核心路径中的 20%问题</li>
<li>通过分角色、正交拆分等方式将用例整理得更加清晰；将用例分类分到各个模块</li>
</ul>
<p>本阶段的产出物包括：Demo 稿、用例图。</p>
<h2 id="极简架构设计---设计看模型">极简架构设计 - 设计看模型</h2>
<p>在我看来，设计的核心在于模型：<mark>模型确定了数据的载体和边界</mark>。而<mark>数据确定了组成部分，边界则确定了归属和职责</mark>。
在 UML 中，大量的 Entity 和 Object 用于确定模型的边界。
随着业务系统复杂程度的增加，建模也会面临更加复杂的挑战。</p>
<p>我总结了一下我建模的几个要点：</p>
<ul>
<li>明确术语（中英文）、含义、备注。</li>
<li>确定核心模型（重点放在最关键的 20%）。</li>
<li>提炼和抽象模型。</li>
<li>明确模型之间的关联关系。</li>
<li>结合动态和静态：少量模型具有行为，关注其提供的功能（Functions）。</li>
<li>业务模型 &lt;-&gt; 数据模型转换。</li>
</ul>
<p>很多人对中英文术语表不屑一顾，但我却很在意这点。有一个效应叫做「外语陌生感」（Foreign Language Effect），
就像博物学使用拉丁语 / 希腊语来描述物种一样。我们非英语母语的工程师，使用英文描述术语可以快速地聚焦问题。</p>
<p>始终牢记 80/20 原则的存在，特别是在设计阶段，一定要关注核心对象，将其放大而非过度关注细节。
一般来说，关注最核心的 20%模型就可以满足大部分场景。</p>
<p>在模型的提炼和抽象过程中要反复斟酌，并且可以将这个过程联动到前期的用例定义和后期的时序设计，
这需要大量领域知识的支持。我个人喜欢在这个阶段参考外部的代码和设计。</p>
<p>模型之间的关联关系主要是 1:1 / 1:N / M:N 关系，需要使用箭头清楚地标记主从关系。主从关系意味着从属关系，
这会影响后续一系列细节设计（如 URL、数据库、生命周期管理等）。
我个人推荐避免使用 M:N 关系，这种形式通常表明中间会有一个凭证（Credential）或关系（Relationship / Binding）。</p>
<p>除了关注静态的数据，还要关注模型的行为（极少量模型才有）。这个阶段可以进一步做一些识别，方便下一步的细节设计。</p>
<p>完成业务模型设计之后，同时要考虑数据模型。对于普通业务系统，这个转换会非常直观简单。业务系统通常是无状态系统，
完全依赖数据库进行存储。如果面临 DIA（Data Intensive Application）系统，就要考虑运行时数据的管理，
以及一系列复杂的生命周期管理和可用性管理（我估计有这个需求的朋友，不会看到这里了）。</p>
<h3 id="案例-2">案例</h3>
<p>我举例一个 Kubernetes 的 RBAC（Role-Based Access Control）系统，这是常见的 AuthZ 授权鉴权系统（注意，不是 AuthN 认证系统）。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202307/rbac.png" alt="Kubernetes RBAC"  />


</p>
<p><small>image via <a href="https://dev.to/alcide/kubernetes-rbac-moving-from-it-s-complicated-to-in-a-relationship-1bbm">Kubernetes RBAC - DEV Community</a></small></p>
<p>这里我抛几个问题：</p>
<ul>
<li>为什么需要使用 Role / ClusterRole 两种？它们的结构如何？</li>
<li>为什么不使用 ACL？使用 ACL 和使用 RBAC 有什么差异？</li>
<li>为什么不用 Policy？为什么不使用 Policy？</li>
</ul>
<p>这些答案都需要建模来回答的。</p>
<h3 id="非业务系统的模型">非业务系统的模型</h3>
<p>在我们的讨论中，更多关注的是业务模型，即用户能感知并产品能理解的模型，通常需要存储在数据库中。</p>
<p>但在基础设施领域，也是有模型的，有时候称之为&quot;概念&quot;（Concept）。基础设施领域的模型通常会简单得多，
而业务模型可能会非常复杂，因为世界本身就很复杂，而基础设施则专注于解决非常垂直领域的问题，因此相对简单。</p>
<p>此外，基础设施领域的特殊性会导致有很多抽象的建模，例如最简单到我们常常忽略的（Manager / Service）类别。
一些带有数据和状态的模型，比如 Executor，是常见的概念，而 Registry / Queue 也是常见的概念。</p>
<p>这是 Kubernetes的 <a href="https://kubernetes.io/docs/concepts/">Concepts</a>，十几个子类，上百个概念更显这个系统的复杂性。</p>
<h3 id="小结-2">小结</h3>
<p>模型不仅仅是数据，还涉及边界，边界决定了其归属和职责。</p>
<p>模型的设计需要动静结合来看，静态方面关注其持有的内容，动态方面则关注其提供的功能。</p>
<p>在基础设施领域，模型的产出可能包括 UML Model 图、ER 图、数据库 DML、类文件、OpenAPI Swagger（部分）等。</p>
<h2 id="极简架构设计---细节看时序">极简架构设计 - 细节看时序</h2>
<blockquote>
<p>程序设计 = 数据结构 + 算法 + 流程控制</p></blockquote>
<p>在将设计转换为模型之前，最后一个重要的步骤是控制细节。对于需求方和决策者来说，这一步可能并不重要，
但对于实施方（开发团队）来说，这个步骤直接影响交付结果的质量和时间。</p>
<p>我认为细节应该在时序图上进行呈现。</p>
<p>通常我们有两种常用的图形来展示细节：<mark>流程图和时序图</mark>。两者实际上有很多相似之处，
但我个人更喜欢时序图，因为它不仅包含顺序的概念，还清晰地展示了流程和系统之间的交互边界。</p>
<p>我的技巧是，一般每个用例都会对应一个时序图。</p>
<h3 id="案例-3">案例</h3>
<p>这里以 AWS 一个官方博客作为范例：</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202307/aws-seq.png" alt="Header-based API Gateway versioning with CloudFront"  />


</p>
<p><small>via <a href="https://aws.amazon.com/blogs/architecture/sequence-diagrams-enrich-your-understanding-of-distributed-architectures/">AWS Architecture Blog</a></small></p>
<p>在上图中，展示了 AWS 中使用 CloudFront 的一个时序图，从时序图中可以清晰地看到多个系统之间请求的流转以及多种异常状态的处理。</p>
<h3 id="小结-3">小结</h3>
<p>这里我总结一下时序图的小技巧：</p>
<ul>
<li>用户动作是发起</li>
<li>系统边界要清晰</li>
<li>有去有回是同步</li>
<li>有去无回是异步</li>
</ul>
<p>一般来说，时序图画好了，就可以放心地交给项目团队开始实施，不会有大的错误。如果没有时序图，依赖的就完全是彼此之间的合作经验和信任度了。</p>
<p>产出：时序图、API 文档（Open API Swagger）、前端 service 生成（如果有）。</p>
<h2 id="极简架构设计---小结">极简架构设计 - 小结</h2>
<p>在这个阶段，尽管我们还没有开始编写代码，但已经清楚了需要做什么，以及实现的样子。
我们也有了类结构、API 定义、前端服务生成等产出。多个团队可以同时开始协作，没有明显的瓶颈。</p>
<ul>
<li>✅ 问题定义</li>
<li>✅ 解决方法</li>
<li>✅ 类结构、API 定义</li>
<li>✅ 服务端代码生成</li>
<li>✅ 流程确定</li>
<li>✅ 汇报材料 1/3</li>
<li>✅ 技术分享材料 1/2</li>
</ul>
<p>如果未来需要汇报，汇报材料已经有了 1/3 的内容。如果需要撰写技术分享文档，也已经具备了 1/2 的内容。</p>
<p>如果这个项目是一个简单的 CRUD 应用系统，那么基本不会有什么难点。</p>
<p>如果是一个 DIA 系统（Data Intensive Application），则需要开始设计和实施数据存储部分，并考虑数据一致性和并发相关的问题。对于一个复杂的系统，
还需要继续实施多个系统连接处是否存在不确定性。如果在工程上面临同步方面的挑战，例如应用框架改造、通讯系统改造等，
也要提前进行风险排除。（我认为同时进行技术升级和业务开发并不明智）。</p>
<h2 id="番外---画图工具">番外 - 画图工具</h2>
<p>我有一套自己的画图工具套件，涵盖了系统架构图、流程图等绘制。
PS：我甚至还给自己的产品设计 Logo，或许这与我内心渴望成为一名设计师有关吧~</p>
<p>作为一名工程师，必须积累自己的画图 UI Kit，熟练掌握其技巧，构建一套属于自己的工具包，
从而能够将脑海中的构思快速还原到文档中。</p>
<p>我的画图工具组合相当丰富。用于绘制架构图的工具包括：</p>
<ul>
<li>框图
<ul>
<li>OmniGraffle（收费，复杂、美观）</li>
<li>Excalidraw（简单、随性）</li>
</ul>
</li>
<li>部署图
<ul>
<li>Excalidraw</li>
</ul>
</li>
<li>脑图 MindMap
<ul>
<li>SimpleMind（收费）</li>
<li>XMind（收费）</li>
</ul>
</li>
</ul>
<p>用来做工程设计（UML）的工具如下：</p>
<ul>
<li>use case 用例
<ul>
<li>语雀画图</li>
<li>plantuml（语雀支持渲染）</li>
</ul>
</li>
<li>sequence 时序图
<ul>
<li>plantuml</li>
</ul>
</li>
<li>state 状态图
<ul>
<li>语雀</li>
</ul>
</li>
<li>ER 图
<ul>
<li>Excalidraw</li>
</ul>
</li>
<li>Gantt 甘特图
<ul>
<li>plantuml</li>
</ul>
</li>
</ul>
<p>这里我再软广一下我维护的 <a href="https://excalidraw.alswl.com/">Excalidraw（Fork）</a>，支持中文手写字体，保持风格的统一。</p>
<h2 id="番外---the-hard-way">番外 - the Hard Way</h2>
<p>回到本次分享的出发点，给大家一份简单可行的架构设计方案。
但是对于你这样好学的人来说，肯定不会满足于如此简单的流程，
毕竟还有那 20% 的复杂场景无法完全涵盖。
我给你一个关键词列表和一些建议的书单，帮助你进一步加深学习：</p>
<ul>
<li>原则</li>
<li>理念</li>
<li>思想</li>
<li>规律</li>
<li>方法论</li>
<li>案例</li>
</ul>
<p>以下是一些书单，可以帮助你深入学习：</p>
<ul>
<li>业务架构
<ul>
<li><a href="https://book.douban.com/subject/1792387/">UML 和模式应用 - Craig Larman</a></li>
<li><a href="https://book.douban.com/subject/5344973/">领域驱动设计 - Eric Evans</a></li>
</ul>
</li>
<li>技术架构
<ul>
<li><a href="https://book.douban.com/subject/30468597/">重构 - Martin Fowler</a></li>
<li><a href="https://book.douban.com/subject/4199741/">代码整洁之道 - Robert C. Martin</a></li>
</ul>
</li>
</ul>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[实用 Web API 规范]]></title>
    <link href="https://blog.alswl.com/2023/04/web-api-guidelines/"/>
    <id>https://blog.alswl.com/2023/04/web-api-guidelines/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2023-04-03T11:34:18+08:00</published>
    <updated>2023-04-03T11:34:18+08:00</updated>
    
    <content type="html"><![CDATA[<p>当开始创建一个新系统，或参与一个新团队或项目时，都会面临一个简单却深刻的问题：这个系统（Web Server）的 API 是否有设计规范？</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202304/pyramid.png" alt="pyramid"  />


</p>
<p><small>image by stable difussion, prompt by alswl</small></p>
<p>这个问题困扰了我很长时间，始于我求学时期，每一次都需要与团队成员进行交流和讨论。
从最初的自由风格到后来的 REST，我经常向项目组引用 <a href="https://docs.github.com/en/rest?apiVersion=2022-11-28">Github v3</a> 和
Foursqure API（已经无法访问，暴露年龄） 文档。
然而，在实践过程中，仍然会有一些与实际工作或公司通用规范不匹配的情况，
这时候我需要做一些补充工作。最终，我会撰写一个简要的 <code>DEVELOPMENT.md</code> 文档，以描述设计方案。</p>
<p>但我对该文档一直有更多的想法，它还不够完善。因此，我想整理出一份<mark>简单（Simple）而实用（Pragmatic）</mark>的 Web API 最佳实践，也就是本文。</p>
<h2 id="为什么我们需要-api-统一规范">为什么我们需要 API 统一规范</h2>
<p>这个问题似乎很明显，但是深入剖析涉及团队协作效率和工程设计哲学。</p>
<p>API（Application Programming Interface，应用程序编程接口）是不同软件系统之间交互的桥梁。在不同软件系统之间进行通信时，
API 可以通过标准化的方式进行数据传输和处理，从而实现各种应用程序的集成。</p>
<p>当我们开始撰写 API 文档时，就会出现一个范式（Design Pattern），这是显式还是隐式的，
是每个人一套还是公用同一套。这就像我们使用统一的 USB 接口一样，统一降低了成本，避免了可能存在的错误。具体来说，这有以下几个原因：</p>
<ul>
<li>容易理解，提高效率：服务提供方和消费方使用统一形式、结构和使用方式，以及统一的生产消费协议，从而减少沟通成本。</li>
<li>专家经验：它包含最佳的工程实践，常见场景都有对应的解决方案，避免了每个人都要重新思考整个 API 系统。
例如，如何处理 API 缓存？如何进行鉴权？如何进行数据格式处理？</li>
<li>面向未来的扩展，需要稳定的协议：协议是抽象的、独立于实现的，不是每个人都具备
设计面向不确定系统的能力，一些广泛使用的技术则为更广泛的场景做了规划。</li>
</ul>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202304/why.png" alt="why"  />


</p>
<p><small>image by alswl</small></p>
<p>虽然使用统一规范确实有一些成本，需要框架性的了解和推广，但我相信在大部分场景下，
统一规范所带来的收益远远高于这些成本。</p>
<p>然而，并非所有的情况下都需要考虑 API 规范。对于一些短生命周期的项目、影响面非常小的内部项目和产品，
可能并不需要过多关注规范。 此外，在一些特殊的业务场景下，
协议底层可能会发生变化，这时候既有的规范可能不再适用。但即使如此，我仍然建议重新起草新的规范，而不是放弃规范不顾。</p>
<h2 id="规范的原则">规范的原则</h2>
<p>在制定 API 规范时，我们应该遵循一些基本原则，以应对技术上的分歧，我总结了三个获得广泛认可的原则：</p>
<ul>
<li>简洁：简洁是抵抗复杂性的最直接和最有效的策略，利用简洁原则降低复杂度，避免复杂性的滋生和扩散；</li>
<li>一致性：统一的设计模式和延续的设计风格有助于降低工程成本和工程师的心理负担；</li>
<li>遵循现实：遵循现有工程领域的抽象和分层（例如 HTTP，REST，RBAC，OIDC 等），不要自己发明新的概念，
要始终思考这个问题是否只有自己遇到了（答案肯定是否定的）。</li>
</ul>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202304/principle.png" alt="principle"  />


</p>
<p><small>image by alswl</small></p>
<h2 id="rest-到底行不行">REST 到底行不行？</h2>
<p>在 Web API 领域，<a href="https://en.wikipedia.org/wiki/Representational_state_transfer">RESTful API</a> 已经成为广受欢迎的协议。
其广泛适用性和受众范围之广源于其与 HTTP 协议的绑定，这使得 RESTful API 能够轻松地与现有的 Web 技术进行交互。如果您对 REST 不熟悉，
可以查看 <a href="https://www.ruanyifeng.com/blog/2014/05/restful_api.html">阮一峰的 RESTful API 设计指南</a> 以及
<a href="https://www.oschina.net/translate/best-practices-for-a-pragmatic-restful-api?print">RESTful API 设计最佳实践</a>。</p>
<p>REST 是一种成熟度较高的协议，<a href="https://martinfowler.com/articles/richardsonMaturityModel.html#level0">Leonard Richardson</a>
将其描述为四种成熟度级别：</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202304/rest-four-level.png" alt="rest-four-level"  />


</p>
<p><small>image by alswl</small></p>
<ol>
<li>The Swamp of POX，使用 HTTP 承载 Legacy 协议（XML）</li>
<li>Resources：使用资源抽象</li>
<li>HTTP Verbs：使用丰富的 HTTP Verbs</li>
<li>Hypermedia Controls：使用 <code>rel</code> 链接进行 API 资源整合，<a href="https://jsonapi.org/">JSON:API</a> 是登峰造极的表现</li>
</ol>
<p>REST 的核心优势在于：</p>
<ul>
<li>它充分利用了 HTTP 协议的设计（HTTP Protocol）</li>
<li>它具有出色的资源定位能力（Identification of resources）</li>
<li>它设计了完备的资源操作方式（Manipulation of resources）</li>
<li>它具备自解释性（Self-descriptive messages）</li>
<li>它支持多种形态的呈现方式（hypermedia as the engine of application state）</li>
</ul>
<p>然而，<mark>REST 并非一种具体的协议或规范，而是一种风格理念</mark>。尽管 REST 定义了一些规则和原则，如资源的标识、统一接口、无状态通信等，
但它并没有规定一种具体的实现方式。因此，在实际开发中，不同的团队可能会有不同的理解和实践，
从而导致 API 的不一致性和可维护性降低。</p>
<p>此外，REST 也有一些局限性和缺陷：</p>
<ul>
<li>并非所有请求都可以用资源描述，比如登录（<code>/login</code>）操作，转换成 <code>session</code> 就非常绕口；
同样的问题在转账这种业务也会出现。HTTP 有限的动词无法支撑所有业务场景。</li>
<li>REST 并未提供针对必然面临的问题，如分页、返回体具体结构、错误处理和鉴权等，明确的解决方案。</li>
<li>对于复杂的查询（如搜索 Search），RESTful API 的查询参数可能会变得非常复杂，难以维护。</li>
</ul>
<p>因此，虽然 REST 风格是一个不错的指导思想，但在具体实现时需要结合具体业务需求和技术特点，有所取舍，才能实现良好的 API 设计。
最后，我们是否需要 Web API 设计规范，遵循 REST 风格呢？我认为 REST 能够解决 90% 的问题，但还有 10% 需要明确规定细节。</p>
<h2 id="web-api-规范的选择题">Web API 规范的选择题</h2>
<p>因为我们的协议基于 HTTP 和 REST 设计，我们将以 HTTP 请求的四个核心部分为基础展
开讨论，这些部分分别是：URL、Header、Request 和 Response。</p>
<h3 id="url-最佳实践">URL 最佳实践</h3>
<p>我的 URL 设计启蒙来自于 <a href="https://guides.rubyonrails.org/routing.html">Ruby on Rails</a>。
在此之前，我总是本能地将模型信息放到 URL 之上，但实际上良好的 URL 设计应该是针对系统信息结构的规划。
因此，URL 设计不仅仅要考虑 API，还要考虑面向用户的 Web URL。</p>
<p>为了达到良好的 URL 设计，我总结了以下几个规则：</p>
<ul>
<li>定位资源（这就回答分页是否应该在 Header）</li>
<li>自解释（可读性强，URL 自身即包含核心信息）</li>
<li>安全（不能包含用户认证信息，OAuth 为了解这个花了很多精力，防伪造）</li>
</ul>
<p>通常情况下，URL 的模型如下所示：</p>
<p><code>/$(prefix)/$(module)/$(model)/$(sub-model)/$(verb)?$(query)#${fragment}</code></p>
<p>其中，Prefix 可能是 API 的版本，也可能是特殊限定，如有些公司会靠此进行接入层分流；
Module 是业务模块，也可以省略；Model 是模型；SubModel 是子模型，可以省略；
Verb 是动词，也可以省略；Query 是请求参数；Fragment 是 HTTP 原语 Fragment。</p>
<p>需要注意的是，并非所有的组成部分都是必须出现的。例如，SubModel 和 Verb 等字段可
以在不同的 URL 风格中被允许隐藏。</p>
<p><strong>设计风格选择</strong></p>
<p>注：<strong>请注意，方案 A / B / C 之间没有关联，每行上下也没有关联</strong></p>
<table>
  <thead>
      <tr>
          <th>问题</th>
          <th>解释（见下方单列分析）</th>
          <th>方案 A</th>
          <th>方案 B</th>
          <th>方案 C</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>API Path 里面 Prefix</td>
          <td></td>
          <td><code>/apis</code></td>
          <td><code>/api</code></td>
          <td>二级域名</td>
      </tr>
      <tr>
          <td>Path 里面是否包含 API 版本</td>
          <td><strong>版本在 URL 的优势</strong></td>
          <td>✅</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td>Path 是否包含 Group</td>
          <td></td>
          <td>✅</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td>Path 是否包含动作</td>
          <td><strong>HTTP Verb 不够用的情况</strong></td>
          <td>✅</td>
          <td>🚫 （纯 REST）</td>
          <td>看情况（如果 HTTP Verb CRUD 无法满足就包含）</td>
      </tr>
      <tr>
          <td>模型 ID 形式</td>
          <td><strong>Readable Stable Identity 解释</strong></td>
          <td>自增 ID</td>
          <td>GUID</td>
          <td><mark>Readable Stable ID</mark></td>
      </tr>
      <tr>
          <td>URL 中模型单数还是复数</td>
          <td></td>
          <td>单数</td>
          <td>复数</td>
          <td>列表复数，单向单数</td>
      </tr>
      <tr>
          <td>资源是一级（平铺）还是多级（嵌套）</td>
          <td><strong>一级和多级的解释</strong></td>
          <td>一级（平铺）</td>
          <td>多级（嵌套）</td>
          <td></td>
      </tr>
      <tr>
          <td>搜索如何实现，独立接口（<code>/models/search</code>）还是基于列表<code>/models/</code> 接口</td>
          <td></td>
          <td>独立</td>
          <td>合并</td>
          <td></td>
      </tr>
      <tr>
          <td>是否有 Alias URL</td>
          <td><strong>Alias URL 解释</strong></td>
          <td>✅</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td>URL 中模型是否允许缩写（或精简）</td>
          <td><strong>模型缩写解释</strong></td>
          <td>✅</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td>URL 中模型多个词语拼接的连字符</td>
          <td></td>
          <td><code>-</code></td>
          <td><code>_</code></td>
          <td>Camel</td>
      </tr>
      <tr>
          <td>是否要区分 Web API 以及 Open API（面向非浏览器）</td>
          <td></td>
          <td>✅</td>
          <td>🚫</td>
          <td></td>
      </tr>
  </tbody>
</table>
<p><strong>版本在 URL 的优势</strong></p>
<p>我们在设计 URL 时遵循一致性的原则，无论是哪种身份或状态，都会使用相同的 URL 来访问同一个资源。
这也是 Uniform Resource Location 的基本原则。虽然我们可以接受不同的内容格式（例如 JSON / YAML / HTML / PDF / etc），
但是我们希望资源的位置是唯一的。</p>
<p>然而，问题是，对于同一资源在不同版本之间的呈现，是否应该在 URL 中体现呢？这取决于设计者是否认为版本化属于位置信息的范畴。</p>
<p>根据 RFC 的设计，除了 URL 还有 <a href="https://en.wikipedia.org/wiki/Uniform_Resource_Name">URN（Uniform Resource Name）</a>，
后者是用来标识资源的，而 URL 则指向资源地址。实际上，URN 没有得到广泛的使用，以至于 URI 几乎等同于 URL。</p>
<p><strong>HTTP Verb 不够用的情况</strong></p>
<p>在 REST 设计中，我们需要使用 HTTP 的 GET / POST / PUT / DELETE / PATCH / HEAD 等动词对资源进行操作。
比如使用 API <code>GET /apis/books</code> 查看书籍列别，这个自然且合理。
但是，当需要执行类似「借一本书」这样的动作时，
我们没有合适的动词（BORROW）来表示。针对这种情况，有两种可行的选择：</p>
<ol>
<li>使用 POST 方法与自定义动词，例如 <code>POST /apis/books/borrow</code>，表示借书这一动作；</li>
<li>创建一个借书记录，使用资源新增方式来结构不存在的动作，例如 <code>POST /apis/books/borrow-log/</code>；</li>
</ol>
<p>这个问题在复杂的场景中会经常出现，例如用户登录（<code>POST /api/auth/login</code> vs <code>POST /api/session</code>）和帐户转账（vs 转账记录创建）等等。
<mark>API 抽象还是具体，始终离不开业务的解释。</mark>我们不能简单地将所有业务都笼统概括到 CRUD 上面，
而是需要合理划分业务，以便更清晰地实现和让用户理解。</p>
<p>在进行设计时，我们可以考虑是否需要为每个 API 创建一个对应的按钮来方便用户的操作。
如果系统中只有一个名为 <code>/api/do</code> 的 API 并将所有业务都绑定在其中，虽然技术上可行，
但这种设计不符合业务需求，每一层的抽象都是为了标准化解决特定问题的解法，TCP L7 设计就是这种理念的体现。</p>
<p><strong>Readable Stable Identity 解释</strong></p>
<p>在标记一个资源时，我们通常有几种选择：</p>
<ul>
<li>使用 ID：ID 通常与数据库自增 ID 绑定。</li>
<li>使用 GUID：例如 UUID，尽管不那么精确。</li>
<li>使用可读性和稳定性标识符（Readable Stable Identity）：通常使用名称、UID 或特定 ID（如主机名、IP 地址或序列号）来标识，
要求该标识符具有稳定性且全局唯一，在内部系统中非常有用。</li>
</ul>
<p>我个人有一个设计小技巧：使用 <code>${type}/${type-id}</code> 形式的 slug 来描述标识符。Slug 是一种人类可读的唯一标识符，
例如 <code>hostname/abc.sqa</code> 或 <code>ip/172.133.2.1</code>。
这种设计方式可以在可读性和唯一性之间实现很好的平衡。</p>
<blockquote>
<p>A slug is a human-readable, unique identifier, used to identify a resource instead of a less human-readable identifier like an id .</p></blockquote>
<p>from <a href="https://itnext.io/whats-a-slug-f7e74b6c23e0">What’s a slug. and why would I use one? | by Dave Sag</a></p>
<p>PS：文章最末我还会介绍一套 Apple Music 方案，这个方案兼顾了 ID / Readable / Stable 的特性。</p>
<p><strong>一级和多级的解释</strong></p>
<p>URL 的层级设计可以根据建模来进行，也可以采用直接单层结构的设计。具体问题的解决方式，
例如在设计用户拥有的书籍时，可以选择多级结构的 <code>/api/users/foo/books</code> 或一级结构的 <code>/api/books?owner=foo</code>。</p>
<p>技术上这两种方案都可以，<mark>前者尊重模型的归属关系，后者则是注重 URL 结构的简单</mark>。</p>
<p>多级结构更直观，但也需要解决可能存在的多种组织方式的问题，例如图书馆中书籍按照作者或类别进行组织？
这种情况下，可以考虑在多级结构中明确模型的归属关系，
例如 <code>/api/author/foo/books</code>（基于作者）或 <code>/api/category/computer/books</code>（基于类别）。</p>
<p><strong>Alias URL 解释</strong></p>
<p>对于一些频繁使用的 URL，虽然可以按照 URL 规则进行设计，但我们仍然可以设计出一个更为简洁的 URL，
以方便用户的展示和使用。这种设计在 Web URL 中尤其常见。比如一个图书馆最热门书籍的 API：</p>
<pre tabindex="0"><code># 原始 URL
https://test.com/apis/v3/books?sort=hot&amp;limit=10

# Alias URL
https://test.com/apis/v3/books/hot
</code></pre><p><strong>模型缩写解释</strong></p>
<p>通常，在对资源进行建模时，会使用较长的名称来命名，例如书籍索引可能被命名为 <code>BookIndex</code> ，而不是 <code>Index</code>。
在 URL 中呈现时，由于 <code>/book/book-index</code> 的 URL 前缀包含了 Book，我们可以减少一层描述，
使 URL 更为简洁，例如使用 <code>/book/index</code>。这种技巧在 Web URL 设计中非常常见。</p>
<p>此外，还有一种模型缩写的策略，即提供一套完整的别名注册方案。别名是全局唯一的，
例如在 Kubernetes 中， <a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#deployment-v1-apps">Deployment</a>
是一种常见的命名，而 <code>apps/v1/Deployment</code> 是通过添加 Group 限定来表示完整的名称，
同时还有一个简写为 <code>deploy</code>。这个机制依赖于 Kubernetes 的 API Schema 系统进行注册和工作。</p>
<h3 id="header-最佳实践">Header 最佳实践</h3>
<p>我们常常会忽略 Header 的重要性。实际上，HTTP 动词的选择、HTTP 状态码以及各种身
份验证逻辑（例如 Cookie / Basic Auth / Berear Token）都依赖于 Header 的设计。</p>
<p><strong>设计风格选择</strong></p>
<table>
  <thead>
      <tr>
          <th>问题</th>
          <th>解释（见下方单列分析）</th>
          <th>方案 A</th>
          <th>方案 B</th>
          <th>方案 C</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>是否所有 Verb 都使用 POST</td>
          <td><strong>关于全盘 POST</strong></td>
          <td>✅</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td>修改（Modify）动作是 POST 还是 PATCH？</td>
          <td></td>
          <td>POST</td>
          <td>PATCH</td>
          <td></td>
      </tr>
      <tr>
          <td>HTTP Status 返回值</td>
          <td><strong>2XX 家族</strong></td>
          <td>充分利用 HTTP Status</td>
          <td>只用核心状态（200 404 302 等）</td>
          <td>只用 200</td>
      </tr>
      <tr>
          <td>是否使用考虑限流系统</td>
          <td></td>
          <td>✅ 429</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td>是否使用缓存系统</td>
          <td></td>
          <td>✅ ETag / Last Modify</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td>是否校验 UserAgent</td>
          <td></td>
          <td>✅</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td>是否校验 Referrral</td>
          <td></td>
          <td>✅</td>
          <td>🚫</td>
          <td></td>
      </tr>
  </tbody>
</table>
<p><strong>关于全盘 POST</strong></p>
<p>有些新手（或者自认为有经验的人）可能得出一个错误的结论，即除了 GET 请求以外，
所有的 HTTP 请求都应该使用 POST 方法。甚至有些人要求 <a href="https://www.zhihu.com/question/336797348">所有行为（即使是只读的请求）也应该使用 POST 方法</a>。
这种观点通常会以“简单一致”、“避免缓存”或者“运营商的要求”为由来支持。</p>
<p>然而，我们必须明白 HTTP 方法的设计初衷：它是用来描述资源操作类型的，从而派生出了包括缓存、安全、幂等性等一系列问题。
在相对简单的场景下，省略掉这一层抽象的确不会带来太大的问题，但一旦进入到复杂的领域中，
使用 HTTP 方法这一层抽象就显得非常重要了。<mark>这是否遵循标准将决定你是否能够获得标准化带来的好处</mark>，
类比一下就像一个新的手机厂商可以选择不使用 USB TypeC 接口。
技术上来说是可行的，但同时也失去了很多标准化支持和大家心智上的约定俗成。</p>
<p>我特别喜欢一位 <a href="https://www.zhihu.com/people/huixiong-19">知乎网友</a> 的
<a href="https://www.zhihu.com/question/336797348/answer/2198634068">评论</a>：「<mark>路由没有消失，只是转移了</mark>」。</p>
<p><strong>2XX 家族</strong></p>
<p>HTTP 状态码的用途在于表明客户端与服务器间通信的结果。2XX 状态码系列代表服务器已经成功接收、
理解并处理了客户端请求，回应的内容是成功的。以下是 2XX 系列中常见的状态码及其含义：</p>
<ul>
<li>200 OK：请求已成功处理，服务器返回了响应。</li>
<li>201 Created：请求已经被成功处理，并且在服务器上创建了一个新的资源。</li>
<li>202 Accepted：请求已被服务器接受，但尚未执行。该状态码通常用于异步处理。</li>
<li>204 No Content：请求已成功处理，但是服务器没有返回任何响应体内容。</li>
</ul>
<p>2XX 系列的状态码表示请求已被成功处理，这些状态码可以让客户端明确知晓请求已被正确处理，从而进行下一步操作。</p>
<p>是否需要全面使用 2XX 系列的状态码，取决于是否需要向客户端明确/显示的信息，
告知它下一步动作。如果已经通过其他方式（包括文档、口头协议）描述清楚，
那么确实可以通盘使用 200 状态码进行返回。但基于行为传递含义，
或是基于文档（甚至口头协议）传递含义，哪种更优秀呢？是更为复杂还是更为简洁？</p>
<h3 id="request-最佳实践">Request 最佳实践</h3>
<p><strong>设计风格选择</strong></p>
<table>
  <thead>
      <tr>
          <th>问题</th>
          <th>解释（见下方单列分析）</th>
          <th>方案 A</th>
          <th>方案 B</th>
          <th>方案 C</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>复杂的参数是放到 Form Fields 还是单独一个 JSON Body</td>
          <td></td>
          <td>Form Fields</td>
          <td>Body</td>
          <td></td>
      </tr>
      <tr>
          <td>子资源是一次性查询还是独立查询</td>
          <td></td>
          <td>嵌套</td>
          <td>独立查询</td>
          <td></td>
      </tr>
      <tr>
          <td>分页参数存放</td>
          <td></td>
          <td>Header</td>
          <td>URL Query</td>
          <td></td>
      </tr>
      <tr>
          <td>分页方式</td>
          <td><strong>分页方式解释</strong></td>
          <td>Page based</td>
          <td>Offset based</td>
          <td>Continuation token</td>
      </tr>
      <tr>
          <td>分页控制者</td>
          <td><strong>分页控制者解释</strong></td>
          <td>客户端</td>
          <td>服务端</td>
          <td></td>
      </tr>
  </tbody>
</table>
<p><strong>分页方式解释</strong></p>
<p>我们最为常见的两种分页方式是 Page-based 和 Offset-based，可以通过公式进行映射。
此外，还存在一种称为 Continuation Token 的方式，其技术类似于 Oracle 的
<a href="https://stackoverflow.com/questions/241622/paging-with-oracle">rownum 分页方案</a>，使用参数 <code>start-from=?</code> 进行描述。
虽然 Continuation Token 的优缺点都十分突出，使用此种方式可以将顺序性用于替代随机性。</p>
<p><strong>分页控制者解释</strong></p>
<p>在某些情况下，我们需要区分客户端分页（Client Pagination）和服务器分页（Server Pagniation）。
客户端分页是指下一页的参数由客户端计算而来，而服务器分页则是由服务器返回 <code>rel</code> 或 JSON.API 等协议。
使用服务器分页可以避免一些问题，例如批量屏蔽了一些内容，如果使用客户端分页，可能会导致缺页或者白屏。</p>
<h3 id="response-最佳实践">Response 最佳实践</h3>
<p><strong>设计风格选择</strong></p>
<table>
  <thead>
      <tr>
          <th>问题</th>
          <th>解释（见下方单列分析）</th>
          <th>方案 A</th>
          <th>方案 B</th>
          <th>方案 C</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>模型呈现种类</td>
          <td><strong>模型的几种形式</strong></td>
          <td>单一模型</td>
          <td>多种模型</td>
          <td></td>
      </tr>
      <tr>
          <td>大模型如何包含子模型模型</td>
          <td><strong>模型的连接、侧载和嵌入</strong></td>
          <td>嵌入</td>
          <td>核心模型 + 多次关联资源查询</td>
          <td>链接</td>
      </tr>
      <tr>
          <td>字段返回是按需还是归并还是统一</td>
          <td></td>
          <td>统一</td>
          <td>使用 <code>fields</code> 字段按需</td>
          <td></td>
      </tr>
      <tr>
          <td>字段表现格式</td>
          <td></td>
          <td>Snake</td>
          <td>Camel</td>
          <td></td>
      </tr>
      <tr>
          <td>错误码</td>
          <td></td>
          <td>无自定，使用 Message</td>
          <td>自定义</td>
          <td></td>
      </tr>
      <tr>
          <td>错误格式</td>
          <td></td>
          <td>全局统一</td>
          <td>按需</td>
          <td></td>
      </tr>
      <tr>
          <td>时区</td>
          <td></td>
          <td>UTC</td>
          <td>Local</td>
          <td>Local + TZ</td>
      </tr>
      <tr>
          <td>HATEOAS</td>
          <td></td>
          <td>✅</td>
          <td>🚫</td>
          <td></td>
      </tr>
  </tbody>
</table>
<p><strong>模型的几种形式</strong></p>
<p>在 API 设计中，对于模型的表现形式有多种定义。虽然这并不是 API 规范必须讨论的话题，但它对于 API 设计来说是非常重要的。</p>
<p>我将模型常说的模型呈现方式分为一下几类，这并非是专业的界定，借用了 Java 语境下面的一些定义。
这些名称在不同公司甚至不同团队会有不一样的叫法：</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202304/models.png" alt="models"  />


</p>
<p><small>image by alswl</small></p>
<ul>
<li>Business Object（BO）：原始的业务模型</li>
<li>Data Object（DO）：存储到 RDBMS 的模型，所以必须是打平的字段结构，有时候一个 BO 会对应到多个 DO</li>
<li>View Object（VO）：呈现到表现层的模型，只保留用户需要看到信息，比如会去掉敏感信息</li>
<li>Data Transfer Object（DTO）：用来在 RPC 系统进行传输的模型，一般和 原始的 Model 差异不大，根据不同序列化系统会有差异
（比如枚举的处理）</li>
</ul>
<p>除此之外，还经常使用两类：Rich Model 和 Tiny Model（请忽略命名，不同团队叫法差异比较大）：</p>
<ul>
<li>Rich Model：用来描述一个丰富模型，这个模型包含了几乎所有需要用的的数据，也允许子资源进行嵌套</li>
<li>Tiny Model：是一个精简模型，往往用来在列表 API 里面被使用</li>
</ul>
<p><strong>模型的连接、侧载和嵌入</strong></p>
<p>在 API 设计中，我们经常需要处理一个模型中包含多个子模型的情况，例如 Book 包含 Comments。
对于这种情况，通常有三种表现形式可供选择：链接（Link）、侧载（Side）和嵌入（Embed）。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202304/models-with-children.png" alt="models-with-children"  />


</p>
<p><small>image by alswl</small></p>
<p>链接（有时候这个 URL 也会隐藏，基于客户端和服务端的隐式协议进行请求）：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;data&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="mi">42</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;朝花夕拾&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;relationships&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;comments&#34;</span><span class="p">:</span> <span class="s2">&#34;http://www.domain.com/book/42/comments&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;author&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;http://www.domain.com/author/鲁迅&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>侧载：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;data&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="mi">42</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;朝花夕拾&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;relationships&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;comments&#34;</span><span class="p">:</span> <span class="s2">&#34;http://www.domain.com/book/42/comments&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;authors&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;http://www.domain.com/author/鲁迅&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;includes&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;comments&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="mi">91</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;author&#34;</span><span class="p">:</span> <span class="s2">&#34;匿名&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;非常棒&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;authors&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;鲁迅&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;description&#34;</span><span class="p">:</span> <span class="s2">&#34;鲁迅原名周树人&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>嵌入：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;data&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="mi">42</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;朝花夕拾&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;comments&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="mi">91</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;author&#34;</span><span class="p">:</span> <span class="s2">&#34;匿名&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;非常棒&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;authors&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;鲁迅&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;description&#34;</span><span class="p">:</span> <span class="s2">&#34;鲁迅原名周树人&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="其他">其他</h3>
<p>还有一些问题没有收敛在四要素里面，但是我们在工程实践中也经常遇到，我将其捋出来：</p>
<p><strong>我不是 HTTP 协议，怎么办？</strong></p>
<p>Web API 中较少遇到非 HTTP 协议，新建一套协议的成本太高了。在某些特定领域会引入一些协议，
比如 IoT 领域的 <a href="https://mqtt.org/">MQTT</a>。</p>
<p>此外，RPC 是一个涉及广泛领域的概念，其内容远远不止于协议层面。
通常我们会将 HTTP 和 RPC 的传输协议以及序列化协议进行对比。
我认为，本文中的许多讨论也对 RPC 领域具有重要意义。</p>
<p>有些团队或个人计划使用自己创建的协议，但我的观点是应尽量避免自建协议，因为真正需要创建协议的情况非常罕见。
如果确实存在强烈的需要，那么我会问两个问题：是否通读过 HTTP RFC 文档和 HTTP/2 RFC 文档？</p>
<p><strong>我不是远程服务（RPC / HTTP 等），而是 SDK 怎么办？</strong></p>
<p>本文主要讨论的是 Web API（HTTP）的设计规范，并且其中一些规则可以借鉴到 RPC 系统中。
然而，讨论的基础都是建立在远程服务（Remote Service）的基础之上的。
如果你是 SDK 开发人员，你会有两个角色，可能会作为客户端和远程服务器进行通信，
同时还会作为 SDK 提供面向开发人员的接口。对于后者，以下几个规范可以作为参考：</p>
<p>后者可以参考一下这么几个规范：</p>
<ul>
<li>Azure SDK 设计规范 <a href="https://azure.github.io/azure-sdk/general_design.html">General Guidelines: API Design | Azure SDKs</a></li>
<li>Posix API 范例（比如 File <a href="https://www.gnu.org/software/libc/manual/html_node/Low_002dLevel-I_002fO.html">Low-Level I/O (The GNU C Library)</a>)</li>
</ul>
<p><strong>认证鉴权方案</strong></p>
<p>一般而言，Web API 设计中会明确描述所采用的认证和鉴权系统。
需要注意区分「认证」和「鉴权」两个概念。关于「认证」这一话题，可以在单独的章节中进行讨论，因此本文不会展开这一方面的内容。</p>
<p>在 Web API 设计中，常见的认证方式包括：HTTP Basic Auth、OAuth2 和账号密码登录等。
常用的状态管理方式则有 Bearer Token 和 Cookie。此外，在防篡改等方面，还会采用基于 HMac 算法的防重放和篡改方案。</p>
<p><strong>忽略掉的话题</strong></p>
<p>在本次讨论中，我未涉及以下话题：异步协议（Web Socket / Long Pulling / 轮训）、CORS、以及安全问题。
虽然这些话题重要，但是在本文中不予展开。</p>
<p><strong>什么时候打破规则</strong></p>
<p>有些开发者认为规则就是为了打破而存在的。现实往往非常复杂，我们难以讨论清楚各个细节。
如果开发者觉得规则不符合实际需求，有两种处理方式：修改规则或打破规则。
然而，我更倾向于讨论和更新规则，明确规范不足之处，确定是否存在特殊情况。
如果确实需要创建特例，一定要在文档中详细描述，告知接任者和消费者这是一个特例，说明特例产生的原因以及特例是如何应对的。</p>
<h2 id="一张风格-checklist">一张风格 Checklist</h2>
<h3 id="github-风格">Github 风格</h3>
<p>Github 的 API 是我常常参考的对象。它对其业务领域建模非常清晰，提供了详尽的文档，使得沟通成本大大降低。
我主要参考以下两个链接：
API 定义 <a href="https://docs.github.com/en/rest?apiVersion=2022-11-28">GitHub REST API documentation</a> 和
面向应用程序提供的 API 列表 <a href="https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps?apiVersion=2022-11-28">Endpoints available for GitHub Apps</a>
，该列表几乎包含了 Github 的全部 API。</p>
<table>
  <thead>
      <tr>
          <th>问题</th>
          <th>选择</th>
          <th>备注</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>URL</strong></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>API Path 里面 Prefix</td>
          <td>二级域名</td>
          <td><a href="https://api.github.com">https://api.github.com</a></td>
      </tr>
      <tr>
          <td>Path 里面是否包含 API 版本</td>
          <td>🚫</td>
          <td>Header <code>X-GitHub-Api-Version</code> <a href="https://docs.github.com/en/rest/overview/api-versions?apiVersion=2022-11-28">API Versions</a></td>
      </tr>
      <tr>
          <td>Path 是否包含 Group</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td>Path 是否包含动作</td>
          <td>看情况（如果 HTTP Verb CRUD 无法满足就包含）</td>
          <td>比如 <code>PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge</code> <code>POST /repos/{owner}/{repo}/releases/generate-notes</code></td>
      </tr>
      <tr>
          <td>模型 ID 形式</td>
          <td>Readable Stable Identity</td>
          <td></td>
      </tr>
      <tr>
          <td>URL 中模型单数还是复数</td>
          <td>复数</td>
          <td></td>
      </tr>
      <tr>
          <td>资源是一级（平铺）还是多级（嵌套）</td>
          <td>多级</td>
          <td></td>
      </tr>
      <tr>
          <td>搜索如何实现，独立接口（<code>/models/search</code>）还是基于列表<code>/models/</code> 接口</td>
          <td>独立</td>
          <td></td>
      </tr>
      <tr>
          <td>是否有 Alias URL</td>
          <td>?</td>
          <td></td>
      </tr>
      <tr>
          <td>URL 中模型是否允许缩写（或精简）</td>
          <td>🚫</td>
          <td>没有看到明显信息，基于多级模型也不需要，但是存在 <code>GET /orgs/{org}/actions/required_workflows</code></td>
      </tr>
      <tr>
          <td>URL 中模型多个词语拼接的连字符</td>
          <td><code>-</code> 和 <code>_</code></td>
          <td><code>GET /repos/{owner}/{repo}/git/matching-refs/{ref}</code> vs <code>GET /orgs/{org}/actions/required_workflows</code></td>
      </tr>
      <tr>
          <td>是否要区分 Web API 以及 Open API（面向非浏览器）</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td><strong>Header</strong></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>是否所有 Verb 都使用 POST</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td>修改（Modify）动作是 POST 还是 PATCH？</td>
          <td>PATCH</td>
          <td></td>
      </tr>
      <tr>
          <td>HTTP Status 返回值</td>
          <td>充分利用 HTTP Status</td>
          <td>常用，包括限流洗损</td>
      </tr>
      <tr>
          <td>是否使用考虑限流系统</td>
          <td>✅ 429</td>
          <td></td>
      </tr>
      <tr>
          <td>是否使用缓存系统</td>
          <td>✅ ETag / Last Modify</td>
          <td><a href="https://docs.github.com/en/rest/overview/resources-in-the-rest-api?apiVersion=2022-11-28#client-errors">Resources in the REST API#client-errors</a></td>
      </tr>
      <tr>
          <td>是否校验 UserAgent</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>是否校验 Referrral</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td><strong>Request</strong></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>复杂的参数是放到 Form Fields 还是单独一个 JSON Body</td>
          <td>Body</td>
          <td>参考 <a href="https://docs.github.com/en/rest/pulls/pulls?apiVersion=2022-11-28#create-a-pull-request">Pulls#create-a-pull-request</a></td>
      </tr>
      <tr>
          <td>子资源是一次性查询还是独立查询</td>
          <td>嵌套</td>
          <td>从 Pulls 进行判断</td>
      </tr>
      <tr>
          <td>分页参数存放</td>
          <td>URL Query</td>
          <td></td>
      </tr>
      <tr>
          <td>分页方式</td>
          <td>Page</td>
          <td><a href="https://docs.github.com/en/rest/guides/using-pagination-in-the-rest-api?apiVersion=2022-11-28">Using pagination in the REST API</a></td>
      </tr>
      <tr>
          <td>分页控制者</td>
          <td>服务端</td>
          <td>同上</td>
      </tr>
      <tr>
          <td><strong>Response</strong></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>模型呈现种类</td>
          <td>多种模型</td>
          <td>比如 Commits 里面的 明细和 Parent <a href="https://docs.github.com/en/rest/commits/commits?apiVersion=2022-11-28">Commits</a></td>
      </tr>
      <tr>
          <td>大模型如何包含子模型模型</td>
          <td>核心模型 + 多次关联资源查询？</td>
          <td>没有明确说明，根据几个核心 API 反推</td>
      </tr>
      <tr>
          <td>字段返回是按需还是归并还是统一</td>
          <td>统一</td>
          <td></td>
      </tr>
      <tr>
          <td>字段表现格式</td>
          <td>Snake</td>
          <td></td>
      </tr>
      <tr>
          <td>错误码</td>
          <td>无</td>
          <td><a href="https://docs.github.com/en/rest/overview/resources-in-the-rest-api?apiVersion=2022-11-28#client-errors">Resources in the REST API#client-errors</a></td>
      </tr>
      <tr>
          <td>错误格式</td>
          <td>全局统一</td>
          <td><a href="https://docs.github.com/en/rest/overview/resources-in-the-rest-api?apiVersion=2022-11-28#client-errors">Resources in the REST API#client-errors</a></td>
      </tr>
      <tr>
          <td>时区</td>
          <td>复合方案（ISO 8601 &gt; Time-Zone Header &gt; User Last &gt; UTC）</td>
          <td><a href="https://docs.github.com/en/rest/overview/resources-in-the-rest-api?apiVersion=2022-11-28#timezones">Resources in the REST API#Timezones</a></td>
      </tr>
      <tr>
          <td>HATEOAS</td>
          <td>🚫</td>
          <td></td>
      </tr>
  </tbody>
</table>
<h3 id="azure-风格">Azure 风格</h3>
<p>Azure 的 API 设计遵循 <a href="https://github.com/Microsoft/api-guidelines/blob/master/Guidelines.md">api-guidelines/Guidelines.md at master · microsoft/api-guidelines</a>，
这篇文章偏原理性，另外还有一份实用指导手册在 <a href="https://learn.microsoft.com/en-us/azure/architecture/best-practices/index-best-practices">Best practices in cloud applications</a>
和 <a href="https://learn.microsoft.com/en-us/azure/architecture/best-practices/api-design">Web API design best practices</a>。</p>
<p>需要注意的是，Azure 的产品线远比 Github 丰富，一些 API 也没有遵循 Azure 自己的规范。
在找实例时候，我主要参考
<a href="https://learn.microsoft.com/en-us/rest/api/?view=Azure">REST API Browser </a>，
<a href="https://learn.microsoft.com/en-us/rest/api/storageservices/">Azure Storage REST API Reference </a>。
如果具体实现和 Guidelines.md 冲突，我会采用 Guidelines.md 结论。</p>
<table>
  <thead>
      <tr>
          <th>问题</th>
          <th>选择</th>
          <th>备注</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>URL</strong></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>API Path 里面 Prefix</td>
          <td>二级域名</td>
          <td></td>
      </tr>
      <tr>
          <td>Path 里面是否包含 API 版本</td>
          <td>🚫</td>
          <td><code>x-ms-version</code></td>
      </tr>
      <tr>
          <td>Path 是否包含 Group</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>Path 是否包含动作</td>
          <td>🚫？</td>
          <td>没有明确说明，但是有倾向使用 <code>comp</code> 参数来进行动作，保持 URL 的 RESTful 参考 <a href="https://learn.microsoft.com/en-us/rest/api/storageservices/lease-container?tabs=azure-ad">Lease Container (REST API) - Azure Storage</a></td>
      </tr>
      <tr>
          <td>模型 ID 形式</td>
          <td>Readable Stable Identity</td>
          <td><a href="https://github.com/Microsoft/api-guidelines/blob/master/Guidelines.md#73-canonical-identifier">Guidelines.md#73-canonical-identifier</a></td>
      </tr>
      <tr>
          <td>URL 中模型单数还是复数</td>
          <td>复数</td>
          <td><a href="https://github.com/Microsoft/api-guidelines/blob/master/Guidelines.md#93-collection-url-patterns">Guidelines.md#93-collection-url-patterns</a></td>
      </tr>
      <tr>
          <td>资源是一级（平铺）还是多级（嵌套）</td>
          <td>多级 / 一级</td>
          <td><a href="https://learn.microsoft.com/en-us/azure/architecture/best-practices/api-design#define-api-operations-in-terms-of-http-methods">api-design#define-api-operations-in-terms-of-http-methods</a>，注 MS 有 <code>comp=?</code> 这种参数，用来处理特别的命令</td>
      </tr>
      <tr>
          <td>搜索如何实现，独立接口（<code>/models/search</code>）还是基于列表<code>/models/</code> 接口</td>
          <td>?</td>
          <td>倾向于基于列表，因为大量使用 <code>comp=</code> 这个 URL Param 来进行子命令，比如 <a href="https://learn.microsoft.com/en-us/rest/api/storageservices/incremental-copy-blob">Incremental Copy Blob (REST API) - Azure Storage</a></td>
      </tr>
      <tr>
          <td>是否有 Alias URL</td>
          <td>?</td>
          <td></td>
      </tr>
      <tr>
          <td>URL 中模型是否允许缩写（或精简）</td>
          <td>?</td>
          <td></td>
      </tr>
      <tr>
          <td>URL 中模型多个词语拼接的连字符</td>
          <td>Camel</td>
          <td><a href="https://learn.microsoft.com/en-us/rest/api/storagemover/job-runs/list?tabs=HTTP">Job Runs - List - REST API (Azure Storage Mover)</a></td>
      </tr>
      <tr>
          <td>是否要区分 Web API 以及 Open API（面向非浏览器）</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td><strong>Header</strong></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>是否所有 Verb 都使用 POST</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td>修改（Modify）动作是 POST 还是 PATCH？</td>
          <td>PATCH</td>
          <td><a href="https://learn.microsoft.com/en-us/rest/api/storagemover/agents/update?tabs=HTTP">Agents - Update - REST API (Azure Storage Mover)</a></td>
      </tr>
      <tr>
          <td>HTTP Status 返回值</td>
          <td>充分利用 HTTP Status</td>
          <td><a href="https://github.com/Microsoft/api-guidelines/blob/master/Guidelines.md#711-http-status-codes">Guidelines.md#711-http-status-codes</a></td>
      </tr>
      <tr>
          <td>是否使用考虑限流系统</td>
          <td>?</td>
          <td></td>
      </tr>
      <tr>
          <td>是否使用缓存系统</td>
          <td>✅</td>
          <td><a href="https://github.com/Microsoft/api-guidelines/blob/master/Guidelines.md#75-standard-request-headers">Guidelines.md#75-standard-request-headers</a></td>
      </tr>
      <tr>
          <td>是否校验 UserAgent</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td>是否校验 Referrral</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td><strong>Request</strong></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>复杂的参数是放到 Form Fields 还是单独一个 JSON Body</td>
          <td>Body</td>
          <td>参考 <a href="https://learn.microsoft.com/en-us/rest/api/storagemover/agents/create-or-update?tabs=HTTP">Agents - Create Or Update - REST API (Azure Storage Mover)</a></td>
      </tr>
      <tr>
          <td>子资源是一次性查询还是独立查询</td>
          <td>?</td>
          <td></td>
      </tr>
      <tr>
          <td>分页参数存放</td>
          <td>?</td>
          <td>没有结论</td>
      </tr>
      <tr>
          <td>分页方式</td>
          <td>Page based</td>
          <td></td>
      </tr>
      <tr>
          <td>分页控制者</td>
          <td>服务端</td>
          <td><a href="https://learn.microsoft.com/en-us/rest/api/storagemover/agents/list?tabs=HTTP">Agents - List - REST API (Azure Storage Mover)</a></td>
      </tr>
      <tr>
          <td><strong>Response</strong></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>模型呈现种类</td>
          <td>单一模型</td>
          <td>推测</td>
      </tr>
      <tr>
          <td>大模型如何包含子模型模型</td>
          <td>?</td>
          <td>场景过于复杂，没有单一结论</td>
      </tr>
      <tr>
          <td>字段返回是按需还是归并还是统一</td>
          <td>?</td>
          <td></td>
      </tr>
      <tr>
          <td>字段表现格式</td>
          <td>Camel</td>
          <td></td>
      </tr>
      <tr>
          <td>错误码</td>
          <td>使用自定错误码清单</td>
          <td>至少在各自产品内</td>
      </tr>
      <tr>
          <td>错误格式</td>
          <td>自定义</td>
          <td></td>
      </tr>
      <tr>
          <td>时区</td>
          <td>?</td>
          <td></td>
      </tr>
      <tr>
          <td>HATEOAS</td>
          <td>?</td>
          <td><a href="https://learn.microsoft.com/en-us/azure/architecture/best-practices/api-design#use-hateoas-to-enable-navigation-to-related-resources">api-design#use-hateoas-to-enable-navigation-to-related-resources</a></td>
      </tr>
  </tbody>
</table>
<p>Azure 的整体设计风格要比 Github API 更复杂，同一个产品的也有多个版本的差异，看
上去统一性要更差一些。这种复杂场景想用单一的规范约束所有团队的确也是更困难的。
我们可以看到 Azaure 团队在 Guidelines 上面努力，他们最近正在推出 vNext 规范。</p>
<h3 id="我个人风格">我个人风格</h3>
<p>我个人风格基本继承自 Github API 风格，做了一些微调，更适合中小型产品开发。
我的改动原因都在备注中解释，改动出发点是：简化 / 减少歧义 / 考虑实际成本。如果备注里面标记了「注」，则是遵循 Github 方案并添加一些观点。</p>
<table>
  <thead>
      <tr>
          <th>问题</th>
          <th>选择</th>
          <th>备注</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>URL</strong></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>API Path 里面 Prefix</td>
          <td><code>/apis</code></td>
          <td>我们往往只有一个系统，一个域名要承载 API 和 Web Page</td>
      </tr>
      <tr>
          <td>Path 里面是否包含 API 版本</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>Path 是否包含 Group</td>
          <td>✅</td>
          <td>做一层业务模块拆分，隔离一定合作边界</td>
      </tr>
      <tr>
          <td>Path 是否包含动作</td>
          <td>看情况（如果 HTTP Verb CRUD 无法满足就包含）</td>
          <td></td>
      </tr>
      <tr>
          <td>模型 ID 形式</td>
          <td>Readable Stable Identity</td>
          <td></td>
      </tr>
      <tr>
          <td>URL 中模型单数还是复数</td>
          <td>复数</td>
          <td></td>
      </tr>
      <tr>
          <td>资源是一级（平铺）还是多级（嵌套）</td>
          <td>多级 + 一级</td>
          <td>注：80% 情况都是遵循模型的归属，少量情况（常见在搜索）使用一级</td>
      </tr>
      <tr>
          <td>搜索如何实现，独立接口（<code>/models/search</code>）还是基于列表<code>/models/</code> 接口</td>
          <td>统一 &gt; 独立</td>
          <td>低成本实现一些（早期 Github Issue 也是没有 <code>/search</code> 接口</td>
      </tr>
      <tr>
          <td>是否有 Alias URL</td>
          <td>🚫</td>
          <td>简单点</td>
      </tr>
      <tr>
          <td>URL 中模型是否允许缩写（或精简）</td>
          <td>✅</td>
          <td>一旦做了精简，需要在术语表标记出来</td>
      </tr>
      <tr>
          <td>URL 中模型多个词语拼接的连字符</td>
          <td><code>-</code></td>
          <td></td>
      </tr>
      <tr>
          <td>是否要区分 Web API 以及 Open API（面向非浏览器）</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td><strong>Header</strong></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>是否所有 Verb 都使用 POST</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td>修改（Modify）动作是 POST 还是 PATCH？</td>
          <td>PATCH</td>
          <td></td>
      </tr>
      <tr>
          <td>HTTP Status 返回值</td>
          <td>充分利用 HTTP Status</td>
          <td></td>
      </tr>
      <tr>
          <td>是否使用考虑限流系统</td>
          <td>✅ 429</td>
          <td></td>
      </tr>
      <tr>
          <td>是否使用缓存系统</td>
          <td>🚫</td>
          <td>简单一些，使用动态数据，去除缓存能力</td>
      </tr>
      <tr>
          <td>是否校验 UserAgent</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>是否校验 Referrral</td>
          <td>🚫</td>
          <td></td>
      </tr>
      <tr>
          <td><strong>Request</strong></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>复杂的参数是放到 Form Fields 还是单独一个 JSON Body</td>
          <td>Body</td>
          <td></td>
      </tr>
      <tr>
          <td>子资源是一次性查询还是独立查询</td>
          <td>嵌套</td>
          <td></td>
      </tr>
      <tr>
          <td>分页参数存放</td>
          <td>URL Query</td>
          <td></td>
      </tr>
      <tr>
          <td>分页方式</td>
          <td>Page</td>
          <td></td>
      </tr>
      <tr>
          <td>分页控制者</td>
          <td>客户端</td>
          <td>降低服务端成本，容忍极端情况空白</td>
      </tr>
      <tr>
          <td><strong>Response</strong></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>模型呈现种类</td>
          <td>多种模型</td>
          <td>使用的 BO / VO / Tiny / Rich</td>
      </tr>
      <tr>
          <td>大模型如何包含子模型模型</td>
          <td>核心模型 + 多次关联资源查询</td>
          <td></td>
      </tr>
      <tr>
          <td>字段返回是按需还是归并还是统一</td>
          <td>统一</td>
          <td>Tiny Model（可选） / Model（默认） / Rich Model（可选）</td>
      </tr>
      <tr>
          <td>字段表现格式</td>
          <td>Snake</td>
          <td></td>
      </tr>
      <tr>
          <td>错误码</td>
          <td>无</td>
          <td>注：很多场景只要 message</td>
      </tr>
      <tr>
          <td>错误格式</td>
          <td>全局统一</td>
          <td></td>
      </tr>
      <tr>
          <td>时区</td>
          <td>ISO 8601</td>
          <td>只使用一种格式，不再支持多种方案</td>
      </tr>
      <tr>
          <td>HATEOAS</td>
          <td>🚫</td>
          <td></td>
      </tr>
  </tbody>
</table>
<h2 id="题外话---apple-music-的一个有趣设计">题外话 - Apple Music 的一个有趣设计</h2>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202304/apple-music.png" alt="Apple Music"  />


</p>
<p><small>image from Apple Music</small></p>
<p>我最近在使用 Apple Music 时注意到了其 Web 页面的 URL 结构：</p>
<p><code>/cn/album/we-sing-we-dance-we-steal-things/277635758?l=en</code></p>
<p>仔细看这个 URL 结构，可以发现其中 Path 包含了人类可读的 slug，分为三个部分：<code>alumn/$(name)/$(id)</code> （其中包含了 ID）。
我立即想到了一个问题：中间的可读名称是否无机器意义，纯粹面向自然人？
于是我测试了一个捏造的地址：<code>/cn/album/foobar/277635758?l=en</code>。
在您尝试访问之前，您能猜出结果是否可以访问吗？</p>
<p>这种设计范式比我现在常用的 URL 设计规范要复杂一些。我的规范要求将资源定位使用两层 slug 组织，即 <code>$(type)/$(id)</code>。
而苹果使用了 <code>$(type)/(type-id)/$(id)</code>，同时照顾了可读性和准确性。</p>
<h2 id="题外话---为什么-graphql-不行">题外话 - 为什么 GraphQL 不行</h2>
<p><a href="https://graphql.org/">GraphQL</a> 是一种通过使用自定义查询语言来请求 API 的方式，它的优点在于可以提供更灵活的数据获取方式。
相比于 RESTful API 需要一次请求获取所有需要的数据，GraphQL 允许客户端明确指定需要的数据，从而减少不必要的数据传输和处理。</p>
<p>然而，GraphQL 的过于灵活也是它的缺点之一。由于它没有像 REST API 那样有一些业务场景建模的规范，
开发人员需要自己考虑数据的处理方式。
这可能导致一些不合理的查询请求，对后端数据库造成过度的压力。此外，GraphQL 的实现和文档相对较少，也需要更多的学习成本。</p>
<p>因此，虽然 GraphQL 可以在一些特定的场景下提供更好的效果，但它并不适合所有的 API 设计需求。
实际上，一些公司甚至选择放弃支持 GraphQL，例如 Github 的 <a href="https://github.blog/changelog/2022-08-18-deprecation-notice-graphql-for-packages/">一些项目</a>。</p>
<h2 id="最后">最后</h2>
<blockquote>
<p>Complexity is incremental （复杂度是递增的）</p>
<ul>
<li>John Ousterhout (<a href="https://web.stanford.edu/~ouster/cgi-bin/cs190-winter18/lecture.php?topic=complexity">via</a>）</li>
</ul></blockquote>
<p><mark>风格没有最好，只有最适合，但是拥有风格是很重要的。</mark></p>
<p>建立一个优秀的规则不仅需要对现有机制有深刻的理解，还需要对业务领域有全面的掌握，并在团队内进行有效的协作与沟通， 推广并实施规则。
不过，一旦规则建立起来，就能够有效降低系统的复杂度，避免随着时间和业务的推进而不断增加的复杂性， 并减少研发方面的沟通成本。</p>
<p>这是一项长期的投资，但能够获得持久的回报。希望有长远眼光的人能够注意到这篇文章。</p>
<p>主要参考文档：</p>
<ul>
<li><a href="https://github.com/Microsoft/api-guidelines/blob/master/Guidelines.md">api-guidelines/Guidelines.md at master · microsoft/api-guidelines</a></li>
<li><a href="https://docs.github.com/en/rest/overview/about-githubs-apis?apiVersion=2022-11-28">GitHub&rsquo;s APIs</a></li>
<li><a href="https://learn.microsoft.com/en-us/azure/architecture/best-practices/api-design">Web API design best practices - Azure Architecture Center | Microsoft Learn</a></li>
<li><a href="https://developer.aliyun.com/article/701810">API 设计最佳实践的思考 - 谷朴</a></li>
</ul>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[从 Toodledo 到 Obsidian Tasks - 我的 GTD 最佳实践]]></title>
    <link href="https://blog.alswl.com/2023/02/gtd/"/>
    <id>https://blog.alswl.com/2023/02/gtd/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2023-02-26T18:50:50+08:00</published>
    <updated>2023-02-26T18:50:50+08:00</updated>
    
    <content type="html"><![CDATA[<p>最近我完成了从 Toodledo 到 Obsidian Tasks（Obsidian 插件）的切换。
这两款软件都是极其强大的时间管理工具。虽然 Toodledo 几乎是我最喜欢的 GTD 软件，
但服务愈发不稳定让我烦恼，正好发现 Obsidian Tasks 在查询和知识库结合方面的能力发挥出了 1+1 &gt; 2 的效果。
经过试用我决定迁移到 Obsidian Tasks。</p>
<p>放弃一个合作了十几年的老朋友 Toodledo 让我有些伤感，但是这个过程也促使我总结了一下我在时间管理这个命题上的尝试，并分享了一些我的经验。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/clock.png" alt="time"  />


</p>
<p><small>Image frrom Pixelbay</small></p>
<h2 id="什么是-gtd">什么是 GTD</h2>
<p>在这个快节奏的现代生活中，我们都会遇到大量的任务和信息，而如何有效地管理时间和任务成为了许多人的挑战。在读书时期，我也曾经陷入任务管理的困境。从 2009 年开始，我尝试过使用<a href="https://blog.alswl.com/2010/01/use-google-calendar-to-manage-the-time/">日历</a>、<a href="https://blog.alswl.com/2010/04/desktop-recording-tool-boogunote/">笔记</a>等工具来组织我的任务和信息，但效果并不理想。直到后来我接触到了 <a href="https://doit.im/">DoIt.im</a>，进而发现了 David Allen 的书《<a href="https://book.douban.com/subject/1316569/">Getting Things Done</a>》，这本书带给了我一种全新的任务管理思路——GTD。往后数十年，我一直使用这个模式来管理自己的时间。</p>
<p>GTD 是由 David Allen 所创立的一种个人时间管理方法 ，旨在帮助人们更有效地管理自己的时间和任务，从而提高工作效率和生产力。这种方法的基本思想是<mark>将所有任务分解为具体的行动步骤，并将它们组织在一个可靠的系统中，以便于跟进和管理</mark>通过这种方法，人们可以更轻松地掌控自己的工作和生活，减少压力和焦虑，从而更加专注和高效地完成任务。</p>
<p>那么如何实现 GTD 呢？以下是基本的步骤：</p>
<ol>
<li>收集：收集所有任务、想法、计划、待办事项，可以用笔记本、手机、电脑等多种工具。</li>
<li>组织：审视待办任务，分类所有任务和行动步骤，并回顾过往未完成的项目。
<ul>
<li>分类：审视收集到的任务，将所有任务和行动步骤分类，常见分类包括项目、上下文、时间等，以更清晰地了解任务的优先级和关联性。如果可以快速执行（&lt;2m）就立刻执行。</li>
<li>回顾：定期回顾任务和行动步骤，确保它们的进度和状态得到及时跟进，更好地掌控任务和生活，从而更加高效地完成任务。</li>
</ul>
</li>
<li>执行：专注于当前任务，避免分散注意力，借助时间管理和注意力控制的技巧提高效率。</li>
</ol>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/gtd.png" alt="gtd"  />


</p>
<p>注，我整理的结构和外部工具略有差异。<mark>我将分类、回顾都合并到组织步骤</mark>因为我发现组织本质是做计划，做计划纪要看收集的待办事项，也要回顾进行中项目和已完成项目，何不都在组织环节一起做好？</p>
<h2 id="我使用过的在线-gtd-服务">我使用过的在线 GTD 服务</h2>
<p>我曾使用过多个在线任务管理软件，包括 Doit.im、Remember The Milk、OmniFocus 和 Toodledo 等，下面分享一下我的使用历程和对比这些软件的差异。</p>
<h3 id="doitim">Doit.im</h3>
<p>我接触 GTD 就是从 <a href="http://doit.im/">Doit.im</a> 开始。这是一款国产软件，也是我非常喜欢的一款应用程序。Doit.im 支持 GTD 的基本功能，提供了清晰的任务列表、分类、优先级等功能，还支持多种回顾模式和多平台同步。然而，我后来放弃了它，因为我发现了更为强大的 Toodledo。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/doit-im.png" alt="doit.im"  />


</p>
<p><small>Image frrom doit.im</small></p>
<h3 id="remember-the-milk">Remember The Milk</h3>
<p>我寻找下一款管理工具时，找到了 <a href="http://www.rememberthemilk.com/">Remember The Milk</a>（RTM）这个应用。RTM 提供了基本的任务管理功能，如添加任务、设置提醒、归档任务等等，并支持多平台同步，可以在电脑、手机等多个设备上使用。</p>
<p>然而，有些人可能不太喜欢 RTM 的用户界面设计，因为它看起来可能有些过时，不够现代化。此外，一些高级功能需要付费使用。当时我还是一个穷学生，没有为软件付费的能力，所以很快放弃了使用 RTM。</p>
<h3 id="toodledo">Toodledo</h3>
<p>我从<a href="https://xbeta.info/gtd-toodledo.htm">善用佳软</a>了解到 <a href="https://www.toodledo.com/">Toodledo</a> 这款任务管理工具（善用佳软是一个著名的软件使用分享网站，我在学生时代从这里获取了相当多的工具和思路）。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/toodledo.png" alt="toodledo"  />


</p>
<p><small>Image frrom toodledo.com</small></p>
<p>我很快在 <a href="http://www.productivelife.cn/">葡挞生活</a> 找到了一份非常完整的教程介绍 Toodledo 高级使用手法，尤其从其中获得了使用 Search 模块的方法。可惜现在网站已经无法打开了。不过，我们可以从一些其他渠道的截图中，略窥当时 Toodledo 的风采：</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/productive-life.png" alt="productive-life"  />


</p>
<p><small>Image frrom twitter.com/productivelife</small></p>
<p>Toodledo 很快成为了我最喜欢的任务管理工具。它提供了非常全面的任务管理功能，支持任务分类、排序、筛选等，同时还支持多种回顾模式和自定义字段。此外，Toodledo 还支持多平台同步，并且具有强大的 API，可以方便地与其他应用程序集成。</p>
<h3 id="omnifocus">OmniFocus</h3>
<p>由于 Toodledo 产品功能上一直不思进取，访问比较慢。我还曾经探索式短暂使用了 <a href="https://www.omnigroup.com/omnifocus/">OmniFocus</a>，这是一款专业的 Mac 平台任务管理工具，它提供了任务分解、项目管理、上下文等功能，并可通过 AppleScript 等方式进行扩展。OmniFocus 支持多种同步服务，包括 Omni Sync Server、WebDAV、FTP 等，用户可以根据自己的需求选择不同的服务。所有任务数据都是存储在本地的，因此用户可以在没有网络连接的情况下继续使用软件。</p>
<p>付费使用一段时间之后，我发现 <mark>OmniFocus 的搜索功能和 Toodledo 的 Search 功能实在无法相提并论</mark>它不能满足我的需求。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/omnifocus.png" alt="OmniFocus"  />


</p>
<p><small>Image frrom <a href="https://www.omnigroup.com/omnifocus">www.omnigroup.com/omnifocus</a></small></p>
<h3 id="其他一些">其他一些</h3>
<p>我还曾经尝试过一些任务管理工具，包括 Trello、Asana、Basement、Tower、Teambition 等等，</p>
<p>但是由于它们的功能设计往往是为团队协作设计的，而我主要是个人使用，因此使用起来不够便捷。另外，这些软件的自定义搜索功能（当时）往往也比较弱，无法满足我的需求。最终我都返回到了 Toodledo 怀抱，直到现在。</p>
<h2 id="我如何组织一天的任务">我如何组织一天的任务？</h2>
<p>我认为在 GTD 的体系中，收集和处理阶段相对机械和简单，真正考验人的是<strong>组织</strong>阶段：</p>
<ul>
<li>分类：如何快速检阅所有任务并对它们进行分类和标记；</li>
<li>下一步：如何确定下一个任务的优先级。</li>
</ul>
<p>下面我将分享一些我个人的理念和操作方法。</p>
<h3 id="分类即快速检阅">分类即快速检阅</h3>
<p>为了更好地组织任务，我们需要注意任务的重要属性，包括 <mark>Context（环境）、Project（项目）、Status（状态）和 Due（截止时间）</mark>Context 决定了当前环境下要做什么，是一个简单的过滤器。我将 Context 分为 Computer / Work / Mobile。Project 则将任务归属到不同的项目中，一个项目的周期比较长，并且其中的任务具有强相关性。Status 描述这个任务是立即可处理（Next）还是需要等待（Waiting），有些任务是周期性的则为 Active。Due 则是描述时间属性，一般有到点干（On），在这个时间之前（Due）以及尽量（Optional）。</p>
<p>除此之外，其他属性，如优先级（Priority）、类型（Folder）也需要考虑，但不是最重要的。</p>
<p>为了更好地管理任务，我每天早上都会打开<mark>四个视图：single、subtask、project-xxx 和 inbox</mark></p>
<ul>
<li><strong>single</strong> 是单独任务（包括重复任务），这里面的任务都是独立的，可以根据优先级进行排序。</li>
<li><strong>subtask</strong> 是父子任务，有些任务并不是当天可以完成，必须将任务拆分为小任务，否则会打击完成任务的信心。</li>
<li><strong>project-xxx</strong> 针对特定项目做的分类，我会按照固定模板对每个项目进行分类成十几个任务。</li>
<li><strong>inbox</strong> 其实就是收集的产物，需要进行简单分类处理。</li>
</ul>
<h3 id="下一个任务是什么">下一个任务是什么</h3>
<p>以下是筛选清单，用于确定需要立即进行的任务：</p>
<ul>
<li><strong>Top</strong>：任务优先级高</li>
<li><strong>Due 3 天内且非重复类型</strong>：需要进行检查和准备工作</li>
<li><strong>Due 明天</strong>：需要立即进行</li>
<li><strong>High + Next</strong>：任务优先级较高，且已经具备行动条件</li>
<li><strong>计时器不为空</strong>：说明已经开始执行，但可能会被其他事情打断</li>
<li><strong>Waiting</strong>：表示需要和别人合作，需要检查进度</li>
</ul>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/now.png" alt="toodledo-now"  />


</p>
<p>清单中的任务按照优先级、截止日期和执行状态的综合考虑排序。每次进入工作状态之后，只需要从这个清单中筛选出靠前的几个任务进行执行。</p>
<h2 id="曾经的王者---toodledo">曾经的王者 - Toodledo</h2>
<p>我使用它已经超过了 12 年，付费了 8 年，而且它的产品理念深刻影响了我时间管理的策略。
我介绍一些 Toodledo 中做得相当很不错的功能以及细节：</p>
<h3 id="细节功能">细节功能</h3>
<h4 id="循环任务功能">循环任务功能</h4>
<p>Toodledo 支持循环任务功能，用户可以将一个任务设置为循环任务，并指定它的重复周期，比如每天、每周、每月等。当任务完成后，它会自动重复出现在任务列表中，以便用户再次处理。这个功能可以帮助用户更好地管理一些常规性的任务：日常会议、每日邮件处理、每日 Review 等等。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/repeat-1.png" alt="repeat-1"  />


</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/repeat-2.png" alt="repeat-2"  />


</p>
<h4 id="丰富时间功能类型">丰富时间功能类型</h4>
<p>Toodledo 对日期的支持非常丰富，用户可以根据任务的具体情况选择不同的 Due 类型，比如 Due（截止时间）、Timer（计时器）、Length（时常评估） 等等。这样一来，用户可以更加精细地管理任务的时间，有效地提高工作效率。另外，基于 Timer 计时器，我可以<mark>方便地统计一天的时间耗用情况</mark>更好地把控时间成本。我还开发了一个 <a href="https://github.com/alswl/toodledo_a">Python 脚本</a>用来分析每周的时间耗用。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/toodledo-due.png" alt="Toodledo Due"  />


</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/toodledo-timer.png" alt="Toodledo Timer"  />


</p>
<h4 id="search-功能">Search 功能</h4>
<p>Toodledo 的 Search 功能非常强大，<mark>支持丰富的逻辑查询（提供了条件组合的与或查询）</mark>用户可以根据任务名称、标签、日期、优先级等多个条件进行查询。这个功能可以帮助用户组织任务，提高任务管理的效率，我一度无法离开 Toodledo 也是因为，任务组织这个步骤我高度依赖这项功能。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/toodledo-search.png" alt="Toodledo Search"  />


</p>
<h3 id="我开发的工具和插件">我开发的工具和插件</h3>
<p>整体而言，我还是愿意给大家推荐 Toodledo。我自己也在 Toodledo 之上基于它提供的 API 开发了
多款工具和插件。我给大家介绍一下：</p>
<h4 id="buff-1-优雅订阅-toodledo-日历">Buff 1 优雅订阅 Toodledo 日历</h4>
<p>Toodledo 提供了日历订阅能力，将待办事项显示在各类日历软件中。但原始的信息非常混乱，没有考虑任务的 Time，并且时间也是计算错误。为此我开发了一个 Web 服务，叫做 <a href="https://github.com/alswl/toodledo_calendar_filter">toodledo_calendar_filter</a>。</p>
<p>它可以将 Toodledo 的任务更友好地显示在日历系统上。具体来说，它可以过滤 <a href="https://www.toodledo.com/info/help_ical.php">Toodledo 的 iCal</a>，只显示那些具有到期日期和时长的任务。如果你也有相关需求可以直接使用我提供的在线服务（https://toodledo-calendar-filter.alswl.com）。</p>
<p>Before：</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/calendar-before.png" alt="calendaer-before"  />


</p>
<p>After：</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/calendar-after.png" alt="calendar-after"  />


</p>
<h4 id="buff-2-让-toodledo-具备-gmail-快捷键">Buff 2 让 Toodledo 具备 Gmail 快捷键</h4>
<p>当你使用 Toodledo 进行任务管理时，你是否感到操作繁琐，鼠标使用效率不高，非常怀念 Gmail 风格的快捷键？如果是这样，那么我的项目 <a href="https://github.com/alswl/my-toodledo">alswl/my-toodledo</a> 可以帮助你解决这个问题。</p>
<p>它是一个针对 Toodledo 的油猴脚本（User Script），提供了一系列 Gmail 风格的快捷键，让你可以像使用 Gmail 一样快速操作 Toodledo，包括移动任务（<code>j</code> / <code>k</code>）、任务操作（<code>x</code> 标记完成，<code>enter</code> 启动任务）、切换任务视图（<code>g s</code> 跳转搜索）等等。它在 Chrome / Safari / Firefox 上运行稳定，如果你想要提高 Toodledo 的使用效率，不妨试一试吧。</p>
<h4 id="buff-3-命令行工具-go-toodledo">Buff 3 命令行工具 go-toodledo</h4>
<p>为了快速收集任务，我曾经使用一个 Github 上面 CLI 小工具（<a href="https://github.com/wsargent/toodledo">wsargent/toodledo</a>）。但它是基于 v1 版本的 API，官方已经在七八年前就说 v1 版本 API 要下线。于是我自己做了一个叫做 <a href="https://github.com/alswl/go-toodledo">go-toodledo </a>小项目。</p>
<p>一开始 go-toodledo 只是提供最简单的 CLI 功能。后来我逐步补充了完整 SDK、CLI 全功能，甚至还提供了一个<mark>互动式的 TUI 小应用</mark>让用户可以方便在 Terminal 地使用 Toodledo。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/go-toodledo.png" alt="go-toodledo"  />


</p>
<p>Toodledo 官方并没有提供 OpenAPI 接口，我以逆向的方式生成了一份 <a href="https://github.com/alswl/go-toodledo/blob/master/api/swagger.yaml">go-toodledo/swagger.yaml</a>，如果还有其他人有对 Toodledo API 开发需求，可以基于这份 API 直接使用。</p>
<h3 id="离开">离开</h3>
<p>最近，我对一直使用的任务管理服务 Toodeldo 的<mark>稳定性</mark>越来越失望。
他们<a href="https://blog.toodledo.com/hello-from-the-new-toodledo-team/">换了新的服务提供商</a>，
服务出现不稳定的频率更高，而新团队的产品能力也让我产生了一些质疑。
因此，我决定开始寻找下一个更好的任务管理服务。
因为 <a href="https://mp.weixin.qq.com/s/jJG36Hbrw2-ZeUT3aDXKBA">Kindle 在中国停止服务的事件</a>让我对云服务的可靠性产生了疑虑。
因此，我开始寻找一些<mark>本地化的任务管理方案</mark>这些方案可以通过网盘（例如 iCloud）进行服务，
这样可以更好地保护我的数据和隐私。</p>
<h2 id="最终获胜者---obsidian-tasks">最终获胜者 - Obsidian Tasks</h2>
<p><a href="https://obsidian.md/">Obsidian</a>是一款基于本地文件的个人知识管理（KMS）和笔记应用程序，可帮助用户将其笔记和想法组织、链接和分析。它是一款纯粹的本地软件，我们可以使用网盘 / NAS 等方式进行多端同步。</p>
<p><a href="https://github.com/obsidian-tasks-group/obsidian-tasks">Obsidian Tasks</a> 则是一款<mark>强大的 Obsidian 插件</mark>它可以让你在 Obsidian 中轻松地管理任务和待办事项。这个插件可以通过简单的语法将任务添加到你的笔记中，并根据任务的完成情况自动标记任务的状态。你可以使用 Obsidian Tasks 来跟踪个人任务、工作任务、学习任务等等。此外，它还具有一些其他功能，例如自定义任务样式、创建过滤器来查找任务，以及可以根据任务状态自动移动任务。Obsidian + Obsidian Tasks 是一个完美组合，可以帮助你更好地管理你的待办事项，提高你的生产力。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/obisidian-tasks.png" alt="Obsidian Tasks"  />


</p>
<p><small>Image frrom <a href="https://github.com/obsidian-tasks-group/obsidian-tasks">https://github.com/obsidian-tasks-group/obsidian-tasks</a></small></p>
<p>我的个人 KMS 已经完整地从 <a href="http://notion.com/">Notion</a> 迁移到了 Obisidian，现在使用 Obisidan Tasks 迁移成本很低。经过一段时间对 Obsidian Tasks 的学习，我将原来的使用模式较为顺利搬到了 Obsidian Tasks。我接着之前两个场景<strong>整理</strong>和<strong>下一个任务</strong>来介绍如何高效使用 Obsidian Tasks。</p>
<p>我通过以下几种形式组织待办任务：</p>
<ul>
<li>使用 <code>[ ]</code> 标记的普通文档任务，一般是零散小任务。</li>
<li>使用以 <code>.todo.md</code> 结尾的专用文档，以对项目进行统筹。</li>
<li>使用带有 <code>#todo</code> 标签的文档，一般是一个大事项，我会在顶部拆分出一个 <code>TODO</code> 队列，拆分出若干个 Tasks，拆完之后我会去掉 <code>#todo</code> 标签。</li>
</ul>
<p>基于这个组织结构，我轻松搞定<strong>整理</strong>和<strong>下一个任务</strong>这两个：</p>
<h3 id="分类即快速检阅-1">分类即快速检阅</h3>
<p>使用几个视图<mark>将 Obsidian Tasks 中记录的任务进行多个视图呈现</mark>分别是：</p>
<ul>
<li>今日视角
<ul>
<li>non repeated：一次性任务，往往更重要</li>
<li>repeat：重复性任务，比如周会、约会，往往偏事务性</li>
</ul>
</li>
<li>时间视角
<ul>
<li>即将到期时间（7 天内）</li>
</ul>
</li>
<li>Single Tasks：没有在 <code>.todo</code> 结尾的文件内，即分散在各个日常事务的碎任务</li>
<li>Project：按项目进行排列的任务</li>
<li>有 <code>#todo</code> 标签的任务，往往是一个文档需要整体来处理</li>
</ul>
<p>这几个视图可以让你更好地将任务进行分类，并快速检阅各个任务。通过这些视图，你可以更好地管理你的待办事项，提高你的生产力。</p>
<p>这是我的 projects/View.todo.md`：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gu">## Today
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl"><span class="gs">**WIP**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">```tasks
</span></span></span><span class="line"><span class="cl"><span class="s"></span>status.type is IN_PROGRESS
</span></span><span class="line"><span class="cl"><span class="s">```</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**High（规划、设计都是高优先级）**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">```tasks
</span></span></span><span class="line"><span class="cl"><span class="s"></span>not done
</span></span><span class="line"><span class="cl">priority is above medium
</span></span><span class="line"><span class="cl"><span class="s">```</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**None repetead due today**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">```tasks
</span></span></span><span class="line"><span class="cl"><span class="s"></span>((not done) AND (due before in 1 day)) OR (done on today)
</span></span><span class="line"><span class="cl">is not recurring
</span></span><span class="line"><span class="cl">sort by priority
</span></span><span class="line"><span class="cl"><span class="s">```</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**Repeated due today**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">```tasks
</span></span></span><span class="line"><span class="cl"><span class="s"></span>((not done) AND (due before in 1 day)) OR (done on today)
</span></span><span class="line"><span class="cl">is recurring
</span></span><span class="line"><span class="cl">sort by priority
</span></span><span class="line"><span class="cl"><span class="s">```</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**Over due before today**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">```tasks
</span></span></span><span class="line"><span class="cl"><span class="s"></span>not done
</span></span><span class="line"><span class="cl">due before today
</span></span><span class="line"><span class="cl">sort by priority
</span></span><span class="line"><span class="cl"><span class="s">```</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**Today complete**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">```tasks
</span></span></span><span class="line"><span class="cl"><span class="s"></span>done
</span></span><span class="line"><span class="cl">done on today
</span></span><span class="line"><span class="cl"><span class="s">```</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Future (no repeat)
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl"><span class="gs">**in 1 day**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">```tasks
</span></span></span><span class="line"><span class="cl"><span class="s"></span>not done
</span></span><span class="line"><span class="cl">due before in 1 day
</span></span><span class="line"><span class="cl">is not recurring
</span></span><span class="line"><span class="cl">sort by priority
</span></span><span class="line"><span class="cl">sort by due
</span></span><span class="line"><span class="cl"><span class="s">```</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**in 3 day**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">```tasks
</span></span></span><span class="line"><span class="cl"><span class="s"></span>not done
</span></span><span class="line"><span class="cl">due after in 1 day
</span></span><span class="line"><span class="cl">due before in 3 day
</span></span><span class="line"><span class="cl">is not recurring
</span></span><span class="line"><span class="cl">sort by priority
</span></span><span class="line"><span class="cl">sort by due
</span></span><span class="line"><span class="cl"><span class="s">```</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**in 7 day**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">```tasks
</span></span></span><span class="line"><span class="cl"><span class="s"></span>not done
</span></span><span class="line"><span class="cl">due after in 3 day
</span></span><span class="line"><span class="cl">due before in 7 day
</span></span><span class="line"><span class="cl">is not recurring
</span></span><span class="line"><span class="cl">sort by priority
</span></span><span class="line"><span class="cl">sort by due
</span></span><span class="line"><span class="cl"><span class="s">```</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Singles Tasks
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl"><span class="gs">**in 7d（non project x no repeate）**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">```tasks
</span></span></span><span class="line"><span class="cl"><span class="s"></span>not done
</span></span><span class="line"><span class="cl">status.type is not CANCELLED
</span></span><span class="line"><span class="cl">NOT (path includes .index)
</span></span><span class="line"><span class="cl">NOT (path includes .todo)
</span></span><span class="line"><span class="cl">NOT (path includes .notodo)
</span></span><span class="line"><span class="cl">due after in 7 days
</span></span><span class="line"><span class="cl">sort by priority, due
</span></span><span class="line"><span class="cl"><span class="s">```</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**none project x no due x no repeat**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">```tasks
</span></span></span><span class="line"><span class="cl"><span class="s"></span>not done
</span></span><span class="line"><span class="cl">status.type is not CANCELLED
</span></span><span class="line"><span class="cl">NOT (path includes .index)
</span></span><span class="line"><span class="cl">NOT (path includes .todo)
</span></span><span class="line"><span class="cl">NOT (path includes .notodo)
</span></span><span class="line"><span class="cl">no due date
</span></span><span class="line"><span class="cl">sort by priority, due
</span></span><span class="line"><span class="cl"><span class="s">```</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Projects
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl">TODO
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Help
</span></span></span><span class="line"><span class="cl"><span class="gu"></span><span class="k">
</span></span></span><span class="line"><span class="cl"><span class="k">&gt; </span><span class="ge">[Queries Syntax](https://obsidian-tasks-group.github.io/obsidian-tasks/queries/)
</span></span></span></code></pre></div><h3 id="下一个任务是什么-1">下一个任务是什么</h3>
<p>在 Obsidian 的 <a href="https://help.obsidian.md/Plugins/Daily+notes">Daily Note</a> 插件中，设置模板为 <code>_templates/daily</code>，这样每天就获得一个随时可以使用的当天待办事项。</p>
<p>这是我的 Dailly 设置，通过四个区块区分：今天到期单任务 / 今天到期重复任务（事务性，不重要） / 今日已完成 / 今日新任务（一般是 Single）。</p>
<p>这是我的 <code>_template/daily.md</code> 文件：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gu">## TODO
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl"><span class="gs">**WIP**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">```tasks
</span></span></span><span class="line"><span class="cl"><span class="s"></span>status.type is IN_PROGRESS
</span></span><span class="line"><span class="cl"><span class="s">```</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**New tasks**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**Tasks view - today**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">```tasks
</span></span></span><span class="line"><span class="cl"><span class="s"></span>((not done) AND (due before {{date}})) OR ((not done) AND (due on {{date}})) OR (done on {{date}})
</span></span><span class="line"><span class="cl">is not recurring
</span></span><span class="line"><span class="cl">sort by priority, due
</span></span><span class="line"><span class="cl"><span class="s">```</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**Tasks view - today(repeated)**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">```tasks
</span></span></span><span class="line"><span class="cl"><span class="s"></span>((not done) AND (due before {{date}})) OR ((not done) AND (due on {{date}})) OR (done on {{date}})
</span></span><span class="line"><span class="cl">is recurring
</span></span><span class="line"><span class="cl">sort by priority, due
</span></span><span class="line"><span class="cl"><span class="s">```</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**Over due date**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">```tasks
</span></span></span><span class="line"><span class="cl"><span class="s"></span>not done
</span></span><span class="line"><span class="cl">due before {{date}}
</span></span><span class="line"><span class="cl">sort by priority, due
</span></span><span class="line"><span class="cl"><span class="s">```</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**Projects**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">YOURS
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gs">**Tasks view - today done**</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">```tasks
</span></span></span><span class="line"><span class="cl"><span class="s"></span>done
</span></span><span class="line"><span class="cl">done on {{date}}
</span></span><span class="line"><span class="cl"><span class="s">```</span>
</span></span></code></pre></div><h3 id="obsidian-tasks-有什么缺点">Obsidian Tasks 有什么缺点？</h3>
<p>首先，需要注意的是，Obsidian Tasks 是 Obsidian 的插件，如果之前没有使用 Obsidian，可能需要花费一些时间上手。不过，如果您已经使用了 Obsidian，那么 Obsidian Tasks 的双链功能将为您在 GTD 场景中提供极佳的支持，这既是其优点也是劣势。</p>
<p>其次，Obsidian Tasks 目前还没有提供计时器功能。不过，对于我个人而言，这一点已经不再重要了。随着年龄的增长以及十多年的 GTD 训练，我已经不需要通过工具来保持专注力。在工作状态下，我会比较专注，并且不会经常性分心。</p>
<p>最后，需要注意的是 Obsidian 自身的问题。Obsidian 是一个基于本地文件的工具，这意味着它没有在线工具（尽管有其他基于云存储的解决方案）。如果您希望找到一个电脑和手机都可以访问的在线服务，那么 Obsidian Tasks 可能不太适合您。对我来说，我使用 Obsidian 的方案是因为我拥有 Apple 全家桶，并购买了 iCloud 存储服务，因此我的数据都存储在 <a href="https://www.icloud.com/">iCloud Drive</a> 上。我使用 <a href="https://obsidian.md/download">Obsidian 的 macOS 应用程序</a>和 <a href="https://apps.apple.com/us/app/obsidian-connected-notes/id1557175442">iOS 版本</a>应用程序，这使我可以轻松地在 Macbook 和 iPhone 之间使用同一个 Vault（即 Obsidian 知识库）。启动应用程序之前，我会确认 Vault 同步完成后再进入应用程序。</p>
<h2 id="最后">最后</h2>
<p>时间管理是现代工作者不可避免的话题，也是我们时常为之烦恼的问题。GTD 的方法论恰恰提供了一种轻松而高效的管理方式，让我们能够<mark>迅速结束拖延、分心的状态，全身心地投入工作</mark></p>
<p>工具很重要，但并不能解决所有问题。要做好时间管理，最重要的是要清楚<mark>自己的目标是什么</mark>当你心里有一个重要的使命时，它会不断地在你脑海中浮现，这时候甚至不需要 GTD 工具的管理。</p>
<p>希望本文介绍的 GTD 方法可以在你的工作和生活中带来帮助，让你更高效地完成自己的任务，同时也不要忘记享受生活的美好。记住，时间是有限的，珍惜每分每秒，抓住每一个机会，让自己的人生更加精彩！</p>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[让 Apple Music 播放豆瓣音乐 Top 250]]></title>
    <link href="https://blog.alswl.com/2023/02/douban-music-top-250-in-apple-music/"/>
    <id>https://blog.alswl.com/2023/02/douban-music-top-250-in-apple-music/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2023-02-07T23:50:50+08:00</published>
    <updated>2023-02-07T23:50:50+08:00</updated>
    
    <content type="html"><![CDATA[<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675665150507-502b11ac-0720-4799-8a23-1d7cb27ec553.png" alt="image"  />


</p>
<p>乐坛少有新歌，我经常听一些老歌，有时候顺着豆瓣音乐 Top 250 一点点听下去，感觉还是挺不错。
这中间一直有个麻烦地方：每次都要从豆瓣复制标题去 Apple Music 搜索。有没有简单便捷的方式直接一键抵达呢？
我没有找到答案，于是我自己整理了这批 Apple Music 链接，点击就可以直接跳转到 Apple Music 直接播放了</p>
<p>如上图所示，在本文点击「▶️ Apple Music」按钮，会打开 Apple Music 网站，点左侧的「Open in Music」即可在 Apple Music 打开。</p>
<p>PS：iPhone 上点击链接（Notes / Safari 等）会直接在 Apple Music 打开。</p>
<p>Update 2024-07：我提供了一个在线小网页可以随机选择一个专辑给你，并且一键播放 Apple Music。
<a href="https://random-apple-music.alswl.com/">Random Apple Music</a>
源码 <a href="https://github.com/alswl/random-apple-music">alswl/random-apple-music</a>。</p>
<h2 id="we-sing-we-dance-we-steal-things"><a href="https://music.douban.com/subject/2995812/">We Sing. We Dance. We Steal Things.</a></h2>
<p>Jason Mraz / 2008-05-13 / Import / Audio CD / 民谣</p>
<p>9.1 ( 115738人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664205563-60b7e811-e094-4f0a-a40f-656ad2c5b991.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/we-sing-we-dance-we-steal-things/277635758?l=en">▶️ Apple Music</a></p>
<h2 id="viva-la-vida--death-and-all-his-friends"><a href="https://music.douban.com/subject/3040149/">Viva La Vida | Death And All His Friends</a></h2>
<p>Coldplay / 2008-06-17 / 专辑 / CD / 摇滚</p>
<p>9.0 ( 117391人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664205664-15960011-481e-4736-ad81-617656f3d315.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/viva-la-vida-or-death-and-all-his-friends/1122773394?l=en">▶️ Apple Music</a></p>
<h2 id="华丽的冒险--華麗的冒險"><a href="https://music.douban.com/subject/1427374/">华丽的冒险 | 華麗的冒險</a></h2>
<p>陈绮贞 / 2005-09-23 / 专辑 / CD / 流行</p>
<p>9.0 ( 88220人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664205663-d9bf1dcd-cdf6-4130-aaae-860132d9b084.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E8%8F%AF%E9%BA%97%E7%9A%84%E5%86%92%E9%9A%AA/1598245172?l=en">▶️ Apple Music</a></p>
<h2 id="范特西--fantasy"><a href="https://music.douban.com/subject/1403307/">范特西 | Fantasy</a></h2>
<p>周杰伦 / 2001-09-14 / 专辑 / CD / 流行</p>
<p>9.5 ( 172202人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664205725-1c5abbe2-f81c-4376-822d-e50fb076dbe5.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E8%8C%83%E7%89%B9%E8%A5%BF/535739206?l=en">▶️ Apple Music</a></p>
<h2 id="後青春期的詩--后青春期的诗"><a href="https://music.douban.com/subject/3259411/">後。青春期的詩 | 后青春期的诗</a></h2>
<p>五月天 / 2008-10-23 / 专辑 / CD / 摇滚</p>
<p>9.0 ( 94647人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664205708-46036223-c88d-4ffd-88ff-888afbd98254.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%BE%8C-%E9%9D%92%E6%98%A5%E6%9C%9F%E7%9A%84%E8%A9%A9/1081381033?l=en">▶️ Apple Music</a></p>
<h2 id="是时候--its-time"><a href="https://music.douban.com/subject/5958397/">是时候 | It's Time</a></h2>
<p>孙燕姿 / 2011-03-08 / 专辑 / CD / 流行</p>
<p>8.7 ( 81241人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664205798-97ec29af-1730-4b16-9e83-1f9b9b050f9c.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%98%AF%E6%99%82%E5%80%99/1442430575?l=en">▶️ Apple Music</a></p>
<h2 id="lenka"><a href="https://music.douban.com/subject/3184419/">Lenka</a></h2>
<p>Lenka / 2008-09-23 / 专辑 / Audio CD / 流行</p>
<p>8.6 ( 83181人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664205975-676de89e-1c57-4b28-b74d-dff4c8ededb9.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/lenka-expanded-edition/1460863383?l=en">▶️ Apple Music</a></p>
<h2 id="start-from-here--从这里开始"><a href="https://music.douban.com/subject/3041487/">Start from Here | 从这里开始</a></h2>
<p>王若琳 / 2008-01-11 / 专辑 / CD / 爵士</p>
<p>8.8 ( 75301人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664206159-9abef793-a1a6-4ea7-a25e-ef32d0f960a6.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/start-from-here/307678054?l=en">▶️ Apple Music</a></p>
<h2 id="旅行的意义"><a href="https://music.douban.com/subject/1395089/">旅行的意义</a></h2>
<p>陈绮贞 / 2004-02-02 / 单曲 / CD / 流行</p>
<p>9.1 ( 98494人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664206079-9c7f33a4-a97f-4a59-bba9-d444bdfb228a.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%97%85%E8%A1%8C%E7%9A%84%E6%84%8F%E7%BE%A9-single/1229089359?l=en-GB">▶️ Apple Music</a></p>
<h2 id="太阳--immortal"><a href="https://music.douban.com/subject/3390002/">太阳 | Immortal</a></h2>
<p>陈绮贞 / 2009-01-22 / 专辑 / CD / 流行</p>
<p>8.7 ( 74979人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664206088-a049fe9c-b2e4-4353-aefd-65f75d7b63a0.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%A4%AA%E9%99%BD/1598246570?l=en">▶️ Apple Music</a></p>
<h2 id="once-soundtrack--once--电影曾经原声大碟"><a href="https://music.douban.com/subject/2131368/">Once (Soundtrack) | Once / 电影《曾经》原声大碟</a></h2>
<p>Glen Hansard,Marketa Irglova / 2007-05-22 / Soundtrack / CD / 原声</p>
<p>9.2 ( 72580人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664206346-4b33fee3-b443-4129-918e-199c055d6732.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/once-music-from-the-motion-picture/254347531?l=en">▶️ Apple Music</a></p>
<h2 id="not-going-anywhere--守候"><a href="https://music.douban.com/subject/1394765/">Not Going Anywhere | 守候</a></h2>
<p>Keren Ann / 2004-08-24 / Import / Audio CD / 民谣</p>
<p>8.9 ( 62347人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664206390-30dae134-17f9-4d6c-8a93-ffa2b805f3c8.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/not-going-anywhere/1240300677?l=en">▶️ Apple Music</a></p>
<h2 id="american-idiot"><a href="https://music.douban.com/subject/1396380/">American Idiot</a></h2>
<p>Green Day / 2004-09-21 / Explicit Lyrics / Audio CD / 摇滚</p>
<p>9.0 ( 72130人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664206483-be8b534c-1c46-4401-a47f-c0aa5faeea33.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/american-idiot/1161539183?l=en">▶️ Apple Music</a></p>
<h2 id="思念是一种病--ok"><a href="https://music.douban.com/subject/2134548/">思念是一种病 | OK</a></h2>
<p>张震岳 Csun Yuk / 2007-07-06 / 专辑 / CD / 流行</p>
<p>8.8 ( 81378人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664206580-c4c32d06-45c2-4209-aa05-73b8c1539343.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/ok/661608562?l=en">▶️ Apple Music</a></p>
<h2 id="無與倫比的美麗--无与伦比的美丽"><a href="https://music.douban.com/subject/3717116/">無與倫比的美麗 | 无与伦比的美丽</a></h2>
<p>苏打绿 / 2007-11-02 / 专辑 / CD / 流行</p>
<p>8.8 ( 89048人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664206698-2bce39cf-a530-4758-bd99-3df7e1e3978b.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%84%A1%E8%88%87%E5%80%AB%E6%AF%94%E7%9A%84%E7%BE%8E%E9%BA%97/1443209385?l=en">▶️ Apple Music</a></p>
<h2 id="亲爱的我还不知道--親愛的我還不知道"><a href="https://music.douban.com/subject/2131595/">亲爱的...我还不知道 | 親愛的...我還不知道</a></h2>
<p>张悬 / 2007-07-20 / 专辑 / CD / 流行</p>
<p>8.7 ( 64429人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664206690-53fdb594-ba51-4a75-a696-a23db26466d4.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E8%A6%AA%E6%84%9B%E7%9A%84-%E6%88%91%E9%82%84%E4%B8%8D%E7%9F%A5%E9%81%93/312524587?l=en">▶️ Apple Music</a></p>
<h2 id="城市--the-city"><a href="https://music.douban.com/subject/3801228/">城市 | The City</a></h2>
<p>张悬 / 2009-05-22 / 专辑 / CD / 流行</p>
<p>8.6 ( 62928人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664206746-c1516671-7398-4776-8427-d95ba70fb529.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%9F%8E%E5%B8%82/317557859?l=en">▶️ Apple Music</a></p>
<h2 id="o"><a href="https://music.douban.com/subject/1394590/">O</a></h2>
<p>Damien Rice / 2003 / 专辑 / CD / 流行</p>
<p>9.1 ( 52588人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664206904-59b667b8-7d22-419c-9309-ecfc7d5bd95d.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/o/41864569?l=en">▶️ Apple Music</a></p>
<h2 id="wake-me-up-when-september-ends--九月结束的时候叫醒我"><a href="https://music.douban.com/subject/1431596/">Wake Me Up When September Ends | 九月结束的时候叫醒我</a></h2>
<p>Green Day / 2005-06-13 / 单曲 / CD / 摇滚</p>
<p>9.4 ( 54233人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664207006-87df91f6-84db-4f1f-80d8-ea3aa979c90b.png" alt="image"  />


</p>
<p>nil</p>
<h2 id="叶惠美--葉惠美"><a href="https://music.douban.com/subject/1406522/">叶惠美 | 葉惠美</a></h2>
<p>周杰伦 / 2003-07-31 / 专辑 / CD / 流行</p>
<p>9.2 ( 103849人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664207024-11e3d721-7e13-4305-bc11-f3612b415722.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E8%91%89%E6%83%A0%E7%BE%8E/535824731?l=en">▶️ Apple Music</a></p>
<h2 id="七里香--common-jasmin-orange"><a href="https://music.douban.com/subject/1401853/">七里香 | Common Jasmin Orange</a></h2>
<p>周杰伦 / 2004 / 专辑 / CD / 流行</p>
<p>9.1 ( 159642人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664207089-76946c6b-bfcf-4334-b52d-d88c28d85942.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E8%91%89%E6%83%A0%E7%BE%8E/535824731?l=en">▶️ Apple Music</a></p>
<h2 id="21"><a href="https://music.douban.com/subject/5351500/">21</a></h2>
<p>Adele / 2011-01-24 / 专辑 / CD / 流行</p>
<p>9.3 ( 72900人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664207161-c5e3a421-8a38-4381-a5f7-ceebee153a3a.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/21/403037872?l=en">▶️ Apple Music</a></p>
<h2 id="my-life-will"><a href="https://music.douban.com/subject/1788174/">My Life Will...</a></h2>
<p>张悬 / 2006-06-09 / 专辑 / CD / 流行</p>
<p>8.8 ( 56634人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664207316-c4cf8f55-2297-4af4-807f-a643f7b83d2c.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/my-life-will/300117892?l=en">▶️ Apple Music</a></p>
<h2 id="寓言"><a href="https://music.douban.com/subject/1402531/">寓言</a></h2>
<p>王菲 / 2000 / 专辑 / CD / 流行</p>
<p>9.4 ( 66995人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664207334-6cc04ec8-020a-410d-973b-904748ba8a90.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%AF%93%E8%A8%80/966489223?l=en">▶️ Apple Music</a></p>
<h2 id="你在煩惱什麼--你在烦恼什么"><a href="https://music.douban.com/subject/6816154/">你在煩惱什麼 | 你在烦恼什么</a></h2>
<p>苏打绿 / 2011-11-11 / 专辑 / CD / 流行</p>
<p>9.0 ( 57675人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664207566-519cfac2-39e8-4556-9b80-88ed3bb69521.png" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E4%BD%A0%E5%9C%A8%E7%85%A9%E6%83%B1%E4%BB%80%E9%BA%BC/1461040610?l=en">▶️ Apple Music</a></p>
<h2 id="感官世界--senses-around"><a href="https://music.douban.com/subject/4738592/">感官/世界 | Senses Around</a></h2>
<p>林宥嘉 / 2009-10-30 / 专辑 / CD / 流行</p>
<p>8.6 ( 59038人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664269836-c21322a3-f883-4a1d-89c3-0319c813cdf8.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%84%9F%E5%AE%98-%E4%B8%96%E7%95%8C/547158777?l=en">▶️ Apple Music</a></p>
<h2 id="nevermind--别介意"><a href="https://music.douban.com/subject/1394568/">Nevermind | 别介意</a></h2>
<p>Nirvana / 1991 / 专辑 / CD / 摇滚</p>
<p>9.3 ( 62973人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664269974-5193065d-c934-4e83-97bb-3bd16603ab3b.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/nevermind/1440783617?l=en">▶️ Apple Music</a></p>
<h2 id="八度空间--the-eight-dimensions"><a href="https://music.douban.com/subject/1403832/">八度空间 | The Eight Dimensions</a></h2>
<p>周杰伦 / 2002-07-19 / 专辑 / CD / 流行</p>
<p>9.2 ( 87077人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664269895-8bab66e3-b354-471b-83c0-c46cddc44acb.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%85%AB%E5%BA%A6%E7%A9%BA%E9%96%93/536161722?l=en">▶️ Apple Music</a></p>
<h2 id="jay"><a href="https://music.douban.com/subject/1422300/">Jay</a></h2>
<p>周杰伦 / 2000-11-13 / 专辑 / Audio CD / 流行</p>
<p>9.3 ( 90828人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664269973-734d794b-21b2-4592-9bf6-86a11c7c500e.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E8%8C%83%E7%89%B9%E8%A5%BF/535739206?l=en">▶️ Apple Music</a></p>
<h2 id="parachutes--降落伞"><a href="https://music.douban.com/subject/1463061/">Parachutes | 降落伞</a></h2>
<p>Coldplay / 2000-07-10 / 专辑 / CD / 摇滚</p>
<p>9.2 ( 54165人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664269841-cef9ab04-da90-4b43-b1a3-bf930bb1b654.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/parachutes/1122782080?l=en">▶️ Apple Music</a></p>
<h2 id="我要的幸福--my-desired-happiness"><a href="https://music.douban.com/subject/1405028/">我要的幸福 | My Desired Happiness</a></h2>
<p>孙燕姿 / 2000-12-7 / 专辑 / CD / 流行</p>
<p>9.0 ( 60779人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664270370-e0ce1360-e4e8-4c9e-b93d-65c806850072.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%88%91%E8%A6%81%E7%9A%84%E5%B9%B8%E7%A6%8F/298837646?l=en">▶️ Apple Music</a></p>
<h2 id="还是会寂寞--还是会寂寞"><a href="https://music.douban.com/subject/1394547/">还是会寂寞 | 还是会寂寞</a></h2>
<p>陈绮贞 / 2000 / 专辑 / CD / 流行</p>
<p>9.1 ( 51164人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664270498-aa153c89-45f2-4bc5-844a-7995e395f286.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%82%84%E6%98%AF%E6%9C%83%E5%AF%82%E5%AF%9E/152200437?l=en">▶️ Apple Music</a></p>
<h2 id="let-go--展翅高飞"><a href="https://music.douban.com/subject/1394992/">Let Go | 展翅高飞</a></h2>
<p>Avril Lavigne / 2002 / Enhanced / Audio CD / 摇滚</p>
<p>8.9 ( 55425人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664270456-21f8a5b0-a592-4a7e-8481-4b41f4b4e544.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/let-go/315025768?l=en">▶️ Apple Music</a></p>
<h2 id="十一月的萧邦--novembers-chopin"><a href="https://music.douban.com/subject/1436975/">十一月的萧邦 | November's Chopin</a></h2>
<p>周杰伦 / 2005-11-01 / 专辑 / CD / 流行</p>
<p>8.9 ( 94955人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664270492-d44fb400-df3b-4449-9fe7-7bc102c42795.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/11%E6%9C%88%E7%9A%84%E8%95%AD%E9%82%A6/536009641?l=en">▶️ Apple Music</a></p>
<h2 id="橙月--orange-moon"><a href="https://music.douban.com/subject/3313612/">橙月 | Orange Moon</a></h2>
<p>方大同 / 2008-12-19 / 专辑 / CD / 放克/灵歌/R&amp;B</p>
<p>8.6 ( 49661人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664270668-e735c119-203d-4c43-9c12-0b55a3da9dc1.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%A9%99%E6%9C%88/313404785?l=en">▶️ Apple Music</a></p>
<h2 id="小宇宙--little-universe"><a href="https://music.douban.com/subject/1900796/">小宇宙 | Little Universe</a></h2>
<p>苏打绿 / 2006-10-20 / 专辑 / CD / 流行</p>
<p>8.9 ( 51741人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664271051-0122a465-9c4d-441b-a58a-ae20488bcf6c.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%B0%8F%E5%AE%87%E5%AE%99/1461046017?l=en">▶️ Apple Music</a></p>
<h2 id="若你碰到他--若你碰到他"><a href="https://music.douban.com/subject/4323489/">若你碰到他 | 若你碰到他</a></h2>
<p>蔡健雅 / 2009-08-19 / 专辑 / CD / 流行</p>
<p>8.1 ( 51151人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664270826-242ef23d-ae32-4735-afc4-2487315042e0.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E8%8B%A5%E4%BD%A0%E7%A2%B0%E5%88%B0%E4%BB%96/672641879?l=en">▶️ Apple Music</a></p>
<h2 id="lady--bird"><a href="https://music.douban.com/subject/1394763/">Lady &amp; Bird</a></h2>
<p>Lady &amp; Bird / 2003 / Import / Audio CD / 民谣</p>
<p>8.8 ( 43532人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664270894-a3d2d89d-a432-4d00-aeb3-0b4d424d92e6.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/lady-bird/1240196666?l=en">▶️ Apple Music</a></p>
<h2 id="万能青年旅店"><a href="https://music.douban.com/subject/5344708/">万能青年旅店</a></h2>
<p>万能青年旅店 / 2010-11-12 / 专辑 / CD / 摇滚</p>
<p>9.5 ( 84135人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664271119-81ab9004-4943-476e-8b0a-e5af3b860482.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E4%B8%87%E8%83%BD%E9%9D%92%E5%B9%B4%E6%97%85%E5%BA%97/1538548871?l=en">▶️ Apple Music</a></p>
<h2 id="meteora--流星圣殿"><a href="https://music.douban.com/subject/1395785/">Meteora | 流星圣殿</a></h2>
<p>Linkin Park / 2003-03-25 / Enhanced / Audio CD / 摇滚</p>
<p>9.1 ( 45142人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664271308-ce8eec50-4589-4721-b627-db0f2b77295d.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/meteora/528435845?l=en">▶️ Apple Music</a></p>
<h2 id="back-to-bedlam--不安於室"><a href="https://music.douban.com/subject/1401550/">Back To Bedlam | 不安於室</a></h2>
<p>James Blunt / 2004 / Explicit Lyrics / Audio CD / 流行</p>
<p>9.0 ( 43229人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s1461123.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/back-to-bedlam/714602877?l=en">▶️ Apple Music</a></p>
<h2 id="苏打绿同名专辑"><a href="https://music.douban.com/subject/1421488/">苏打绿同名专辑</a></h2>
<p>苏打绿,蘇打綠 / 2005年9月 / 国语 / CD / 流行</p>
<p>8.9 ( 53849人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s2360790.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E8%98%87%E6%89%93%E7%B6%A0%E5%90%8C%E5%90%8D%E5%B0%88%E8%BC%AF/1443094831?l=en">▶️ Apple Music</a></p>
<h2 id="静茹情歌-别再为他流泪--别再为他流泪"><a href="https://music.douban.com/subject/3427630/">静茹&amp;情歌 别再为他流泪 | 别再为他流泪</a></h2>
<p>梁静茹 / 2009-01-16 / 专辑 / Audio CD / 流行</p>
<p>8.5 ( 46781人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s3551584.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%88%AB%E5%86%8D%E4%B8%BA%E4%BB%96%E6%B5%81%E6%B3%AA/1095630068?l=en">▶️ Apple Music</a></p>
<h2 id="美妙生活--perfect-life"><a href="https://music.douban.com/subject/6113840/">美妙生活 | Perfect Life</a></h2>
<p>林宥嘉 / 2011-05-06 / 专辑 / CD / 流行</p>
<p>8.7 ( 48384人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664271859-d244ea46-7e74-4417-a56c-d1165b4c678c.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%BE%8E%E5%A6%99%E7%94%9F%E6%B4%BB/545213762?l=en">▶️ Apple Music</a></p>
<h2 id="le-fabuleux-destin-damélie-poulain--天使爱美丽"><a href="https://music.douban.com/subject/1394798/">Le Fabuleux destin d'Amélie Poulain | 天使爱美丽</a></h2>
<p>Yann Tiersen / 2001-04-23 / Soundtrack / Audio CD / 原声</p>
<p>9.4 ( 44514人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664271974-b020ffff-cd08-44b7-9134-618768121695.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/le-fabuleux-destin-dam%C3%A9lie-poulain-bande-originale-du-film/1575400412?l=en">▶️ Apple Music</a></p>
<h2 id="joanna--王若琳"><a href="https://music.douban.com/subject/3335374/">Joanna &amp; 王若琳</a></h2>
<p>王若琳 / 2009-01-16 / 专辑 / CD / 爵士</p>
<p>8.3 ( 43076人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664271893-97ef9a5c-5a32-4896-9378-53fc703c6dd8.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/joanna-%E7%8E%8B%E8%8B%A5%E7%90%B3/311238877?l=en">▶️ Apple Music</a></p>
<h2 id="a-plea-en-vendredi"><a href="https://music.douban.com/subject/1776145/">A Plea En Vendredi</a></h2>
<p>Tamas Wells / 2006 / Import / Audio CD / 民谣</p>
<p>9.0 ( 39351人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664272264-54ef06d3-6e9c-46b9-96ec-ca9d461d4cd6.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="to-hebe--給-自己"><a href="https://music.douban.com/subject/4935955/">To Hebe | 給 自己</a></h2>
<p>田馥甄 Hebe / 2010-09-03 / 专辑 / CD / 流行</p>
<p>8.2 ( 45022人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664272585-46959c4b-f062-4631-a8bc-d3fddbc08393.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/to-hebe/545945568?l=en">▶️ Apple Music</a></p>
<h2 id="逆光--against-the-light"><a href="https://music.douban.com/subject/2009904/">逆光 | Against the Light</a></h2>
<p>孙燕姿 / 2007-03-22 / Import / CD / 流行</p>
<p>8.6 ( 69921人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664272542-2d3e1e97-a114-470f-b0bf-1e1d766047fd.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%80%86%E5%85%89/905226289?l=en">▶️ Apple Music</a></p>
<h2 id="只爱陌生人"><a href="https://music.douban.com/subject/3590980/">只爱陌生人</a></h2>
<p>王菲 / 1999-09-10 / Import / CD / 流行</p>
<p>9.4 ( 56383人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664272622-cb5513ff-91dc-4da7-b390-c3947071e0ca.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%8F%AA%E6%84%9B%E9%99%8C%E7%94%9F%E4%BA%BA/966481932?l=en">▶️ Apple Music</a></p>
<h2 id="music-for-tourists"><a href="https://music.douban.com/subject/1960229/">Music For Tourists</a></h2>
<p>Chris Garneau / 2007-01-23 / 引进版 / Audio CD / 民谣</p>
<p>8.8 ( 39023人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664281858-b63fcadb-95ad-4309-a263-fb13d23a7037.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="the-moment--关键时刻"><a href="https://music.douban.com/subject/1402385/">The Moment | 关键时刻</a></h2>
<p>孙燕姿 / 2003-08-22 / 专辑 / CD / 流行</p>
<p>9.1 ( 42823人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664281766-2180c5dc-ed15-4644-881e-9112f1a7d665.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/the-moment/541856819?l=en">▶️ Apple Music</a></p>
<h2 id="七"><a href="https://music.douban.com/subject/1406094/">七</a></h2>
<p>陈奕迅 / 2003-11-20 / 选集 / CD / 流行</p>
<p>9.4 ( 42728人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664281812-e3e5f9c0-260b-45e5-b979-d01cc139b33d.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="春日光日光"><a href="https://music.douban.com/subject/3671026/">春·日光日光</a></h2>
<p>苏打绿 / 2009-05-08 / 专辑 / CD / 民谣</p>
<p>8.3 ( 45534人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664281716-4abb547c-bdd5-47da-b119-1a9ea0dae698.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%98%A5-%E6%97%A5%E5%85%89/1461726842?l=en">▶️ Apple Music</a></p>
<h2 id="100种生活"><a href="https://music.douban.com/subject/3039969/">100种生活</a></h2>
<p>盧廣仲 / 2008-5-27 / 专辑 / CD / 民谣</p>
<p>8.4 ( 42135人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664281718-03da8b26-a698-4e59-9ad0-3201edc8ed26.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/100%E7%A8%AE%E7%94%9F%E6%B4%BB/1601147680?l=en">▶️ Apple Music</a></p>
<h2 id="崇拜--jadore"><a href="https://music.douban.com/subject/2282388/">崇拜 | J'adore</a></h2>
<p>梁静茹 / 2007-11-09 / 专辑 / CD / 流行</p>
<p>8.5 ( 49186人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664282565-997eb77f-074a-41c7-a5f6-943bd2ba240e.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%B4%87%E6%8B%9C/1097016060?l=en">▶️ Apple Music</a></p>
<h2 id="陈绮贞精选--cheer-精选"><a href="https://music.douban.com/subject/1408468/">陈绮贞精选 | Cheer 精选</a></h2>
<p>陈绮贞 / 2005 / 选集 / CD / 民谣</p>
<p>9.2 ( 36799人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664282636-cbb9c2a0-67a0-42f1-bee7-d202ff66050f.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%99%B3%E7%B6%BA%E8%B2%9E%E7%B2%BE%E9%81%B8/661575397?l=en">▶️ Apple Music</a></p>
<h2 id="菊次郎の夏--kikujiro-1999-film"><a href="https://music.douban.com/subject/1419282/">菊次郎の夏 | Kikujiro (1999 Film)</a></h2>
<p>Joe Hisaishi / 1999-05-19 / 专辑 / CD / 原声</p>
<p>9.5 ( 49564人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664282731-4b45123c-f497-438a-8ceb-ccbd27b654de.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/kikujiro-original-motion-picture-soundtrack/1498700467?l=en">▶️ Apple Music</a></p>
<h2 id="fearless"><a href="https://music.douban.com/subject/3220185/">Fearless</a></h2>
<p>Taylor Swift / 2008-11-11 / Enhanced / Audio CD / 流行</p>
<p>8.7 ( 53119人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664282725-5c70ef68-4b39-48f2-b746-98e32e55adaa.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/fearless-platinum-edition/1440670509?l=en">▶️ Apple Music</a></p>
<h2 id="life-in-cartoon-motion"><a href="https://music.douban.com/subject/1968390/">Life In Cartoon Motion</a></h2>
<p>Mika / 2007-02-05 / 专辑 / CD / 流行</p>
<p>8.8 ( 37038人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664282790-25e976db-7d5a-4b2f-bdea-0995dbcd3ee9.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/life-in-cartoon-motion/1440802991?l=en">▶️ Apple Music</a></p>
<h2 id="hm--h3m"><a href="https://music.douban.com/subject/3603814/">H³M | H3M</a></h2>
<p>陈奕迅 / 2009-03-23 / 专辑 / CD / 流行</p>
<p>8.7 ( 44462人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664282985-cad5eecb-8546-4719-9538-e937d5f84617.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/h3m/1443774258?l=en">▶️ Apple Music</a></p>
<h2 id="神秘嘉宾--神秘嘉宾"><a href="https://music.douban.com/subject/3076388/">神秘嘉宾 | 神秘嘉宾</a></h2>
<p>林宥嘉 / 2008-06-03 / 专辑 / CD / 流行</p>
<p>8.5 ( 45772人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664282919-a698e8ea-f4fb-4ca3-9db0-0cbc8b1b9ce5.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%A5%9E%E7%A7%98%E5%98%89%E8%B3%93-mystery/547510844?l=en">▶️ Apple Music</a></p>
<h2 id="les-choristes--放牛班的春天"><a href="https://music.douban.com/subject/1394803/">Les Choristes | 放牛班的春天</a></h2>
<p>Bruno Coulais / 2004-05-03 / Soundtrack / Audio CD / 原声</p>
<p>9.5 ( 37888人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664283178-5314e9a4-c0aa-457e-ba29-cc5254439d8e.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/the-chorus-original-motion-picture-soundtrack/589789036?l=en">▶️ Apple Music</a></p>
<h2 id="赤子--innocent"><a href="https://music.douban.com/subject/3871896/">赤子 | Innocent</a></h2>
<p>范晓萱&amp;100% / 2009-08-10 / 专辑 / CD / 摇滚</p>
<p>8.2 ( 39589人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664283195-648851eb-7e03-4980-9bb3-ffe84e0fd332.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E4%B8%80%E8%B5%B7/1080301589?l=en">▶️ Apple Music</a></p>
<h2 id="9"><a href="https://music.douban.com/subject/1889074/">9</a></h2>
<p>Damien Rice / 2006-11-06 / 专辑 / Audio CD / 民谣</p>
<p>9.0 ( 36862人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664283200-1c44fc54-4d05-4339-b49e-794fbe98550d.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/9/203880553?l=en">▶️ Apple Music</a></p>
<h2 id="将爱"><a href="https://music.douban.com/subject/1401392/">将爱</a></h2>
<p>王菲 / 2003 / 专辑 / CD / 流行</p>
<p>8.9 ( 46704人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664283321-71ff8169-aa75-4f74-850d-8637c39cc28b.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%B0%87%E6%84%9B/966483493?l=en">▶️ Apple Music</a></p>
<h2 id="遇见我"><a href="https://music.douban.com/subject/1449452/">遇见我</a></h2>
<p>曹方 / 2005年12月 / 专辑 / CD / 流行</p>
<p>8.4 ( 39449人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664283506-91656fee-534b-478d-bf27-b32bcabbd132.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="梵高先生--bb"><a href="https://music.douban.com/subject/1958731/">梵高先生 | B&amp;BⅡ</a></h2>
<p>李志 / 2007-01-11 / CD / CD / 民谣</p>
<p>9.1 ( 51735人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664283770-041cfa16-c15c-4843-b736-bffbb4b62e5f.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="timeless--可啦思刻方大同-2009全新大碟-自選輯--可啦思刻"><a href="https://music.douban.com/subject/3821598/">Timeless | 可啦思刻方大同 2009全新大碟 自選輯 / 可啦思刻</a></h2>
<p>方大同 / 2009-08-11 / 自选集 / CD / 放克/灵歌/R&amp;B</p>
<p>8.4 ( 38003人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664283685-c4f168a4-2c77-49ba-b37c-0e261188142c.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%8F%AF%E5%95%A6%E6%80%9D%E5%88%BB/537029543?l=en">▶️ Apple Music</a></p>
<h2 id="依然范特西--still-fantasy"><a href="https://music.douban.com/subject/2210561/">依然范特西 | Still Fantasy</a></h2>
<p>周杰伦 / 2006-09-05 / 专辑 / CD / 流行</p>
<p>8.6 ( 71242人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664283683-c19b85ea-5794-4f65-8e43-a606c7b8c455.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E4%BE%9D%E7%84%B6%E8%8C%83%E7%89%B9%E8%A5%BF/536285027?l=en">▶️ Apple Music</a></p>
<h2 id="风筝--kite"><a href="https://music.douban.com/subject/1407437/">风筝 | Kite</a></h2>
<p>孙燕姿 / 2001-07-09 / 专辑 / CD / 流行</p>
<p>8.9 ( 44131人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664283695-b58984f6-6b0d-48fb-b2b7-7188c33e7e3a.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%A2%A8%E7%AE%8F/297994281?l=en">▶️ Apple Music</a></p>
<h2 id="完美的一天--a-perfect-day"><a href="https://music.douban.com/subject/4725615/">完美的一天 | A Perfect Day</a></h2>
<p>孙燕姿 / 2005-10-07 / 专辑 / CD / 流行</p>
<p>8.3 ( 45359人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664283852-83215e2a-3c16-4ee0-9c17-fa7ace08c499.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%AE%8C%E7%BE%8E%E7%9A%84%E4%B8%80%E5%A4%A9/255921008?l=en">▶️ Apple Music</a></p>
<h2 id="say-i-am-you"><a href="https://music.douban.com/subject/1547155/">Say I Am You</a></h2>
<p>The Weepies / 2006 / Import / Audio CD / 民谣</p>
<p>8.6 ( 39732人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664284155-40b4dfff-eca5-4cbe-9b63-4e4434f2c431.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/say-i-am-you/102807420?l=en">▶️ Apple Music</a></p>
<h2 id="黑色柳丁--black-tangerine"><a href="https://music.douban.com/subject/1395092/">黑色柳丁 | Black Tangerine</a></h2>
<p>陶喆 / 2002-08-09 / 专辑 / CD / 流行</p>
<p>9.1 ( 51691人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664284146-241fbd46-7fce-49d3-8f17-ab712f9b90ab.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%BB%91%E8%89%B2%E6%9F%B3%E4%B8%81/914664926?l=en">▶️ Apple Music</a></p>
<h2 id="under-my-skin"><a href="https://music.douban.com/subject/1394994/">Under My Skin</a></h2>
<p>Avril Lavigne / 2004-05-12 / Import / Audio CD / 摇滚</p>
<p>8.6 ( 40059人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664284187-91a8d4ef-2c76-4821-ba17-9e207e48789a.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/under-my-skin/533016327?l=en">▶️ Apple Music</a></p>
<h2 id="stefanie"><a href="https://music.douban.com/subject/1406256/">Stefanie</a></h2>
<p>孙燕姿 / 2004-10-1 / 专辑 / CD / 流行</p>
<p>8.7 ( 39004人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664290835-f419f319-ae49-4a8b-9be1-60e9eaa54cc9.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%AD%AB%E7%87%95%E5%A7%BFstefanie%E5%90%8C%E5%90%8D%E5%B0%88%E8%BC%AF/255921035?l=en-GB">▶️ Apple Music</a></p>
<h2 id="the-fame"><a href="https://music.douban.com/subject/3179585/">The Fame</a></h2>
<p>Lady Gaga / 2008-08-19 / Import / Audio CD / 流行</p>
<p>8.5 ( 42436人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664290787-efbda386-7a8d-45b9-89b9-7070282c24ad.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/the-fame/1440818588?l=en">▶️ Apple Music</a></p>
<h2 id="mr-a-z--英语老师"><a href="https://music.douban.com/subject/1823439/">Mr. A-Z | 英语老师</a></h2>
<p>Jason Mraz / 2005-07-04 / Import / Audio CD / 流行</p>
<p>9.0 ( 34498人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664290811-aab04f9d-c6a2-4684-b4b7-f08812fe9b2e.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/mr-a-z/416042620?l=en">▶️ Apple Music</a></p>
<h2 id="为爱而生--為愛而生--born-to-love"><a href="https://music.douban.com/subject/1948359/">为爱而生 | 為愛而生 / BORN TO LOVE</a></h2>
<p>五月天 / 2006-12-28 / 引进版 / CD / 流行</p>
<p>8.6 ( 40435人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664290798-c2b5d430-db52-49c0-91c8-d302ebfb125c.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%82%BA%E6%84%9B%E8%80%8C%E7%94%9F/1081397791?l=en">▶️ Apple Music</a></p>
<h2 id="daniel-powter--dp"><a href="https://music.douban.com/subject/1421922/">Daniel Powter | dp</a></h2>
<p>Daniel Powter / 2006 / 专辑 / Audio CD / 流行</p>
<p>8.7 ( 35302人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664290815-5a4f0ba7-31b4-4ebc-88c6-95f52702e41d.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/daniel-powter/63816246?l=en">▶️ Apple Music</a></p>
<h2 id="im-yours"><a href="https://music.douban.com/subject/3097879/">I'm Yours</a></h2>
<p>Jason Mraz / 2008-12-16 / Single / Audio CD / 民谣</p>
<p>9.4 ( 39203人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664291313-f6d372c8-2e77-44f6-a9c0-cb97fa821af7.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/im-yours-single/280594755?l=en">▶️ Apple Music</a></p>
<h2 id="时光漫步"><a href="https://music.douban.com/subject/1408378/">时光·漫步</a></h2>
<p>许巍 Wei Xu / 2002-12-01 / 专辑 / CD / 民谣</p>
<p>9.1 ( 38564人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664291398-ece34f03-2dcb-4a36-9a44-fbfa8663f005.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%99%82%E5%85%89-%E6%BC%AB%E6%AD%A5/905191001?l=en">▶️ Apple Music</a></p>
<h2 id="生如夏花--life-like-summer-flowers"><a href="https://music.douban.com/subject/1407656/">生如夏花 | Life Like Summer Flowers</a></h2>
<p>朴树 / 2003-11-28 / 专辑 / CD / 流行</p>
<p>9.0 ( 59817人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664291377-c9b45145-6133-4e76-a54f-cd102a46b2eb.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%94%9F%E5%A6%82%E5%A4%8F%E8%8A%B1/369655124?l=en">▶️ Apple Music</a></p>
<h2 id="我很忙--jay-chou-on-the-run"><a href="https://music.douban.com/subject/1846771/">我很忙 | JAY CHOU ON THE RUN</a></h2>
<p>周杰伦 / 2007-11-01 / 专辑 / CD / 流行</p>
<p>8.2 ( 69903人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664291307-cb1f205b-d2f4-4398-864c-10488ff69924.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%88%91%E5%BE%88%E5%BF%99/536030690?l=en">▶️ Apple Music</a></p>
<h2 id="夏--狂热fever"><a href="https://music.douban.com/subject/3838018/">夏 / 狂热Fever</a></h2>
<p>苏打绿 / 2009-09-11 / 专辑 / CD / 摇滚</p>
<p>8.7 ( 41388人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664291412-7362d9c3-1e3d-4b72-b10c-9f451b9b94a9.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%A4%8F-%E7%8B%82%E7%86%B1/1461735092?l=en">▶️ Apple Music</a></p>
<h2 id="绝世名伶"><a href="https://music.douban.com/subject/1424317/">绝世名伶</a></h2>
<p>范晓萱 / 2001-08-25 / 专辑 / CD / 爵士</p>
<p>8.8 ( 35543人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664291721-79dc6f0e-2563-44b1-a029-e39ae6fc188c.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%B5%95%E4%B8%96%E5%90%8D%E4%BC%B6/994062930?l=en">▶️ Apple Music</a></p>
<h2 id="哼一首歌-等日落"><a href="https://music.douban.com/subject/4116446/">哼一首歌 等日落</a></h2>
<p>曹方 / 2009-11-11 / 专辑 / CD / 流行</p>
<p>8.2 ( 33443人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664291697-6541292a-aa2a-496e-9f54-8928110be643.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%93%BC%E4%B8%80%E9%A6%96%E6%AD%8C%E7%AD%89%E6%97%A5%E8%90%BD/1564068486?l=en">▶️ Apple Music</a></p>
<h2 id="未完成--to-be-continued"><a href="https://music.douban.com/subject/1408461/">未完成 | To Be Continued......</a></h2>
<p>孙燕姿 / 2003-01-10 / 专辑 / CD / 流行</p>
<p>8.7 ( 37301人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664291881-3c92dbb5-ab55-4c1e-8a02-a29c44bb28ea.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%9C%AA%E5%AE%8C%E6%88%90/255920420?l=en">▶️ Apple Music</a></p>
<h2 id="ok-computer"><a href="https://music.douban.com/subject/1394653/">OK Computer</a></h2>
<p>Radiohead / 1997 / 专辑 / Audio CD / 摇滚</p>
<p>9.4 ( 43284人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664291885-d06cbf3a-b3ad-4377-b4a9-105dcc71ff26.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/ok-computer/1097861387?l=en">▶️ Apple Music</a></p>
<h2 id="born-to-die--向死而生大陆--生死相守-台"><a href="https://music.douban.com/subject/10448971/">Born to Die | 向死而生（大陆） / 生死相守 （台）</a></h2>
<p>Lana Del Rey / 2012-01-31 / 专辑 / Audio CD / 流行</p>
<p>8.8 ( 48967人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664291945-fd005e11-2020-4de8-8b78-fb388c0ce8b6.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/born-to-die/1440809572?l=en">▶️ Apple Music</a></p>
<h2 id="the-wall--迷墙"><a href="https://music.douban.com/subject/1394664/">The Wall | 迷墙</a></h2>
<p>Pink Floyd / 1979 / 专辑 / Audio CD / 摇滚</p>
<p>9.4 ( 45083人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664292176-1984fed2-7826-49d8-bcec-0adfd75a2fad.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/the-wall/1065975633?l=en">▶️ Apple Music</a></p>
<h2 id="不要停止我的音乐--the-music-wont-be-stopped"><a href="https://music.douban.com/subject/3236064/">不要停止我的音乐 | The Music Won't Be Stopped</a></h2>
<p>痛仰 / 2008-10 / 专辑 / CD / 摇滚</p>
<p>8.7 ( 46100人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664292310-438ffa63-de85-4e42-a61c-5929351b288b.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E4%B8%8D%E8%A6%81%E5%81%9C%E6%AD%A2%E6%88%91%E7%9A%84%E9%9F%B3%E6%A8%82/1656209263?l=en">▶️ Apple Music</a></p>
<h2 id="hybrid-theory--混合理论"><a href="https://music.douban.com/subject/1394771/">Hybrid Theory | 混合理论</a></h2>
<p>Linkin Park / 2000 / 专辑 / CD / 摇滚</p>
<p>9.0 ( 33231人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664292415-c6d6fff1-d690-49b1-82eb-c506f45442d0.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/hybrid-theory/528436018?l=en">▶️ Apple Music</a></p>
<h2 id="mtv-unplugged-in-new-york"><a href="https://music.douban.com/subject/1394566/">MTV Unplugged in New York</a></h2>
<p>Nirvana / 1994-11-01 / Live / Audio CD / 摇滚</p>
<p>9.6 ( 34354人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664292413-64e0a335-5f48-4425-8bca-2d55214b5bba.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/mtv-unplugged-in-new-york-live-acoustic/1440892370?l=en">▶️ Apple Music</a></p>
<h2 id="after-17"><a href="https://music.douban.com/subject/1400651/">After 17</a></h2>
<p>陈绮贞 / 2004年12月 / EP / CD / 流行</p>
<p>9.2 ( 31467人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664292416-fa709147-3269-46ca-832c-60d1152aaef1.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/after-17-single/815423735?l=en">▶️ Apple Music</a></p>
<h2 id="in-between-dreams"><a href="https://music.douban.com/subject/1395432/">In Between Dreams</a></h2>
<p>Jack Johnson / 2005-03-22 / 专辑 / Audio CD / 民谣</p>
<p>9.1 ( 29785人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664292612-9d105b9e-19df-474a-a935-24eebafde4a3.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/in-between-dreams-bonus-track-version/1440857781?l=en">▶️ Apple Music</a></p>
<h2 id="神的孩子都在跳舞"><a href="https://music.douban.com/subject/3526294/">神的孩子都在跳舞</a></h2>
<p>五月天 Mayday / 2004-11-05 / 专辑 / CD+VCD / 流行</p>
<p>9.0 ( 35355人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664292762-a4f60bee-a145-42e0-b7f2-156b16515d4b.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%A5%9E%E7%9A%84%E5%AD%A9%E5%AD%90%E9%83%BD%E5%9C%A8%E8%B7%B3%E8%88%9E/183919330?l=en">▶️ Apple Music</a></p>
<h2 id="离开地球表面jump"><a href="https://music.douban.com/subject/2150115/">离开地球表面Jump!</a></h2>
<p>五月天 / 2007-07-20 / 专辑 / CD+DVD / 流行</p>
<p>8.8 ( 41018人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664293107-31e2cd4a-a07d-475e-88fc-2ed0e4b8e6e8.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%9B%A2%E9%96%8B%E5%9C%B0%E7%90%83%E8%A1%A8%E9%9D%A2/1081738606?l=en">▶️ Apple Music</a></p>
<h2 id="不想放手--dont-want-to-let-go"><a href="https://music.douban.com/subject/3088329/">不想放手 | Don't Want to Let Go</a></h2>
<p>陈奕迅 / 2008-06-30 / 专辑 / CD / 流行</p>
<p>8.4 ( 36475人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664293030-b50a5320-1358-4402-be8c-cc4dd938077f.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E4%B8%8D%E6%83%B3%E6%94%BE%E6%89%8B/1443493887?l=en">▶️ Apple Music</a></p>
<h2 id="我的歌声里"><a href="https://music.douban.com/subject/5395505/">我的歌声里</a></h2>
<p>曲婉婷 / 2010-02-24 / 单曲 / 数字(Digital) / 流行</p>
<p>8.7 ( 46762人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s9127241.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%88%91%E7%9A%84%E6%AD%8C%E8%81%B2%E8%A3%A1-deluxe-version/1442661002?l=en">▶️ Apple Music</a></p>
<h2 id="the-legend-of-1900--海上钢琴师"><a href="https://music.douban.com/subject/1415369/">The Legend of 1900 | 海上钢琴师</a></h2>
<p>Ennio Morricone / 1999-10-12 / Soundtrack / Audio CD / 原声</p>
<p>9.5 ( 35883人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664314969-b3d2e570-48bd-482d-a3cb-f5018f685efd.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/the-legend-of-1900-original-motion-picture-soundtrack/214334120?l=en">▶️ Apple Music</a></p>
<h2 id="孤独的人是可耻的--shameful-being-left-alone"><a href="https://music.douban.com/subject/1407472/">孤独的人是可耻的 | Shameful being left alone</a></h2>
<p>张楚 / 1994 / 专辑 / CD / 摇滚</p>
<p>9.2 ( 39886人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664315047-40ae40d8-39b5-4515-9020-3d63ebc3fbcd.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%AD%A4%E7%8D%A8%E7%9A%84%E4%BA%BA%E6%98%AF%E5%8F%AF%E6%81%A5%E7%9A%84/553151287?l=en">▶️ Apple Music</a></p>
<h2 id="徐佳瑩la-la首张创作专辑--la-la首張創作專輯"><a href="https://music.douban.com/subject/3746394/">徐佳瑩La La首张创作专辑 | La La首張創作專輯</a></h2>
<p>徐佳莹 / 2009-05-29 / 专辑 / CD / 流行</p>
<p>8.4 ( 37502人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664315311-118d7def-3e1c-4e50-a88f-c5df0da6ccaf.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%BE%90%E4%BD%B3%E7%91%A9lala%E9%A6%96%E5%BC%B5%E5%89%B5%E4%BD%9C%E5%B0%88%E8%BC%AF/672648486?l=en">▶️ Apple Music</a></p>
<h2 id="the-best-damn-thing--美丽坏东西"><a href="https://music.douban.com/subject/2044199/">The Best Damn Thing | 美丽坏东西</a></h2>
<p>Avril Lavigne / 2007-04-17 / Import / Audio CD / 摇滚</p>
<p>7.9 ( 36865人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664315028-ea00afe8-370a-462f-975b-400d2af1ef4f.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/the-best-damn-thing-expanded-edition/268993318?l=en">▶️ Apple Music</a></p>
<h2 id="知足-just-my-pride-最真杰作选"><a href="https://music.douban.com/subject/1422072/">知足 just my pride 最真杰作选</a></h2>
<p>五月天 / 2005-11-18 / 专辑 / CD / 摇滚</p>
<p>9.3 ( 33223人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664315612-207dc786-ec26-45cb-8b3e-4b80ec95a2fa.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%9F%A5%E8%B6%B3-just-my-pride-%E6%9C%80%E7%9C%9F%E5%82%91%E4%BD%9C%E9%81%B8/1554431588?l=en">▶️ Apple Music</a></p>
<h2 id="1--the-beatles-1--no1"><a href="https://music.douban.com/subject/1394818/">1 | The Beatles 1 / No.1</a></h2>
<p>The Beatles / 2000 / 选集 / CD / 摇滚</p>
<p>9.5 ( 31020人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664315840-6d59fd3e-ac23-4a43-9c1d-b89659049a35.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/1/1440833098?l=en">▶️ Apple Music</a></p>
<h2 id="魔杰座--capricorn"><a href="https://music.douban.com/subject/3222423/">魔杰座 | Capricorn</a></h2>
<p>周杰伦 / 2008-10-09 / 专辑 / CD / 放克/灵歌/R&amp;B</p>
<p>7.9 ( 59439人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664315668-d1e0ace2-bd29-4e58-abc0-3bea01fabcac.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%AD%94%E6%9D%B0%E5%BA%A7/1624000713?l=en">▶️ Apple Music</a></p>
<h2 id="xy--染色体"><a href="https://music.douban.com/subject/1394600/">X&amp;Y | 染色体</a></h2>
<p>Coldplay / 2005-06-07 / 专辑 / CD / 摇滚</p>
<p>8.6 ( 34819人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664315902-8f700582-dfc7-4dc2-af6c-92a5648db23c.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/x-y/1123076757?l=en">▶️ Apple Music</a></p>
<h2 id="19"><a href="https://music.douban.com/subject/2347182/">19</a></h2>
<p>Adele / 2008-01-28 / Import / Audio CD / 放克/灵歌/R&amp;B</p>
<p>8.6 ( 35491人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664315873-7258dedb-cd13-4c1c-8c80-6b550ce63e00.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/19/270409624?l=en">▶️ Apple Music</a></p>
<h2 id="时光机--maydays-time-machine"><a href="https://music.douban.com/subject/1408748/">时光机 | mayday's time machine</a></h2>
<p>五月天 / 2003-11-11 / 专辑 / CD / 摇滚</p>
<p>9.1 ( 33602人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664316504-9ac61fa1-fa23-4e67-9faa-075b15868b34.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%99%82%E5%85%89%E6%A9%9F/153785619?l=en">▶️ Apple Music</a></p>
<h2 id="yan-zi--孙燕姿同名专辑"><a href="https://music.douban.com/subject/1405022/">Yan Zi | 孙燕姿同名专辑</a></h2>
<p>孙燕姿 / 2000-06-08 / 专辑 / CD / 流行</p>
<p>9.1 ( 34442人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664316431-bb3b26ab-f448-41d0-8f31-19e33bad07aa.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%90%8C%E5%90%8D%E5%B0%88%E8%BC%AF-remastered/990152978?l=en-GB">▶️ Apple Music</a></p>
<h2 id="time-flies--时日如飞"><a href="https://music.douban.com/subject/4706451/">Time Flies | 时日如飞</a></h2>
<p>陈奕迅 / 2010-03-12 / EP / CD+DVD / 流行</p>
<p>8.9 ( 32688人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664316466-6ef45d7d-7ba0-4f55-b0bf-67233d8cf7ed.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/time-flies-2010-ep/1443717418?l=en">▶️ Apple Music</a></p>
<h2 id="失败者的飞翔"><a href="https://music.douban.com/subject/3143363/">失败者的飞翔</a></h2>
<p>陈绮贞 / 2008-07-13 / 单曲 / CD / 流行</p>
<p>8.6 ( 29389人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664316690-fcbd43f5-7da8-4891-a8d7-7fa8deee6815.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%A4%B1%E6%95%97%E8%80%85%E7%9A%84%E9%A3%9B%E7%BF%94-single/816000160?l=en">▶️ Apple Music</a></p>
<h2 id="my-love"><a href="https://music.douban.com/subject/6722110/">My Love</a></h2>
<p>田馥甄 / 2011-09-02 / 专辑 / CD / 流行</p>
<p>8.4 ( 35566人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664316688-45dd22f9-7aa9-4932-bae4-7ca9499f6df6.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/my-love/544154095?l=en-GB">▶️ Apple Music</a></p>
<h2 id="亲亲--親親"><a href="https://music.douban.com/subject/1891318/">亲亲 | 親親</a></h2>
<p>梁静茹 / 2006-10-06 / 专辑 / CD / 流行</p>
<p>8.2 ( 34393人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s1876827.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/my-love/544154095?l=en">▶️ Apple Music</a></p>
<h2 id="你王菲所以我王菲"><a href="https://music.douban.com/subject/1769327/">你王菲所以我王菲</a></h2>
<p>王菲 / 2002 / 选集 / CD / 流行</p>
<p>9.5 ( 35275人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s2951748.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E4%BA%B2%E4%BA%B2/1095245171?l=en">▶️ Apple Music</a></p>
<h2 id="stranger-under-my-skin"><a href="https://music.douban.com/subject/6082657/">Stranger Under My Skin</a></h2>
<p>陈奕迅 / 2011-02-22 / EP / CD / 流行</p>
<p>8.8 ( 31725人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s4644120.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/stranger-under-my-skin/1443711302?l=en">▶️ Apple Music</a></p>
<h2 id="come-away-with-me--远走高飞"><a href="https://music.douban.com/subject/1394747/">Come Away with Me | 远走高飞</a></h2>
<p>Norah Jones / 2002 / 专辑 / CD / 爵士</p>
<p>8.9 ( 30541人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664317124-06f5f0fc-e45f-48eb-9fba-66fc5c899162.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/come-away-with-me-remastered/1624173298?l=en">▶️ Apple Music</a></p>
<h2 id="平凡之路--电影后会无期宣传曲"><a href="https://music.douban.com/subject/25927970/">平凡之路 | 电影《后会无期》宣传曲</a></h2>
<p>朴树 / 2014-07-16 / 单曲 /</p>
<p>数字(Digital) / 原声 9.1 ( 79295人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664317148-ff5df9c4-e08d-491f-822f-2c91a6ff7ac1.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="认了吧--admit-it"><a href="https://music.douban.com/subject/2052256/">认了吧 | Admit it</a></h2>
<p>陈奕迅 / 2007-04-24 / 专辑 / CD / 流行</p>
<p>8.9 ( 37928人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664317286-1e8774f3-31a3-4966-ab4c-3c7010e235e6.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E8%AA%8D%E4%BA%86%E5%90%A7-%E5%8F%B0%E7%81%A3%E7%89%88/1443352354?l=en">▶️ Apple Music</a></p>
<h2 id="21st-century-breakdown"><a href="https://music.douban.com/subject/3533452/">21st Century Breakdown</a></h2>
<p>Green Day / 2009-05-15 / 专辑 / CD / 摇滚</p>
<p>8.7 ( 30578人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664317389-30076337-8816-4dde-87af-265c5d5a11a8.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/21st-century-breakdown/1156538220?l=en">▶️ Apple Music</a></p>
<h2 id="神的游戏--games-we-play--神的遊戲"><a href="https://music.douban.com/subject/11027027/">神的游戏 | Games We Play / 神的遊戲</a></h2>
<p>張懸 / 2012-08-10 / 专辑 / CD / 流行</p>
<p>9.1 ( 39638人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664317514-d8c15d58-bf50-4816-8625-2839241a45be.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%A5%9E%E7%9A%84%E9%81%8A%E6%88%B2/547978486?l=en">▶️ Apple Music</a></p>
<h2 id="唱游"><a href="https://music.douban.com/subject/1394808/">唱游</a></h2>
<p>王菲 / 1998 / 专辑 / CD / 流行</p>
<p>9.4 ( 39092人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664317599-fc1b98d0-4097-44ab-82b2-5ecc34f8534a.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%94%B1%E9%81%8A/965771664?l=en">▶️ Apple Music</a></p>
<h2 id="花的姿态演唱会经典实录--花的姿態經典實錄精裝版2cddvd"><a href="https://music.douban.com/subject/2078050/">花的姿态：演唱会经典实录 | 花的姿態經典實錄精裝版2CD+DVD</a></h2>
<p>陈绮贞 / 2007-05-18 / 演唱会/Live / CD DVD / 民谣</p>
<p>9.3 ( 26500人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664324658-a855c6c7-a6b5-411a-ad30-c7d0de953a1d.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E8%8A%B1%E7%9A%84%E5%A7%BF%E6%80%81%E6%BC%94%E5%94%B1%E4%BC%9A%E7%BB%8F%E5%85%B8%E5%AE%9E%E5%BD%95/1601807862?l=en">▶️ Apple Music</a></p>
<h2 id="我去2000年"><a href="https://music.douban.com/subject/1405324/">我去2000年</a></h2>
<p>朴树 / 1999-1 / 专辑 / CD / 流行</p>
<p>9.4 ( 44055人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664324571-1fe0cab1-eca2-4b08-8449-1020dea5ad00.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%88%91%E5%8E%BB2000%E5%B9%B4/1063212942?l=en">▶️ Apple Music</a></p>
<h2 id="young-for-you"><a href="https://music.douban.com/subject/1758337/">Young For You</a></h2>
<p>GALA / 2004 / 专辑 / CD / 摇滚</p>
<p>8.8 ( 30290人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664324647-256da2b4-a0a2-4e9b-8906-5b79fe6f16d7.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/young-for-you/1678931109?l=en-GB">▶️ Apple Music</a></p>
<h2 id="自选集--start-yan-zi"><a href="https://music.douban.com/subject/1405050/">自选集 | Start Yan-zi</a></h2>
<p>孙燕姿 / 2002年1月 / 专辑 / CD / 流行</p>
<p>9.0 ( 29171人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664324654-73a05a52-07b6-42bc-ba06-76b18440d85f.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E8%87%AA%E9%81%B8%E9%9B%86/255923688?l=en">▶️ Apple Music</a></p>
<h2 id="理性与感性-作品音乐会--sense-and-sensibility"><a href="https://music.douban.com/subject/2266925/">理性与感性 作品音乐会 | Sense and Sensibility</a></h2>
<p>李宗盛 Jonathan / 2007-09-28 / 专辑 / CD / 流行</p>
<p>9.6 ( 28244人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664324590-2875c488-92bf-4807-a952-c5b09e632947.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%9D%8E%E5%AE%97%E7%9B%9B%E7%9A%84%E7%90%86%E6%80%A7%E8%88%87%E6%84%9F%E6%80%A7%E4%BD%9C%E5%93%81%E9%9F%B3%E6%A8%82%E6%9C%83/1329432176?l=en">▶️ Apple Music</a></p>
<h2 id="比天空还远"><a href="https://music.douban.com/subject/2350942/">比天空还远</a></h2>
<p>曹方 / 2007-11-20 / EP / CD / 流行</p>
<p>8.5 ( 27597人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664325614-9d05da08-2cd6-455c-af14-1839ea98f46f.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%AF%94%E5%A4%A9%E7%A9%BA%E9%82%84%E9%81%A0-ep/1564061786?l=en">▶️ Apple Music</a></p>
<h2 id="黑梦"><a href="https://music.douban.com/subject/2299845/">黑梦</a></h2>
<p>窦唯 / 1994-10 / 专辑 / CD / 摇滚</p>
<p>9.4 ( 41855人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664325299-f6c103fd-fd57-4556-b4ec-a4fc6280238b.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%BB%91%E5%A4%A2/158796449?l=en">▶️ Apple Music</a></p>
<h2 id="不能说的秘密--不能說的秘密"><a href="https://music.douban.com/subject/2164654/">不能说的秘密 | 不能說的秘密</a></h2>
<p>周杰倫,Terdsak Janpan,詹宇豪,陳承麒,黃婉琦,姚蘇蓉,黃俊郎,江語晨,長榮交響樂團 / 2007-08-13 / Soundtrack / CD / 原声</p>
<p>9.1 ( 45209人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s2652097.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E4%B8%8D%E8%83%BD%E8%AA%AC%E7%9A%84%E7%A7%98%E5%AF%86-original-soundtrack/1624051140?l=en">▶️ Apple Music</a></p>
<h2 id="丝路--通往爱的路途"><a href="https://music.douban.com/subject/1427941/">丝路 | 通往爱的路途</a></h2>
<p>梁静茹 Fish / 2005-9-16 / 专辑 / CD / 流行</p>
<p>8.3 ( 32166人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s1966952.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%B5%B2%E8%B7%AF/151338382?l=en">▶️ Apple Music</a></p>
<h2 id="all-the-lost-souls"><a href="https://music.douban.com/subject/2153935/">All The Lost Souls</a></h2>
<p>James Blunt / 2007-09-18 / Import / Audio CD / 流行</p>
<p>8.6 ( 26484人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s2609413.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/all-the-lost-souls-deluxe/714586416?l=en">▶️ Apple Music</a></p>
<h2 id="fir"><a href="https://music.douban.com/subject/1408794/">F.I.R.</a></h2>
<p>飞儿乐团 F.I.R. / 2004-04-29 / 专辑 / CD / 摇滚</p>
<p>8.9 ( 41045人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s4124010.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%A3%9B%E5%85%92%E6%A8%82%E5%9C%98/255920685?l=en">▶️ Apple Music</a></p>
<h2 id="上五楼的快活"><a href="https://music.douban.com/subject/4009831/">上五楼的快活</a></h2>
<p>陈奕迅 / 2009-09-23 / 专辑 / CD / 流行</p>
<p>7.8 ( 29505人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664325851-2bc14503-f222-46a6-967e-c4905ef67663.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E4%B8%8A%E4%BA%94%E6%A8%93%E7%9A%84%E5%BF%AB%E6%B4%BB/1442260565?l=en">▶️ Apple Music</a></p>
<h2 id="minutes-to-midnight"><a href="https://music.douban.com/subject/2042799/">Minutes to Midnight</a></h2>
<p>Linkin Park / 2007-05-15 / 专辑 / CD / 摇滚</p>
<p>8.4 ( 27501人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664326025-ef37cf53-dd39-456d-9ed1-94708f396778.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/minutes-to-midnight-deluxe-edition/1622307157?l=en">▶️ Apple Music</a></p>
<h2 id="goodbye--hello"><a href="https://music.douban.com/subject/2264207/">GOODBYE &amp; HELLO</a></h2>
<p>蔡健雅,Tanya / 2007-10-19 / 专辑 / CD / 流行</p>
<p>8.6 ( 28081人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664326019-b203b517-724a-4608-955a-c2297b67c73f.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/goodbye-hello/672617526?l=en">▶️ Apple Music</a></p>
<h2 id="someone-like-you"><a href="https://music.douban.com/subject/6064884/">Someone Like You</a></h2>
<p>Adele / 2011-01-24 / 单曲 /</p>
<p>数字(Digital) / 放克/灵歌/R&amp;B 9.5 ( 40674人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664326345-a5c38f0d-0ceb-4513-ac9f-beefac95c978.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="迟到千年"><a href="https://music.douban.com/subject/1875211/">迟到千年</a></h2>
<p>苏打绿 / 2006-09-18 / EP / CD / 流行</p>
<p>9.0 ( 27165人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664326410-839c4e79-555e-42e3-8a29-8372ac2c1d60.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%81%B2%E5%88%B0%E5%8D%83%E5%B9%B4-single/1475228248?l=en">▶️ Apple Music</a></p>
<h2 id="the-dark-side-of-the-moon"><a href="https://music.douban.com/subject/1395685/">The Dark Side of the Moon</a></h2>
<p>Pink Floyd / 1973 / 专辑 / 黑胶 / 摇滚</p>
<p>9.5 ( 45690人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664326619-83127c01-4664-4ab8-886a-4acdc0175f2a.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/the-dark-side-of-the-moon/1065973699?l=en">▶️ Apple Music</a></p>
<h2 id="王菲--faye-wong-2001"><a href="https://music.douban.com/subject/3837067/">王菲 | Faye Wong 2001</a></h2>
<p>王菲 / 2001 / 专辑 / CD / 流行</p>
<p>9.2 ( 31937人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664326635-1248dac7-85a0-49c9-a1fa-fdd9911f9eec.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%8E%8B%E8%8F%B22001/966478364?l=en">▶️ Apple Music</a></p>
<h2 id="夜空中最亮的星"><a href="https://music.douban.com/subject/6974122/">夜空中最亮的星</a></h2>
<p>逃跑计划 / 2011-04-12 / 单曲 /</p>
<p>数字(Digital) / 摇滚 9.2 ( 60184人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664326664-e8ef8692-01df-46c6-afee-a27d136dae5b.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="追梦痴子心"><a href="https://music.douban.com/subject/6047523/">追梦痴子心</a></h2>
<p>GALA / 2011-03-24 / 专辑 / CD / 摇滚</p>
<p>8.9 ( 36650人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664327135-83af5816-fbe1-4359-a504-53db8376d7f9.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E8%BF%BD%E5%A4%A2%E7%97%B4%E5%AD%90%E5%BF%83/1181339803?l=en">▶️ Apple Music</a></p>
<h2 id="宝贝"><a href="https://music.douban.com/subject/4884299/">宝贝</a></h2>
<p>莫文蔚 / 2010-07-26 / 专辑 / CD / 流行</p>
<p>8.0 ( 27226人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664327230-b98cbbc4-527a-4081-8f85-a2d13596d84b.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%AE%9D%E8%B4%9D-2nd-edition/1656868716?l=en">▶️ Apple Music</a></p>
<h2 id="黑白灰--black-white--grey--黑白灰"><a href="https://music.douban.com/subject/1401759/">黑白灰 | Black, White &amp; Grey / 黑·白·灰</a></h2>
<p>陈奕迅 / 2003 / 专辑 / CD / 流行</p>
<p>9.1 ( 27667人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664327356-e61f9262-10ed-4d85-bfd1-a8692bdc9f59.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%BB%91-%E7%99%BD-%E7%81%B0/542923554?l=en">▶️ Apple Music</a></p>
<h2 id="安和桥北--献给张先诺先生"><a href="https://music.douban.com/subject/25709562/">安和桥北 | 献给张先诺先生</a></h2>
<p>宋冬野 / 2013-08-26 / 专辑 / CD / 民谣</p>
<p>8.9 ( 46048人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664327381-2dd4bd5c-76da-4d7e-a8c1-bbc28f8cebd2.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%AE%89%E5%92%8C%E6%A1%A5%E5%8C%97/1437746477?l=en">▶️ Apple Music</a></p>
<h2 id="prisoner-of-love--爱情的俘虏"><a href="https://music.douban.com/subject/3035043/">Prisoner of Love | 爱情的俘虏</a></h2>
<p>宇多田ヒカル / 2008-05-21 / CD IMPORT / Audio CD / 流行</p>
<p>9.3 ( 26585人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664327353-3c79181a-d0b1-4bc8-aedd-e1bd171d0def.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/prisoner-of-love-ep/1444873685?l=en-GB">▶️ Apple Music</a></p>
<h2 id="groupies-吉他手--groupies"><a href="https://music.douban.com/subject/1394549/">Groupies 吉他手 | Groupies</a></h2>
<p>陈绮贞 / 2002-08-02 / 专辑 / CD / 流行</p>
<p>9.3 ( 30585人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s3268875.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/prisoner-of-love-ep/1444873685?l=en">▶️ Apple Music</a></p>
<h2 id="now-the-day-is-over--美好的一天"><a href="https://music.douban.com/subject/1404703/">Now The Day Is Over | 美好的一天</a></h2>
<p>The Innocence Mission / 2004 / 专辑 / CD / 民谣</p>
<p>8.5 ( 24692人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s1506405.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%90%89%E4%BB%96%E6%89%8B/152197399?l=en">▶️ Apple Music</a></p>
<h2 id="apologize--抱歉"><a href="https://music.douban.com/subject/2285727/">Apologize | 抱歉</a></h2>
<p>Timbaland,OneRepublic / 2007-11-06 / Single / Audio CD / 放克/灵歌/R&amp;B</p>
<p>9.2 ( 32971人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s6780751.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/now-the-day-is-over/270127395?l=en">▶️ Apple Music</a></p>
<h2 id="阿菲正传--阿菲正傳"><a href="https://music.douban.com/subject/3815932/">阿菲正传 | 阿菲正傳</a></h2>
<p>王菲 / 2009-06-25 / 选集 / CD / 流行</p>
<p>9.4 ( 26218人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s3850703.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%98%BF%E8%8F%B2%E6%AD%A3%E5%82%B3/1443424435?l=en">▶️ Apple Music</a></p>
<h2 id="跨时代"><a href="https://music.douban.com/subject/4820650/">跨时代</a></h2>
<p>周杰伦 / 2010-05-14 / 专辑 / CD / 流行</p>
<p>7.8 ( 41601人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s4364499.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E8%B7%A8%E6%99%82%E4%BB%A3/536247746?l=en">▶️ Apple Music</a></p>
<h2 id="leave--離開"><a href="https://music.douban.com/subject/1949354/">Leave | 離開</a></h2>
<p>孙燕姿 / 2002-5-21 / 专辑 / CD / 流行</p>
<p>8.8 ( 27012人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664335087-6931ea7b-fc7e-406e-9f92-acbcaec411a4.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/leave/541825411?l=en">▶️ Apple Music</a></p>
<h2 id="被禁忌的游戏"><a href="https://music.douban.com/subject/1933017/">被禁忌的游戏</a></h2>
<p>李志 / 2004-12 / 专辑 / CD / 民谣</p>
<p>9.0 ( 29948人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664335236-23d91e63-bbee-486f-8d00-ababaa293242.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="whats-going-on"><a href="https://music.douban.com/subject/1920622/">What's Going On.&hellip;?</a></h2>
<p>陈奕迅 / 2006 / 专辑 / CD / 流行</p>
<p>9.3 ( 29133人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664335193-aa490b5f-c709-4e18-bde2-af809350669b.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/whats-going-on/1443345687?l=en">▶️ Apple Music</a></p>
<h2 id="第二人生-末日版--second-round---no-where"><a href="https://music.douban.com/subject/7065468/">第二人生 末日版 | SECOND ROUND - NO WHERE</a></h2>
<p>五月天 / 2011-12-20 / 专辑 / CD / 流行</p>
<p>9.2 ( 26729人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664335264-50a97b68-f480-4042-970d-170825076b1f.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%AC%AC%E4%BA%8C%E4%BA%BA%E7%94%9F-%E6%9C%AB%E6%97%A5%E7%89%88/1081297124?l=en">▶️ Apple Music</a></p>
<h2 id="樂之路--ultrasound-1997-2003--乐之路"><a href="https://music.douban.com/subject/1407536/">樂之路 | Ultrasound 1997-2003 / 乐之路</a></h2>
<p>陶喆 / 2003-08-08 / 选集 / CD / 流行</p>
<p>9.2 ( 26071人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664335274-c06cdfbf-246d-4b0e-9d49-09f360bf2e09.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%A8%82%E4%B9%8B%E8%B7%AF/1372031877?l=en">▶️ Apple Music</a></p>
<h2 id="it-wont-be-soon-before-long--it-wont-be-soon-before-long"><a href="https://music.douban.com/subject/2032823/">It Won't Be Soon Before Long | It Won't Be Soon Before Long</a></h2>
<p>Maroon 5 / 2007-05-22 / 专辑 / CD / 流行</p>
<p>8.4 ( 25476人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664335520-fedacb47-c078-416f-b9f9-969ab56f7e13.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/it-wont-be-soon-before-long/1440744741?l=en">▶️ Apple Music</a></p>
<h2 id="如果你冷--如果你冷"><a href="https://music.douban.com/subject/3264192/">如果你冷 | 如果你冷</a></h2>
<p>张悬 / 2008-10-20 / Bootleg / 数字 / 民谣</p>
<p>8.5 ( 26320人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664335614-72d4bc8e-bfe0-49b7-8281-d886afa0021a.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="陌生人"><a href="https://music.douban.com/subject/1408650/">陌生人</a></h2>
<p>蔡健雅 Tanya Chua / 2003-06-00 / 专辑 / CD / 流行</p>
<p>8.7 ( 26152人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664335738-9142bd9f-131f-461b-9b76-2abd30c3a63a.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%99%8C%E7%94%9F%E4%BA%BA/297906289?l=en">▶️ Apple Music</a></p>
<h2 id="浮躁"><a href="https://music.douban.com/subject/1395176/">浮躁</a></h2>
<p>王菲 / 1996 / Audio CD / 流行</p>
<p>9.4 ( 37119人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664335791-d5ceec9f-0555-43c4-b3d4-ae023898adc1.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/eco-pack-%E6%B5%AE%E8%BA%81/1443287350?l=en">▶️ Apple Music</a></p>
<h2 id="cest-la-vie--这就是生活"><a href="https://music.douban.com/subject/1442576/">C'est La Vie | 这就是生活</a></h2>
<p>自然卷 / 2004 / 专辑 / CD / 民谣</p>
<p>8.3 ( 24874人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664335821-d4b7cf86-e094-4135-a6b9-e14000069746.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="在一起--together"><a href="https://music.douban.com/subject/5355197/">在一起 | Together</a></h2>
<p>刘若英 / 2010-04-16 / 专辑 / CD / 流行</p>
<p>7.9 ( 24721人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664336044-801a127b-3eab-480c-9677-60110ab357df.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%9C%A8%E4%B8%80%E8%B5%B7/1092407531?l=en">▶️ Apple Music</a></p>
<h2 id="these-friends-of-mine"><a href="https://music.douban.com/subject/1999781/">These Friends Of Mine</a></h2>
<p>Rosie Thomas / 2007-03-13 / 专辑 / Audio CD / 民谣</p>
<p>8.8 ( 23227人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664336055-0bd782df-150a-43b4-8e2f-d140925aa54f.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/these-friends-of-mine-expanded-edition/1598408766?l=en-GB">▶️ Apple Music</a></p>
<h2 id="陪我歌唱--苏打绿台北小巨蛋演唱会live-cd陪我歌唱"><a href="https://music.douban.com/subject/3226297/">陪我歌唱 | 苏打绿台北小巨蛋演唱会Live Cd:陪我歌唱</a></h2>
<p>苏打绿 / 2008 / 引进版 / CD</p>
<p>9.2 ( 23965人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664336156-05a4dbb0-4260-4b16-ad8e-08cd47b6a236.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%99%AA%E6%88%91%E6%AD%8C%E5%94%B1-live/1461050682?l=en-GB">▶️ Apple Music</a></p>
<h2 id="its-not-me-its-you--非我即你"><a href="https://music.douban.com/subject/3770091/">It＇s Not Me It＇s You | 非我即你</a></h2>
<p>Lily Allen / 2009-02-09 / 专辑 / Audio CD / 流行</p>
<p>8.2 ( 24122人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s4716636.jpg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%99%AA%E6%88%91%E6%AD%8C%E5%94%B1-live/1461050682?l=en">▶️ Apple Music</a></p>
<h2 id="the-rosei-love-cinemas"><a href="https://music.douban.com/subject/2977909/">The Rose~I Love Cinemas~</a></h2>
<p>手嶌葵 / 2008-03-05 / Import / CD / 流行</p>
<p>9.3 ( 24179人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s2969728.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/its-not-me-its-you/732024535?l=en">▶️ Apple Music</a></p>
<h2 id="我爱南京"><a href="https://music.douban.com/subject/4060882/">我爱南京</a></h2>
<p>李志 / 2009-10-16 / 专辑 / CD / 民谣</p>
<p>8.9 ( 32777人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s4008894.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/la-vie-en-rose-i-love-cinemas/1609484079?l=en">▶️ Apple Music</a></p>
<h2 id="消失的光年--消失的光年"><a href="https://music.douban.com/subject/2144752/">消失的光年 | 消失的光年</a></h2>
<p>大乔小乔 / 2007-07-12 / 平装版 / CD / 民谣</p>
<p>8.3 ( 23581人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s2616588.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%B6%88%E5%A4%B1%E7%9A%84%E5%85%89%E5%B9%B4/1728807828?l=en-GB">▶️ Apple Music</a></p>
<h2 id="还有别的办法吗"><a href="https://music.douban.com/subject/1439133/">还有别的办法吗</a></h2>
<p>范晓萱 / 2004 / 专辑 / CD / 流行</p>
<p>8.7 ( 22928人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s1399764.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E8%BF%98%E6%9C%89%E5%88%AB%E7%9A%84%E5%8A%9E%E6%B3%95%E5%90%97/1080303347?l=en">▶️ Apple Music</a></p>
<h2 id="日光倾城"><a href="https://music.douban.com/subject/2058669/">日光倾城</a></h2>
<p>卡奇社 / 2007-04-20 / 专辑 / CD / 流行</p>
<p>8.2 ( 24481人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664336641-34105e2d-9427-42d9-8536-0cfe63065678.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%97%A5%E5%85%89%E5%80%BE%E5%9F%8E/1663150375?l=en">▶️ Apple Music</a></p>
<h2 id="a-little-love--一点爱"><a href="https://music.douban.com/subject/3566603/">A Little Love | 一点爱</a></h2>
<p>冯曦妤 / 2008-11-20 / 专辑 / CD / 流行</p>
<p>8.5 ( 23442人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664336876-88f291c4-954d-48e0-8d48-80394187677c.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/a-little-love/299850343?l=en">▶️ Apple Music</a></p>
<h2 id="yellow--黄色"><a href="https://music.douban.com/subject/1458367/">Yellow | 黄色</a></h2>
<p>Coldplay / 2000-07-03 / EP / Audio CD / 摇滚</p>
<p>9.5 ( 37346人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664345419-70cf462d-3af1-4737-95ca-843a894cad8b.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/yellow-single/695721212?l=en">▶️ Apple Music</a></p>
<h2 id="hopes-and-fears"><a href="https://music.douban.com/subject/1395452/">Hopes And Fears</a></h2>
<p>Keane / 2004 / 专辑 / Audio CD / 摇滚</p>
<p>8.9 ( 22915人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664345425-6010c07c-6585-4256-94f8-b48bc54e9443.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/hopes-and-fears/1440798025?l=en">▶️ Apple Music</a></p>
<h2 id="u87"><a href="https://music.douban.com/subject/1394541/">U87</a></h2>
<p>陈奕迅 / 2005-06-07 / 专辑 / CD+DVD / 流行</p>
<p>9.4 ( 29071人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664345436-47655480-5a77-47db-992a-22aa1cc845a1.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/u-87/1443374875?l=en">▶️ Apple Music</a></p>
<h2 id="lady-sleep--睡美人"><a href="https://music.douban.com/subject/1419566/">Lady Sleep | 睡美人</a></h2>
<p>Maximilian Hecker / 2005 / Import / Audio CD / 摇滚</p>
<p>8.8 ( 21513人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664345417-c3025373-8d3d-4215-a586-fcf1b60325cc.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/lady-sleep/1475889291?l=en-GB">▶️ Apple Music</a></p>
<h2 id="天空の城ラピュタ-サウンドトラック-飛行石の謎--天空之城-原声碟"><a href="https://music.douban.com/subject/1395762/">天空の城ラピュタ サウンドトラック 飛行石の謎 | 天空之城 原声碟</a></h2>
<p>久石譲(Joe Hisaishi),杉並児童合唱団,井上杏美 / 1993-12-21 / Soundtrack / Audio CD / 原声</p>
<p>9.6 ( 26336人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664345430-87cc570a-1e0d-455a-929a-15697ddc7e83.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/castle-in-the-sky-original-soundtrack/882407903?l=en">▶️ Apple Music</a></p>
<h2 id="新长征路上的摇滚"><a href="https://music.douban.com/subject/1394742/">新长征路上的摇滚</a></h2>
<p>崔健 / 1989 / 专辑 / CD / 摇滚</p>
<p>9.4 ( 31792人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664345890-e6b3faf3-4800-4739-9f27-6f5fba29f239.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%96%B0%E9%95%BF%E5%BE%81%E8%B7%AF%E4%B8%8A%E7%9A%84%E6%91%87%E6%BB%9A/1585625540?l=en">▶️ Apple Music</a></p>
<h2 id="小飞行"><a href="https://music.douban.com/subject/3567851/">小飞行</a></h2>
<p>棉花糖,katncandix2 / 2009-05-01 / 专辑 / CD / 民谣</p>
<p>8.0 ( 22804人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664346127-dfbf1ce8-da7f-4795-8a77-4133cd4784ca.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%B0%8F%E9%A3%9B%E8%A1%8C/683098218?l=en">▶️ Apple Music</a></p>
<h2 id="春生"><a href="https://music.douban.com/subject/10831759/">春生</a></h2>
<p>好妹妹乐队 / 2012-07-01 / 专辑 / CD / 民谣</p>
<p>8.9 ( 23906人评价</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664346086-ab88a83b-66fb-48f3-b867-8094f83ab49c.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%98%A5%E7%94%9F/1595226668?l=en">▶️ Apple Music</a></p>
<h2 id="讓我想一想--让我想一想"><a href="https://music.douban.com/subject/1788941/">讓我想一想 | 让我想一想</a></h2>
<p>陈绮贞 / 1998-07-14 / 专辑 / CD / 民谣</p>
<p>9.1 ( 24812人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664346107-4cfac7d7-7dc5-4205-96c3-374fc1250e42.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E8%AE%93%E6%88%91%E6%83%B3%E4%B8%80%E6%83%B3/152235788?l=en">▶️ Apple Music</a></p>
<h2 id="未来--wonderland"><a href="https://music.douban.com/subject/2359692/">未来 | Wonderland</a></h2>
<p>方大同 / 2007-12-28 / 专辑 / CD / 放克/灵歌/R&amp;B</p>
<p>8.4 ( 23802人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664346124-4f62857f-96ba-4c5f-bada-adf089176c54.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%9C%AA%E4%BE%86/272875165?l=en">▶️ Apple Music</a></p>
<h2 id="爱爱爱--愛愛愛--this-love"><a href="https://music.douban.com/subject/1950025/">爱爱爱 | 愛愛愛 / THIS LOVE</a></h2>
<p>方大同 / 2006-12 / 专辑 / CD / 流行</p>
<p>8.7 ( 25456人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664346415-61931118-c0a0-4c33-8e2a-5d5f035158d6.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%84%9B%E6%84%9B%E6%84%9B/220365864?l=en">▶️ Apple Music</a></p>
<h2 id="世界--earth"><a href="https://music.douban.com/subject/10430415/">世界 | Earth</a></h2>
<p>逃跑计划 / 2014-12-09 / 专辑 / CD / 摇滚</p>
<p>9.0 ( 26819人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664346464-f2acbe40-fd0a-478d-9860-6b8740b499ed.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E4%B8%96%E7%95%8C/1542187294?l=en-GB">▶️ Apple Music</a></p>
<h2 id="七天--盧廣仲-crowd-lu-2009-new-album-2009-全新創作專輯"><a href="https://music.douban.com/subject/4032611/">七天 | 盧廣仲 Crowd Lu 2009 New Album 2009 全新創作專輯</a></h2>
<p>盧廣仲,卢广仲 / 2009-10-30 / 专辑 / CD / 民谣</p>
<p>7.9 ( 22531人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s4039256.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E4%B8%96%E7%95%8C/1542187294?l=en">▶️ Apple Music</a></p>
<h2 id="nirvana"><a href="https://music.douban.com/subject/1416697/">Nirvana</a></h2>
<p>Nirvana / 2002-10-29 / Extra tracks / Audio CD / 摇滚</p>
<p>9.3 ( 22711人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/s3020073.jpg" alt="img"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E4%B8%83%E5%A4%A9/1601755025?l=en">▶️ Apple Music</a></p>
<p>nil</p>
<h2 id="a-rush-of-blood-to-the-head"><a href="https://music.douban.com/subject/1455695/">A Rush of Blood to the Head</a></h2>
<p>Coldplay / 2002 / 专辑 / Audio CD / 摇滚</p>
<p>8.8 ( 25535人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664346554-79dae34e-e28f-4082-948b-392235132f17.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/a-rush-of-blood-to-the-head/1122775993?l=en">▶️ Apple Music</a></p>
<h2 id="the-velvet-underground--nico--地下丝绒与妮可"><a href="https://music.douban.com/subject/1986653/">The Velvet Underground &amp; Nico | 地下丝绒与妮可</a></h2>
<p>The Velvet Underground,Nico / 1967-04 / 专辑 / CD / 摇滚</p>
<p>9.3 ( 31513人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664346781-444c2d07-2c04-463c-a7cb-3538da09db64.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/the-velvet-underground-nico-45th-anniversary-edition/1440851613?l=en">▶️ Apple Music</a></p>
<h2 id="love-the-way-you-lie"><a href="https://music.douban.com/subject/5322559/">Love The Way You Lie</a></h2>
<p>Eminem,Rihanna / 2010-08-20 / Single / Audio CD / 说唱</p>
<p>9.3 ( 28411人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664346807-76196291-1afd-4724-88b3-f96c1774b2fb.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="天空--sky"><a href="https://music.douban.com/subject/1776070/">天空 | Sky</a></h2>
<p>王菲 / 1994 / 专辑 / CD / 流行</p>
<p>9.4 ( 29503人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664346909-a3791c86-1102-463b-ba8a-a45fe83656ea.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%A4%A9%E7%A9%BA/1443363496?l=en">▶️ Apple Music</a></p>
<h2 id="the-boat-that-rocked"><a href="https://music.douban.com/subject/3788747/">The Boat That Rocked</a></h2>
<p>Original Soundtrack / 2009-03-30 / Import / Soundtrack / CD / 原声</p>
<p>9.3 ( 20223人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664346896-ad0df3b0-dca3-4965-8fa0-7c924a17f78d.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="whats-the-story-morning-glory"><a href="https://music.douban.com/subject/1395617/">(What's The Story) Morning Glory?</a></h2>
<p>Oasis / 1995 / 专辑 / CD / 摇滚</p>
<p>9.3 ( 27765人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664347015-7e2eb5ae-b37b-4197-bdbc-ce7ddc1d9369.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/whats-the-story-morning-glory-remastered/894949345?l=en">▶️ Apple Music</a></p>
<h2 id="pussy"><a href="https://music.douban.com/subject/1982538/">PUSSY</a></h2>
<p>陈绮贞 / 2007-02-08 / 单曲 / Audio CD / 民谣</p>
<p>8.7 ( 21369人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664347157-a14900eb-dcf6-4fb0-b83f-165458d79549.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="呼吸--breathe---all-about-lily-chou-chou--lily-chou-chou呼吸"><a href="https://music.douban.com/subject/1421569/">呼吸 | Breathe - All About Lily Chou-Chou / Lily Chou-Chou：呼吸</a></h2>
<p>Salyu / 2001 / 专辑 / CD / 原声</p>
<p>9.1 ( 22021人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664347219-548510bc-97d7-487a-a56e-d81aac0bf4db.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/kokyuu/1297925080?l=en">▶️ Apple Music</a></p>
<h2 id="fallen"><a href="https://music.douban.com/subject/1394997/">Fallen</a></h2>
<p>Evanescence / 2003 / 专辑 / Audio CD / 摇滚</p>
<p>8.5 ( 21152人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664347494-25fdca4c-a476-41cf-b715-b059ed210cd8.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/fallen/1440665838?l=en">▶️ Apple Music</a></p>
<h2 id="黑豹"><a href="https://music.douban.com/subject/1413627/">黑豹</a></h2>
<p>黑豹 / 1992-12-01 / 专辑 / CD / 摇滚</p>
<p>9.3 ( 27065人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664347486-eb936f5e-a76b-4170-8256-8fe46ca8dd9c.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%BB%91%E8%B1%B9/177025348?l=en">▶️ Apple Music</a></p>
<h2 id="十年一刻"><a href="https://music.douban.com/subject/4923069/">十年一刻</a></h2>
<p>苏打绿 / 2010-08-27 / 视频 / CD+DVD / 流行</p>
<p>9.0 ( 23902人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664347533-25abbb3c-f560-40df-9e52-ed2ed5aade76.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%8D%81%E5%B9%B4%E4%B8%80%E5%88%BB/1461461752?l=en">▶️ Apple Music</a></p>
<h2 id="恋爱的力量--the-power-of-love-songs"><a href="https://music.douban.com/subject/1403802/">恋爱的力量 | The Power Of Love Songs</a></h2>
<p>梁静茹 / 2003年3月 / 专辑 / CD / 流行</p>
<p>9.0 ( 22492人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664354465-1b7f51d8-a512-4757-b84a-fc409cc83cba.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%88%80%E6%84%9B%E7%9A%84%E5%8A%9B%E9%87%8F/181199815?l=en">▶️ Apple Music</a></p>
<h2 id="suede"><a href="https://music.douban.com/subject/1394569/">Suede</a></h2>
<p>Suede / 1993 / 专辑 / CD / 摇滚</p>
<p>9.0 ( 24460人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664354463-e85d911c-d85a-4376-bbb9-14fb812eafb8.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/suede-remastered/435030227?l=en">▶️ Apple Music</a></p>
<h2 id="the-bends"><a href="https://music.douban.com/subject/1394652/">The Bends</a></h2>
<p>Radiohead / 1995 / 专辑 / CD / 摇滚</p>
<p>9.3 ( 30381人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664354657-f841ecd5-63bb-48a1-aa24-1a4461a4dfe8.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/the-bends/1097862703?l=en">▶️ Apple Music</a></p>
<h2 id="琵琶相--pipa-images-lin-hai--friends-2"><a href="https://music.douban.com/subject/1462686/">琵琶相 | Pipa images LIN HAI &amp; FRIENDS 2</a></h2>
<p>林海 / 2004 / 专辑 / CD / 轻音乐</p>
<p>9.4 ( 21797人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664354434-b4a3e422-79c1-40d8-8d8f-c13fff62ea4b.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%90%B5%E7%90%B6%E7%9B%B8/698628164?l=en">▶️ Apple Music</a></p>
<h2 id="-问号"><a href="https://music.douban.com/subject/6903119/">？| 问号</a></h2>
<p>陈奕迅 / 2011-11-11 / 专辑 / CD / 流行</p>
<p>8.1 ( 24284人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664354444-762b1478-089d-4733-8f15-e9ce82c6d6ba.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/1443783500?l=en">▶️ Apple Music</a></p>
<h2 id="少年故事"><a href="https://music.douban.com/subject/2154228/">少年故事</a></h2>
<p>彭坦 / 2007-07-23 / 专辑 / CD / 流行</p>
<p>8.2 ( 22022人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664355027-40230330-3e11-4113-b503-2b4a52f55172.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%B0%91%E5%B9%B4%E6%95%85%E4%BA%8B/1062498297?l=en">▶️ Apple Music</a></p>
<h2 id="黑暗之光"><a href="https://music.douban.com/subject/1923738/">黑暗之光</a></h2>
<p>雷光夏 / 2006-12-01 / 专辑 / CD / 民谣</p>
<p>8.9 ( 21264人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664355021-6de8a1ad-faab-475c-91f8-fb31018435e1.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%BB%91%E6%9A%97%E4%B9%8B%E5%85%89/312519836?l=en">▶️ Apple Music</a></p>
<h2 id="我要我们在一起"><a href="https://music.douban.com/subject/1419831/">我要我们在一起</a></h2>
<p>范晓萱 / 1999-11-1 / 国语 / CD / 流行</p>
<p>8.8 ( 24064人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664354973-674195c4-bd9b-400d-a762-8937b90f638c.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%88%91%E8%A6%81%E6%88%91%E5%80%91%E5%9C%A8%E4%B8%80%E8%B5%B7/536509559?l=en">▶️ Apple Music</a></p>
<h2 id="人生海海"><a href="https://music.douban.com/subject/1419375/">人生海海</a></h2>
<p>五月天 / 2001-07-06 / 专辑 / CD / 摇滚</p>
<p>9.3 ( 25704人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664355014-abf07477-efe7-46c9-9b29-f89b299b1bb6.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E4%BA%BA%E7%94%9F%E6%B5%B7%E6%B5%B7/541019015?l=en">▶️ Apple Music</a></p>
<h2 id="maybe-im-dreaming--可能我在做梦"><a href="https://music.douban.com/subject/3021469/">Maybe I'm Dreaming | 可能我在做梦</a></h2>
<p>Owl City / 2008-03-18 / Import / CD / 流行</p>
<p>8.4 ( 20707人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664355245-41457aa6-5d4a-4279-bc94-c4a226bcd000.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/maybe-im-dreaming/1444005810?l=en">▶️ Apple Music</a></p>
<h2 id="工体东路没有人"><a href="https://music.douban.com/subject/3435496/">工体东路没有人</a></h2>
<p>李志 / 2009-01-22 / 专辑 / 数字 / 民谣</p>
<p>9.2 ( 23029人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664355285-533bff48-3ee6-45e1-b163-4d27450ce609.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="let-it-be"><a href="https://music.douban.com/subject/1401365/">Let It Be</a></h2>
<p>The Beatles / 1990-10-25 / Enhanced / Audio CD / 摇滚</p>
<p>9.5 ( 25678人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664355343-aa4d014f-cc9c-4865-8fdd-d9bc9cb22a8f.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/let-it-be/1441164495?l=en">▶️ Apple Music</a></p>
<h2 id="alrightstill--一如既往"><a href="https://music.douban.com/subject/1796484/">Alright,Still | 一如既往</a></h2>
<p>Lily Allen / 2006 / Import / Audio CD / 流行</p>
<p>8.4 ( 20280人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664355523-3b78be97-a28f-43dc-93a7-60235ed707db.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/alright-still/726141687?l=en">▶️ Apple Music</a></p>
<h2 id="大小說家--fiction"><a href="https://music.douban.com/subject/10767657/">大小說家 | Fiction</a></h2>
<p>林宥嘉 / 2012-06-22 / 专辑 / CD / 流行</p>
<p>8.2 ( 24828人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664355554-3ccf1775-1012-4e11-9f95-2254220ea535.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%A4%A7%E5%B0%8F%E8%AA%AA%E5%AE%B6/539443343?l=en">▶️ Apple Music</a></p>
<h2 id="越长大越孤单"><a href="https://music.douban.com/subject/3013779/">越长大越孤单</a></h2>
<p>牛奶@咖啡 / 2008-03-18 / 专辑 / CD / 流行</p>
<p>7.8 ( 27754人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664355628-391e22f3-5cde-4cda-9ac6-bfb482743b35.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E8%B6%8A%E9%95%BF%E5%A4%A7%E8%B6%8A%E5%AD%A4%E5%8D%95/1437768300?l=en">▶️ Apple Music</a></p>
<h2 id="燕尾蝶--燕尾蝶-下定愛的決心"><a href="https://music.douban.com/subject/1403801/">燕尾蝶 | 燕尾蝶-下定愛的決心</a></h2>
<p>梁静茹 / 2004 / 专辑 / CD / 流行</p>
<p>8.1 ( 25599人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664355661-1bd68cca-c6c8-43be-ad6c-cee968316e91.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%87%95%E5%B0%BE%E8%9D%B6-%E4%B8%8B%E5%AE%9A%E6%84%9B%E7%9A%84%E6%B1%BA%E5%BF%83/558471475?l=en">▶️ Apple Music</a></p>
<h2 id="原谅我就是这样的女生--原諒我就是這樣的女生"><a href="https://music.douban.com/subject/3729307/">原谅我就是这样的女生 | 原諒我就是這樣的女生</a></h2>
<p>戴佩妮 / 2009-05-16 / 专辑 / CD+DVD / 流行</p>
<p>7.7 ( 21671人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664355702-ef3bce7d-8aa7-4b48-8531-2d39dcd5b954.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="传奇"><a href="https://music.douban.com/subject/5365287/">传奇</a></h2>
<p>王菲 / 2010-11-05 / 单曲 / CD / 民谣</p>
<p>9.0 ( 26139人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664355923-77a6e982-b7c6-4f0c-9769-8b5804b48602.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="under-the-radar--墜入琴網"><a href="https://music.douban.com/subject/3158576/">Under the Radar | 墜入琴網</a></h2>
<p>Daniel Powter / 2008-10-14 / 专辑 / Audio CD / 流行</p>
<p>8.5 ( 19397人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664355990-78ca4e0e-9bb4-4313-80bf-ead0ebf95190.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/under-the-radar/290075008?l=en">▶️ Apple Music</a></p>
<h2 id="知足-mv--karaoke-dvd"><a href="https://music.douban.com/subject/2083053/">知足 MV / Karaoke DVD</a></h2>
<p>五月天 / 2006 / 视频 / DVD / 流行</p>
<p>9.3 ( 20016人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664356004-709e5cc6-8270-4011-91df-4060dbb5006d.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%9F%A5%E8%B6%B3-just-my-pride-%E6%9C%80%E7%9C%9F%E5%82%91%E4%BD%9C%E9%81%B8/1554431588?l=en">▶️ Apple Music</a></p>
<h2 id="我的歌声里-1"><a href="https://music.douban.com/subject/11524982/">我的歌声里</a></h2>
<p>曲婉婷 / 2012-07-01 / 专辑 / CD / 流行</p>
<p>8.1 ( 21550人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664356210-4f01713d-43b9-46aa-a92f-b992e1818827.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%88%91%E7%9A%84%E6%AD%8C%E8%81%B2%E8%A3%A1-deluxe-version/1442661002?l=en">▶️ Apple Music</a></p>
<h2 id="王菲快樂不快樂"><a href="https://music.douban.com/subject/1394693/">王菲快樂/不快樂</a></h2>
<p>王菲 / 1997-09-30 / 专辑 / CD / 流行</p>
<p>9.4 ( 30662人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664356231-1c93a9c6-a43b-4b0c-8784-e0ea6b251bc2.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="信仰在空中飘扬"><a href="https://music.douban.com/subject/3843530/">信仰在空中飘扬</a></h2>
<p>汪峰 / 2009-07-25 / 专辑 / CD / 摇滚</p>
<p>8.8 ( 20801人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664356445-146b8336-2e98-4150-9651-c57415bf22b0.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="heading"><a href="https://music.douban.com/subject/1403573/">[i]Karen Love</a></h2>
<p>莫文蔚 / 2002-04-29 / 专辑 / CD / 流行</p>
<p>8.8 ( 22357人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664356404-91b4575e-b306-43df-b778-7913f9a60d8a.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/no-1-%E6%96%B0%E6%9B%B2-%E7%B2%BE%E9%81%B8%E5%85%A8%E7%B4%80%E9%8C%8420%E9%A6%96/657683547?l=en">▶️ Apple Music</a></p>
<h2 id="songs-about-jane"><a href="https://music.douban.com/subject/1395446/">Songs About Jane</a></h2>
<p>Maroon 5 / 2002 / 专辑 / Audio CD / 流行</p>
<p>8.8 ( 21946人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664356609-97d4e3bc-6e73-4571-8c96-15630ea93f2f.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/songs-about-jane/1440851650?l=en">▶️ Apple Music</a></p>
<h2 id="back-to-black"><a href="https://music.douban.com/subject/1937036/">Back To Black</a></h2>
<p>Amy Winehouse / 2006-10-30 / 专辑 / Audio CD / 放克/灵歌/R&amp;B</p>
<p>8.9 ( 22840人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664369989-46843cc3-a610-4432-9d2d-b6a578ffc864.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/back-to-black/1422677780?l=en">▶️ Apple Music</a></p>
<h2 id="demo-3"><a href="https://music.douban.com/subject/5292091/">Demo 3</a></h2>
<p>陈绮贞 / 2001-11-09 / Demo / CD / 流行</p>
<p>9.2 ( 19720人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664369996-00be4fbc-7598-4bdb-bc82-4f2df538658f.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="克卜勒--kepler"><a href="https://music.douban.com/subject/25811077/">克卜勒 | Kepler</a></h2>
<p>孙燕姿 / 2014-02-27 / 专辑 / CD / 流行</p>
<p>8.7 ( 32216人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664369984-15d47a3d-50ea-4c2a-aea6-482d1a3dd4cd.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%85%8B%E5%8D%9C%E5%8B%92/1443147411?l=en">▶️ Apple Music</a></p>
<h2 id="emc--爱的方程式"><a href="https://music.douban.com/subject/3005450/">E=MC² | 爱的方程式</a></h2>
<p>Mariah Carey / 2008-04-16 / 专辑 / CD / 放克/灵歌/R&amp;B</p>
<p>8.6 ( 21245人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664369984-be32023c-1e63-4e4a-b20d-9a447fbc1d2d.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/e-mc2/1550208941?l=en">▶️ Apple Music</a></p>
<h2 id="9-crimes"><a href="https://music.douban.com/subject/2286005/">9 Crimes</a></h2>
<p>Damien Rice / 2006-11-27 / 单曲 / Audio CD / 民谣</p>
<p>9.4 ( 18711人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664370025-15beb713-7a47-4987-8ba1-2cfa4b118039.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/9-crimes-single/196317754?l=en">▶️ Apple Music</a></p>
<h2 id="如果有一件事是重要的--如果有一件事是重要的粉红色demo"><a href="https://music.douban.com/subject/3579420/">如果有一件事是重要的 | 如果有一件事是重要的+粉红色(demo)</a></h2>
<p>陈珊妮 / 2008-11-22 / 专辑 / CD / 流行</p>
<p>8.3 ( 20153人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664370996-727b3744-2df0-422b-ad25-f5ce6dc2c9a6.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%A6%82%E6%9E%9C%E6%9C%89%E4%B8%80%E4%BB%B6%E4%BA%8B%E6%98%AF%E9%87%8D%E8%A6%81%E7%9A%84-single/715675386?l=en">▶️ Apple Music</a></p>
<h2 id="赤裸裸--赤裸裸"><a href="https://music.douban.com/subject/1404457/">赤裸裸 | 赤裸裸?!</a></h2>
<p>郑钧 / 1994 / 专辑 / CD / 摇滚</p>
<p>8.9 ( 24139人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664370993-53b5b035-1b09-4810-a024-ad6ac508f90a.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E8%B5%A4%E8%A3%B8%E8%A3%B8/1060026302?l=en">▶️ Apple Music</a></p>
<h2 id="阿岳正传--useless-guy"><a href="https://music.douban.com/subject/1410613/">阿岳正传 | Useless Guy</a></h2>
<p>张震岳 / 2004-06-24 / 选集 / CD / 流行</p>
<p>9.0 ( 20320人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664371026-55c646f6-fddc-46e7-b792-7077f0f77433.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%98%BF%E5%B6%BD%E6%AD%A3%E5%82%B3/164050980?l=en">▶️ Apple Music</a></p>
<h2 id="3颗猫饼干--三颗猫饼干--three-cat-cookies"><a href="https://music.douban.com/subject/1408372/">3颗猫饼干 | 三颗猫饼干 / Three Cat Cookies</a></h2>
<p>朱玫玲,董運昌,王雁盟,何真真 / 2004/04/26 / CD / 轻音乐</p>
<p>9.2 ( 17459人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664371102-238f2759-fd43-404e-a4bb-e93cc3153afd.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E4%B8%89%E9%A1%86%E8%B2%93%E9%A4%85%E4%B9%BE/594089031?l=en">▶️ Apple Music</a></p>
<h2 id="21-guns"><a href="https://music.douban.com/subject/3807272/">21 Guns</a></h2>
<p>Green Day / 2009-07-14 / Single / Audio CD / 流行</p>
<p>9.2 ( 20417人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664371089-88baecc0-ec45-431d-9c28-b97a67ed8690.jpeg" alt="image"  />


</p>
<p>nil</p>
<h2 id="看我72变"><a href="https://music.douban.com/subject/6540851/">看我72变</a></h2>
<p>蔡依林 Jolin Tsai / 2003-03-07 / 专辑 / CD / 流行</p>
<p>8.1 ( 34974人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664373200-1d78e649-6036-48df-a88b-17e7c6c4b0f0.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%9C%8B%E6%88%9172%E8%AE%8A/320494434?l=en-GB">▶️ Apple Music</a></p>
<h2 id="第二人生-明日版--second-round---now-here"><a href="https://music.douban.com/subject/7065469/">第二人生 明日版 | SECOND ROUND - NOW HERE</a></h2>
<p>五月天 / 2011-12-20 / 专辑 / CD / 流行</p>
<p>9.2 ( 20376人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664373241-f16e0da6-eb61-41ee-8c59-31e79fd87b77.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%AC%AC%E4%BA%8C%E4%BA%BA%E7%94%9F-%E6%98%8E%E6%97%A5%E7%89%88/1081308968?l=en">▶️ Apple Music</a></p>
<h2 id="definitely-maybe--绝对可能"><a href="https://music.douban.com/subject/1395280/">Definitely Maybe | 绝对可能</a></h2>
<p>Oasis / 1994-08-30 / 专辑 / CD / 摇滚</p>
<p>9.2 ( 24503人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664373235-a3fc538e-bdde-47f6-bc0c-629fc2e8f955.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/definitely-maybe-remastered/828325577?l=en">▶️ Apple Music</a></p>
<h2 id="first-love--初恋"><a href="https://music.douban.com/subject/1397751/">First Love | 初恋</a></h2>
<p>宇多田ヒカル / 1999 / 专辑 / CD / 流行</p>
<p>9.2 ( 24302人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664373121-e954b562-1c1c-496a-b527-3a629c6708ab.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/first-love-remastered-2014/1440763349?l=en">▶️ Apple Music</a></p>
<h2 id="阿密特意识专辑"><a href="https://music.douban.com/subject/5325161/">阿密特意识专辑</a></h2>
<p>张惠妹 / 2009-06-26 / 专辑 / CD / 流行</p>
<p>8.1 ( 23719人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664373206-8f6cc334-67b4-438f-9351-ae08870a28da.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E9%98%BF%E5%AF%86%E7%89%B9%E6%84%8F%E8%AD%98%E5%B0%88%E8%BC%AF/1546976857?l=en">▶️ Apple Music</a></p>
<h2 id="心跳心跳"><a href="https://music.douban.com/subject/3323600/">心·跳心跳</a></h2>
<p>王力宏 Leehom Wang / 2008-12-26 / 专辑 / CD / 流行</p>
<p>7.3 ( 23629人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664373634-d089bf72-5142-4f3d-947f-62f7f2fcb491.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%8E%8B%E5%8A%9B%E5%AE%8F%E5%85%A8%E6%96%B0%E5%89%B5%E4%BD%9C%E5%A4%A7%E7%A2%9F-%E5%BF%83-%E8%B7%B3/1448353705?l=en">▶️ Apple Music</a></p>
<h2 id="xx同名专辑"><a href="https://music.douban.com/subject/4010504/">xx同名专辑</a></h2>
<p>The xx / 2009-08-17 / 专辑 / CD / 摇滚</p>
<p>8.9 ( 22501人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664373763-e1e1cd18-927f-41e7-8b97-084f402f17e6.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/xx/325808192?l=en">▶️ Apple Music</a></p>
<h2 id="回蔚"><a href="https://music.douban.com/subject/3767208/">回蔚</a></h2>
<p>莫文蔚 / 2009-06-23 / 专辑 / CD+DVD / 流行</p>
<p>8.1 ( 20095人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664373837-ae34bf22-2cf1-454a-adb4-8cd71e169600.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%9B%9E%E8%94%9A/1656628842?l=en">▶️ Apple Music</a></p>
<h2 id="如果看見地獄我就不怕魔鬼--if-i-see-hell-i-wont-be-afraid-of-demons"><a href="https://music.douban.com/subject/3313756/">如果看見地獄，我就不怕魔鬼 | If I See Hell, I Won't Be Afraid of Demons</a></h2>
<p>Tizzy Bac / 2009-02-13 / 专辑 / CD / 流行</p>
<p>8.2 ( 19128人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664373792-9f32023e-ed71-4f69-b6da-b882852e426b.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%A6%82%E6%9E%9C%E7%9C%8B%E8%A6%8B%E5%9C%B0%E7%8D%84-%E6%88%91%E5%B0%B1%E4%B8%8D%E6%80%95%E9%AD%94%E9%AC%BC/1388258063?l=en">▶️ Apple Music</a></p>
<h2 id="我们是五月天"><a href="https://music.douban.com/subject/1438249/">我们是五月天</a></h2>
<p>五月天 / 2003年4月17日 / 专辑 / CD / 流行</p>
<p>9.4 ( 21570人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664374088-ce00f6fe-e2e0-404a-b3be-53b4c6007d1d.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E6%88%91%E5%80%91%E6%98%AF%E4%BA%94%E6%9C%88%E5%A4%A9/1078528641?l=en">▶️ Apple Music</a></p>
<h2 id="王妃--王妃"><a href="https://music.douban.com/subject/3803120/">王妃 | 王妃</a></h2>
<p>萧敬腾 / 2009-07-17 / 专辑 / CD / 流行</p>
<p>7.9 ( 24245人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664375116-b76a3cfe-65d2-4032-9896-c7cbff4c1cef.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E7%8E%8B%E5%A6%83/359075405?l=en">▶️ Apple Music</a></p>
<h2 id="poker-face--扑克脸"><a href="https://music.douban.com/subject/3313848/">Poker Face | 扑克脸</a></h2>
<p>Lady Gaga / September 23, 2008 / Single / Audio CD / 流行</p>
<p>8.8 ( 25206人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664375065-352a6084-0232-4635-9515-47b55181f96b.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/poker-face/1444401032?l=en">▶️ Apple Music</a></p>
<h2 id="唐朝--梦回唐朝"><a href="https://music.douban.com/subject/1395143/">唐朝 | 梦回唐朝</a></h2>
<p>唐朝 / 1992-12 / CD＋DVD / CD / 摇滚</p>
<p>9.1 ( 22391人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664375304-7c50a6a7-e9c5-4e5d-95e0-3f45a06a5b7b.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%94%90%E6%9C%9D/1622563433?l=en">▶️ Apple Music</a></p>
<h2 id="寻找周杰伦"><a href="https://music.douban.com/subject/1407700/">寻找周杰伦</a></h2>
<p>周杰伦 / 2003-12-1 / EP / 音乐CD / 流行</p>
<p>9.1 ( 29108人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664375235-d52723a7-eff1-4b7a-aeb2-d5961fad77e2.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%B0%8B%E6%89%BE%E5%91%A8%E6%9D%B0%E5%80%AB-ep/536108118?l=en">▶️ Apple Music</a></p>
<h2 id="她说--概念自选辑"><a href="https://music.douban.com/subject/5360525/">她说 | 概念自选辑</a></h2>
<p>林俊杰 / 2010-12-08 / 专辑 / CD / 流行</p>
<p>8.3 ( 34938人评价 )</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202302/1675664375278-ae265213-f6bd-4e7a-a582-e0fcd7a99f6d.jpeg" alt="image"  />


</p>
<p><a href="https://music.apple.com/cn/album/%E5%A5%B9%E8%AA%AA/1071506928?l=en">▶️ Apple Music</a></p>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[2022 年终总结]]></title>
    <link href="https://blog.alswl.com/2022/12/2022-review/"/>
    <id>https://blog.alswl.com/2022/12/2022-review/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2022-12-31T21:52:08+08:00</published>
    <updated>2022-12-31T21:52:08+08:00</updated>
    
    <content type="html"><![CDATA[<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202212/w.png" alt="img"  />



<small>上海解封后，摄于北外滩酒店</small></p>
<h2 id="生活---封锁和开放">生活 - 封锁和开放</h2>
<blockquote>
<p>「暴风雨结束后，你不会记得自己是怎样活下来的，你甚至不确定暴风雨真的结束了。
但有一件事是确定的：当你穿过了暴风雨，你早已不再是原来那个人。」</p>
<p>- 村上春树《海边的卡夫卡》</p></blockquote>
<p>2022 开场非常魔幻，3 月份我们在上海迎来了长达两个多月的封城。
从浦东浦西鸳鸯封再到浦东上海全域静态管理，从开始说的几天封闭到持续两个多月的封闭，
我第一次切身体会到自由是无价的，也学会了如何在复杂多变的环境参与集体活动，
保护自己和家人。</p>
<p>疫情拉近了人和人之间的距离，本来在线的网友纷纷变成了线下的团长、志愿者。
在缺少物资（包括后来开放后阶段缺少布洛芬）情况下，印证了「远亲不如近邻」。
我和夫人两人都是社区积极参与者，早在疫情之前就通过贴二维码方式组件了小区微信群。
这次疫情中，我们两人也轮流参与志愿者，我搞了若干次团购，还总结了一篇
<a href="https://docs.qq.com/doc/DVERvclhWZU5oQVBJ">如何组织疫情团购</a>。</p>
<p>年底的开放也是突如其来。
开放之后很快一家人都阳了。不幸中的万幸是阳的有序，至少还有「牧羊人」来做饭。</p>
<p>但一位亲人没有挺过这次疫情，她刚进行了手术。
手术很顺利，已经转入普通病房等待苏醒恢复，
结果遇上了新冠病毒。最后去世的原因不是原来脑部出血问题，而是新冠引起的呼吸衰竭。
我匆匆赶过去做了最后的送别，恍惚间，前几周还在家中健谈小辈各种趣事，突然就变成了天人永别。
悲痛之余，感叹人生命运无常和个人渺小无力，希望生者坚强，穿越阴霾继续前行。</p>
<p>我不想过多谈及政策、医疗制度、清零派和共存派的斗争。
只是感慨普通老百姓的生存不易、疫情的无情和生活的残酷的真相。
人到中年，愈发觉得好消息都是顺其自然应理所应当，而坏消息都是猝不及防怎会这样。</p>
<h2 id="工作---跬步和千里">工作 - 跬步和千里</h2>
<blockquote>
<p>大问题并不需要大规模的解决方案，而是一个行动上的基本框架加无数个微小决策</p></blockquote>
<p>这是我完全投入 Kubernetes 领域的第二年，
这一年精力都投入在如何大规模集群的优化和相应的工具平台。</p>
<p>目前我管理的核心集群规模超过一万节点，集群数量也近百，
规模带来了性能、容量、爆炸半径的管理难度，用户的需求也常常千变万化。
大规模集群面临的挑战在变多，历史债务却持续积累一直没有偿还干净，
而且还在不断要处理新加入的复杂问题：监管、多环境、对公云服务等等。</p>
<p>公司有稳定的业务和相当多试错场景，但是也包裹着海量的债务。
业务的压力导致了今年还不断在解决问题，没有投入太多的精力去做创造性的事情。
现在工作中面临最大的问题是体系化建设，挑战是如何繁琐的事情中将碎片的事情捏成团，
解决问题同时还要有创新。</p>
<p>今年还陆续给 ArgoCD 提了几个 PR，以解决在如此规模集群下 ArgoCD 工作性能问题。
可惜我投入最多时间的 lock-free 和 lazy watch
两个特性一直还没合入上游，几个前置的小 PR 都处理比较缓慢。</p>
<p>除了本职工作，还做了一些其他有意思的事情。
今年担任了大团队首席学习官，组织了两季 Infra SRE Meetup，
给大团队同学们搭建了一个场子分享，
我充分发挥了运营能力和设计能力，整了好多花活。
另外，我还意外地成为了一位厂里 Go 语言专家评委，参与了我厂 Go 语言规范的制定。
虽然我只是过去水了几场会议，倒是有这个机会跟更多技术老炮们交流学习。</p>
<p>新年的期望：能够持续做正确的事情，最重要的是不仅解决领域中具体的问题，
还能够保持高专业水平，构建一些系统化方案，加速问题解决。
如果还有时间，能好能给社区做做一些反馈，贡献一些代码。</p>
<h2 id="业余---工具还是工具">业余 - 工具还是工具</h2>
<p>可能是差生文具多的缘故，我一直对制作工具有浓烈的兴趣，今年有两个产出 excalidraw-collaboration 和 go-toodledo。</p>
<p>在封城 Remote 过程中，同事给我介绍了一个产品 <a href="https://excalidraw.com/">Excalidraw</a>。
这款在线协作画图工具产品感非常好，
它的手写风格解决了我画图强迫症的问题，
我挺想给工友们提供这个产品使用，但是首要解决是 SaaS 服务产品数据安全问题。</p>
<p>于是我做了 Excalidraw 的
<a href="https://blog.alswl.com/2022/10/self-hosted-excalidraw/">私有化</a>
不少朋友给了关注，还有人来咨询如何部署，
于是我又给出了一套一键部署方案 <a href="https://github.com/alswl/excalidraw-collaboration">excalidraw-collaboration</a>。</p>
<p>除了 Excalidraw之外，我还投入了不少时间撰写一个 GTD 的 CLI / TUI 工具
<a href="https://github.com/alswl/go-toodledo">go-toodledo</a>。
在实现了 CLI 功能之后，我又再接再厉，基于 <a href="https://github.com/charmbracelet/bubbletea">bubbletea</a> 实现了基于 TUI 的大部分的交互功能。
目前已经堪堪能用。明年还会继续打磨一下，将 go-toodledo 变成一个通用化的 GTD 管理工具，
对接更多平台，甚至提供一个类似 Obsidian 的 GUI 工具。</p>
<h2 id="读书">读书</h2>
<p>今年读书不多，主题阅读的话围绕投资相关入门书籍和 Go 相关的书籍：</p>
<p><strong><a href="https://book.douban.com/subject/30176774/">第一本经济学 (豆瓣)</a></strong></p>
<p>又薄又好读，语言生动但又不过于活泼，适合入门。</p>
<p><strong><a href="https://book.douban.com/subject/26582822/">重新定义公司 (豆瓣)</a></strong></p>
<p>做到世界第一流公司要志向远大，雇佣最一流的人才，并且给他们提供孵化创新的土壤。
更多书评 <a href="https://blog.alswl.com/2022/07/company/">跟 Google 学开公司 - 谈谈方向、文化和人</a></p>
<p><strong><a href="https://book.douban.com/subject/26163553/">投资中最简单的事 (豆瓣)</a></strong></p>
<p>化繁为简，剖析投资的技巧和手段手段。</p>
<p><strong><a href="https://book.douban.com/subject/24851460/">历代经济变革得失 (豆瓣)</a></strong></p>
<p>一直以来，我想学会几件事：看懂国家政策消息、看懂公司财报、学会投资。 于是我陆陆续续看了一些关于经济 / 投资的入门书籍，
《投资中最简单的事》，《第一本经济学》，《世界上最简单的会计书》等。 这次读完吴晓波的《历代经济变革得失》，给我带来不少
新的输入，特别是书中对中央、地方、有产、 无产的四种力量和四大基本制度分析法，提供非常好的视角来分析各种事件。
更多书评 <a href="https://blog.alswl.com/2022/11/economic-revolution-in-china/">读《历代经济变革得失》</a></p>
<p><strong><a href="https://book.douban.com/subject/35498378/">活着就是冲天一喊 (豆瓣)</a></strong></p>
<p>我挺少读文学类书籍，更别说是非虚构类文体。这本「活着就是冲天一喊」以一种异样的姿态，进入了我的阅读列表。 坦白说，我多少
有些大城市生活久了人的「固定思维」。中国经济在腾飞发展，乡村在不断变革，教育医疗一次次改革帮助群众生活的更好。虽然还有很
多历史困难，也有很多现实问题，但总体是向上的。这当然也是真的，从各类数据都能看大发展，但写灰尘之中的生活太少太少了，为这
些人发声的人太少，没有声音不代表不存在。 我刚开始拿起这本书时候，甚至还有些猎奇的想法：爆破工人能写出什么样的文字；他们
的日常生活是什么样子的？读着读着才知道，这是一个爆破工人的事情，一个有尘肺病的工人，也记录了一些他的工友、朋友、家庭的故
事。书中没有刻意去渲染苦难，没有唉声叹气和麻木不仁。除了苦难，还能看到的还有生命的活力，对美好的向往。</p>
<p><strong><a href="https://book.douban.com/subject/3674537/">明朝那些事儿（1-9） (豆瓣)</a></strong></p>
<p>叙事恢弘，读了小一年才读完。朝代问题除了是军事问题还是经济问题。</p>
<h2 id="flag">Flag</h2>
<p>回顾一下去年立的 Flag：</p>
<blockquote>
<p>希望新的一年有更多时间高质量陪伴家人，</p></blockquote>
<p>自我评价一下：今年在夫人带动下做到了几乎每周末都陪伴小朋友去户外，
郊野公园，市区公园，无动力乐园，滨江绿地，博物馆，科普馆，
亲子互动展，城市市集，玩水赶海……
夫人的溜娃知乎号半年都在知乎知势榜榜单中，甚至还拿到了成长榜单第一名。</p>
<blockquote>
<p>有时间和机会写更多高水平代码，更多外部输出，</p></blockquote>
<p>高水平代码写的还不够，很多事情都要自己亲力亲为，不少精力投入在从 0 到 1 的工作。
比如初始化项目底座，约束设计风格、代码规范等等事情。
少量有意思的代码（比如 ArgoCD 的 patch）都是在忙里偷闲产出的。</p>
<p>坦率地说，我司人效比不够高，日常能有 1/4 时间输出已经是不错了。
复杂环境和对 KPI 极其看中的环境中，能有一些有价值的输出还是挺难的。
偷偷看了大团队研发产出数据，我输出几乎是每个月的榜首，
我自我感觉在这个环境下面做的还不错，遗憾的是没有更多的精力给社区做一些贡献。</p>
<blockquote>
<p>产生更大的组织影响。</p></blockquote>
<p>组织影响力，emm~ 可能还是局限在大部门，无法走出团队，缺少好的撬动点。
今年还是得多写多输出多分享。</p>
<p>2023 的 <del>Flag</del> 方向：</p>
<ul>
<li>高质量陪伴家人，放下手机，走向户外</li>
<li>每月输出文章，特别是 Kubernetes / 研发设计领域可以写一些心得</li>
<li>经历了新冠，今年计划安排个私教教我健身房运动</li>
<li>投资收益率能做到 10%，今年新手阶段投资以股票型基金为主，投资收益 3.9%，跑赢了大盘和余额宝</li>
</ul>
<h2 id="last">Last</h2>
<p>2023 愿年家人健康平安，我继续保持乐观和积极，在工作和生活上有些突破，
在人生马拉松中有一段中途加速跑。</p>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[读《历代经济变革得失》]]></title>
    <link href="https://blog.alswl.com/2022/11/economic-revolution-in-china/"/>
    <id>https://blog.alswl.com/2022/11/economic-revolution-in-china/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2022-11-24T00:07:25+08:00</published>
    <updated>2022-11-24T00:07:25+08:00</updated>
    
    <content type="html"><![CDATA[<p>一直以来，我想学会几件事：看懂国家政策消息、看懂公司财报、学会投资。
于是我陆陆续续看了一些关于经济 / 投资的入门书籍，《投资中最简单的事》，《第一本经济学》，《世界上最简单的会计书》等。
这次读完吴晓波的《历代经济变革得失》，给我带来不少新的输入，特别是书中对中央、地方、有产、
无产的四种力量和四大基本制度分析法，提供非常好的视角来分析各种事件。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202211/four.png" alt="四种力量"  />


</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202211/method.png" alt="四大基本制度分析法"  />


</p>
<p>吴晓波是经济史大家，我读过他的《激荡三十年》、《腾讯传》，笔法锋利，时常有深刻洞见评价。
这次是从经济变革的角度出发，历数从秦朝起著名的经济变革，介绍其发生的政治经济背景、手段和成果。
变革有成功的也有失败，但是往往逃不出政治局势的影响力。剖析隐藏逻辑和规律，辩驳得失，让读者酣畅淋漓。</p>
<p>我希望从读史（经济学历史书也算史吧）获取一些对当下有用的信息，回答现实中的一些问题：</p>
<ul>
<li><mark>经济改革，究竟改的是什么？为什么要改革？</mark></li>
<li><mark>改革开放的改革，是改了什么？</mark></li>
<li><mark>我们对未来经济是否还应该保持充足信心？</mark></li>
</ul>
<h2 id="为何发起经济变革">为何发起经济变革</h2>
<p>变革（改革）这个词经常提到，为什么要变革？变革发起方是谁？</p>
<p>答案是中央，即国家的掌权者。为什么历朝历代这么多次发起改革呢？一言以蔽之，中央没钱了，需要通过一些制度的调整，增加收入。</p>
<p>至于为什么中央要收钱？这就是著名的<mark>桑弘羊之问</mark>：</p>
<blockquote>
<ol>
<li>帝国运转光靠农业的税收远远不够，如果不实行国有专营制度，钱从何来？</li>
<li>一旦爆发战争、灾荒等急需用钱，国库却空空如也，该怎么做？</li>
<li>如果中央不把重要财源掌控在手上，一旦国内分裂势力起兵造反，该如何抵挡？</li>
</ol></blockquote>
<p>总结一下，历史上（也包括现在）国家要用钱做建设；光靠农业税不行，中央要管钱否则国家会分裂。</p>
<p>PS：我们现在的政府收入以税收为大头，专营占比小。由于实行分税制，也不存在中央和地方财源掌握问题。</p>
<h2 id="经济改革改什么收钱方式">经济改革改什么？收钱方式</h2>
<p>每次改革都是在特定的历史背景下面，比如商鞅要强国、汉武帝要打匈奴等等。古时中央政权需要钱办事，总需要钱，钱不够就要想办法。
这个就涉及到<mark>国家的钱从哪里来</mark>？我看看看，国家的收入有这么几种：</p>
<ul>
<li>税收，古时最多的就是农业税，现在则是增值税和企业所得税</li>
<li>专营，即某些领域只能国家经营，不允许民间资本进入（往往是资源型或必需品）</li>
<li>其他（比如卖地、卖官）</li>
</ul>
<p>古时收钱路子不多，也不是金本位或纸币，常见方式：</p>
<ul>
<li>税收方式：纳粮，有的 1/30，有的 1/10 比例不等</li>
<li>徭役或者对应付费免除</li>
<li>专营方式，盐铁 / 烟草 都是专营，现在的银行也是专营，广泛意义上面来说，国营企业都是专营</li>
</ul>
<p>纳粮往往是实体，而且纳粮过程中可能存在巨大猫腻，也就是中央政权和地方政权的博弈。
强中央和弱中央在纳粮这块控制能力差异比较大。这也是为什么古代无法依赖农业税的一个重要原因。
专营则不一样，流通的的金属货币，不容易在流通过程中产生损失，或者偷报瞒报。</p>
<p>每次变革的核心内容就是通过<mark>归属、制度的调整，重新厘定财源</mark>。
经济变革的内容都是搭配着相应的政治制度而来，影子脱离不了实体。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202211/goverment-macro-adjustment.png" alt="国家宏观调控手段"  />


</p>
<h2 id="一句话介绍历代经济变革">一句话介绍历代经济变革</h2>
<p>尽管每次变革并非单纯经济层面的变革。我这边还是用一句话讲讲每次变革是怎么回事：</p>
<ul>
<li>管仲：贸易自由，但铁矿和海盐只允许国营</li>
<li>商鞅：不仅矿是国家的，人也别乱动，全部种田去</li>
<li>汉武帝 / 桑弘羊：少交税（1/30 ），全盘国营（铸钱、盐铁酿酒产业、统一物价、金融、税收）</li>
<li>王莽：桑弘羊说的都对，我还要土地国有化、币值改革，啊，我完蛋了</li>
<li>李世民：古代版本小政府，大社会，轻税简政，宽松政策</li>
<li>王安石：前面宋朝方案（宽松民间强专营（茶盐酒醋都要管））不行；换我的：计划经济上，官方放贷（青苗法）</li>
<li>明清：宏观经济管制、特许和官商、关闭国际贸易</li>
<li>洋务运动：发展总是被稳定压制；资本阶级萌芽</li>
<li>北洋和南京：以邻为壑、没王法的自由经济；南京政府的计划经济</li>
<li>建国后：计划经济、消灭私营、土地国有化、十年动乱</li>
<li>改革开放：务实和功利，尊重市场力量，从均贫走向先富起来，不均衡不彻底；地方政府和集体经济发发光</li>
<li>朱总理：分税让中央重新掌控主动权；地给你地方政府；激活国营从下岗开始</li>
</ul>
<h2 id="了解一下我国的政府财政收入情况">了解一下我国的政府财政收入情况</h2>
<p>我们可以看当前我国的 <a href="http://www.gov.cn/xinwen/2022-01/29/content_5671104.htm">2021年财政收支情况</a>，
看一下我们当前政府收入情况：</p>
<table>
  <thead>
      <tr>
          <th><strong>类目</strong></th>
          <th><strong>收入（亿元）</strong></th>
          <th><strong>备注</strong></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>一般公共预算收入</td>
          <td>202539</td>
          <td></td>
      </tr>
      <tr>
          <td>政府性基金预算收入</td>
          <td>98024</td>
          <td>注：土地使用权、彩票公益、政府住房基金等</td>
      </tr>
      <tr>
          <td>国有资本经营预算收入</td>
          <td>5180</td>
          <td></td>
      </tr>
  </tbody>
</table>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202211/china-2021-revenue-1.png" alt="china 2021 revenue"  />


</p>
<p>一般公共预算收入构成：</p>
<table>
  <thead>
      <tr>
          <th><strong>类目</strong></th>
          <th><strong>收入（亿元）</strong></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>国内增值税</td>
          <td>63519</td>
      </tr>
      <tr>
          <td>企业所得税</td>
          <td>42041</td>
      </tr>
      <tr>
          <td>出口退税</td>
          <td>18158</td>
      </tr>
      <tr>
          <td>进口货物增值税、消费税</td>
          <td>17316</td>
      </tr>
      <tr>
          <td>个人所得税</td>
          <td>13993</td>
      </tr>
      <tr>
          <td>国内消费税</td>
          <td>13881</td>
      </tr>
      <tr>
          <td>契税</td>
          <td>7428</td>
      </tr>
      <tr>
          <td>土地增值税</td>
          <td>6896</td>
      </tr>
      <tr>
          <td>城市维护建设</td>
          <td>5217</td>
      </tr>
      <tr>
          <td>印花税</td>
          <td>4076</td>
      </tr>
      <tr>
          <td>车辆购置税</td>
          <td>3520</td>
      </tr>
      <tr>
          <td>房产税</td>
          <td>3278</td>
      </tr>
      <tr>
          <td>关税</td>
          <td>2806</td>
      </tr>
      <tr>
          <td>证券交易印花税</td>
          <td>2478</td>
      </tr>
      <tr>
          <td>资源税</td>
          <td>2288</td>
      </tr>
      <tr>
          <td>城镇土地使用税</td>
          <td>2126</td>
      </tr>
      <tr>
          <td>车船税、船舶吨税、烟叶税等其他各项税收收入合计</td>
          <td>1236</td>
      </tr>
      <tr>
          <td>耕地占用税</td>
          <td>1065</td>
      </tr>
      <tr>
          <td>环境保护税</td>
          <td>203</td>
      </tr>
  </tbody>
</table>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202211/china-2021-revenue-2.png" alt="China 2021 revenue detail"  />


</p>
<p>从饼图可以看到，目前我国的政府收入大头还是税收，<mark>税收中大头是增值税和消费税</mark>。而国营收入仅占整体收入 2%，
我对经济不够专业，所以对这个 2% 非常震惊。
另外从「政府性基金预算收入」这项占比 32%，也能够显著感受到我国对<mark>土地经济</mark>的依赖。</p>
<h2 id="对经济未来发展还有信心么">对经济未来发展还有信心么？</h2>
<p>读完中国历代经济变革历史，能从其中感受到强烈的治乱循环。经济只是政治的影子。
治乱循环就是从四个阶段的循环，一次治乱往往对应一次朝代的重建。





<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202211/cycle.png" alt="治乱循环"  />


</p>
<p>那么问题是：现在到底是恒纪元还是乱纪元。从军事、民生、国际影响等来看，目前是恒纪元。
那问题就变成现在是恒纪元的上升箭头中，还是下降箭头中？</p>
<p>回顾一下改革开放的重要动作：</p>
<ul>
<li>从均贫到先富带动后富的理念变化，直接反应在农村允许包干</li>
<li>从计划经济（全面国营）转向允许民营经济发展</li>
<li>通过分税制，将地方财源回收到中央，再重新分配</li>
<li>允许地方通过卖地方式增加收入（这点在当时很重要，避免了政府被第一波启动资金绑架，参考香港的问题）</li>
</ul>
<p><mark>我们至今还生活在改革开放的增长曲线中</mark>。</p>
<p>从中国历史来看，和平发展 10 年小康，30 年盛世，50 年强国。然后进入不确定性时间。现在可能正在不确定的期间。
是否有信心取决于我们对治乱循环的周期判断。我的几个观察视角，从几个视角出发：</p>
<ul>
<li>工业发展趋势</li>
<li>民营和中小型企业发展状况</li>
<li>资源型、能源型行业的垄断和创新</li>
<li>新闻、文化、教育的开放度</li>
<li>社会奓靡程度</li>
<li>重大风险：战争、天灾</li>
</ul>
<p>最后，我的观点是：目前经济发展基本盘看好，但是贫富分化在加剧、权贵经济在崛起，后疫情时代绑架了经济发展发动机。
我整体持谨慎乐观，从全书行文之间，也能够感受到吴晓波对国进民退的忧虑。</p>
<h2 id="更多阅读">更多阅读</h2>
<ul>
<li><a href="https://book.douban.com/subject/24851460/">历代经济变革得失 (豆瓣)</a></li>
<li>吴晓波在央视的视频分享：<a href="https://www.bilibili.com/video/BV1BG4y1H7wH/">上</a> / <a href="https://www.bilibili.com/video/BV1RP4y1U7zu/">下</a></li>
</ul>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[码转电子厂 - 教你修键盘]]></title>
    <link href="https://blog.alswl.com/2022/10/fix-keyboard/"/>
    <id>https://blog.alswl.com/2022/10/fix-keyboard/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2022-10-19T10:51:01+08:00</published>
    <updated>2022-10-19T10:51:01+08:00</updated>
    
    <content type="html"><![CDATA[<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/fu-tu-kang.png" alt="fu-tu-kang"  />


</p>
<blockquote>
<p>为了做好万全的准备，如何在 35 岁毕业后能够顺利入职电子厂？</p>
<p>从修键盘学起</p></blockquote>
<h2 id="原因">原因</h2>
<p>我使用的键盘是 ErgoDox，一个人体工程学设计的分体键盘。关于 ErgoDox 更多详情可以见我之前的 <a href="https://www.zhihu.com/question/52088337/answer/141073759">回答</a>。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/keyboard-view.png" alt="keyboard-view"  />


</p>
<p>（前任键帽配色 + 手托）：</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/keyboard-view-2.png" alt="keyboard-view-2"  />


</p>
<p>经过七八年工作，它进过水，进过咖啡，还进过豆浆，现在终于有几个键不灵活了，按起来有粘滞感，无法提供顺畅的 coding feel 了。</p>
<p>在使用备胎 Filco 几个月之后，我终于下定决心，要将 ErgoDox 修好。</p>
<h2 id="准备">准备</h2>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/prepare.png" alt="prepare"  />


</p>
<ul>
<li>电烙铁</li>
<li>吸锡器</li>
<li>焊锡</li>
<li>键轴</li>
<li>精工螺丝起子套件</li>
<li>拔键器</li>
<li>起键轴小起子</li>
</ul>
<p>没有焊接经验的朋友，可以学习一下如何焊接：</p>
<p><a href="https://www.bilibili.com/video/BV1xt4y157LM/">女生都能学会的键盘焊接换轴教程_哔哩哔哩_bilibili</a></p>
<p><a href="https://www.bilibili.com/video/BV1Ui4y177kk/">电烙铁的错误和正确使用方法_哔哩哔哩_bilibili</a></p>
<h2 id="过程">过程</h2>
<center><mark><b>检查要换哪些键轴，按一按，听一听</b></mark></center>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/step-1.png" alt="step-1"  />


</p>
<center><mark><b>卸下外壳卸下伪装</b></mark></center>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/step-2.png" alt="step-2"  />


</p>
<center><mark><b>去除对应的键帽（注意，F J 键帽不一样哦）</b></mark></center>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/step-3.png" alt="step-3"  />


</p>
<center><mark><b>融化焊锡，用吸锡器将融化的焊锡吸走</b></mark></center>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/step-4.png" alt="step-4"  />


</p>
<center><mark><b>用键轴小起子，将其从正面摘除，记得有个软卡子，要上下方向（即 cherry logo 方向 + 对面用力）</b></mark></center>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/step-5.png" alt="step-5"  />


</p>
<center><mark><b>看看进去的咖啡和豆浆</b></mark></center>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/step-6.png" alt="step-6"  />


</p>
<center><mark><b>将新的键轴焊上去，效果</b></mark></center>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/step-7.png" alt="step-7"  />


</p>
<center><mark><b>吸锡器吸走的碎屑吐出来的样子</b></mark></center>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/step-8.png" alt="step-8"  />


</p>
<center><mark><b>最后完成组装</b></mark></center>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/keyboard-final.png" alt="keyboard-final"  />


</p>
<h2 id="总结">总结</h2>
<p>又有了那种打字畅快的感觉了~</p>
<p>青春回来了~</p>
<p>最后分享一下我的 ErgoDox Layout 配置：</p>
<ul>
<li><a href="https://link.zhihu.com/?target=https%3A//github.com/alswl/ergodox-firmware/blob/master/src/keyboard/ergodox/layout/alswl-layout.c">alswl/ergodox-firmware/blob/master/src/keyboard/ergodox/layout/alswl-layout.c</a> 我的 Layout，一共五层：普通模式 / Funtion Key / Number Pad / MediaKey / Arrow</li>
<li><a href="https://link.zhihu.com/?target=https%3A//github.com/alswl/ergodox-firmware/blob/master/src/main.c%23L127">alswl/ergodox-firmware/blob/master/src/main.c#L127</a> 修改了 LED 灯，让 LED 灯来表示 Layout 状态</li>
<li><a href="https://link.zhihu.com/?target=https%3A//github.com/alswl/teensy_loader_cli">alswl/teensy_loader_cli</a><a href="https://link.zhihu.com/?target=https%3A//github.com/alswl/teensy_loader_cli">alswl/teensy_loader_cli</a> Mac 下面可以工作的 teensy loader cli，官方提供的点击 Reset 按钮没有响应</li>
</ul>
<p>若有收获，就点个赞吧。</p>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[私有化在线协同画图平台 Excalidraw]]></title>
    <link href="https://blog.alswl.com/2022/10/self-hosted-excalidraw/"/>
    <id>https://blog.alswl.com/2022/10/self-hosted-excalidraw/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2022-10-17T00:08:31+08:00</published>
    <updated>2022-10-17T00:08:31+08:00</updated>
    
    <content type="html"><![CDATA[<blockquote>
<p>首先感谢岳父岳母带家中神兽去过暑假了，我才能有周末的时间来改这个系统。</p>
<p>另外感谢老婆，周末我两天都搞自己的事情，也没批评我。</p>
<p>最后感谢公司团建，提供酒店住，花了一个晚上时间搞定了中文手写体。</p>
<p>注：这是魔改私有化 excalidraw 开源版本，感谢社区</p></blockquote>
<h2 id="1-excalidraw">#1 Excalidraw</h2>
<blockquote>
<p>介绍一下 Excalidraw，产品特性</p></blockquote>
<p>什么是 Excalidraw，<mark>这（可能）是最强的在线协同画图工具</mark> ，你可以访问 <a href="https://excalidraw.com/">Excalidraw</a> 试试看。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/anatomy_of_an_azure_function.png" alt="anatomy_of_an_azure_function.png"  />


</p>
<p>如果你觉得打开来都是空白，那么也可以访问这个公共面板 <a href="https://excalidraw.com/#room=e630a562422e6e9d94db,IXndkz3JfOSGrlswJRC83Q">Excalidraw</a> 参与一起创作。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/excalidraw-share-room.png" alt="excalidraw-share-room.png"  />


</p>
<p>Excalidraw 非常好用，我总结几个点：</p>
<ul>
<li>手写风格（Hand Writing）避免了强迫症，什么一像素差异，都没了躺平到底</li>
<li>无延迟在线协作，非常适合后疫情时代的沟通协作</li>
<li>产品素质过硬，快捷键、对象连接粘滞、选定文件直接存储到本地等细节都有，挑不出毛病</li>
</ul>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/excalidraw-homepage.png" alt="excalidraw-homepage.png"  />


</p>
<p>这个产品我们经内部同学内部安利之后，大家迅速的喜欢上了，在 Excalidraw 上面了好多图，但也引来一个问题。</p>
<center><mark><b>「公有 SaaS 服务存在数据安全隐患」</b></mark></center>
<center><mark><b> 怎么办？我要把他私有化部署！</b></mark></center>
<h2 id="2-部署之前先来了解一下-excalidraw-的工作原理">#2 部署之前，先来了解一下 Excalidraw 的工作原理</h2>
<p><strong>Excalidraw 工作原理和私有化原理</strong>：</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/excalidraw-arch.png" alt="excalidraw-arch.png"  />


</p>
<p>那私有化的核心难点是什么：</p>
<p>解决 excalidraw-storage 的数据存储问题，即替换掉 Google Cloud Platform 的 firebase 服务。</p>
<h2 id="3-私有化尝试">#3 私有化尝试</h2>
<blockquote>
<p>事有不顺反求诸己</p>
<p>- 孟子</p>
<p>求与诸己，不如求于 GayHub</p>
<p>- alswl</p></blockquote>
<p>让我们先先研究 Excalidraw 的存储系统。
Firebase 是 Google 的 Serverless 服务，以前是独立公司（还挺火），后来给 GCP 收购了。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/firebase.png" alt="firebase.png"  />


</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/firebase-features.png" alt="firebase-features.png"  />


</p>
<p>我一开始想法是替换 Firebase，找了一个社区服务 <a href="https://supabase.com/">Supabase</a>（意外发现还有免费的 SaaS 服务，良心啊）</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/supabase.png" alt="supabase.png"  />


</p>
<p>但是仔细研究一下，发现 Supabase 的 API 和 firebase 不兼容，并 <mark>不能平替</mark>。</p>
<p>Excalidraw 还要靠 Excalidraw+ 卖钱（Plus 服务），怎么可能让你这么轻松就私有化，官方原来有个 excalidraw-json 的仓库，现在也被移除了。但是我们不怕，我们有来自社区的力量：</p>
<ul>
<li><a href="https://github.com/excalidraw/excalidraw/issues/1772">Self hosting Excalidraw - Umbrella issue · Issue #1772 · excalidraw/excalidraw</a></li>
<li><a href="https://github.com/excalidraw/excalidraw/discussions/3879">Collaboration mode - Self-hosting vs Collab on top of · Discussion #3879 · excalidraw/excalidraw (github.com)</a></li>
</ul>
<p>他们给了条路（虽然后来被证实还是有歪路的）：</p>
<ul>
<li><a href="https://gitlab.com/kiliandeca/excalidraw-fork">Kilian Decaderincourt / Excalidraw Fork · GitLab</a> 魔改版本 excalidraw</li>
<li><a href="https://gitlab.com/kiliandeca/excalidraw-storage-backend">Kilian Decaderincourt / excalidraw-storage-backend · GitLab</a></li>
</ul>
<p>于是我开始检视他们方案，打开代码一看，思路正确（替换 firebase 的几个接口），使用自己的 KV 存储（Redis / MySQL / Mongo）替换。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/jing-shen.png" alt="jing-shen.png"  />


</p>
<p>尝试部署，立马遇到问题：</p>
<center><mark><b> Dockerfile 无法正常构建 </b></mark></center>
<center><mark><b> 版本落后 upstream 太久（2020 -\> 2022）</b></mark></center>
<center><mark><b> Rebase 方式 merge 上游无法 follow </b></mark></center>
<p>怎么这么巧，我是 <mark><b> 前端实习生 // 社区打补丁专家 // Kubernetes 清洁工 // YAML 资深专家 </b></mark>，专治这么几个毛病。</p>
<h2 id="4-你让开我来写">#4 你让开，我来写</h2>
<ul>
<li><a href="https://github.com/alswl/excalidraw-storage-backend">alswl/excalidraw-storage-backend: Excalidraw Backend</a>
<ul>
<li>使用二阶段构建 Dockerfile <a href="https://github.com/alswl/excalidraw-storage-backend/commit/d841d734ab02659df370a6bdef3f1d8947696580%5D(https://github.com/alswl/excalidraw-storage-backend/commit/d841d734ab02659df370a6bdef3f1d8947696580)">https://github.com/alswl/excalidraw-storage-backend/commit/d841d734ab02659df370a6bdef3f1d8947696580](https://github.com/alswl/excalidraw-storage-backend/commit/d841d734ab02659df370a6bdef3f1d8947696580)</a></li>
<li>中国特供 <a href="https://github.com/alswl/excalidraw-storage-backend/commit/30a6da9c87b367bb1fbde449f754923638545fa8">feat: china mirror · alswl/excalidraw-storage-backend@30a6da9</a></li>
</ul>
</li>
<li><a href="https://github.com/alswl/excalidraw">alswl/excalidraw: Virtual whiteboard for sketching hand-drawn like diagrams</a>
<ul>
<li>调整代码，使用 http stroage 替代 firebase</li>
<li><a href="https://github.com/alswl/excalidraw/pull/2">Feat/self host backend by alswl · Pull Request #2 · alswl/excalidraw</a></li>
</ul>
</li>
</ul>
<center><mark><b> 改造代码设计图 </b></mark></center>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/self-hosted-excalidraw.png" alt="self-hosted-excalidraw.png"  />


</p>
<h2 id="5-未来可能不存在">#5 未来（可能不存在）</h2>
<p>Excalidraw 是 SaaS 服务的免费版，<mark><b> Excalidraw+ 是付费版 </b></mark>，有什么区别呢</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/excalidraw-price.png" alt="excalidraw-price.png"  />


</p>
<p>总结：</p>
<ul>
<li>更可靠的存储，集成到云存储（比如 Dropbox / iCloud）</li>
<li>用户身份识别，连接到通用的身份系统</li>
<li>更个性化的权限控制（密码访问、定向分享）、租户控制、项目组控制</li>
<li>域内共享的 Library</li>
<li>跟其他系统集成（语雀、钉钉文档、飞书等等）</li>
</ul>
<p>或者还是直接购买 Excalidraw 企业版本服务吧，少折腾多享受。</p>
<h2 id="6-中文手写体优化">#6 中文手写体优化</h2>
<p>有个问题，<mark><b> 中文字体不是手写体 </b></mark> ，很违和。先看看哪些字体能用吧：</p>
<p>macOS 支持的中文手写体：</p>
<ul>
<li><a href="https://support.apple.com/zh-cn/HT212587">https://support.apple.com/zh-cn/HT212587</a></li>
<li><a href="https://support.apple.com/zh-cn/HT212587">macOS Monterey 附带的字体 - 官方 Apple 支持 (中国)</a></li>
</ul>
<p>cursive 家族：</p>
<ul>
<li>PanziPen</li>
<li>LingWai</li>
<li>Hannotate</li>
</ul>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/hanzipen-sc.png" alt="hanzipen-sc.png"  />


</p>
<p>windows 中文支持手写体比较差劲，必须安装 Office 才有更多选择：<br />
华文行楷；方正舒体；（Office）</p>
<ul>
<li><a href="https://www.zhihu.com/question/22703287">https://www.zhihu.com/question/22703287</a></li>
<li><a href="https://www.zhihu.com/question/22703287">Windows 系统内置的中文字体为什么只有那几种？不多内置几种字体呢？ - 知乎 (zhihu.com)</a></li>
<li><a href="https://zh.m.wikipedia.org/zh-hans/Microsoft_Windows%E5%AD%97%E5%9E%8B%E5%88%97%E8%A1%A8">https://zh.m.wikipedia.org/zh-hans/Microsoft_Windows字型列表</a></li>
</ul>
<p>不行的话，只有系统自带的楷体 KaiTi 可以工作。</p>
<p>最后，靠我三脚猫的前端水平，做了一个 PoC，并给官方提交了一个 PR：<a href="https://github.com/excalidraw/excalidraw/pull/5604">feat: simple impl of multi font support, for chinese font by alswl · Pull Request #5604 · excalidraw/excalidraw</a></p>
<p>这是最终的效果：</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/202210/chinese-hand-writing.png" alt="chinese-hand-writing.png"  />


</p>
<p>可以访问 <a href="https://excalidraw.alswl.com/">excalidraw.alswl.com</a> 查看效果，这是一个静态站点，
支持中文字体，但是无法在线协作。</p>
<hr />
<h2 id="update-2022-12">Update 2022-12</h2>
<p>有几个网友来咨询如何进行部署。于是基于上述的方案，我提供了一套基于 Docker Compose 的一键拉起服务：带协作、中文字体支持。
仓库见 <a href="https://github.com/alswl/excalidraw-collaboration">alswl/excalidraw-collaboration</a>。</p>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[跟 Google 学开公司 - 谈谈方向、文化和人]]></title>
    <link href="https://blog.alswl.com/2022/07/company/"/>
    <id>https://blog.alswl.com/2022/07/company/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2022-07-15T23:40:00+08:00</published>
    <updated>2022-07-15T23:40:00+08:00</updated>
    
    <content type="html"><![CDATA[<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/upload_dropbox/202207/google-900x500.png" alt="image via pixabay"  />


</p>
<blockquote>
<p>我居然也有胆来想这个命题了。</p></blockquote>
<h2 id="困惑---换个视角看待公司">困惑 - 换个视角看待公司</h2>
<p>大部分年轻人都在一个商业组织（即公司）中工作。
我们似乎对这个商业组织的运作已经很熟悉：
接触公司并进行面试和岗位匹配，在特定的岗位里面工作，过程也许开心或沮丧，通过组织的种种管理手段（KPI / OKR）来完成上级分发的任务。</p>
<p>这个过程中，我们往往遇到不少困惑，有些朋友还经历过职场 PUA（Pick-Up Artist）；有些朋友可能感觉自己已经干的足够出色却无法得到晋升；有些朋友感慨合作的上下游太不专业了；总之，<strong>我们对公司不满是常态，而对公司满意则是反常</strong>。</p>
<!-- more -->
<p>其实很多时候，雇员的感受是公司运行的规律的投影。
我们制定 OKR 时候想去创造，应该通过什么方法论去开拓工作？这是公司战略决定的。
公司是怎么定义优秀人选的，我有没有机会获得晋升？这是公司用人态度决定的。
996 这么辛苦，我们该怎么去保持生活工作平衡？这是公司价值观和文化决定的。</p>
<p>Google 在这个方面似乎做得不错，从 2022 福布斯雇主（<a href="https://www.forbes.com/lists/best-large-employers/">America&rsquo;s Best Large Employers 2022</a>）排名来看，Google 排在 34 名，互联网领域则是第 4 位（前三名分别是 Microsoft / Ultimate Kronos Group / LinkedIn）。</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/upload_dropbox/202207/best-large-employers.png" alt="best-large-employers"  />


</p>
<p>Google 做对了哪些事情？让我们换一个视角，从雇员视角切换到雇主，甚至再宽阔一些，以投资者视角来观察公司。
来解答一些关键问题：公司是如何决定前进方向的？公司每年的目标是应该怎么制定出来？公司通过什么方式筛选和激励人才？</p>
<p><a href="https://book.douban.com/subject/26582822/">重新定义公司</a> 这本书告诉我们很多 Google 的回答，
国际大公司的方案未必能拿来立即用上，但这些答案可以给我们很多启发。</p>
<p><strong>Google 说：战略、人才、文化、沟通，这些是定义公司的关键。</strong></p>
<h2 id="公司往哪里走---战略和方向决定了收入">公司往哪里走 - 战略和方向决定了收入</h2>
<p>公司发展的真正原动力是什么？我思考答案的朴素的：科技在发展，世界在变得更复杂，人们希望自己生活更安全、幸福、高效。这时候就需要一些机构，尤其是利润驱动的商业公司来提供更好的服务来满足大家。从这个角度出发，公司只要是与人为善，帮助用户解决确实存在的问题，就创造了相应的价值。</p>
<p>那具体怎么创造，往哪个方向发展？追寻利润是唯一的驱动方向么？显然不是的，否则很多公司就要去围绕人性的弱点（黄赌毒）去开展业务了（你别说，这种公司还真的挺多）。</p>
<p>伟大的公司之所以伟大，是他们仅仅将利润看作一个副产品。真正指引是 <strong>基于对新兴技术的洞见而形成的判断</strong>。这是一种那什么是「洞见」呢？
技术洞见是创新方式应用科技或设计，<strong>达到成本或者特性的 10X 变化，甚至是代际变化</strong>。</p>
<p>制定的战略要足够有挑战。
Google 说 [这个战略是否足够吸引人，就好比 NASA 登月计划一样，让渴望的人聚拢在一起。而不是单纯一份体面的工作。」</p>
<p>如果想做一鸣惊人的事情确实比较困难，也不符合科技发展规律。
有时我们的创新仅仅是「<strong>组合式创新</strong>」，将领域 A 的知识复用到领域 B，
就形成了创新。计算机为什么持续受到热捧，因为这个作为基础领域可以跟大量其他领域进行相结合。</p>
<p>战略实施中，是否需要时刻盯着竞争对手？
这样做反而会落了下乘，
最关键的还是自己要找到自己的专业领域，一以贯之持续投入。
成为这个领域的专家。很多时候技术洞见，本质还是来自于人对领域的了解，
如果不是领域专家，那就不是洞见而是空想。</p>
<p>阿里集团和蚂蚁的愿景是什么？「让天下没有难做的生意」/「为世界带来微小而美好的改变」。这个愿景确实非常伟大，
也很有现实价值意义。
大公司提出的愿景也非常宏伟。宏伟也带来了不真实感，
字节「建设“全球创作与交流平台”」搭建平台，创造空间，提供场合，或者说大白话提供一个流量交换地。
Google 的<a href="https://about.google/intl/zh-CN/">愿景</a>是「整合全球信息，供大众使用，使人人受益」，其实也是抽象的概念。
这些公司的愿景都是足够伟大，上限足够高，可以在这个方向上持之以恒挖掘代际感的产品/方案出来。</p>
<h2 id="文化---公司决策的投射">文化 - 公司决策的投射</h2>
<p>每个公司都有自己的文化，文化是设计出来的么？是也不是。
顶层设计时候都会有一些期望的文化状态（一般都是正确的废话）。
但真实的文化是民间形成的，<strong>这是在一次次冲突和决策下培育出来的</strong>。
比如阿里味、腾讯瑞雪、字节范儿（不过字节范儿据说官方自己定义了）。</p>
<p>Google 的文化，大家最熟悉的可能就是「不作恶」了。除此之外还有几个可以总结出来的点：</p>
<ul>
<li>驱逐恶棍、保护明星：恶棍是指品格的恶，明星可能有怪癖但是有高产出</li>
<li>快乐工作强扭不来</li>
<li>跟我来：TL 需要热情，要有舍我其谁的气概</li>
<li>不作恶</li>
</ul>
<p>除了这些标语式的文化，Google 一些公司形态也很值得了解：</p>
<ul>
<li>按照业务 BU 划分团队还是按照职能划分？
<ul>
<li>按照职能，不要考虑什么部门成本，要考虑将人的潜力发挥，专人专用，促进专业能力深化</li>
</ul>
</li>
<li>要不要 WLB
<ul>
<li>鼓励贡献，喜欢那些想做事情，从而不区分 WL 的人，反对「过劳」</li>
</ul>
</li>
<li>要不要限制团队规模？
<ul>
<li>不刻意要求，小团队、扁平化都可以</li>
</ul>
</li>
</ul>
<p>文化不是定义出来的，阿里味的文化其实也是民间长出来的，官方创新地将多个场景的「土话」提炼成阿里价值观。
阿里味：（我的总结）<strong>敢批评，勇于接受批评；内部产品创新；使命必达；组织结构动态调整</strong>。
外部所谓恶臭的味道：互联网黑话、面向 KPI、PPT、谈概念、PUA，
其实是某些媒体和个人的妖魔化。他们对立了雇主和雇员的关系，而弱化了创新、竞争的初心。但也不可否认，清水时间久了会变脏，文化不沉淀就会被稀释，</p>
<p>为什么产生这么大的认识差异。我理解：扩张太快，人才质量良莠不齐；外部社会形势变化，雇员压力被放大。
尤其是第二点，价值观这一件内核严肃的事情，从内心出发的感想行动，变成由外力驱动的事情。
为了和在这个价值观下群体行动一致，倒逼成为假阿里味。</p>
<p>是价值观错了？太形而上么？我对此持乐观态度，是有这么一群人，向善而行，也希望将公司做大做强。
越伟大的愿景，对成员的要求越高，也越难达到所有成员高度认可价值观状态。
在薪酬差异不大、业务技术创新性要求没那么高时候，要允许一部分人混口饭吃。</p>
<p>文化，尤其是民间自发形成的文化，没有对错，什么土壤结什么果。
这个公司做大做强，他的文化就是好文化了。一个成功的文化移植另外环境，未必一样能获得成功。
说白了，企业内部的文化，就是职场最佳实践。</p>
<h2 id="关于人才和招聘---花最多的钱找最强的人">关于人才和招聘 - 花最多的钱找最强的人</h2>
<p>公司要找什么什么样的人？老黄牛要不要，野狗要不要？是要高性价比人才还是要奢侈品？</p>
<p>Google 使用的招聘策略很特别，即<strong>用溢价来招聘最一流的成员</strong>。
他们甚至因为担心 B 级人才会引入 BCD 级别人才，而拒绝 B 级人才。</p>
<p>这一切的前提是 <strong>核心业务运行稳健并足够赚钱</strong>，才能让公司用溢价来留住优秀的人员。
另外，人才密度高也是一把双刃剑，过高的人才密度可能导致内卷。
想留住人才还是要靠优秀的现金流、提供足够有挑战的任务，良好的合作环境，以及良好的社会环境。</p>
<p>如果不满足这几个点，贸然学习 Google 的人才策略，就是东施效颦，会适得其反。
人才筛选说到底，还是投入产出比问题。有钱了喜欢买奢侈品，没钱平替也很好用。</p>
<p>Google 鼓励所有成员参与招聘，并且在绩效/影响力评估会考虑这个点。
同时设立了招聘委员会来对人才评级，避免出现不专业出现。
令人惊讶的是，所有人员的最终入职确认，都要 CEO 过目。
想象一下阿里的人都要逍遥子审批，这是多么巨量的工作。（我对 Google 这个讲法深表怀疑，可能呈现的数据是结构化之后的数据）。</p>
<h2 id="合作和决策---点头和摇头">合作和决策 - 点头和摇头</h2>
<p>合作中遇到最大的问题，就是点头和摇头。<strong>点头不附和，摇头有理由</strong>。
Google 鼓励成员用数据做决策，并且鼓励过程中的摇头，以及最终的分歧消灭。
话都是对的，但在真正执行中，如何能够创造一个敢说真话，讲信息含量高的话环境？</p>
<p><strong>Google 也没讲出来</strong>。</p>
<p>我只能默认由于愿景广阔、人才质量高，人才溢价高，导致大家的合作是更为理性，更<strong>不考虑本位而是考虑真正的问题</strong>。
更愿意从公司的价值思考。但有人的地方就有江湖，人性也总是自私的。
理性决策最终还是要靠制度才能进行下去，也不存在最性价比的方案。</p>
<h2 id="小结">小结</h2>
<p>尽管想一下子弄清楚这么多问题是困难和不现实的。Google 的一系列做法给我们很多启示：
<strong>做到世界第一流公司要志向远大，雇佣最一流的人才，并且给他们提供孵化创新的土壤</strong>。</p>
<p>合上书闭上眼深思，回想自己身边，不敢评价全局，只能说身边的技术团队，现在在一个历史时间：
债务多，演变不彻底。技术洞见不少，但是落地困难。还有没有机会提出「登月计划」，引领下一代的科技变革呢？</p>
<hr />
<h2 id="附录">附录</h2>
<p>老样子，我整理了大纲和一些有意思的摘录，供反复研读。</p>
<p>框架和纲要：</p>
<ul>
<li>文化，相信自己的口号
<ul>
<li>拥挤出成绩：创建促进交流共同的环境</li>
<li>一起吃住，一起工作</li>
<li>别听父母的：杂乱是种美德：办公室逼格是无所谓的，办公室要促进共同交流</li>
<li>别听「河马」的话：别迷信权威资深人事</li>
<li>7 法则：扁平化</li>
<li>切莫自扫门前雪：按职能划分团队，而不是按 BU 划分</li>
<li>重组工作的关键：快刀斩乱麻</li>
<li>贝索斯的「两个披萨」原则：Google 不设限，大小团队都接受</li>
<li>组织要以最优影响力的人为中心：不看岗位和经验，看表现和热情</li>
<li>驱逐恶棍、保护明星：恶棍是指品格的恶，明星可能有怪癖但是有高产出</li>
<li>「过劳」有道：谷歌不宣扬 WLB，赞同合理的的节奏进行</li>
<li>营造说「好」的企业文化：促进互相帮助的文化</li>
<li>快乐工作强扭不来</li>
<li>别光着身子就行</li>
<li>跟我来：TL 需要热情，要有舍我其谁的气概</li>
<li>不作恶</li>
</ul>
</li>
<li>战略，你的计划是错误的：信任团队而不是信任完美的商业计划
<ul>
<li>信赖技术洞见，而非市场调查：技术洞见是创新方式应用科技或设计，达到成本或者特性的代际变化</li>
<li>组合创新时代时代的到来</li>
<li>别去找快马：（去找车）</li>
<li>为成长而优化</li>
<li>科斯与企业的性质：做平台</li>
<li>专注的力量：做专业做好</li>
<li>开放为王</li>
<li>选择封闭系统的前提：如果封闭利益更高的话</li>
<li>莫被竞争对手牵着鼻子走</li>
</ul>
</li>
<li>人才：招聘是你最重要的工作：摒弃层级制度，同事评估，委员会定夺
<ul>
<li>羊群效应：优秀的人吸引优秀的人，B 级人才还会招 B、C、D 级</li>
<li>有激情的人不把激情挂嘴边：观其行</li>
<li>雇佣学习型动物</li>
<li>机场测试：待上 6h，看看是否味道符合</li>
<li>客观评价人才：以事实作为标准</li>
<li>加大光圈甄才：扩大人才入选范围</li>
<li>全员出动招募人才：所有员工的职责，并鼓励参与招聘，并参考到评估业绩和晋升能力中</li>
<li>面试是最重要的技能：</li>
<li>将面试时间设为 30 分钟</li>
<li>自由主张</li>
<li>设立招聘委员会：所有人入职都要审核</li>
<li>宁缺毋滥</li>
<li>给优秀人才超出常规的回报</li>
<li>换出巧克力，留下葡萄干</li>
<li>爱他，就让他走</li>
<li>宁可漏聘，也不误聘</li>
</ul>
</li>
<li>决策：共识的真正含义
<ul>
<li>用数据做决策</li>
<li>谨防摇头娃娃的附和：其实是点头娃娃</li>
<li>该响铃时就响铃：拿捏时机，乐于行动</li>
<li>少做决策：减少分歧，放出权利</li>
<li>每天开会：高频率沟通，尤其是重大决策</li>
<li>你们两边说的都对：柔性沟通</li>
<li>每场会议都需要有主人</li>
<li>马背原则：短暂高效地审视当下所处的环境</li>
<li>把 80% 的时间花在 80% 的收入上：集中注意力到核心业务</li>
<li>接班人计划</li>
</ul>
</li>
<li>沟通：最牛的路由器，管理者要成为团队沟通最强的路由器。
<ul>
<li>心态开放：信息透明、OKR 开放</li>
<li>掌握细节：摘要能力</li>
<li>为讲真话营造安全的环境</li>
<li>制造话题：为沟通提供一些桥梁</li>
<li>祷文不会因重复而失色：反复重复</li>
<li>以旅行报告作为会议的开场：先招人总结一下旅行的见闻和学习到的内容，作为一个快乐会议的开场</li>
<li>自我评价</li>
<li>电邮常识：迅速回复、精简、经常清理、为搜索做准备</li>
<li>备一本情境手册：模板，一对一、董事会、合作伙伴、媒体</li>
<li>靠关系而非层级</li>
</ul>
</li>
<li>创新：缔造原始的混沌
<ul>
<li>创新是什么：新颖、出人意料、非常实用</li>
<li>了解环境：首先，你得对这个领域有了解，最好是有洞见</li>
<li>首席执行官必须兼任首席创新官</li>
<li>聚焦用户</li>
<li>往大处想：Think Big</li>
<li>制定（近乎）遥不可及的目标：OKR</li>
<li>70 / 20 / 10 原则：核心产品，新兴产品，全新产品</li>
<li>20% 时间制：给个人创新提供空间</li>
<li>创意无处不在</li>
<li>交付，迭代</li>
<li>败得漂亮：Fast Fail</li>
<li>与钱无关：创新不需要利益驱动</li>
</ul>
</li>
</ul>
<p>Google 招聘之行为准则：</p>
<blockquote>
<ol>
<li>雇用那些比你更聪明、更有见识的人。</li>
<li>不要雇用那些不能让你有所收获也不能对你构成挑战的人。</li>
<li>雇用那些能对产品和文化带来价值的人。</li>
<li>不要雇用那些无法为产品和文化带来积极影响的人。</li>
<li>雇用那些做实事的人。</li>
<li>不要雇用那些只想不做的人呢。</li>
<li>雇用那些满腔热情、自动自发的人。</li>
<li>不要雇用那些只想混口饭吃的人。</li>
<li>雇用那些能启发别人且善于与人相处的人。</li>
<li>不要雇用那些偏爱自己单干的人。</li>
<li>雇用那些能随着团队和企业一同成长发展的人。</li>
<li>不要雇用那些枯燥乏味、不具备全面技能的人。</li>
<li>雇用那些多才多艺、兼具独特兴趣和天赋的人呢。</li>
<li>不要雇用那些只为工作而活的人。</li>
<li>雇用那些道德高尚、坦诚沟通的人呢。</li>
<li>不要雇用那些趋炎附势、工于心计的人呢。</li>
<li>务必雇用优秀的候选人。</li>
<li>宁缺毋滥。</li>
</ol></blockquote>
<p>Goole 对高质量人才定义叫做「创意精英」，什么是创意精英呢？</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>创意精英善于沟通。</p>
<p>创意精英必须具备商业头脑、专业知识、创造力已经实践经验，这些都是基本特征。</p></blockquote>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[20 21]]></title>
    <link href="https://blog.alswl.com/2022/01/20-21/"/>
    <id>https://blog.alswl.com/2022/01/20-21/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2022-01-03T10:23:00+08:00</published>
    <updated>2022-01-03T10:23:00+08:00</updated>
    
    <content type="html"><![CDATA[<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/upload_dropbox/202201/park.jpg" alt="park"  />



<small>image from wife</small></p>
<!-- more -->
<h2 id="关键词柳暗花明">关键词：柳暗花明</h2>
<h3 id="家庭">家庭</h3>
<p>这两年疫情来袭，生活、工作的方方面面都产生了巨大变化，也是我人生的最艰难的一段时光。</p>
<p>2020 年中，母亲身体抱恙，术后逐渐康复，全家紧绷的神经也得到了一丝放松。但在年末，小朋友出了一些状况。
具体情况我不过多谈及，圈内人称为地狱爬行。三十而立的年龄，奔跑中时突然撞上了一道无形的墙壁，抬头望去，
一片漫无边际的黑暗笼罩。好在经过全家的努力，终于在 2021 年末柳暗花明。
这两年，压力之下，也重新在思考自己在家庭、团队、个人的角色定位。</p>
<h3 id="工作">工作</h3>
<p>在蚂蚁的前两年，我主要开发一款面向外部商户的 DevOps 系统，过程中不仅要设计开发，也要跑到用户那边做需求挖掘和产品交付。
还要对内讲清楚业务价值。这种「既要又要还要」非常反工程实践，一度让我沮丧。工程师内核坚持和「业务价值落地」的冲突，
我无法将其融合在一起。最终就变成干苦活没回报，产出被收割。在我快失去对工作的掌控和热情时，
托另外一位朋友福及时转岗，</p>
<p>新的领域是容器调度领域（Kubernetes），这个领域生机勃勃，是 Cloud Native 基石，也是云计算的基础。
这个领域特点是，背靠社区、客户稳定、需求（规模的扩大、稳定性的提高、性能的提升）可预见
之前工作时候，若干次接触过这个领域。
14 年左右我初次接触了 Mesos 调度系统，将其作为 Hadoop Yarn 的替代品用在离线计算任务上。
后来我又开发过一套名为 Prisim 的开发环境，基于容器技术提供独立的 Dev 环境，具备静态和基于域名的简单 Service Discovery，
当时土法造炮堪堪能用，支撑起公司的整个研发环境。</p>
<p>蚂蚁前两年的工作，几乎中断了我在基础设施领域的工作，内容发散不聚焦。现在终于重新拉回了主干路线。
虽然新工作也并不轻松，但深挖领域、探索新方向、寻找增长点很有意思。
一句话概括所做的事情：管理好这些大规模集群，并以这个目的为出发，设计开发变更、可见性、应急、生命周期管理等工具。
团队 TL 来自 Google，同伴也普遍有相当的水准（小组最近两年每年给 KubeCon / SREcon 贡献一场分享），能够在一个不卷的地方深挖，可能是大部分技术人的梦想了。</p>
<p>这两年做的还不够地方，是影响力建设，输出社区太少，输出内容也太少。时间金贵，总是感觉不够用。</p>
<h2 id="书">书</h2>
<p><a href="https://book.douban.com/subject/3420606/">正面管教 (豆瓣)</a>
坚定、和善，发掘孩子的天性。</p>
<p><a href="https://book.douban.com/subject/10773248/">无条件养育 (豆瓣)</a>
唯有爱，帮孩子身心健康，走得更远。</p>
<p><a href="https://book.douban.com/subject/1888733/">Java Concurrency in Practice (豆瓣)</a>
并发相关殿堂级书，应该放到大学读，不管是不是 Java 开发者都应该阅读。我的<a href="https://book.douban.com/review/14121470/">笔记</a>。</p>
<p><a href="https://book.douban.com/subject/35048568/">how to (豆瓣)</a>
换个思路解决问题，有趣的小故事。</p>
<p><a href="https://book.douban.com/subject/35271451/">星之继承者 (豆瓣)</a>
硬核科幻，想象力之大。</p>
<h2 id="物件">物件</h2>
<ul>
<li>CarPlay 无线转换，车连易
<ul>
<li>不用使用 Lightning 线连接汽车，上车就自动无线连接成功</li>
</ul>
</li>
<li>电动晾衣架
<ul>
<li>解放双手</li>
</ul>
</li>
<li>网易严选晴雨两用折叠伞
<ul>
<li>超级小巧，感觉不到存在，男孩子也能用太阳伞</li>
</ul>
</li>
<li>网易严选 T 恤吸湿速干
<ul>
<li>夏天穿太舒服了，买了 3 件</li>
</ul>
</li>
<li>keychron K3 键盘
<ul>
<li>无线键盘，物美价廉</li>
</ul>
</li>
<li>野蛮娃娃遥控车
<ul>
<li>小朋友出门就是全小区最靓的崽</li>
</ul>
</li>
<li>梨家班徒巴西花梨红木擀面杖
<ul>
<li>丈母娘做面条，再也不用担心擀面杖发霉了</li>
</ul>
</li>
<li>Naturehike 户外野营折叠车
<ul>
<li>每周一次户外，带小朋友必备</li>
</ul>
</li>
<li>石头扫拖机器人 T7S
<ul>
<li>国产之光，替换了退休 iRobtot，扫拖一体 + 雷达真的香</li>
</ul>
</li>
</ul>
<h2 id="新年展望">新年展望</h2>
<p>过去两年过的比较压抑，我面对了很多生活的不顺遂。这段仿佛漫长的时光，也给了很多我反思自己的机会。
三十而立，不仅仅指的对个人视野立定远谋，也指的就是这种上有老下有小，要肩扛腰背的立。
希望新的一年有更多时间高质量陪伴家人，有时间和机会写更多高水平代码，更多外部输出，产生更大的组织影响。</p>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[如何做好 PRR（Production Rediness Review）？]]></title>
    <link href="https://blog.alswl.com/2021/06/prr/"/>
    <id>https://blog.alswl.com/2021/06/prr/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2021-06-11T17:53:00+08:00</published>
    <updated>2021-06-11T17:53:00+08:00</updated>
    
    <content type="html"><![CDATA[<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/upload_dropbox/202106/prr.png" alt="prr"  />



<small>image from pixabay.com</small></p>
<p>SRE 工程师往往会负责一个具体组件，有时也称为服务或系统（下文都称之为组件）。
需要关注的有这个组件生命周期各类事项：运行状态、日常迭代、变更计划，以及在大促等活动中的筹备、预案等等，
有些组件是团队已经在长期持续维护着的，而有些则是要去新接入。
那么，当 SRE 接手（on-borading）这样组件时， 需要做哪些事项呢，
如何将「接手」这个行为做得有掌控力、顺畅且体面？</p>
<h2 id="了解组件现状">了解组件现状</h2>
<p><strong>第一步永远是了解现状</strong>，孙子兵法谋攻篇说，知己知彼，百战不殆。
现状包含组件的当前运行状态、环境，
还包含当前 SRE 团队的能力、平台是否可以顺利衔接。</p>
<!-- more -->
<p>了解一个组件，可以先以<strong>用户角度进行切入</strong>。
去理解这个组件提供什么功能，服务对象是谁，服务的规模如何？
能否将组件进行归类？是属于普通业务系统，还是基础设施？
如果时间充裕的话，还可以跟这个组件的用户进行几次沟通，咨询，他们关于这个组件使用上的痛点。</p>
<p><strong>近期和长期的规划</strong>也是需要重点关注的内容。
在组件设计和规划上面有没有什么计划和目标。根据规划我们可以推断出该组件处于何种生命周期。
生命早期的组件要多关注变更和基础能力建设；
成熟期组件往往承担了较为重要的角色，很可能承担了相当的生产流量，这时候变更、可观测性和应急方面就要花更多精力。
生命周期末期的组件则关注点是在维稳，优先考虑如何找到人，并且尽量低成本复用现有能力平台，甚至还要适当关注服务迁移和下线计划。</p>
<p><strong>第二步是以技术的视角来切入</strong>，
分别从架构、依赖、部署、可伸缩能力、容量等角度切入，具体需要回答的问题如下：</p>
<ul>
<li>架构和组件依赖：系统架构设计，功能特性图，模块切分图，核心场景的数据链路图，核心模型图；存储视角的模型图；
历史上架构是否发生变化，驱动变化的原因是什么，有哪些决策变量，这些决策变量未来是否还会继续变化？</li>
<li>部署结构：物理部署图，有没有考虑异地机房问题？上下游依赖，哪些是强依赖和弱依赖</li>
<li>Scalable：组件是否是无状态的，是否具备水平扩容能力？如果是有状态的，状态管理基于什么存储系统？流量峰值如何应对？</li>
<li>容量：当前吞吐水平如何；是否具备大流量下限流能力；流量峰值来时，是否有足够资源扩容；是否具备限流、降级能力？</li>
</ul>
<p>结合 SRE 团队服务的其他组件，还要思考一下有哪些其他组件和当前组件类型一样，有什么差异点？
有没有特殊的部署要求？</p>
<p><strong>对一个组件需要了解到什么程度才能接手？</strong> 这里我用几种程度来描述掌控力：</p>
<ul>
<li>L1 具备作为普通用户的使用能力，应急时能够定位出问题方向，找到合适的人。</li>
<li>L2 具备资深用户能力，有一定调优能力（Tuning）能力。</li>
<li>L3 具备处置问题（Trouble Shooting）能力。</li>
<li>L4 具备架构设计能力和前瞻性，能够给 SWE 反哺输入</li>
</ul>
<p>在经过一轮 PRR 完整流程之后，SRE 应当至少需要具备 L2 级别能力。
接管一段时间之后，随着对组件不断的了解，SRE 应当具备 L3 级别能力。</p>
<h2 id="明确日常和应急事项">明确日常和应急事项</h2>
<p>了解现状这个动作基本上是以静态的视角来看待组件。
完成之后，还要换成动态视角来看：<strong>有哪些日常操作（Operational）和紧急状态（Emergency）的操作</strong>？</p>
<p>需要关注的领域有可观测性、变更、应急预案：</p>
<ul>
<li>可观测性：当前监控系统是否具备 Metrics、Tracing、Logging 三类观测机制接入？是否具备中心化监控能力？
<ul>
<li>告警：接入哪些告警系统？是否拎出了核心 SLI（跌零因子、核心指标），是否具备基于 SLO 进行错误预算控制的能力？
告警的具体流程如何？是否具备告警抑制降噪能力？告警是否具备定位能力？历史数据是否可追溯？</li>
</ul>
</li>
<li>变更：目前基于什么工具进行变更？CI CD 流程分别是什么？发布周期是什么样子？配置变更二进制变更是否分离？是否有特性开关？
存储层面变更是否有考虑？各类变更流程是否有完成自动化？变更过程是否可以灰度？是否具备变更回滚能力。</li>
<li>应急预案：是否有突发流量处理预案；是否有限流、降级策略？整体不可用之后业务影响如何？流量处理上是否考虑过雪崩场景？</li>
</ul>
<p><strong>在应急方面，还需要去了解过去历史上出现过哪些的问题</strong>。
翻看组件的故障复盘文档，了解历史上故障过程，故障原因，对应的 Action 是否落地？
尤其注意的是要关注 Action 工作机制是阻断式、检查式还是发现式？
老故障放到当下如果要避免是依赖系统、流程机制还是人工？</p>
<p>由于 SRE 日常工作主要构成是两类：能力建设和 On-Call。
在了解日常、应急场景事项时，还需要持续思考这些日常事项和应急动作能否基于 SRE 的工具平台、能力平台完成。
按照能力模型等级：手工 -&gt; 工具 -&gt; 自动化 -&gt; 智能化来划分，当前日常、应急动作进入哪个环节了？
SRE 也可以借事修物，借接收这个环节，重新审视自己的各类工具平台，是否满足这些日常、应急动作，能否更快更强更安全更准更好用？</p>
<h2 id="明确服务范围">明确服务范围</h2>
<p>为了保证接手过程的顺畅，以及日后合作的体面，服务范围必须要在接手环节明确清楚。</p>
<p>什么是服务范围？就是接手之后工作内容的边界和日常合作模式。</p>
<p>一个最常见的边界划分是。变更：SRE 团队负责 CI / CD 环境建设，而 SWE 团队使用 CI 环境完成日常的部署。
SRE 团队则使用自行建设的 CD 系统进行变更管理。
日常和应急：在日常 Operational 事项和应急中，SRE 会按预案进行处置并保障组件回到最理想状态。
SRE 还需要建设可观测性、应急相关的技术基础设施，对组件全生命周期监控和应急处理。
SRE 最终承诺的组件对外 SLA，并将 SLA 拆解为 SLO 跟 SWE 共背。
在接受过程中很重要的一个工作就是，理清楚组件的 SLI / SLO，并且根据现状跟 SWE 团队商榷出对外承诺的 SLA。</p>
<p>除了服务范围，SRE 和 SWE 还要建设任务协作机制和沟通机制。
有没有统一的任务记录和流转平台？遇到稳定性相关的反馈如何，如何将需求转化为任务并追踪完成？
故障相关的 Action 如何追踪落地？一些基础环境变化以及业务上活动变化，是否有统一场合进行同步？
比较理想的情况是，基于任务管理系统，一个需求/缺陷从提出，到设计，到实现，到变更，SRE 都参与其中。
考虑到成本，现实执行时候可以根据精力、理解成本、重要程度、组件生命阶段进行微调。
有一个简单低成本执行方式，将服务领域组件进行划分后，每个领域派遣一个 SRE 进入对口的 SWE 团队进行追踪：
参加 SWE 团队的周会和日会，并将信息带回 SRE 团队同步。</p>
<p>谨记，<strong>划分没有统一的标准，不同团队，不同技术成熟度，不同生命周期组件都会导致不一样的边界和合作模式</strong>。</p>
<h2 id="总结">总结</h2>
<p>「接手」是管理的第一步。
在了解现状、明确日常和应急事项、明确服务范围等一系列动作之后，
相信 SRE 已经具备初步掌控力了。有了方法论，还要持续精益求精，将掌控力从 L2 进步到 L4。
想把事情给真正做好，核心是持续学习思考在对应领域的基础技能，并且持续了解客户的需求变化。
保持一专多能，成为随时可以顶上去独当一面的 SRE，这才能避免成为一个工单人。🐶</p>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/upload_dropbox/202106/sre-push-up.jpg" alt="sre-push-up"  />



<small>image from Twitter</small></p>
<p>扩展阅读：</p>
<ul>
<li><a href="https://sre.google/sre-book/evolving-sre-engagement-model/">The Evolving SRE Engagement Model</a></li>
<li><a href="https://sre.google/workbook/non-abstract-design/">Introducing Non-Abstract Large System Design</a></li>
<li><a href="https://cloud.google.com/blog/products/gcp/how-sres-find-the-landmines-in-a-service-cre-life-lessons">How SREs at Google find the landmines in a service | Google Cloud Blog</a></li>
</ul>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[Python 的类型系统]]></title>
    <link href="https://blog.alswl.com/2020/06/type-safe-python/"/>
    <id>https://blog.alswl.com/2020/06/type-safe-python/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2020-06-23T17:54:00+08:00</published>
    <updated>2020-06-23T17:54:00+08:00</updated>
    
    <content type="html"><![CDATA[<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/upload_dropbox/202006/wall.png" alt="wall"  />



<small>image from pixabay.com</small></p>
<p>静态类型正在逐渐成为潮流，
2010 年之后诞生的几门语言 Go、Rust、TypeScript 等都走了静态类型路线。
过往流行的一些动态语言（Python、PHP、JavaScript）也在积极引入语言新特性（Type Hint、TypeScript）对静态类型增强。</p>
<p>我曾使用 Python 开发规模较大的项目，感受过动态语言在工程规模变大时候带来的困难：
在重构阶段代码回归成本异常之高，很多历史代码不敢动。
后来技术栈转到 Java，被类型系统怀抱让人产生安全感。</p>
<p>最近一年在一个面向稳定性的运维系统耕耘。系统选型之初使用了 Python。
我在项目中力推了 Python 3.7，并大规模使用了 Python 的类型系统来降低潜在风险。</p>
<p>追根溯源，我花了一些时间了解 Python 在类型系统的设计和实现，
本文以 PEP 提案介绍一下 Python 在类型系统上面走过的路。</p>
<!-- more -->
<h2 id="类型系统">类型系统</h2>
<p>谈类型系统之前，要厘定两个概念，动态语言和动态类型。</p>
<p>动态语言（Dynamic Programming Language）则是指程序在运行时可以改变结构。
这个结构可以包含函数、对象、变量类型、程序结构。
动态类型是类型系统（Type System）其中一类，即程序在运行期间可以修改变量类型。
另外一种是静态类型：在编译期就决定了变量类型，运行期不允许发生变化。
类型系统还有一种分法是强类型和弱类型，强类型是指禁止类型不匹配的指令，弱类型反之。</p>
<p>动态语言和动态类型这两个概念切入点不一样，
Python 是一门动态语言，也是动态类型语言，还是强类型的动态类型。
这篇文章主要讨论 Python 语言的类型系统，不会涉及动态语言特性。</p>
<h2 id="类型安全之路">类型安全之路</h2>
<p>行业里面一直有一个争论：动态类型和静态类型哪一种更强大。
静态类型的支持者认为三个方面具备优势：性能、错误发现、高效重构。
静态类型通过编译期决定具体类型可以显著的提高运行期效率；
编译期就能够发现错误，在工程规模逐步变大时候尤其明显；
类型系统可以帮助 IDE 提示，高效重构。
动态类型的支持者则认为分析代码会更简单，减少出错机会，写起来也更为快速。</p>
<p>Python 开发者们并非没有看到这个痛点，
一系列 PEP 提案应运而生。
在保留 Python 动态类型系统优势前提，通过语法、特性增强，将类型系统引入 Python。</p>
<p>Python 在 2014 年即提出了 PEP 484，随后提出一个精粹版 PEP 483（The Theory of Type Hints），
其工程实现 <a href="https://docs.python.org/3/library/typing.html">typing</a> 模块在 3.5 发布。
经过 PEP 484，PEP 526，PEP 544，PEP 586，PEP 589，PEP 591 的多次版本迭代，Python 的类型系统已经很丰富。
甚至包含了比如 Structural Subtyping 以及 Literal Typing 这边相对罕见的特性。</p>
<h3 id="pep-483---核心概念">PEP 483 - 核心概念</h3>
<p><a href="https://www.python.org/dev/peps/pep-0483/">PEP 483</a> 在 2014 年 12 月发布，
是 Guido 起笔的核心概念版，简明扼要的写清楚 Python 的类型系统建设方向、边界、要和不要。</p>
<p>PEP 483 没有谈具体工程实现，提纲挈领地讲了一下 Python 类型系统如何对外呈现。
厘定 Type / Class 差别，前者是语法分析概念，后者是运行时概念。
在这个定义下面 Class 都是一个 Type，但 Type 未必是 Class。
举例 <code>Union[str, int]</code> 是 Type 但并不是 Class。</p>
<p>PEP 483 还介绍内建基础类型：<code>Any</code> / <code>Unison</code> / <code>Optional</code> / <code>Tuple</code> / <code>Callable</code>，这些基础类型支撑上游丰富变化。</p>
<p>静态类型系统最大的诟病是不够灵活，Go 语言现在还没有实现泛型。
PEP 483 介绍了 Python Generic types 泛型使用方法，
形式如下：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">S</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;S&#39;</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">longest</span><span class="p">(</span><span class="n">first</span><span class="p">:</span> <span class="n">S</span><span class="p">,</span> <span class="n">second</span><span class="p">:</span> <span class="n">S</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">S</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">first</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">first</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="nb">len</span><span class="p">(</span><span class="n">second</span><span class="p">)</span> <span class="k">else</span> <span class="n">second</span>
</span></span></code></pre></div><p>最后，PEP 483 还提了一些重要的小特性：</p>
<ul>
<li>别称 Alias</li>
<li>前置引用 Farward Reference（在定义类方法注解中使用定义类），eg.：解决二叉树 Node 节点中需要引用 Node 问题</li>
<li>covariance contravariant 协变逆变</li>
<li>使用注释标记类型</li>
<li>转型 Cast</li>
</ul>
<p>PEP 483 的实现，主要依赖了 <a href="https://www.python.org/dev/peps/pep-3107/">PEP 3107 &ndash; Function Annotations</a>
这个提案。PEP 3107 介绍 function 注解使用。比如， <code>func(a: a1, b: b1) -&gt; r1</code>
这段代码，
其中冒号后面的描述符记录会到 func 的 <code>__annotations__</code> 变量中。</p>
<p>PEP 3107 效果展示如下，可以清晰看到函数变量存放：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">add</span><span class="o">.</span><span class="vm">__annotations__</span>
</span></span><span class="line"><span class="cl"><span class="c1"># {&#39;x&#39;: int, &#39;y&#39;: int, &#39;return&#39;: int}</span>
</span></span></code></pre></div><p>PS：现在 Python 有了 Decorator 装饰器 / Annotation 注解，其中 Annotation 的设计还和 Java 的 Annotation 同名，一锅粥。</p>
<h3 id="pep-484---type-hints-核心">PEP 484 - Type Hints 核心</h3>
<p><a href="https://www.python.org/dev/peps/pep-0484/">PEP 484 &ndash; Type Hints</a>
在 PEP 483 基础上完整讲述 Python 类型系统如何设计，如何使用，细节如何（typing 模块）</p>
<p>这篇提案开宗明义地点出：</p>
<blockquote>
<p>Python will remain a dynamically typed language, and the authors have no desire to ever make type hints mandatory,
even by convention.</p></blockquote>
<p>一句话断绝了 Python 在语言级别进化到静态系统的可能。</p>
<p>提案除了 PEP 483 已经讲解的特性，还有以下吸引我的点：</p>
<ul>
<li>允许通过 Stub Files 为已经存在的库添加类型描述。具体是使用 Python 文件对应的 <code>.pyi</code> 文件描述 Python 代码的带类型签名。
这个方案和 TS 的 <code>@types</code> 文件有异曲同工之妙。</li>
<li>允许使用 <code>@overload</code> 进行类型重载，这也是活久见，Python 居然可以（在某种意义上）支持重载了。</li>
<li>介绍了 typing 实现细节，比如使用 abs（Abstract Base Class）构建常见类型的 interface，包括 <code>Sized</code> / <code>Iterable</code> 这些基础接口。
我个人认为这个工作量是其实挺大，是给已有的类进行一次依赖梳理。</li>
<li>介绍了 Python 向后（Python 2）兼容方法，有这么几种策略：
使用 decorator（<code>@typehints(foo=str, returns=str)</code>）、comments、Stub files、Docstring</li>
</ul>
<h3 id="pep-526---变量也安排上了">PEP 526 - 变量也安排上了</h3>
<p><a href="https://www.python.org/dev/peps/pep-0526/">PEP 526 &ndash; Syntax for Variable Annotations</a>
核心提案是给变量加上 Type Hints 支持。</p>
<p>和 <code>function annotation</code> 类似，也是通过注解方式存放。
差异是并不是给实例添加一个 <code>__annotations__</code> 成员，而是将变量的 annotations 信息存放在上下文变量 <code>__annotations__</code> 之中。
这个其实也比较好理解：定义一个变量类型时候，这个变量还没有初始化。</p>
<p>我写一段 Demo 展示一下：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span>
</span></span><span class="line"><span class="cl"><span class="n">users</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># print(__annotations__)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># {&#39;users&#39;: typing.List[int]}</span>
</span></span></code></pre></div><p>可以看到，上述 Demo 效果是在上下文变量创建了一个 <code>users</code>，但这个 <code>users</code> 其实并不存在，只是定义了类型，
如果运行 <code>print(users)</code> 会抛出 <code>NameError: name 'users' is not defined</code>。</p>
<p>观察字节码会更清晰：</p>
<pre tabindex="0"><code> L.   1         0  SETUP_ANNOTATIONS

 L.   1         2  LOAD_CONST               0
                4  LOAD_CONST               (&#39;List&#39;,)
                6  IMPORT_NAME              typing
                8  IMPORT_FROM              List
               10  STORE_NAME               List
               12  POP_TOP

 L.   3        14  LOAD_NAME                List
               16  LOAD_NAME                int
               18  BINARY_SUBSCR
               20  LOAD_NAME                __annotations__
               22  LOAD_STR                 &#39;users&#39;
               24  STORE_SUBSCR
               26  LOAD_CONST               None
               28  RETURN_VALUE
</code></pre><p>可以清晰看到，并没有创建一个名为 users 的变量，而是使用了 <code>__annotations__</code> 变量。
注：Python 存储变量使用 opcode 是 <code>STORE_NAME</code>。</p>
<p>PS：本提案中有不少被否决的提案，挺有趣的，社区提出了很多奇淫巧计。
可以看出社区决策的慎重，存量系统升级的难度。</p>
<h3 id="pep-544---nominal-subtyping-vs-structural-subtyping">PEP 544 - Nominal Subtyping vs Structural Subtyping</h3>
<p>PEP 484 里面类型系统讨论的是 Nominal Subtyping，
这个 <a href="https://www.python.org/dev/peps/pep-0544/">PEP 544 &ndash; Protocols: Structural subtyping (static duck typing)</a>
则是提出了Structural Subtyping。
如果非要翻译，我觉得可以称为具名子类型 / 同构子类型。
注意，也有人将 Structural Subtyping 称之为 Duck Typing，其实这两者不相同，具体可以见
<a href="https://en.wikipedia.org/wiki/Duck_typing#Structural_type_systems">Duck typing / Comparison with other type systems</a>。</p>
<p>Nominal Subtyping 是指按字面量匹配类型，而 Structural Subtyping 则是按照结构（行为）进行匹配，
比如 Go 的 Type 就是 Structural Subtyping 实现。</p>
<p>这里写个简单 Demo 展示一下后者：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Iterator</span><span class="p">,</span> <span class="n">Iterable</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Bucket</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="o">...</span>
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span> <span class="o">...</span>
</span></span><span class="line"><span class="cl">    <span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Iterator</span><span class="p">[</span><span class="nb">int</span><span class="p">]:</span> <span class="o">...</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">collect</span><span class="p">(</span><span class="n">items</span><span class="p">:</span> <span class="n">Iterable</span><span class="p">[</span><span class="nb">int</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span> <span class="o">...</span>
</span></span><span class="line"><span class="cl"><span class="n">result</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="n">collect</span><span class="p">(</span><span class="n">Bucket</span><span class="p">())</span>  <span class="c1"># Passes type check</span>
</span></span></code></pre></div><p>代码中定义了 Bucket 这种类型，并且提供了两个类成员。这两个类成员刚好是 Interator 的定义。
那么在实际使用中，就可以使用 Bucket 替换 Iterable。</p>
<h3 id="pep-586--pep-589--pep-591-持续增强">PEP 586 / PEP 589 / PEP 591 持续增强</h3>
<p><a href="https://www.python.org/dev/peps/pep-0586/">PEP 586 &ndash; Literal Types</a>
在 Python 3.8 实现，支持了字面量作为类型使用。
比如 <code>Literal[4]</code>，举一个更有语义的例子 <code>Literal['GREEN']</code>。</p>
<p>我第一反应这和 Scala 里面的 Symbol 非常像，Scala 中写法是 <code>Symbol(&quot;GREEN&quot;)</code>。
这个特性使用挺学院派，很容易在 DSL 里面写的天花乱坠。
Scala 官方有说过可能在未来移除 Symbol 特性，建议直接使用常量替代。</p>
<p><a href="https://www.python.org/dev/peps/pep-0589/">PEP 589 &ndash; TypedDict: Type Hints for Dictionaries with a Fixed Set of Keys</a>
给 Dict 增加 key 的 Type，继承 <code>TypedDict</code>。</p>
<p><a href="https://www.python.org/dev/peps/pep-0591/">PEP 591 &ndash; Adding a final qualifier to typing</a>
增加 <code>final</code> / <code>Final</code> 两个概念，前者是装饰器，后者是注解，标注该类 / 函数 / 变量无法修改</p>
<p>至此，Python 3.8 已经具备我们日常需要的类型系统特性（非运行时 😂）。</p>
<h2 id="总结">总结</h2>
<p>遗憾的是，<code>typing</code> 模块在文档鲜明的标注：</p>
<blockquote>
<p>The Python runtime does not enforce function and variable type annotations. They can be used by third party tools
such as type checkers, IDEs, linters, etc.</p></blockquote>
<p>即：Python 运行时（Intercepter / Code Evaluator）并不支持函数和变量的类型装饰符。
这些装饰符只能由第三方工具检查，比如类型检查器、IDE、静态、Linter。</p>
<p>这个信息说明了 Python 在类型安全上尝试的局限性。所有的限制、约束都不会发生在运行时，
想要从类型系统中收获工程上面的价值，只能借助第三方工具。</p>
<p>诚然，Python 社区在竭力向类型系统靠拢，但是这种非语言级别 Runtime 的支持，到底能走多远呢？
Python 缺少金主爸爸，干爹 Red Hat 投入资源也有限。连社区从 Python 2 切换到 Python 3 都还没走完，为何？
投入产出比太低，新特性缺乏足够的吸引力，替代品太多。</p>
<p>另一方面，看看竞对们：
动态语言在往静态语言靠拢，而静态语言也在不断吸收动态语言的特性。比如 Java 14 里面的 REPL（Read-Eval-Print-Loop），
Kotlin / Scala 等语言的类型推断（Type Inference）。
也许这种演进方式更能够让用户接受吧。</p>
<h2 id="参考">参考</h2>
<ul>
<li><a href="https://docs.python.org/3/library/typing.html">typing — Support for type hints — Python 3.8.3 documentation</a></li>
<li><a href="https://www.python.org/dev/peps/pep-0483/#type-variables">PEP 483 &ndash; The Theory of Type Hints | Python.org</a></li>
<li><a href="https://www.python.org/dev/peps/pep-0484/#abstract">PEP 484 &ndash; Type Hints | Python.org</a></li>
<li><a href="https://www.bernat.tech/the-state-of-type-hints-in-python/">the state of type hints in Python</a></li>
</ul>
]]></content>
    
  </entry>
  <entry>
    <title type="html"><![CDATA[浅谈 Code Review 之事前准备]]></title>
    <link href="https://blog.alswl.com/2020/03/before-code-review/"/>
    <id>https://blog.alswl.com/2020/03/before-code-review/</id> 
    <author>
      <name>alswl</name>
    </author>
    <published>2020-03-31T12:13:00+08:00</published>
    <updated>2020-03-31T12:13:00+08:00</updated>
    
    <content type="html"><![CDATA[<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/upload_dropbox/202003/computer.jpg" alt="image from pixabay"  />


</p>
<p>随着业务规模扩大、团队组成变复杂，如何降低项目实施风险，降低软件复杂度变得尤为关键。
我从 Martin Flower、Joel Spolsky（<a href="https://book.douban.com/subject/4163938/">软件随想录</a> 作者）
等巨匠智慧中寻找解决复杂工程之道，其中 Code Review 是行之有效手段。
我认同 Code Review 价值也是忠实执行者。</p>
<p>加入蚂蚁以后，我在所接触项目中都大力推广 Code Review。
感谢团队信任和支持，目前 CR 协作进展顺利，
项目 CR 从最早不主动，到现在形成基于模块 Owner 制度 CR 和 Peer Review。
我也曾经在 3 个月内处理完成 700 多个 Pull Request，并在 PR 讨论中中都留下一些有价值讨论。
这里我将自己对 Code Review 一些理解记录下来。</p>
<p>这一篇先讲讲进入 Code Review 之前需要做准备工作。</p>
<!-- more -->
<h2 id="评估团队成熟度">评估团队成熟度</h2>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/upload_dropbox/202003/team.jpg" alt="image from pixabay"  />


</p>
<p>不管是在一个遗留系统上推广 Code Review，还是在一个新团队推广 Code Review，
起手式不是立马挽起袖子猛干，而是应当观察一下当前所处情况是否允许自己推动这个「艰巨」任务。
最需要观察的是团队成熟度。</p>
<p>我将团队成熟度粗略分为草台班子、成长型团队、成熟团队。
具体衡量指标可以有成员技术储备、团队成员信任度、团队负责人对工程管控力度。
相信集团内大部分团队处于成长型、成熟型团队。
但如果考虑到生态同学一起协作，或者临时因为紧急项目凑在一起，就比较容易成为「草台班子」。</p>
<p>如果还停留在草台班子，那就得先在团队内形成一定共识：
包括技术共识和合作模式的共识。
技术共识需要包括：技术栈共识、好代码定义、研发流程共识等。
合作模式共识需要包括：冲突解决机制、职责范围边界、决策机制等。
如果基本共识还没有形成就仓促进入 Code Review，那就容易将一件好事变成工程师战争。</p>
<p>并不是所有团队、项目都适合无差别引入 Code Review。这么几种情况建议暂缓 Code Review 推广：</p>
<ul>
<li>老板和同事都不支持甚至反对</li>
<li>业务重要性低，或者团队都是特立独行高手</li>
<li>创新业务需要快速上线，这时候适合将这类任务分发给配合度高老团队，或者给高手单兵作战</li>
</ul>
<p>当条件不满足时也不用气馁。先成为一个布道师吧，探索一下团队中有没有相似想法的人，了解一下他们担心点和诉求点。
相信只要条件允许，没有人会拒绝提高工程质量。</p>
<h2 id="构建好代码共识">构建「好代码」共识</h2>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/upload_dropbox/202003/book.jpg" alt="image from pixabay"  />


</p>
<p>Code Review 核心产出物是代码，如何界定代码是好是坏就至关重要。
根据 Bjarne（「C++ Programming Language」作者）、Grady Booch（「面向对象分析与设计」作者）等人定义，
总结下来好代码有这么基本特征（via「Clean Code」）：</p>
<ul>
<li>正确</li>
<li>可测试</li>
<li>不重复</li>
<li>少且简单</li>
<li>可读</li>
</ul>
<p>深思一下这些基本特征背后道理：代码是人类和机器沟通工具，好代码也要利于人类阅读和再次书写。
人比机器更犯错，机器算力在成倍增长，因此简单易维护重要度逐步增高。
这些朴素道理也正是语言从低级语言进化到高级语言驱动力，
也是近几年高级语言语言特性主打点（类型系统、格式系统、面向人类同步思想异步设计）。</p>
<p>但上面这几条原则太底层了，无法成为实践标准。
因此行业基于这些公理衍生了不少实践定理，我将其分为工程规约和设计范式两类。</p>
<p>工程规约包含语言风格规约和应用工程规约。
语言风格规约比较容易理解，开源世界提供了很多选择。硅谷大厂 Google / Facebook / Uber 等都有不少规约提供。
国内还有极具价值的「阿里巴巴 Java 开发手册」，我称之为 50331 ;)
（PS：「阿里巴巴 Java 开发手册」不仅有语言风格规约、也有应用工程规约和一部分设计规约）。
这里罗列了一些常见面向语言的 Style Guide。</p>
<ul>
<li><a href="https://google.github.io/styleguide/">Google Style Guides | styleguide</a>
<ul>
<li>包含 C++ / Object-C / Java / Python / R / Shell / HTML CSS / JavaScript / AngularJS / Common Lisp / Vimscript</li>
</ul>
</li>
<li><a href="https://github.com/alibaba/p3c">alibaba/p3c: Alibaba Java Coding Guidelines pmd implements and IDE plugin</a>
<ul>
<li>Java</li>
</ul>
</li>
<li><a href="https://github.com/airbnb/javascript">airbnb/javascript: JavaScript Style Guide</a>
<ul>
<li>JavaScript</li>
</ul>
</li>
<li><a href="https://github.com/uber-go/guide">uber-go/guide: The Uber Go Style Guide.</a>
<ul>
<li>Go</li>
</ul>
</li>
</ul>
<p>应用工程规约关注点则更为落地：包括依赖管理、配置管理、应用层次结构、对外服务暴露约束，数据建模，文档注释，测试管理，
甚至包含中间件使用规约。
这些规约逐步从「如何表达代码」延展到到「如何管理工程」。
这块发挥空间比较大，中大规模团队会有应用框架组这样团队。
基于应用框架对使用方式方法约束。针对具体业务使用也会给出针对性建议。
这些定理总结出来往往以轻量 Best Practice 和重量级应用框架对外输出。</p>
<p>这里举两个例子说明一下应用工程规约应该讲清楚哪些问题。
第一个例子 <a href="https://github.com/alibaba/COLA">alibaba/COLA</a>
这个项目来说，它约束了整体工程结构，并且明确的通过 Archetype 帮助（约束）用户行为。
第二个例子是 RoR / Django 这类 RoR 框架，他们使用约定大于配置方式，基于 ActiveRecord 这种模式约束了用户如何使用框架，
从 Model、Controller 到 Router，对立面则是 Spring MVC / Flask 这类框架，几乎只提供纯技术特性，不约束开发者行为。</p>
<p>除了阿里 Java 开发手册，这里提供三个应用工程规范供参考：</p>
<ul>
<li><a href="https://github.com/alibaba/COLA">alibaba/COLA: Clean Object-oriented &amp; Layered Architecture</a></li>
<li><a href="https://tech.antfin.com/docs/2/48599">SOFA 项目工程结构 - 蚂蚁金服金融科技</a> 和 <a href="https://tech.antfin.com/docs/2/56003">SOFA 微服务平台概述 - 蚂蚁金服金融科技</a></li>
<li><a href="https://github.com/realpython/python-guide">realpython/python-guide: Python best practices guidebook, written for humans.</a></li>
</ul>
<p>比工程规约更难定义的是设计范式，核心点是解决「如何做架构决策」。
设计范式决策过程在系统架构设计和系分设计阶段就应当完成了。
如果设计范式差异性导致代码在 Code Review 阶段出现意见不一。
要么是这个团队过于草台班子，要么是这个项目架构师/负责人在前期设计做的工作太少了。</p>
<p>当一个团队遵循相近设计范式，意味着他们达到了同一级别技术储
备，并形成了统一自顶向下设计打法。
在 Code Review 过程中，一些范式使用完全可以将 GoF23 / S.O.L.I.D. / DDD 这些术语概念拎出来。
相信 Commiter 和 Reviewer 可以基于业务场景快速达成一致。</p>
<p>方法论贴在墙上是无法解决开发中中遇到设计问题，在代码中真刀真枪干，Show me the fuck code。</p>
<h2 id="code-review-沟通协作机制">Code Review 沟通协作机制</h2>
<p>




<img loading="lazy" src="https://e25ba8-log4d-c.dijingchao.com/upload_dropbox/202003/teamwork.jpg" alt="image from pixabay"  />


</p>
<p>除了工程规约，还有一件事情往往会被忽略，如何解决冲突？
这个冲突不是指代码 Conflict，而是面对技术方案决策时候交流讨论。</p>
<p>文无第一武无第二，两个秀才在一起能吵到天翻地覆面红耳赤。
技术层面 Augue 容易陷入我说我有理你说你有理局面。这种情况如何解决？
没有一个好协作机制，会倒逼 Commiter 和 Reviewer 退缩，不能充分展开讨论。
这是我们不想看见。</p>
<p>很多时候技术决策就是在 40% 正确性 和 60% 正确性中间选择，看中长期收益和短期收益就可能导致结论不一样。
非黑既白反而不容易有争论。想要促进快速决策，一套冲突解决机制就不可缺少。
因此一定要在事前制定一套冲突解决机制。大部分冲突解决都可以使用这么一套逻辑：数据、逻辑、民主、独裁。
当需要进行某个技术或者产品决策时候，最优先方式是用数据来量化，证明自己观点。
当数据不充分时候，可以进行逻辑归纳推衍形成结论。
当形成逻辑不能服众众说纷纭时候，可以使用民主方式进行裁决。
当民主也无法生效，就需要 Owner / 一号位力排众议，进行独裁决策了。</p>
<p>CodeReview 有这么几种形式，同步离线、异步离线、同步在线。
处于同步形式 CodeReview 需要尽快处理掉 PR，这时候协作机制一定要干净利索，避免大家在 PR 反反复复来来回回讨论。
如果每个 PR 都要消耗数次来回沟通，我建议将 CR 形式升级到同步在线，拉个会议立刻将事情解决。</p>
<p>如果在一个实现方案上真无法决策，如果不涉及原则，那我建议使用搁置争议，使用
<code>TODO @commiter what, how, when</code> 方式先标记意见和处理时间，先行将工程开发往下推进。</p>
<p>一切准备好了，谢天谢地，终于可以进入 Code Review 阶段了。
我们下篇文章再来讲进入 Code Review 阶段的事情。</p>
]]></content>
    
  </entry>
</feed>

