Thursday, June 27, 2013

[en] Code Speaks To You

A colleague asked me to translate this post for some non-Polish fellows. I've been thinking about blogging in English for couple months. Some guys from Polish blogosphere have already done so. Who knows, maybe this is sign of times. Let's this one be my first small step.


So, I had an idea for a code readability criteria: code should speaks to you. I took this sentence very seriously.

Take code piece you want to challenge and:
  1. Replace all operators by words.
  2. Replace a "{" following "if" statement by "then".
  3. Split camel case names into words.
  4. Take only right "=" operator argument. Ignore the left one.
  5. Treat each line of code as a sentence ended with a dot.
  6. And now paste the given text into Text-to-Speach engine .
  7. So if you understand (without looking at the code) what you hear, the code is readable.

Let's we try with the following code.
public class List {

 private final static int DEFAULT_SIZE = 10;
 private Object[] elements;
 private boolean readOnly;
 private int size;

 public List() {
   elements = new Object[DEFAULT_SIZE];
   size = DEFAULT_SIZE;
 }
 
 public void add(Object element) {
   if (!readOnly) {
     int newSize = size + 1;
     if (newSize > elements.length) {
       Object[] newElements = new Object[elements.length+10];
       for (int i = 0; i < size; i++) {
         newElements[i] = elements[i];
       }
       elements = newElements;
     }
     elements[size++] = element;
   }
 }
}

Challenging the add method we would have a text similar to this:
If not read only.
Size plus one.
If new size greater than elements length then.
New objects size of elements length plus one.
For each elements: i of elements.
New elements.
Element.


Now paste the text above to the Text-to-Speach engine and listen :) Does it make sense?

After small refactoring of the add method it looks little bit differently.
public void add(Object anElement) {
  if (readOnly) {
    return;
  }
  
  if (atCapacity()) {
    grow();
  }
  
  put(anElement, into(elements));
}
 


private Object[] into(Object[] elements) {
  return elements;
}

private void put(Object anElement, Object elements[]) {
  elements[size++] = anElement;
}
 
private boolean atCapacity() {
  return size + 1> elements.length;
}

private void grow() {
  Object[] newElements = new Object[elements.length + 10];
  for (int i = 0; i < size; i++) {
    newElements[i] = elements[i];
  }

  elements = newElements;
}

This time the text would look a little bit different:
If read only then return.
If at capacity then grow.
Put an element into elements.


Again, paste the text above to the Text-to-Speach engine and listen what your code speaks to you. Better? :)

Monday, June 24, 2013

Code Speaks 2U, czyli Test Ivony

Przyszło mi ostatnio do głowy następujące kryterium czytelności kodu: kod musi do Ciebie przemówić. I potraktowałem to bardzo dosłownie.

Zatem weź fragment kodu, który chcesz sprawdzić i:
  1. Operatory zamień na słowa
  2. Klamerkę "{" po ifie zamień na "then"
  3. Rozbij nazwy camel case na pojedyncze wyrazy
  4. Z wyrażeń przypisania bierz pod uwagę tylko prawą stronę, lewą ignoruj
  5. Każdy wiersz kodu traktuj jako osobne zdanie zakończone kropką.
  6. Tak powstały tekst wklej do syntezatora mowy ivona.com
  7. Jeśli to, co słyszysz (bez patrzenia na kod), jest w pełni zrozumiałe, to kod jest czytelny :)

Weźmy taki przykład na przykład:
public class List {

 private final static int DEFAULT_SIZE = 10;
 private Object[] elements;
 private boolean readOnly;
 private int size;

 public List() {
   elements = new Object[DEFAULT_SIZE];
   size = DEFAULT_SIZE;
 }
 
 public void add(Object element) {
   if (!readOnly) {
     int newSize = size + 1;
     if (newSize > elements.length) {
       Object[] newElements = new Object[elements.length+10];
       for (int i = 0; i < size; i++) {
         newElements[i] = elements[i];
       }
       elements = newElements;
     }
              elements[size++] = element;
   }
 }
}

Dla metody add tekst będzie następujący:
If not read only.
Size plus one.
If new size greater than elements length then.
New objects size of elements length plus one.
For each elements: i of elements.
New elements.
Element.

No, a teraz wklej do ivona.com i słuchaj :) Ma sens?

A teraz niewielki refaktoring metody add związany przede wszystkim nazywaniem i pierwszymi dwoma krokami Naturalnego Porządku Refaktoryzacji.

Metoda przybiera następującą postać:


public void add(Object anElement) {
  if (readOnly) {
    return;
  }
  
  if (atCapacity()) {
    grow();
  }
  
  put(anElement, into(elements));
}
 


private Object[] into(Object[] elements) {
  return elements;
}

private void put(Object anElement, Object elements[]) {
  elements[size++] = anElement;
}
 
private boolean atCapacity() {
  return size + 1> elements.length;
}

private void grow() {
  Object[] newElements = new Object[elements.length + 10];
  for (int i = 0; i < size; i++) {
    newElements[i] = elements[i];
  }

  elements = newElements;
}

Tym razem tekst dla Ivony jest następujący:
If read only then return.
If at capacity then grow.
Put an element into elements.

Ponownie odsłuchaj, co Twój kod ma Ci do powiedzenia. Lepiej? :)

Monday, June 17, 2013

Nie myj zębów, rób retrospekcje!

Trudno zauważyć korzyść z robienia retrospekcji, bez ich robienia. Trudno znaleźć argumenty, zachęcić kogoś do regularnego poświęcania czasu na analizę swoich działań. Mimo wszystko chciałbym Cię namówić właśnie do regularnych (czyt. codziennych) retrospekcji.

Fakty nam "uciekają"

Gdy zastanawiamy się nad tym, co robimy, zazwyczaj popełniamy (przynajmniej) jeden kardynalny błąd. Ulegamy złudzeniu, że to co myślimy, to racjonalny i w miarę obiektywny osąd tego, co się wydarzyło. Wydaje nam się, że gdy skupimy się mocno i wytężymy szare komórki, to z możliwym do oszacowania błędem potrafimy nawet przytoczyć dane liczbowe na temat tego, co zrobiliśmy. Dlaczego myślę, że ulegamy złudzeniu?

Od dzieciństwa używasz liczb do ilościowego wyrażania rzeczy. Wszystko, co skończone można przeliczyć. Mimo, że sprawnie posługujemy się liczbami, to gdy myślimy o ilości, ma miejsce pewne zniekształcenie.
Liczby, jak sądzę, nie są czymś, czym umysł operuje w naturalny sposób. Liczby to twór abstrakcyjny. Aby ująć coś liczbowo, należy przeprowadzić złożony proces myślowy. Gdy naturalnie zastanawiasz się nad licznością, np. ile maili dziś dostałem? Twoja naturalna percepcja wygląda mniej więcej tak: jeden, dwa, trzy, cztery, wiele. Gdy pracujesz w zespole liczącym kilkanaście osób i dostaniesz pytanie: ile pączków trzeba kupić, aby wystarczyło dla wszystkich? to o ile wcześniej nie ujmowałeś liczbowo swojego zespołu, czyli: nie policzyłeś osób i nikt głośnio nie powiedział ilu/e Was aktualnie jest (poważnie! większość z nas wcale nie ma tej liczby ot tak, na zawołanie), to oczywiście podasz właściwą odpowiedź, że potrzeba siedemnaście pączków. Jednak nie przypomnisz sobie liczby, tylko pomyślisz o każdej osobie z zespołu po kolei, a dopiero potem policzysz. Co ciekawe, gdy za jakiś czas, ktoś ponownie zapyta o liczność zespołu, ze zdziwieniem odkryjesz, że nie pamiętasz. Nie jest to wiedza konieczna do pracy zespołowej, więc po prostu ulatuje.

Podobnie jest z myśleniem o czasie.
Gdy myślisz o czasie, to myślenie przebiega mniej więcej tak: dzisiaj, jutro, pojutrze, kiedyś, pewnego dnia albo dzisiaj, wczoraj, przedwczoraj, kiedyś tam, dawno temu. Bądź też orientujesz się wg istotnych wydarzeń: po wakacjach, przed tym jak się tu zatrudniłem.



Co może Cię zaskoczyć?

Analizując każdego dnia swoje działanie i zadając sobie wciąż te same pytania retrospekcyjne, nagle orientujesz się, że zanim podejmiesz jakieś działanie, już nie myślisz dzisiaj, jutro, pojutrze, kiedyś lecz na przykład dzisiaj, jutro, pojutrze, za rok, za pięć lat, kiedyś.
Twoje postrzeganie czasu poszerza się. Żeby dobrze to podkreślić: nie tylko podczas retrospekcji widzisz szerszą perspektywę, lecz zaczynasz jej doświadczać w ciągu dnia, w trakcie wykonywania swoich obowiązków. To trochę tak jakby pojawiały Ci się w głowie myśli w stylu: jeśli napiszę taki kod teraz, to przewiduję, że za rok pojawią się takie, a takie konsekwencje. Tego typu "wglądy" wiele zmieniają. Zwyczajnie nie masz ochoty podejmować niektórych działań, ponieważ aż do szpiku kości czujesz kłopoty, które z tego powodu mogą Cię spotkać. I analogiczne z działaniami mającymi pozytywny wpływ.

Podobnie ma się sprawa z naszym postrzeganiem liczności. Dzięki retrospekcjom wyraźniej dostrzegasz co?, jak? i ile? robisz.
Jakiś czas temu odkryłem ciekawe pytanie retrospekcyjne: kim się staję?. Było to mniej więcej tak, że w pewnym momencie zacząłem zauważać, że regularnie powtarzam jakieś tam zachowanie. Jednocześnie zastanowiłem się dlaczego właściwie tak postępuję? skąd się to bierze? Dotarło do mnie, że postępując w jakiś określony sposób, liczmy, że będziemy jacyś. Pretendujemy do jakiejś tożsamości, do bycia postrzeganym jako: profesjonalny programista, charyzmatyczny lider, gracz zespołowy, odpowiedzialny pracownik, przyjaciel, dobry ojciec, itd.

Liczmy więc na to, że poprzez nasze zachowania stajemy się bardziej tacy, jacy chcemy być. Ponieważ zazwyczaj nasze postrzeganie czasu oraz liczności jest mocno ograniczone do teraz i najbliższych okolic, na co dzień raczej nie zdajemy sobie sprawy, czy nasze postępowanie sprawia, że zbliżamy się do pożądanej tożsamości.

Zupełnie inaczej mają się sprawy, gdy zaprzęgniesz do działania retrospekcje. Patrzysz wtedy szerzej, wyraźniej, z odleglejszej perspektywy. I gdy każdego dnia zadajesz sobie pytanie kim się staję?, to może się zdarzyć, że na przykład zawsze chciałeś być świetnym programistą, a poprzez to, co robisz, stajesz się średnim liderem... Z własnego doświadczenia powiem, że odpowiedź na pytanie kim się staję? najczęściej robi w głowie wielkie buuum.

Z tego, co wiem, to niektórzy ludzie w jakimś momencie przeżywają owo wielkie buuum, które ktoś kiedyś nazwał kryzysem wieku średniego:) Wydaje mi się, że dzięki retrospekcjom udaje się w kontrolowany sposób adresować te wszystkie pytania, które w trakcie kryzysu zwalają się na głowę wszystkie na raz. Ale jak to będzie, zobaczymy:)

Od czego zacząć?

Istnieje z pewnością wiele sposobów retrospekcji. Wiele z nich to całe schematy postępowania i kłopot polega na tym, że gdy jeszcze nie czułem w czym rzecz, to rozbudowane checklisty mnie nudziły i nic konkretnego nie potrafiłem z nich wyczytać. Proponuję więc zacząć od czegoś znacznie prostszego.

Od prostej odpowiedzi na pytanie: Jak wykorzystałem dzisiaj czas? i spisania tego na kartce. Tak wiem, że od razu przychodzą do głowy pytania: na kartce? a nie lepiej w pliku? a może w mindmapie? a jak to będę przechowywał? czy się nie pogubię? czy danych nie będzie za dużo? a co z archiwizacją? oraz moje ulubione pytanie: jakie narzędzia to wspierają?:)

Stop! Moja odpowiedź na wszystkie te pytania brzmi: nie wiem, być może. Wiem jednak na pewno, że nie ma co zaprzątać sobie tym głowy teraz.


Jeżeli już nie będziesz mógł bez tego zacząć, to powiem, że ja na przykład używam zwykłego książkowego kalendarza. Akurat taki miałem pod ręką. Czasem moje retrospekcje to kilka punktów, a czasem cała strona zapisana drobnym maczkiem. To zależy od tego, co akurat danego wieczoru mam sobie do powiedzenia. Prowadzę retrospekcje w tej formie od dokładnie 13. lutego i muszę stwierdzić, że jest to najlepsza forma, jaką udało mi się dotąd wymyślić. Czy przejdę kiedyś na formę elektroniczną? Nie sądzę. Kalendarz mam ze sobą zawsze. Telefon czy notebook nie. Natomiast robienie wstecznych retrospekcji mija się z celem. No, ale jak mawiała moja lektorka angielskiego: never say never and don't always say always. :)

Dlaczego w formie pisemnej?

Jeśli kilka ostatnich lat spędziłeś w klasztorze albo właśnie zakończyłeś zaawansowany i intensywny kurs panowania nad umysłem, albo po prostu od urodzenia potrafisz w sposób świadomy zarządzać każdą myślą, która przyjdzie Ci do głowy, to oczywiście pisanina nie jest Ci wcale potrzebna.

Umysły większość z nas są jednak mocno niezdyscyplinowane. Jeśli postanowisz przeprowadzać retrospekcję w myślach, w trakcie kąpieli to Twój dialog wewnętrzny będzie prawdopodobnie przebiegał w następującym stylu: yyy zaimplementowałem funkcjonalność... [tutaj Twoją uwagę odwraca zbyt zimna woda] o woda zimna jak w Bałtyku..., podczas ostatnich wakacji... [tu przypominasz sobie o retrospekcji] no, więc byłem na spotkaniu z... [ale przypomina Ci się, że] o cholera! miałem zadzwonić do X! [tu biegniesz do telefonu] ok, skończyłem retrospekcję, dzisiaj było ok..

Z takiej retrospekcji nic nie wynika. Myśli uciekają, rozpraszają się i wychodzi zwykłe bla, bla, bla, bla. Retrospekcja musi mieć swój czas i swoje miejsce. Pisanie pomaga się koncentrować, nadać myślom kierunek i wydobyć z nich użyteczną treść.

Dlaczego codziennie?

A to trudne pytanie:) No bo dlaczego nie co tydzień albo co miesiąc? Porównałbym tu robienie retrospekcji do naliczania odsetek na lokacie. Wiadomo, że lokata z dzienną kapitalizacją przynosi większe zyski niż z miesięczną, ponieważ już po jednym dniu możesz dodać wypracowane odsetki i powiększyć kapitał, od którego są one liczone w dniu kolejnym i tak dalej. Wnioski retrospekcyjne to takie naliczanie kapitału, już następnego dnia możesz skorzystać z tych wniosków.

Poza tym podstawowy rytm człowieka, którym odmierza rzeczywistość to, jak sądzę, rytm dobowy. Powtarzanie jakiejś czynności każdego dnia, staje się elementem codzienności (ang. daily routine) i szybko wchodzi w nawyk.

Przecież ja nie mam na to czasu!

No i na koniec obiekcja, która pojawia się najczęściej: Nie mam czasu! Naprawdę chciałbym, ale nie mam czasu. No bo kiedy? Praca, dom, rodzina, wyjazdy itd. Jeśli Ty również, chciałbyś robić retrospekcje, ale nie masz czasu, to mam dla Ciebie radosną wiadomość: specjalnie dla Ciebie opracowałem autorską technikę, dzięki której znajdziesz czas potrzebny na codzienną retrospekcję. I to znajdziesz już dzisiaj!

W poszukiwaniu owego czasu skontaktowałem się z zaprzyjaźnionym stomatologiem i zapytałem go, przez jaki czas można bez większych szkód nie myć zębów :) Zżymał się, zżymał, lecz udało mi się z niego wydusić, że o ile odżywiasz się normalnie czyli unikasz: sacharozy, fruktozy, maltozy, dekstryny, maltodesktryny, dekstrozy, aspartamu i syropu glugozowo-fruktozowego, to spokojnie możesz odłożyć szczoteczkę i pastę na miesiąc bądź dwa, zastępując mycie szybkim "przepłukaniem":)

Oto więc mój prezent dla Ciebie: czas, który przeznaczałeś na mycie zębów, przeznacz na robienie retrospekcji. Dwa miesiące codziennych retrospekcji to wystarczający czas, aby zauważyć tyle z nich korzyści i nabrać takiego nawyku, że brak retrospekcji stanie się dla Ciebie równie wstrętny, co brak higieny jamy ustnej. A więc do dzieła! Nie myj zębów, rób retrospekcje! :)

Wednesday, June 5, 2013

Kanban On The Fridge Door

Perhaps in your case it is different, but when my family grew bigger, I started to have a backlog of household tasks. In fact, I couldn’t make it, my task lists were bursting at the seams and todoist.com frightened me with prompts every five minutes or so. As we all know, backlog leads to another backlog. The more you try to put something off, the more afraid you become. The more afraid you become, the easier you put it aside, etc. This is the initial stage that I was in.

Stage 1: What is really going on?

So I determined to do something about it. Although I did not have any idea what exactly would change, I thought to myself that if I did something – anything, whatever – at least I would see if it helped or not. Than I would have at least one thing less to test.

To gather more information, I talked with a colleague of mine who has a couple of years of experience in bringing up two children. She gave me the following hints:
  • Lack of time is not a consequence of you having children or not having them. Lack of time results from the number of things that you cannot foresee. Therefore, be more precise in your foresight.
  • Don’t add up tasks to your everyday routines. Instead, you should plan and complete one task, because if you start doing seven things at the same time, you will end up having them unfinished and you will definitely feel irritated that you haven’t done anything.
  • Keep your things always in the same place. Take this example: the night comes and you have to change the nappy. You start looking for it everywhere, make a lot of noise and wake the baby up. And this is the end of your night, thank you, now you can only dream of yourself sleeping, not to mention the tot. Therefore, always keep your things in the same place. After you have done 3 steps with your eyes closed, you have to have all the necessary equipment at your elbow.
  • Sometimes you just won’t be able to do anything. Accept it.
After some consideration I came up with the following rules of conduct: plan, limit your WIP, improve your flow, be more self-understanding. And that’s how my thoughts reached Kanban.

I came home like a whirlwind and the only thing that I could think about was to paper the kitchen walls to visualize the work process. The negotiations with my wife ended up with me having the fridge door at my sole disposal. Ok, it’s better than a poke in the eye. The first board had three columns: TO DO, IN PROGRESS, DONE.



I took action.

First effects

The change was really huge. I couldn’t pass by the IN PROGRESS sticky notes indifferently. Oh, I just couldn’t. Due to the fact that I see my fridge every day, I did not have to write the start date and monitor the progress with any special attention. I just knew when my tasks got stuck and I felt that it was just too long.

What is more, it turned out that tasks I had postponed earlier, seemed more frightening than they really were. For example: when my daughter was born I was already for some time engaged into bringing order to my documents that I had decided to thematically group in folders. For about 5 months I did not have time to finish it. This thing really bothered me and I estimated that I would need at least one whole weekend to complete this tasks. When the time for this sticky not came, it turned out that… the documents were already in order and I just had forgotten about it. Really! When I stopped working with those papers, I just didn’t complete this task in my head, so it still bothered me. When I started doing it again, after 10 minutes I felt proud to put this sticky note in the DONE column.

I started to catch up on my backlog and within two months I was there – with no overdue tasks to do.

Stage 2: Where is business value?

One evening it occurred that it all didn’t work as good as I thought. My wife told me that she saw that I did complete my tasks and that I really cared, but for her nothing changed.
-Umm… How is that possible?, I asked.
-Nothing changed. I still don’t have enough sleep, I am tired. she said showing me her task list in GoogleTask. And I don’t have time for anything. You do your job, but it does not change our situation.


And then I experienced enlightenment once again: our situation. How could I forget about it? A family is the most natural kind of team on earth! When one member of this team performs, the others get stuck. It became clear that we need to use the pull model.
My wife got her pile of orange sticky notes and I asked her to put some tasks on the board. We agreed that we would deal with them whenever any of us would have time. That is how our improved version of board came into being. The board finally involved the entire team – not only me.



Then I started to think how I should know that everything is OK. How to notice that we deal with the “right” tasks – how to recognize our business value? Due to the fact that I did not know how to identify it and I did not want to create anything artificial, I decided to start with the issues that I discussed with my wife. I decided to measure our business value with two questions:
  • Do I have time to myself?
  • Do I feel tired?
Because of the fact that my team does not feel convinced to (and interested in) the Fibonacci number and consecutive two squares, I decided to use smile index that you can see on the image.



That was a go! Both me and my wife could intuitively measure the business value of our team. We still do it – from time to time, when we walk through the kitchen, we show the level of satisfaction that we currently feel. As you can see on the image, there is some progress :)

The questions that I mentioned are also useful when we need to decide if a given task should be done now. Assuming that we will do it now, will it turn out that we have more time and we feel less tired?

Stage 3: The value stream appears

We reached the point at which our expenses rocketed. We just went too far and we realized that it wasn’t the only month that we went too far with our spending Although I used kontomierz.pl, this issue just slipped by. I was wondering how it was possible that I had had no control over our expenses. I realized that some bills had waited to be recorded for so long that the month would already be over and I either still did not have them there or I tried to catch up with recording them in a hurry.

I came to a conclusion that we have to change it as well and keep our financial activity under control. I came up with an idea of an additional swimline called FINANCES. Now that my wife felt somehow committed to this teamwork, she agreed to relocate the board from the fridge to the wall.



So we formally introduced the BACKLOG section and items from this group are regularly evaluated and we move them to the WORTH DOING section. We divided the IN PROGRESS column into three parts: FOR NOW, FOR TODAY, PENDING. We have also added the already mentioned FINANCE swimline

The new board has become more transparent, which gave us a wider perspective and… a new quality. I have soon noticed that some tasks are distinguishing in comparison to others – they are as if bigger, and when we complete them, they do not bring any major consequences. Consider the following tasks:
  • Fix the bathtub baseboard
  • Register the expenses
  • Buy tickets for a trip to the brother-in-law
and compare them with these:
  • Organize holidays
  • Find a new flat
  • Find a new flat

Urgency and importance rediscovered

Obviously, the second group of tasks implies something bigger to be done and I am aware of that. But you know what, you won’t see it until you notice it. Look at the picture below. Those fat tasks are put on violet sticky notes and I circled them in red.



For a couple of months I was working with the board, but when I finally saw it as a whole, when I saw the map of my work, I noticed the difference between these types of tasks. I noticed it in a different way than I used to notice it. I felt it to the bone. Take a look at it and you will see that the number of violet sticky notes is small if compared to the rest. It is incredible to see how many other things wait to be done and how hard it is to decide which are the priority. Those most important ones make up the so called value stream. For some of them it would be good to open a separate swimline or create a separate table.

The thing is that when you complete tasks day after day, all the tasks that you are engaged in here and now seem important – you have to complete it.
How can you not buy a ticket for a trip to the brother-in-law? Once you see everything that you do on the table, when you see the entire process of your work, you start to see some patterns. In your life you finally start to feel things that you only knew about. It has a great impact on your motivation, time management and awareness of what is important and what is not, which in turn enables you to develop a crucial skill – the ability to resign.

Additionally, we have placed a new and experimental visual representation of our spending.



http://kontomierz.pl, as I have already mentioned, is a very handy tool to keep a retrospective control of our expenses, but currently I am searching for some methods to have a prospective control. But this is another cup of tea :)

What have I learnt?

First: don’t try to come up with a great upfront solution. You need time to start noticing what you really deal with. However, you should remember that to notice you need to look at, examine and visualize your work.

Second: even in a well-knit team any change takes place gradually. It’s nice that you have a vision, but others may not share it. Start from small things, show that they work and support them with some new practices. Start from the fridge. If it works, you will soon end up having the wall :)

One more thing about urgency and importance

I have the impression that it is all not about something like: how to avoid urgent and unimportant tasks or how to delegate them (since we do not have any subordinates). It really often happens that all in all you have to complete these tasks (hands up who’s not cleaning at home?). Usually the number of such tasks is so great that you run out of time to deal with the “bigger” ones. The whole idea is about finding time for some rare important tasks. It is about completing the urgent ones without neglecting the important ones.

Kanban vs. GTD

For a number of years as my main framework I used Getting Things Done. GTD is exactly about getting things done. When you use it, you do everything that you deem important. GTD does not allow to set priorities the way we understand it. Instead, it focuses on the ways to optimize your activity through an emphasis on a clear definition of actions that you need to take, contexts in which you have to take them, and the optimal procedures that will allow you to work.

In contrast, Kanban gives you a perspective and, according to the author of the Personal Kanban book, an instant kinesthetic feedback. You see your own business process, which gives you a chance to analyze and revise it – and, of course, a lot of satisfaction from putting the sticky notes in various columns:)

I still see the great value of GTD. It really defines a lot of detailed techniques that are missing in Kanban. Here you will find a good comparison. Not to repeat myself I will just list those things that I would like to enrich my Kanban with:
  • Definition of actions to be taken; a task has to be actionable, because then it is easier to complete
  • Decomposition of tasks to make them unambiguous (more information about this technique is presented in the chapter about specification in this book)
  • Very “thick” division of actions which makes them more actionable
  • Work according to FIFO
  • Brainstorming
  • Work contexts
  • Fresh head :)
These are the major elements. I really encourage you to read both David Allen’s book and Jim Benson’s book. However, please remember that to have the knowledge does not mean the same as to know how to use the knowledge.