https://m.toutiao.com/is/e6eUn1k/
不記得具體從什么時候開始(反正很多年前的事了)的,不少人都陸續(xù)批評過譚浩強的《C語言程序設(shè)計》,各方面都有扒過。例如,與實踐脫節(jié),很多例子在不同編譯器上運行是錯誤的,代碼風格糟糕等等方面。這里首先給出本人對《C語言程序設(shè)計》的看法:
在國產(chǎn)C語言相關(guān)的教材中,《C語言程序設(shè)計》應(yīng)該算是少有的、還算不錯的教材。
有些人就會想:你是不是收錢了?給《C語言程序設(shè)計》打廣告嗎?錯!《C語言程序設(shè)計》出版了這么多年,還用著我這個無名之輩去宣傳嗎?咱又不是比爾蓋茨或求伯君!我只是想站在一名圖書作者的角度去評價它。當然,我覺得有一點點資格評價它的原因,并不僅僅是因為我寫過書,也略懂寫書,更是因為《C語言程序設(shè)計》曾經(jīng)是我的大學(xué)教材,因為咱不對自己未精讀過的書做評價。
與實踐脫節(jié)?這個批評是錯誤的嗎?嚴格來講并不算,但是《C語言程序設(shè)計》本身就是一本學(xué)校教材,它的定位就是初學(xué)者與理論,用與實踐相關(guān)程度來評價是否有欠妥當?會這樣評價的人可以說根本沒有用心去看這本書。想要實踐方面的書?圖書館里不是有大把嗎?現(xiàn)在花點錢可以買到很多書,英文水平不錯也能直接看國外原版,從網(wǎng)絡(luò)下載電子書甚至連米都省了。為什么同一個班級畢業(yè)的學(xué)生,有些人的編程能力差得離譜,而另外少數(shù)人卻已經(jīng)達到專業(yè)編程員水平?真正的原因不在教材,而在人本身!
有些例程在不同編譯器上會出現(xiàn)不同結(jié)果?這個批評是錯誤的嗎?嚴格來講也并不算,但還是那句話,《C語言程序設(shè)計》主要是講理論的,它只是傳達一種學(xué)習與思考方法,這才是大學(xué)教材應(yīng)該做的事,而《C語言程序設(shè)計》在這方面做得很好。如果在其它編譯器上的運行結(jié)果不盡相同,你能分析出原因嗎?我可以負責地說:認真學(xué)過《C語言程序設(shè)計》的讀者肯定做得到!
代碼風格也被人批評得體無完膚。舉個例子,《C語言程序設(shè)計》中很多例程會直接使用多個“常數(shù)”(也稱為“魔數(shù)”),有人批評應(yīng)該使用#define將它們定義為宏,這樣可讀性更強。這個說法錯了嗎?嚴格來講也不算!但是如果每寫一個僅有幾行的代碼就使用#define定義為宏,我身為一個作者就堅決不贊同這么做,因為代碼少時使用常數(shù)沒什么問題,不然就會顯得冗余(寫書灌水),關(guān)鍵要理解代碼說明什么。
在進行圖書撰寫時,為了方便讀者理解某個知識點,作者會適當編寫一些配套代碼進行說明,你卻關(guān)注這段代碼是不是用#define或函數(shù),這就不是一個真正用心看書的人該做的正事。相似地,有些人批評《C語言程序設(shè)計》中很多例子都是main函數(shù)一路寫到底,還是那句話:關(guān)鍵要理解代碼說明什么。幾十行的代碼還要弄個函數(shù)調(diào)用,費不費勁吶?說不定老譚到時采用了函數(shù),又會有一波人說:這么短的代碼都用函數(shù),明顯是灌水!
我在《顯示器件應(yīng)用分析精粹》中也有一些代碼(是C51,不是標準C,但兩者相通),但為了使代碼更緊湊(不想湊篇幅),比較短的代碼也會直接寫常數(shù),你覺得這種風格不好?某一段代碼如下
我也可以嘗試批判一下自己寫的代碼:delay_us與delay_ms函數(shù)竟然寫成一行,老龍你是不是吃SHI了?翻閱古今中外的編程書,這樣寫代碼的只有你一家,趕緊自殺謝罪得了!蝦米?竟然使用1000這樣的“魔數(shù)”,你是怎么搞的?不會用#define定義一個宏嗎?這么點常識都不知道,還寫書!我是絕對不買的!大家也不要買!水平太渣了!本來我是不想說的,但是……蝦米?變量i是干什么的?不會取一個有意義的名稱嗎?左花括號另起并占據(jù)一行不行嗎?有病呀!蝦米?注釋用雙斜杠,這是什么騷操作?沒看到很多嵌入式編程都用/**/……(以下省略吐槽一萬字)
片面地批評誰不會呀?這是一種最低級的操作,即使是Linux之父寫的代碼,要批判總是可以找到攻擊點。語言只是工具,真正卓越的編程員不會如此片面地批評《C語言程序設(shè)計》,因為TA懂得每本書都會有其定位與局限性,懂得從書本中找到自己真正需要的東西(去“糟粕”留“精華”),懂得從書中提煉出學(xué)習方法,懂得使用思辨的方式看待所發(fā)現(xiàn)的問題(這對于所有行業(yè)中有著卓越成就的人都是適用的),而不是簡單地從邊邊角角去批判,這也是一種不理性不成熟的行為。
同樣,《電容應(yīng)用分析精粹》中的某些內(nèi)容,從某些角度來看也許并不嚴謹,但它只是通過一種使讀者更容易理解的方式向其定位的讀者闡述本不太容易理解的知識點,從這個角度來講,《電容應(yīng)用分析精粹》做得很好!具體來講,在闡述同一個知識點時,《電容應(yīng)用分析精粹》中會采用某種形象的方式,但在《三極管應(yīng)用分析精粹》可能就會采用另一種方式,如果要寫一本針對在校大學(xué)生的教材,同一個知識點的闡述方式又會有所不同。
如果一個人執(zhí)意要從邊邊角角找出圖書的錯誤,總是可以成功的,無論是霍金的《時間簡史》還是拉扎維的《射頻微電子學(xué)》,為什么這么說呢?咱們可以放開思路討論:假設(shè)一只僅有二維空間概念的動物,它是其所在空間的一名物理學(xué)家,并且也提出了很多真理或定律。但是在我們看來,這些所謂的真理或定律并不一定是正確的,因為所在的維度不一樣。同樣我們這個維度提出的理論,在更高位面也并不一定是正確的,你同意嗎?我想表達的是:每一本書都有其定位與局限性!在某個設(shè)定框架內(nèi)可以做到基本正確,但跳出這個設(shè)定卻不然,這是無法避免的。如果你決定用心閱讀某本書,首先就得接受其定位與局限性,否則你會覺得到處都是錯誤。
圖書撰寫需要站在不同角度去實際操作,當你的讀者定位不同時,描述方式或嚴謹程度是不同的,但重點在于把想要表達的意思清晰地展示出來。記得初中化學(xué)老師曾對我們說過一句話:等你們學(xué)習高中化學(xué)的時候,就會知道現(xiàn)在學(xué)到的很多內(nèi)容是錯誤的!那我們可以去批判初中化學(xué)嗎?肯定不妥嘛!因為教育有它自身的客觀規(guī)律,初中階段有其自身廣度與深度的局限性,要不咱們初中、高中、大學(xué)全部一套教材不就完事了?換句話說,會花費寶貴的時間一味地片面找圖書問題的人(這種行為就是我們所說的“找茬”,字面意思),本身就存在一些問題,因為TA缺乏最起碼的寫作意識,也不具備最基本的思辨能力。
人這一輩子幾十年看似很長,但在整個宇宙中也只不過是一粒塵埃而已,我們應(yīng)該用有限的生命去做一些有意義的事情,如果非要用一句話來具體概括,我的選擇是:態(tài)度決定一切!