Kiedy byliśmy w szkole układano za nas plan nauki. Wszystko miało swój ściśle określony czas i miejsce. Teraz samemu trzeba to ogarnąć. Powiedzmy, że masz w tygodniu kilka wolnych godzin, które chcesz przeznaczyć na naukę nowych rzeczy. Niestety te wolne godziny pojawiają się nieregularnie, więc nie sposób ustalić: "w środy o 18 biegam do wielkiego dębu". Przy jednym zadaniu to nie problem: "zajmę się tym jak będę miał wolny czas". A co jeśli takich cyklicznych zadań jest więcej? Przy założeniu, że wszystkie są dla nas jednakowo ważne, można zajmować się nimi na zmianę:
pisanie bloga, siłownia, prace społeczne...
pisanie bloga, siłownia, prace społeczne...
pisanie bloga, siłownia, prace społeczne ... itd.
W praktyce jednak są ważniejsze i mniej istotne zajęcia, a my mamy listę wypełniającą nasz czas jeszcze na długo po naszej śmierci. Nawet jeśli okroimy tę listę w granicach rozsądku, wybierając ~5 rzeczy, którymi chcemy się zająć, to pozostaje problem zaplanowania wykonania. Rozwiązaniem może być samoorganizująca się lista zajęć. Że co?! Tak, samoorganizująca. Tak mnie jakoś oświeciło banalne rozwiązanie, kiedy wpatrywałem się w słupki tańczącego histogramu z poprzedniego wpisu. Wszystko co nam potrzeba to przypisać wagi do zadań i z każdym cyklem ja pomnażać.
Przykład:
Mamy plan uczyć się w wolnym czasie o fedorze, windowsie, programowania w pythonie i powłoce oraz wyrażeń regularnych. Nie wiadomo w co ręce włożyć, prawda? Zapiszmy to jedno pod drugim z wagą na ile jest dla nas istotne:
| fedora | 4 |
| windows | 2 |
| python | 6 |
| bash | 3 |
| regexp | 5 |
Co ma największą wagę? → python
No to zajmijmy się tym, już bez różnicy czy przez najbliższe 1-2h, czy może odmierzając 3 rozdziały książki. Jednostka wedle widzi mi się.
Co teraz? Zwiększamy dorobek o początkową wagę. Tym zadaniom, które musiały czekać, waga się sumuje, a python z chwilą wybrania stracił dorobek punktowy, więc dodajemy do zera.
| fedora | 4 | 4+4=8 |
| windows | 2 | 2+2=4 |
| python | 6 | 0+6=6 |
| bash | 3 | 3+3=6 |
| regexp | 5 | 5+5=10 |
Co ma największą wagę? → regexp
Ciekawe jak dalej się to ułoży i czy to ma sens.
| fedora | 4 | 8 | 12 | 4 | 8 | 12 | 16 | 20 | 4 | 8 | 12 | 16 | 20 | 4 | 8 | 12 |
| windows | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 2 | 4 | 6 | 8 | 10 | 12 | 14 |
| python | 6 | 6 | 12 | 18 | 6 | 12 | 18 | 6 | 12 | 18 | 24 | 6 | 12 | 18 | 24 | 6 |
| bash | 3 | 6 | 9 | 12 | 15 | 3 | 6 | 9 | 12 | 15 | 18 | 21 | 3 | 6 | 9 | 12 |
| regexp | 5 | 10 | 5 | 10 | 15 | 20 | 5 | 10 | 15 | 20 | 5 | 10 | 15 | 20 | 5 | 10 |
Jak widać zadania same wpadają we własny rytm. Odstępy są nieregularne, ale adekwatne do początkowej wagi. W tym systemie nawet zadanie z bardzo małą wagą, kiedyś doczeka się swojego czasu. Może się zdarzyć, że kilka zajęć uzyska taką samą sumę np. 12. Wówczas można wybrać pierwsze z brzegu, albo (bardziej matematycznie) wykonać to, które miało początkowo większą wagę.
Prosta matematyka, a jaka doskonała.
Przykład: wybierz edytor na dziś ;P
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import os, pickle
tasks={ 'geany':'7',
'emacs':'5',
'vim' :'4',
'nano' :'3',
'gedit':'2',
'kate' :'1'}
old={}
new={}
db=os.getenv("HOME")+"/.editor.db"
# load saved
try:
with open(db, 'r') as f:
old = pickle.load(f)
except Exception, e:
old = tasks
for k,v in tasks.items():
suma = int(v)
try:
suma += int(old.get(k))
except Exception, e:
pass
new[k] = suma
current = max(new,key = lambda x: new.get(x))
new[current] = 0
# save new
with open(db, 'w') as f:
pickle.dump(new,f)
# return current task
print current
Brak komentarzy:
Prześlij komentarz