熟悉我的讀者朋友知道,我給好多技術(shù)文章的標(biāo)題,都加上了 破玩意 這三個(gè)字。一開始我只是覺得好玩,直到有一次,一位讀者朋友留言:這讓我有了更深入的思考,于是有了這篇文章,和大家聊聊我對(duì)學(xué)習(xí)技術(shù)的兩點(diǎn)思想上的感悟。1
很多同學(xué)在戰(zhàn)略上過于重視技術(shù)。具體體現(xiàn)為,在你還完全不了解一門技術(shù)的時(shí)候,就不自覺地認(rèn)為它高不可攀,不是我等凡人可以搞明白的。比如 linux 內(nèi)核、jvm 虛擬機(jī)實(shí)現(xiàn)、native 方法的底層原理...有多少同學(xué)從來(lái)沒嘗試接觸他們,就認(rèn)為很多事情,不僅僅是技術(shù),當(dāng)你真正開始接觸它、熟悉它、了解它之后,就會(huì)覺得,它和你的距離,并沒有你想象得那么遙遠(yuǎn)。甚至你可能會(huì)覺得,它比你現(xiàn)在所熟悉的東西,還要簡(jiǎn)單,只是當(dāng)時(shí)不知道而已。比如 linux 內(nèi)核,在很多 Java 程序員眼中可能是個(gè)高不可攀的存在,我曾經(jīng)也是這樣的感覺。但有多少同學(xué)是連一行 linux 源碼都沒看過,就開始覺得它高不可攀呢?當(dāng)我開始看 linux 源碼之后,我便發(fā)現(xiàn)它不過如此,在全局上我已經(jīng)不懼怕它了,需要的只是時(shí)間,把一個(gè)個(gè)的具體問題想明白。再者,很多時(shí)候也不能怪我們自己的,很多原本簡(jiǎn)單的名詞,會(huì)被別有用心的人包裝成晦澀難懂的概念,使我們敬而遠(yuǎn)之。我們看百度百科關(guān)于 內(nèi)核 這個(gè)詞的解釋:內(nèi)核是操作系統(tǒng)最基本的部分。它是為眾多應(yīng)用程序提供對(duì)計(jì)算機(jī)硬件的安全訪問的一部分軟件,這種訪問是有限的,并且內(nèi)核決定一個(gè)程序在什么時(shí)候?qū)δ巢糠钟布僮鞫嚅L(zhǎng)時(shí)間。內(nèi)核的分類可分為單內(nèi)核和雙內(nèi)核以及微內(nèi)核。嚴(yán)格地說(shuō),內(nèi)核并不是計(jì)算機(jī)系統(tǒng)中必要的組成部分。
我覺得這段話沒有提供任何有價(jià)值的信息量,且提供的信息組織得十分混亂。百科亦是如此,更何況現(xiàn)在人人都可以寫的博客和書籍呢?所以,不要懼怕它們,很多事情,并沒有那么復(fù)雜。2
不知道有多少同學(xué)看過同步異步、阻塞非阻塞的這段解釋,網(wǎng)上應(yīng)該很多。1. 老張把水壺放到火上,立等水開。(同步阻塞)
2. 老張把水壺放到火上,去客廳看電視,時(shí)不時(shí)去廚房看看水開沒有。(同步非阻塞)
3. 老張把響水壺放到火上,立等水開。(異步阻塞)
4. 老張把響水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(異步非阻塞)
這就是他們的區(qū)別,沒那么高深,一個(gè)例子就能解釋透徹!
在我看來(lái)呢,這個(gè)就屬于典型的在戰(zhàn)略上做到了藐視了技術(shù),但在戰(zhàn)術(shù)上卻沒有重視技術(shù)。這要比在戰(zhàn)略上過于重視技術(shù)還要可怕。同步異步、阻塞非阻塞的本質(zhì)其實(shí)很簡(jiǎn)單,完全沒必要用擬人化的例子去解讀。這個(gè)例子本身也是極其不準(zhǔn)確的,說(shuō)它錯(cuò)誤也不為過。再加上不同人的不同理解,就更加具有誤導(dǎo)性了。且這個(gè)例子丟失了理解這些概念的幾乎全部的信息量:IO、線程掛起、立即返回未就緒狀態(tài)碼、回調(diào)函數(shù) 等。并且后面還加了一句話,說(shuō)這個(gè)例子能把這個(gè)問題解釋得很透徹。本來(lái),這種形象化解讀一手資料而生產(chǎn)出來(lái)的二手資料,就已經(jīng)丟失了大部分信息量。那么,那些以二手資料為參考,繼續(xù)形象化解讀而形成的三手資料,又會(huì)怎樣?比如這個(gè)燒水壺的例子,是一個(gè)人讀了打電話的例子后,寫出的,自始至終都沒有研究過這些概念的本質(zhì)。
給讀者造成的影響就是,讀者以為自己花了幾分鐘就理解了之前幾小時(shí)都沒明白的問題,大贊筆者,于是再也不去看之前花了幾個(gè)小時(shí)看的資料了。直到某一天遇到另一個(gè)問題,才恍然大悟自己當(dāng)初并沒有搞懂,而且當(dāng)初的理解也被這種擬人化的方式誤導(dǎo)了。當(dāng)然,有些技術(shù)點(diǎn),通過擬人化的方式還是十分貼切的,因?yàn)楫?dāng)初設(shè)計(jì)這些技術(shù)時(shí)的思路,就是通過生活中的事情而產(chǎn)生的靈感。所以,錯(cuò)不是錯(cuò)在擬人化,而是在于對(duì)技術(shù)細(xì)節(jié)的不重視。
所以,無(wú)論是寫文章,還是學(xué)習(xí),不但要在戰(zhàn)略上藐視技術(shù),更要在戰(zhàn)術(shù)上重視技術(shù)。遇到具體的問題,細(xì)化到每一個(gè)字節(jié),每一個(gè)位,都要重視起來(lái)。我在寫《你管這破玩意叫文件系統(tǒng)》時(shí),雖然全文都在介紹設(shè)計(jì)文件系統(tǒng)的思路,也盡量把很多晦澀的概念貫穿在情節(jié)當(dāng)中便于理解。但我后面更多的時(shí)間,是一個(gè)字節(jié)一個(gè)字節(jié)地分析 ext2 文件系統(tǒng)的鏡像文件,將其每個(gè)字節(jié)的含義和 linux 中 ext2 實(shí)現(xiàn)的源碼,以及 ext2 官方文檔的說(shuō)明,對(duì)應(yīng)起來(lái)。通過添加、修改、刪除文件,來(lái)觀察在硬盤鏡像文件哪個(gè)字節(jié)發(fā)生了變化。通過對(duì)比 ext2、ext3、ext4 來(lái)看哪些是后續(xù)版本增加的功能,有什么作用。這樣才能分析出什么是構(gòu)建起一個(gè)文件系統(tǒng)的核心設(shè)計(jì),哪些是不影響核心功能的錦上添花的設(shè)計(jì)。在文風(fēng)上,我從來(lái)都是帶著藐視技術(shù)的態(tài)度講給讀者,但在資料的收集和細(xì)節(jié)的打磨上,我會(huì)保持對(duì)技術(shù)的敬畏,重視技術(shù),重視細(xì)節(jié)。戰(zhàn)略上藐視技術(shù),戰(zhàn)術(shù)上重視技術(shù),做到這兩點(diǎn),學(xué)習(xí)技術(shù)方式你就掌握一半了,剩下的都是細(xì)節(jié)問題,我覺得都無(wú)所謂。
比如很多人會(huì)出學(xué)習(xí)順序呀、學(xué)習(xí)攻略之類的,其實(shí)我覺得條條大路通羅馬,你是先學(xué)底層還是先學(xué)上層,學(xué)網(wǎng)絡(luò)時(shí)是自底向上還是自頂向下,學(xué)習(xí)一門新技術(shù)時(shí)是先寫 demo 還是先學(xué)原理,我覺得這些都因人而異,沒有絕對(duì)的所謂的正確順序。
有的時(shí)候,這些細(xì)節(jié)反而需要通過你自己不斷學(xué)習(xí)和摸索,總結(jié)出一套適合自己的規(guī)律。
最后希望大家好好學(xué)習(xí),天天向上,少看今天這種教你學(xué)習(xí)方法的文章,多學(xué)學(xué)實(shí)際的技術(shù),比啥方法都強(qiáng)。
完~