一個(gè)想法產(chǎn)生的背后是不斷打臉

導(dǎo)語(yǔ)

  • 下面的內(nèi)容是在學(xué)習(xí)編程思想的過(guò)程中產(chǎn)生的感想
  • “編程”其實(shí)和做很多事情一樣,掌握了步驟和方法后,會(huì)變得不那么難
  • 略去了具體的編程內(nèi)容和案例,只保留了概念(不多,只有幾個(gè))
  • 感覺(jué)邏輯挺嚴(yán)謹(jǐn)?shù)模M麤](méi)有漏洞
  • 下一步目標(biāo)是不斷回顧、運(yùn)用和驗(yàn)證這些思考。

一種開(kāi)發(fā)方法

  • 封裝(Encapsulation)
  • 泛化(Generalization)
  • 接口設(shè)計(jì)(Interface design)
  • 重構(gòu)(Refactoring)

這是一種開(kāi)發(fā)方法,它有缺點(diǎn),但如果在開(kāi)始編程時(shí)不清楚如何將程序分成合適的函數(shù)時(shí)(問(wèn)題分解),這個(gè)方法會(huì)有效。

封裝:把一段代碼用函數(shù)包裹起來(lái),成為封裝。

泛化:給函數(shù)添加參數(shù)的過(guò)程。也就是把前面封裝的函數(shù)內(nèi)的常數(shù)給參數(shù)化。

  • 接口設(shè)計(jì):設(shè)置參數(shù)、返回值,注釋函數(shù)作用。這個(gè)步驟算是包含在泛化、重構(gòu)之內(nèi),是一個(gè)很具體的方法。

重構(gòu):重新組織程序,以改善接口,提高代碼復(fù)用。

這個(gè)開(kāi)發(fā)方法的具體步驟是”封裝-泛化“循環(huán)

  • 最開(kāi)始用一些常數(shù)寫(xiě)一些小程序,而不需要定義函數(shù)
  • 一旦程序運(yùn)行成功,識(shí)別出其中一段完整的部分,把它封裝成一個(gè)函數(shù)
  • 泛化這個(gè)函數(shù),添加合適的形式參數(shù)
  • 循環(huán)上面3個(gè)步驟,直到得到一組可行的函數(shù)
  • 尋找可以使用重構(gòu)來(lái)改善程序的機(jī)會(huì)。例如,發(fā)現(xiàn)程序中幾處相似的地方,可以考慮將他們抽取出來(lái)做成一個(gè)通用的函數(shù)

問(wèn)題求解:“封裝-泛化”循環(huán)的原因、背后的原理

問(wèn)題求解(Problem Solving):

界定問(wèn)題
創(chuàng)造性地思考解決方案
清晰準(zhǔn)確地表達(dá)解決方案的能力

(formulate problems)
(think creatively about solutions)
(express a solution clearly and accurately)

這樣寫(xiě)出來(lái)其實(shí)很容易誤導(dǎo)人,會(huì)讓人覺(jué)得這三個(gè)步驟都是小步驟,很容易完成。但如果真的帶著這樣的認(rèn)識(shí)來(lái)處理問(wèn)題的話,很可能是碰一鼻子灰。而真實(shí)的情況是:每一步都有單獨(dú)的值得注意的方法,并且這三個(gè)大步驟也是緊密聯(lián)系著的。

上一節(jié)提到的編程概念”封裝-泛化“的循環(huán)重復(fù),這一過(guò)程就是在整個(gè)”問(wèn)題求解“中產(chǎn)生的。也就是說(shuō)”問(wèn)題求解“是更抽象的思考層面,而”封裝-泛化“的循環(huán)重復(fù)就是具象化的操作層面。

可是………………

但是………………

到這里我發(fā)現(xiàn)了問(wèn)題。不得不打臉承認(rèn)我犯了一個(gè)錯(cuò)誤:強(qiáng)行歸因,強(qiáng)行找聯(lián)系。

“問(wèn)題求解”的步驟和“封裝-泛化-重構(gòu)”的步驟其實(shí)并不是一一對(duì)應(yīng)了??墒俏壹庇谡页觥俺晒?,急于獲得“正面反饋”的心態(tài)讓我在看到一些貌似是關(guān)聯(lián)的現(xiàn)象中,在還沒(méi)有證實(shí)之前,不假思索地就確認(rèn)了。

這雖然是題外話,跟筆記的主題無(wú)關(guān),但又確實(shí)很值得記錄下來(lái),因?yàn)檫@確確實(shí)實(shí)是我們經(jīng)常犯的邏輯錯(cuò)誤。我們的”系統(tǒng)一”(情感、直覺(jué)大腦)和“系統(tǒng)二”(理性、邏輯大腦)交互時(shí)產(chǎn)生的BUG。(詳情參考《思考,快與慢》《超越智商》等書(shū)籍)

回到發(fā)現(xiàn)的這個(gè)錯(cuò)誤中來(lái)。這兩種循環(huán)很可能并不是一一對(duì)應(yīng)的。

先說(shuō)界定問(wèn)題

我首先想到的就是《金字塔原理》一書(shū)中介紹的界定問(wèn)題的方法。不過(guò)現(xiàn)在想來(lái),有可能是作者芭芭拉·明托在了解了科學(xué)家們的思考方法后借鑒領(lǐng)悟的也說(shuō)不定……誰(shuí)知道呢,因?yàn)樽髡咴诮榻B界定問(wèn)題的方法“連續(xù)分析”時(shí),在“連續(xù)分析”這個(gè)名稱后加了括號(hào)備注:

連續(xù)分析(統(tǒng)計(jì)學(xué)上稱為序列分析)

其實(shí)現(xiàn)在想來(lái),整個(gè)《金字塔原理》都是在學(xué)習(xí)科學(xué)家們的思考方法——理性、邏輯。書(shū)里面在很多地方也提及了相關(guān)的東西,比如附錄1等。

關(guān)于界定問(wèn)題,《金字塔原理》說(shuō)了很多,花了很多篇幅,還加了附錄。但是之所以花這么多篇幅,除了有湊字?jǐn)?shù)的嫌疑之外,還有就是大量的介紹了各種具體的情況,都說(shuō)具體問(wèn)題具體分析,從這個(gè)角度看,作者還是很嚴(yán)謹(jǐn)負(fù)責(zé)的……

那么界定問(wèn)題的核心方法一張圖就能展示完:

連續(xù)分析

首先,面對(duì)一個(gè)問(wèn)題的時(shí)候,先看看這個(gè)問(wèn)題是具體的眼睛能看見(jiàn)的東西,還是看不見(jiàn)的通過(guò)想象的東西。

  • 肉眼能看見(jiàn)的:觀察這個(gè)東西,抓住每一個(gè)細(xì)節(jié),然后分解這個(gè)東西,分解成自己熟悉的模塊(chunks)。

  • 看不見(jiàn)的:思考問(wèn)題的上下文(context)是什么,也就是背景。

然后,明確我想要達(dá)到的目標(biāo)(R2)是什么,再審視現(xiàn)狀(R1),R2與R1的差距就是現(xiàn)在的問(wèn)題、困擾。這個(gè)步驟就是俗話說(shuō)的“不忘初心”……仔細(xì)想想平時(shí)我們很容易迷失方向,迷茫,不知所措,究其原因很可能就是把“初心”(最初的目標(biāo))給忘了。

這里有一個(gè)需要注意的細(xì)節(jié)。因?yàn)镽2、R1之間的差距,我們發(fā)現(xiàn)了問(wèn)題,但這個(gè)問(wèn)題能迅速找到對(duì)應(yīng)的解決方案嗎?這就是關(guān)鍵。換句話說(shuō),解決方案是否已經(jīng)存在?如果沒(méi)有現(xiàn)成的解決方案,則要花時(shí)間去尋找。

假定解決方案已存在,或者說(shuō),在我們不斷界定問(wèn)題的過(guò)程中(R1到R2、R3到R4、R5到R6),經(jīng)歷了問(wèn)題、困惑被不斷分解的過(guò)程后,在最后一步找到了解決方案,然后就逆推回去。這也是一個(gè)逆反演繹推理的過(guò)程:從結(jié)論逆推回到-小前提-大前提。

再說(shuō)思考解決方案

到了這一步,我突然發(fā)現(xiàn):

  • 其實(shí)在“界定問(wèn)題”這個(gè)過(guò)程里,“思考解決方案”是嵌在其中的。也就是說(shuō),這個(gè)過(guò)程產(chǎn)生了一個(gè)“問(wèn)題-解決方案”的重復(fù)循環(huán)。

這和“封裝-泛化”循環(huán)是一樣的!這驗(yàn)證了我之前“腦袋一熱”產(chǎn)生的聯(lián)想:

前面說(shuō)到”封裝-泛化“的循環(huán)重復(fù),這一過(guò)程就是在整個(gè)”問(wèn)題求解“中產(chǎn)生的。也就是說(shuō)”問(wèn)題求解“是更抽象的思考層面,而”封裝-泛化“的循環(huán)重復(fù)就是具象化的操作層面。

當(dāng)然還是有細(xì)節(jié)上的差異的,因?yàn)榘男畔⒘坎灰粯樱狈庋b-泛化“循環(huán)更偏向于”解決方案“這一邊。換句話說(shuō),”問(wèn)題-解決方案“循環(huán)包含了”封裝-泛化“循環(huán)。不過(guò)他們很接近,從整體上可以看作是一樣的。

通過(guò)展開(kāi)思考分析,這里我又推翻了之前自己”冷靜下來(lái)”后的否定,重新驗(yàn)證了之前的假設(shè),再次打臉……不過(guò),這個(gè)過(guò)程也實(shí)實(shí)在在地是對(duì)“假設(shè)-驗(yàn)證”方法的一次運(yùn)用。詳情參考:科學(xué)實(shí)驗(yàn)方法

關(guān)于“思考解決方案”這一個(gè)步驟還有3個(gè)需要討論的點(diǎn):

  • 相關(guān)領(lǐng)域內(nèi)概念的擴(kuò)充
  • 不斷地重復(fù)練習(xí)
  • 記錄下來(lái),形成書(shū)面文檔,以便復(fù)用

在界定好問(wèn)題后,開(kāi)始找解決方案,那解決方案又怎么找呢?這就需要我們掌握足夠多的概念,以及由這些概念組成的套路。學(xué)習(xí)的意義、看書(shū)的意義、請(qǐng)教老師的意義也就在此——為了掌握概念套路

但是,只是知道了“概念”和“套路”還不夠,那就只能當(dāng)解說(shuō)員,都知道但就是做不到(當(dāng)然,以解說(shuō)作為職業(yè)賺錢就是另一種性質(zhì)了)。而知道做到的關(guān)鍵點(diǎn)就在于:不斷地重復(fù)練習(xí)。這也是一個(gè)很樸素的道理,很多人都知道,但毫不意外的就是做不到。原因很簡(jiǎn)單,這么做太枯燥,且大多數(shù)都沒(méi)有即時(shí)反饋,也就是不能馬上看到成果。這種現(xiàn)實(shí)是我們的”系統(tǒng)一”(情感、直覺(jué)大腦)所不能忍受的!再加上現(xiàn)在這個(gè)聲色犬馬的時(shí)代,有太多分心的東西……如果想要知道做到,除了下決心遠(yuǎn)離”娛樂(lè)“的東西外,還有就是持續(xù)跟進(jìn)自己的練習(xí),這樣能盡可能的獲得即時(shí)反饋,滿足”系統(tǒng)一”(情感、直覺(jué)大腦)的需求。

“持續(xù)跟進(jìn)”的一個(gè)重要方法就是“記錄”。看書(shū)要做筆記,練習(xí)后要復(fù)盤都是這樣。最好是能把這些都形成書(shū)面的文檔,以便復(fù)用。由此也需要我們勤于“寫(xiě)寫(xiě)寫(xiě)”。畢竟這是一種人類文明突進(jìn)以來(lái)最重要的傳承方式之一,因?yàn)榇_實(shí)很有用……

最后說(shuō)說(shuō)表達(dá)解決方案的能力

這一點(diǎn)我們馬上就會(huì)想到上面討論的“記錄”。確實(shí)這是很重要的一種表達(dá)方式,但還有更重要的,隱藏在“表達(dá)”背后的東西:重構(gòu)(refactoring)。因?yàn)橛辛恕爸貥?gòu)”,解決方案可以得到更精煉、準(zhǔn)確地表達(dá)。

“重構(gòu)”的具體含義是:在不斷地進(jìn)行“封裝-泛化”的循環(huán)后,我們從產(chǎn)生的眾多解決方案里歸納出重復(fù)出現(xiàn)的,提取出這些通用的、重復(fù)的點(diǎn),再次封裝他們,使解決方案更有效率,更簡(jiǎn)潔。這個(gè)方法其實(shí)和《金字塔原理》中表達(dá)的邏輯是一樣的:都是使用歸納法找出性質(zhì)一樣的東西作為一類,這樣提煉出幾個(gè)要點(diǎn),表達(dá)時(shí)就說(shuō)這幾個(gè)要點(diǎn),有需要時(shí)再詳細(xì)展開(kāi)其中一個(gè)要點(diǎn)即可(在“重構(gòu)”中就是再次定制這個(gè)通用點(diǎn),以滿足特定需求)。

函數(shù)

這篇筆記本來(lái)是為了記錄一些概念的,沒(méi)想到在記錄之中突然冒出很多感想。所以把函數(shù)這個(gè)本來(lái)在前面的筆記放在了最后。

本來(lái)是想偷懶把函數(shù)的筆記略過(guò)的,因?yàn)橛X(jué)得函數(shù)的筆記沒(méi)多少,挺簡(jiǎn)單的。但仔細(xì)想了一下,發(fā)現(xiàn)有兩個(gè)函數(shù)的概念很重要,殊不知開(kāi)發(fā)中很多很多方面都要涉及到,并且在Python里,很多很方便的功能都是已經(jīng)封裝好的函數(shù)。

  • 實(shí)參和形參:
    要理解函數(shù)的運(yùn)用,就先得理解兩個(gè)概念:實(shí)際參數(shù)和形式參數(shù)(argument and parameter),以及它們之間的關(guān)系。

實(shí)參是在函數(shù)里真正要使用的那個(gè)“值”,而形參是在函數(shù)還沒(méi)被調(diào)用時(shí),為了完整呈現(xiàn)函數(shù),而設(shè)置的”樣例“。所以,在調(diào)用函數(shù)并輸入了實(shí)際參數(shù)后,這個(gè)實(shí)際參數(shù)會(huì)相應(yīng)地取代形式參數(shù)所在的地方,然后把自己代入這個(gè)位置。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容