上帝視角:程序員為什么需要理解 CPU?
大家好,我是小風(人設(shè)建立中。。。),今天給大家?guī)硪黄獎偎萍夹g(shù)文的非技術(shù)文。
最近陸陸續(xù)續(xù)寫了幾篇關(guān)于CPU的文章,可能有的同學會問,程序員寫代碼就好了,為什么需要去理解CPU啊?不嫌累啊?啊?啊?你倒是說啊。
計算機系統(tǒng) != 漢堡包
在之前的文章中我把計算機系統(tǒng)比作一個漢堡包,這個類比不太恰當,雖然漢堡包是層級結(jié)構(gòu),但它是上下對稱的,計算機系統(tǒng)的層級結(jié)構(gòu)顯然不是對稱的,你要說披薩還差不多,注意是披薩,不是餡餅,因為餡餅也是對稱的。
計算機系統(tǒng)的結(jié)構(gòu)是上層基于下層,并且上層對外屏蔽下層,因此用洋蔥來比喻計算機系統(tǒng)是再恰當不過了,這兩者都是層級結(jié)構(gòu),下層對上層都不可見,最妙的是,這兩者看時間長了都會辣眼睛!
這種層級結(jié)構(gòu)保證了處于上層程序員無需理解下一層。
模糊的精確
你的確不需要知道底層全部的微觀細節(jié),實際上我也不相信有誰能全部知道,如果你太注重細節(jié),沒有對計算機系統(tǒng)的大局觀而是一頭扎到細節(jié)里,最終也只是徒勞,只挖掘細節(jié)很像是一種“模糊的精確”。
精確的模糊
但是,如果你能知道底層的宏觀上的原理,情況就不一樣了,我把這種宏觀上的不那么細節(jié)的理解稱之為“精確的模糊”,老外有一個詞我認為很貼切:The Big Picture。
程序員這一行,個人認為精確的模糊要遠好于模糊的精確,因為前者要想進一步了解細節(jié)是很容易的(只是需不需要的問題),反之則非常困難。而且依靠這種精確的模糊已經(jīng)能解決很多問題,而后者則不能。
上帝視角
每一個大家認為的高手腦海里都有這樣一種精確的模糊(或者精確的精確,高手中的高手),ta可能不知道編譯器(解釋器)、鏈接器、操作系統(tǒng)、網(wǎng)絡(luò)協(xié)議棧、CPU、內(nèi)存等等所有核心模塊的全部細節(jié),但是ta知道這些模塊“應該”怎樣工作,當你有了這種理解后,你會發(fā)現(xiàn):
你很確定的自己的每一行程序是怎么被計算機執(zhí)行的;你清楚的知道什么時候該用多線程什么時候不該用;你清楚的知道自己的線程什么時候該加鎖、什么時候該等待,怎樣解決互斥問題,怎樣解決同步問題;你清楚的知道自己的每一段代碼大概可能會執(zhí)行多長時間;你清楚的知道自己的每次函數(shù)調(diào)用從上層到底層是如何執(zhí)行的,因此你很清楚該選擇使用什么樣的函數(shù),傳遞什么樣的參數(shù)才能達到自己想要的效果;你清楚的理解計算機系統(tǒng),因此發(fā)現(xiàn)公眾號碼農(nóng)的荒島求生也就是剛剛在本文開頭立人設(shè)的小風說的都是你已經(jīng)知道的東西。
當你的程序出現(xiàn)問題后無頭蒼蠅般瞎試一通并期待自己的程序能奇跡般正常工作時;當編譯器提示奇怪的錯誤時;當鏈接器莫名其妙的提示'undefined reference to ***'時;當程序運行起來就core時;當程序運行一段時間被OOM kill掉時;當你的程序內(nèi)存泄漏時;當你的程序莫明奇妙耗時非常高時;如果在這些時刻你能做的僅僅是等待別人來幫忙,那么就不要說程序員不需要理解底層了。
說了這么多,用一句話說就是理解底層的好處可以讓程序員在寫程序時獲得“上帝視角”,一切都逃不過你的法眼。
本文轉(zhuǎn)載自微信公眾號「碼農(nóng)的荒島求生」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系碼農(nóng)的荒島求生公眾號。