ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

GitHub 破 12.9 万星,YC 总裁的开源技能库:Search Before Building 凭什么成为第一条铁律

GitHub 破 12.9 万星,YC 总裁的开源技能库:Search Before Building 凭什么成为第一条铁律 先搜索再动手写代码Search Before Building最便宜的架构决策发生在你写第一行代码之前。每个程序员都熟悉这种感觉你在一个不熟悉的领域里坐下面对一个问题第一反应是开始设计。你画模块边界选数据结构开始敲代码。两天后你发现运行时早就把你正在手写的东西做成了一行内置函数更糟的是你选的显而易见的方案其实是错的而且已经公开错了很多年。有一个习惯能打断这一切。它只花大约三十秒却是软件设计里杠杆率最高的一步先搜索再动手写。这不是多读几篇博客。这是一套具体的纪律用来区分三件事你真正知道的、你只是以为自己知道的、以及你即将从零开始无意识发明的东西。成本的不对称这个习惯之所以有效是因为它的经济账是严重倾斜的。你做的事成本你冒的风险搜一下这个问题是不是已经解决了约 30 秒几乎没有跳过搜索自己造数小时到数天造出一个比现有方案更差的版本坏结果不只是浪费时间。而是把一个平台本来就免费提供的东西完整地、带测试、带文档地重新造了一遍。这种失败从内部是看不见的代码能跑测试通过PR 合并了。没人发现它因为唯一能发现它的是你跳过的那一次搜索。三层知识当你开始搜索时会面对三种截然不同的真相来源它们以三种截然不同的方式失效。把这三层搞混正是大多数未知的未知的来源。层它是什么风险你的动作第一层老而稳久经考验的模式深度在分布内的东西以为显而易见的答案是对的偶尔它不是先查内置方案再质疑前提第二层新而火当前最佳实践、博客、生态趋势狂热人群对新事物的判断错得和旧事物一样多审视。搜索结果只是输入不是答案第三层第一性原理针对这个具体问题的原始推理因为停在第一、二层而永远到不了它把它看得比什么都重搜索的目标不是找到可以复制的东西而是足够快地穿过第一、二层让你为第三层留下时间和上下文。第三层才是好工程的真正工作所在。第一层运行时早就解决了它这一层的失效模式不是无知而是自信。你伸手去拿那个感觉显然对的答案从不验证因为它在你的心智里和水是湿的属于同一类。这是一个真实咬了人们很多年的坑# 显而易见的写法defis_list(value):returntype(value)list# 为什么错type() 不做子类检查classMyList(list):passis_list(MyList([1,2,3]))# False —— 但它确实是个 list# 久经考验的写法isinstance(value,list)# True这个 bug 只在继承场景下暴露所以它能活过代码评审、单元测试和一年的线上流量最后才咬你一口。isinstance一直是正确答案。找到它的搜索成本是一次查询。同样的形状出现在数据克隆上# 大家顺手就写的写法importjson copyjson.loads(json.dumps(user))# 它悄悄弄坏的东西# datetime - str# Decimal - float丢精度# set - list# tuple - list# 非字符串键 - 抛错或被强转# 标准库内置从 Python 1.x 就一直在那importcopy copy.deepcopy(user)注意这个模式。两个例子里显而易见的答案在快乐路径上都能跑。搜索之所以存在恰恰是因为失败藏在你看不到的地方。第一层也覆盖基础设施运行时的文件监听、语言内置的排序、框架内置的鉴权原语。在你手写任何一个之前直接问出这个问题# 第一层 —— 平台是不是已经内置了# search: python thing built-in# search: python deepcopy built in# search: python 文件监听 内置第二层“流行不等于正确”第二层开始变得危险因为这些材料看起来很权威。它是最新的、被顶上去的、出现在人人都跟过的那篇教程里。风险不是你没搜到它而是因为它太响你未经审视就照单全收。React 的useEffect历史是最干净的例子。在 Python 世界同样的坑是把派生数据缓存成可变状态然后它悄悄过期# 反模式把派生数据缓存成可变状态然后它悄悄过期classUserStore:def__init__(self,users):self._usersusers self._activeNone# 缓存defactive_users(self):ifself._activeisNone:self._active[uforuinself._usersifu.active]returnself._active# users 变了这里不会跟着更新# 社区最终收敛的写法派生数据直接算别缓存成状态classUserStore:def__init__(self,users):self._usersuserspropertydefactive_users(self):return[uforuinself._usersifu.active]第一种写法制造了第二个真相来源并且会过期。它曾经到处都是教程、课程、生产代码库。如果你搜Python 最佳实践然后停在那你会写出第一种如果你再搜一句为什么不要手动缓存派生数据你会找到第二种。这两次搜索的差别就是照抄人群和理解人群的差别。同样的动态也发生在语言特性上。去年还需要绕弯子写的东西今年可能已经进了语言# 3.8 时代的写法想要无界缓存得写一个让人困惑的 Nonefromfunctoolsimportlru_cachelru_cache(maxsizeNone)deffib(n):returnnifn2elsefib(n-1)fib(n-2)# 3.9 进了语言意图一目了然fromfunctoolsimportcachecachedeffib(n):returnnifn2elsefib(n-1)fib(n-2)第二层的规则很简单把每一条搜索结果当作需要评估的证据而不是需要执行的判决。人群对新事物判断错的次数大约和判断对的次数一样多。# 第二层 —— 当前最佳实践是什么它哪里不对# search: thing best practice current year# search: why is popular approach bad# search: popular approach alternatives第三层顿悟时刻第一、二层让你别重造轮子、别追狂热。第三层才是你做前两层的全部理由。搜索不是为了找到一个可以复制的方案。最高价值的产出是这三步理解每个人都在做什么、以及为什么第一、二层对它们的假设做第一性原理推理找到一条具体的理由证明常规方案对你的约束是错的第三步是稀有的那一步。它是那个时刻你发现每个现有方案都假设了一个你并不存在的约束或者都在优化一个你的问题里根本不会出现的场景。常规答案不是普遍错误它只是对你错了而你现在能证明为什么。这就是别人往东我往西的那一下。最好的项目里满是这种时刻。你只有做完第一、二层的工作才能到达这里因为在你不知道别人都在做什么之前你没法推理出别人漏掉了什么。搜索协议压缩成你能直接照着做的东西# 在动手做任何不熟悉的东西之前按顺序# 第一层 —— 平台是不是已经解决了它# search: runtime thing built-in# search: thing native runtime# 第二层 —— 当前最佳实践是什么它哪里不对# search: thing best practice year# search: why is popular approach bad# 第三层 —— 去看源头而不是看摘要# read: 官方文档、spec、PEP、源码# not: 前三条和你观点一致的博客从搜什么到能抓到什么的映射搜索它抓的是什么built-in/native重造平台已经提供的东西第一层遗漏best practice year被旧时代过时建议带偏why is approach bad狂热未经审视就接受流行答案第二层遗漏官方 spec / PEP / 源码每个摘要和博客里的传话游戏失真你自己对这个问题的推理任何搜索都给不了你的第三层洞察反模式失败和成功一样具体。反模式它长什么样解法第一层遗漏运行时已有内置却手写了一套永远先搜built-in第二层狂热在陌生领域未经批判地接受博客问为什么并去搜反面论点第三层失明不质疑前提直接认定久经考验的方案是对的知道常规答案后问它哪个假设是你不具备的什么时候不该搜索这个习惯有诚实的边界自律的程序员知道它们真正新颖的问题。如果搜索一无所获这本身就是信号。你不是因为失误才落在第三层而是默认就站在第三层。伪装成搜索的拖延。用搜索来逃避决策不是这个习惯。一两次真正改变方案的搜索就够了然后做决定。判断类决策。该选哪个库是一个价值观问题团队规模、维护风险、锁定成本不是一个查表问题。搜索为它提供信息但不替它做决定。检验标准很简单这次搜索有没有改变你原本要写的东西有就值得如果你在搜索是为了逃避写代码那就不值得。动手前清单在写任何不熟悉的东西的第一行代码之前我搜过平台有没有内置方案了吗我搜过当前最佳实践、以及反对它的论点了吗我读过源头文档、spec、PEP而不只是摘要吗我能说出常规方案在我的约束下为什么可能错吗这次搜索真的改变了方案吗没有的话停止搜索动手写。先搜索再写正确的东西这两个纪律要成对使用。先搜索这样你就不会把一个一行内置函数就能搞定的东西完整重造一遍。然后再把你真正该写的东西写完整因为现在完整性很便宜捷径反而不便宜了。最坏的结果是对一个运行时内置函数的完整、带测试、带文档的重实现。最好的结果是一个完整实现、而且还没人做过的东西因为你搜了、理解了地形、看见了别人都漏掉的东西。三十秒的搜索就是这两种结果之间的差别。这是你做过的最便宜的架构决策。文中的三层知识框架来自 gstack 的 ETHOS.md 里Search Before Building原则。代码示例和它们说明的失效模式是 Python 社区里的通用常识。
返回列表