Hacker News 中文摘要

RSS订阅

软件博客写作中的反模式 -- Anti-Patterns in Software Blogging

在软件开发中,人们会收集反模式(anti-patterns),以识别那些导致糟糕结果的常见特征。作者认为对软件博客也值得这样做,于是把自己从新手博客作者身上看到的最常见错误编录成一份清单。

正文

软件开发中,我们收集反模式来识别导致糟糕结果的特征。我觉得对软件博客也这么做会有帮助,所以编录了新手博主最常犯的错误。

绕弯子的开头

软件博客中最常见的错误绝对是绕弯子。我经常读了几段还不知道作者想说什么。

开发者阅读示意图

开发者喜欢具体,写博客开头爱交代背景、历史脉络和脑子里冒出的其他东西。写起来可能爽,读起来未必有趣。

读者角度看,能读的文章海了去了。干嘛读你的?除非有回报,否则不会花20分钟通读。给读者一个继续读的理由。

开发者开始读时,会尽快弄清两件事:

  1. 这文章是写给像我这样的人吗?
  2. 读了有啥好处?

用标题和前三句话回答这两个问题。

好处可以是教新技能、解释概念、展示新视角或来段吐槽。总之得给点东西,人家不会因为你写了就去读。

这是我最近写的一篇直奔主题的文章:

if got, want:写好 Go 测试的简单方法

有个很棒的 Go 测试模式没几个人知道。我30秒就能教会你。

开头简明交代了文章面向 Go 程序员,价值是快速教会新技术。

前言也算绕弯子

有些博主开头吸引人,却用副标题、简介、图片或名人名言把路堵了。这些可以加,但要明白它们都在消耗“激励读者继续读”的额度。读者路上的每样东西都是额外负担,消磨他们有限的注意力。

过多前言堵塞阅读

“读者除了这一件事,其他都知道”

好老师会把新概念和读者熟悉的东西类比。比如解释 Jellyfin,可以说“像 Netflix 的流媒体服务,但开源私密,不监控观看习惯”。难点在于知道读者熟悉什么。

比如这篇想给没听过 Docker 的开发者做介绍,却写:“Docker 很简单,不过是 Linux cgroups 的漂亮前端。你懂 *BSD 的 jails 吗?Docker 就是那个的 Linux 版。”

很多想用 Docker 的人根本不认识 cgroups、jails 或 *BSD,甚至可能不知道 Linux 是啥。

读者知识储备示意图

别假设读者和你知识库一样,尽量减少预设:

Docker 是把应用打包成一致、可复现环境的工具。它让你用可读文本定义环境和依赖,记录需求,多年后也清楚怎么跑。

写时想好目标读者知道啥。想象现实中的朋友或同事,列张他们懂和不懂的术语表,然后重读文章,遇到术语就想想读者懂不懂。

你描述的是我心里想的读者,但我从没试过列清他们知道什么。把你的列表和我草稿里的假设对比,真让我大开眼界。

–Tyler Cipriani,我在编辑他的文章时挑战了他对目标读者的假设

过度依赖链接

你上次读一本书被要求停下去买另一本读完再回来,是什么时候?软件博主常干这种事,只是更隐蔽。

博主常提个读者可能不懂的词,自己懒得解释,丢个链接就觉得完事了。问题没解决,读者不想打断思路去别的站读一整页就为懂一个词。

例:分配 firewall 规则阻止外部流量访问数据库。FreeBSD 手册那章约两万字,链过去就是把海量工作甩给读者。

别靠链接偷懒,给读者能懂文义的最少解释:防火墙是限制主机网络与应用通信的系统。配规则只允许来自应用服务器的请求进数据库,就能提升安全。

尽可以链好资源,但当作添头而非门槛。留住读者。目标读者应能不点任何链接就从头读到尾。

续集注入 bug

如今啥都有续集重制,博客也是。很多开头像:

Part 1 学了五重链表如何百倍提升每日代码量。今天教用 goto 语句实现 scrunkmax(我 Part 1 发明的词,记得吗)。

不得不泼冷水,多数读者没读 Part 1。你以为上一篇文章读者记忆犹新,他们只会觉得“哦,刚开始读就有额外功课?”

可以提旧文,但别一开头就提。链旧文时要总结相关内容,别逼读者回去通读。

比如写从零造的爱好操作系统,确实要多篇。但绝大多数续集文只要多花 3% 精力就能独立成篇。

过度正式

新手博主有种集体错觉,觉得非得板着脸写才显得专业:

Several static analysis tools were utilized by my teammates and myself throughout the duration of this project’s lifetime.

你不是给1988年 IBM 80岁高管写。软件业最不装的白领工作之一。读你文章的很可能穿睡衣拖鞋、端着麦片碗。他们不想听你像法律文件。

就像平时说话那样写。

We tried a few static analyzers on this project.

越来越多人用 AI 写,博客变得 bland 同质。读者渴望有性格的文字。这是 Joel Spolsky 随机一句:

所有高中在 Apple II 上用 BASIC 写 pong 游戏的孩子,上大学修计算机101数据结构,一碰到指针大脑就炸了,接着去学政治,因为法学院似乎更好。

– Joel Spolsky, “The Perils of JavaSchools”

这不是他最好的一句,但抓住了风格:随意、有人情味、不装。像午饭时跟朋友讲故事。Kathy Sierra、Terence Eden、Raymond Chen 也是这风格。他们不装聪明,只做自己,读者就爱看。

在渲染 HTML 基础上栽跟头

软件博文最难是写得吸引人,可那么多人在本该简单的“做个基础网页”上翻车,真让人恼火。

移动端页面溢出

移动端最糟错误是屏幕溢出,读者得左右滚。通常是图片或代码块死守桌面尺寸搞乱布局。

移动端文字溢出体验极差。Firefox 和 Chrome 桌面版都有移动预览模式。发布前用移动预览检查常见渲染问题。

别小看移动读者。据分析,25% 的人用手机读这页。我个人博客是 35%。

难读的字号/字体

选好读的颜色和字体。别再深灰字配浅灰底了。Firefox 和 Chrome 有内置工具标出低对比度文字。

Firefox 无障碍工具识别低对比度文字

懒得找字体,Braille Institute 有免费字体 Atkinson Hyperlegible,连视力差的都舒服。

总结

  • 给读者继续读的有力理由。在标题和前三句内搞定。常见理由:爱听有趣故事、学实用技巧或懂相关概念。
  • 质疑你对读者知未知的假设。想清预期读者懂哪些概念术语,重读文章确保匹配。
  • 读者应能不点链接、不悬停提示从头读到尾。链接供深入探索,是添头非门槛。
  • 避免把文章写成前作续集。假设多数读者没读旧文,总结相关内容而非逼他们回去通读。
  • 丢掉正式感。像平时说话那样写。
  • 在浏览器移动视图测试文章。确保文字不溢出逼人横滑。
  • 用浏览器测试工具找难读的低对比度文字。

评论

社区普遍批评技术博客滥用故事化悬念与蜿蜒引言,主张直切重点并锚定读者已有认知;少数人则强调文风属主观,可接受延迟揭示或外链跳读。

技术写作不应套用故事结构,应当直白重复重点

  • 不少人指出博主爱制造悬念、埋没导语,但技术内容需要开门见山;教育不是讲故事,应先声明结论再展开,甚至“剧透”和重复。(较多人) > 教育不是讲故事,结构应当反过来剧透和重复,像演示那样开头说将说啥、中间说、结尾总结。(@phreack)

最致命的是未将新主题对接读者熟悉概念

  • 有读者认为相比拖沓引言,更严重的错误是文章不回答“这东西对比我已知什么、为何要关心”,导致门槛高;建议先讲没有该工具的痛点再比较。(少数人) > 最有害的错误是没把主题和读者熟悉的东西联系,应说明“相比熟悉的什么、为什么要在意”。(@ram1500natrluvr)

反感优化套路的平庸文章,看重作者个性

  • 部分人宁愿读带个人痕迹的文字,而不是为触达率按固定模板产出的内容,认为后者可由任何人代笔。(少数人) > 我宁愿读略有个性迹象的,而不是又一篇套路化、任何人都写得来的营销优化文。(@rglullis)

写作偏好属主观,延迟揭示和外链亦可接受

  • 个别读者表示不挑剔写法,有人享受不长文章的晚揭转折,或习惯像栈一样跳读外链文章,认为这反显作者知自身局限。(少数人) > 某些反模式是主观的,我读文如栈般跳链接不烦,还喜欢不长的文章晚揭示转折。(@kkapelon)

外链应自带总结,避免读者做家庭作业

  • 有作者反思过度依赖链接不加总结,迫使读者做家庭作业;读者也呼吁技术博客加“跳到配方”直取核心,说明社区厌弃外链森林。(较多人) > 我以前太依赖链接,今后要总结链接内容,免得读者像做家庭作业。(@totallygeeky)

有价值的补充

  • 写作时可依“首句只为让你读第二句”的递进法则保持连贯,缓解读者流失(源自约瑟夫·舒格曼的建议)。
  • 大型语言模型加剧了废话泛滥,例如查询某技术概念时涌现大量永不及重点的长文。
  • “跳到配方”式的直接跳转链接被呼吁引入技术博客,类比美食博客的改良。
  • 需警惕“做一次就扮专家教别人”的撰文姿态,这是常见令人反感点。
  • 社区其实渴望出现新一代类似 Stack Overflow 的实用知识源,侧面反映对当前博客不满。
  • 许多人是好作家但坏编辑,社区需要更多个人故事只是第一段就应先给结论。