0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

三體問題和軟件開發(fā)之間的關(guān)系簡析

bzdlyqxsl ? 來源:中科院物理所 ? 作者:Krste?i?gori? ? 2022-10-24 10:11 ? 次閱讀

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

最近幾個(gè)月有很多工作需要做,我過得比較艱難,需要休息一下。我的放松方式是閱讀,我選擇了劉慈欣的《三體》。開始閱讀之前,我從未了解過這本書,也不了解三體問題,但是讀完之后我震驚了。《三體》是一本科幻小說,是地球往事三部曲中的第一部。這本書構(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)圖描述的一樣。

ff48dca6-528e-11ed-a3b6-dac502259ad0.gif

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

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

但如果我們再加入一個(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ì)如何影響其他部分。

ff92ef58-528e-11ed-a3b6-dac502259ad0.gif

兩個(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ù)也做出改變……好混亂啊。

ffba6448-528e-11ed-a3b6-dac502259ad0.gif

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

回到單體問題

我們該如何避免這個(gè)問題?我們有怎樣才能避免某一個(gè)功能對(duì)其他功能產(chǎn)生嚴(yán)重影響?

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

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

設(shè)想如果我們試圖計(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),就像我們在上面的例子中做的那樣,網(wǎng)店并不需要知道這些變化。只需更改網(wǎng)店收到的數(shù)據(jù),就可以在網(wǎng)店不知情的情況下完成上述操作。

對(duì)于“購買”這一功能,我們需要做相同的事。合同需要一個(gè)操作以完成購買。網(wǎng)店發(fā)起這一操作,然后它的任務(wù)就完成了。“購買”這一功能接管。它檢查是否有可用的貨品,然后如果一切正常,它完成購買并相應(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)中并讓它們相匹配。

好了?,F(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ì)問題做一些簡化近似。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8675

    瀏覽量

    151556
  • 解耦
    +關(guān)注

    關(guān)注

    0

    文章

    40

    瀏覽量

    11912

原文標(biāo)題:三體問題和軟件開發(fā)有什么關(guān)系?

文章出處:【微信號(hào):信息與電子工程前沿FITEE,微信公眾號(hào):信息與電子工程前沿FITEE】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    我國軟件開發(fā)者數(shù)量超過940萬

    在近日舉辦的開放原子開發(fā)者大會(huì)上,工業(yè)和信息化部負(fù)責(zé)人傳來了一則令人振奮的消息:我國軟件開發(fā)者數(shù)量已經(jīng)突破940萬大關(guān)。這一數(shù)據(jù)不僅彰顯了我國在軟件開發(fā)領(lǐng)域的雄厚實(shí)力,也預(yù)示著我國在全球軟件開
    的頭像 發(fā)表于 12-23 11:08 ?256次閱讀

    BQ7690x軟件開發(fā)指南

    電子發(fā)燒友網(wǎng)站提供《BQ7690x軟件開發(fā)指南.pdf》資料免費(fèi)下載
    發(fā)表于 11-07 10:19 ?1次下載
    BQ7690x<b class='flag-5'>軟件開發(fā)</b>指南

    TMS320C6201 DSP軟件開發(fā)技術(shù)

    電子發(fā)燒友網(wǎng)站提供《TMS320C6201 DSP軟件開發(fā)技術(shù).pdf》資料免費(fèi)下載
    發(fā)表于 10-26 09:25 ?0次下載
    TMS320C6201 DSP<b class='flag-5'>軟件開發(fā)</b>技術(shù)

    PGA460軟件開發(fā)指南

    電子發(fā)燒友網(wǎng)站提供《PGA460軟件開發(fā)指南.pdf》資料免費(fèi)下載
    發(fā)表于 10-09 10:30 ?1次下載
    PGA460<b class='flag-5'>軟件開發(fā)</b>指南

    PGA450-Q1軟件開發(fā)指南

    電子發(fā)燒友網(wǎng)站提供《PGA450-Q1軟件開發(fā)指南.pdf》資料免費(fèi)下載
    發(fā)表于 09-30 14:25 ?0次下載
    PGA450-Q1<b class='flag-5'>軟件開發(fā)</b>指南

    ECU電控軟件開發(fā)及測試介紹

    本文重點(diǎn)介紹符合AutoSar架構(gòu)的應(yīng)用軟件開發(fā)、MBD開發(fā)模式下的軟件質(zhì)量評(píng)估與優(yōu)化方案、復(fù)雜場景下的ECU性能壓力測試方案。
    的頭像 發(fā)表于 09-26 14:25 ?3472次閱讀
    ECU電控<b class='flag-5'>軟件開發(fā)</b>及測試介紹

    TUSS44x0軟件開發(fā)指南

    電子發(fā)燒友網(wǎng)站提供《TUSS44x0軟件開發(fā)指南.pdf》資料免費(fèi)下載
    發(fā)表于 09-14 10:59 ?0次下載
    TUSS44x0<b class='flag-5'>軟件開發(fā)</b>指南

    BQ769x2軟件開發(fā)指南

    電子發(fā)燒友網(wǎng)站提供《BQ769x2軟件開發(fā)指南.pdf》資料免費(fèi)下載
    發(fā)表于 08-26 09:12 ?0次下載
    BQ769x2<b class='flag-5'>軟件開發(fā)</b>指南

    BQ769x2 軟件開發(fā)指南

    電子發(fā)燒友網(wǎng)站提供《BQ769x2 軟件開發(fā)指南.pdf》資料免費(fèi)下載
    發(fā)表于 08-12 14:41 ?0次下載

    嵌入式軟件開發(fā)與AI整合

    嵌入式軟件開發(fā)與AI整合是當(dāng)前技術(shù)發(fā)展的重要趨勢之一。隨著人工智能技術(shù)的快速發(fā)展,嵌入式系統(tǒng)越來越多地集成了AI算法,以實(shí)現(xiàn)更復(fù)雜的智能功能。以下是關(guān)于嵌入式軟件開發(fā)與AI整合的詳細(xì)分析
    的頭像 發(fā)表于 07-31 09:25 ?761次閱讀
    嵌入式<b class='flag-5'>軟件開發(fā)</b>與AI整合

    【《軟件開發(fā)珠璣》閱讀體驗(yàn)】+ 心得

    【《軟件開發(fā)珠璣》閱讀體驗(yàn)】+ 心得 感謝電子發(fā)燒友論壇提供的讀書機(jī)會(huì)。讀這本書使我在編程方面多了位資深老師。 在軟件項(xiàng)目開發(fā)領(lǐng)域的時(shí),我閱讀了《軟件開發(fā)珠璣》這本書。它以獨(dú)特的視角和
    發(fā)表于 06-23 17:56

    上位機(jī)軟件開發(fā)用什么語言

    上位機(jī)軟件開發(fā)是指開發(fā)用于與下位機(jī)(如PLC、單片機(jī)等)進(jìn)行通信、控制和數(shù)據(jù)處理的計(jì)算機(jī)軟件。上位機(jī)軟件在工業(yè)自動(dòng)化、物聯(lián)網(wǎng)、智能家居等領(lǐng)域有著廣泛的應(yīng)用。選擇合適的編程語言對(duì)于
    的頭像 發(fā)表于 06-06 10:44 ?2065次閱讀

    keil arm軟件開發(fā)指南

    電子發(fā)燒友網(wǎng)站提供《keil arm軟件開發(fā)指南.pdf》資料免費(fèi)下載
    發(fā)表于 01-26 15:51 ?7次下載

    嵌入式軟件開發(fā)軟件開發(fā)的區(qū)別

    嵌入式軟件開發(fā)軟件開發(fā)是兩個(gè)不同的概念,它們在一些關(guān)鍵方面有著明顯的區(qū)別。嵌入式軟件開發(fā)是指開發(fā)嵌入在硬件設(shè)備中的軟件,而
    的頭像 發(fā)表于 01-22 15:27 ?2356次閱讀