關於文章訂閱
文章 >軟體生涯第一次Roll Back (September 04, 2025)
English | 中文

軟體生涯第一次Roll Back

「哎呀!出包了」
September 04, 2025

什麼是「Roll Back」?Roll Back就是,軟體更新在釋出後「哎呀!出包了」,發現了嚴重的臭蟲,不得不趕快逆轉更新,恢復到以前的軟體版本。Roll back發生時,常常意味著嚴重性以及緊急性。如果不嚴重或不緊急,慢慢花時間找出問題在哪裡,再更新一次就好。但如果臭蟲太大隻,它每一秒的存在都是不能承擔的痛,那就必須趕快Roll Back,把生出來的臭蟲逆轉消除掉。

因為是嚴重的臭蟲,軟體工程師接到Roll back聖旨,就像收到不及格的期末考一樣,後悔當初如果再多看幾眼、檢查一下再交出考卷,也許下場就不會這麼糟了。而這場糟糕的期末考就在我剛加入YouTube購物的第一年就發生了。

YouTube購物在韓國十分火紅,一家號稱南韓的亞馬遜(以下簡稱韓版亞馬遜)在YouTube上營業額十分高,許多人都是看YouTube影片介紹,而去購買韓版亞馬遜上的產品。韓版亞馬遜可說是許多南韓網紅的乾爹。事實上,韓版亞馬遜營業額之高,參與的影片以及商品數之多,是我們當年唯一無法計算統計的商家。其他的商家都可以到YouTube後台,了解自家商品在YouTube的銷售量、點擊率、轉化率等,就只有韓版亞馬遜不行。

為什麼不行呢?因為資料太多,記憶體不夠無法處理。那為什麼不增加記憶體呢? 因為這個問題只在我們的產品裡有,很難想像全Google就我們的資料量最大。

我加入不久以後,這個「把程式優化」的工作就交到了我的手上。一開始以為是新手入門等級的任務,後來越做越覺得「修但幾勒」,怎麼一個月過去了我還是一點進度都沒有,壓力山大。後來在期限內勉強推出一個,以增加CPU運算來減少記憶體用量的演算法,在2025年初上線。推出後,韓版亞馬遜可以勉強上線使用,雖然網站很慢,但不再有記憶體不足網站當掉的問題,但本來就沒問題的其他商家登入後,卻發現網站速度慢了10倍,等於為了修一個小Bug,卻意外生出了一個超級大Bug。

後來我緊急召開會議,跟主管以及組上大咖們解釋問題的來龍去脈,受影響的商家用戶,以及如何Roll Back,還有韓版亞馬遜可以上線的時程。雖然不知道怎麼解決,但跟上面報告還要再一個月的時間,韓版亞馬遜才可以上線。等於給自己挖了一個坑,到時候如果又跳票或Roll Back會十分難看。

後來恨下心,把資料庫結構與程式碼徹底修改。不曉得Tech lead是對我有信心,還是死馬當活馬醫,反正已經沒有了回頭路,就快速審閱我的程式碼,讓我在一個月突然進化為10倍工程師。後來一個月後還真的被我給修好了,記憶體問題解決了,每一個商家也可以上我們的商家中心,沒有明顯的網路速度問題。我寄出了韓國正式上線的通告,組員們各個回信表示恭喜,老闆也感到開心,這件任務就順利落幕了。

後來過了很久幾個月後才知道,這個記憶體問題已經在組內無解很久,這個定時炸彈就在組內傳來傳去,最後我加入時傳到了我手上。我能夠加入YouTube購物,是因為有一位前組員,才加入不到一年就離開了。不曉得他是不是也有接到類似的炸彈?如果我當時沒辦法解決,是不是也會不到一年就離開了?


For those who are interested: the memory issue was solved by replacing ARRAY_LENGTH with COUNT DISTINCT in the sql scripts to count unique items. Using an array to count items is memory intensive because you have to store all the items in the array. It is also compute intensive because every time you merge with another array you have to make sure there are no duplicate items. The benefit is that you can pass this array around in your query and join whenever with whatever, and the result will still be correct.

On the other hand, in order for COUNT DISTINCT to be correct, this command can only be done once after all the joins are done. Therefore, by comparison it is harder to use. However, compared to big arrays it is more memory and compute friendly as sql is efficient in joining and handling big tables. In order to migrate from ARRAY_LENGTH to COUNT DISTINCT, I ended up overhauling and refactoring sql scripts and schemas.


訂閱阿丹的電子報

科技 & 我的動態