此篇,谨献给那些在代码屎山中挖矿淘金的IT男和幻想用键盘改造世界的勇士们。结构很松散,但主线很明确:从ICE事件引发US社交媒体自嘲北美懦夫说起,简单分析太平洋对岸冷嘲热讽的心态。其后借助代码屎山的分析,对比社会问题发展积累的成因、发展、危害以及控制方法。知乎上看到一篇发生在中美之间的键政Mutual Accusations,链接在这里:美国发明“北美懦夫”口号,人均持枪却不敢反抗暴政,引发中国摆脱“东亚病夫”后的反讽,如何看待此事? - 知乎刚开年,明尼苏达州接连发生两起ICE执法人员枪击事件,美国本土的键盘侠们在社交媒体原创出一个新词“American Cowards”,炮轰人均持枪却不敢反抗暴政的胆怯。这个词直译是北美懦夫,很像百年前的回旋镖。尽管对象不同,但本质上都是剧烈变化时代下来自内外部压迫的思想抗争。自从小红书对线以来,两边互相戳穿的老底都不少。尽管很多人心里都藏有提笼架鸟带着家丁上街调戏良家的龌龊,但对绝大多数普通人而言,不要谈是不是会碰上盖茨久病不愈的机会,就连车厘子自由也顶天算是努力奋斗的口号。这个回帖系列看到一篇很有意思的答复,后面评论区的内容也很值得玩味,和最近看的几本书中讨论的思维拆解方法有关。比如逻辑关系中的悖论破解技巧以及互为因果的关系。后面展开再说,先谈谈来自俗人的幸灾乐祸,毕竟上一篇谈了为什么扎心的大实话会让现有规则玩不下去。这世界上很多别人倒霉的事情都会让我们喜闻乐见,可能十几年没见面但还有联系的穷亲戚能让我等俗人保持借钱不还的警觉,迫于道德绑架的压力提供一笔小钱接济时候咬牙说什么别提什么还不还先渡过难关之类,但突然有一天看到以前日子过得还不错的暴发户突然哭天抢地说漂亮小姨子被隔壁街的黄毛骗到东莞,还真不大容易生起什么同情心。在这篇讨论中,留言点赞最多的一篇是这个,链接如下:
美国发明“北美懦夫”口号,人均持枪却不敢反抗暴政,引发中国摆脱“东亚病夫”后的反讽,如何看待此事? - 福福猪的回答 - 知乎
https://www.zhihu.com/question/2000120100309722771/answer/2000641518743090093
当然他的回答有戏说的成分,也不代表答主的全部真实意思,但值得注意的是在戏说的路上狂奔太远,就有可能导致认识上的走火入魔。吴军博士有个观点,了解新的知识并建立认知体系,需要先从正统出发,对现有的知识体系有基本的认知;然后阅读综述期刊,了解最新的研究成果;最后看有意思的内容,巩固认知或提出批判。
这里作为素材的知乎文字内容上存在一些因为戏说导致偏颇倾向,不管是情绪发泄还是幸灾乐祸,尽管这段文字有意思,但不能作为认知世界的标准看法。
当然,我并关注的重点并非对方的观点正确与否,而在于分享如何看待系统性认识对我们思维能力建设能否可持续的某些认识。
【Bug:不能忽视的历史】
从发展和逻辑的角度看,bug的产生与历史遗留问题密切相关,而且这种历史bug往往会通过多种机制不断复制和放大,形成恶性循环。对比社会问题演变、社会治理自愈能力,两者之间存在强大的类比性。
作为一个被清理出研发队伍的前三流程序员,一直对当年被老板逼迫放弃对堆叠代码的价值追求耿耿于怀。在Coding界有一个著名的大梗:一个bug是bug,一堆bug能work,谁要是胆敢触碰前任留下的屎山,后果恐怕比尾矿崩塌来要惨烈。
第一个观点:bug产生和演变有明确的历史路径依赖机制
这事情我有过深刻的教训,当然也从中受益来着。当年写BSP的时候,发现了一个有前前……前任有关的跳线状态识别bug。能稳定重现的一般好解决,随机的时间代价可就大了去了。当时后来的研发的头找到还是总工的赵大神,可惜神仙也是人,没能在第一时间发现问题所在,在旁边敲锣边的某人福至心灵发现了问题所在。问题在于这玩意不是根源,表面上的缝缝补补第一时间解决了当时的问题现象,直到很久很久以后,一个刚刚入职的小盆友发现了更深层次的bug,于是乎,某人的补丁也成了bug。
按照软件工程中的某些观点提炼,bug会有三个典型效应:初始设计缺陷的锁定效应、历史bug的连锁反应和测试覆盖不足的恶性循环。
有观点将bug视为技术债务。早期为了快速上线,采用临时方案,这个过程中存在的技术补丁和可能又成为后续开发的基础,形成路径依赖。历史架构决策限制了后续技术选型,即使发现更好方案,也因迁移成本过高而无法采用。
由于团队习惯了现有设计模式,思维被"框定"在原有框架内,难以跳出历史局限思考。随着时间的推移,技术上的依赖关系被持续放大。一个核心模块的bug会通过调用链传播到多个模块,修复时需要同时修改多处代码,风险极高。正因为每个bug修复都可能引入新问题,形成"补丁上打补丁"的复杂结构,可读性下降,维护难度指数级增长,最终屎山的出现成为所有大型软件系统共性的巍巍壮观。
【社会:视角不同的殊途同归】
热力学第二定律完全可以解释为什么在社会学方面也存在类似很多问题积弊难反的技术原因,毕竟所有以有序为目的的调整都需要付出比有序效果本身更大的代价,换言之就是没有白吃的午餐。
首先,历史遗留问题一样会造成路径依赖。所有的社会秩序都不是凭空创造的,革命的蓝图上作画似乎代价小一点,改良的草纸上改动难免会保留更多的痕迹。
典型如历史上的政策选择会形成制度框架,后续改革只能在既定框架内进行,即使发现制度缺陷也难以彻底推翻;历史形成的利益集团会维护现有格局,抵制改革,导致问题长期存在;长期形成的思维模式、行为习惯会限制解决问题的思路,形成文化路径依赖。
这个层面涉及的历史制度惯性、利益格局固化、文化传统依赖会随着时间的不断推移形成下一个层面的问题:问题的自我复制。当社会发展进入稳定期,广为诟病的现象会通过代际传递升级为更加顽固的结构性问题甚至制度性问题。
社会和个体之间的互动是极其复杂的。所谓的自愈机制,包括市场机制、社会流动、文化适应等,能在一定程度上缓解现有问题。但自愈也是有极限的,一旦问题积累到临界点,或涉及根本性结构矛盾时,自愈机制会失效,需要主动干预。当社会价值观在长期的阶层固化或贫困陷阱表现出来后,如果社会仍存自愈能力,可能会出现改良;如果矛盾计划,可能会导致革命;而更无望的情况下,则会出现非暴力的躺平。
【惯性:一个前IT男的观点】
从软件工程科学角度分析,屎山出现的必然不可避免,但屎山问题导致的后果并非完全不可控制,甚至可以改变。要认识到多bug叠加产生的非线性风险进一步引发不可控。系统工程论告诉我们,高内聚低耦合的设计能隔离变化,降低修改风险。如果再引入经济学的视角,避免早期沉默成本陷阱最好的办法仍然是严格设定标准,避免早期设计决策会锁定后续发展路径。
带bug运行的一堆屎山与人类风险厌恶的心理有关,所有人都喜欢报喜不报忧,所有技术问题统统可以归咎于管理问题,最典型的现象就是多人维护的一座屎山本身就代表着责任的分散,以小步快跑的形式完成代码重构并非不可行,其实通过可控的工程活动、通过科学的惯例方法,完全可以降低风险。
真正困难的是决策,技术债务管理的量化评估是非常重要的手段。细品,问题的解决不在于否认历史,而在于建立持续改进的机制——通过系统化设计、自动化保障、组织学习和制度创新,将被动修复转变为主动预防,在问题积累到临界点前及时干预,或许才是可行的解决之道。
【笑话:别人的事情更别认真】
原帖中回复的革命提供了一个顺口溜,谈的是美帝的系统集成,当个乐子看。
汉朝的穷兵黩武,晋朝的民族融合;
隋朝的好大喜功,唐朝的藩镇割据;
宋朝的货币超发,元朝的贱民愚民;
明朝的党争纷扰,清朝的鸦片泛滥。
要说这些问题堆到一起,确实能逼得瞌睡乔推选,大统领抓狂。问题是这些bug不是一天形成的,能支撑多久算多久吧。危险的事情不是道德败坏的带头大哥破产要饭,而是丫掀桌子砸锅,这或许才是那么多人恐惧的原因吧。
在这个草台班子当导演的舞台上,个体的选择可能始终是一个二难问题,而能选择答案其实非常清晰。那妞是要承认屎山必然,但不能屈服于屎山崩塌的宿命;要警惕历史惯性,但必须相信并常识可控和重构。我们可以笑看互嘲循环,但绝对不能因竞争对手的咄咄逼人或狼狈不堪而怀疑自己的追求。如果不得不继续在屎山里淘金,如何选择适当的姿态就很重要的,类似持剑经商或许也是一种不错的选择,但躺平显然不是最优解。面对系统中存在bug的现实,我们仍然敢于接受从局部开始优化动刀的阵痛,其实对这个越发荒诞的世界的,反抗可以激烈也可以温柔,如果系统中大大小小的bug不可克服,至少我们可以选择不成为bug的一部分。天底下最爽的事情莫过于用假钞付小费,这样做,也挺好。