普通视图

发现新文章,点击刷新页面。
昨天以前收藏

领域驱动设计DDD在B端营销系统的实践

通过营销活动实现客户/用户拉新、留存和促活是业界普遍采用的方法。为实现商户增长和留存,美团核心本地商业/商业增值技术部也构建了相应的营销系统来支撑商户的线上营销运营。在系统建设过程中,面临着业务体量大、行业跨度大、场景多样、客户结构复杂,需求多变等挑战。本文试图还原从0到1构建面向商户的营销系统过程中,并通过DDD(领域驱动设计)来应对系统设计和建设中遇到的业务复杂度高、需求多变、维护成本大等问题。

2 基本概念

软件系统的复杂性主要体现在三个方面。

  • 隐晦:一是抽象层面的隐晦,抽象系统时,每个人都有自己特定的视角,你需要站在对方的角度才能明白他为什么这么做;其次是实现层面的隐晦,代码是一种技术实现,通常与现实世界的业务概念脱节,无形中增加了理解成本。
  • 耦合:代码层面的耦合扩大了修改范围;模块层面的耦合需要跨模块/服务交互;系统层面的耦合则需要跨团队协作。从代码到模块再到系统,耦合的影响逐渐扩大,成本随之增加。
  • 变化:业务需求决定了系统功能,不同的用户需求不一样,不同的业务发展阶段需求在不断变化,系统功能要随着业务需求的变化不断调整,这时就涉及到系统改动的频次和范围。

DDD(Domain-Driven Design,领域驱动设计)是应对软件设计复杂性的方法之一,它能很好的解决上述三个问题,但其概念体系复杂(如下图所示),学习曲线陡峭,即便深入研读DDD的两本经典著作,项目落地时依然有点“捉襟见肘”。

在展开介绍DDD之前,这里先回顾一下历史:

  • 早期,计算机创新更多聚焦在语言方面,为软件工程师提供功能更强大的语言来操作计算机,充分使用计算机的算力。
  • 60年代,面向对象语言诞生,通过封装、继承、多态等特性进一步增强了语言的表达能力。
  • 80年代,出现面向对象的分析与设计,解决了如何构建类模型的问题,帮助我们更好地使用面向对象语言来实现系统,但没有解决如何把物理世界映射到计算机世界的问题。
  • 2000年,出现领域驱动设计方法,通过分析业务,抽取概念,建立对应的领域模型,再采用面向对象的分析与设计方法构建对应的类模型,达成了从物理世界到计算机世界的映射。

什么是领域?领域由三部分组成:领域里有用户,即涉众域;用户要实现某种业务价值,解决某些痛点或实现某种诉求,即问题域;面对业务价值,痛点和诉求,有对应的解决方案,这是解决方案域。什么是领域驱动设计?通俗地讲,针对特定业务,用户在面对业务问题时有对应的解决方案,这些问题与方案构成了领域知识,它包含流程、规则以及处理问题的方法,领域驱动设计就是围绕这些知识来设计系统。

以营销为例,营销系统所服务的用户有4类:运营、销售、电销人员和商户。解决3个核心问题:如何发券、发给谁、发什么(红包还是折扣券)。解决方案:通过营销活动来承载发券,不同的活动类型对应不同的玩法(如买赠、折扣、充送等);通过目标人群来确定发给谁;通过权益来定义发什么(如:红包、代金券、折扣券等)。

  本文将从战略设计、战术设计和代码架构分3个部分介绍领域驱动设计的落地:

  • 战略设计:确定用例,统一语言和划分边界。
  • 战术设计:概念模型转化成类(代码)模型。
  • 代码架构:将系统设计映射为系统实现。

3 战略设计实践

战略设计之前,先要确定用例,也就是业务是怎么玩的,有几种常见的方法:

  1. 用例图:最简单直观的表达了用户与系统的交互。
  2. 用户故事:敏捷开发模式下用的较多,从Who、What和Why三个维度描述了业务需求。
  3. 交互原型:用户操作的页面及其操作流程,其缺点是过于关注用户体验,而忽略了业务底层逻辑。
  4. 事件风暴:关注业务的底层逻辑,但使用门槛较高,适用于大型而复杂的业务分析。

下图是营销系统的用例图(起初并没有这么完整,这是多次迭代后的结果):

确定业务玩法后,接下来是统一语言。从用例里抽取概念,并对概念进行甄别(去伪存真,抽象合并)找到真正描述业务的概念。比如,有多种方式来描述活动规则:充值送规则、返还规则和档位等,技术可能会泛泛地称其为规则,业务人员则用档位来描述(比如充值送活动,充1000送100红包,充2000送300红包,充3000送500红包,那1000、2000、3000就是业务所认为的档位)。抽取概念时,尽量采纳业务侧的叫法,这样统一语言比较容易推行。

接着是明确概念的含义,概念由术语、Term(术语的英文版)和含义三部分构成。含义明确的术语就是统一语言,这些术语将用在日常需求沟通、产品文档,技术设计以及代码实现中。

明确概念后,接着理清概念之间的关系(1对1,多对1,多对多),确定概念所代表的的业务实体的核心属性和行为,从而得到概念模型。后续在业务需求讨论、产品和技术方案设计时,基于这个概念模型,使用统一语言进行描述,大家能很容易对齐;同时精心抽出的概念和建立的概念模型更接近业务本质,为后续的战术设计打下了基础。

基于统一语言和概念模型,业务 - 产品 - 技术三个角色比较容易就需求达成共识,保障沟通的一致性。

缺少这些就很容易出问题,如:刚开始做营销系统时,在如何描述“商户”上,没有统一语言,资金域有三个概念来描述商户(资金账户、账号ID、资金账号),商家域有四个概念描述商户(商家账号、商家ID、登录号、登录ID),到了营销域,不同的人采用不同的概念来描述商户,造成了沟通的混乱。给商户发红包时,“资金账户、账号ID、资金账号、商家账号、商家ID、登录号、登录ID”这些概念都可以描述商户,但业务人员弄不清这些概念之间的区别,导致ID误用,红包发错。事后对这些概念进行了梳理和统一,营销域只关注资金账户和商家账号,系统功能上明确使用资金账户或商家账号来发送红包,这样就不易出错了。

概念模型是一张大网,描述了概念间的关系以及关键属性,但还不能直接映射为代码模型,要映射为代码模型,还需拆解,化繁为简。

本源论认为世界的本质是简单的,复杂问题由多个简单问题构成;康威原理认为系统架构受制于组织沟通架构,系统落地时,首先要确定系统边界,再依据系统边界组织分工。这两个原理表明:我们可以将复杂问题拆解为多个简单问题,并针对团队资源组织分工协作。

这里提供一种拆解方法(来自美团内部)给出了一种拆解方法:按纵和横两个维度来拆,纵是从业务价值和目标维度划分,横是从功能的通用性维度划分。这里尝试从业务角度来拆,没有系统支持时,业务要在线下运转,通常根据要达成的业务目标,将业务流程或业务组分拆解为多个节点,并定义每个节点的职责以及对应的规范和标准,安排对应的组织或人员执行。简单地说,就是从业务问题和解决方案出发,拆解到对应的人。因此基于业务的拆分通常能实现系统用户、业务问题和解决方案之间的一致性。业务系统是把业务的玩法从线下搬到线上,在进行系统拆分时,也可以使用这个思路。从三个层面来进行:

  1. 基于涉众域拆解:也就是按用户相关性进行拆解,不同的用户使用不同的系统功能,如:CRM由市场人员、销售人员、客服人员三类角色协同完成客户触达,签约合作,售后服务三大职能,针对这三个角色建设相应的系统能力。这种拆解方式比较简单,但也存在较大的局限性,可能导致功能的重复建设。
  2. 基于问题域拆解:不同角色/用户要解决的问题是相同/相似的,可基于问题域进行拆解,如营销系统的用户包括销售、商户、销运等角色,但它核心是要解决如何发券(活动),发给谁(人群),发什么(权益)的问题。基于问题域的拆解相较于基于涉众域的拆解更加抽象,但也可能复用性不够。
  3. 基于解决方案域拆解:不同的问题,可能有相同的解决方案,如HR域有请假审批、财务上有报销流程、CRM领域存在客户资质审批,三个领域各自需要解决审批流程的问题,可以构建通用的审批流引擎来统一解决,这是基于解决方案域进行拆解。基于解决方案域的拆解最抽象,也最贴合业务本质,但也容易陷入过度设计的陷阱。

营销系统基于问题域拆解为五个子域(活动域,权益域,人群域,推送域,数据域),每个子域解决特定的问题,各子领域相对内聚和简单:

业务系统要运转起来,需要子域之间相互配合,这就要定义上下文映射,实现不同子域间的协作。如活动域关注的两个目标人群:一是资金账户(表示已签约的商户);另一个是商家账号(表示未签约商户)。资金账户是财务域定义的,而商家账号是账号域定义的,两个概念都不是营销域原生概念。此时,营销域需通过某种方式依赖外部概念,将外部概念映射到营销域,通过防腐层来对接外部服务来实现这种映射。领域驱动设计里定义九种上下游映射关系,这里不赘述:

下图是营销系统的整体上下文关系:

从用例分析,统一语言到子域拆分,初步完成战略设计,但这并非终局,战略设计是一个持续迭代的过程,迭代的来源主要有3个:

  1. 用例精化:在探讨需求的过程中,用例不断丰富。
  2. 需求变更:业务不断发展带来需求变化,进而影响用例及相关概念的内涵,概念模型亦随之调整和迭代。
  3. 方案选型:当产品,业务或技术发生较大变化时,可能需要采用另一种方式实现它,这时所采用的概念会有所不同。比如早期构建营销活动域时,通过参与规则来定义谁可以参加活动,将商户与参与规则进行匹配,符合就能参与。这种方式带来的问题是无法提供一个完整的活动人群列表,除非将所有商户(5000万+)匹配一遍。随着业务方越来越重视活动参与商户的分层,触达和转化,引入目标人群的概念,通过目标人群来保存所有可参加活动的商户。从参与规则到目标人群,概念发生了变化,底层模型也完全不一样(参与规则是一套规则体系,而目标人群由筛选服务提供),实现了战略设计上的迭代。

有了战略设计,构建了统一语言和概念模型后,如何验证概念模型呢?通常用两个方法:

  1. 场景走查:把模型代入到所有的场景确认一遍,确定所抽象出来的概念模型和统一语言能正确描述它。
  2. 业务预判:未来业务的变化会在哪里,当变化发生时,概念模型的内涵和外延是否方便扩展并支持到变化。

4 战术设计实践

战略设计得到了概念模型,战术设计则是将概念模型映射为代码模型,有很多编程范式,比如事务脚本、表模式、面向对象,函数式等,最好的方式是面向对象的实现。

从概念模型到对象模型:

  • 首先,概念是分层的,如营销活动是一个泛化概念,其下还有充值送活动、消费返活动,买赠活动等具体活动。构建对象模型时,通过派生/继承来实现概念分层。
  • 其次,概念关系映射成对象关系,比如营销活动包含了档位和库存,那在构建营销活动对象时,可通过组合实现这种包含关系(档位对象和库存对象成为营销活动对象的属性)。
  • 最后,概念的属性行为,可以直接变成对象的属性和行为;概念的状态机以及生命周期也会变成对象的状态机。

两类对象:实体和值对象,这两者的区别是是否有统一标识和自己的状态。

有了对象模型,还需通过聚合根完成封装,如何确定聚合根的粒度?营销活动包含活动、库存、档位、档位项、目标人群五个对象,如果采用小聚合根模式,一个对象对应一个聚合根,这样每个聚合根都很简单。但从业务角度看,库存或档位会影响活动的状态,如:修改了库存或档位,活动需要重新审批和上下线,这种业务上的耦合需要在技术上进行处理。此时,就得在小聚合根上构建领域服务来封装这些逻辑。

另外一种模式是大聚合根。围绕活动,把活动相关的概念(活动、库存、档位、档位项、目标人群)都封装起来,但聚合根比较复杂,影响活动加载(一些活动的目标人群上百万,懒加载可解决问题,但增加了复杂度)。

聚合根的设计要遵循一定的原则:

  1. 满足业务一致性、数据完整性、状态一致性。比如库存档位和活动状态要一致,在数据上也要完整,不存在没有档位的活动,也不存在没有库存的活动。
  2. 技术限制。有些实体会带来技术挑战,如数据量太大,可抽出来单独考虑。
  3. 业务逻辑不灭,在业务封装与适度的职责边界之间寻找平衡。不管是大聚合根还是小聚合根,业务逻辑永远都是存在的,就是看把它放在哪里。

如下图是营销系统的聚合根:

聚合根已经非常接近代码实现,落地代码时,大家还会纠结用贫血模型还是充血模型。Spring MVC通常运行在单例模式下,引入充血模型会增加理解成本和技术复杂度。另外,不适合放在聚合根里的领域逻辑,可以放在领域服务里,如:同时存在多个充值送活动时,用户只能参加优先级最高的一个,在充值送活动聚合根里会标识活动的优先级,但挑选优先级最高的活动并非聚合根的职责,但确实是领域逻辑的一部分,此时可通过领域服务实现。

从概念模型,类模型到代码实现,整个过程都要使用统一语言。在落地代码时,代码要体现出业务含义,比如下图的例子,要避免左边updateStatus()这样的方法,它没有体现业务含义(必须阅读代码实现,才知道这个方法做了什么);图中右边的submitCampaign(),approveCampaign(),cancelCampaign()则有明确的业务含义。

5 代码架构实践

完成战术设计后,如何组织代码架构?无论是六边形架构,整洁架构还是洋葱架构本质上都是围绕着领域模型展开,应用层、基础设施层和外部接口都依赖领域模型:

下图是我们团队的工程实践,与前面三个图本质上是一样的。领域层和应用层次放在中间(两者都属于领域逻辑),基础设施和用户接口依赖中间层:

6 总结

  • 我们做的大部分系统都不是全新系统,如CRM、HR或SCM等,已经有很多业界实践,可充分借鉴这些实践,没必要自己创造新概念。
  • 要重视统一语言。没有统一语言就不会有概念模型,没有概念模型就不可能有靠谱的代码模型,拿到需求后就开始设计代码模型是不靠谱的。
  • 领域驱动设计是团队工作。现实中没有一个是严格意义上的领域专家,所有参与到这项工作的人都可以是领域专家,整个工作可以由技术团队主导,但一定要落地到产品和业务。
  • 拥抱变化,持续迭代。模型是相对稳定的,但并非一成不变,业务理解的深度,抽象的角度与方式,业务的变化都会影响到领域模型,领域模型的建立是持续迭代的过程。

这里分享几个常见的误区:

  • 深陷领域驱动设计的概念体系。在代码里生搬硬套领域驱动设计里的概念,比如聚合根、值对象、实体等,掰扯概念之间的细微差异,设计复杂的领域事件等。这反而增加理解成本,让系统变得复杂。领域驱动的精髓在于从业务出发,抽象出业务领域知识,构建概念模型,一步一步将这些概念模型映射成系统。至于如何采用聚合根、领域服务、实体、值对象、领域事件等,可以灵活取舍。
  • 试图通过精心设计来获得领域模型。领域模型不是设计出来的,而是通过战略设计的几个步骤,从业务中抽象出来的,最重要是理解业务,对业务进行抽象。
  • 使用了DDD就一定会产生好的领域模型的想法也不可取,我们知道飞机怎么造,但我们不一定能够造出好飞机,但如果我们知道这个方法,可以少走弯路。 

在聊需求的那一刻,设计就开始了,统一语言就是设计的一部分。

解决方案域在模型维度分为四层:

  1. 功能模型:产品表达给我们业务的玩法,我们把它变成了用例,从用例里抽取出功能模型。
  2. 概念模型:对功能模型进一步抽象,统一语言,形成概念模型。
  3. 代码模型:将概念模型映射为代码模型。
  4. 数据模型:业务数据需要存储,需要设计对应的表结构。

这里有两个陷阱:

  1. 看到功能模型后,就开始设计数据模型,考虑数据该怎么创建、怎么更新、什么时候该删除,沦落为CRUD boy。
  2. 看到功能模型后,就开始考虑操作数据的流程是什么,陷入到事务脚本陷阱。(对于一些简单的功能,不排斥使用事务脚本,但对于复杂功能,事务脚本的维护成本非常大)

另外,领域至少可以分为两大类:一是学科型,比如财务、会计、图形学、动力学,这类系统的设计须先深入理解学科知识;二是实践型,如CRM、订单交易等,是业务经验的总结,这类系统的设计不妨参考前人的实践。当然,如果自己的业务具有独特性,那就只能靠自己摸索了。

7 参考资料

谈《矛盾论》

作者 Ludwig Wang
2024年5月25日 20:00

《矛盾论》这篇文章在毛选中算是非常长的,全篇两万五千多字,其历史背景、目的同《实践论》是一致的。在时间线上,《实践论》在前,《矛盾论》在后。简单来说,两论都是毛泽东当时为了克服存在于党内严重的教条主义思想,才写出来的如此宝贵的两篇哲学文章。其中《实践论》告诉了我们为什么教条主义和经验主义是错的,而《矛盾论》告诉了我们应该怎么做才是对的,所以它既是一种世界观,也是一种方法论。

49a4889635e79e8d0ebaf941b83c64ad90892809.webp

在《矛盾论》中,毛泽东首先写到两种宇宙观,简单来说,两种宇宙观是唯物辩证法的宇宙观和与之相对立的形而上学或者唯心主义观。换句话说,唯物辩证法看世界的一切观点都是联系的、运动的。那么反之,形而上学或者说唯心主义观去看待一切事物的观点则是孤立的、静止的,所以唯物辩证法是联系的、运动的观点看世界,唯心的形而上学是孤立的、静止的观点看世界,这也就引出了联系、运动、孤立、静止的四个观点。

联系的观点是说这个世界或者文中说的宇宙中的一切都是联系的,就像一张网一样,每件事物的发生、运动、终结都会受周边事物的影响,同时它也无时无刻不影响着它周围的事物,而用联系的观点看世界后,我们才能掌握事物发生变化的规律。无论是行军作战还是日常生活,任何一件事都是和周围事物有联系的,甚至和一些隔得很远的事物也会产生联系,所有的事物联系起来看,不要放过任何一个可能发生联系的事物,而这个联系的现实意义就在于学会用全局观的视角来看待事物。

运动的观点在辩证法里也可以衍生出一个很熟悉的观点 —— 原因和结果,因为事物是运动的,所以它的现状必然由之前的种种原因发生演变而来,任何事物的产生都可以找到原因,同时它的现在也会成为一种原因,演变成它将来的局面,比如当你看到一个农民很懒,你就会说懒人就是活该穷,看到一个富人比较勤奋,就会说果然有钱人就很勤奋,勤劳能够致富啊,但如果我们用运动的观点看问题,我们就知道懒惰这件事不会无缘无故的发生,它的发生必然有发生的某种原因导致了今天的懒惰。换句话说,尽管这其中的现实问题会很复杂,但原因绝不是无缘无故产生的,我们只有把这个原因找出来,我们才能更好的解决,也能更好的预防。把这个观点带入到生活中去,重新审视一下我们看待事物的视角观点,就会发现会带来很大的变化,任何事物都是运动的,既然是运动的,那么它今天的情况必然是由昨天某种情况衍生出来的,而今天已经出现的情况又必然引起未来新的变动,这种观点也将对一个人的战略意识、规划意识有非常重要的意义,能够帮助我们预判事物的发展衍生前途,这便就是运动的观点。

当把联系的、运动的观点看世界放到我们的生活里,重新把自已已经发生的事儿和即将发生的事尽可能的去对照分析,会有很大的帮助,与之对应的则是静止、孤立的观点,这刚好和联系、运动相反,看事物不会和周边事物联系,同一个事物不会做前后的对比,这就是静止和孤立观点。当带着这个观点去看历史会发现,古代皇帝们往往喜欢用静止孤立的观点看问题,他们认为事物的变化是外因,不是内因,所以皇帝要下台必须是外因,比如自然灾害、将领造反等等,这样一来,就掩盖了阶级的观点,也就掩盖了封建特权的剥削和压迫,所以《矛盾论》中说,“形而上学曾长期为统治阶级所拥护,后来输入了欧洲的机械唯物论和庸俗进化论,又为资产阶级拥护。”当我们把这句话带入历史,将联系、运动的观点也带入进去,就会发现其中所蕴含的秘密。用联系、运动的看世界,由此会衍生出全局观、战略观的方法论;用静止、孤立的看世界,那么我们的视角就会陷入局部、片面、单一的视角,因而两种观点会在文化领域展现出来不同意识,这也是为何静止、孤立的观点会有如此广大的市场。

v2-31f4ca97799f2683b41384be217935cd_720w.jpg

为什么说用联系的观点、运动的观点会看到一切事物的发展都是由内因及内部矛盾推动的呢?又为什么说矛盾推动一切事物的发展和运动呢?

我认为首先需要理解毛泽东这篇文章题目的“矛盾”指的是什么,矛盾是指一种对立统一的关系。换句话说,矛盾不是指的具体的某个事物,而是处于事物内部或者一事物与另一事物之间的对立统一关系,其核心就在于对立统一这四个字,矛盾的一切规律都是对立统一的规律,这种对立统一的规律也就是我们说的唯物辩证法。所以说唯物辩证法研究的一切范围都是矛盾的对立统一规律,而学习《矛盾论》的最重要意义是学会用矛盾的眼光看世界,用矛盾的方法分析事物。既然矛盾是一种事物的内部或者事物与事物之间的对立统一关系,那么内部矛盾自然就是事物内部所有的对立统一关系,而外部矛盾就是事物与其他事物之间的对立统一关系了。注意的是,这里的内部矛盾和外部矛盾是一个相对而言的概念,而分辨内部矛盾还是外部矛盾则是由我们选择分析的整体对象而言。你选择了把一个事物看作一个整体研究,那么处于这个事物内部所有的矛盾就称为内部矛盾,而事物之外的与此事物发生对立统一关系的其他事物之间的矛盾就是外部矛盾。

那么矛盾推动事物的运动和发展是什么意思呢?这里所说的矛盾既包含了内部矛盾,也包含了外部矛盾。用现在很流行的一种解释,是内部矛盾即内因,外部矛盾即外因,矛盾指的是一种对立统一关系,而内因、外因指的是一种因素条件,把这两者混为一谈是不对的,内因应是根据,而外因则是条件,内因是根据它是由事物内部矛盾性规定的。比如鸡蛋原理,鸡蛋内部的一切矛盾性规定了这个东西的性质是一个鸡蛋,而这个鸡蛋会走向何种变化,则是内因和外因共同作用的结果,它的走向有着被炒着吃、被打碎、孵化等等分支的命运,而走向何种命运,则是根据内因和外因的作用。当我们给鸡蛋创造合适的温度、孵化的各种条件,那么它就走向了孵化的命运;如果我们给它创造外力打击的条件,那么它就走向了破碎的命运,所以外因并不是说不重要,相反它很重要,在一定程度上决定了事物变化的方向和命运。但是反过来,我们创造了温度、时间、孵化等条件,但是它是一个石头,那么便不可能走向变成小鸡的命运,所以说内因是根据,而外因是条件,这个根据就是由内部矛盾规定的。

通过研究矛盾,从而确定事物的性质特点,也就是搞清楚它是蛋、是石头还是西瓜,搞清楚了基本性质,那么我们就能找出它的各种运动变化需要什么条件,剩下的任务则是发挥主观能动性,使它朝着我们想要的方向发生变化,这也就是努力的意义。

毛泽东在《论持久战》里,细致分析了日本的矛盾、中国的矛盾,从而得出日本侵略战争的性质,又得出中国抗日的性质,然后又把这两者作为一个整体看待这场抗日战争要向着何种方向演变,最后得出打赢抗日战争的条件,并附上了实现这些条件的操作手册,比如游击战、持久战、歼灭战、统一战线这些条件。为了实现这些条件,英勇的先辈们不计较一切代价,促成这些条件的发生、发展,最后终于打赢了这场战争,这就是内部矛盾外部条件的运用流程,所以分析矛盾就是要搞清楚事物的性质特点,才能掌握它变化的方向,从而创造条件使它朝着我们想要出现的变化方向前进。

因为矛盾是一种事物内部各要素之间或者事物与外部事物之间的对立统一关系,所以我们只有用联系的观点看世界,同时又运用运动的眼光看世界,才能看到他们的矛盾,才能看到他们的发展变化以及所需要的条件,所以要建立体系的思想、理论、方法技巧,当我们可以看到用联系、运动的视角看事物,也就看到了矛盾、条件、运动等等,所以它是一个体系,也是一个完整的方法论。

矛盾普遍性和矛盾特殊性

那么该如何分析复杂事物的矛盾呢?这里要首先了解矛盾的普遍性,这其中包含着两个含义,其一是一切事物的发展运动过程中都包含着矛盾;其二是同一事物发展的自始至终过程中都包含着矛盾,没有矛盾就没有生命,就没有一切。一切事物的运动都包含着矛盾,而运动是绝对,静止是相对的,所以我们可以认为世界处处都是矛盾,但是,有一个小问题,那就是差异是不是矛盾呢?

比如两口子组成一个家庭,我们把这个家庭看作一个整体,那么实际上这个家庭内部的所有矛盾都是内部矛盾,但是这小两口感情特别好,从来都不吵架,可能会偶尔拌嘴,但仅仅只是一些观点的差异,最后双方都会互相谦让,相互妥协,因此从来也没有出现矛盾斗争的场面。因此就出现一种观点,矛盾只有发展到一定阶段才会出现,而在《矛盾论》里,毛泽东反驳了这个观点,因为它不符合矛盾具有的普遍性的原理,即一事物发展的自始至终过程中都充满了矛盾,但口说无凭,一切观点的对错只有放到实践中去检验,方才有意义。在《矛盾论》中有一个例子,当时的富农、贫农都是农民,大家都穷,好像只有差异没有矛盾,但如果那么估计,实际上同样会丧失警惕性,一旦出现某种条件,矛盾就会激化。如果不提前准备,提前看到矛盾发展和运动的方向性可能性,那么就要出问题。比如井冈山时期的八月失败,就是没看到富农、贫农的矛盾,当白军围剿来临时,两者矛盾就会激化,富农可能会投机反水,反过来参与白军围剿贫农。所以有些矛盾或许一辈子都不会激化,但是并不是说它不存在,它时时刻刻都存在,只不过激化的条件可能一辈子都不会出现。因此差异就是矛盾,分析矛盾的时候就必须要关注到矛盾的方方面面,注意到一些看似还没有激化的矛盾,当条件变化的时候,是否有可能激化,条件的变化有没有可能,如果有可能,各种复杂的矛盾会发生哪些变化,哪些矛盾会激化,哪些矛盾不会激发。只有如此,才能真正的看到复杂事物的方方面面,把事物分析的清清楚楚,牢牢把握主动权,否则有时候就会出现局面失控,甚至是大意失荆州的情况。

那么矛盾为什么会具有特殊性呢?这是因为任何事物他们都不可能处于完完全全一模一样的环境之中,所具有的矛盾都不可能是完全一样的。也就是说,任何事物都具有其特殊的矛盾,是区分它和其他一切事物的依据。这就涉及到了教条主义问题了,教条主义的问题就在于把一些适用于解决普遍意义上矛盾的方法,直接照搬用到了看似相似的事物上,由此带来巨大的灾难。比如第五次反围剿前夕,教条主义者照搬苏联革命经验,不注重中国具有特殊的性质,认为都是无产阶级革命,都可以走城市进攻路线。因此,将种种策略、思想理论照搬而来,导致了第五次反围剿沉痛的失败,而一切矛盾都具有特殊性,如果我们把中国这个国家看作一个整体,那么它必然有着不同于其他国家的特殊性;如果我们把一个家庭看作一个整体,每个家庭也有着它的特殊性;如果我们把一个人看作一个整体,这个人也必定有着其特殊性。

所以,人认识事物其实就是认识事物所有的矛盾,找出这些矛盾的规律性,从而把事物推向我们想要的方向和结果。很多认识矛盾、解决矛盾的理论和方法是前人总结出来的,但是当我们把这些理论方法用到具体事物中的时候,具体事物会有其特殊性,所以就必须要结合实际情况做出调整改变,以适应事物的特殊性,而矛盾的特殊性不仅表现在不同的事物之间,而且表现在同一事物发展的不同阶段上,比如我们常说在什么场合说什么样的话、干什么样儿的事,其实说的就是矛盾的特殊性,不研究这些特殊性,而是把一般的规律直接照搬,问题就容易出现了。所以认识事物是从特殊到一般,从一个局部的东西不断研究开始,找出规律、共性等等,然后还要把这个共性的规律、理论重新运到具体的事物中去,又必须对实际事物加以认识、分析,这就是从特殊到一般,再从一般到特殊,缺少了任何一个过程都是不对的,矛盾的普遍性和特殊性大致如此,而难点在于实际分析过程中如何判断矛盾所处阶段、矛盾的转化变化等等。

在复杂的事物的发展过程中,会有着许多的矛盾存在,其中必有一种是主要矛盾,抓主要矛盾的前提是我们先找出所有影响着事物的发展、运动的矛盾,以及可能会在某些条件下激化以后导致影响事物的发展运动的矛盾,但这不是一件容易的事儿,也不是学了某个理论就能一蹴而就的事情,所以《矛盾论》中其实并没有具体的如何找出矛盾的论述和方法,它只是告诉我们一些矛盾的特点,这些特点均由矛盾的对立统一规律演变而来,比如相互影响、相互依赖、相互斗争、相互依存、相互联系等等,无论是工作还是生活中都有着矛盾,可以说社会上各种社会关系之间往往充满着矛盾,而当我们面对复杂矛盾的过程中,必须清醒的认识到,任何阶段都有且仅有一个主要矛盾,抓住这个主要矛盾,很多困难就迎刃而解了,而主要矛盾和次要矛盾的根本点就在于主要矛盾的存在和发展,规定和影响着次要矛盾的存在和发展。

在事物发展的过程中,主要矛盾不是一成不变的,它和次要矛盾有时候会发生变化。比如当帝国主义全力展开侵略战争的时候,那么主要矛盾就变成了中华民族同帝国主义的矛盾。除少数叛徒之外,所有阶级能够暂时性的团结起来,一切反对侵略战争,此时阶级矛盾就变成了次要矛盾,处于服从地位。但是当帝国主义采取的不是武装侵略,而是文化政治经济上的温和性的方式以后,则大资产阶级、大买办就会投降,站在帝国主义一边,共同实行对本国人民的压迫,而这个时候主要矛盾就发生了变化,阶级矛盾成为矛盾斗争的主要形式了。

中国近代史从北伐到土地革命战争,到抗日,再到解放,均符合这个规律,所以在事物发展过程中,主要矛盾也是会发生变化的。忽略了这种变化,认为主要矛盾不会发生变化,那么就会犯错误,会在不同阶段出现抓错主要矛盾的情况,但是不论怎样过程发展的不同阶段中,即使主要矛盾发生变化,但是有一点不变,就是只有一种矛盾起着领导的作用。不要把过程中所有的矛盾平均看待,我们要反对矛盾的均衡论,矛盾的基本形态是不平衡,其中必有主要矛盾,这就是我们说的抓主要矛盾。

那么一对矛盾中的两个方面是否是均衡的呢?比如日本侵略中国的时候,日本和中国既是矛盾着的两个方面,这两个方面是均衡的吗?谁又起着主要作用呢?答案是不是的,其中必有一方是矛盾的主要方面起着更为重要的领导作用,也就是对矛盾发展和演变的方向起着更重要、更有决定性的作用。比如抗日的三个阶段中,在前期日本力量极强,我方极弱,则发动侵略战争的主动权掌握在日本手里。双方的矛盾以何种形态发展,将向着什么样的方向演变,其主要作用的在日本方面。而随着持久战的继续,此消彼长,日本将逐渐走向战争泥潭,走向帝国主义的毁灭状态。我方则因为统一战线的持续、持久战的坚持、人民战争的发动,逐渐把主动权夺回到自己手里。那时候,矛盾着的双方地位开始发生转变,我方成为矛盾中的主要方面,而对方成为次要方面。那时,战争进入反攻阶段,是否反攻和是反攻,怎样反攻,这些决定战争走向和命运的主要决定权又回到了我们手里。于是矛盾的两个方面发生了转化,看清了这一点的意义就在于当着我们处于困难局面的时候,就必须观察矛盾的两个方面是否有可能发生转变,如果有可能,那我们就要想办法促成这种转变,尽早掌握主动权。

矛盾的主要方面与次要方面之间会发生转化的应用,可以说在解放战争中体现的淋漓尽致,一开始双方的矛盾的发展变化,将会走向何种命运的主动权,其实是掌握在国民党手里,他们起着是否发动战争的主要作用,决定了战争的性质。但是当我们分析了这种矛盾,发现我们有人民、土地革命等几个有利条件,随着战争的进行,力量将逐步强大,而敌方的有利条件,如武器装备、税收、外交支援等等,随着战争的继续,将逐渐衰弱。那么我们就可以断定,随着矛盾的持续发展,矛盾的主要方面及国民党方面会逐步转化成矛盾的次要方面,我方将逐渐掌握主动权,成为规定解放战争进程结果的一方。而要实现这一点,那么我们要创造一些条件,比如存人失地,人地皆存;每战必集中优势兵力消灭敌人;打歼灭战而非消耗战等等。总之,为着实现矛盾的转化,付出一切努力,最后赢取胜利。这种思维方式在毛选中涉及的军事思想里占据非常重要的地位,应该说从井冈山时期开始,这就成为了一个非常重要的指导原则。

U136P4T8D1741736F107DT20090619163237.jpg

那么矛盾的同一性和斗争性问题是什么呢?矛盾的同一性指的是在一定条件下矛盾着的两方面互相连接、互相渗透、互相贯通、互相依赖、互相合作,一方的存在以另外一方的存在为前提,就好比正和负、好和坏、善与恶、生与死、困难和顺利。一方的存在都是以另一方的存在为条件,没有好就无所谓坏,没有对就无所谓错,矛盾的东西会在一定的条件下统一起来,在一个体系中共同从促进事物的发展。

而同一性的意义在于在一定条件下,矛盾着的双方会互相连接,互相合作,共同促进事物的发展。另外,矛盾着的双方在一定条件下会互相转化,比如国共的第二次合作,这就是矛盾着的双方在共同抗日这样的条件下互相连接、互相合作、共同促进事物的发展。如果看不到这方面的意义,那么就陷入了关门主义,否认了矛盾在一定条件下可以互相连接、互相合作,比如资本家和无产阶级在新民主主义的条件下,会存在共同合作,共同促进社会发展的局面,这就是矛盾同一性原理衍生出来的一定条件下相互联结、相互合作的意义,忽略了这种意义,那么就会出现国共第二次合作的时候关门主义的观点。所以矛盾的同一性是有条件的,必须在一定条件之下,我们才会出现相互连接、相互合作、相互渗透等现象。相反,条件一旦破坏,则矛盾就可能激化,演变成为对抗性矛盾,所以不管什么矛盾,我们要关注到在什么样的条件下,矛盾会如何演变,是激化还是处于一种暂时得平衡。另外,矛盾着的双方还可能会出现相互转化的局面,地主可能随着矛盾的变化失去土地,农民可能会随着矛盾的变化拥有土地,这一切都是矛盾着的双方斗争的结果。

而在矛盾的斗争性中,同一性是相对、有条件的,而斗争性却不同,斗争性是绝对的、一定的。比如国共第二次合作中,斗争就是无时无刻不存在着的,蒋介石一方面有抗日的需求,当着抗日的压力巨大的时候,双方暂时性的统一起来,而当这种压力稍微减轻,则其消灭八路军、新四军的意图就立刻表现出来,忽略了这种斗争性,就会出现王明的观点,即一切服从统一战线,一切归于统一战线。相反,看清这种同一性和斗争性,则出现了毛泽东的以斗争求团结则团结存,以妥协求团结则团结亡,这就是矛盾的斗争性,他无时无刻不在斗争,关注的斗争性同样可以创造条件,使得斗争的方向朝着我们想要的方向进行演变,同时避免损失,减少斗争性对自己的伤害,这在《毛选》中的《统一战线中的独立自主的问题》一文里有着充分的体现,这正是矛盾的统一性和斗争性。

最后则是对抗在矛盾中的地位,对抗是矛盾斗争的一种形式,是矛盾发展到一定阶段难以调和,必须采取激烈的对抗形式才能解决的矛盾,便称之为对抗性矛盾。在人类历史中存在着阶级的对抗,这是矛盾斗争的一种特殊的表现,剥削阶级和被剥削阶级之间的矛盾,无论在奴隶社会也好,封建社会也好,资本主义社会也好,互相矛盾着的两个阶级长期的并存于一个社会中,他们互相斗争着,但要等两个阶级的矛盾发展到一定阶段的时候,双方才取外部对抗的形式发展为革命。

矛盾的斗争体现的意义告诉我们,当矛盾发展到不可调和、非常激烈的时候,妥协是没有用的,必须采取对抗的形式来解决这个矛盾。那么同理,当矛盾还没有发展到不可调和的程度的时候,则往往需要采取温和的方式,尽可能不要通过激烈的手段来解解决矛盾,否则也会造成很大的破坏,但如何估计矛盾确实是困难的,但是这个理论的意义就在于我们知道了这样的理论后,就可以有理有据的对过左过右的倾向提出依据。这个理论其实在社会上非常常见,其关键点就在于估计矛盾的性质是人民内部矛盾还是敌我矛盾,还是其他的什么矛盾,是否要采取激烈的斗争形式。

在革命时期,只有采取这种革命的激烈手段,才能得到事物朝着好的方向发展,即通过革命把一个半殖民地半封建的社会的旧中国,转变到独立自主、有自我主权、有人民民主、有幸福生活的新中国去。这时,谁如果反对革命,谁就是阻碍矛盾朝着好的方向发展的人,我们就要打倒和推翻。反之,如果矛盾还没有发展到那个地步,过早的革命斗争,过于激烈的斗争手段也是不可取的。和平年代有些矛盾我们定义为人民内部矛盾,会采取温和调解的方式去解决,而有些矛盾触犯到刑事犯罪,甚至是严重的刑事犯罪的时候,那么我们就有可能把它当做敌我矛盾,采取激烈的斗争手段去解决。如果不能明白这一点,那么对于激烈程度不同的矛盾,我们就往往采取了不合理的对抗手段,要么过于妥协,要么过于激进,从而不能达到妥善解决各类不同性质的矛盾,这也就是对抗性在矛盾中的地位和意义。

读《矛盾论》,其读后感我觉得是无法简略概括的,写到此时,倒是让我想起张国焘的《我的回忆》,张总是讲我当初如果怎么怎么样,但他或许仍不知的是,毛泽东的一切思想、行动的基础在于人民、在于亲身调查、在于亲身实践,他能战胜你,是因为他从来就不是一个人。从早期的《中国社会各阶级的分析》、《湖南农民运动考察报告》等等中,我看到的是,一个意气风发的青年,用真实的用一脚一印在泥土里为旧中国走出来了一条光明大道。而在《矛盾论》一文里,我更可以看到毛泽东是如何通过坎坷波折的实践验证了自己的理论,而我们在生活里、社会上、思想中往往处处充满着矛盾,虽然能感受到的,但是我们并不能深刻理解它,而《矛盾论》这篇文章能让我们有一个系统的认识,那么再把它放到生活里加以不断的运用和对照,久而久之,用矛盾的眼光看世界就形成了。

毛泽东曾说,理论与实践,实践是主导方面。实践的过程或许坎坷漫长,但长此以往,对理解及分析事物的思想深度的提升也是非常巨大的,通过实践而发现真理,又通过实践而证实真理和发展真理。 而对于毛泽东,我们或许更可以做到的不仅仅是缅怀与崇拜,而更可以做到的是,深入他的文字、了解他的思想、探索他、学习他。

母婴公众号宣传推广引导关注新媒体账号二维码.jpg

《仓央嘉措》

作者 Escape
2024年5月6日 20:30

带你走进仓英嘉措的传奇人生。

仓央嘉措,别名为阿旺却扎嘉措,旧译仓洋嘉错,是藏传佛教格鲁派的第六世达赖喇嘛及第一世达克布呼图克图。他也是一位西藏诗人,是历代达赖喇嘛中最富传奇色彩的人物。

五世达赖喇嘛圆寂后,摄政桑结嘉措为维护西藏稳定,长期隐瞒五世达赖的死讯长达十五年之久,直到 1688 年才认定仓央嘉措为其转世。1697 年仓央嘉措在拉萨坐床。1705 年,摄政桑结嘉措与和硕特汗国的拉藏汗发生冲突,拉藏汗率兵入侵西藏,杀死桑结嘉措。翌年,拉藏汗拒绝承认仓央嘉措的合法地位,将其逮捕送往北京,途中于青海湖附近失踪,可能遭到谋杀。

《仓央嘉措》读书笔记


1. 书籍评分

🙋‍♀️ 总结感悟:记录你的阅读感悟!

阅读状态书名作者个人评分推荐指数
📓《仓央嘉措✍🏼 高平🎟 个人评分:8.0👍🏼👍🏼👍🏼👍🏼

2. 思考总结

记录摘抄:书中很多句子和自己内心的感悟,可以让你明白很多知识边界!

  • 仓央嘉措诞生

信仰是会改变的……信教不信教,信这个教还是信那个教,都是达官贵人们定出来的,老百姓不过是一盘石磨,谁来推都得转啊……

  • 风从家乡吹来

长叹了一口气,又在想那个老问题:穿袈裟的人越来越多了,但是真正懂得佛学的人又有几个?真正为了超度众生的又有多少?

  • 被杀的和嫁人的

都说是佛爷决定着人们的命运,而佛爷的命运又是谁决定的呢?众生啊,你们在羡慕着我,可知道我在羡慕着你们吗?

  • 贵族小姐

拉萨在松赞干布以前,据说是一片沼泽,沼泽的中心有一个湖,藏语叫卧措。文成公主来到西藏以后,亲自在湖上选点、设计,填土建寺。文成公主根据五行相承相克的说法,建议松赞干布用白山羊背土填湖。因为藏语把白山羊叫“惹”,把土叫“萨”,所以建起的寺庙被称为“惹萨”,这就是大昭寺最初的名字。后来藏语又叫觉卧康,也叫惹萨楚那祖拉康,即拉萨神变殿或显灵殿的意思。接着,由于香火的旺盛,政治、经济、文化的发展,在寺周围出现了许多新的建筑,形成了市区。于是这座新城也就叫作“惹萨”,当时的汉文译作“逻些”。逻些逐渐成为佛教圣地,以后便改称为“拉萨”了,因为“拉萨”在藏语中就是“圣地”的意思。

他们祈求什么?无非是希望避免今世的厄运,减少来世的贫苦。他暗中叹息了一声,“这真是用头来做脚的事情!”

  • 默思与退戒

你们向我祈求幸福,我的幸福又向谁去祈求呢?

  • 大昭寺前的恩仇

第巴桑结和拉藏汗的手下人,都有背叛旧主、投靠新主的政治赌徒出来表演。这些人的心中,没有国家,没有民族,甚至也没有父母,更没有是非之分;但他们都有强烈的爱憎——爱自己、憎别人。因此,他们才永远用两只腿交替地走着背叛与投靠之路。

雨过天晴,谁还记得雨伞?白天来了,谁还想到灯光?

  • 离开哲蚌寺

我本来不是达赖,是一些与我不相干的人让我当了达赖,又是另一些与我不相干的人不让我当达赖;想当,不想当,怎样当,不能怎样当,都得由别人决定。这一切,都是如此地不由自主!我不是骡马,为什么要由别人牵着走?我不是牦牛,为什么要由别人赶着走……他想流泪,但是他已经没有泪水了。

  • 唱歌的牧羊女

成千上万的信徒把我尊为至高无上的活佛,祈求我的祝福,期望我来改变他们悲苦的命运,唉,可怜的众生!你们哪里知道,我连自己的命运也掌握不了啊!我何时才能走出这厄运的峡谷?

  • 洗温泉

人为什么要有区别?而且要将种种区别用衣服显示出来,同样的肉体,穿着袈裟是僧人,穿着绸缎是富人,穿着破衣是乞丐,穿着盔甲是武士……同


3. 个人思考

记录你的思考:记录你的思考过程,记录你的思考感悟!

在我很小的时候,我就知道仓央嘉措这个人的存在了。但是,当时仅限于知道他的一些诗歌而已。这个月无意在读书软件上面读到了这本书,大概三四天时间就读完了,确实从中科普到了一些知识。比如:关于西藏佛教的起因和一些历史事件、关于印度佛教的发展史、关于不同分支佛教的不同教义、西藏的达赖和班禅的由来和金瓶掣签制度等等。而这些内容,都不是书中讲述的,而是自己感兴趣之后科普到的。

关于仓央嘉措的一生确实是悲惨的一生,除了少时得到的自由和幸福之外,其他的一切都是被他人所控制和安排的。住在布达拉宫,身穿锦罗服饰,但是掩盖不住的向往自由、向往幸福的心。但是,突如其来的达赖头衔,让他没办法变成一个普通人,只能身处风暴之中。

其实,古往今来都是一样的。在真正统治者眼里,普通人的一切对他们来说都不值一提,视如草芥。而作为普通人,我们管不了那么多,我们只需要安安静静的做自己,守住自己幸福就可以了。

永远不要整理那些可以去除的东西

作者 happy
2024年5月19日 11:40

读到一个清单,喜欢粗体的部分,特别是这句“永远不要整理那些可以去除的东西”。

Frank Chimero

这周是我的生日!所以我列了一份我在30多岁时学到的东西清单。

  1. 没有人会等待说“是”。
  2. 简单的事情值得做好,因为它们每天都会发生。
  3. 你对某事反应越强烈,你就越需要放慢脚步。
  4. 世界优化了无关紧要的事情,所以对那些变得容易的东西要持怀疑态度。
  5. 永远不要整理那些你可以去除的东西。
  6. 身份和价值观塑造我们的行为,而不是动机或希望。
  7. 成长的一个重要方面是重新连接被忽视的自己部分。
  8. 不要熬夜做你不会早起去做的事情。
  9. 清晰来自于参与和体验,而不是思考。
  10. 幸福是朝你想要的方向前进,而不是逃离你不想要的东西。
  11. 内容侵蚀精神,断网。
  12. 知道何时停止是一种天赋。

五十字路口

作者 ONO
2024年4月19日 12:07

∞ 756 | 五十字路口

本城市最伟大的发明诞生了,这是城市交通最繁华最交融的地方,这是放射的点,是这个城市命脉的根基,从这个中央广场放射出去的道路都将成为这个城市最主要的动脉,连通着城市的不同分区。所以我们必须为这个超过五十条街道聚拢的巨大的中心路口设定一个最科学的红路灯,这将让我们成为最受瞩目的城市!将得到全世界的赞赏和羡慕!

所以我们命名这个巨型路口的名字叫做“五十字路口”,我们必须为他规划一个最科学的通行规则,保证着五十条城市主干道的通畅。所以我们在这个五十字路口的中央设立了一个巨大的如同科技结晶而成的红绿灯的大树,它将指引着每个路口通行的规则和秩序,这是科技的创新也是科技的突破!它必然会让我们的城市成为全世界的关注点,是我们解决了五十条路汇集而成的路口的秩序难点。

而这个巨大的红绿灯的树,被称之为“五十路口红绿灯”,一共有整整2500组红绿灯,只是这每个路口的动作,让这里的交通通畅而受到科技和智慧的保障,2500个红绿灯,这将是世界上有一个伟大的吉尼斯记录,而这个记录被我们的城市夺得,这将成为无比的荣耀和骄傲。在它们一起运作的时候,三种颜色的红绿灯在同一个巨大的树干上面,这不单单是一个只是交通工具,更是获得了吉尼斯记录的城市基础建设,更重要的这是一件伟大的,五百年不遇的,据有史以来的记载都无人能够创造的世界上最先进最成功最伟大最美丽的艺术品,这必然会让多少艺术家为之惊叹和羡慕,因为只有我们的城市理解了什么才叫做艺术和现实意义的完美结合。

在这个路口,每天同行的车辆超过千万的级别,被科技引领的路口运作,也是未来科技的核心——“以人为本”,这也是极大地符合了我们整个城市每天运作的根本,也是那些管理着城市的优秀的伟大的成功的先进社团的管理核心。他们所制造的这个伟大的建筑也一定是为这个城市做出了极大的贡献——不然为什么每天在这个路口经过的汽车也可以被吉尼斯纪录纳入其中!

终于这个被称之为世界第九大奇观的“五十字路口”终于要投入使用,全世界的目光都集中在这里,整个城市也陷入到了沸腾之中,首先要尝试这个路口的是秩序井然的领导者们,他们必须成为这个世界奇观的第一见证者,这是他们的骄傲也是他们的丰功伟业。

第一盏绿灯的亮起意味着“城市科技的革命”,是这样一个伟大的创造和科技让一个城市进入了新的纪元,四十九辆载着领导者的轿车按照约定的秩序分别驶入了不同的四十九条主干道;接着上演的是城市各个阶层的代表人坐着另外的四十九辆车如同巡游的花车一样进入到了不同的四十九条道;再接下来是各国的记者所乘坐的采访车一次进入到着伟大的奇观之中,一时之间他们手中的摄影机和照相机都如同雀跃的烟火,在那颗巨大的红绿灯树下面闪耀着;再接下里的是社会车辆代表,他们按照约定开始加入到红绿灯的控制之中,井然有序地运作着,让这个伟大的艺术品指挥着他们前景的道路,就如同是接受着科技的洗礼。所有的车辆都一次通过了这个巨大的五十字路口,这就是成功的代表!他们已经可以伟大地向所有人宣布,这个伟大的发明正是成为这个城市的骄傲(俨然在很久之前,所有的宣传早就告诉所有人,这就是骄傲)。

投入使用的第一天,人们因为红绿灯等待的时间太久而辱骂—— 这是秩序!秩序是一个社会最重要的规则!

投入使用的第二天,人们因为等不及红绿灯开始在巨大的路口横冲直撞——严格执法!程序正义!依法驾驶!我们必须保证秩序的存在,将一切背叛秩序的人都严惩以待!

投入使用的第三天,红绿灯的程序出现错误,有几条干道因为同时行车而酿成了重大的安全事故——封锁舆论!删除评论!纠正错误!严查程序维护人员,就算是临时工也必须公示出来给这个城市一个交代!

投入使用的第四天,每个主干道的交通拥堵更加严重,人们开始怀疑这个设定的科学性——相信科学!尊重科学!崇尚科学!交通拥堵是因为汽车保有量的问题,从今天开始严格执行限号要求!

投入使用的第五天,交通拥堵仍然没有得到解决——错峰出行!灵活从业!弹性工作!人们应该明白错峰出行的意义,所有企业必须采用弹性上下班时间,这样保证员工不在同一个上班高峰出行!

投入使用的第六天,人们已经开始怀疑这个伟大的设计——绿色交通!环保先行!保护自然!从今天开始倡导绿色出行,私家车出行的时间再度被压缩和限制,极大地保证公交车的使用率!

投入使用的第七天,人们被要求只能从城市的二环通行,必须保证这个五十字路口的畅通量——这是原则!这是为了让这个伟大的设计永远在世界上闪耀光芒的唯一办法!


朋友博客利用AI模仿我的博客风格创作了《富人的红灯与穷人的绿灯》。很有趣,确实有我的风格,但又少了些很难言语的“灵魂”。

AI刚出来的那会儿,跟朋友调教了它很久,后来聊到AI会不会替代人类的事情,总是会时不时的毛骨悚然——最后的“自我安慰”就是AI暂时还没有感情模块,至少还无法提到由情感驱动的创作。

有趣的是,AI世界的我,确实能巧妙地模拟出我一直藏在博客里的哲学思考:公平正义与程序平等、自由意志和宿命论。不过AI粘合剂的感觉很明显,就像在做同一个建筑纸膜,AI可以明确地计算出接缝处需要多少胶水,不多不少恰好将两者紧紧地粘在一起。而我做的纸膜,一定会在粘合出挤出多余的胶水,甚至粘上自己的指纹。

(之前说的是“更有趣的是”)很诡异的是,7、8年前,我真的创作过有关红绿灯、路口和社会规则的文章,明显不及AI创作的富有逻辑性,但故事性或许是我们作为人类还能避免被AI替代的东西。

正如我在《阅后即焚》里所说的:我们可以借由人工智能看懂异国的文字,甚至是理解那些创造性的想象力,和复杂的情感,再次突破语言、文化和意识的限制,是否是人类历史上的第二座“巴别塔”?

这一天很远吗?我看未必。

如何看待北京十三号线西二旗站地铁里的拳击赛?

2024年4月18日 11:22

大众点评内容搜索算法优化的探索与实践

美团在本地生活服务领域深耕多年,在帮助用户完成交易的同时,积累了丰富的图文视频内容供给。依托于这些内容供给,我们可以满足用户更丰富的需求类型,从交易环节扩展到交易前的种草、交易后的体验分享环节,将大众点评建设成为本地吃喝玩乐的社区。

在大众点评的用户中,有相当高比例会通过搜索来查找本地信息,而内容搜索是辅助用户决策、促进社区氛围的重要工具。例如当用户搜索“火锅”时,除了能看到火锅相关的商户和团单,还可以看到图文、视频、评价、笔记等多种形态和类型供给呈现;搜索“圣诞节活动”时,直接以双列内容形式呈现搜索结果,可以更加生动形象。

通过持续优化内容搜索体验,可以带来更多内容消费流量,进而吸引更多的用户转化为作者,激励创作出更多的内容,而有了更多的内容之后,又可以进一步带动体验提升,最终形成一个良性循环。从实际效果来看,内容搜索的价值也得到了用户的认可,如下图是用户访谈原声,可以看到通过内容搜索结果逐步拓展了用户对搜索功能的认知。

内容搜索与典型类型的搜索如网页搜索、电商搜索、商户搜索等相比,有如下差异点:

  • 在优化目标上,网页搜索更强调搜索满意度,电商搜索更看重商品交易总额,商户搜索更关注用户到店消费意向率,而内容搜索既要考虑搜索满意度,又要考虑点击和点击内容后的停留时长、点赞/收藏/转发/评论等交互行为。
  • 在地域约束上,网页搜索和电商搜索没有特别强的地域限制,而商户搜索和内容搜索却有非常强的LBS区域限制,因为用户在美团点评的搜索场景下更希望查找附近的商户和内容。
  • 在供给类型上,网页搜索、电商搜索、商户搜索结果类型较为单一,而内容搜索有非常多的类型,比如笔记、评价、旅游攻略、菜谱等。
  • 在结构化程度上,电商搜索和商户搜索相对较高,因为有商家和销售维护相应信息;网页搜索一般结构化程度比较低,可被检索的网页大部分信息是非结构化的;内容搜索的供给中既包括图片、视频、文本等非结构化信息,也有内容关联的作者、商户、关联话题等结构化信息,整体呈现半结构化的特点。
  • 在供给规模上,电商搜索和商户搜索供给量级相对可控,因为商品、商户的生产维护成本较高;而网页搜索和内容搜索的供给生产成本低,规模会相对更大一些。
  • 在更新频率上,一个商品从上线到下架、一家店从开业到关停,需要相当长的时间周期,而内容和网页生产和更新频率都更快一些。

从以上对比来看,内容搜索在各个维度上与典型的搜索类型存在很大区别,这就需要结合自身特点,进行相应的技术选型和方案设计。

我们对面临的困难挑战进行总结,主要包括以下四个方面:

  1. 多种类型供给并存,且供给中既有结构化的信息,又有非结构化的信息。
  2. 内容供给量级大且更新频繁,导致用户行为分散,单篇内容较难获取到足够的用户行为数据;在分发过程中又有较强地域限制,形成类似蜂窝状的消费规律,进一步加剧了用户行为稀疏的问题。
  3. 在优化过程中既要拉动内容消费指标,也要兼顾搜索满意度,在推进中需要综合平衡多个维度。
  4. 在最终搜索结果中,内容与商户、团单等以混排形式呈现,需要与其他类型搜索结果协同发挥价值,共同满足用户需求。

2 内容搜索优化实践

下面我们会从面临的问题和挑战出发,分享如何通过链路各环节,持续优化内容搜索的体验。

2.1 供给理解

面对用户持续创作生产的海量内容,我们需要对其进行充分理解,包括显式标签和隐式表征两部分工作。显式标签体系主要包括:

  • 类目标签:通过构建分发前台后台两套标签,可以实现前后台类目灵活映射。当需要进行前台类目体系调整时,可以通过调整映射层快速支持,减少对后台打标任务的影响。
  • 细粒度标签:类目标签个数有限,在推荐搜索等分发场景还需要更细粒度的刻画,为此构建主题标签、概念标签等,相互之间有一定的关联和组合关系。
  • 属性标签:前两类标签更多关注内容在讲什么,而属性标签更侧重于刻画内容本身是什么,比如是否涉政涉黄、是否重复、是否命中生态治理等。

除了显式标签,分发链路很多环节还需要更加泛化的隐式表征。结合实际场景特点,我们自研了多模态预训练模型,通过引入对比损失把图文表征对齐到统一特征空间,并结合自监督对比学习训练范式、掩码学习、图文匹配等优化,提升了跨模态交互效果。

2.2 召回环节

作为最前置环节,召回决定了一次搜索查询所能拿到的候选总集合,直接影响到后续环节的效果天花板。搜索场景的召回主要包括:

  • 语义召回:搜索召回需要首要保证结果相关,为此对语义召回进行了多维度的设计,包括不同颗粒度的语义单元召回、对用户需求进行细化和泛化处理。
  • 个性化召回:结合用户地理偏好、特定区域偏好与用户历史消费内容相似度等,设计召回通路满足个性化需求。
  • 策略召回:基于用户不同场景的实际需求设计对应策略,包括最新最热内容的召回、更符合种草需求的高价值攻略召回、定向搜索作者内容或特定类型如菜谱的召回等。

其中语义和个性化召回有很大部分通过隐式实现,语义召回更侧重搜索词自身信息的刻画,而个性化召回还融入了用户偏好、上下文等很多信息。

2.3 排序环节

排序包括粗排、精排、多目标融合排序、异构混排等多个环节,随着逐层筛选,打分量级依次减小,可以使用结构更复杂、规模更大的模型。

介于召回和精排之间的粗排环节,需要兼顾准确性和全面性、权衡打分能力和时延性能,发挥承上启下的作用。为此引入用户在全域的行为样本,达到系统层面的纠偏作用;我们通过表征蒸馏、分数蒸馏和顺序蒸馏等方法,提升模型表达能力;在常见Query-Doc双塔结构基础上,引入交叉塔(如交叉点击率、时长等),提高特征交互能力。

精排环节着重介绍在输入表征层、多目标建模层和输出层的相关工作。

首先是模型输入表征层,为了准确刻画Query、用户、Doc、上下文等多种维度、各种粒度、各种来源的输入信息,我们从以下几个方面进行表征。

  • Query语义表征:搜索场景下Query是用户需求的直接表达,借鉴向量检索的工作,对Query进行了不同粒度的刻画,通过多粒度语义网络进行搜索词表征。
  • 用户序列表征:引入用户全站行为序列,捕捉用户长短期个性化偏好。搜索场景需要兼顾个性化和相关性,但用户历史行为和当前搜索词不一定存在关联,为此在主流建模方案DIN基础上,引入零向量注意力机制来权衡个性化和相关性。具体来说,引入了Query语义表征,对长尾低频Item做过滤,帮助模型决策哪些历史行为和当次搜索词相关,且在历史行为和搜索词无关时不引入额外的噪声。
  • 多模态表征:图像、摘要等创意维度信息,对于用户决策至关重要,也是内容高效分发的基石。为此引入高维的多模态预训练向量,并结合场景进行端到端降维,既引入了丰富的多模态语义信息,又能够兼顾线上时延,对于刻画用户的多模偏好、提升新内容高效分发至关重要。
  • 特征重要度建模:通过动态权重的建模范式,捕捉样本粒度的动态表征,可以有效增强模型的表达能力。通过在EPNet、MaskNet等模型结构基础上,结合场景特点设计域感知的多门控网络、并联结构,实现了特征重要度的动态建模。

接下来是多目标建模层,由于点击、时长、交互等各个目标行为量级不同,导致优化过程中很容易出现跷跷板问题,为此在模型结构、优化方式等方面进行相关探索。

  • 模型结构:我们采用MMoE和PPNet融合的方案,为了防止Gate极化现象,对门控网络结构上进行dropout、设计skip connection等;在各个任务上会引入个性化因子,通过个性化网络PPNet建模,MMoE和PPNet的输出会拼接后传到预估输出层。
  • 优化方式:底层稀疏Embedding很容易受到各个多目标梯度反传的影响,造成梯度冲突,从而引起指标跷跷板问题。为此针对重要的表征增加参数量或新增任务特定表征,并对重要表征控制梯度反传,时长或交互目标不更新底层部分Embedding或更新时设置较小学习率。

最后是模型输出层,为促进新内容、长尾内容分发,并保证模型输出的预估分的稳定性和准确性,我们从探索结构和学习目标上进行了对应优化。

  • 探索结构:搜索场景消费内容个数比推荐少,马太效应问题也更加严重,对行为积累不够充足的新内容或长尾内容,预估不够准确。为此设计全链路冷启和探索通道,并基于不确定性预估范式,在模型中引入基于对抗梯度的探索网络,基于CTR预估的不确定性和对抗梯度在输入侧做扰动和探索。
  • 学习目标:之前搜索场景采用的学习目标是Listwise的Lambdaloss,在排序能力上优于Pointwise,但预估准确性上不足,会造成后续链路无法使用预估分。业界有不少研究关于Listwise损失如何做预估校准,例如KDD 2023中阿里巴巴校准工作JRC、CIKM2023中Google校准工作等。参考相关工作并结合场景特点,在原有的LambdaLoss基础上增加用于校准的Logloss,在梯度更新上控制校准Loss不影响底层的Embedding更新,只更新多目标建模层和输出塔的参数,提高预估分数的稳定性和准确性,方便后续融合、混排等环节使用。

2.4 满意度优化

除了优化内容消费指标如点击、交互、时长等,搜索场景还很重视满意度优化。用户对搜索结果是否满意,可以从结果是否相关、是否足够新鲜、是否是对应地域、内容质量高低等显式维度进行刻画。

相关性是搜索满意度中最基本、最重要的维度。大众点评的很多内容有关联商户,可以比较方便地获取很多明确的结构化信息,比如商户类目、区域等,可用于辅助判断相关性。但也可能由于内容误关联商户带来噪音,为此需要综合从图片、文本、商户信息进行关键信息抽取,作为相关性模型的输入。

除了相关性,搜索结果的时效性也很影响用户体感。比如迪士尼疯狂动物城园区开始对外开放,属于突发性热点,通过敏锐捕获到突发热点,在搜索“迪士尼”时优先呈现对应的结果,可以带给用户惊喜。另一类查询词如“平安夜”属于周期性时效性热点,每年到这个时间段都会有这样的热点。为了更好地对时效性进行建模,从多个来源挖掘建立了热点事件库,接入商家自己提报的新鲜事,建立独立召回通道进行承接,并结合线上点击反馈进行误识别纠正。

以上满意度的评测通常较为依赖人工标注,近期开始探索自动化标注,对比分析如下:

  • 在成本和效率上,人工标注需要准确理解搜索诉求,并对结果进行精确评判,从相关性、地域性、时效性、内容质量等维度进行刻画,成本非常高,通过自动化标注可以极大降低成本。
  • 在标注准确率上,虽然还没有完全达到人工标注的水平,但自动化标注也达到了可用标准。
  • 在标注维度上,自动化标注可以比较方便地对原有标注维度进行扩充,成本变化可控,比如在Prompt中提供用户的历史行为和偏好,就可以综合判断个性化需求是否得到了满足。
  • 在标注稳定性上,人工标注质量可能会受标注人员主观判断甚至心情影响,但自动化标注不会有这样的问题。

在具体实现上,我们通过分步推理来实现自动化标注,首先分析用户当前意图,再结合当次搜索Query、搜索意图、搜索结果等信息,从几个维度对搜索结果进行分析,最终综合判定当前搜索结果对需求的满足程度。

2.5 多目标融合

在得到内容点击、交互、时长、满意度等多维度的预估分数后,多目标融合层负责融合各个维度分数并排序。

  • 精准预估:多目标融合的前提是保证各个因子的打分稳定性和精准性,这也是前文提到做排序和校准联合建模的原因。
  • 融合搜参:通过AutoML方式进行自动搜参,寻找帕累托最优解,针对细分流量进行单独搜参,更加精准地刻画不同场景下对于各个目标之间的不同需求。
  • 分发调控:将生态或调控导向的因子引入融合公式,进行分发调控,比如对于新内容的扶持、更老内容的分发治理、近距离和特殊供给扶持等。

2.6 异构混排

前面各环节动作集中在内容搜索自身链路上,而最终内容是作为搜索结果的一部分和商户、团单等不同类型结果混排,追求整体搜索收益的最大化,为此需要进行多元异构混排。业界常见的混排建模方式包括端到端建模、价值融合公式、序列生成和评估等。

此外,本地生活领域流量分布有独有特点,在用户快决策和慢决策的场景下,对内容的需求存在差异,午餐和晚餐流量高峰期对内容的点击偏低,下午茶和夜宵等时段内容消费意愿更强。结合内容和商户峰谷差异,依托工程能力如流量价值预估、模型算力和服务稳定性监控等,进行算力动态适配,从而保证整体搜索结果更能满足用户需求。

3 总结与展望

综上所述,大众点评内容搜索通过优化用户体验持续提升渗透率,进入快速增长阶段。在商户体系之外构建了基于内容的搜索分发能力,同时针对站内需求和供给特点进行了专项建设。

在后续工作中,希望建立体验问题的自动发现机制,帮助产运促进供给生产,并推动大模型在各个环节扎实落地、提升全链路的时效与性能,让内容得到高效准确及时的分发,进而在本地生活信息领域形成体验优势,助力建设本地吃喝玩乐社区。

4 招聘信息

大众点评内容智能团队持续招聘中,如果你对大模型应用、搜索算法、内容理解等方面工作有经验有热情,欢迎联系 [email protected],期待你的加入!

5 参考文献

  • [1] Li S, Lv F, Jin T, et al. Embedding-based product retrieval in taobao search[C]. Proceedings of the 27th ACM SIGKDD Conference on Knowledge Discovery & Data Mining. 2021: 3181-3189.
  • [2] Ai Q, Hill D N, Vishwanathan S V N, et al. A zero attention model for personalized product search[C]. Proceedings of the 28th ACM International Conference on Information and Knowledge Management. 2019: 379-388.
  • [3] Chang J, Zhang C, Hui Y, et al. Pepnet: Parameter and embedding personalized network for infusing with personalized prior information[C]. Proceedings of the 29th ACM SIGKDD Conference on Knowledge Discovery and Data Mining. 2023: 3795-3804.
  • [4] Wang Z, She Q, Zhang J. MaskNet: Introducing feature-wise multiplication to CTR ranking models by instance-guided mask[J]. arXiv:2102.07619, 2021.
  • [5] Chang J, Zhang C, Hui Y, et al. Pepnet: Parameter and embedding personalized network for infusing with personalized prior information[C]. Proceedings of the 29th ACM SIGKDD Conference on Knowledge Discovery and Data Mining. 2023: 3795-3804.
  • [6] Burges C J C. From RankNet to LambdaRank to LambdaMART: An Overview; 2010[R]. MSR-TR-2010-82. Available from: https://www.microsoft.com/en-us/research/publication/from-ranknet-to-lambdarank-to-lambdamart-an-overview, 2010.
  • [7] Sheng X R, Gao J, Cheng Y, et al. Joint optimization of ranking and calibration with contextualized hybrid model[C]. Proceedings of the 29th ACM SIGKDD Conference on Knowledge Discovery and Data Mining. 2023: 4813-4822.
  • [8] Bai A, Jagerman R, Qin Z, et al. Regression Compatible Listwise Objectives for Calibrated Ranking with Binary Relevance[C]. Proceedings of the 32nd ACM International Conference on Information and Knowledge Management. 2023: 4502-4508.

科技爱好者周刊(第 293 期):一周是一年的2%

作者 阮一峰
2024年3月15日 08:13

这里记录每周值得分享的科技内容,周五发布。

本杂志开源,欢迎投稿。另有《谁在招人》服务,发布程序员招聘信息。合作请邮件联系[email protected])。

封面图

安徽芜湖轻轨,为了穿越人行天桥和高架,有一段设计成了波峰波谷,乘坐时会有一点过山车的感觉。(via

一周是一年的2%

纳特·弗里德曼(Nat Friedman)曾经是 GitHub 的 CEO,现在是一名风险投资家。

他的个人网站首页,写着一些自己的信条。其中有一条,让我很震动。

他写道:"一周是一年的2%。"

我一直觉得,每周七天是很短的时间,尤其是发布周刊以后,更是过得飞快。

但是,他的这句话让我意识到,每周其实是一年当中很重要的组成部分。虚度一周就是虚度一年的2%。

你没有几周可以虚度的。只要多浪费几周,这一年很快过去。

反过来,过好这一周,那么这一年的2%就有价值了。只要这样多过几周,一年就会变得很充实,有拿得出手的成果。

我坚持写周刊,每周记录一点东西,整理一些思考,现在想起来,其实就是在督促自己过好这一年的2%。

维苏威古卷

公元79年10月24日,意大利的维苏威火山爆发,一天之内就毁灭了两万多人的庞贝古城。

火山灰掩盖了整座城市,其中有一栋房子存放了各种书籍。直到18世纪,这栋房子才重新被发现,下面是考古学家的建筑复原图。

房子里面的1800多卷纸莎草古书,都已经完全碳化。

考古学家试图展开这些烧焦的古书,但是纸张一碰就碎。

每一页的碎片就像下面这样。

没有人能从这些烧焦的古书上,读出一个字。

2019年,一位美国科学家提出了一种新方法,使用短红外高光谱成像技术,对这些古卷进行 3D 扫描,然后虚拟建模,在不接触古卷的情况下,就可以展开或压平每一页,从而复现上面的笔迹。

下面是扫描后的页面结果。

问题是上面的笔迹还是很模糊,无法确定是哪一个字母,更不要说读出句子了。

2023年3月,在一些风险投资者的资助下,古卷保管单位举办了一次比赛,邀请全世界的程序员参加,要求使用机器学习,认出上面是什么字母,破解古卷的内容,奖金总额高达100万美元。

主办单位原以为,一年之内成功的可能性不到30%。但是,2023年10月,21岁的内布拉斯加大学的学生卢克·法里托(Luke Farritor)就读出了第一个单词 ΠΟΡΦΥΡΑϹ(紫色)。

后来,他与正在柏林读博士的纳德(Youssef Nader)、瑞士苏黎世理工学院的机器人专业的学生席里格(Julian Schilliger),组成了一个团队,致力于建立一个完整的 AI 模型识别这些古书。

他们最终在比赛的截止日期前(2024年1月1日)识别出了2000个字符。

下面就是采用他们的模型,识别出来的碎片,内容已经清晰还原出来了。

2月5日,主办单位宣布,他们获得了本次比赛的第一名。

由于比赛结果令人鼓舞,主办单位扩展了自己的目标,接下来将对90%的维苏威古卷,进行扫描和识别,彻底破解两千年前的罗马人在书里写了什么。

他们所用的模型,已经全部开源,就放在 GitHub。任何人都可以安装和运行,尝试改进他们的模型,获得更好的结果。

现代科技的发展,真像神话一样,烧成灰的纸都能辨认出文字。

科技动态

1、纸钢琴

学习钢琴通常需要一个专门的琴房,如果是普通人家庭,购置和练习钢琴是非常不方便的。

有人在 GitHub 上发布了一个令人耳目一新的项目,尝试零成本地解决这个问题,让你可以随时随地练习钢琴。

你只要准备两张 A4 纸,水平连接在一起,两端各画两个方框,然后就可以在纸上练习钢琴了。

这个软件通过摄像头,捕捉你的手指动作,转化成钢琴击键,让电脑发出对应的琴声。

虽然这样不会有击键的感觉,但是不失为一种简单的解决方案。如果配一个仿真键盘,就比较完善了。

2、赛博卡车的配套帐篷

特斯拉的赛博卡车(Cybertruck)在2019年公布时,曾经展示了一个配套帐篷,可以装在车辆后部。

当时展示的照片是这样的。

现在,这个帐篷终于发货了,它实际长下面这样,与早先的设计大相径庭。

而且,它的售价高达3000美元(约人民币22000元),令车主十分不满。

自从赛博卡车正式发货以来,市场反响并不热烈,越来越多的人认为,它可能是特斯拉的一个失败产品。

3、取消的苹果汽车

上周有消息说,经过10年研发以后,苹果公司在内部宣布,取消了苹果汽车项目。

现在网上有苹果汽车的原型照片泄漏。如果照片属实,苹果研发的竟然不是轿车,而是小货车。

这实在难以置信,因为小货车无论造得多么好,销量肯定小于轿车。

以前就有人指出,苹果不太可能真的去做汽车,因为市场规模太小。特斯拉一年销售不到200万辆,这种销量对苹果来说是不值得做的。

文章

1、黄仁勋斯坦福大学演讲(中文)

2024年3月初,英伟达CEO黄仁勋回到母校美国斯坦福大学,进行了两次演讲,讲述了自己的经历和对 AI 的看法。这是演讲的中文翻译。

2、Meta 的 H100 集群细节(中文)

Meta 公司公布了他们的 AI 集群细节。大家可以看看,AI 需要投多少钱。

他们现在有两个集群,每个集群包含了24576块英伟达 H100 GPU(上图)。H100 的价格是2.5万美元~4万美元/块,也就是说,每个集群就要花费数亿美元。

更厉害的是,他们计划今年年底前,将 H100 扩充至35万块,远期达到60万块。

3、注释可以减少技术债务(英文)

作者列举了代码注释的好处,论述得很好,然后大力推荐使用 Javadoc。

4、VS Code 的垂直 Tab 页(英文)

本文介绍如何在 VS Code 编辑器里面,放置一个垂直的边栏,进行标签切换。

5、Linux 服务器加固指南(英文)

你架设了一台 Linux 虚拟主机,如何让它变得更安全,本文列出了详细的操作步骤。

6、家庭电子实验室设置指南(英文)

作者介绍他的家庭电子实验室的配置,喜欢玩电子装置的朋友可以参考。

7、为什么去赌场是个坏主意(英文)

作者写了一些简单的小程序,使用蒙特卡罗模拟,演示如果不断博彩(比如1000次)会是多少收益。

工具

1、Rot

一个命令行工具,用来对密码进行加密/解密,这样就可以把密码保存在公开的代码库了。

2、Angie

一个 nginx 的分叉版本,由原始团队成员开发,增加了一些功能。类似的项目还有 free nginx

3、LaVague

一个很有意思的概念产品,使用文字指令来操作网站,比如输入文字"点击按钮",它就自动点击网页按钮,底层用的是浏览器自动化框架 Selenium。

4、LapisCV

基于 Obsidian / Typora 编辑器的 Markdown 简历模板,可以导出 PDF 文件。(@YiNNx 投稿)

5、OpenAPI-UI

该工具生成 Swagger 或 OpenAPI 3 格式的 API 接口文档,也可当作简洁的 Postman 使用。(@rookie-luochao 投稿)

6、git-diff-view

一个 React/Vue 组件,用来显示 git diff 的结果,类似于 GitHub 的样式。(@MrWangJustToDo 投稿)

7、 AI 时间线

一个有意思的网站,输入一个关键词,自动生成该词的时间线,上图是输入"github"的生成结果,它的代码仓库在 GitHub。(@zhugezifang 投稿)

8、Earthworm

一个开源的 Web 程序,通过连词造句的方式,经过不断重复练习英语,线上体验。(@cuixiaorui 投稿)

9、Postal

一个开源的电子邮件服务器,自带 Web 界面。

10、briefsky

一个开源的天气预报前端,可以接入各种天气数据源。

11、Qaul

一个可以离线通信的软件,允许一群用户在不联网的情况下,通过本机的共享 WiFi 发送消息。

12、Piped

一个开源的 Youtube 网页前端 UI。

13、Riffusion

一个免费的 AI 工具,给出一段提示,它会生成相应的歌曲,并且是带有歌词、人声演唱的。

资源

1、IP 信息查询合集

这个仓库收集可以查询 IP 信息的免费网站。(@ihmily 投稿)

2、TypeScript 互动教程

通过一个个小练习,讲授 TypeScript 语法。

3、学习现代 C++

一个讲解 C++ 基础知识的自学教程。

4、Virustotal

软件病毒检测引擎,可以上传文件进行扫描,也可以指定需要扫描的文件或网址。

图片

1、世界第一艘深海潜水器

1925年,美国博物学家威廉·毕比(William Beebe)提出想造一种深海潜水器。当时,潜艇的最大下潜深度只有117米,而且没有窗口可以观察外部。

威廉·毕比设计的潜水器为球形,因为球形最抗压,由铸铁制造,里面只能待一个人。

潜水器的后端是一个透明的入舱口,采用螺栓固定,只能从外部打开,内部无法打开。

前端是三个窗口,由76毫米厚的石英制成,这是当时最坚固的透明材料。

潜水器内部由高压气瓶提供氧气,采用钠钙和氯化钙吸收二氧化碳和水分。

1930年6月11日,它第一次下水,达到了400米深度,1934年达到了900米的深度。

此后,威廉·毕比停止使用这个潜水器了,因为他觉得已经达到了观测海底生物的目的。

而且,它不是很安全。每次下水,它必须系着钢缆,要靠钢缆拉上来。万一钢缆在压力下出现问题,或者钩子断了,潜水器里面的人必死无疑。

现在,这个潜水器的复制品,陈列在美国华盛顿特区的国家地理博物馆。

文摘

1、乔布斯的遗照

苹果创始人乔布斯的遗照是如何拍摄的?

2011年10月5日,史蒂夫·乔布斯去世,苹果网站用苏格兰摄影师艾伯特·沃森 (Albert Watson) 在2006年拍摄的这张照片来纪念他。

许多人知道,乔布斯并不太喜欢被人拍摄,这对摄影师是一种挑战。

拍摄当日,摄影师被告知拍摄时间只有一小时,然而他却胸有成竹地说,只要三十分钟便能完成。

艾伯特·沃森建议史蒂夫·乔布斯稍微前倾,说道:"想象一下,桌子对面有四五个人不同意你的观点,但你知道自己是对的。"

Steve Jobs 凝视着镜头,眼神十分坚定,给人一种充满信念与智慧的感觉。这就是这幅肖像照的创作过程。

离开时,史蒂夫·乔布斯看了一眼照片,问他是否可以拥有它,并说这"也许是我拍过的最好的照片"。

五年后,艾伯特·沃森接到苹果公司的电话,问他是否仍保留那张乔布斯的照片。他当时感到十分惊讶,同时意识到事情的紧迫性,随即找到照片并发送给苹果公司。

当天晚上,苹果在官网宣布乔布斯去世的消息,并附上艾伯特·沃森拍摄他的肖像,这张照片在网站上刊登了一个月,之后也成为乔布斯传记的封面,成为21世纪最广为人知的人像照片之一。

言论

1、

以后不会存在"程序员"这种职业了,只要会说话,人人都具备程序员的能力。未来的编程语言只会剩下两种,一种叫做英文,一种叫做中文。

-- 李彦宏,百度董事长

2、

你无事可做时,未来看起来就会让人灰心丧气。我早已放弃了为人生寻找某种意义之类的事情,但我确实尝试寻找一些有趣的事情来做。

-- Hacker News 读者

3、

电影《奥本海默》之中,奥本海默在黑板上写方程式,解释核裂变。这个方程式在物理上是完全正确的。

大多数观众不会意识到这一点,但这让我这个物理学家感觉很好,黑板上有正确的方程!

-- 电影《奥本海默》的物理学顾问

4、

幸福的三大要素是:有要做的事(something to do)、有要爱的人(someone to love)、有寄予希望的东西(something to hope for)。

-- 亚历山大·查默斯,19世纪美国著名医生

往年回顾

永不丢失的网络身份(2023 #246)

掌机的未来(2022 #196)

网课应该怎么上(2021 #146)

在线教育不等于录制视频(2020 #96)

(完)

文档信息

  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证
  • 发表日期: 2024年3月15日

我的 10 月新番表

2022年9月14日 22:00

2022 年 10 月将近,新番列表已经公布,一些如 Netflix 出品的甚至已经可以观看。正好昨天我关注的博主 YuC 更新了 2022年10月新番表,于是我也整理了一份自己的待看列表,按 S, A, B 三个级别表示关注程度。

Rank S

  • 灵能百分百 3

    Bones 近几年最好的动画,前两季我都有追。真的很喜欢它的人物刻画,虽然都是 One 老师的作品,但对我来远比一拳超人要好看。

    其实在我心中,这部番就是一位有着最好三观的小男孩,在一位有着最好三观的社畜老师的带领下,学会如何接纳自己的特质,走出成长中的迷惘的故事。

    虽然超能力满天飞,但我最喜欢看的一直都是师傅灵幻如何用自己的社畜必杀技服务客户的桥段。

  • JOJO 石之海 Part 2

    我发觉 Netflix 这种一次性放出所有剧集的播法不大适合长篇动画。年初看 Part 1 时,半天刷完 12 集真的很爽,可是爽过头了,等待的过程犹如戒断反应般难受。看到 Part 2 放出的时候,理性告诉我这是值得高兴的消息,感性却不为所动——已经忘了前面在讲什么。

  • pop子与pipi美的日常 2

    被誉为「人类神经」的 neta 之王,只要出了就没有不看的道理。由于中毒太深,这两天我随时都会突然对女友进行「怒った」攻击。

  • 新 福星小子

    童年遗憾,小时候看过一点,长大了想补番却一直没记得,这次出重置版简直是最佳的入坑时机。

  • 电锯人

    虽然没看过漫画,但以我的嗅觉,能预感到这是一部不逊于《东京喰种》的现象级霸权番。

Rank A

  • 黄金神威 4

    7月刷完了 2、3 两季,正好无缝衔接,从剧情发展来看,这一部应该会结尾。

  • 赛博朋克 边缘行者

    今石洋之导演的作品对我来说是必看的,但赛博朋克的主题和基于游戏的世界观,这些容易受外部干扰的因素让我降低了预期。

  • 剑风传奇 黄金时代篇

    黄金时代篇的剧场版 10 年前上大学时就看过了,这部番是剧场版重编而成,追加了新曲和新镜头。剑风是我最喜欢的漫画,我的 Twitter banner 。

Rank B

  • 名侦探柯南 犯人犯泽先生

    很有趣的设定,从反派「小黑」的视角看柯南周围发生的事情。这个题材让我想起《赌博默示录》的利根川和班长篇,甚至比正传还要好看。但我柯南看的不多,因此这部番的优先级不高。

  • 高达 水星的魔女

    似乎是第一部以女性为主角的高达作品,PV 里女主站在机甲前的画面让我这个高达路人粉也有了追番的冲动。

  • 间谍过家家 2

    上一季中规中矩,有好玩的梗也有烂制作的剧集,本季也还有耐心继续看,用来下饭应该还是够的。

商战

作者 ONO
2024年3月10日 21:15

你以为的商战:窃取对方公司情报,混淆视听导致对方公司决策失误;

实际的商战:去对方公司宴请合作方的饭局里,将菜单修改成对方客户忌口、甚至是过敏的食物,以破坏饭局;

真正的商战:农夫山泉伤害了民族感情,请大家支持哇哈哈。

科技爱好者周刊(第 292 期):所有代码都是技术债

作者 阮一峰
2024年3月8日 08:24

这里记录每周值得分享的科技内容,周五发布。

本杂志开源,欢迎投稿。另有《谁在招人》服务,发布程序员招聘信息。合作请邮件联系[email protected])。

封面图

意大利佛罗伦萨新机场,宣布了设计方案。候机楼顶部将有一个7.7公顷的葡萄种植园,用来酿造当地著名的葡萄酒。(via

所有代码都是技术债

代码是公司的资产,公司总是鼓励大家多写代码。但是,很多人(尤其是管理层)没有意识到,代码也是负债

代码越多,债越多,这就是程序员常说的"技术债"。

今天我想谈谈,什么是"技术债"?为什么你拥有的代码太多,不是一件好事。

"技术债"(technical debt)源自著名程序员沃德·坎宁安(Ward Cunningham)的一篇文章。他写了一句话:"交付代码就像负债累累。"

你的代码一旦进入生产环境,就像背上一笔债务,将来需要不断支付利息,除非代码不再使用。

这个比喻获得了共鸣,人们把代码带来的负担,称为"技术债"

为什么代码好比负债累累?这有两个原因。

第一个原因是,由于各种限制,代码的实现有问题,包含了 Bug,或者选择了有问题的组件,后期需要修改或重写。

第二个原因是,即使代码是完美的,但由于技术进步,它会逐渐腐化过时,后期需要不断维护和更新,这通常比原始开发成本更高。

这意味着,无论多么小心,上线的代码总是有"技术债"。 可以这样说,所有的代码都是技术债

"技术债"的可怕之处,在于你必须按时偿还,如果拖着不还,它就会像雪球一样越滚越多,维护成本越来越高,直到再也无法维护,只能放弃这段代码。

既然所有代码都是技术债,程序员写代码时,就必须考虑到它的长期成本,尽量减轻自己或别人日后的负担(利息)。

一个基本的事实是 代码越少,技术债越小;没有代码,就没有技术债。从这个角度看,软件开发的正确做法是下面两点。

(1)冗余的代码都要删除。

(2)只实现那些必须实现的功能,除非绝对必要,不要引入新功能。新功能必然带来新的代码,而且新功能一旦添加,就很难废除,总是会保留下来。

葫芦 AI

主流的 AI 模型,目前都是收费制。如果同时使用多个模型,每月是一笔不小的费用,而且过程很麻烦。

  • GPT-4:20美元/月
  • 文心一言:49.9元人民币/月
  • Midjourney:10美元/月
  • DALL-E:每张图片0.02美元

国内新出的"葫芦 AI"(HuLu AI),尝试解决这个问题。它在同一个界面,提供上面四个模型的访问,相当于"四合一"的国内镜像。

这个服务刚刚推出,目前处在推广期,优惠力度很大,只要298元,就可以永久无限量使用,免除逐一访问 GPT4 / 文心一言 / Midjourney / DALL-E 的麻烦,而且访问速度快。

葫芦 AI 希望通过周刊,向国内的开发者介绍自己。推广期结束后,他们将恢复原价498元。

它有试用点数,只要扫描上方海报的二维码,就可以免费试用。大家觉得效果满意,再考虑付费。

如果你对 AI 还不熟悉,葫芦 AI 还免费赠送学习资料。扫描上方二维码时,微信添加助理,就可以领取 【Sora 入门手册】 + 【ChatGPT 提示词大全】 + 【AI 变现案例实战手册】 的 AI 资料包。

科技动态

1、USB 止痒器

市场上出现了一种奇特的 USB 设备,当你被蚊虫叮咬后,它可以用来止痒。

你把它插入手机的 USB-C 口,然后用 App 可以控制它的发热。

当它发热以后,将其贴在被咬处,等同于热敷,很快就不痒了。

这么一个小玩意,在亚马逊的售价居然为30英镑(270元人民币)。

2、无音爆的超音速客机

目前,世界上没有超音速客机,因为超音速飞行会产生音爆,影响城市居民的生活。

美国宇航局正在开发一种没有音爆的超音速客机,并且已经生产出了一架原型机。

这架飞机长约30米,细长的圆锥形机头几乎占其整架飞机的三分之一。据说这种结构可以消除导致音爆的冲击波。

由于它的机头太长,驾驶室几乎位于整机二分之一的位置。这样的超音速飞机即使没有音爆,也载不了多少乘客吧。

3、单叶片风力发电机

传统的风力发电机有三个叶片。

一家荷兰公司发明了单叶片的风力发电机。

它装在浮标上面,水底下是一个大桶,通过铁链固定在海床上。

因为它是浮动的,根据风力和风向的不同,它跟海平面的角度也在随时发生变化。

它的优点主要是,制造和安装的成本低。目前处于测试阶段,顺利的话将会大规模部署。

4、车贷防拖欠专利

汽车贷款逾期不还,怎么办?福特汽车申请了一项专利,专门对付不还车贷的人。

在贷款偿还期前后,车辆会发出多次付款提醒。如果置之不理,车辆就会开始失去一些功能,比如空调、GPS、车窗控制等等。

每当车主出现在车内时,车辆就发出语音提醒,要你还款。

如果车主还是不还车贷,这个专利还有一个终极大招:车辆会自动开回停车场或者拖车点,让福特公司拖走回收。

文章

1、OpenAI 回应马斯克的长文(中文)

马斯克起诉 OpenAI,称后者违背开源承诺,成为微软的盈利性子公司。

这篇是 OpenAI 长篇回应的中文翻译(英语原文),透露了很多内幕。主要内容是 AI 需要大量算力和资金,所以不得不成立盈利性部门,马斯克当年对此知情,并表示支持。

2、Perplexity 会是"搜索的未来"吗?(中文)

英伟达 CEO 黄仁勋向媒体透露,他每天都使用 AI 工具 Perplexity 进行搜索。本文介绍这个对话式搜索引擎。

3、入行 15 年,我还是觉得编程很难(中文)

腾讯技术专家对其15年程序人生的思考,总结了8点经验看法。

4、100万级安装量的开源作品,一年有多少打赏收入?(中文)

作者在自己的开源作品里面,放了一个赞赏码,一年带来330元的收入。(@xxxily 投稿)

5、HTML 的 Switch 控件(英文)

Safari 17.4 引入了一个新的表单控件"滑块开关"(switch),从而将 iPhone 的这个控件带入了网页。

6、为什么我选择 Tauri 而不是 Electron(英文)

作者本来使用 Electron 开发跨平台桌面应用,后来改成了 Tauri。本文讲述了原因,以及他的感受。

7、text-wrap 的换行控制(英文)

长文本的自动换行,由 CSS 的 text-wrap 属性控制。本文讨论如何使用这个属性,让标题产生更美观的自动换行。

8、计算机从哪里获取时间?(英文)

计算机从 NTP(时间服务器)获取当前时间,但是 NTP 的时间又从何而来?本文图文形式地介绍人类如何确定时间。

9、如何在 Windows 上测试 Safari(英文)

苹果的 Safari 浏览器现在没有 Windows 版,本文教你一种方法,依然可以在 Windows 上测试这个浏览器。

工具

1、Ente

一个云相册软件,Google Photos 和 iCloud Photos 的替代品,以前是闭源产品,最近刚刚开源。

它的主要特点是提供端对端加密。其他的云相册软件,还有 ImmichPhotoPrism

2、Earthly

一个开源的 CI/CD 框架,可以在本地架设自动构建服务。

3、Vikunja

一个开源的代办事项(to-do)App,提供多种视图,有 Web 版和桌面版,还可以自己架设。

4、日语短文排版小工具

一个在线工具,生成漂亮的日文排版,支持横竖版式、自动假名标注、深浅两种主题、字体配置、高亮、下划线、字体等。(@miusuncle 投稿)

5、Web-Check

开源的网站分析工具, 可以分析网站的 IP 信息、SSL 链、DNS 记录、Cookie、域名信息、服务器位置、网站性能等,查看 Demo。(@WFANG12719 投稿)

6、ImageTools

AI 一键抠图(去除背景)的在线工具。(@handsometong 投稿)

7、zz-plan

甘特图/横道图的在线制作工具。(@lizhichao 投稿)

8、Windows in container

Docker 容器里运行 Windows 系统,可选择 Win7,Win10,Win11 等,支持自动激活,还支持远程桌面连接。(@wrenashe 投稿)

9、Rsdoctor

一个 JS 构建器的分析工具,能够查看构建产物的模块关系,并分析构建器对代码的更改,支持 Rspack 和 Webpack。(@easy1090 投稿)

10、Photo Relay

一个封面图片制作的在线工具。 Demo。(@zobor 投稿)

11、opfs-tools

浏览器私有文件系统 OPFS API 的一个封装库,提供更简单好用的 API。(@hughfenghen 投稿)

12、ast-grep VSCode

一个使用正则表达式进行代码搜索、替换的 VSCode 插件。(@HerringtonDarkholme 投稿)

掘金动手实验室

学习新技术,最重要的就是动手实操,但是这样的机会比较少,你不一定能遇到让你尝试的场景。

本周有一个好消息,掘金动手实验室(JUEJIN Code Lab) 正式推出啦!

它是一个新技术实操为主题的系列活动,致力于理论知识转化为实际应用,并让参与者之间进行技术交流。

它由稀土掘金技术社区精心策划,与众多领先的工具和平台厂商携手合作,将涵盖多个技术领域,确保每一位参与者都能找到自己感兴趣的内容。

第一期活动的主题,就是现在最热门的 AI,由稀土掘金社区和扣子(coze.cn)共同发起。本次活动通过动手实操的方式,让你的想法和创意在 AI 的帮助下落地。

活动分为3月16日的北京场和3月30日的深圳场,地点就在北京/深圳的字节工区。

所有线下参与的同学,除了能够接触 AI 开发以外,还都有机会获得掘金的丰富礼包、以及扣子(coze.cn)的官网推荐、API 内测和官方访谈。

欢迎大家点击链接,或者扫码海报的二维码,报名参与,进行 AI 开发实操。

资源

1、一译

用户可以在该网站搜索或者上传 arXiv 论文(暂时只支持 HTML 版本的论文),它会自动机器翻译,提供对照阅读。(@yiyibooks 投稿)

2、京墨

一个开源的安卓 App,随身的古诗文、歇后语、成语、绕口令等等的图书馆。(@hefengbao 投稿)

3、OpenMoji

这个项目收集各种开源的 Emoji,开发者和设计师可以提交自己的作品。

4、Docker Compose Examples

这个仓库收集各种常用的 Docker Compose 配置文件。

5、学习 x86-64 汇编语言

一本英文的汇编语言入门教材,以 Ubuntu 平台为例。

图片

1、落叶艺术

一个欧洲艺术家在公园里,把落叶整理成各种奇怪的形状,让公园有了更多的趣味。

2、最后的快车

《最后的快车》(The Last Express)是上个世纪末发行的一款电子游戏。

它讲述了一个美国人在1914年,登上最后一班从巴黎到伊斯坦布尔的"东方快车"的故事。

整个游戏场景,都发生在车厢内。下面是真实车厢的历史照片。

游戏设计师根据这张照片,进行建模,以数字形式还原了当时的场景。

文摘

1、有些人就像 ChatGPT

大家都说 ChatGPT 像人,但是我觉得,还有另一方面,那就是有些人很像 ChatGPT,尤其是在学术界。

ChatGPT 不理解任何材料,但可以利用这些材料,快速找到问题的合理答案。它会综合和模仿,有时表现得非常令人信服,就像某个知识渊博的人在谈论某个主题。

学术界的很多人也是这样,他们很聪明,吸收了说话和构建理论的方法,并且善于听起来令人信服。

但是,如果你问一个探索性的问题,就会发现他们的理解很少,一切侃侃而谈都是表面的,没有深度。这都是模仿而不是真正的思想,他们只是故意让别人觉得似乎有道理。

许多领域的许多人,表现得就像 ChatGPT 的真人版,特别是在那些不做太多实证工作、不涉及对事实或假设进行检验的学科。他们制造的文本越多,就越危险。

这种人有很多明显迹象,比如使用非常笼统的术语,以及听起来巧妙的表述或行话,内容里面很少有事实,例子也很少或者很随意,没有真实的感受,而且通常也不会足够清楚地说出他不同意什么。

我现在意识到,我不理解某人在说什么,有时很可能是他们不知道自己在说什么,表现得像 ChatGPT。

我将其称为"吹泡泡",即没有实质内容但能让他人信服的说话能力。这是很多大学领导的重要技能。

现在,ChatGPT 向我们展示了尽管不理解,但将大量材料合成为可信的文本流,是完全可以做到的。也许这是不可避免的,但真是一种非常不健康的恶习----人们应该走出去,观察事物,清晰说出自己的真实感受。

我明确意识到,自己更愿意被那些行为不像机器人的人包围,更愿意倾听那些有原创思想的人的声音。

言论

1、

如果你没有时间集中精力学习新知识,那么就花时间复习已经学过的内容。

-- Hacker News 读者

2、

浏览器地址栏兼作搜索输入栏,这一定是史上最值钱的 UI 控件。谷歌为了成为这个控件的默认搜索引擎,每年支付 Firefox 4亿美元,Safari 150-200亿美元。

-- 《史上最值钱的 UI 控件》

3、

一切都是模糊的,直至你试图使其精确时,你才会发现,我们日常表达出来的精确与真正的精确相距甚远。以至于当我们说话时,你无法假设这就是对方真正的意思。

-- 伯特兰·罗素(Bertrand Russel),英国哲学家

4、

忒修斯之船(Ship of Theseus)是公元一世纪的希腊作家普鲁塔克提出的哲学问题:如果雅典国王忒修斯的船的木头逐渐被替换,直到所有的木头都不是原来的木头,那这艘船还是原来的那艘船吗?

-- 维基百科

5、

每一个最佳实践的背后都有一个恐怖的经历。

-- Julia Evans

往年回顾

摩天大楼是反人类的(2023 #245)

你做过不在乎结果的项目吗?(2022 #195)

大家不出门,经济怎么办?(2021 #145)

远程办公暴露冗余岗位(2020 #95)

(完)

文档信息

  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证
  • 发表日期: 2024年3月 8日
❌
❌