用7段程式碼來理解常用的寫作模式

genetalks_大資料發表於2019-04-04

對於開發者來說,“設計模式”這個概念肯定不陌生,它是經過分類的、程式碼設計經驗的總結,能將編寫程式碼進行工程化,從而提升開發效率。 簡而言之,它就是“程式碼模板”。

設計模式 + 程式碼邏輯 => 清晰高效的程式 “寫作模式”這個叫法也借鑑於此,是我針對一些熱門技術文章的寫作方式進行的總結,能幫我們快速地構思出結構清晰的文章。 下面通過7篇熱門技術文章來總結7種寫作模式。

清單式

舉例

《2018年你需要知道的11個JavaScript庫》大綱:

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庫,各個庫之間是並列的,相互之間並沒有直接聯絡,即使調換說明順序也不會對文章造成影響。

模式

程式碼

這種模式結構非常簡單,我們可以直接用陣列的形式來描述它:

[
  sectionA,
  sectionB,
  ...
  sectionX,
]
複製程式碼

小結

把同一類(一般是並列關係)的知識/技能點匯聚起來,分條進行闡述。適用於有一定關聯關係,但邏輯性不強的碎片化的知識點。

對比式

舉例

《為什麼Goroutine能有上百萬個,Java執行緒卻只能有上千個?》大綱:

到底什麼是執行緒?

JVM執行緒使用固定大小的棧
Go執行緒使用動態大小的棧

JVM執行緒上下文切換成本高
Go執行緒切換成本低

結論
複製程式碼

作者用JVM來指代Java語言,針對執行緒佔用記憶體空間以及CPU的使用率兩個方面,對JVM和Go進行了對比。

模式

程式碼

這種模式可以理解為“清單式”的2.0版本,所以我們用物件陣列來描述它:

[
  // 文章主體
  {
    featureA: xxx,
    featureB: xxxx,
w
...
  }, 
  // 參照物件1
  {
    featureA: yyy,
    featureB: yyyy,
    ...
  }, 
  ...
]
複製程式碼

小結

將兩三個類似的概念放在一起討論,在一些特定的維度上將兩者進行對比,最後總結出結論。

疑問式

舉例

《為什麼給你設定重重障礙?講一講Web開發中的跨域》大綱:

一、跨域是個什麼「問題」?
二、為什麼不讓我跨域?
三、JSONP——最常用的繞過辦法
四、為什麼JSONP可以?
五、跨域資源共享(CORS)
六、不讓跨域請求?還可以直接跨網頁
複製程式碼

文章按照 what(什麼是跨域) -> why(為什麼會跨域) -> how(怎麼解決跨域) 的思路來進行的寫作,具有一定的遞進關係。

模式

程式碼

因為這種模式的出現已經有弱邏輯關係了(順序上有依賴,內容上無依賴),用序列的函式來描述它最適合不過了:

const sectionA = what();
const sectionB = why();
const sectionC = how();
複製程式碼

小結

通常由多個相關聯的問題組合而成,邏輯關係層層推進,比如why(為什麼)、what(是什麼)、how(怎麼樣)。

發散式

舉例

《普通程式設計師怎麼理解日誌系統》大綱:

1. Logging 系統的雛型
2. 什麼時候列印日誌是個問題 —— Level
3. 列印日誌到哪裡是還是一個問題 —— Appender
4. 日誌什麼樣也是個問題 —— Formatter
5. 高效地列印日誌是另外一個問題 —— Efficient
6. 總結
複製程式碼

圍繞日誌系統分條陳述,包括日誌級別、內容、儲存、內容、效能。

模式

程式碼

可以用JSON資料型別來描述這種結構

{
  sectionA: xxx,
  sectionB: yyy,
  sectionC: zzz,
  ...
}
複製程式碼

小結

和清單式有些相似,但它是將一個具體的概念拆分成多個部分,然後針對每個部分進行闡述。

流程式

舉例

《如何Docker化任意一個應用?你需要參照這10步》大綱:

選擇基礎映象
安裝必要軟體包
新增自定義檔案
定義容器執行時的使用者許可權
定義暴露的埠
定義入口點(entrypoint)
定義一種配置方式
外部化資料
確保處理好日誌
輪轉日誌和其他僅追加檔案
複製程式碼

作者按照操作流程編寫文章,具有強邏輯。

模式

程式碼

我們還是用函式來描述邏輯。

const sectionA = step1();
const sectionB = step2(sectionA);
const sectionC = step2(sectionB);
...
複製程式碼

說明

這種模式並無太多技巧可言,通常適合實踐型別的文章,按照操作順序來講解。

探索式

舉例

《GO千萬級訊息推送服務》大綱:

技術核心難點
解決技術難點
架構考量
原始碼
複製程式碼

文章結構簡單,邏輯清晰,先提出技術難點,然後給出技術解決方案。

模式

程式碼

這種探索方式和迴圈有些類似:

while(!isBest(solution)) {
  solution = findBetterSolution()
  ...
}
複製程式碼

說明

針對開發中的某個問題一步一步探索最優解決方案。一般的思路: 提出問題==>尋找解決方案==>現有方案的問題==>最終優化方案。

插畫式

舉例

《你閨女也能看懂的插畫版Kubernetes指南》這篇文章比較特別和少見,沒有明確的提綱,但是絲毫不影響閱讀體驗,因為圖文穿插的方式能夠緩解閱讀疲勞,同時更容易理解。

模式

程式碼

如果要用程式碼來表示這種模式的話那麼我們可以把圖片看成註釋來進行描述:

// comment sectionA
sectionA
// comment sectionB
sectionB
...
複製程式碼

小結

圖文結合,生動形象。

總結

總結一下本文提到的7種寫作模式,他們是:

  • 清單式。
  • 對比式。
  • 疑問式。
  • 發散式。
  • 流程式。
  • 探索式。
  • 插畫式。 當然我們在寫較長的文章的時候可以將多種寫作模式結合起來,全文用某種模式,而不同章節內部用其它模式。

如果要把這7種寫作模式抽象成寫作原則的話,那麼可以用兩個詞概括:轉化和聯接

何謂轉化?

  • 把複雜的事情講簡單。
  • 把簡單的道理講深刻。

何謂聯接?

  • 把分散的東西關聯起來。
  • 把關聯的東西拆開對比。

最後給讀者一個思考題來檢驗閱讀效果:本文屬於那種寫作模式,你有沒有看出來呢?


作者資訊:朱德龍,人和未來高階前端工程師。

相關文章