02博客

缺失的 文档

我们边做边学的笔记。几乎每一篇都来自一个具体的问题,而它花掉的时间比我们预想的多。

全部
  1. ProductoLa web de un pintor solo tiene que hacer una cosa: que le llamenHice la web y la app de trabajo de Mamu, un pintor de Valencia, en cuatro días sueltos. Lo que más mejoró la web fue borrar las páginas de precios y de por qué elegirnos.
  2. IACómo construimos Zenbu, un buscador de anime que busca por lo que cuentasCatorce mil animes, un vector por serie y un LLM que reordena al final. Lo que más nos costó no fue la búsqueda semántica: fueron las secuelas con sinopsis de una línea.
  3. 架构我换过四次认证服务商一年半里用过四家托管服务商,终点都一样:自己写的中间件。每次过渡会坏掉什么,以及现在我在写任何一行认证代码之前会先看什么。
  4. 运维Stripe 弄坏我的 build 五次了,现在我把它排进了日程升级 Stripe 的 API 版本不是一次事故。它是周期性的维护,附带损伤相当可预测,值得提前给它留预算。
  5. 产品额度、余额、消费上限在五个产品里我都用同样的方式做按量计费:从额度开始,最后落到以分为单位的余额和按 key 的上限。我现在知道该从哪一步开始了。
  6. 数据库为什么我用过 RLS 的两次,最后都把它移除了行级安全看起来是默认就该有的正确实践。但在有 Drizzle、server actions 和自建认证的情况下,权限逻辑已经住在别的地方,同时维护两套很疼。
  7. 判断我从不从零开始:我总会带走什么,又总会砍掉什么十个项目跑在同一套脚手架上。每个项目的第一个提交,更像上一个项目的最后一个提交,而不像一个新项目;而第二个提交几乎总是在删东西。
  8. 判断任何模板里我第一个删掉的都是 Stripe我几乎每个项目的开头都是删掉 checkout、portal 和 webhook。这不是马虎:这是把我一定会需要的基础设施,和现在还轮不到的东西分开。
  9. 架构同一个并发 bug 在三个不同项目里都出现过高负载下做加法的计数器会丢增量,做减法的可能对同一件事收两次钱。当计数器是钱的时候,这不是可以之后再修的细节。
  10. AI每个新模型都会弄坏我一样不同的东西一年半里做了六次模型迁移。没有一次只是改一个字符串,尽管每次一开始看起来都像。
  11. 数据库同一个合同模型我重写了十几次复杂的领域模型第一次不可能写对。你是把真实数据摆在面前、一次次重写,才收敛到它,而这包括推翻那些看起来正确的决定。
  12. 数据库我的第一版数据模型几乎从来撑不过第一个月第 1 天的模型是对一个你还不理解的领域提出的假设。接受这一点,会改变你怎么写它,以及改它有多疼。
  13. 安全为什么访客访问我用会话 token,而不用验证码六位数验证码看起来是让没有账号的人进来的简单办法。确实简单,直到你要吊销它,这时你才发现你不知道自己踢出去的是谁。
  14. 运维为什么"在我本地能跑"对我已经毫无意义你的机器和生产环境之间的差异不是运气不好:它们是四类具体的、总在出问题的东西,而绿色的 build 看不见它们。
  15. 工程那个报绿灯却在撒谎的测试一个打印"所有测试通过"并以退出码 0 结束的测试里,藏着六条 SCRIPT ERROR。怎么发现一个绿灯是假的,以及现在我在相信绿灯之前会做什么。
  16. 性能后台列表是最先垮掉的那一块内部面板写的时候没有任何上限,因为一开始只有四行数据。而当产品长大,恰恰就是这里全线炸掉。
  17. 安全把自己的代码当成别人的来审计,我学到了什么一个空 ACL 返回了整个语料库,一次不需要一行 JavaScript 的 CSS 注入,还有一把在账号注销后仍然有效的 API key。全都在一天之内,全都在我自己写的代码里。
  18. 架构为什么我在不需要登录的应用里也要求登录没有身份就没有配额,没有支出上限,也没有办法切断滥用者。注册带来的摩擦,比起没有它的代价,是便宜的。
  19. 判断每次我从零手写一个东西,最后总会发生同样的事我手写过四次编辑器。三次最后都用库重写了。第四次连两天都没撑到。
  20. 前端全局 store 什么时候才配有一席之地全局状态不能用方便来正当化。它的正当理由是:某个中间组件收到了它自己不用的 props,只是为了往下传。
  21. 判断从 ESLint 到 Biome 的五次迁移:这个决定早就定了当你在五个项目里做同一次迁移,而且都没停下来想,它就不再是偏好,而成了判断。过程中会坏掉什么,又会失去什么。
  22. 判断先写文档再写代码:我对不受自己控制的集成的规则在与外部 API 的集成里,前四个提交不碰代码。先写文档会逼你去测量那些之后会在生产里炸掉你的限制。