第91章 讓程序去找程序
第二天,他跑了全套測試。
把新舊兩套流程吐出來的幾十GB結果進行比對。
結果全部一致。
再看最終成績。
舊流程跑完要五個多小時。
換上他這個專門給五個數排序的小東西之後,省下二十一分鐘。
二十一分鐘。
放進一個五六小時的大任務里,這數字小得可憐,像從一桶水裡舀走一勺。
換個外行看,會覺得他熬了一整夜,就為這點東西,簡直是撿了芝麻丟了西瓜。
但江臨不這樣認為。
因為這套工具不會只跑一次。
這個項目後面還有幾十組要重跑,這套工具以後還要接別的活兒。
今天省二十一分鐘,明天省二十一分鐘,跑上一百次,省下的就是三十多個小時的高強度算力。
這意味著,他能用更少的機器,跑出更快的疊代速度。
更何況,這只是他揪出來的第一顆小石頭。
一個年久失修、堆滿了懶惰和冗餘的老系統里,這樣的小石頭,一定還有成百上千顆。
他在記錄的末尾這樣總結。
一件事被重複的次數足夠多,最微小的效率差距,就會撕裂成生與死的鴻溝。
在這個城市,代碼寫錯了,大不了多扣幾塊錢伺服器費用,大不了半夜爬起來重啟,大不了回滾重來。
有售後,有同行,有無數冗餘可以揮霍。
在那裡,機器慢了,不能先要資源,必須先問。
【寫到這裡我希望讀者記一下我們域名 TW 看書網體驗棒,𝘀𝗵𝘂.𝘁𝘄超讚 】
為什麼慢。
底層快一點,省一點,從來不是寫進簡歷的性能指標。
而是活下去的餘量。
寫下這句話,江臨把這個給五個數排序的小東西,單獨歸到一個新建的文件夾里。
然後,一個新的念頭浮了上來。
五個數,他靠紙筆和經驗,一晚上能推出來。
可如果是六個數、七個數、八個數呢?
要排序的數字每多一個,可能的排法就成倍地,再成倍地往上翻,很快就會多到一張紙根本畫不下。
而且,比較次數最少不等於實際跑得最快。
還要看機器喜不喜歡這套順序,看那些岔路藏在哪裡。
到那時候,憑一個人的腦子去硬想哪一套手勢最好,會越來越不靠譜。
不是不能寫。
只是人會變成那個最慢的瓶頸。
江臨忽然想到一件事。
如果給五個數排序的完美手勢,是可以靠一台機器,把所有可能的排法挨個試一遍,自己找出來的。
那別的小動作呢?
那些同樣被重複幾千萬次,同樣卡著整個系統脖子的小動作呢?
人來定規矩,定好什麼算對,什麼算錯,什麼是絕對不能碰的紅線。
然後,讓程序自己去試,去試錯,去在那片大得可怕的可能性里,替自己撈出那一段更小,更快,更穩定的代碼。
不再是人埋頭一行行去寫。
是寫一個程序,讓這個程序,去尋找別的程序。
好吧,讓程序去找程序,聽著挺玄,到底有什麼用?
打個最簡單的比方。
你家裡有一把瑞士軍刀,剪刀、開瓶器、螺絲刀、鋸子,什麼都有,出門帶一把,啥都能應付一下。
可如果你開了家工廠,流水線上每天只干一件事。
擰同一種螺絲,一天擰幾百萬顆,你還會用軍刀上那個小螺絲刀去擰嗎?
當然不會。
你會專門定做一把電動螺絲槍,只為這一種螺絲量身打造,又快又穩。
電腦也是一樣。
它平時用的那些現成功能,全是瑞士軍刀。
為了應付天下所有情況,做得萬能,可靠,可每用一次都得把整套複雜東西開動一遍。
但現實里很多任務,其實就是那條每天擰幾百萬顆同款螺絲的流水線。
動作簡單,規矩固定,就是次數多得嚇人。
江臨前一晚乾的,本質就是給這樣一條流水線,親手定做了一把專用的螺絲槍。
而讓程序去找程序,是把這件事再往前推了一步。
定做螺絲槍本身也是累活兒,得懂材料,懂力道,反覆試。
他不想每遇到一種新螺絲,就熬夜親手去打一把新槍。
他想要的,是一台會自己造螺絲槍的機器。
你只管告訴它我要擰這種螺絲,必須擰緊,不能滑絲,剩下的,它自己去試一千種槍頭,自己測哪種最快最穩,最後把那把最好的遞給你。
人只負責說清楚我要什麼,什麼絕對不能出錯。
造槍的活兒,交給機器。
那這東西在生活里能幹嘛?
答案是,幾乎所有動作不難,卻要重複億萬次的地方,背後都藏著這樣一條可以被改造的流水線。
你滑手機相冊,幾千張照片唰一下按時間排好,是排序。
你網購時商品按價格從低到高一列,是排序。
地圖給你算最近的路,外賣給你派最近的騎手,遊戲裡每一幀成百上千個物體重新排先後……
這些你天天在用,卻從不留意的瞬間,底層全是同一批被重複了千萬上億次的小動作。
平時沒人在乎它們快一點還是慢一點,因為單看一次,都是眨眼的事。
可一旦放到重複上億次的尺度上,這眨眼的差距,就會變成實打實的電費、伺服器和等待時間。
江臨要做的機器,就是鑽進這些沒人留意的角落,把那些還能更快的小動作,一個個揪出來,定做,替換,提速。
而且它不挑活兒。
今天能給五個數排序,明天就能優化別的小動作。
這個項目用得上,下個項目照樣用得上。
一念及此,江臨越來越興奮。
因為排序,只是個敲門磚。
真正讓他頭皮發麻的,是這道門縫背後那個更大的東西。
如果連找最優程序這件事本身,都能交給機器去做呢?
那麼在廢土世界裡,他就不必再為每一個裝置,每一種控制順序,每一套觀測流程,都親手去寫最好的方案。
他一個人,精力有限。
但如果有一天,機器能替他搜出一部分小程序,小流程,小動作。
那麼它就不再只是一個排序工具,而是一個單人科研系統的增幅器。
過去,人寫程序,是親手給出每一步。
第一步比這兩個數,第二步比那兩個,第三步交換……
一步步把答案鋪出來。
這要求寫的人腦子裡先有答案,再把答案翻譯成代碼。
江臨現在想做的,是反過來。
他不再親手給答案,只告訴機器三件事。
什麼是起點——一堆亂掉的數。
允許做什麼動作——挑兩個位置,比一下,錯了就換。
什麼算贏——所有可能的亂序,最後都被捋順。
然後,讓機器自己去試。
說白了,就是把排序這件事,變成了一個遊戲。
亂掉的數,是棋盤。
每一次比一下,該換就換,是落子。
把所有亂序都捋順,是通關。
機器要做的,就是自己去玩這個遊戲,一步步試,直到找出一套能通關的走法。
這個想法有個讓人頭皮發麻的地方。
人,從此不必知道答案了。
人只負責定義這個遊戲。
畫好棋盤,定好規則,標好勝利的樣子。
至於具體怎麼走,走哪條路最快,交給機器去窮舉,去試錯。
江臨新建了一個文件,敲下三行注釋,作為這個遊戲的全部規則。
有一堆亂掉的數。
每一步,挑兩個位置比一下,錯了就換。
直到所有數都被捋順。
很短。
短到不像一個程序的開始。
但他盯著這三行看了將近一分鐘。
因為這三行的意思,已經不再是手寫排序,而是讓機器自己搜索排序程序。
第一個要解決的問題是,機器怎麼知道自己試對了?
這恰恰是這條路最乾淨的地方。
五個數,所有可能的亂序,一共只有一百二十種。
一百二十種,小到可以一種不漏地全列出來。
所以機器根本不需要猜某套走法對不對。
它可以把這一百二十種亂序全部丟進去,讓那套走法挨個跑一遍,只要有一種沒被捋順,這套走法就當場判死,扔掉。
這是數學意義上的乾淨。
不是我覺得它應該對,而是我把所有可能都試過了,它就是對的。
人靠直覺,會漏,會錯。
機器靠窮舉,一種都不會放過。
凌晨,第一版找程序的程序跑了起來。
它很笨,幾乎不會偷懶,只是從所有該比哪兩個的選擇里,一層一層往下試。
每走一步,就回頭看看那一百二十種亂序,還剩多少沒被捋順。
哪條路讓混亂減少得最多,就順著那條往下走。
江臨給它定了個樸素的評判標準。
剩多少沒排對,用了幾次比較,有沒有引入岔路,有沒有破壞兩個數相等時保持原順序的規矩,有沒有把缺失的數據提前隔離出去。
沒有什麼玄乎的智能模型。
只有最原始的三樣東西:挨個試,及時砍掉死路,把所有可能都驗一遍。
這是他這台機器現在跑得動的全部。
第一輪結果出來,屏幕上列印出一串走法。
江臨先驗證。
一百二十種亂序,全過。
兩個數相等的情況,過。
缺失數據的隔離,過。
然後才看速度。
沒比他自己手寫的快多少,某個設定下甚至更慢。
他反而長長鬆了口氣。
這才正常。
第一版找程序的程序,怎麼可能一出來就碾壓一個人熬了一整夜的經驗。
但它已經證明了那件最重要的事。
機器,可以自己找到正確的程序。
快不快,是下一層的問題。
能不能找到,才是這扇門開沒開。
接下來的時間裡,江臨一點點餵養這個還很笨的東西。
第一個台階,是讓它分清對不對。
這個最簡單,窮舉就行。
五個數的一百二十種,八個數的幾萬種,機器都能一種不漏地驗完。
第二個台階,是讓它分清值不值。
同樣能把數排對,可能有十幾套不同的走法,它們不是一樣好的。
有的比較次數多,有的岔路多,有的要占用更多臨時空間。
江臨得把這些代價一項項寫進機器的評判標準里,讓它在一堆都對的走法裡,挑出最划算的那個。
第三個台階,最麻煩。
讓它明白機器認不認。
同樣一套走法,寫在紙上看著差不多,可一旦真的跑起來,換一台電腦,換一種翻譯方式,快慢竟然會不一樣。
因為最終真正執行的,不是紙上那幾行字,而是機器把它翻譯成的更底層的一長串指令。
一套看起來比較次數最少的走法,翻譯到機器里,未必就是跑得最快的那個。
到了這一層,紙筆和直覺徹底失效。
人根本算不清,哪一套走法在真實的機器里會更快。
而這,恰恰是讓程序去找程序最大的價值所在。
人算不清的事,機器可以一套一套地真跑,用秒表去量。
它不需要理解為什麼快,它只需要把成千上萬套候選走法挨個跑一遍,然後告訴你。
這一套,最快。
但江臨也很快撞上了這條路的天敵。
爆炸。
數字稍微多一點,可能的走法就成倍再成倍地往上翻。
五個數還能全試,到了更大的規模,哪怕機器一刻不停地試到宇宙盡頭,也試不完所有的路。
這時候,砍就比試更重要了。
江臨想起之前解過的一道競賽題。
那道題的關鍵,不是把所有可能的答案都算一遍,而是先證明哪些答案根本不可能是最好的,然後整批整批地劃掉,只在剩下的小範圍里找。
搜索也是一樣。
機器不可能走完所有的路,但它可以先證明,一大批路,從某一步開始就註定不可能更好了。
於是這些路,連試都不必試,整批扔掉。
把這件事干好,需要的不是更快的機器,而是更聰明的放棄。
在每一個岔路口,提前算出往這邊走,最好也只能到這個程度,一旦發現這個上限還不如手裡已經有的答案,立刻掉頭。
省下的,是天文數字般的無用功。
某個深夜,第一個真正有分量的結果,出現了。
帶著髒數據規矩的的五個數排序。
允許有相等的數,允許有缺失的空洞,還要保證排完之後,相等的數維持原來的先後。
機器找出來的那套走法,和江臨親手寫的,不完全一樣。
比較次數一樣多。
但岔路更少,結構更規整。
他把所有的髒情況一種種餵進去驗。
全過。
再上秒表。
比手寫版快了百分之二點幾。
換一台機器,換一種翻譯方式,領先的幅度變小了,但沒有消失。
百分之二點幾。
聽起來甚至有點可憐,沒有誰會為這個數字鼓掌。
事實上,最後留在硬碟里的,也只是一個不起眼的小文件,旁邊附著一份自動生成的驗證報告。
所有亂序通過,相等值通過,缺失值通過,與標準做法零差異,速度中位數快百分之二點七。
就這麼點東西。
但江臨心裡清楚它和昨天那個手寫版的本質區別。
這一次,那套漂亮的走法,不是人寫的。
是機器自己,從茫茫的可能性里,撈出來的。
標準庫里的通用流程,被無數工程師打磨過很多年。
而現在,它在一個特定的場景里,被比了下去。
哪怕只是一點點,哪怕沒人鼓掌。
動手的,也不再是某個天才的腦子,而是一台肯把所有可能都試一遍的機器。
他沒有為這百分之二點幾高興多久,反而很快皺起眉。
太小了。
不是嫌棄這個結果,而是這個結果在告訴他一件事。
方向是對的,方法還很粗。他給機器定的遊戲規則太簡單,讓它放棄的本事太弱,能讓它玩的盤面太小。
機器現在像個剛學會規則,只會埋頭硬試的新手。
它能贏,但贏得笨拙。
而江臨已經看到了這條路真正的盡頭在哪裡。
現在的機器,是按死規矩去試。
但如果有一天,它能從自己過去試過的成千上萬套走法裡,回頭去學。
哪一類結構容易快,哪一類機器特別喜歡,哪一類看著比較次數少,跑起來卻慢,那它就不再是埋頭硬試的新手了。
它會開始有直覺。
人定義遊戲,機器去玩,再從玩過的每一局裡,長出自己的偏好。
到那時候,讓程序去找程序這件事,才算真正長出了牙齒。
但江臨沒有立刻去碰那一步。
現在還太早。
他手裡只有一個笨拙的找程序的程序,一個快了百分之二的小文件,幾份測試報告。
這不是成果,只是門縫。
可很多最終會改變一切的東西,一開始,都弱得可笑。
把新舊兩套流程吐出來的幾十GB結果進行比對。
結果全部一致。
再看最終成績。
舊流程跑完要五個多小時。
換上他這個專門給五個數排序的小東西之後,省下二十一分鐘。
二十一分鐘。
放進一個五六小時的大任務里,這數字小得可憐,像從一桶水裡舀走一勺。
換個外行看,會覺得他熬了一整夜,就為這點東西,簡直是撿了芝麻丟了西瓜。
但江臨不這樣認為。
因為這套工具不會只跑一次。
這個項目後面還有幾十組要重跑,這套工具以後還要接別的活兒。
今天省二十一分鐘,明天省二十一分鐘,跑上一百次,省下的就是三十多個小時的高強度算力。
這意味著,他能用更少的機器,跑出更快的疊代速度。
更何況,這只是他揪出來的第一顆小石頭。
一個年久失修、堆滿了懶惰和冗餘的老系統里,這樣的小石頭,一定還有成百上千顆。
他在記錄的末尾這樣總結。
一件事被重複的次數足夠多,最微小的效率差距,就會撕裂成生與死的鴻溝。
在這個城市,代碼寫錯了,大不了多扣幾塊錢伺服器費用,大不了半夜爬起來重啟,大不了回滾重來。
有售後,有同行,有無數冗餘可以揮霍。
在那裡,機器慢了,不能先要資源,必須先問。
【寫到這裡我希望讀者記一下我們域名 TW 看書網體驗棒,𝘀𝗵𝘂.𝘁𝘄超讚 】
為什麼慢。
底層快一點,省一點,從來不是寫進簡歷的性能指標。
而是活下去的餘量。
寫下這句話,江臨把這個給五個數排序的小東西,單獨歸到一個新建的文件夾里。
然後,一個新的念頭浮了上來。
五個數,他靠紙筆和經驗,一晚上能推出來。
可如果是六個數、七個數、八個數呢?
要排序的數字每多一個,可能的排法就成倍地,再成倍地往上翻,很快就會多到一張紙根本畫不下。
而且,比較次數最少不等於實際跑得最快。
還要看機器喜不喜歡這套順序,看那些岔路藏在哪裡。
到那時候,憑一個人的腦子去硬想哪一套手勢最好,會越來越不靠譜。
不是不能寫。
只是人會變成那個最慢的瓶頸。
江臨忽然想到一件事。
如果給五個數排序的完美手勢,是可以靠一台機器,把所有可能的排法挨個試一遍,自己找出來的。
那別的小動作呢?
那些同樣被重複幾千萬次,同樣卡著整個系統脖子的小動作呢?
人來定規矩,定好什麼算對,什麼算錯,什麼是絕對不能碰的紅線。
然後,讓程序自己去試,去試錯,去在那片大得可怕的可能性里,替自己撈出那一段更小,更快,更穩定的代碼。
不再是人埋頭一行行去寫。
是寫一個程序,讓這個程序,去尋找別的程序。
好吧,讓程序去找程序,聽著挺玄,到底有什麼用?
打個最簡單的比方。
你家裡有一把瑞士軍刀,剪刀、開瓶器、螺絲刀、鋸子,什麼都有,出門帶一把,啥都能應付一下。
可如果你開了家工廠,流水線上每天只干一件事。
擰同一種螺絲,一天擰幾百萬顆,你還會用軍刀上那個小螺絲刀去擰嗎?
當然不會。
你會專門定做一把電動螺絲槍,只為這一種螺絲量身打造,又快又穩。
電腦也是一樣。
它平時用的那些現成功能,全是瑞士軍刀。
為了應付天下所有情況,做得萬能,可靠,可每用一次都得把整套複雜東西開動一遍。
但現實里很多任務,其實就是那條每天擰幾百萬顆同款螺絲的流水線。
動作簡單,規矩固定,就是次數多得嚇人。
江臨前一晚乾的,本質就是給這樣一條流水線,親手定做了一把專用的螺絲槍。
而讓程序去找程序,是把這件事再往前推了一步。
定做螺絲槍本身也是累活兒,得懂材料,懂力道,反覆試。
他不想每遇到一種新螺絲,就熬夜親手去打一把新槍。
他想要的,是一台會自己造螺絲槍的機器。
你只管告訴它我要擰這種螺絲,必須擰緊,不能滑絲,剩下的,它自己去試一千種槍頭,自己測哪種最快最穩,最後把那把最好的遞給你。
人只負責說清楚我要什麼,什麼絕對不能出錯。
造槍的活兒,交給機器。
那這東西在生活里能幹嘛?
答案是,幾乎所有動作不難,卻要重複億萬次的地方,背後都藏著這樣一條可以被改造的流水線。
你滑手機相冊,幾千張照片唰一下按時間排好,是排序。
你網購時商品按價格從低到高一列,是排序。
地圖給你算最近的路,外賣給你派最近的騎手,遊戲裡每一幀成百上千個物體重新排先後……
這些你天天在用,卻從不留意的瞬間,底層全是同一批被重複了千萬上億次的小動作。
平時沒人在乎它們快一點還是慢一點,因為單看一次,都是眨眼的事。
可一旦放到重複上億次的尺度上,這眨眼的差距,就會變成實打實的電費、伺服器和等待時間。
江臨要做的機器,就是鑽進這些沒人留意的角落,把那些還能更快的小動作,一個個揪出來,定做,替換,提速。
而且它不挑活兒。
今天能給五個數排序,明天就能優化別的小動作。
這個項目用得上,下個項目照樣用得上。
一念及此,江臨越來越興奮。
因為排序,只是個敲門磚。
真正讓他頭皮發麻的,是這道門縫背後那個更大的東西。
如果連找最優程序這件事本身,都能交給機器去做呢?
那麼在廢土世界裡,他就不必再為每一個裝置,每一種控制順序,每一套觀測流程,都親手去寫最好的方案。
他一個人,精力有限。
但如果有一天,機器能替他搜出一部分小程序,小流程,小動作。
那麼它就不再只是一個排序工具,而是一個單人科研系統的增幅器。
過去,人寫程序,是親手給出每一步。
第一步比這兩個數,第二步比那兩個,第三步交換……
一步步把答案鋪出來。
這要求寫的人腦子裡先有答案,再把答案翻譯成代碼。
江臨現在想做的,是反過來。
他不再親手給答案,只告訴機器三件事。
什麼是起點——一堆亂掉的數。
允許做什麼動作——挑兩個位置,比一下,錯了就換。
什麼算贏——所有可能的亂序,最後都被捋順。
然後,讓機器自己去試。
說白了,就是把排序這件事,變成了一個遊戲。
亂掉的數,是棋盤。
每一次比一下,該換就換,是落子。
把所有亂序都捋順,是通關。
機器要做的,就是自己去玩這個遊戲,一步步試,直到找出一套能通關的走法。
這個想法有個讓人頭皮發麻的地方。
人,從此不必知道答案了。
人只負責定義這個遊戲。
畫好棋盤,定好規則,標好勝利的樣子。
至於具體怎麼走,走哪條路最快,交給機器去窮舉,去試錯。
江臨新建了一個文件,敲下三行注釋,作為這個遊戲的全部規則。
有一堆亂掉的數。
每一步,挑兩個位置比一下,錯了就換。
直到所有數都被捋順。
很短。
短到不像一個程序的開始。
但他盯著這三行看了將近一分鐘。
因為這三行的意思,已經不再是手寫排序,而是讓機器自己搜索排序程序。
第一個要解決的問題是,機器怎麼知道自己試對了?
這恰恰是這條路最乾淨的地方。
五個數,所有可能的亂序,一共只有一百二十種。
一百二十種,小到可以一種不漏地全列出來。
所以機器根本不需要猜某套走法對不對。
它可以把這一百二十種亂序全部丟進去,讓那套走法挨個跑一遍,只要有一種沒被捋順,這套走法就當場判死,扔掉。
這是數學意義上的乾淨。
不是我覺得它應該對,而是我把所有可能都試過了,它就是對的。
人靠直覺,會漏,會錯。
機器靠窮舉,一種都不會放過。
凌晨,第一版找程序的程序跑了起來。
它很笨,幾乎不會偷懶,只是從所有該比哪兩個的選擇里,一層一層往下試。
每走一步,就回頭看看那一百二十種亂序,還剩多少沒被捋順。
哪條路讓混亂減少得最多,就順著那條往下走。
江臨給它定了個樸素的評判標準。
剩多少沒排對,用了幾次比較,有沒有引入岔路,有沒有破壞兩個數相等時保持原順序的規矩,有沒有把缺失的數據提前隔離出去。
沒有什麼玄乎的智能模型。
只有最原始的三樣東西:挨個試,及時砍掉死路,把所有可能都驗一遍。
這是他這台機器現在跑得動的全部。
第一輪結果出來,屏幕上列印出一串走法。
江臨先驗證。
一百二十種亂序,全過。
兩個數相等的情況,過。
缺失數據的隔離,過。
然後才看速度。
沒比他自己手寫的快多少,某個設定下甚至更慢。
他反而長長鬆了口氣。
這才正常。
第一版找程序的程序,怎麼可能一出來就碾壓一個人熬了一整夜的經驗。
但它已經證明了那件最重要的事。
機器,可以自己找到正確的程序。
快不快,是下一層的問題。
能不能找到,才是這扇門開沒開。
接下來的時間裡,江臨一點點餵養這個還很笨的東西。
第一個台階,是讓它分清對不對。
這個最簡單,窮舉就行。
五個數的一百二十種,八個數的幾萬種,機器都能一種不漏地驗完。
第二個台階,是讓它分清值不值。
同樣能把數排對,可能有十幾套不同的走法,它們不是一樣好的。
有的比較次數多,有的岔路多,有的要占用更多臨時空間。
江臨得把這些代價一項項寫進機器的評判標準里,讓它在一堆都對的走法裡,挑出最划算的那個。
第三個台階,最麻煩。
讓它明白機器認不認。
同樣一套走法,寫在紙上看著差不多,可一旦真的跑起來,換一台電腦,換一種翻譯方式,快慢竟然會不一樣。
因為最終真正執行的,不是紙上那幾行字,而是機器把它翻譯成的更底層的一長串指令。
一套看起來比較次數最少的走法,翻譯到機器里,未必就是跑得最快的那個。
到了這一層,紙筆和直覺徹底失效。
人根本算不清,哪一套走法在真實的機器里會更快。
而這,恰恰是讓程序去找程序最大的價值所在。
人算不清的事,機器可以一套一套地真跑,用秒表去量。
它不需要理解為什麼快,它只需要把成千上萬套候選走法挨個跑一遍,然後告訴你。
這一套,最快。
但江臨也很快撞上了這條路的天敵。
爆炸。
數字稍微多一點,可能的走法就成倍再成倍地往上翻。
五個數還能全試,到了更大的規模,哪怕機器一刻不停地試到宇宙盡頭,也試不完所有的路。
這時候,砍就比試更重要了。
江臨想起之前解過的一道競賽題。
那道題的關鍵,不是把所有可能的答案都算一遍,而是先證明哪些答案根本不可能是最好的,然後整批整批地劃掉,只在剩下的小範圍里找。
搜索也是一樣。
機器不可能走完所有的路,但它可以先證明,一大批路,從某一步開始就註定不可能更好了。
於是這些路,連試都不必試,整批扔掉。
把這件事干好,需要的不是更快的機器,而是更聰明的放棄。
在每一個岔路口,提前算出往這邊走,最好也只能到這個程度,一旦發現這個上限還不如手裡已經有的答案,立刻掉頭。
省下的,是天文數字般的無用功。
某個深夜,第一個真正有分量的結果,出現了。
帶著髒數據規矩的的五個數排序。
允許有相等的數,允許有缺失的空洞,還要保證排完之後,相等的數維持原來的先後。
機器找出來的那套走法,和江臨親手寫的,不完全一樣。
比較次數一樣多。
但岔路更少,結構更規整。
他把所有的髒情況一種種餵進去驗。
全過。
再上秒表。
比手寫版快了百分之二點幾。
換一台機器,換一種翻譯方式,領先的幅度變小了,但沒有消失。
百分之二點幾。
聽起來甚至有點可憐,沒有誰會為這個數字鼓掌。
事實上,最後留在硬碟里的,也只是一個不起眼的小文件,旁邊附著一份自動生成的驗證報告。
所有亂序通過,相等值通過,缺失值通過,與標準做法零差異,速度中位數快百分之二點七。
就這麼點東西。
但江臨心裡清楚它和昨天那個手寫版的本質區別。
這一次,那套漂亮的走法,不是人寫的。
是機器自己,從茫茫的可能性里,撈出來的。
標準庫里的通用流程,被無數工程師打磨過很多年。
而現在,它在一個特定的場景里,被比了下去。
哪怕只是一點點,哪怕沒人鼓掌。
動手的,也不再是某個天才的腦子,而是一台肯把所有可能都試一遍的機器。
他沒有為這百分之二點幾高興多久,反而很快皺起眉。
太小了。
不是嫌棄這個結果,而是這個結果在告訴他一件事。
方向是對的,方法還很粗。他給機器定的遊戲規則太簡單,讓它放棄的本事太弱,能讓它玩的盤面太小。
機器現在像個剛學會規則,只會埋頭硬試的新手。
它能贏,但贏得笨拙。
而江臨已經看到了這條路真正的盡頭在哪裡。
現在的機器,是按死規矩去試。
但如果有一天,它能從自己過去試過的成千上萬套走法裡,回頭去學。
哪一類結構容易快,哪一類機器特別喜歡,哪一類看著比較次數少,跑起來卻慢,那它就不再是埋頭硬試的新手了。
它會開始有直覺。
人定義遊戲,機器去玩,再從玩過的每一局裡,長出自己的偏好。
到那時候,讓程序去找程序這件事,才算真正長出了牙齒。
但江臨沒有立刻去碰那一步。
現在還太早。
他手裡只有一個笨拙的找程序的程序,一個快了百分之二的小文件,幾份測試報告。
這不是成果,只是門縫。
可很多最終會改變一切的東西,一開始,都弱得可笑。