因?yàn)槌橄竽芰Α?/section>在之前的《編程究竟難在哪?》,我們談過(guò)編程思維,其實(shí)就是“理解問(wèn)題——找出路徑”的思維過(guò)程,它由分解—識(shí)別模式—抽象—算法四個(gè)步驟組成。今天,想和大家探討的是這其中最重要的一步——抽象能力。人們?cè)趯?shí)踐中認(rèn)識(shí)到,在現(xiàn)實(shí)世界中一定事物、狀態(tài)或過(guò)程之間,總存在某些相似的方面,即共性。把這些相似的方面集中和概括起來(lái),暫時(shí)忽略它們之間的差異,這就是抽象。
比如,我們將10只十分熟悉的貓咪放入100只陌生的貓咪中,一開(kāi)始僅靠形象記憶,就可輕而易舉找到這10只貓咪,但如果把這10只熟悉的貓放入一千只、一萬(wàn)只、十萬(wàn)只陌生的貓群中,我們僅靠形象記憶找到貓的困難會(huì)越來(lái)越大,大到不可能。(圖片源自網(wǎng)絡(luò))
如果在10只貓身體上都打上記號(hào),事情立即會(huì)變得很簡(jiǎn)單。這個(gè)打記號(hào)的過(guò)程,是抽象思維。抽象思維在理解概念時(shí),就是在給所指事物尋找記號(hào),不過(guò)這個(gè)記號(hào)不是人為的,而是事物本身固有的,指的是事物的規(guī)律和本質(zhì)。當(dāng)我們遇到從未見(jiàn)過(guò)的事物時(shí),如果能夠運(yùn)用“抽象思維”去尋找記憶中的知識(shí)——現(xiàn)有的事物之間的聯(lián)系,作為解決過(guò)程的關(guān)鍵要素,那么我們解決問(wèn)題的效率將會(huì)大大上升。《北大邏輯課》一書中,就講了一個(gè)運(yùn)用“抽象思維”解決現(xiàn)實(shí)問(wèn)題的例子。有一天衙門接到報(bào)案,發(fā)現(xiàn)一民居失火,男主人與房屋都慘遭不幸,而女主人因?yàn)閯偤糜惺码x家,因此幸免于難。正在女主人為丈夫的逝去而哭泣的時(shí)候,法醫(yī)宋慈發(fā)現(xiàn)了尸體的異樣:死者雖表層皮膚被燒毀,但口中十分干凈,并無(wú)煙灰。于是斷定這個(gè)案件并非意外事故,而是另有兇手隱瞞真相,死者是先被謀殺、后尸體被燒毀。取一活豬、一死豬一起放在火中燒著,取出后發(fā)現(xiàn)活豬被燒毀后口中有大量煙灰,而死豬口中十分干凈,并無(wú)煙灰。宋慈解釋道:“之所以會(huì)如此,是因?yàn)閯?dòng)物在被火燒會(huì)發(fā)出激烈的自救運(yùn)動(dòng),而劇烈運(yùn)動(dòng)會(huì)大量的呼吸氧氣,同時(shí),就必然會(huì)把煙灰吸入口中、肺中,例如我們過(guò)年燒的豬頭,由于是死豬,口中就十分干凈?!?/section>“同理,本案中死者的口中并無(wú)煙灰,因此可以推斷,他在火災(zāi)發(fā)生前,就已經(jīng)被人殺害了!”
宋慈之所以能做出這段推理,就是靈活運(yùn)用抽象,從“豬遇火災(zāi)的反映”抽象出“口中有無(wú)煙灰是生物遇火時(shí),是死或生的唯一標(biāo)準(zhǔn)”這一定理,并加以證明的結(jié)果。一個(gè)抽象能力強(qiáng)的人,往往能從復(fù)雜的現(xiàn)象中直擊事物的本質(zhì)。也就是我們生活中常見(jiàn)的“這個(gè)人總是能抓住重點(diǎn)”“這個(gè)人總能看到我們看不到的”。回憶你學(xué)習(xí)的過(guò)程,其實(shí)是一個(gè)抽象能力的過(guò)程。首先,你需要觀察大量具體事物,比如學(xué)英語(yǔ),要觀察大量的英語(yǔ)單詞;學(xué)物理,你要解答很多相同的題型。在這基礎(chǔ)上,你尋找共同規(guī)律。很多英語(yǔ)單詞都是很多詞根、詞綴組成的,而詞根、詞綴又是有限的,這是一種規(guī)律;物理考試考的都是不一樣的題目,但很多習(xí)題考察的都是牛頓的三大定律。緊接著,你開(kāi)始加以演繹變化。在英語(yǔ)單詞里,詞綴有些是放在前面,有些是放在后面,有些詞根、詞綴兩兩組合,根據(jù)不同的排列組合,就會(huì)得出一定的變化。最后,你總結(jié)出共同規(guī)律和這些規(guī)律演繹出來(lái)的新變化,即使遇到新的問(wèn)題,也能迅速答出/應(yīng)對(duì)。這也是為什么以前老師總是讓我們做題海戰(zhàn)術(shù),只是有的人只停留在了“題?!?,有的人于千千萬(wàn)萬(wàn)中尋找規(guī)律總結(jié)出了一套“戰(zhàn)術(shù)”。(圖片源自網(wǎng)絡(luò))
編程也是這樣,初級(jí)開(kāi)發(fā)者和高級(jí)開(kāi)發(fā)者在技能的學(xué)習(xí)、使用上是有差距的。初級(jí)開(kāi)發(fā)者往往只是停留在“見(jiàn)西瓜是西瓜,見(jiàn)葡萄是葡萄”的層次,客戶/產(chǎn)品說(shuō)什么就做什么,在設(shè)計(jì)上讓你怎么做你就怎么實(shí)現(xiàn),從來(lái)也不去想是否滿足了用戶哪些方面的需求,代碼質(zhì)量和結(jié)構(gòu)也就很難得到保障,甚至通常會(huì)等到邏輯重復(fù)時(shí)再抽象封裝,可能只能解決了表面問(wèn)題,嚴(yán)重則會(huì)引起返工。但高級(jí)開(kāi)發(fā)者,能夠根據(jù)業(yè)務(wù)的特點(diǎn),抽象出軟件最合理的設(shè)計(jì),使得程序具有良好的可讀性和擴(kuò)展性,通常一開(kāi)始寫出的邏輯就為了以后的重用。許多開(kāi)發(fā)框架就是一步步抽象/埋坑/優(yōu)化而來(lái)的。
(圖片源自網(wǎng)絡(luò))
包括各領(lǐng)域的頂尖高手,他們之所以能在自己的領(lǐng)域上,有深刻和精到的認(rèn)識(shí),能夠解決復(fù)雜困難的問(wèn)題,并且能夠不斷產(chǎn)生創(chuàng)造性的想法并付諸實(shí)踐,除了具備大量的知識(shí)積累外,也依賴于其個(gè)人的抽象能力。像數(shù)學(xué)、物理、化學(xué)以及其他各學(xué)科中的各種各樣的公式,它們都是抽象思考的結(jié)果。2、抽象能力,能把復(fù)雜的問(wèn)題變簡(jiǎn)單我之前看過(guò)一個(gè)產(chǎn)品經(jīng)理分享的案例,說(shuō)他給大神級(jí)別的人物匯報(bào)產(chǎn)品方案的時(shí)候,被對(duì)方為難,對(duì)方反復(fù)說(shuō)一句話:不要說(shuō)這些具象的東西,講一些抽象的概念。
當(dāng)時(shí)他很不理解,方案最終不是要看具體的產(chǎn)品原型嗎?為什么又要抽象呢?
在后來(lái)的工作中,他才意識(shí)到能講出抽象的概念有多重要。因?yàn)榘咽虑橄霃?fù)雜很容易,但是把復(fù)雜的事情想簡(jiǎn)單,是個(gè)需要功力的活。
從簡(jiǎn)單到復(fù)雜,更突出全面性,多積累經(jīng)驗(yàn)多假設(shè)一些情況就可以。但從復(fù)雜到簡(jiǎn)單,則需要從表面看到本質(zhì),從片面看到整體,然后提煉出共同的特征。 (圖片源自網(wǎng)絡(luò))
作為產(chǎn)品,要滿足的,往往是一個(gè)需求類別而不是具體的某個(gè)需求,所以一定會(huì)考慮代碼的復(fù)用性、組件的復(fù)用性、同一個(gè)功能對(duì)不同場(chǎng)景的復(fù)用性。有了復(fù)用的能力,才能夠用更少的開(kāi)發(fā)去滿足更多場(chǎng)景的同類需求問(wèn)題。因此,一個(gè)具備抽象能力的產(chǎn)品經(jīng)理,是反復(fù)從一個(gè)具體的需求,看到一類的需求,看到衍生的相關(guān)的需求,甚至再對(duì)需求進(jìn)行分類,看到更高層面的需求,進(jìn)而系統(tǒng)性解決同類的需求的循環(huán)訓(xùn)練。如此反復(fù)訓(xùn)練,當(dāng)他們?cè)儆龅綇?fù)雜問(wèn)題時(shí),便比其他人,能更迅速直擊到本質(zhì)而簡(jiǎn)單的重點(diǎn)上。在我們的生活里,利用抽象把復(fù)雜的問(wèn)題變得簡(jiǎn)單的場(chǎng)景也有很多。 (圖片源自網(wǎng)絡(luò))
即使不標(biāo)出各個(gè)站點(diǎn)之間相隔的具體距離,也沒(méi)有標(biāo)出它們的具體位置,僅僅只是提取了必需的信息,就能將整個(gè)復(fù)雜的地鐵體系簡(jiǎn)單地表現(xiàn)出來(lái)。我們只要有地鐵路線圖,就可以知道要怎樣去各個(gè)站。
還有日歷,日歷將日期和星期的概念用簡(jiǎn)單的一連串的數(shù)字排列表現(xiàn)出來(lái),我們?cè)诳慈諝v時(shí),就可以直觀地理解日期、星期以及月份。這是因?yàn)槿諝v將這些概念抽象化地、精準(zhǔn)地表現(xiàn)了出來(lái)。臺(tái)灣大學(xué)哲學(xué)系主任傅佩榮,在《西方哲學(xué)課》中談到哲學(xué)是什么時(shí),問(wèn)了大家兩個(gè)問(wèn)題。第一個(gè)問(wèn)題,你到全世界任何一所圖書館去查找書,可以發(fā)現(xiàn)編號(hào)都是從“1”開(kāi)始,請(qǐng)問(wèn):編號(hào)“1”的會(huì)是什么?是哲學(xué)。哲學(xué)為什么排第一呢?因?yàn)槭篱g所有的學(xué)問(wèn)分門別類,只有哲學(xué)是一個(gè)整合性的學(xué)問(wèn),把各種學(xué)問(wèn)整合起來(lái)找到重點(diǎn),給你一個(gè)明確的歸納。第二個(gè)問(wèn)題,你看到有些人明明研究的是數(shù)學(xué)、物理、化學(xué),或者專攻社會(huì)學(xué)、心理學(xué)、人類學(xué),但是他們研究到最后所得到的最高的學(xué)位都稱作“哲學(xué)博士”,這又是怎么回事呢?在西方傳統(tǒng)中,經(jīng)過(guò)整個(gè)中世紀(jì)的發(fā)展,到近代的時(shí)候,他們認(rèn)為哲學(xué)是所有學(xué)問(wèn)里面最特別的,它可以稱作“學(xué)問(wèn)的學(xué)問(wèn)”“知識(shí)的知識(shí)”或“科學(xué)的科學(xué)”,是各門學(xué)科里面最具綜合性的學(xué)科。 (圖片源自網(wǎng)絡(luò))
因?yàn)檎軐W(xué)是一門人們對(duì)具體事物進(jìn)行抽象與概括、說(shuō)理與解釋、透過(guò)現(xiàn)象看本質(zhì)的學(xué)科,它是抽象思考的過(guò)程。因此可以說(shuō),抽象思考體現(xiàn)了綜合能力,是一種元能力,即“能力的能力”。我們每個(gè)人都擁有元能力,比如,我們知道反思,能說(shuō)出某一道題的解題思路,能不斷地追問(wèn)自己為什么,甚至能隱隱感知?jiǎng)e人在想什么。很多傳統(tǒng)廣告人寫文案,更追求靈感,想個(gè)創(chuàng)意需要對(duì)環(huán)境和心情提出要求,否則就難以創(chuàng)作。后來(lái),一些優(yōu)秀文案行家出現(xiàn)了,告訴大家寫文案不依賴靈感,是有科學(xué)方法的,只要掌握了科學(xué)的營(yíng)銷方法,寫文案就像做數(shù)學(xué)題一樣套用公式就可以推導(dǎo)出來(lái),于是傳統(tǒng)廣告人懵逼了。這套科學(xué)寫文案方法,是將大量文案的規(guī)律和方式總結(jié)成系統(tǒng)性的知識(shí)。這過(guò)程其實(shí)就一種能力的能力。它最大的優(yōu)勢(shì)就是,能夠建立一個(gè)完整的知識(shí)架構(gòu),來(lái)提高學(xué)習(xí)認(rèn)知和解決問(wèn)題的效率。 (圖片源自網(wǎng)絡(luò))
綜合以上,抽象能力非常重要,甚至決定著一個(gè)人能力水平的上限。
正如每個(gè)高級(jí)開(kāi)發(fā)工程師都能做到:一旦掌握了某個(gè)語(yǔ)言的語(yǔ)法,就能將問(wèn)題映射成語(yǔ)法,寫出合格的代碼。如果你不想一輩子都做一個(gè)初級(jí)碼農(nóng),想寫出來(lái)一些自己也感覺(jué)到滿意的代碼,不被更高級(jí)的編碼工具取代,你需要學(xué)會(huì)抽象。抽象能力的訓(xùn)練和培養(yǎng),離不開(kāi)對(duì)大量具體事物的觀察,發(fā)現(xiàn)共同規(guī)律并加以演繹變化,最終找到提高效率的解決路徑。
這個(gè)過(guò)程就是學(xué)編程的過(guò)程。編程中抽象思維運(yùn)用的極為普遍。一般在實(shí)際工作中,常常需要把問(wèn)題的實(shí)體對(duì)象,根據(jù)需求表示為各種數(shù)據(jù)結(jié)構(gòu)如樹(shù)、堆、棧等,把業(yè)務(wù)邏輯過(guò)程表示為各種算法如排序和查找等。抽象表示是解決問(wèn)題的第一步,也是關(guān)鍵的一步。在程序員的實(shí)踐中,一旦問(wèn)題被準(zhǔn)確的無(wú)歧義表示出來(lái)了,解決方案就烘云托月般地呈現(xiàn)出來(lái)了。這就是“數(shù)據(jù)即代碼,代碼即數(shù)據(jù)”的道理。這種反復(fù)把現(xiàn)實(shí)問(wèn)題轉(zhuǎn)化為機(jī)器問(wèn)題,將問(wèn)題簡(jiǎn)化為概念模型,進(jìn)而寫成代碼的訓(xùn)練,能使人變得更加精煉和邏輯清晰。 (圖片源自網(wǎng)絡(luò))
最重要的是,編程的本質(zhì)也是為了解決生活中的實(shí)際問(wèn)題而存在的。
一個(gè)很典型的例子,我們每個(gè)人都離不開(kāi)要搭乘電梯。
當(dāng)你想從 1 樓去 14 樓,涉及了編程里起終點(diǎn)和循環(huán)的概念。從起點(diǎn) 1 出發(fā),終點(diǎn)為 14,循環(huán)計(jì)數(shù)從 1 到 14,滿足的退出循環(huán)條件,即電梯停了,門也打開(kāi)了。當(dāng)你在上升的過(guò)程中,外面有人按了按鈕,涉及了編程里的判斷語(yǔ)句。電梯的程序中,有一個(gè)判斷條件 If,判斷是否有人按了按鈕,當(dāng)條件成立,電梯就會(huì)停止。所以,開(kāi)發(fā)學(xué)編程,學(xué)的不僅僅是敲代碼,更是通過(guò)總結(jié),掌握背后一整套高效解決問(wèn)題的思維模式,來(lái)解決生活的現(xiàn)實(shí)問(wèn)題。普通人學(xué)編程也是如此。擁有編程思維的人,是為了使自己能力更加突出:邏輯清楚、能從現(xiàn)象看本質(zhì)、做事效率也非常高。生活處處有編程,“學(xué)會(huì)抽象”就是編程教會(huì)我們的其中一門重要的人生課。學(xué)會(huì)抽象,也是學(xué)會(huì)了大道至簡(jiǎn)。當(dāng)你能去除現(xiàn)象看本質(zhì),你本身就在著力同構(gòu)這個(gè)世界。大數(shù)據(jù)喧囂的時(shí)代,真正的核心其實(shí)就是解構(gòu)世界的一個(gè)個(gè)經(jīng)典算法,是算法在無(wú)比深刻地表達(dá)我們身處的現(xiàn)實(shí)世界。-END-