用7段代码来理解常用的写作模式

对于开发者来说,“设计模式”这个概念肯定不陌生,它是经过分类的、代码设计经验的总结,能将编写代码进行工程化,从而提升开发效率。
简而言之,它就是“代码模板”。

设计模式 + 代码逻辑 => 清晰高效的程序

“写作模式”这个叫法也借鉴于此,是我针对一些热门技术文章的写作方式进行的总结,能帮我们快速地构思出结构清晰的文章。
下面通过7篇热门技术文章来总结7种写作模式。

清单式

举例

《2018年你需要知道的11个JavaScript库》大纲:

1
2
3
4
5
6
7
8
9
10
11
12
13
1. Lodash & Underscore
2. Ramda
3. MathJS
4. Moment & date-fns
5. Sugar
6. Lazy
7. CollectJS
8. ChanceJS
9. ChartJS
10. Polished
11. Mout
12. Voca
13. Licia

这里列举了13个GitHub上star数量较多的js库,各个库之间是并列的,相互之间并没有直接联系,即使调换说明顺序也不会对文章造成影响。

模式

代码

这种模式结构非常简单,我们可以直接用数组的形式来描述它:

1
2
3
4
5
6
[
sectionA,
sectionB,
...
sectionX,
]

小结

把同一类(一般是并列关系)的知识/技能点汇聚起来,分条进行阐述。适用于有一定关联关系,但逻辑性不强的碎片化的知识点。

对比式

举例

《为什么Goroutine能有上百万个,Java线程却只能有上千个?》大纲:

1
2
3
4
5
6
7
8
9
到底什么是线程?

JVM线程使用固定大小的栈
Go线程使用动态大小的栈

JVM线程上下文切换成本高
Go线程切换成本低

结论

作者用JVM来指代Java语言,针对线程占用内存空间以及CPU的使用率两个方面,对JVM和Go进行了对比。

模式

代码

这种模式可以理解为“清单式”的2.0版本,所以我们用对象数组来描述它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[
// 文章主体
{
featureA: xxx,
featureB: xxxx,
w
...
},
// 参照对象1
{
featureA: yyy,
featureB: yyyy,
...
},
...
]

小结

将两三个类似的概念放在一起讨论,在一些特定的维度上将两者进行对比,最后总结出结论。

疑问式

举例

《为什么给你设置重重障碍?讲一讲Web开发中的跨域》大纲:

1
2
3
4
5
6
一、跨域是个什么「问题」?
二、为什么不让我跨域?
三、JSONP——最常用的绕过办法
四、为什么JSONP可以?
五、跨域资源共享(CORS)
六、不让跨域请求?还可以直接跨网页

文章按照 what(什么是跨域) -> why(为什么会跨域) -> how(怎么解决跨域) 的思路来进行的写作,具有一定的递进关系。

模式

代码

因为这种模式的出现已经有弱逻辑关系了(顺序上有依赖,内容上无依赖),用串行的函数来描述它最适合不过了:

1
2
3
const sectionA = what();
const sectionB = why();
const sectionC = how();

小结

通常由多个相关联的问题组合而成,逻辑关系层层推进,比如why(为什么)、what(是什么)、how(怎么样)。

发散式

举例

《普通程序员怎么理解日志系统》大纲:

1
2
3
4
5
6
1. Logging 系统的雏型
2. 什么时候打印日志是个问题 —— Level
3. 打印日志到哪里是还是一个问题 —— Appender
4. 日志什么样也是个问题 —— Formatter
5. 高效地打印日志是另外一个问题 —— Efficient
6. 总结

围绕日志系统分条陈述,包括日志级别、内容、存储、内容、性能。

模式

代码

可以用JSON数据类型来描述这种结构

1
2
3
4
5
6
{
sectionA: xxx,
sectionB: yyy,
sectionC: zzz,
...
}

小结

和清单式有些相似,但它是将一个具体的概念拆分成多个部分,然后针对每个部分进行阐述。

流程式

举例

《如何Docker化任意一个应用?你需要参照这10步》大纲:

1
2
3
4
5
6
7
8
9
10
选择基础镜像
安装必要软件包
添加自定义文件
定义容器运行时的用户权限
定义暴露的端口
定义入口点(entrypoint)
定义一种配置方式
外部化数据
确保处理好日志
轮转日志和其他仅追加文件

作者按照操作流程编写文章,具有强逻辑。

模式

代码

我们还是用函数来描述逻辑。

1
2
3
4
const sectionA = step1();
const sectionB = step2(sectionA);
const sectionC = step2(sectionB);
...

说明

这种模式并无太多技巧可言,通常适合实践类型的文章,按照操作顺序来讲解。

探索式

举例

《GO千万级消息推送服务》大纲:

1
2
3
4
技术核心难点
解决技术难点
架构考量
源代码

文章结构简单,逻辑清晰,先提出技术难点,然后给出技术解决方案。

模式

代码

这种探索方式和循环有些类似:

1
2
3
4
while(!isBest(solution)) {
solution = findBetterSolution()
...
}

说明

针对开发中的某个问题一步一步探索最优解决方案。一般的思路: 提出问题==>寻找解决方案==>现有方案的问题==>最终优化方案。

插画式

举例

《你闺女也能看懂的插画版Kubernetes指南》这篇文章比较特别和少见,没有明确的提纲,但是丝毫不影响阅读体验,因为图文穿插的方式能够缓解阅读疲劳,同时更容易理解。

模式

代码

如果要用代码来表示这种模式的话那么我们可以把图片看成注释来进行描述:

1
2
3
4
5
// comment sectionA
sectionA
// comment sectionB
sectionB
...

小结

图文结合,生动形象。

总结

总结一下本文提到的7种写作模式,他们是:

  • 清单式。
  • 对比式。
  • 疑问式。
  • 发散式。
  • 流程式。
  • 探索式。
  • 插画式。
    当然我们在写较长的文章的时候可以将多种写作模式结合起来,全文用某种模式,而不同章节内部用其它模式。

如果要把这7种写作模式抽象成写作原则的话,那么可以用两个词概括:转化和联接

何谓转化?

  • 把复杂的事情讲简单。
  • 把简单的道理讲深刻。

何谓联接?

  • 把分散的东西关联起来。
  • 把关联的东西拆开对比。

最后给读者一个思考题来检验阅读效果:本文属于那种写作模式,你有没有看出来呢?


作者信息:朱德龙,人和未来高级前端工程师。