我發(fā)現(xiàn),我一直是站在巔峰啊!
張大胖學(xué)了Java語言,學(xué)了Web基礎(chǔ)知識,又學(xué)了SpringBoot, MyBatis,Vue等框架, 他成了一個"全沾"程序員。
他覺得這樣也挺好,前后端通吃,可以在編碼的天地中自由地飛翔了。
可是他在網(wǎng)上、群里經(jīng)常聽到大家說計算機基礎(chǔ)很重要,尤其以碼農(nóng)翻身為甚, 像什么:
勿以浮沙筑高臺
基礎(chǔ)不牢,地動山搖
沉下去有多深,彈起來就有多高
......
張大胖不以為然嗤之以鼻,他認為除了在面試時會用到計算機底層的基礎(chǔ)知識,別的地方根本用不到,工作中主要是實現(xiàn)業(yè)務(wù),連個稍微復(fù)雜一點兒的算法都用不到。
他決定去請教一下軟件大師,問問到底是怎么回事。
張大胖:大師,我覺得現(xiàn)在的編程已經(jīng)變得非常輕松了,利用現(xiàn)有的框架和類庫開發(fā)軟件非常容易,高中生編程都沒有任何問題。
大師:你覺得為什么會這樣?
張大胖:就是不用接觸底層的那些細節(jié)了,直接就可以面向業(yè)務(wù)開發(fā)了。
大師:你算是說到點子上了,這就是抽象帶來的好處啊。
張大胖:抽象?我似乎聽說過一句話,說計算機行業(yè)的任何問題,都可以通過一個抽象層來解決。
大師:是啊,就說計算機編程語言吧,就是不斷抽象,逐漸遠離計算機硬件的一個過程,想當(dāng)年我用匯編編程, 想在屏幕上輸出一個Hello World都累得要死,寫個大程序更是要累得吐血了。

張大胖:嗯,我現(xiàn)在用的就是最高層的Java,根本不用考慮什么匯編語言,機器語言,連指針都用不上!
大師:再比如說,Web編程,我用CGI那會兒真是痛不欲生。

張大胖:哈哈,我還是站在最高層。
大師:網(wǎng)絡(luò)編程也是如此。

張大胖:哈哈, 我只用HTTP,根本不管底層的東西。
大師:還有對數(shù)據(jù)的操作,也是一層層地抽象。

張大胖:大師,我發(fā)現(xiàn)我一直是站在巔峰啊!
大師:這有什么好得瑟的,你站得越高,越容易出現(xiàn)難以解決的抽象泄露的問題。
張大胖:抽象的泄露?
大師:對, 這是Stack Overflow的創(chuàng)始人Joel Spolsky提出來的一個理論:所有重大的抽象機制在某種程度上都是有泄露的!
張大胖: 不對吧! 這種分層的抽象,好處不就是每一層都可以屏蔽下層的變化嘛,我站在高層編程,根本不用理會底層, 為什么會泄露?
大師:我來給你舉幾個例子,你就明白了。外國有個程序員,她使用Ruby語言通過HTTP向本地的一個消息隊列發(fā)送消息, 這抽象層次很高吧! 但是每次發(fā)送消息都得耗費40ms,這是不應(yīng)該的, 時間太長了。 她查來查去,發(fā)現(xiàn)Ruby的類庫沒有設(shè)置TCP_NODELAY, 但是本地的HAProxy卻使用了TCP delayed acknowledgement,于是雙方互相等待,出現(xiàn)了延時。
張大胖:我聽不懂!
大師:你站在抽象的巔峰,這些TCP的細節(jié)怎么能聽懂呢?我給你舉個簡單例子吧, 比如你用了Hibernate這個ORM工具,它是一個抽象層,隱藏了SQL, 但是當(dāng)出現(xiàn)Hibernate性能問題的時候,你怎么辦?
張大胖:那我得去看Hibernate 是怎么把對象變成SQL語句的,然后慢慢調(diào)優(yōu)。
大師:對啊,你看Hibernate這個抽象層沒法完美地隱藏底層的信息,發(fā)生泄露了。 SQL 也是個抽象層,隱藏了讀數(shù)據(jù)庫表查詢處理的細節(jié),如果SQL語句出現(xiàn)性能問題,你怎么辦?
張大胖:那...... 我只好去分析SQL的查詢計劃,如何利用索引,還得慢慢調(diào)優(yōu)。
大師:你看SQL這個看似完美的抽象層也泄露了不是?
張大胖:有道理,哎呀,這抽象層泄露的代價很高啊,我得學(xué)習(xí)這么多底層的東西。
大師:所以Joel Spolsky說“抽象只能節(jié)省你的工作時間,不能節(jié)省你的學(xué)習(xí)時間”, 用高層的抽象來工作,會比較快,但是你還得學(xué)習(xí)底層的東西,那是跑不掉的。
張大胖:明白明白了,為了能繼續(xù)好好地搬磚,我得趕緊去學(xué)學(xué)計算機的底層基礎(chǔ)知識了。
(完)
如需轉(zhuǎn)載,請通過作者微信公眾號coderising獲取授權(quán)。