Najpierw trochę tła. Jest sobie projekt, polega na testowaniu aplikacji. Takiej trochę większej aplikacji. Pracuje przy nim kilka osób. Z różnych powodów podział pracy jest taki, by w miarę możliwości kluczowe elementy były sprawdzone co najmniej na dwie pary oczu. Nie chodzi tu o testowanie tej samej funkcji przez dwie różne osoby, ale szukanie funkcji "podobnych do siebie" i rozdzielenie ich między różne osoby. Dzięki temu może zajść jedna z (grubsza) dwóch sytuacji:
- znalezione są te same rzeczy,
- znalezione są różne rzeczy,
Jeśli jakiejś funkcji (lub funkcjom realizowanym w podobny sposób) przyglądają się oddzielnie różne osoby (to "oddzielnie" może być dość istotne, trzeba pamiętać o ryzyku myślenia grupowego), jest szansa na szersze, być może bardziej kreatywne spojrzenie. Ciekawym przypadkiem jest sytuacja, gdy znalezione są nieco różne rzeczy. Może to znaczyć, że albo badane funkcje różnią się między sobą, albo być może warto uzupełnić proces testowania o te elementy, które zaowocowały znalezieniem tych dodatkowych "różnych" rzeczy.
Tym razem chodzi mi głównie o przypadek, gdy w funkcjach w pewnym stopniu podobnych do siebie (ale nie identycznych) są znajdowane różne podatności (lub te same podatności, ale w różnych parametrach). W takim przypadku warto zweryfikować "na krzyż", czy podatności występujące w funkcji A występują również w funkcji A' (nie muszą, co więcej założenie, że jeśli coś wygląda tak samo i realizuje praktycznie taką samą funkcjonalność, to działa w taki sam sposób i jest obsłużone przez ten sam kod, jest bardzo często błędne). Czasami okazuje się, że stan z notatek nie do końca zgadza się z rzeczywistością. W jednym module została znaleziona podatność w foo i bar, w drugim tylko w bar. Sprawdzenie podatności w foo kończy się niepowodzeniem. Co więcej próba odtworzenia podatności w foo w tym pierwszym module (tam, gdzie według notatek podatność istniała), kończy się niepowodzeniem. Co wówczas?
Teoretycznie w notatkach powinna być wystarczająca ilość informacji, by te wątpliwości rozwiać. W praktyce tak być nie musi. Jeśli w jakieś funkcji występuje pewna podatność o dokładnie takiej samej genezie, sposobie działania i sposobie wykorzystania, w notatkach może się znaleźć dokładniejszy opis dla bar oraz wymienienie pozostałych parametrów (np. tego foo), w których występowanie słabości/podatności zostało stwierdzone.
Pisałem o szpiegowaniu samego siebie. Jak sobie radzę z sytuacjami takimi, jak opisane wyżej? Nie, nie ma to nic wspólnego z moją "pamięcią prawie absolutną", którą podobno posiadam :P Ma to natomiast związek ze sposobem, w jaki prowadzę notatki. Jak już kiedyś pisałem, korzystam z FreePlane (wówczas jeszcze z FreeMind) do prowadzenia notatek. Wyglądały one kiedyś mniej więcej tak:
I dla lepszego zrozumienia trochę szczegółów:
Obecnie moje notatki wyglądają nieco inaczej, sama koncepcja jest jednak taka sama. Rozpisanie aplikacji pod względem funkcji, rozpisanie punktów wejścia (najczęściej formatki) i notatki na poziomie parametru. Oczywiście nie zawsze takie podejście jest najlepsze, w bardzo wielu wypadkach sprawdza się jednak całkiem dobrze. W dodatku całkiem szybko się w nich jestem w stanie odnaleźć, choćby dzięki funkcji filtrowania oraz w miarę konsekwentnemu korzystaniu z ikonek.
A teraz przejdźmy do smaczku właściwego. Otóż każdy węzeł w mapie zawiera dwa znaczniki czasu, datę utworzenia oraz datę ostatniej modyfikacji. Na tej podstawie mogę ustalić kiedy dana notatka została sporządzona. A ponieważ notuję na bieżąco, jest to dla mnie wskaźnik gdzie szukać szczegółów. Właściwie nie tyle gdzie, ale kiedy. Wystarczy po prostu otworzyć odpowiedni plik logów local proxy by cofnąć się w czasie w to miejsce, kiedy dany test był wykonywany. Odpowiedni plik wskazuje oczywiście czas. Z tego samego powodu każdy screen, który wykonuję, również posiada własnego timestampa. Również dzięki temu jestem w stanie wrócić do przeszłości i sprawdzić o co dokładnie chodziło.
Podobno pojemność naszej pamięci jest ogromna. I nie chodzi mi tu o mity typu "człowiek używa tylko 20% swojego mózgu", tylko o aktualną wiedzę na temat jego (to znaczy tego mózgu) pracy. Zapominanie to bardzo często nie tyle "zniknięcie" informacji, co utracenie zdolności dotarcia do niej. Ta informacja wcale nie musi być utracona bezpowrotnie, przecież często w końcu "przypominamy sobie", choć czasem może być już trochę za późno. W tym przykładzie mindmapa pełni rolę swoistych wskaźników na miejsce, w którym w razie potrzeby bardziej szczegółowe informacje można znaleźć. Nawet jeśli to miejsce znajduje się tylko w mojej głowie.