如何寫好一篇技術文章?
技術文章有很多種,我們本文縮小一點范圍,探討的是,如何寫好一篇講原理的技術文章。
首先,我要直言不諱地說出我寫這篇文章的目的:
你看,把一個事情說明白,其實很簡單,只需要把自己的真實想法,如實地用人話的方式寫出來,就可以了,甚至不需要動腦。
說人話
而一篇好的技術文章,最核心的目標就是,把這個技術點講明白,讓讀者聽懂。
所以這就說明了,寫技術文章的核心要素,就是說人話。
要比不說人話的文章,你比不過源碼注釋和官方文檔。
等等。
你覺得現(xiàn)在的官方文檔真的是不說人話么?你錯了,現(xiàn)在的官方文檔一個比一個友好,圖文并茂,就怕你看不懂。

這是 kafka 的官方文檔,不但圖文并茂,還有視頻講解,完全可以無腦按照它給出的步驟去操作。
所以,寫讓人看得懂的人話,應該是大家的共識了,我們就接著往下推理。
內功
要想把一篇文章寫得說人話,該怎么辦呢?
首先,你得真的懂,才能用人話的方式講出來。
所以,大量的學習并且消化這個技術點,甚至把這個技術點所在的外延知識和內涵知識都搞懂,你才能說對這個知識點是真的懂了。
如果你的技術功底不夠,請不要先把目標定在如何寫好一篇技術文章,并且不遺余力地去探索寫文章的技巧性。
你的技術水平,永遠是決定你寫文章的上限,就像內功一樣。
而寫文章的形式技巧,就像招式一樣。
沒有內功,招式再多也無濟于事,有了內功再配合招式,就能天下第一。
而且,修煉自己的內功,永遠不會浪費時間,即使這時你一篇文章都不寫,也能收獲知識不是么。
招式
當然,有了內功后,招式就變得重要起來了。
剛剛說了,有了內功再配合招式,就能天下第一。接下來我們就展開講招式。
1. 層次性
我們來看一段 springboot 的源碼。
public ConfigurableApplicationContext run(String... args) {
...
prepareEnvironment(listeners, applicationArguments);
configureIgnoreBeanInfo(environment);
printBanner(environment);
createApplicationContext();
prepareContext(context, environment, ...);
refreshContext(context);
afterRefresh(context, applicationArguments);
callRunners(context, applicationArguments);
...
}
我做了些簡化,不過不重要,不知道你看完之后是什么感受。
如果沒啥感覺,那我再放出一段代碼,你看看,只是在上面的基礎上加了點而已。
public ConfigurableApplicationContext run(String... args) {
...
prepareEnvironment(listeners, applicationArguments);
configureIgnoreBeanInfo(environment);
printBanner(environment);
Map<String, String> map = new HashMap<>();
if (env == null) {
for(int i = 0; i < size; i++) {
map.put(key + i, waooo);
}
}
createApplicationContext();
prepareContext(context, environment, ...);
refreshContext(context);
afterRefresh(context, applicationArguments);
callRunners(context, applicationArguments);
...
}
這樣一看,上一個代碼的美感就體現(xiàn)出來了吧?
沒錯,好多人寫文章就會犯下面這段代碼的錯誤,就是講述的內容在不同層級上反復橫跳,顯得十分混亂。
比如,你想用一篇文章講網(wǎng)絡,就想解決一個疑惑,就是一個網(wǎng)絡包是怎么一步步從一個節(jié)點,發(fā)送到另一個節(jié)點的。
那么你就一定要把握主干,將集線器、交換機、路由器中最核心的功能講清楚,就好。
此時,將一大堆路由算法展開講解,或者將 NAT 這種基于現(xiàn)有網(wǎng)絡骨架的魔改技術拿出來喧賓奪主,我認為都是不合適的,除非你是想寫一本書。
這就是寫文章招式的第一個要領,就是層次性。
2. 連貫性
接下來講第二個要領,連貫性。
寫文章要前后連貫,不要有邏輯斷層,而且最好是遞進關系。
通過前面你寫的東西,一定要非常順暢地推出后面你要講的東西。
當然,這里還要和剛剛說的層次性做好取舍。
還是舉剛剛網(wǎng)絡的例子,比如你講到路由器,講到路由表。如果你展開講路由算法,則失去了層次性。如果你不講路由表是怎么生成的,直接跳過去了,又失去了連續(xù)性,怎么辦呢?
這里我的做法是,優(yōu)先保層次性,但與此同時和讀者明確說明一下,我們先假設,路由表通過一些路由算法,或者手工配置的方式,變成了這個樣子,然后巴拉巴拉,再說后面的,就續(xù)接上了。
這樣,就既沒有失去層次性,又保證了連續(xù)性,而且還有個好處就是讓讀者抓大放小,先不要管具體的細節(jié),這也是學習計算機知識的一種很好的方式。
這點就見仁見智了,有的人喜歡站在宏觀層面去解釋,有的人喜歡站在微觀層面去解釋,我覺得都無可厚非。
但不可取的是,站在宏觀層面,去寫一篇講原理、追細節(jié)的微觀文章。或者站在微觀層面,去寫一些宏觀層面的抽象概念講解。
舉幾個例子,你想講 IO 模型的本質和細節(jié),你用阻塞非阻塞同步異步這些名詞,用各種燒水壺、取快遞的例子,永遠也講不明白它的本質在哪里。
而這個問題,必須深入到具體函數(shù)的 API,內核態(tài)與用戶態(tài)分別完成了什么事情,阻塞在微觀層面的本質是什么,只有這樣才能講清楚這個問題,所以不要回避它。
除非你寫文章的目標受眾,或者你的寫作初衷,就是讓初學者頭腦里先有個形象的認識,并不想深入到細節(jié)里。
總結
今天就從幾個大方面說了下如何寫好技術文章。
首先,保持說人話的寫作風格,你就成功了一半。這個其實很容易,因為讓我說特別嚴謹?shù)哪欠N官方話,我也說不出來,我相信大多數(shù)人自己寫出的東西,都有說人話的特征。
其次,修煉自己的內功,這個就慢慢來吧,先嘗試不懼怕那些計算機名詞開始,遇到總是想不明白的問題,勇敢地打開源碼,或者用二進制方式去看某些結構的內存和磁盤布局。所有的原理,歸根結底落實到最底層無非就是數(shù)據(jù)結構與算法,而這些資料人人都能獲得,你還怕什么呢?
最后,才到了真正寫文章的時候,那就是招式。
首先保持自己文章的層次性,不要上下亂竄,寫作的時候時時刻刻提醒自己主干脈絡是什么,不要寫著寫著自 high 起來,把一個細節(jié)無限展開使得思維棧溢出了。
然后,保證思維和邏輯的連貫性,寫的時候始終把自己當做一個剛剛接觸這個原理的小白,看看能不能從前一句話,推斷出你寫的后一句話。如果不能,就細化一下,但如果發(fā)現(xiàn)細化之后影響了層次性,就明確說明下,我們先不管細節(jié),假定 xxx,然后再往下寫。
最后,寫這種原理文章,要抓本質,不要再浮于表面,飄在空中,當然這個也取決于你的內功,只有內功到位了,才能看到事物的本質。
你看,都是相輔相成的,最終還是要功夫到家,再配合一些小招式,就可以成大作。
期待大家的大作!共勉!
