大數(shù)據(jù)文摘出品 作者:Andy 主播:段天霖
新的一周開(kāi)始了!有效率的一周應(yīng)該始于一份安排得當(dāng)?shù)挠?jì)劃表。 但安排日程不是件容易的事情,有些任務(wù)得在其他任務(wù)后進(jìn)行(比如說(shuō)洗完衣服后,才能晾衣服);有些有準(zhǔn)確的截止日期,而有些卻沒(méi)有,還有些呢,介于兩者之間;有些緊急,但不重要;有些重要,但又不緊急... 面對(duì)這一堆亂七八糟的任務(wù),到底該如何安排效率最高?這涉及到計(jì)算機(jī)科學(xué)中非常常見(jiàn)的調(diào)度 (Scheduling) 算法。 本周,我們來(lái)聊聊【調(diào)度】這個(gè)或大或小的話題,以及如何利用它來(lái)進(jìn)行科學(xué)時(shí)間管理。 我們?nèi)粘6紩?huì)遇到時(shí)間管理問(wèn)題,去做什么,什么時(shí)候做,以及什么順序做? 我們總會(huì)想著找到一個(gè)最好的方法來(lái)進(jìn)行時(shí)間管理,市面上也有無(wú)數(shù)的書告訴我們?cè)撛趺崔k,但他們卻又互不相同,甚至互相矛盾。比如說(shuō)《搞定:無(wú)壓工作的藝術(shù)》里就推崇一種把任何想到的能在兩分鐘以內(nèi)完成的工作,迅速搞定的做法;而與此相對(duì),在《吃掉那只青蛙》里面,卻又倡導(dǎo)先從困難的事開(kāi)始,然后到簡(jiǎn)單事... 似乎每位作者都有著自己的一套理論,那到底該聽(tīng)誰(shuí)的呢? 那不妨借鑒一下計(jì)算機(jī)科學(xué)中的調(diào)度 (Scheduling) 算法,來(lái)進(jìn)行科學(xué)時(shí)間管理。 調(diào)度算法:起源雖然,時(shí)間管理這個(gè)概念可能與時(shí)間本身一樣古老,但說(shuō)到調(diào)度算法科學(xué),可能得追溯到19世紀(jì)末了。Frederick Taylor 在拒絕了哈佛大學(xué)的錄取后,成了一名光榮的機(jī)械師學(xué)徒,之后一番打拼,從學(xué)徒升到了總工程師。期間,他越來(lái)越堅(jiān)定一個(gè)想法,那就是,很多機(jī)器的時(shí)間沒(méi)有得到最大程度的利用,于是他就提出了一個(gè)新的叫作“科學(xué)管理”的學(xué)科。 于是 Taylor 建立了計(jì)劃辦公室,房間中一塊大板子上列著店內(nèi)所有機(jī)器,以及正在進(jìn)行的工作和正在等待的工作。之后他的同事 Henry Gantt 在此基礎(chǔ)上進(jìn)一步提出了現(xiàn)在大家熟悉的甘特圖,如今被廣泛應(yīng)用在各個(gè)大公司的項(xiàng)目管理中,比如亞馬遜和 SpaceX。 然而他們只是提出概念還有視覺(jué)化,卻沒(méi)解決怎么調(diào)度這個(gè)根本問(wèn)題。而這還得等到幾十年后 RAND 公司的數(shù)學(xué)家 Selmer Johnson 來(lái)解決了。 Johnson 碰上的是書本裝訂問(wèn)題,或者說(shuō)洗衣服問(wèn)題。洗衣服分兩步,洗和烘干。假設(shè)你有幾籃子衣物(糙漢子表示只有一個(gè)籃子),有的比較臟得長(zhǎng)時(shí)間洗,烘干時(shí)間正常;還有的衣物多得長(zhǎng)時(shí)間烘干,洗倒不用太久。于是 Johnson 就問(wèn),到底怎樣的順序來(lái)洗衣服最好呢。 答案很簡(jiǎn)單,先找出這些籃子里洗或烘干所需時(shí)間最短步驟,如果是洗就放最前面,如果是烘干就放最后面,不斷重復(fù)這個(gè)步驟就能獲得最優(yōu)順序。 因?yàn)橄匆逻^(guò)程中,必然有些時(shí)間只在洗或只在干,而不是同時(shí)進(jìn)行。為了避免這種浪費(fèi),只要使它倆最小就好。于是這就是調(diào)度算法中第一個(gè)算法:從最好洗的開(kāi)始,以最好干的結(jié)束。 此外,Johnson 還揭示了兩點(diǎn):
于是這就為調(diào)度延伸出了各種問(wèn)題,比如說(shuō)一個(gè)有各種各樣機(jī)器的虛擬工廠,它的最優(yōu)調(diào)度策略是什么。 但今天,我們不談這些復(fù)雜問(wèn)題。只談一臺(tái)機(jī)器情況,因?yàn)槲覀冏铌P(guān)心的調(diào)度問(wèn)題也就只有一臺(tái)機(jī)器——我們自己。 截止日期是第一生產(chǎn)力 然而,當(dāng)挽起衣袖準(zhǔn)備開(kāi)始解決單機(jī)器調(diào)度問(wèn)題時(shí),卻突然發(fā)現(xiàn)好像有點(diǎn)不對(duì)。因?yàn)?strong>一臺(tái)機(jī)器一次只能做一件事,那無(wú)論怎樣的順序來(lái)做花的時(shí)間都一樣,還需要什么調(diào)度。 但是,慢著,在現(xiàn)實(shí)生活中卻又是需要考慮做事順序的不是嗎? 那是哪兒出問(wèn)題了呢,這里就要說(shuō)到調(diào)度中最重要的概念:度量指標(biāo) (metric),明確你的目標(biāo)。也就是你得對(duì)不同方案好壞設(shè)置一個(gè)度量標(biāo)準(zhǔn),是越快越好,還是先干重要的好。這也是計(jì)算機(jī)科學(xué)里的一個(gè)重要原則:在計(jì)劃前,先設(shè)定一個(gè)評(píng)判標(biāo)準(zhǔn)(這也是機(jī)器學(xué)習(xí)中evaluation的重要性)。 因此即使同一個(gè)問(wèn)題,如果評(píng)判標(biāo)準(zhǔn)不同,那最優(yōu)策略也就不同。 比如說(shuō)我們希望盡量不拖延,也就是超過(guò)截止日期的時(shí)間最短。那就可以使用稱為最早完成日期 (Earliest Due Date)的最佳策略。只看截止日期,先做截止日期最近的,很簡(jiǎn)單。 或許都不用這里說(shuō),你早就已經(jīng)會(huì)用這個(gè)策略了。但現(xiàn)實(shí)中不光拖延時(shí)間,還會(huì)有很多其他因素。比如你買了很多新鮮食物,如果把品嘗日期當(dāng)做截止日期,應(yīng)用上述策略的話,確實(shí)能最小化你食物的過(guò)期時(shí)間,但就不保證味道了。 于是改變一下測(cè)量標(biāo)準(zhǔn),最小化會(huì)過(guò)期食物的數(shù)量。于是就得到摩爾算法 (Moore’s Algorithm)。它最初也是先按過(guò)期日期先后來(lái)吃,但是一旦看到之后的事物可能會(huì)在吃之前過(guò)期。那么立刻停下來(lái),把最大的食物(需要最長(zhǎng)時(shí)間吃)丟掉。這樣就能盡量減少過(guò)期食物數(shù)量了。 搞定任務(wù) 有時(shí)候我們關(guān)心的可能不是截止日期,而是越快越多的搞定手頭事情。而此時(shí)的最優(yōu)算法又成了最短處理時(shí)間(Shortest Processing Time) 算法,即先完成能最快完成的任務(wù)。 這就類似《搞定:無(wú)壓工作的藝術(shù)》中的策略了。先把能快速解決的事先解決,也能減少心理負(fù)擔(dān),使得集中精力于困難的事。 但在現(xiàn)實(shí)中,并不是說(shuō)越快越多完成任務(wù)就越好。特別是事有輕重,有些事要比另一些事重要些。那么我們可以對(duì)最短處理時(shí)間算法進(jìn)行少許修改,不同的任務(wù)有各自權(quán)重,利用權(quán)重與所需時(shí)間比得到“單位時(shí)間重要度”,之后只需優(yōu)先執(zhí)行重要度高的任務(wù)即可。這個(gè)算法可以稱為加權(quán)最短處理時(shí)間策略,非常實(shí)用。 有意思的是,當(dāng)觀察動(dòng)物覓食時(shí),也會(huì)觀察到類似策略,它們會(huì)傾向于尋找“單位時(shí)間更多能量”的食物。 認(rèn)清問(wèn)題 從上面的兩個(gè)例子可以清晰看出,雖然針對(duì)各個(gè)標(biāo)準(zhǔn)都能給出最優(yōu)解法,但選擇哪個(gè)標(biāo)準(zhǔn)卻是在于我們自己。 這也提供了看待拖延癥(時(shí)間管理的死敵)的另一個(gè)視角。一般認(rèn)為拖延癥是一種壞習(xí)慣和行為,但會(huì)不會(huì)實(shí)際上拖延癥只是用了匹配錯(cuò)了最優(yōu)策略和度量方法呢。 通常認(rèn)為拖延癥是懶或者逃避,但其實(shí)對(duì)于一些勤奮想快點(diǎn)做完事情的人也非常容易出現(xiàn)。比如2014年的一項(xiàng)研究就發(fā)現(xiàn),有時(shí)候人們?yōu)榱吮M快完成任務(wù),結(jié)果卻花了更多時(shí)間和精力,也就是欲速則不達(dá)。 那么他們采用了錯(cuò)的策略嗎,不,他們只是把一個(gè)好策略用在了錯(cuò)誤的標(biāo)準(zhǔn)上。因?yàn)樗麄兛赡苡玫氖亲疃烫幚頃r(shí)間方法, 但是實(shí)際上應(yīng)該進(jìn)行衡量的標(biāo)準(zhǔn)并不是最快最多完成任務(wù)。 這就是成也標(biāo)準(zhǔn)敗也標(biāo)準(zhǔn)。比如說(shuō)現(xiàn)在的智能手機(jī),會(huì)在應(yīng)用圖標(biāo)的右上角標(biāo)上未讀信息,不管信息的重要性都只計(jì)數(shù)一,這導(dǎo)致我們不能分清信息的重要性,而會(huì)浪費(fèi)很多時(shí)間去檢查不重要信息。只因?yàn)槲覀兪且员M快完成盡可能多的任務(wù)為策略。 而實(shí)際上應(yīng)該做的可能應(yīng)該是,先把重要的事情做完。這聽(tīng)起來(lái)是解決拖延癥的可靠方法,但是對(duì)于NASA的人來(lái)說(shuō)確實(shí)在最戲劇性地情況下意識(shí)到這個(gè)問(wèn)題:火星的表面,而且是眾目睽睽下。 優(yōu)先級(jí)倒置和優(yōu)先限制 1997年夏天,當(dāng)人們興奮地將價(jià)值一億五千萬(wàn)美元的探路者號(hào)送上火星,卻發(fā)現(xiàn)它居然出現(xiàn)了拖延癥。尋路者號(hào)對(duì)于優(yōu)先度最高的任務(wù)不聞不問(wèn),卻把時(shí)間都花在那些中等優(yōu)先度的任務(wù)上。 大名鼎鼎的 JPL(噴氣推進(jìn)實(shí)驗(yàn)室)小組爆肝數(shù)日,最終發(fā)現(xiàn)了元兇,那就是調(diào)度中的大敵人:優(yōu)先級(jí)倒置 (priority inversion)。具體是這樣的,系統(tǒng)先運(yùn)行一個(gè)低優(yōu)先級(jí)任務(wù)占用一些系統(tǒng)資源,然后根據(jù)計(jì)時(shí)器中途中斷任務(wù),調(diào)用調(diào)度程序。 這時(shí)調(diào)度程序想運(yùn)行高優(yōu)先級(jí)的任務(wù),但因?yàn)橐玫牟糠仲Y源被低優(yōu)先級(jí)任務(wù)占著,所以只能退而運(yùn)行中優(yōu)先級(jí)不使用相同資源的任務(wù),或是這個(gè)占用著資源的低優(yōu)先級(jí)任務(wù)。因?yàn)檫@個(gè)原因,往往有些最高優(yōu)先級(jí)的任務(wù)被丟在一旁長(zhǎng)一段時(shí)間不執(zhí)行。 JPL 一旦發(fā)現(xiàn)問(wèn)題就知道怎么解決了,寫了個(gè)代碼發(fā)送到火星。這個(gè)解決方法便是優(yōu)先級(jí)繼承,方法很簡(jiǎn)單:一旦發(fā)現(xiàn)低優(yōu)先級(jí)任務(wù)占用了高優(yōu)先級(jí)任務(wù)的資源,便立刻將其優(yōu)先級(jí)升為與被占用任務(wù)相同優(yōu)先級(jí),盡快執(zhí)行完。 生活中也會(huì)遇到很多優(yōu)先級(jí)倒置的問(wèn)題,可以說(shuō)它也是拖延癥的罪魁禍?zhǔn)字弧1热缥易罱睦?,需要交學(xué)費(fèi),非常緊急(不按時(shí)交開(kāi)除學(xué)籍?。欢y行在山下,下山得騎車。借車這事,在我心里優(yōu)先級(jí)又不高,結(jié)果便一直沒(méi)借車,去忙些其他事情了。 直到最近學(xué)校發(fā)來(lái)最后通牒:“快交學(xué)費(fèi)!” 可以去會(huì)計(jì)科,于是便不用下山了,也就不用借自行車,也就沒(méi)有低優(yōu)先任務(wù)阻礙交學(xué)費(fèi)這個(gè)緊急任務(wù)了,于是我也就沒(méi)有被開(kāi)除了(這才是重點(diǎn))。 事實(shí)上,下次碰到這樣這樣的事情,正確做法是將借自行車升級(jí)為交學(xué)費(fèi)一樣緊急的事情。 以上講的都涉及到優(yōu)先限制,也就是有些事只能在某些事之后完成。 撞上墻了! Eugene Lawler 可以說(shuō)是20世紀(jì)研究?jī)?yōu)先限制最杰出的科學(xué)家,他幾乎花了一生時(shí)間來(lái)思考怎么才能更有效地完成一系列接連任務(wù)。因?yàn)楫?dāng)一個(gè)普通調(diào)度問(wèn)題加入優(yōu)先限制后,可能會(huì)變得很不一樣。 比如說(shuō)最早完成日期,如果加入優(yōu)先限制,就會(huì)發(fā)現(xiàn)原來(lái)策略行不通了,因?yàn)橛行┤蝿?wù)即使截止日期早,但卻得在另一件任務(wù)之后做。而 Lawler 證明只需要反過(guò)來(lái)從后往前就能很好解決,也就是先找沒(méi)有未完成任務(wù)中沒(méi)有其他任務(wù)依賴的任務(wù),找出其中截止日期最晚的,放在調(diào)度表最后,然后不斷重復(fù)這個(gè)操作就行了。 此外,他還發(fā)現(xiàn)了很多很有意思的其他問(wèn)題。比如說(shuō)最短處理時(shí)間,當(dāng)加入優(yōu)先限制后,似乎還是一個(gè)很基礎(chǔ)的問(wèn)題,但事實(shí)上卻沒(méi)有一個(gè)有效解決它的方法。不光是 Lawler 沒(méi)想出來(lái),其他研究人員也都沒(méi)想出來(lái)。 而且不光最短處理時(shí)間問(wèn)題, 情況遠(yuǎn)遠(yuǎn)比這更糟。那就是, Lawler 發(fā)現(xiàn)有一系列類似問(wèn)題,都不能得到有效解決,于是調(diào)度理論也就撞上墻了。 不過(guò)這也激起了像 Lawler 這樣的頂尖研究人員的雄心,去探索調(diào)度問(wèn)題中到底哪些是無(wú)法被解決的,哪些又能被解決的。也就是說(shuō)對(duì)整個(gè)調(diào)度理論,進(jìn)行一次大勘察,而這個(gè)大勘察現(xiàn)在都還在繼續(xù)著。 最近研究顯示,調(diào)度問(wèn)題中有7%的問(wèn)題現(xiàn)在尚未理解。 而即使是剩下93%理解的問(wèn)題,情況也不容樂(lè)觀,其中只有9%是可以被有效解決的,而剩下84%都被證明無(wú)法被解決。也就是說(shuō)事實(shí)上對(duì)于大多數(shù)調(diào)度問(wèn)題,確實(shí)也沒(méi)有最佳方法。 所以當(dāng)我們對(duì)管理時(shí)間感到壓力山大時(shí),也不用太自責(zé),或許它本來(lái)就太難了。然而,這里提到的一些算法還是可以作為你處理這些難問(wèn)題的起點(diǎn),即使不是最優(yōu)方法,但至少有個(gè)比較好的方法可以使用。 停停停,先來(lái)干這個(gè):優(yōu)先處理 到目前為止說(shuō)的都是些讓問(wèn)題變得更復(fù)雜的因素,那現(xiàn)在來(lái)看看讓問(wèn)題變得更簡(jiǎn)單的吧。比如如果能夠在某件任務(wù)中途停下來(lái),而去干其他事。這個(gè)叫作搶先 (preemption)的性質(zhì),讓問(wèn)題又發(fā)生了大大的改變。 一些之前無(wú)法被解決的問(wèn)題,又能被解決了。比如說(shuō)加入優(yōu)先限制的最短處理時(shí)間問(wèn)題,如果加入搶先后,就又能得到有效解決了。只要不停切換為處理當(dāng)前重要度最大的任務(wù)即可。 搶先,尤其適合應(yīng)對(duì)不確定性。假設(shè)在進(jìn)行一些任務(wù)時(shí),同時(shí)有新的任務(wù)突然加入,那么就需要重新考慮當(dāng)前該運(yùn)行的任務(wù),也就是設(shè)置哪個(gè)任務(wù)搶先。 不確定性對(duì)策略的影響不大,仍然按照加入搶先后的策略進(jìn)行就可以了。 搶先處理的代價(jià) 搶先有它的好處,當(dāng)然也就有其缺點(diǎn),環(huán)境切換 (Context Switch)。而環(huán)境切換時(shí),是需要付出一些代價(jià)的。 日常中我們也常會(huì)碰到,從某事切換到另一件事時(shí),有時(shí)需要調(diào)整下心理狀態(tài),或者工作環(huán)境。比如說(shuō)查看郵件時(shí),得打開(kāi)郵件軟件,等上好一會(huì);如果要寫代碼,得登錄終端,調(diào)節(jié)好狀態(tài);如果寫作,又得找來(lái)卡片,筆墨,工具書... 任務(wù)和任務(wù)之間切換時(shí),是需要耗費(fèi)額外時(shí)間的。當(dāng)任務(wù)少時(shí),或許還看不出有什么問(wèn)題,但當(dāng)我們把任務(wù)切換頻率提到很高時(shí),就會(huì)出現(xiàn)一個(gè)很奇怪的現(xiàn)象系統(tǒng)顛簸 (thrashing). 簡(jiǎn)單的解釋就是,假設(shè)有很多任務(wù),我們想進(jìn)行多任務(wù)處理,于是就給每個(gè)任務(wù)分配相等但少量的時(shí)間,不停地來(lái)回切換處理任務(wù),這類似于計(jì)算機(jī)系統(tǒng)的分時(shí)處理。 假設(shè)每個(gè)任務(wù)都需要準(zhǔn)備時(shí)間,于是當(dāng)任務(wù)太多,分配給每個(gè)任務(wù)的時(shí)間塊很短時(shí),就會(huì)出現(xiàn)不斷在任務(wù)之間切換,而每次準(zhǔn)備時(shí)間就把時(shí)間塊用完了的現(xiàn)象。這樣就會(huì)不斷在各個(gè)任務(wù)上移動(dòng),而實(shí)際工作卻一點(diǎn)沒(méi)做的現(xiàn)象,即系統(tǒng)顛簸。 日常生活中類似的,一有郵件就點(diǎn)開(kāi)瞧瞧,一有信息就拿起來(lái)看看,有過(guò)經(jīng)驗(yàn)的人也知道這樣對(duì)效率影響有多大。 對(duì)于計(jì)算機(jī)來(lái)說(shuō),這個(gè)問(wèn)題可以簡(jiǎn)單用升級(jí)內(nèi)存或緩存的手法解決,當(dāng)然對(duì)于我們?nèi)?,要升?jí)大腦可沒(méi)那么簡(jiǎn)單,或許還得等到多年以后生物技術(shù)的發(fā)展。 但也還是有些方法來(lái)避免這個(gè)問(wèn)題的。第一,我們可以減少任務(wù)的數(shù)量,對(duì)不重要的事情說(shuō)不,把精力只集中在少數(shù)任務(wù)上。第二,我們可以規(guī)定最短時(shí)間塊得有的時(shí)間,也就是很流行的番茄鐘,給每個(gè)任務(wù)規(guī)定一個(gè)充足的最短時(shí)間。 當(dāng)然,如果你不想減少任務(wù)數(shù)量,也不想麻煩的使用番茄鐘,調(diào)度中一些其他技巧也能幫組你避免環(huán)境切換的損耗。 比如說(shuō)中斷結(jié)合 (Interrupt Coalescing),其實(shí)就是批量處理。簡(jiǎn)單說(shuō)就是把類似任務(wù)放在一起完成,這樣也就避免了環(huán)境切換。比如說(shuō)把一天的特定半個(gè)小時(shí)全部用來(lái)回復(fù)郵件和發(fā)郵件,就能提高很多效率。 運(yùn)用這個(gè)技巧的典范人物就是大神級(jí)程序員 Donald Knuth,他說(shuō):“我一次只干一件事。” 當(dāng)然,他說(shuō)的一件事是指需要相同環(huán)境的一類任務(wù)。比如說(shuō)在“2014 TeX 大調(diào)整”中,他就一下把過(guò)去6年大家關(guān)于 TeX 反應(yīng)的所有bug都修復(fù)了。完成之后還掛上“等待2021年的大調(diào)整”。不僅如此,他也沒(méi)有電子郵箱,就連郵件都是三個(gè)月才看一次,而傳真更是六個(gè)月才看一次。 其實(shí)我想知道其他時(shí)間他都干什么去了。 怎么管理自己的時(shí)間 最后回到主題,怎么利用調(diào)度算法最優(yōu)地管理自己的時(shí)間? 很遺憾,答案是沒(méi)有。因?yàn)楝F(xiàn)實(shí)中要處理的調(diào)度問(wèn)題往往都是不可解決的,也就是沒(méi)有最好的調(diào)度方案。 但是呢,至少我們也能從中借鑒到一些小技巧運(yùn)用于時(shí)間管理中,比漫無(wú)目的地東一棒西一錘瞎干的好。
|
|