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

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

張大胖:哈哈,我還是站在最高層。
大師:網絡編程也是如此。

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

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