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