编程就是压缩
Programming?is?Compression
業(yè)務(wù)需求會(huì)不斷扔各種案例過來,這樣的情況下,應(yīng)該怎樣怎樣。編程的過程就是把各種各樣的具體case進(jìn)行壓縮表達(dá)的過程。除了需求,各種 bug report 也是輸入。
首先我們來看一下目標(biāo)函數(shù)的問題
靜態(tài)壓縮 v.s. 泛化能力
Static Compression v.s. Generalization Ability
static compression 的目標(biāo):給定所有的當(dāng)前需求,最小化整體的實(shí)現(xiàn)代碼量。方法就是能復(fù)用就復(fù)用,不能簡單的復(fù)用的,創(chuàng)造條件也要強(qiáng)行復(fù)用。
generalization ability 的目標(biāo):給定過去的需求,進(jìn)行合理的預(yù)測,最小化遷移到未來可能的新需求的成本。其實(shí)現(xiàn)手段就是保持代碼整潔,有結(jié)構(gòu)。但是問題在于什么叫“有結(jié)構(gòu)”很難學(xué)習(xí)。相反,最小化整體的實(shí)現(xiàn)代碼量是一個(gè)更容易銷售,也更容易學(xué)習(xí)的目標(biāo)。
《業(yè)務(wù)邏輯拆分模式》所描述的“主板+插件”的結(jié)構(gòu),就是給“有結(jié)構(gòu)”提供一個(gè)易于學(xué)習(xí)的目標(biāo)函數(shù)。在給定如下條件的前提下:
主板不反向依賴插件
插件之間不互相編譯期依賴,運(yùn)行時(shí)依賴必須通過主板開 SPI 來實(shí)現(xiàn)數(shù)據(jù)互通
實(shí)現(xiàn)了業(yè)務(wù)的需求
用戶體驗(yàn)的一致性
這些條件都滿足之后,讓“主板的代碼行數(shù)”越少,就是越好。
這里“合理的預(yù)測”似乎和不要預(yù)先設(shè)計(jì)是矛盾的。然而所有的“泛化”都是某種預(yù)測。整潔有結(jié)構(gòu)的代碼“賭”的是什么呢?賭的就是新需求大概率是 localized 的。
規(guī)律性 v.s. 特異性
Regularity v.s. Specificity
壓縮的前提是對(duì)象本身具有內(nèi)在的規(guī)律性。壓縮的過程就是把規(guī)律性的部分和特異性的部分分離出來。這個(gè)也就體現(xiàn)在了各種“中臺(tái)”,“低代碼”,“DSL”的說辭之中,所謂一部分人搞定 80%,剩下的領(lǐng)域?qū)<?#xff08;也就是處理特異性的人)去搞定特異性的 20%。
然而這里的前提是處理 20% 的人要先知道之前的工序做了哪部分的 80%,才能知道自己要做哪 20%。wetware 相比 hardware 就是自然進(jìn)化的速度太慢,千兆網(wǎng),萬兆網(wǎng),升級(jí)速度杠杠的。但是人與人的溝通還是要靠非常低效率的文字理解和聲波通信。
無論這 20% 怎么補(bǔ)齊,是 DSL 傳參也好,是給生成的代碼打個(gè)補(bǔ)丁也好。只要代碼量比較大,和那 80% 部分的溝通就會(huì)越多。除非需求內(nèi)在的 Regularity 非常強(qiáng),可以用極其少量的參數(shù)組合已有功能來表達(dá)新需求,否則大概率寫這 20% 代碼的人會(huì)非常痛苦。這也是為什么“低代碼”無法流行的根本原因。
機(jī)器學(xué)習(xí)
一部分人處理 Regularity,一部分人處理 Specificity:這就是所謂“中臺(tái)”,“低代碼”,“DSL”。核心是 specificity 部分要足夠小,才能彌補(bǔ)溝通成本。
人類來提供 Regularity,機(jī)器處理 Specificity:一開始是 logical programming,人類要提供非常多的 regularity。后來是 probabilistic programming,人類需要提供 generating function 來編碼專家經(jīng)驗(yàn)到概率分布里。到后來 deep neural network,人類需要用 convolution filter 來用所謂 inductive bias 的方式 encourage 神經(jīng)網(wǎng)絡(luò)往某個(gè)方向?qū)W習(xí)
hinton 提出的 capsule network 的理想就是能把人類提供的 inductive bias 最小化,只提供
recursive:這個(gè)世界是層次化組織的,迭代的
part-whole:一個(gè)child僅從屬于一個(gè)parent
然后來機(jī)器去自監(jiān)督學(xué)習(xí)到剩余的部分。但是要把“這個(gè)世界是層次化組織的”這樣的 regularity 表達(dá)出來是及其困難的。
CNN 本身是一層堆一層的,但是其學(xué)習(xí)到的特征并非如人所愿那么層次化。CNN堆了96層,也未必就能確定96層的 part-whole 就是足夠了的。
Autoencoder 號(hào)稱要搞個(gè) bottleneck,就是要把 bottleneck 體現(xiàn)為中間 layer 的參數(shù)數(shù)量要更少一點(diǎn)上。這樣的表達(dá)太“直白”了,效果并不好。GAN 等一眾后續(xù)就是把這個(gè) bottleneck 的參數(shù)限制給去掉了。
樸素直白地拿 architecture 的幾何形狀表達(dá) inductive bias 是不 work 的。AGI 所需的 inductive bias 不太可能那么快被找到表達(dá)的方式。即便找到了,也未必能在當(dāng)前的硬件下展示其威力而被 bechmarker 們所忽略。
所以更可能的情況是讓人類來表達(dá)“規(guī)律性”,所謂專家經(jīng)驗(yàn)。然后由機(jī)器來處理“特異性”。probabilistic programming 這樣的人機(jī)混合的編程方式會(huì)得到更廣泛的應(yīng)用。越來越多的程序員會(huì)從直接編碼規(guī)則來駕馭機(jī)器,變成“聲明式編程”。把規(guī)律性的部分提取成 what,讓機(jī)器去找到 how。
點(diǎn)擊”閱讀原文“,訪問《業(yè)務(wù)邏輯拆分模式》電子書?https://autonomy.design
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
- 上一篇: Go 还是需要泛型的
- 下一篇: Go mod 七宗罪