Idea → System

从一个想法到一套能用的系统

一个关于开发、基础设施、安全与人工智能的知识库。每篇文章都以一句话摘要开头,用没有建过这类系统的人也能懂的语言展开,最后以「深入一层」的方框收尾,讲清其中的工程取舍。

每篇文章都会回到的三条原则

工具每年都在变,决策的顺序不变。

1

先定问题,再选工具

在问题尚未定义清楚时选技术,是一次要用几个月来偿还的猜测。

2

先有证据,再作承诺

发现自己判断错了,最便宜的时间是第一周,而不是第六个月。

3

没有度量就没有改进

没有度量,每一次改动都只是信念,每一次争论都由嗓门决定。

文章库

八个领域,共 100 篇文章。可以搜索、筛选,或者直接往下翻。

产品基础

从一个想法,到能照着做的定义

12 篇
001把一个想法,变成真正能解决的问题在挑技术之前,先写清楚谁被这个问题困住、他今天用什么办法凑合、以及你凭什么判断问题已经解决。002能证明一件事的最小原型原型是用来回答一个危险问题的,不是用来展示产品的——所以它可以难看、可以靠人工、可以不完整。003写一份开发者真会看的需求文档好的需求文档写的是行为和验收条件,不是设计稿;篇幅以页计,不是以几十页计。004决定不做什么能说「不」,才是一个已经上线的产品和一个永远在开发中的产品之间的区别。005要多久:不带幻想的估算好的估算是一个带着可见假设的区间,随着认识增加而更新——而不是一次性说出来的一个数字。006自建、购买还是接入只自建让你与众不同的部分;其余的——买、接入,或者干脆放弃。007三天内做完用户调研和真正在做这件事的人做五次半小时的对话,比一千份问卷回收得到的东西多。008不说谎的成功指标选一个和用户实际获得的价值挂钩的指标,旁边再放一个防止你弄坏别的东西的指标。009技术债:什么时候借,什么时候还技术债是一种正当的融资工具——前提是有意识地借、记录在案,并且有一个谈还款的日期。010第一版:哪些必须有第一版要把一件事从头到尾做完,而且要做到你能依赖它。011所有人都在喊的时候怎么排优先级排优先级不是一份有序清单,而是一条所有人事先都知道的决策规则——否则就是谁嗓门大谁说了算。012从需求文档到可以着手的任务好任务以一个能运行、能验证的结果收尾,耗时一到两天——不是一周,也不是一小时。

网页与前端

浏览器里的网站和应用

8 篇

移动应用

从应用商店到紧急修复

11 篇
021原生、跨平台还是移动网站这个选择由「你到底需要设备的多少能力」和团队规模决定——而不是今年流行哪种技术。022离线工作:一个在电梯里不会坏掉的应用按照「没有网络」这个前提去设计应用,你会顺便得到一个在有网时也感觉很快的应用。023不流失用户的推送通知正当的通知,是用户错过了会后悔的那种——其余的一切都会导致关闭权限,而那几乎不可逆。024第一次就通过商店审核大多数驳回来自元数据和权限,而不是代码——而且用一小时的准备就能避免。025移动端性能:内存、电量和「快」的感觉在应用里,感觉由启动时间和滚动流畅度决定——而这两者都会被图片和跑在主线程上的工作破坏。026设备上的本地存储与敏感数据假定设备会丢失或被攻破:本地存的东西应当最少、加密,并且可以远程吊销。027应用的版本与向后兼容用户会拿着旧版本用好几个月——服务端必须支持它们,也必须知道什么时候停止支持。028移动端体验:和大屏有什么不同在手机上,用户是站着的、赶时间的、单手拿着的,有时还在阳光下——而这会改变每一个决定。029应用的崩溃与错误监控没有自动崩溃上报,你就只能从商店评价里得知问题——也就是太晚了。030灰度放量与功能开关先发给一小部分人,观察指标,再扩大——并且保留在不发版本的情况下关掉某个功能的能力。031来自设备的文件、媒体与上传相机拍的照片比需要的重几十倍——在它碰到网络之前,先在设备上处理掉。

后端、接口与数据

没人看得见,人人感受得到的一侧

15 篇
032设计一个能长期共处的接口好接口是可预测、一致而无聊的——它里面的每一个惊喜,都会变成使用者反复提出的问题和一个bug。033接口版本化:怎么改而不破坏你发布了接口——就是做出了承诺。破坏性变更需要新版本、重叠期和提前通知。034数据库:选了不后悔大多数情况下关系型数据库是正确答案,任何其他选择都需要一个能用一句话说清的理由。035不停机的表结构迁移用向后兼容的步骤改表结构:先加、再填、再切换,最后才删除。036队列与后台任务任何超过一秒、并且不是返回给用户所必需的操作,都属于队列,而不属于请求。037缓存:加速但不提供过期数据在加缓存之前,先决定一份过期的数据在多长时间内仍然可以接受——这是唯一真正重要的问题。038认证与授权:你是谁,以及你被允许做什么身份和授权是两个不同的问题,而大多数漏洞来自第二个只在界面上检查、没在服务端检查。039一个服务还是多个:什么时候拆从一个组织良好的系统开始。只有出现真实痛点时才拆——团队互相阻塞,或者某个组件需要完全不同的规模。040设计一个能用很多年的数据模型好模型表达的是业务现实,而不是别人最初让你做的那个页面。041调用外部服务时的可靠性每一次外发调用迟早都会失败——唯一的问题是,你有没有为「那时会怎样」做过规划。042文件与对象存储文件既不属于数据库,也不属于服务器磁盘——它们属于带签名地址的对象存储。043搜索:数据库什么时候不够用了带相关性排序、错别字容忍和多重筛选的全文搜索是另一个世界——而且不是每个系统都需要它。044外发邮件、消息与Webhook外发消息是一个公开接口:它需要队列、重试,以及「发了什么给谁」的记录。045负载:限流与自我保护健康的系统会及早而明确地拒绝,而不是在它扛不住的负载下慢慢垮掉。046和钱打交道:支付与扣款永远不要存卡信息、永远不要相信从客户端传来的金额,并且永远保留一份不可变的事件日志。

基础设施、云与 DevOps

代码如何上线,又如何留在线上

14 篇
047环境:开发、测试与生产三个环境从同一份定义构建,只在配置和数据上不同——任何其他差异都是一个等着被发现的bug。048容器:它带来什么,什么时候多余容器把应用和它运行所需的一切打包在一起,让它在任何地方行为都一样。049基础设施即代码如果你没法从版本控制里的一个文件重建出环境,那你拥有的不是基础设施,而是一部点击历史。050自动化的构建与部署流水线每次合并都应触发同一串动作:构建、测试、安全检查、部署——中间不能有任何一步手工操作。051部署策略:蓝绿、金丝雀与渐进式好的部署是用「能多快回滚」来衡量的,而不是用「上线有多快」。052监控与可观测性:在客户之前知道有东西坏了三类信号——指标、日志和链路追踪——以及它们必须回答的一个问题:现在发生了什么,为什么。053备份与恢复:没被测试过的就等于不存在备份不是策略;策略是「你能丢多少数据、能停多久」——以及你确实做到了的证据。054云成本:钱去哪了账单的大部分来自三个地方:没人需要却在运行的资源、没有策略而不断增长的存储,以及跨区域流量。055扩展:横向、纵向,以及你真正需要的在扩展之前,先量清楚瓶颈在哪——大多数系统里瓶颈是数据库或某一条查询,而不是服务器数量。056网络与证书:域名、DNS和HTTPS大多数「网站打不开」的故障是域名、过期证书或者路由——而不是代码。057管理密钥与凭据代码仓库里的密钥就是已经泄漏的密钥——即便仓库是私有的,即便你之后删掉了它。058不找罪魁祸首的故障复盘每次故障之后,花一小时写一份聚焦系统而非个人的复盘是值得的——否则同样的故障会再来一次。059高可用与灾难恢复先决定一小时的宕机对你值多少钱,然后再决定买多少冗余。060日志:存得对,找得快好的日志是结构化的、带请求ID的、保留时长明确的,并且不含没有理由出现在那里的个人信息。

安全

在攻击者之前,先像攻击者一样思考

14 篇
061一小时做出威胁模型画出你有什么、谁可能想要它、它在哪里跨越边界——你就得到了一份真实的优先级清单,而不是一种直觉。062每次审计都会重复出现的十个问题大多数发现并不高深:服务端没检查权限、输入进了查询、以及老旧的库。063密码、双因素与会话用专门的慢哈希算法存密码、启用双因素,并让用户能从所有设备登出。064注入:把指令和数据分开每一个把用户字符串拼进命令的地方都是一个洞——而解法是参数化,不是过滤。065保护公开接口一个对互联网开放的接口,从第一天起就会被自动扫描——请假定每条路由都会被调用,以任意顺序、用任意输入。066代码的供应链你的代码只占生产环境运行内容的少数——大部分风险在你引入的包和构建它们的工具里。067加密:什么时候、在哪里、怎么不出错用成熟的库和它们的现代默认值,什么都不要自己发明——几乎所有加密失败都是用法上的失败。068云上权限:最重要的规则是最小化大多数严重的云安全事件,都始于一个权限超出所需、而且没有有效期的身份。069隐私设计:少收集保护信息最便宜的方式是不去收集它——而每一个被收集的字段都该有目的、有负责人、有删除日期。070浏览器安全:在响应头里设定的防护很大一部分客户端攻击,靠几个响应头和几项正确的cookie设置就能挡住。071团队安全:大多数入侵从哪里开始即便是安全的系统,也会通过员工的设备、一封钓鱼邮件,或者一个没开双因素的账号被攻破。072安全测试:该采购什么、什么时候采购自动扫描是持续的卫生工作;渗透测试是一次有针对性的行动——两者都需要一个书面目标。073基于模型的系统中的安全模型带来两个新风险:外部内容被当成指令,以及输出未经校验就进到了敏感的地方。074在故障发生之前就做好准备故障期间没有时间去决定谁来决定——一个平静的早晨写下的那张纸,就是一小时和一周之间的差别。

落地的人工智能

从一个模型,到一套能用的系统

16 篇
075怎么选模型——以及为什么它不是第一个决定先用最强的模型验证这个任务能不能做,然后再往下降到更便宜的,直到质量崩掉为止。076把你的知识接到模型上:不讲大词的检索模型不认识你的文档——你需要为每个问题找出相关段落,并把它们附到提示词里。077智能体:什么时候让系统自己行动智能体自己决定要执行哪些操作——而全部的回报和风险,都在你给它的权限里。078提示词:写一份规格说明,不是写咒语好的提示词定义角色、输入、决策规则和输出结构——并且像代码一样对待,纳入版本控制和测试。079评估:怎么知道系统变好了没有固定的评估集,每一次改动都是一种信念——而且一个方面的改进会掩盖另一个方面的退步。080基于模型的系统的成本与延迟成本的大头来自输入的文本,延迟的大头来自输出的文本——所以这两者的解法是不同的。081分类与抽取:回报最高的任务在做聊天之前,先确认问题是不是其实就是「给工单分类」或「从文档里抽字段」——这两个简单任务能立刻带来价值。082幻觉:为什么会发生,什么才真正有用被问到一个它没有答案的问题时,模型会生成一个看起来合理的答案——解法不是要求它别出错,而是给它来源和一条说「不知道」的路。083数据:从哪来,没有的时候怎么办大多数项目里数据是存在的,只是分散、没标注、没清洗——而这正是吃掉大部分时间的那个阶段。084为一个不总是对的系统设计界面好界面会呈现不同程度的确定性、让修正变得容易,并且不会把一个猜测当成事实来展示。085模型使用中的偏见、公平与问责模型反映的是它见过的东西——所以涉及人的决策需要按人群分组检查、需要人在环路里,也需要文档记录。086小模型、本地模型与边缘模型当量大、延迟关键,或者数据不能外传时——跑在你这边的小模型胜过云上的大模型。087流程自动化:模型在哪里加分,在哪里多余如果流程是固定而清晰的,就写代码;模型的价值恰恰在于那些需要对非结构化文本做判断的地方。088实验:怎么知道这次改动确实改善了什么在同一时间、同一批流量上比较两个版本——任何「前后对比」度量的都不只是你,还有整个世界。089基于模型的系统的架构模型是一个普通系统里的一个组件——而围绕它的那个系统,才是大部分工作和大部分风险所在。090长期运营一个AI系统模型会被替换、文档会变、用户会学会用不同的方式提问——一个半年没人碰过的系统,几乎总是变差了。

工程习惯、质量与团队

让代码成为专业工作的那些东西

10 篇
091测试:多少、哪些、哪些不值得把大部分投入放在跑你自己逻辑的测试上,少量放在集成测试上,极少量放在端到端测试上。092能改进而不是拖慢进度的代码评审好的评审是小的、快的,聚焦于正确性和可维护性——而不是那些本该由自动工具强制的风格偏好。093使用版本管理:分支、合并与历史短分支和频繁合并能避免大部分版本上的痛苦——而一份可读的历史,在你排查故障的那天会值回全部代价。094人们真的会读的文档记录那些从代码里推不出来的东西:决策、边界,以及怎么上手——其余的一切都会过期并误导人。095用一周而不是一个月完成新开发者的上手衡量标准是「到第一次上线改动要多久」——而大部分延迟来自权限和本地环境,而不是理解代码。096命名、结构,以及可以再回来的代码代码被读的次数远多于被写的次数——所以一个准确的名字和一个可预测的结构,比任何巧妙都值钱。097选技术,两年后不后悔按团队、成熟度和社区来选——而无聊且熟悉的东西,几乎总是胜过新鲜又令人兴奋的东西。098没有官僚主义的质量:怎么不弄坏正在正常运转的东西回归靠三件事来防:自动化测试、小而频繁的发布,以及快速回滚的能力。099和供应商及外包开发团队合作事先用书面形式定义交付物、所有权和访问权——并且要求持续交付,而不是最后一次性大交付。100真正决定一个项目成败的是什么不是技术,也不是团队规模——而是目标的清晰度、短的反馈周期,以及一个负责拍板的人。

关于 Boomalaya

「Boom」是想法撞上现实的那一刻,而之后扩散出去的涟漪才是真正的工作。Boomalaya 想讲清楚这条路:不是每月都在换的工具清单,而是即使底层技术变了依然成立的决策顺序。

我们的应用

Boomalaya 同时也是一家 iOS 工作室。这三款应用遵循的正是文章里讲的那些原则:在设备上处理、没有服务器、不需要账号、不做追踪。

MonoBand: AI Stem Splitter

把你自己的任何一首歌,变成练习和混音的工作室——全部在设备上完成,不需要联网,也没有订阅。

  • 在设备上运行的 AI 模型做 6 轨分离:人声、鼓、贝斯、吉他、钢琴等
  • 练习功能:变调、不改变音高地改变速度、A→B 循环,以及和弦、速度与调性的自动识别
  • CarPlay:一键卡拉OK,开车时可静音或独奏任意乐器
  • 没有服务器、没有分析、不需要账号——歌曲和录音都不会离开你的设备

免费 · 音乐 · iPhone、iPad、Mac · 8 种语言

MonoBand: AI Stem Splitter — Produce music beats like prosMonoBand: AI Stem Splitter — On device. Offline. Yours.MonoBand: AI Stem Splitter — Isolate any part and play it yourselfMonoBand: AI Stem Splitter — Sing or play and record on topMonoBand: AI Stem Splitter — Drill any section till you nail itMonoBand: AI Stem Splitter — Playlists that play back-to-backMonoBand: AI Stem Splitter — On-device AI, no internetMonoBand: AI Stem Splitter — Record vocals over the song

Block AI

一款经典的方块益智游戏,关卡进程由 AI 生成——本地运行,没有广告,也不需要账号。

  • 冒险模式,100 个由 AI 生成的关卡
  • 会根据你的打法调整的自适应难度
  • 分析习惯、失误与强项的 AI 教练
  • 四种玩法:每日谜题、无尽模式、限时冲刺和冒险

免费 · 益智 · iPhone · Game Center 排行榜

Block AI — Block AI home screen and game modesBlock AI — Block puzzle gameplayBlock AI — Adventure stage previewBlock AI — AI building the Adventure stagesBlock AI — AI Coach analysisBlock AI — Play statisticsBlock AI — Stage clearedBlock AI — How to play

AIKeyMoji: AI Sticker Keyboard

一款把任意照片或视频变成个人贴纸的键盘,AI 就在设备本地运行。

  • 一张照片 → AI 抠掉背景 → 几秒钟得到一张干净的贴纸
  • 从视频里取一帧,或者做成三秒的动态贴纸
  • 内置 728 张动态贴纸,分十个分类,支持实时搜索
  • 在任何能打字的应用里都能用;没有服务器、不做追踪、不需要账号

免费 · 图形与设计 · iPhone、iPad · 英语与希伯来语

AIKeyMoji: AI Sticker Keyboard — Stickers from anythingAIKeyMoji: AI Sticker Keyboard — Send from any chat, one tapAIKeyMoji: AI Sticker Keyboard — Five ways to make a stickerAIKeyMoji: AI Sticker Keyboard — Video to animated stickerAIKeyMoji: AI Sticker Keyboard — 728 stickers, organizedAIKeyMoji: AI Sticker Keyboard — Your photos stay private

Boomalaya · App Store

联系我们

有问题、有勘误,或者想建议一个选题——欢迎写信给我们。

Support@boomalaya.com