設(shè)置
  • 日夜間
    隨系統(tǒng)
    淺色
    深色
  • 主題色

三體,但是寫軟件

2022/12/2 21:09:07 來源:中科院物理所 作者:Krste?i?gori? 責(zé)編:遠(yuǎn)生

代碼結(jié)構(gòu)之間的關(guān)聯(lián)是隨時(shí)間推移逐漸形成的,因?yàn)槲覀儗⒉煌牟糠忠暈檎w的一部分,在實(shí)際操作中,我們應(yīng)盡量避免這樣做。

最近幾個(gè)月有很多工作需要做,我過得比較艱難,需要休息一下。我的放松方式是閱讀,我選擇了劉慈欣的《三體》。開始閱讀之前,我從未了解過這本書,也不了解三體問題,但是讀完之后我震驚了?!度w》是一本科幻小說,是地球往事三部曲中的第一部。這本書構(gòu)造了一個(gè)三體問題 —— 經(jīng)典力學(xué)中最復(fù)雜的問題之一,并圍繞它講述了一個(gè)故事。所以讓我,在不破壞最初故事的前提下,用我自己的方式做同樣的事情。

三體問題

為了解釋三體問題以及它和軟件開發(fā)的聯(lián)系,讓我從單體問題開始解釋。單體問題更常被稱為有心力問題(the central-force problem)。有心力問題試圖決定一個(gè)受到中心力作用的粒子的運(yùn)動(dòng)狀態(tài),這個(gè)有心力的力源位置固定。更直白地講,恒星可以視為靜止的。行星的運(yùn)動(dòng)可以用三角函數(shù)表示

考慮稍微復(fù)雜一點(diǎn)的情況,讓我們想象兩個(gè)有質(zhì)量的物體通過引力互相影響彼此的運(yùn)動(dòng)狀態(tài),也就是二體問題。這可以被用來描述地球和月球圍繞對(duì)方做的運(yùn)動(dòng)?;蛘吲e一個(gè)更好的例子,冥王星和冥衛(wèi)一,就像下面動(dòng)圖描述的一樣。

冥王星 — 冥衛(wèi)一系統(tǒng)的側(cè)視圖,顯示出冥王星繞著它外面的一點(diǎn)公轉(zhuǎn)。(維基百科)

對(duì)于包括引力在內(nèi)的許多種力來說,廣義的二體問題可以被轉(zhuǎn)化成兩個(gè)單體問題,因此二體問題可以完全求解。因此,二體問題也存在著對(duì)應(yīng)的解決方案。

但如果我們?cè)偌尤胍粋€(gè)有質(zhì)量的物體,將整個(gè)系統(tǒng)轉(zhuǎn)變?yōu)槿w問題,那么事情就變得不可預(yù)測起來,常常陷入混亂。對(duì)于絕大多數(shù)初始條件,三體問題不像單體或二體問題那樣有一般的封閉解。

軟件開發(fā)中 n 體問題的建立

三體問題與軟件開發(fā)有什么關(guān)系呢?事實(shí)上并無關(guān)系。但如果思考這兩件事,我們可以發(fā)現(xiàn)它們有相似之處。彼此影響的強(qiáng)耦合的功能與極弱耦合功能可以在同一個(gè)系統(tǒng)中和平共存,而不會(huì)迫使其中之一發(fā)生改變。讓我們將軟件開發(fā)與 n 體問題做一個(gè)比較。

最開始事情很簡單而且易于理解。我們有一個(gè)主角,也就是一個(gè)中心,其他所有事情都圍繞它展開。軟件功能不多,不會(huì)彼此沖突。

比如,我們打算開發(fā)一個(gè)庫存管理應(yīng)用。我們需要做的只是插入新條目、增刪數(shù)量以及了解庫存狀態(tài)。所以我們完成了這些功能。

過了一段時(shí)間我們需要添加新東西。最好能開一家網(wǎng)店來線上售賣產(chǎn)品。因此我們開始為庫存管理軟件添加新功能。

首先,要添加一個(gè)網(wǎng)頁。我們獲取包含可用數(shù)量的庫存狀態(tài)?,F(xiàn)在這個(gè)網(wǎng)頁需要描述可用庫存的狀態(tài),但這并不意味著這些原本可用的商品不在庫存中了,它們只是換了一種狀態(tài)。所以我們需要在庫存中設(shè)置一種新狀態(tài)。我們需要掌握“現(xiàn)貨”狀態(tài)的商品數(shù)量,以及“可售”狀態(tài)的商品數(shù)量。

但是現(xiàn)在需要更改為網(wǎng)店獲取可用數(shù)量的操作,以反映這一變化。如果我們不能賣掉它們,那么倉庫里到底有多少商品其實(shí)并不重要。我們只想在網(wǎng)店展示“現(xiàn)貨”數(shù)量。我們需要再次修改網(wǎng)店。

系統(tǒng)中一部分物體的重力吸引其他部分改變運(yùn)動(dòng)狀態(tài)。這兩部分之間存在競爭,直到二者達(dá)到穩(wěn)定狀態(tài)。一旦我們優(yōu)化了功能,事情就會(huì)回到最初可預(yù)測的狀態(tài)。所有事情都按計(jì)劃運(yùn)行,這讓我們很高興。我們?nèi)匀豢上鄬?duì)容易地預(yù)測接下來會(huì)發(fā)生什么,并知道一個(gè)部分的改變會(huì)如何影響其他部分。

兩個(gè)質(zhì)量有“微小”差別的物體繞共同的質(zhì)心運(yùn)動(dòng)(維基百科)

但事情可以被優(yōu)化。我們可以為顧客提供快遞服務(wù)。因此我們檢查了現(xiàn)有的系統(tǒng),并在每一步都做出改變??爝f服務(wù)改變了庫存,庫存改變了網(wǎng)站設(shè)計(jì),網(wǎng)站又反過來改變了快遞服務(wù),快遞服務(wù)改變了庫存……

快遞服務(wù)擴(kuò)展了商業(yè)貿(mào)易。一個(gè)倉庫不再能滿足需求,我們希望在更多地方發(fā)展生意,并且系統(tǒng)需要能支持這種工作方式。但這將如何影響現(xiàn)有的系統(tǒng)?庫存需要調(diào)整以適應(yīng)多個(gè)地點(diǎn)。而由于網(wǎng)站會(huì)減少庫存的商品數(shù)量,它也需要被改造以支持多個(gè)地點(diǎn)。但怎么做到這些呢?這又要求庫存和快遞服務(wù)也做出改變…… 好混亂啊。

位于不等邊三角形頂點(diǎn)的三個(gè)初始速度為零的相同物體的近似軌跡(維基百科)

回到單體問題

我們?cè)撊绾伪苊膺@個(gè)問題?我們有怎樣才能避免某一個(gè)功能對(duì)其他功能產(chǎn)生嚴(yán)重影響?

太陽系有許多質(zhì)量足夠大的行星,它們可以影響彼此的運(yùn)動(dòng)狀態(tài)。然而,如果我們?cè)噲D預(yù)測地球圍繞太陽公轉(zhuǎn)的軌道,我們完全可以忽略所有行星而只關(guān)注太陽和地球。這會(huì)給我們足夠好的關(guān)于實(shí)際運(yùn)動(dòng)的初始近似。對(duì)于木星和其他任何行星軌道的預(yù)測也是一樣。

如果我們將軟件系統(tǒng)的兩個(gè)功能解耦,我們就可以像太陽系中的行星一樣處理它們。一個(gè)行星的重力不足以影響另一個(gè)行星的軌道。雖然它們確實(shí)仍然互相影響,但這些影響帶來的改變不會(huì)十分明顯,一些情況下甚至不存在。

設(shè)想如果我們?cè)噲D計(jì)算未來十年復(fù)活節(jié)的日期。復(fù)活節(jié)是一個(gè)基督教節(jié)日,在每年春分后第一個(gè)月圓夜后的第一個(gè)周日。當(dāng)我們計(jì)算這些日期時(shí),我們真的在意木星的 79 個(gè)衛(wèi)星嗎?當(dāng)然不,我們也不必這么做。

我們把軟件開發(fā)的解決方案分解成許多小部分,讓每一部分都圍繞著“太陽”運(yùn)行。這里的“太陽”可以是信息中介、服務(wù)總線、或者只是已經(jīng)建立好的契約(接口)。我們決定我們的“太陽系”需要多大程度的解耦。環(huán)繞太陽運(yùn)動(dòng)的小部件是模塊、域還是微服務(wù)并不重要,重要的是部件之間要盡可能地獨(dú)立。這會(huì)讓它們更容易被理解。用這種方式計(jì)算復(fù)活節(jié)日期甚至不需要知道木星有 79 個(gè)衛(wèi)星。

月亮顯著地影響了地球的軌道,這是事實(shí)。如果我們關(guān)心太陽和地球的關(guān)系,那么我們并不是在談?wù)摰厍蚝驮铝镰h(huán)繞太陽的軌道,我們只是在談?wù)摰厍虻能壍?。無論一個(gè)功能多么復(fù)雜(比如木星有 79 個(gè)衛(wèi)星),在整個(gè)系統(tǒng)(比如太陽系)中我們只需要將它們視為一個(gè)整體。

用這種方法我們并不需要處理太陽系中(大約)一百二十萬個(gè)天體,也不需要處理大約 700 個(gè)行星、小行星或衛(wèi)星。我們只考慮八大行星。因?yàn)橐话愣?,?dāng)我們談?wù)撎栂禃r(shí),我們只關(guān)心這八大行星。盡管這樣計(jì)算結(jié)果并不完美,但對(duì)我們來說已經(jīng)足夠精確,不會(huì)在工作中帶來問題。

簡化問題

當(dāng)我們考慮一個(gè)倉庫的庫存,我們到底在考慮什么?或許是一個(gè)大的倉庫和里面存儲(chǔ)的許多貨品。倉儲(chǔ)的工作是什么?為了存儲(chǔ)商品直到被它們被賣出。我們的軟件系統(tǒng)應(yīng)該只考慮這些功能。

網(wǎng)店應(yīng)該只負(fù)責(zé)展示商品并創(chuàng)建購買。但網(wǎng)店中的購買需要改變庫存狀態(tài)。所以如何解決這個(gè)問題?現(xiàn)在有很多解決方法,但請(qǐng)恕我直言。

購買已經(jīng)是一個(gè)足夠復(fù)雜的功能了。它獲取訂單,檢查庫存以查看是否有可購買的商品,執(zhí)行付款并創(chuàng)建運(yùn)輸。這可能看起來只是另一個(gè)功能,但由于它的大小,它可以被很容易地分成單獨(dú)的部分。

我們?yōu)閹齑鎰?chuàng)建嚴(yán)格的合同,根據(jù)合同我們可以得到所有貨物的清單、所有可用貨物的清單,可以檢查這些貨物是否可以售賣并減少它們的數(shù)量。網(wǎng)店只需知道可用的貨物。如果我們決定在某一點(diǎn)上支持軟刪除,或多個(gè)狀態(tài),就像我們?cè)谏厦娴睦又凶龅哪菢?,網(wǎng)店并不需要知道這些變化。只需更改網(wǎng)店收到的數(shù)據(jù),就可以在網(wǎng)店不知情的情況下完成上述操作。

對(duì)于“購買”這一功能,我們需要做相同的事。合同需要一個(gè)操作以完成購買。網(wǎng)店發(fā)起這一操作,然后它的任務(wù)就完成了?!百徺I”這一功能接管。它檢查是否有可用的貨品,然后如果一切正常,它完成購買并相應(yīng)地減掉庫存商品數(shù)量。

縱觀整個(gè)系統(tǒng),我們已經(jīng)清晰地分開了所有可以獨(dú)立存在的功能(一些而不是另一些)。我們是從庫存開始的,所以它當(dāng)然有自己的系統(tǒng)。接下來我們添加了“網(wǎng)店”和“購買”兩個(gè)可以獨(dú)立實(shí)現(xiàn)的功能。

我們確實(shí)有快遞服務(wù),但目前為止整個(gè)流程并不需要知道它的存在。所以我們也應(yīng)該將其視為一個(gè)獨(dú)立系統(tǒng)。我們不應(yīng)該把它強(qiáng)行加入已有的系統(tǒng)中并讓它們相匹配。

好了。現(xiàn)在我們還沒有一個(gè)有著許多有復(fù)雜依賴性的功能的系統(tǒng)。我們有許多子系統(tǒng),每一個(gè)子系統(tǒng)都有特定的復(fù)雜度,它們共同構(gòu)成了一個(gè)相容并可持續(xù)的解決方案。

結(jié)論

建立、維護(hù)并擴(kuò)展軟件是一件復(fù)雜的事。最開始可能看起來很容易?!爸皇翘砑舆@個(gè)功能而已?!钡俏覀兲砑拥臇|西越多,方程就變得越復(fù)雜。如果我們想強(qiáng)行加入太多東西,最終我們會(huì)發(fā)現(xiàn)自己陷入了一個(gè)無法解決的問題中。而二者之間只有一線之隔。

對(duì)于多體問題,我們可以盡量簡化系統(tǒng),把它分成許多小部分。有很多人都可以來解決這些小的部分,比如小學(xué)生都可以解決單體問題。三體問題看起來無解,然而,這兩類問題之間的差異乍一看卻很小,因此可以利用軟件設(shè)計(jì)的思路,嘗試化整為零,對(duì)問題做一些簡化近似。

原文鏈接:

https://krste-sizgoric.medium.com/the-three-body-problem-in-software-development-74adeda6807c

翻譯內(nèi)容僅代表作者觀點(diǎn)不代表中科院物理所立場

本文來自微信公眾號(hào):中科院物理所 (ID:cas-iop),作者:Krste?i?gori?,翻譯:藏癡,審校:Nuor,編輯:zhenni

廣告聲明:文內(nèi)含有的對(duì)外跳轉(zhuǎn)鏈接(包括不限于超鏈接、二維碼、口令等形式),用于傳遞更多信息,節(jié)省甄選時(shí)間,結(jié)果僅供參考,IT之家所有文章均包含本聲明。

相關(guān)文章

關(guān)鍵詞:三體,太空

軟媒旗下網(wǎng)站: IT之家 最會(huì)買 - 返利返現(xiàn)優(yōu)惠券 iPhone之家 Win7之家 Win10之家 Win11之家

軟媒旗下軟件: 軟媒手機(jī)APP應(yīng)用 魔方 最會(huì)買 要知