從前有一個傻呆程序員,他老婆交給他一項任務:「去買3斤橙子,買最大最甜最便宜的臍橙」。程序員
普通人買水果直接去店裏就買了,但程序員不一樣。程序員心道:「大,好分辨,甜,很差分辯。水果店老闆確定不讓每一個橙子都試吃一下的」。因而問Siri,Siri說:「通常橙子屁股上有臍圈的,是母橙,母橙比較甜」。就這樣經過調研,甜度辨別的技術難題解決了。算法
接下來程序員開始策劃去哪裏買。經Siri調查,小區裏共有4家水果店。程序員心道:「這4家店每家均可能賣橙子,也都有多是最便宜的。若是冒然去了A店買,而C店纔是最便宜的,就失去了作事的嚴謹性,回來可能捱罵。嚴謹的作法應該是貨比三家,每家都看看並把價格記下來,而後選一家價格最低的購買。可是,應該先去哪家看價格呢?理論上應該先去離家的店,最後去離家最遠的店。」編程
經大體估算,4家店按離家距離排序,依次是ABCD。程序員應該先去A店。但估算畢竟是不嚴謹的,因而程序員請出百度地圖,在地圖上一一標上家和4家店的GPS座標,再以水果店的GPS座標分別計算離家的距離。最後得出結論,順序依次是CABD(由於C店是直接距離,店距離排序邏輯略)。微信
因而程序員去C店,獲得一個結果,而後又分別去ABD各店,最終得出A店返回無窮大。A店可能沒有臍橙或有效貨存不足。其它3家店,B店最便宜。程序員決定去B店購買。此時程序員老婆打來了電話,說「叫你買個橙子怎麼去這麼半天!」,程序員道:「目標已經鎖定,即將完成任務」。多線程
程序員到了B店,不敢耽擱,立刻開始了選臍橙的邏輯:架構
半小時後,程序員拎着水果回到了家。老婆罵他:「怎麼買水果比種果樹都慢!」程序員開始反思,這個買水果的流程是否是還有不少優化的空間?優化
第二次買橙子時,淨化數據源與冒泡排序這兩個循環,程序員將它們合在了一塊兒:線程
因爲減小了時間複雜度,而且略去了第一次技術調研、系統架構的時間,這一次只用了20分鐘,但老婆大人仍是嫌慢:「別人買水果幾分種,你買水果20分鐘!」orm
第三次買水果,程序員再也不使用單隻手的冒泡排序,而使用兩隻手的快速排序法,左手向右比較,右手向左比較(算法過於複雜,不做僞碼展現了)。此次用了15分鐘,但老婆大人仍然不滿意。blog
第四次買水果,程序員優化了進店詢價邏輯。前幾回買水果,程序員要了老闆的微信,此次出發前先給4家老闆羣發了一條微信息:「老闆,今天臍橙還有沒有,多少錢一斤?」
此次用多線程問詢,替代了以前的單線程走路問詢,只用了5分鐘就完成了任務。老婆滿意了。
程序員感嘆道:「程序優化果真是無止境啊!但貌似目前的邏輯還能夠再優化,譬如歷次購買水果第一優先選擇基本都是B店,下次能夠直接去B店。在去的路上向4家老闆發微信詢價,大機率答案仍是B店。若是不是,進店前還有時間調整路線,這是執行與問詢的多線程。」
你能從這個程序員買橙子的故事中,看出編程難在哪裏嗎?
2018年12月29日
本文首發於微信公衆號「藝述思惟」:從前有一個傻呆程序員,老婆交給他一項任務,他辦了四次才滿意