[碼農(nóng)翻身]抽象:程序員必備的能力

抽象:程序員必備的能力
http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513062&idx=1&sn=a3b4a2962d8e82471192d9606b0a2722&scene=21#wechat_redirect

2015年大熱的動(dòng)畫片《動(dòng)腦特工隊(duì)》中描述了這么一個(gè)場景, 冰棒帶領(lǐng)樂樂和憂憂抄近路去乘坐思維列車肆捕,所謂的“近路”就是穿過抽象思維的房間,在這個(gè)房間里, 他們先是變成了變成3D的塊,就像計(jì)算機(jī)圖形學(xué)里展示的那樣:

然后變成平面的圖形

最后只剩下一些線條了 本鸣!

真是非常生動(dòng)的展示了人類做抽象活動(dòng)的過程弓颈。

在軟件業(yè),抽象能力的重要性怎么說都不為過绕德,因?yàn)檐浖_發(fā)是一個(gè)高度復(fù)雜的智力活動(dòng),程序員經(jīng)常需要面對摊阀、處理異常復(fù)雜的業(yè)務(wù)和邏輯耻蛇,如果你不具備強(qiáng)大的抽象能力剩瓶,無法把具體變成概念,進(jìn)而駕馭概念進(jìn)行思考城丧, 你就很難降低問題的復(fù)雜度延曙,從而陷入泥潭,無法自拔亡哄。
無論你學(xué)會(huì)了多么強(qiáng)大的程序語言枝缔,你的編程能力也很難有質(zhì)的提高。

當(dāng)然抽象不僅僅是軟件開發(fā)的獨(dú)有概念蚊惯,在別的領(lǐng)域可以看到更多愿卸,例如帝國經(jīng)常提的“三. 個(gè). 代. 表”,“和. 諧”(當(dāng)然現(xiàn)在已經(jīng)變成貶義詞了)截型,“中. 國. 夢” 趴荸,就是把執(zhí)政理念和民眾的訴求進(jìn)行抽象,當(dāng)然實(shí)施的效果如何就留給大家評說了宦焦。

在自然科學(xué)領(lǐng)域发钝,抽象的例子更多,開普勒定律和萬有引力就是很典型的例子波闹。

在16世紀(jì)很多人開始相信哥白尼提出的日心說酝豪,但一直搞不清楚圍繞太陽的行星到底是怎么運(yùn)動(dòng)的,軌道是什么樣子精堕,著名天文學(xué)家開普勒仔細(xì)的研究了他的老師 --杰出的觀測家--第谷留下的大量天文觀測數(shù)據(jù)以后孵淘, 提煉出了著名的開普勒三定律, 第一次給出了天體運(yùn)行規(guī)律的解釋:

  1. 所有行星分別是在大小不同的橢圓軌道上運(yùn)行
  2. 在同樣的時(shí)間里行星向徑在軌道平面上所掃過的面積相等
  3. 行星公轉(zhuǎn)周期的平方與它同太陽距離的立方成正比

開普勒三定律從大量的數(shù)據(jù)中提煉出數(shù)學(xué)規(guī)律歹篓, 無疑是非常偉大的發(fā)現(xiàn)和抽象瘫证, 但這不是最終本質(zhì),當(dāng)然也不是最終的抽象庄撮。

行星運(yùn)動(dòng)的本質(zhì)是萬有引力定律背捌。

相比于開普勒定律,天才的牛頓所做的抽象向前邁進(jìn)了一大步重窟,萬有引力幾乎覆蓋了所有大質(zhì)量物體之間互相吸引和運(yùn)動(dòng)的規(guī)律载萌, 即簡單又優(yōu)美惧财, 配合牛頓(和萊布尼茨)發(fā)明的微積分巡扇,可以很容易推導(dǎo)開普勒定律。

如果再加上牛頓力學(xué)三定律垮衷,尤其是F=ma , 整個(gè)經(jīng)典物理學(xué)的架子就建起來了厅翔,后人所有的工作只是在這座大廈上進(jìn)行一些裝修工作,直到愛因斯坦相對論的出現(xiàn)搀突,才建立一座更宏偉的大廈刀闷。

據(jù)說愛因斯坦在評價(jià)一個(gè)研究時(shí),會(huì)用美和丑來作為判斷標(biāo)準(zhǔn),有人拿研究成果讓愛因斯坦看甸昏, 愛因斯坦不說成果的好與壞顽分,反而說“這東西多丑陋啊”, “這東西真漂亮”施蜜。

其實(shí)一個(gè)抽象的東西形式優(yōu)美卒蘸,結(jié)構(gòu)簡單,很有可能是正確的翻默,很可能抓住了事物的本質(zhì)缸沃。

相反如果連形式都丑陋不堪,十有八九不是好的成果修械。 以此作為標(biāo)準(zhǔn)趾牧,萬有引力定律無疑是漂亮的,正確的肯污,當(dāng)然愛因斯坦的E=mc2 更加漂亮和簡單翘单。

抽象的例子在軟件業(yè)更是數(shù)不勝數(shù):

文件是對I/O的抽象;
虛擬存儲(chǔ)器是對物理存儲(chǔ)器的抽象蹦渣;
進(jìn)程是對一個(gè)正在運(yùn)行的程序的抽象县恕;
我們再增加一個(gè)新的抽象:虛擬機(jī), 他提供了對整個(gè)計(jì)算機(jī)(包括操作系統(tǒng)剂桥,處理器忠烛,程序)的抽象。

Andorid 把一個(gè)移動(dòng)應(yīng)用程序抽象成Activity , Intent, Service,Provider权逗。
......
稍微注意一下就會(huì)發(fā)現(xiàn): 抽象層次越高美尸,接口的語意就越模糊,適用的范圍就越廣斟薇,到最后就會(huì)變成數(shù)學(xué)模型或者概念师坎。

數(shù)學(xué)模型和算法

我認(rèn)為把紛雜的事物抽象到數(shù)學(xué)層面是最高的抽象,也許會(huì)有人會(huì)說哲學(xué)層面才是:-) 堪滨,但到數(shù)學(xué)層面已經(jīng)非常難了胯陋。尤其是重大的科學(xué)發(fā)現(xiàn),身后必然有數(shù)學(xué)的影子袱箱。

牛頓當(dāng)年為了描述天體的軌道和運(yùn)動(dòng)遏乔,特別創(chuàng)立了新的數(shù)學(xué)表示: 微積分

麥克斯韋使用一組方程對電場和磁場行為進(jìn)行描述。

當(dāng)年愛因斯坦腦海中已經(jīng)有了廣義相對論发笔,但苦于找不到合適的數(shù)學(xué)形式來描述盟萨,他特別花了幾年的時(shí)間來學(xué)習(xí)非歐幾何和張量分析,最后才得以成功了讨。

海森堡用矩陣?yán)碚搧斫忉屃孔恿W(xué)
捻激。制轰。。胞谭。

程序員在開發(fā)過程中垃杖, 也許能把一個(gè)實(shí)際的業(yè)務(wù)問題抽象成數(shù)學(xué)模型,或者抽象成特定的算法丈屹,這樣會(huì)讓程序?qū)崿F(xiàn)變得非常簡單和有趣缩滨。

我在之前的公司有幸遇到過一次,把針對稅務(wù)領(lǐng)域的一個(gè)Credit, Debit等概念抽象為在一個(gè)二維坐標(biāo)下點(diǎn)的運(yùn)動(dòng)泉瞻, 問題一下子簡化了很多脉漏,實(shí)現(xiàn)簡單,并且非常安全可靠袖牙。

正交的概念

但是抽象成數(shù)學(xué)模型和算法通常是可遇而不可求的侧巨, 這種情況下,我們需要退而求其次鞭达,試圖抽象成若干個(gè)正交的概念司忱,來降低復(fù)雜度。

“正交”在數(shù)學(xué)上指的是線性無關(guān)畴蹭,最常見的例子就是坐標(biāo)系下的x 軸和y軸坦仍,對于一個(gè)點(diǎn)來講,它的x值的變化不會(huì)影響到y(tǒng), y值得變化不會(huì)影響到x 叨襟,即x和y是正交的繁扎。

正交的威力在于互不影響,擴(kuò)展方便糊闽,單用一個(gè)坐標(biāo)軸可以表示一個(gè)直線上的所有的點(diǎn)梳玫, 再加一個(gè)y 軸就能表示平面上的所有的點(diǎn), 再加一個(gè)z軸 3維空間中的所有點(diǎn)都能表示出來了右犹!

我們?nèi)祟惖拇竽X在思考問題的時(shí)候是有容量限制的提澎, 難以同時(shí)駕馭太多負(fù)責(zé)的概念, 如果我們的軟件系統(tǒng)也能做成x,y,z 坐標(biāo)這樣念链,就帶來了無與倫比的好處盼忌,你在處理x軸相關(guān)的事情時(shí),不用考慮其他的y和z 相關(guān)的東西掂墓,因?yàn)槟阒浪麄儾粫?huì)受到影響谦纱, 這樣問題的復(fù)雜度就從3維一下子下降到1維!更容易把握了梆暮。

如果單單x 軸仍然很復(fù)雜服协,你要做的就是再次分解成更小的概念,保證正交即可啦粹。

接口

如果你說了偿荷,我的整個(gè)系統(tǒng)還沒法抽象成正交的概念, 那只好再退一步唠椭,在局部使用接口跳纳。

在著名的《設(shè)計(jì)模式》一書中,其實(shí)在反復(fù)強(qiáng)調(diào)一點(diǎn): 發(fā)現(xiàn)變化并且封裝變化贪嫂,針對接口編程而不是實(shí)現(xiàn)編程寺庄。 很多人看書是只關(guān)注具體的模式,而忽略了模式的本質(zhì)目的力崇。

我們在開發(fā)的過程中要保持一種敏銳的感覺斗塘,發(fā)現(xiàn)可能的變化并且封裝起來,只提供一個(gè)精心定義的接口讓外界調(diào)用亮靴。這樣你在接口后面所做的任何變化馍盟,外邊就不受影響了。

例如在JDK中Iterator 就是一個(gè)很好的抽象茧吊, 它將集合本身和集合的遍歷分開贞岭。 Stream 抽象也不錯(cuò),封裝了對文件和網(wǎng)絡(luò)操作搓侄,只是使用起來稍顯麻煩瞄桨。

其實(shí) 一組定義良好的接口一定是正交的,不然的話接口之間的依賴就會(huì)讓實(shí)現(xiàn)非常麻煩讶踪。

總結(jié)

說到底芯侥,軟件設(shè)計(jì)和開發(fā)就是把現(xiàn)實(shí)中的問題映射的計(jì)算機(jī)的語言實(shí)現(xiàn),但現(xiàn)實(shí)問題太復(fù)雜乳讥,細(xì)節(jié)太多筹麸,而且在不斷的變化過程中,一般人很難同時(shí)對這么的細(xì)節(jié)進(jìn)行思考 雏婶,這時(shí)候就需要抽象物赶。

我們只有從紛繁復(fù)雜的現(xiàn)象中抽取事物的本質(zhì),從具體事物提煉出正交的概念留晚,才能駕馭這些概念酵紫,才能在一個(gè)低復(fù)雜度的世界中進(jìn)行思考。

抽象能力的高低错维,很大程度上反映了一個(gè)程序員的能力的高低

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奖地,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赋焕,更是在濱河造成了極大的恐慌参歹,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隆判,死亡現(xiàn)場離奇詭異犬庇,居然都是意外死亡僧界,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門臭挽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捂襟,“玉大人,你說我怎么就攤上這事欢峰≡岷桑” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵纽帖,是天一觀的道長宠漩。 經(jīng)常有香客問我,道長懊直,這世上最難降的妖魔是什么扒吁? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮吹截,結(jié)果婚禮上瘦陈,老公的妹妹穿的比我還像新娘。我一直安慰自己波俄,他們只是感情好晨逝,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著懦铺,像睡著了一般捉貌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冬念,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天趁窃,我揣著相機(jī)與錄音,去河邊找鬼急前。 笑死醒陆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裆针。 我是一名探鬼主播刨摩,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼世吨!你這毒婦竟也來了澡刹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤耘婚,失蹤者是張志新(化名)和其女友劉穎罢浇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嚷闭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年攒岛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凌受。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡阵子,死狀恐怖思杯,靈堂內(nèi)的尸體忽然破棺而出胜蛉,到底是詐尸還是另有隱情,我是刑警寧澤色乾,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布誊册,位于F島的核電站,受9級特大地震影響暖璧,放射性物質(zhì)發(fā)生泄漏案怯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一澎办、第九天 我趴在偏房一處隱蔽的房頂上張望嘲碱。 院中可真熱鬧,春花似錦局蚀、人聲如沸麦锯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扶欣。三九已至,卻和暖如春千扶,著一層夾襖步出監(jiān)牢的瞬間料祠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工澎羞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留髓绽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓妆绞,卻偏偏與公主長得像顺呕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子摆碉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容