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