首頁> 現代都市> 目錄頁> 第91章 讓程序去找程序

第91章 讓程序去找程序

2026-05-24 23:01:38 作者: 垂釣月牙

  第二天,他跑了全套測試。

  把新舊兩套流程吐出來的幾十GB結果進行比對。

  結果全部一致。

  再看最終成績。

  舊流程跑完要五個多小時。

  換上他這個專門給五個數排序的小東西之後,省下二十一分鐘。

  二十一分鐘。

  放進一個五六小時的大任務里,這數字小得可憐,像從一桶水裡舀走一勺。




  但江臨不這樣認為。

  因為這套工具不會只跑一次。

  這個項目後面還有幾十組要重跑,這套工具以後還要接別的活兒。

  今天省二十一分鐘,明天省二十一分鐘,跑上一百次,省下的就是三十多個小時的高強度算力。

  這意味著,他能用更少的機器,跑出更快的疊代速度。

  更何況,這只是他揪出來的第一顆小石頭。

  一個年久失修、堆滿了懶惰和冗餘的老系統里,這樣的小石頭,一定還有成百上千顆。

  他在記錄的末尾這樣總結。

  一件事被重複的次數足夠多,最微小的效率差距,就會撕裂成生與死的鴻溝。

  在這個城市,代碼寫錯了,大不了多扣幾塊錢伺服器費用,大不了半夜爬起來重啟,大不了回滾重來。

  有售後,有同行,有無數冗餘可以揮霍。

  

  但在那個他遲早要回去的廢土世界裡,沒有雲伺服器,沒有售後,沒有第二個工程師替他擦屁股。

  在那裡,機器慢了,不能先要資源,必須先問。

  為什麼慢。

  底層快一點,省一點,從來不是寫進簡歷的性能指標。

  而是活下去的餘量。

  寫下這句話,江臨把這個給五個數排序的小東西,單獨歸到一個新建的文件夾里。

  然後,一個新的念頭浮了上來。

  五個數,他靠紙筆和經驗,一晚上能推出來。

  可如果是六個數、七個數、八個數呢?

  要排序的數字每多一個,可能的排法就成倍地,再成倍地往上翻,很快就會多到一張紙根本畫不下。

  而且,比較次數最少不等於實際跑得最快。

  還要看機器喜不喜歡這套順序,看那些岔路藏在哪裡。

  到那時候,憑一個人的腦子去硬想哪一套手勢最好,會越來越不靠譜。

  不是不能寫。

  只是人會變成那個最慢的瓶頸。

  江臨忽然想到一件事。

  如果給五個數排序的完美手勢,是可以靠一台機器,把所有可能的排法挨個試一遍,自己找出來的。

  那別的小動作呢?

  那些同樣被重複幾千萬次,同樣卡著整個系統脖子的小動作呢?

  人來定規矩,定好什麼算對,什麼算錯,什麼是絕對不能碰的紅線。

  然後,讓程序自己去試,去試錯,去在那片大得可怕的可能性里,替自己撈出那一段更小,更快,更穩定的代碼。

  不再是人埋頭一行行去寫。

  是寫一個程序,讓這個程序,去尋找別的程序。

  好吧,讓程序去找程序,聽著挺玄,到底有什麼用?

  打個最簡單的比方。

  你家裡有一把瑞士軍刀,剪刀、開瓶器、螺絲刀、鋸子,什麼都有,出門帶一把,啥都能應付一下。

  可如果你開了家工廠,流水線上每天只干一件事。

  擰同一種螺絲,一天擰幾百萬顆,你還會用軍刀上那個小螺絲刀去擰嗎?

  當然不會。

  你會專門定做一把電動螺絲槍,只為這一種螺絲量身打造,又快又穩。

  電腦也是一樣。

  它平時用的那些現成功能,全是瑞士軍刀。


  為了應付天下所有情況,做得萬能,可靠,可每用一次都得把整套複雜東西開動一遍。

  但現實里很多任務,其實就是那條每天擰幾百萬顆同款螺絲的流水線。

  動作簡單,規矩固定,就是次數多得嚇人。

  江臨前一晚乾的,本質就是給這樣一條流水線,親手定做了一把專用的螺絲槍。

  而讓程序去找程序,是把這件事再往前推了一步。

  定做螺絲槍本身也是累活兒,得懂材料,懂力道,反覆試。

  他不想每遇到一種新螺絲,就熬夜親手去打一把新槍。

  他想要的,是一台會自己造螺絲槍的機器。

  你只管告訴它我要擰這種螺絲,必須擰緊,不能滑絲,剩下的,它自己去試一千種槍頭,自己測哪種最快最穩,最後把那把最好的遞給你。

  人只負責說清楚我要什麼,什麼絕對不能出錯。

  造槍的活兒,交給機器。

  那這東西在生活里能幹嘛?

  答案是,幾乎所有動作不難,卻要重複億萬次的地方,背後都藏著這樣一條可以被改造的流水線。

  你滑手機相冊,幾千張照片唰一下按時間排好,是排序。

  你網購時商品按價格從低到高一列,是排序。

  地圖給你算最近的路,外賣給你派最近的騎手,遊戲裡每一幀成百上千個物體重新排先後……

  這些你天天在用,卻從不留意的瞬間,底層全是同一批被重複了千萬上億次的小動作。

  平時沒人在乎它們快一點還是慢一點,因為單看一次,都是眨眼的事。

  可一旦放到重複上億次的尺度上,這眨眼的差距,就會變成實打實的電費、伺服器和等待時間。

  江臨要做的機器,就是鑽進這些沒人留意的角落,把那些還能更快的小動作,一個個揪出來,定做,替換,提速。

  而且它不挑活兒。

  今天能給五個數排序,明天就能優化別的小動作。

  這個項目用得上,下個項目照樣用得上。

  一念及此,江臨越來越興奮。

  因為排序,只是個敲門磚。

  真正讓他頭皮發麻的,是這道門縫背後那個更大的東西。

  如果連找最優程序這件事本身,都能交給機器去做呢?

  那麼在廢土世界裡,他就不必再為每一個裝置,每一種控制順序,每一套觀測流程,都親手去寫最好的方案。

  他一個人,精力有限。

  但如果有一天,機器能替他搜出一部分小程序,小流程,小動作。

  那麼它就不再只是一個排序工具,而是一個單人科研系統的增幅器。

  過去,人寫程序,是親手給出每一步。

  第一步比這兩個數,第二步比那兩個,第三步交換……

  一步步把答案鋪出來。

  這要求寫的人腦子裡先有答案,再把答案翻譯成代碼。

  江臨現在想做的,是反過來。

  他不再親手給答案,只告訴機器三件事。

  什麼是起點——一堆亂掉的數。

  允許做什麼動作——挑兩個位置,比一下,錯了就換。

  什麼算贏——所有可能的亂序,最後都被捋順。

  然後,讓機器自己去試。

  說白了,就是把排序這件事,變成了一個遊戲。

  亂掉的數,是棋盤。

  每一次比一下,該換就換,是落子。

  把所有亂序都捋順,是通關。

  機器要做的,就是自己去玩這個遊戲,一步步試,直到找出一套能通關的走法。

  這個想法有個讓人頭皮發麻的地方。

  人,從此不必知道答案了。

  人只負責定義這個遊戲。

  畫好棋盤,定好規則,標好勝利的樣子。

  至於具體怎麼走,走哪條路最快,交給機器去窮舉,去試錯。


  江臨新建了一個文件,敲下三行注釋,作為這個遊戲的全部規則。

  有一堆亂掉的數。

  每一步,挑兩個位置比一下,錯了就換。

  直到所有數都被捋順。

  很短。

  短到不像一個程序的開始。

  但他盯著這三行看了將近一分鐘。

  因為這三行的意思,已經不再是手寫排序,而是讓機器自己搜索排序程序。

  第一個要解決的問題是,機器怎麼知道自己試對了?

  這恰恰是這條路最乾淨的地方。

  五個數,所有可能的亂序,一共只有一百二十種。

  一百二十種,小到可以一種不漏地全列出來。

  所以機器根本不需要猜某套走法對不對。

  它可以把這一百二十種亂序全部丟進去,讓那套走法挨個跑一遍,只要有一種沒被捋順,這套走法就當場判死,扔掉。

  這是數學意義上的乾淨。

  不是我覺得它應該對,而是我把所有可能都試過了,它就是對的。

  人靠直覺,會漏,會錯。

  機器靠窮舉,一種都不會放過。

  凌晨,第一版找程序的程序跑了起來。

  它很笨,幾乎不會偷懶,只是從所有該比哪兩個的選擇里,一層一層往下試。

  每走一步,就回頭看看那一百二十種亂序,還剩多少沒被捋順。

  哪條路讓混亂減少得最多,就順著那條往下走。

  江臨給它定了個樸素的評判標準。

  剩多少沒排對,用了幾次比較,有沒有引入岔路,有沒有破壞兩個數相等時保持原順序的規矩,有沒有把缺失的數據提前隔離出去。

  沒有什麼玄乎的智能模型。

  只有最原始的三樣東西:挨個試,及時砍掉死路,把所有可能都驗一遍。

  這是他這台機器現在跑得動的全部。

  第一輪結果出來,屏幕上列印出一串走法。

  江臨先驗證。

  一百二十種亂序,全過。

  兩個數相等的情況,過。

  缺失數據的隔離,過。

  然後才看速度。

  沒比他自己手寫的快多少,某個設定下甚至更慢。

  他反而長長鬆了口氣。

  這才正常。

  第一版找程序的程序,怎麼可能一出來就碾壓一個人熬了一整夜的經驗。

  但它已經證明了那件最重要的事。

  機器,可以自己找到正確的程序。

  快不快,是下一層的問題。

  能不能找到,才是這扇門開沒開。

  接下來的時間裡,江臨一點點餵養這個還很笨的東西。

  第一個台階,是讓它分清對不對。

  這個最簡單,窮舉就行。

  五個數的一百二十種,八個數的幾萬種,機器都能一種不漏地驗完。

  第二個台階,是讓它分清值不值。

  同樣能把數排對,可能有十幾套不同的走法,它們不是一樣好的。

  有的比較次數多,有的岔路多,有的要占用更多臨時空間。

  江臨得把這些代價一項項寫進機器的評判標準里,讓它在一堆都對的走法裡,挑出最划算的那個。

  第三個台階,最麻煩。

  讓它明白機器認不認。

  同樣一套走法,寫在紙上看著差不多,可一旦真的跑起來,換一台電腦,換一種翻譯方式,快慢竟然會不一樣。

  因為最終真正執行的,不是紙上那幾行字,而是機器把它翻譯成的更底層的一長串指令。

  一套看起來比較次數最少的走法,翻譯到機器里,未必就是跑得最快的那個。

  到了這一層,紙筆和直覺徹底失效。

  人根本算不清,哪一套走法在真實的機器里會更快。


  而這,恰恰是讓程序去找程序最大的價值所在。

  人算不清的事,機器可以一套一套地真跑,用秒表去量。

  它不需要理解為什麼快,它只需要把成千上萬套候選走法挨個跑一遍,然後告訴你。

  這一套,最快。

  但江臨也很快撞上了這條路的天敵。

  爆炸。

  數字稍微多一點,可能的走法就成倍再成倍地往上翻。

  五個數還能全試,到了更大的規模,哪怕機器一刻不停地試到宇宙盡頭,也試不完所有的路。

  這時候,砍就比試更重要了。

  江臨想起之前解過的一道競賽題。

  那道題的關鍵,不是把所有可能的答案都算一遍,而是先證明哪些答案根本不可能是最好的,然後整批整批地劃掉,只在剩下的小範圍里找。

  搜索也是一樣。

  機器不可能走完所有的路,但它可以先證明,一大批路,從某一步開始就註定不可能更好了。

  於是這些路,連試都不必試,整批扔掉。

  把這件事干好,需要的不是更快的機器,而是更聰明的放棄。

  在每一個岔路口,提前算出往這邊走,最好也只能到這個程度,一旦發現這個上限還不如手裡已經有的答案,立刻掉頭。

  省下的,是天文數字般的無用功。

  某個深夜,第一個真正有分量的結果,出現了。

  帶著髒數據規矩的的五個數排序。

  允許有相等的數,允許有缺失的空洞,還要保證排完之後,相等的數維持原來的先後。

  機器找出來的那套走法,和江臨親手寫的,不完全一樣。

  比較次數一樣多。

  但岔路更少,結構更規整。

  他把所有的髒情況一種種餵進去驗。

  全過。

  再上秒表。

  比手寫版快了百分之二點幾。

  換一台機器,換一種翻譯方式,領先的幅度變小了,但沒有消失。

  百分之二點幾。

  聽起來甚至有點可憐,沒有誰會為這個數字鼓掌。

  事實上,最後留在硬碟里的,也只是一個不起眼的小文件,旁邊附著一份自動生成的驗證報告。

  所有亂序通過,相等值通過,缺失值通過,與標準做法零差異,速度中位數快百分之二點七。

  就這麼點東西。

  但江臨心裡清楚它和昨天那個手寫版的本質區別。

  這一次,那套漂亮的走法,不是人寫的。

  是機器自己,從茫茫的可能性里,撈出來的。

  標準庫里的通用流程,被無數工程師打磨過很多年。

  而現在,它在一個特定的場景里,被比了下去。

  哪怕只是一點點,哪怕沒人鼓掌。

  動手的,也不再是某個天才的腦子,而是一台肯把所有可能都試一遍的機器。

  他沒有為這百分之二點幾高興多久,反而很快皺起眉。

  太小了。

  不是嫌棄這個結果,而是這個結果在告訴他一件事。

  方向是對的,方法還很粗。他給機器定的遊戲規則太簡單,讓它放棄的本事太弱,能讓它玩的盤面太小。

  機器現在像個剛學會規則,只會埋頭硬試的新手。

  它能贏,但贏得笨拙。

  而江臨已經看到了這條路真正的盡頭在哪裡。

  現在的機器,是按死規矩去試。

  但如果有一天,它能從自己過去試過的成千上萬套走法裡,回頭去學。

  哪一類結構容易快,哪一類機器特別喜歡,哪一類看著比較次數少,跑起來卻慢,那它就不再是埋頭硬試的新手了。

  它會開始有直覺。

  人定義遊戲,機器去玩,再從玩過的每一局裡,長出自己的偏好。

  到那時候,讓程序去找程序這件事,才算真正長出了牙齒。


  但江臨沒有立刻去碰那一步。

  現在還太早。

  他手裡只有一個笨拙的找程序的程序,一個快了百分之二的小文件,幾份測試報告。

  這不是成果,只是門縫。

  可很多最終會改變一切的東西,一開始,都弱得可笑。


關閉
Δ