新聞中心
晚上吃飯的時(shí)候,有人提到了“抽象”這個(gè)詞,孩子的好奇心是最強(qiáng)的,我女兒立刻就問(wèn)我:“爸爸,什么是抽象?”

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),淇濱企業(yè)網(wǎng)站建設(shè),淇濱品牌網(wǎng)站建設(shè),網(wǎng)站定制,淇濱網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,淇濱網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
剎那間我的腦海中涌過(guò)了很多畫(huà)面:
頭腦特工隊(duì)的電影
牛頓的萬(wàn)有引力公式
三個(gè)代表
k8s的pod, rs, service
設(shè)計(jì)模式
接口和抽象類(lèi)
......
這些她都聽(tīng)不懂,于是我決定用一個(gè)簡(jiǎn)單的例子來(lái)敷衍她:
“我先給你一個(gè)蘋(píng)果,然后又給了你一個(gè)蘋(píng)果,你現(xiàn)在有幾個(gè)蘋(píng)果?”
“兩個(gè)”
“我先給你一根香蕉,然后又給你了一根香蕉,你現(xiàn)在有幾根香蕉?”
“兩根”
“1 + 1 等于幾?”
“2”
“對(duì),1+1 = 2就是抽象,知道了吧?!?/p>
她點(diǎn)點(diǎn)頭。
"將來(lái)你還會(huì)學(xué)代數(shù),x+y = z,那是更高級(jí)的抽象......”
她似懂非懂地點(diǎn)點(diǎn)頭,眼神中充滿(mǎn)了迷茫。
回到正題吧,我今天想給大家分享的是下面這幅圖以及由它引發(fā)的感想。
這幅圖來(lái)自于《深入理解計(jì)算機(jī)系統(tǒng)》, 我第一次看到它時(shí)候可以說(shuō)是拍案叫絕,畫(huà)得實(shí)在是太棒了。
1
對(duì)程序員來(lái)講,我們并不是直接面向硬件進(jìn)行編程的,因?yàn)橛布?xì)節(jié)實(shí)在是太復(fù)雜了,所以必須要做封裝和抽象。
比如說(shuō)你要是想針對(duì)CPU這個(gè)硬件來(lái)編程, 這實(shí)在是太難了。
但是如果我們把CPU抽象為指令集,其中無(wú)非就是一些 MOV 指令,ADD指令, JUMP指令,那難度一下子就降低了一個(gè)數(shù)量級(jí)。
有了指令集,以及依托于指令集的匯編就夠了嗎?遠(yuǎn)遠(yuǎn)不夠!因?yàn)閰R編語(yǔ)言還是非常低級(jí),需要直接操作CPU的寄存器和內(nèi)存,如果一直用匯編語(yǔ)言編程,我估計(jì)現(xiàn)在的程序員數(shù)量要減少90%以上。
所以C語(yǔ)言,Pascal,C++出現(xiàn)了,Java,Python, Ruby出現(xiàn)了,用這些語(yǔ)言編程,根本不用考慮寄存器的事情,程序員離物理機(jī)器越來(lái)越遠(yuǎn),和硬件打交道的事情都交給了編譯器和解釋器。
有時(shí)候,有了高級(jí)語(yǔ)言還不夠,為了更加貼近業(yè)務(wù)領(lǐng)域,甚至讓業(yè)務(wù)人員直接編程,程序員還會(huì)創(chuàng)建領(lǐng)域特定語(yǔ)言(DSL)。
2
硬盤(pán)在沒(méi)有抽象的情況下,我們看到的就是盤(pán)面,磁道,扇區(qū)這樣的底層概念, 你要是想在上面寫(xiě)點(diǎn)兒東西,或者讀取一點(diǎn)兒東西,可就要累死了。
可以先做一點(diǎn)簡(jiǎn)單的抽象,隱藏磁道扇區(qū)這樣的概念,讓磁盤(pán)變成邏輯上按順序編號(hào)的磁盤(pán)塊,即磁盤(pán)塊1、磁盤(pán)塊2、磁盤(pán)塊3......這就好多了,但使用起來(lái)依然非常低級(jí)。
于是操作系統(tǒng)給我們提供了一個(gè)漂亮的抽象,文件!你只需要打開(kāi)文件,寫(xiě)入數(shù)據(jù),關(guān)閉文件即可,根本不用考慮底層的概念。
更重要的是,在Linux/Unix中,一切都是文件,可以用統(tǒng)一的接口來(lái)處理,這就更漂亮了。
3
文件是個(gè)非常好的抽象,可是對(duì)于商業(yè)應(yīng)用來(lái)講,它關(guān)注的是業(yè)務(wù)概念,是用戶(hù)名,電子郵箱,地址,部門(mén),賬戶(hù),存款,取款,余額等等,在這種場(chǎng)景下,文件就變得太低級(jí)了。
所以數(shù)據(jù)庫(kù)出現(xiàn)了,把文件這個(gè)概念也隱藏了,對(duì)于關(guān)系數(shù)據(jù)庫(kù)來(lái)說(shuō),你面對(duì)的就是一個(gè)個(gè)邏輯上表格,你只要發(fā)出SQL語(yǔ)句就可以存取數(shù)據(jù),并且還能保證ACID的特性,根本不用考慮底層的實(shí)現(xiàn)細(xì)節(jié), 用起來(lái)就更加舒服了。
4
前面說(shuō)的這些抽象,看起來(lái)似乎是分層的:
在日常的編程中,我們經(jīng)常做的一件事情就是“數(shù)據(jù)抽象”,或者說(shuō)找出抽象數(shù)據(jù)類(lèi)型(ADT),在Java中就是抽象類(lèi)或者接口。比如說(shuō)List就是一個(gè)ADT,它的實(shí)現(xiàn)可以是ArrayList,可以是LinkedList。
ADT的特點(diǎn)就是穩(wěn)定,很少變化,在項(xiàng)目和產(chǎn)品的開(kāi)發(fā)中,一個(gè)非常重要的工作就是定義自己項(xiàng)目的ADT(以及ADT之間的關(guān)系),ADT一旦確定,那這個(gè)項(xiàng)目的骨架基本上就定下來(lái)了。
但是這個(gè)ADT不好找,有時(shí)候可以直接和業(yè)務(wù)概念對(duì)應(yīng)上,有時(shí)候需要自己“造”一些概念出來(lái),這就考驗(yàn)開(kāi)發(fā)人員的抽象能力了。
軟件業(yè)發(fā)展到今天,就是一部不斷抽象的歷史。抽象降低了復(fù)雜度,是一件非常好的事情,但是現(xiàn)在很多程序員日常的工作就是針對(duì)抽象的概念進(jìn)行編程,由于很多細(xì)節(jié)被屏蔽,工作就顯得比較無(wú)趣,如果想讓自己的編程生涯變得有趣一點(diǎn),我有兩點(diǎn)建議:
一、要了解這些抽象下面是什么東西。
二、努力爭(zhēng)取到創(chuàng)建抽象的權(quán)力,即設(shè)計(jì)的權(quán)力和架構(gòu)的權(quán)力。
【本文為專(zhuān)欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)作者微信公眾號(hào)coderising獲取授權(quán)】
本文題目:女兒?jiǎn)柫宋乙粋€(gè)問(wèn)題:什么是抽象?
文章地址:http://m.5511xx.com/article/cosghis.html


咨詢(xún)
建站咨詢(xún)
