文章

在一个页面浏览所有文章。查找关于人工智能、编程、安全、基础设施与 Web 开发的教程、深度解读、指南与更新。

程序化 SEO:什么时候有效,什么时候是垃圾内容

程序化 SEO 指的是用一套模板加一份数据集批量生成页面:每个城市一页、每个产品组合一页、每种参数组合一页。如果用的是真实的数据集,它是这个行业里效率最高的做法之一。如果用的是同义词词典和洗稿工具,它就正是搜索引擎花了二十年学着识别的东西。 区别不在技术。两条路都会大批量地产出模板页面。区别在于每一页是否包含只有这一页才能回答的东西,而这是关于你手里数据的问题,不是关于你内容流程的问题。换句话说,这个问题的答案在数据库里,不在编辑部里。 区分两者的检验方法: 把模板拿掉,看看一页上还剩下什么。如果剩下的是真正不同的事实、不同的价格、不同的数据集、不同的计算,这一页就有存在的理由。如果剩下的是同一段文字换了个地名,...

真正会被读的技术文档

技术文档的失败方式非常具体,也非常好预测。有人在两周清闲的时间里写下一大堆,接着系统变了,没有人回头更新,一年之内那份文档就开始信心十足地讲着错误的内容。到了那个时候,它比什么都没有还要糟,因为相信它的读者会依据早已不成立的信息去动手。 常见的反应是号召大家多写一些,而这只会让同样的失败来得更快。有用的反应是少写,并且认真挑选写什么,因为真正的瓶颈不是写作的工夫,而是维护的工夫。文档从写完那一刻起,就开始被现实甩在后面。 判断一份文档该不该存在,唯一经得起时间的检验是: 当它变错的时候,会不会有人察觉?部署指南天天有人用,错误立刻就会浮出来。一份二十页的子系统说明只会被读一次,它的错误要等到十八个月后,有人照着它动手时才浮出来。没有...

让新人第一周就能交付的开发者入职流程

开发者入职通常是按入职培训花了几天来衡量的,而那是问题的另一头。真正重要的数字是另一个:一个新来的工程师要过多久,才能改动某个东西,并且有把握自己没有弄坏别的地方。在大多数团队里,这个数字是以月计的,而不是以天计的。 延迟很少出在人身上。它出在系统里有多少部分只存在于别人的脑子里,以及前两周里有多大一部分时间,是靠一次次打断别人,一点一点把这些东西挖出来的。 唯一值得追踪的指标:从入职到他们的第一次改动进入生产环境,需要多久。 不是第一次提交,提交可以只是改一个错别字,而是一次有意义并且真正上线的改动。如果这个时间超过一周,障碍几乎从来都不是能力。而是一份最近没有人从零走过一遍的环境搭建流程,或者一份没有人带路就找不到入口的代码库。...

真正有意义的可用性 SLA

可用性 SLA 看上去像一句承诺,实际运作起来却更像一份退款政策。供应商很清楚这一点。客户往往并不清楚,于是在签署服务级别协议时以为自己买到了可用性,而真正买到的,只是万一没拿到时的一点折扣。 这不一定是笔糟糕的交易。它只是与大多数人以为自己在签的那笔交易不同,而这个差别恰恰在系统宕机、有人追问合同究竟怎么写的那一刻显现出来。 三个九听上去接近完美,却允许每月 43 分钟的停机。 四个九允许四分钟。如果你的业务能吸收工作日下午 43 分钟的中断,99.9% 就足够了,不必为更高的数字付费。如果吸收不了,再多的九也帮不上忙,因为协议给你的是一笔积分,而不是阻止这次中断。 可用性 SLA 用分钟兑现的承诺百分比把一个非常大的区间压缩成看...

软件源代码托管:谁真正需要它

软件源代码托管,也就是把源代码交给中立的第三方保管(英文称为 software escrow),回应的是一种完全合理的担忧:为你构建并运维关键系统的供应商倒闭了,而你手上留下的,是一个自己离不开、却又维护不了的东西。托管协议把源代码存放在第三方那里,一旦真的发生这种情况,第三方就把它交付给你。 这种担忧是站得住脚的。问题在于这项工具经常被误解,而两者之间的落差催生出一类协议:每年都在花钱,真到需要它的那一天却帮不上忙。 签字之前应该先问的那个不舒服的问题: 如果明天就把代码交到你手上,你这边真的有人跑得起来吗?一份没有构建说明、没有基础设施定义、没有它所调用的第三方服务凭据、也没有数据的源代码托管,不是业务连续性方案。那只是一个文件...

固定价格合同还是按工时计费

在固定价格合同和按工时计费之间做选择,通常被描述成一次关于风险的选择。这个说法本身没错,但紧接着就被处理错了,因为双方都默认风险会消失,而不是只从一方转到另一方身上。 风险不会消失。在固定价格的安排里,供应商承担估算出错的风险,并把这份风险提前算进报出的数字里。在按工时计费的安排里,承担风险的是客户。真正的问题从来不是哪一种方式能消除不确定性,而是哪一方更有条件去管理它,以及为转移风险付出的代价值不值得。 能预判哪种方式管用的检验: 你能不能把“完成”写下来,写到两个人对是否已经达到这个状态能给出一致判断的细致程度?如果能,固定价格是你可以用的选项,而且多半是合理的。如果写不出来,固定价格合同并不会消除模糊,它只是把将来每一次分歧从...

小型软件团队的灾难恢复

在小团队里,灾难恢复通常只剩下一份从来没人打开过的文档里的一行字:备份已经开启。这句话本身没错,却算不上任何问题的答案,因为它既没有说明真正出事时找回来的数据会有多旧,也没有说明恢复一次要花多长时间,更没有说明到今天为止究竟有没有人完整地做过一次恢复。 拥有备份和真的能恢复之间存在一段明显的距离,大多数故障正是在这段距离里升级成事故。一份存在、内容也够新、却从来没有被还原过的备份,本质上仍然只是一个假设;而你第一次去验证这个假设的时刻,恰好是发现它其实是错的最糟糕的时刻。 两个数字能把意见变成计划。 你能承受丢多少数据,又能承受停多久?这就是你的恢复点目标和恢复时间目标。只要业务一侧没有人把这两个数字说出口,关于备份频率的一切技术争...

内容修剪:删掉页面为什么反而带来流量

内容修剪是搜索优化里最违反直觉的一件事,因为所有本能都在说,页面越多流量就该越多。发布内容让人感觉是在积累资产。删除内容让人感觉是在把别人花钱买来的成果丢进垃圾桶。于是删除总被一再推迟,最后只剩下一堆越堆越高的页面。 让删除真正生效的机制,是你自己的页面之间在互相竞争。当你有两个页面瞄准同一个搜索意图时,本来会集中在一个页面上的信号被劈成两半,而必须在两者之间做选择的检索系统,最后甚至可能一个都不选。解决办法不是把两个都做得更好,而是不要再同时拥有两个。 在删掉任何东西之前,先看清每个页面各自在做什么。 一个没有点击的页面,可能仍然承接着一条传递权威的外链,也可能每月只有一位访客,却把这位访客变成了比网站其余部分加起来还值钱的询盘。...

API 版本管理:何时该破坏,以及如何不破坏

关于 API 版本管理的争论,几乎总是从错误的一端开始:版本号该放在哪里。其实这是整个话题里后果最轻的一个决定。真正要紧的是,究竟哪些变更才需要一个新版本,而大多数团队恰恰在这里判断失误,而且是往掉以轻心的方向失误。他们发布了自认为纯属新增的东西,然后某个客户端就坏了。 有用的思维模型是:你的 API 是一份承诺,规定了调用方可以依赖什么。如果一次变更让一个讲道理的调用方原本依赖的东西失效了,那它就是破坏性的。而调用方依赖的东西,远远多于你的文档明确允许他们依赖的范围。 让所有人都栽跟头的那种变更: 往响应里加一个字段。它只是新增,按理说不可能弄坏一个写得规范的客户端,可它偏偏经常弄坏真实的客户端,因为其中有些客户端会严格校验响应,...

软件 RFP 怎么写:拿到能互相比较的报价

软件 RFP,也就是需求建议书,本来的作用是让不同的供应商变得可以互相比较。可现实中大多数文件恰好起了反作用:它们把解决方案写得足够细,细到把答案的空间捆死,却偏偏漏掉了任何人报价时都需要的那些信息。结果就是五份报价,彼此相差一个数量级,形式上每一份都回应了要求,但没有任何两份在测量同一件事。 常见的解释是供应商在打太极。偶尔确实如此。但更常见的情况是,文件要了一个从它自身内容里根本推不出来的数字,于是每家供应商都用各自不同的假设去填补空白。假设不同,价格自然不同,这里并不存在诚不诚实的问题。 判断你的 RFP 是否有效的检验方法: 两家不同的供应商读完之后,能不能得出实质上相同的范围?如果文件里只写了“用户管理”,没有说明有多少种...