跨领域的主题

同一个问题会在不同领域里反复出现。这些标签横向贯穿八个领域。

规划与决策

定义问题、排优先级,以及决定不做什么

16 篇
也出现在: 产品基础 · 移动应用 · 安全 · 落地的人工智能 · 工程习惯、质量与团队
001把一个想法,变成真正能解决的问题在挑技术之前,先写清楚谁被这个问题困住、他今天用什么办法凑合、以及你凭什么判断问题已经解决。002能证明一件事的最小原型原型是用来回答一个危险问题的,不是用来展示产品的——所以它可以难看、可以靠人工、可以不完整。003写一份开发者真会看的需求文档好的需求文档写的是行为和验收条件,不是设计稿;篇幅以页计,不是以几十页计。004决定不做什么能说「不」,才是一个已经上线的产品和一个永远在开发中的产品之间的区别。005要多久:不带幻想的估算好的估算是一个带着可见假设的区间,随着认识增加而更新——而不是一次性说出来的一个数字。006自建、购买还是接入只自建让你与众不同的部分;其余的——买、接入,或者干脆放弃。007三天内做完用户调研和真正在做这件事的人做五次半小时的对话,比一千份问卷回收得到的东西多。009技术债:什么时候借,什么时候还技术债是一种正当的融资工具——前提是有意识地借、记录在案,并且有一个谈还款的日期。010第一版:哪些必须有第一版要把一件事从头到尾做完,而且要做到你能依赖它。011所有人都在喊的时候怎么排优先级排优先级不是一份有序清单,而是一条所有人事先都知道的决策规则——否则就是谁嗓门大谁说了算。012从需求文档到可以着手的任务好任务以一个能运行、能验证的结果收尾,耗时一到两天——不是一周,也不是一小时。021原生、跨平台还是移动网站这个选择由「你到底需要设备的多少能力」和团队规模决定——而不是今年流行哪种技术。061一小时做出威胁模型画出你有什么、谁可能想要它、它在哪里跨越边界——你就得到了一份真实的优先级清单,而不是一种直觉。075怎么选模型——以及为什么它不是第一个决定先用最强的模型验证这个任务能不能做,然后再往下降到更便宜的,直到质量崩掉为止。097选技术,两年后不后悔按团队、成熟度和社区来选——而无聊且熟悉的东西,几乎总是胜过新鲜又令人兴奋的东西。100真正决定一个项目成败的是什么不是技术,也不是团队规模——而是目标的清晰度、短的反馈周期,以及一个负责拍板的人。

度量

判断某件事是否真的变好了

12 篇
也出现在: 产品基础 · 移动应用 · 基础设施、云与 DevOps · 落地的人工智能 · 工程习惯、质量与团队
001把一个想法,变成真正能解决的问题在挑技术之前,先写清楚谁被这个问题困住、他今天用什么办法凑合、以及你凭什么判断问题已经解决。002能证明一件事的最小原型原型是用来回答一个危险问题的,不是用来展示产品的——所以它可以难看、可以靠人工、可以不完整。008不说谎的成功指标选一个和用户实际获得的价值挂钩的指标,旁边再放一个防止你弄坏别的东西的指标。025移动端性能:内存、电量和「快」的感觉在应用里,感觉由启动时间和滚动流畅度决定——而这两者都会被图片和跑在主线程上的工作破坏。029应用的崩溃与错误监控没有自动崩溃上报,你就只能从商店评价里得知问题——也就是太晚了。052监控与可观测性:在客户之前知道有东西坏了三类信号——指标、日志和链路追踪——以及它们必须回答的一个问题:现在发生了什么,为什么。054云成本:钱去哪了账单的大部分来自三个地方:没人需要却在运行的资源、没有策略而不断增长的存储,以及跨区域流量。079评估:怎么知道系统变好了没有固定的评估集,每一次改动都是一种信念——而且一个方面的改进会掩盖另一个方面的退步。081分类与抽取:回报最高的任务在做聊天之前,先确认问题是不是其实就是「给工单分类」或「从文档里抽字段」——这两个简单任务能立刻带来价值。082幻觉:为什么会发生,什么才真正有用被问到一个它没有答案的问题时,模型会生成一个看起来合理的答案——解法不是要求它别出错,而是给它来源和一条说「不知道」的路。088实验:怎么知道这次改动确实改善了什么在同一时间、同一批流量上比较两个版本——任何「前后对比」度量的都不只是你,还有整个世界。100真正决定一个项目成败的是什么不是技术,也不是团队规模——而是目标的清晰度、短的反馈周期,以及一个负责拍板的人。

用户

在使用系统的那个人那一侧发生了什么

11 篇
也出现在: 产品基础 · 网页与前端 · 移动应用 · 安全 · 落地的人工智能
007三天内做完用户调研和真正在做这件事的人做五次半小时的对话,比一千份问卷回收得到的东西多。014浏览器性能:到底是什么让站点变慢大多数慢站点的元凶不是代码,而是重量——大图片、字体和第三方脚本。015无障碍:不能跳过的最低限度无障碍的大部分来自写出正确的HTML,而大部分失败来自把标准元素换成了「画得像它」的东西。016不痛苦的响应式设计从小屏开始,让内容决定在哪里断,不要照着设备清单去设计。017现代站点的技术SEO在关键词之前,先确保搜索引擎能到达这个页面、能读懂它、能明白它是什么。019表单:用户流失最严重的地方好表单问得少、在正确的时机校验、在出错的地方解释错误,并且不会清掉已经输入的内容。020希伯来语与从右到左:什么会坏,怎么修大多数从右到左的bug,来自用了left和right而不是start和end——以及混排文本在一行里打架。023不流失用户的推送通知正当的通知,是用户错过了会后悔的那种——其余的一切都会导致关闭权限,而那几乎不可逆。028移动端体验:和大屏有什么不同在手机上,用户是站着的、赶时间的、单手拿着的,有时还在阳光下——而这会改变每一个决定。063密码、双因素与会话用专门的慢哈希算法存密码、启用双因素,并让用户能从所有设备登出。084为一个不总是对的系统设计界面好界面会呈现不同程度的确定性、让修正变得容易,并且不会把一个猜测当成事实来展示。

架构

组件如何划分、如何彼此通信

16 篇
也出现在: 网页与前端 · 移动应用 · 后端、接口与数据 · 基础设施、云与 DevOps · 落地的人工智能 · 工程习惯、质量与团队
013在静态站点、服务端渲染和浏览器应用之间选择内容越固定,架构就该越简单——你加的每一层动态性,从此每天都要为它付费。018Web应用中的状态管理大多数被称作「状态」的东西,其实是放错了地方的服务端数据——把它们分开,一半的复杂度就消失了。021原生、跨平台还是移动网站这个选择由「你到底需要设备的多少能力」和团队规模决定——而不是今年流行哪种技术。022离线工作:一个在电梯里不会坏掉的应用按照「没有网络」这个前提去设计应用,你会顺便得到一个在有网时也感觉很快的应用。034数据库:选了不后悔大多数情况下关系型数据库是正确答案,任何其他选择都需要一个能用一句话说清的理由。036队列与后台任务任何超过一秒、并且不是返回给用户所必需的操作,都属于队列,而不属于请求。037缓存:加速但不提供过期数据在加缓存之前,先决定一份过期的数据在多长时间内仍然可以接受——这是唯一真正重要的问题。039一个服务还是多个:什么时候拆从一个组织良好的系统开始。只有出现真实痛点时才拆——团队互相阻塞,或者某个组件需要完全不同的规模。040设计一个能用很多年的数据模型好模型表达的是业务现实,而不是别人最初让你做的那个页面。042文件与对象存储文件既不属于数据库,也不属于服务器磁盘——它们属于带签名地址的对象存储。055扩展:横向、纵向,以及你真正需要的在扩展之前,先量清楚瓶颈在哪——大多数系统里瓶颈是数据库或某一条查询,而不是服务器数量。076把你的知识接到模型上:不讲大词的检索模型不认识你的文档——你需要为每个问题找出相关段落,并把它们附到提示词里。077智能体:什么时候让系统自己行动智能体自己决定要执行哪些操作——而全部的回报和风险,都在你给它的权限里。087流程自动化:模型在哪里加分,在哪里多余如果流程是固定而清晰的,就写代码;模型的价值恰恰在于那些需要对非结构化文本做判断的地方。089基于模型的系统的架构模型是一个普通系统里的一个组件——而围绕它的那个系统,才是大部分工作和大部分风险所在。096命名、结构,以及可以再回来的代码代码被读的次数远多于被写的次数——所以一个准确的名字和一个可预测的结构,比任何巧妙都值钱。

数据

信息的结构、存储与完整性

13 篇
也出现在: 网页与前端 · 移动应用 · 后端、接口与数据 · 基础设施、云与 DevOps · 安全 · 落地的人工智能
018Web应用中的状态管理大多数被称作「状态」的东西,其实是放错了地方的服务端数据——把它们分开,一半的复杂度就消失了。022离线工作:一个在电梯里不会坏掉的应用按照「没有网络」这个前提去设计应用,你会顺便得到一个在有网时也感觉很快的应用。026设备上的本地存储与敏感数据假定设备会丢失或被攻破:本地存的东西应当最少、加密,并且可以远程吊销。034数据库:选了不后悔大多数情况下关系型数据库是正确答案,任何其他选择都需要一个能用一句话说清的理由。035不停机的表结构迁移用向后兼容的步骤改表结构:先加、再填、再切换,最后才删除。040设计一个能用很多年的数据模型好模型表达的是业务现实,而不是别人最初让你做的那个页面。043搜索:数据库什么时候不够用了带相关性排序、错别字容忍和多重筛选的全文搜索是另一个世界——而且不是每个系统都需要它。046和钱打交道:支付与扣款永远不要存卡信息、永远不要相信从客户端传来的金额,并且永远保留一份不可变的事件日志。053备份与恢复:没被测试过的就等于不存在备份不是策略;策略是「你能丢多少数据、能停多久」——以及你确实做到了的证据。069隐私设计:少收集保护信息最便宜的方式是不去收集它——而每一个被收集的字段都该有目的、有负责人、有删除日期。076把你的知识接到模型上:不讲大词的检索模型不认识你的文档——你需要为每个问题找出相关段落,并把它们附到提示词里。081分类与抽取:回报最高的任务在做聊天之前,先确认问题是不是其实就是「给工单分类」或「从文档里抽字段」——这两个简单任务能立刻带来价值。083数据:从哪来,没有的时候怎么办大多数项目里数据是存在的,只是分散、没标注、没清洗——而这正是吃掉大部分时间的那个阶段。

性能

速度、负载,以及用户的感受

11 篇
也出现在: 网页与前端 · 移动应用 · 后端、接口与数据 · 基础设施、云与 DevOps · 落地的人工智能
013在静态站点、服务端渲染和浏览器应用之间选择内容越固定,架构就该越简单——你加的每一层动态性,从此每天都要为它付费。014浏览器性能:到底是什么让站点变慢大多数慢站点的元凶不是代码,而是重量——大图片、字体和第三方脚本。017现代站点的技术SEO在关键词之前,先确保搜索引擎能到达这个页面、能读懂它、能明白它是什么。025移动端性能:内存、电量和「快」的感觉在应用里,感觉由启动时间和滚动流畅度决定——而这两者都会被图片和跑在主线程上的工作破坏。031来自设备的文件、媒体与上传相机拍的照片比需要的重几十倍——在它碰到网络之前,先在设备上处理掉。037缓存:加速但不提供过期数据在加缓存之前,先决定一份过期的数据在多长时间内仍然可以接受——这是唯一真正重要的问题。043搜索:数据库什么时候不够用了带相关性排序、错别字容忍和多重筛选的全文搜索是另一个世界——而且不是每个系统都需要它。045负载:限流与自我保护健康的系统会及早而明确地拒绝,而不是在它扛不住的负载下慢慢垮掉。055扩展:横向、纵向,以及你真正需要的在扩展之前,先量清楚瓶颈在哪——大多数系统里瓶颈是数据库或某一条查询,而不是服务器数量。080基于模型的系统的成本与延迟成本的大头来自输入的文本,延迟的大头来自输出的文本——所以这两者的解法是不同的。086小模型、本地模型与边缘模型当量大、延迟关键,或者数据不能外传时——跑在你这边的小模型胜过云上的大模型。

可靠性

有东西坏掉时会发生什么

13 篇
也出现在: 产品基础 · 移动应用 · 后端、接口与数据 · 基础设施、云与 DevOps · 落地的人工智能
010第一版:哪些必须有第一版要把一件事从头到尾做完,而且要做到你能依赖它。022离线工作:一个在电梯里不会坏掉的应用按照「没有网络」这个前提去设计应用,你会顺便得到一个在有网时也感觉很快的应用。036队列与后台任务任何超过一秒、并且不是返回给用户所必需的操作,都属于队列,而不属于请求。041调用外部服务时的可靠性每一次外发调用迟早都会失败——唯一的问题是,你有没有为「那时会怎样」做过规划。044外发邮件、消息与Webhook外发消息是一个公开接口:它需要队列、重试,以及「发了什么给谁」的记录。045负载:限流与自我保护健康的系统会及早而明确地拒绝,而不是在它扛不住的负载下慢慢垮掉。051部署策略:蓝绿、金丝雀与渐进式好的部署是用「能多快回滚」来衡量的,而不是用「上线有多快」。053备份与恢复:没被测试过的就等于不存在备份不是策略;策略是「你能丢多少数据、能停多久」——以及你确实做到了的证据。056网络与证书:域名、DNS和HTTPS大多数「网站打不开」的故障是域名、过期证书或者路由——而不是代码。058不找罪魁祸首的故障复盘每次故障之后,花一小时写一份聚焦系统而非个人的复盘是值得的——否则同样的故障会再来一次。059高可用与灾难恢复先决定一小时的宕机对你值多少钱,然后再决定买多少冗余。082幻觉:为什么会发生,什么才真正有用被问到一个它没有答案的问题时,模型会生成一个看起来合理的答案——解法不是要求它别出错,而是给它来源和一条说「不知道」的路。089基于模型的系统的架构模型是一个普通系统里的一个组件——而围绕它的那个系统,才是大部分工作和大部分风险所在。

安全

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

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

隐私

少收集,并保护已经收集的

5 篇
也出现在: 移动应用 · 基础设施、云与 DevOps · 安全 · 落地的人工智能

成本

它花多少钱,以及为什么会涨

7 篇
也出现在: 产品基础 · 移动应用 · 后端、接口与数据 · 基础设施、云与 DevOps · 落地的人工智能

测试

在问题上线之前抓住它们

6 篇
也出现在: 基础设施、云与 DevOps · 安全 · 落地的人工智能 · 工程习惯、质量与团队

部署

代码怎么上线,以及怎么回滚

8 篇
也出现在: 移动应用 · 后端、接口与数据 · 基础设施、云与 DevOps · 工程习惯、质量与团队

监控

知道现在正在发生什么,以及为什么

4 篇
也出现在: 移动应用 · 基础设施、云与 DevOps · 落地的人工智能

文档

那些从代码里推不出来的东西

6 篇
也出现在: 产品基础 · 后端、接口与数据 · 落地的人工智能 · 工程习惯、质量与团队

流程与团队

如何协作而不互相阻塞

22 篇
也出现在: 产品基础 · 移动应用 · 后端、接口与数据 · 基础设施、云与 DevOps · 安全 · 落地的人工智能 · 工程习惯、质量与团队
005要多久:不带幻想的估算好的估算是一个带着可见假设的区间,随着认识增加而更新——而不是一次性说出来的一个数字。011所有人都在喊的时候怎么排优先级排优先级不是一份有序清单,而是一条所有人事先都知道的决策规则——否则就是谁嗓门大谁说了算。012从需求文档到可以着手的任务好任务以一个能运行、能验证的结果收尾,耗时一到两天——不是一周,也不是一小时。024第一次就通过商店审核大多数驳回来自元数据和权限,而不是代码——而且用一小时的准备就能避免。039一个服务还是多个:什么时候拆从一个组织良好的系统开始。只有出现真实痛点时才拆——团队互相阻塞,或者某个组件需要完全不同的规模。047环境:开发、测试与生产三个环境从同一份定义构建,只在配置和数据上不同——任何其他差异都是一个等着被发现的bug。049基础设施即代码如果你没法从版本控制里的一个文件重建出环境,那你拥有的不是基础设施,而是一部点击历史。050自动化的构建与部署流水线每次合并都应触发同一串动作:构建、测试、安全检查、部署——中间不能有任何一步手工操作。057管理密钥与凭据代码仓库里的密钥就是已经泄漏的密钥——即便仓库是私有的,即便你之后删掉了它。058不找罪魁祸首的故障复盘每次故障之后,花一小时写一份聚焦系统而非个人的复盘是值得的——否则同样的故障会再来一次。071团队安全:大多数入侵从哪里开始即便是安全的系统,也会通过员工的设备、一封钓鱼邮件,或者一个没开双因素的账号被攻破。074在故障发生之前就做好准备故障期间没有时间去决定谁来决定——一个平静的早晨写下的那张纸,就是一小时和一周之间的差别。078提示词:写一份规格说明,不是写咒语好的提示词定义角色、输入、决策规则和输出结构——并且像代码一样对待,纳入版本控制和测试。085模型使用中的偏见、公平与问责模型反映的是它见过的东西——所以涉及人的决策需要按人群分组检查、需要人在环路里,也需要文档记录。087流程自动化:模型在哪里加分,在哪里多余如果流程是固定而清晰的,就写代码;模型的价值恰恰在于那些需要对非结构化文本做判断的地方。092能改进而不是拖慢进度的代码评审好的评审是小的、快的,聚焦于正确性和可维护性——而不是那些本该由自动工具强制的风格偏好。093使用版本管理:分支、合并与历史短分支和频繁合并能避免大部分版本上的痛苦——而一份可读的历史,在你排查故障的那天会值回全部代价。094人们真的会读的文档记录那些从代码里推不出来的东西:决策、边界,以及怎么上手——其余的一切都会过期并误导人。095用一周而不是一个月完成新开发者的上手衡量标准是「到第一次上线改动要多久」——而大部分延迟来自权限和本地环境,而不是理解代码。098没有官僚主义的质量:怎么不弄坏正在正常运转的东西回归靠三件事来防:自动化测试、小而频繁的发布,以及快速回滚的能力。099和供应商及外包开发团队合作事先用书面形式定义交付物、所有权和访问权——并且要求持续交付,而不是最后一次性大交付。100真正决定一个项目成败的是什么不是技术,也不是团队规模——而是目标的清晰度、短的反馈周期,以及一个负责拍板的人。

供应商与外部依赖

当你依赖别人时会发生什么

6 篇
也出现在: 产品基础 · 移动应用 · 后端、接口与数据 · 安全 · 工程习惯、质量与团队

兼容与变更

在不破坏现有使用者的前提下修改

5 篇
也出现在: 移动应用 · 后端、接口与数据 · 基础设施、云与 DevOps · 工程习惯、质量与团队

长期维护

项目结束之后,系统会怎么样

5 篇
也出现在: 产品基础 · 移动应用 · 安全 · 落地的人工智能 · 工程习惯、质量与团队

实验

逐步放量并比较不同版本

3 篇
也出现在: 产品基础 · 移动应用 · 落地的人工智能

接口

你交给调用方的那份契约

4 篇
也出现在: 后端、接口与数据 · 安全