Recenzja książki: Myśl jak programista


Co znaczy myśleć jak programista? Dlaczego ja proponuję Ci myśleć jak programista?

Taki sam tytuł, jak ten post, ma książka V. Antona Spraul’a: Myśl jak programista. Techniki kreatywnego rozwiązywania problemów, która ostatnio trafiła w moje ręce. Po przeczytaniu pierwszego rozdziału pomyślałem, że to będzie dobry temat na post dla Kierownika Projektu. Niestety, okazało się, że wcale tak nie jest. Nie przeszkodziło mi to jednak napisać o tej książce post, a dokładniej tylko o tym pierwszym rozdziale.

Pierwszy rozdział składa się z kilku łamigłówek. Na ich podstawie zaprezentowane są techniki rozwiązywania problemów. Reszta książki wymaga od czytelnika znajomości C++ lub innego języka programowania, który jest do C++ podobny. Znajdują się tam kolejne problemy, które rozwiązywane są za pomocą zagadnień z obszaru programowania, takie jak: tablice, wskaźniki, klasy, rekurencja, reużywalność kodu. Dla zainteresowanych, ale nie znających C++, proponuję przeczytanie opisów, co ten kod robi, a wcześniej zastanowienie się, jak konkretny problem rozwiązalibyście sami (stworzenie algorytmu rozwiązania). Niewątpliwie: czy jesteście programistami, czy nie, ta książka jest zbiorem przyjemnych ćwiczeń dla mózgu, trzeba się trochę pogimnastykować szukając rozwiązania (każdy rozdział zakończony jest listą około dziesięciu zadań).

mysl-jak-prgramista

Coś dla Ciebie

Zakładam, że nie jesteś programistą i nie znasz C++ ani pokrewnych mu języków. Dlaczego zatem napisałem ten post? Książka nie tylko zawiera łamigłówki i sposoby rozwiązania. Przedstawia ona analityczne podejście do rozwiązywania problemów. Są to swego rodzaju porady, które można wykorzystać nie tylko w trakcie tworzenia oprogramowania, ale również w życiu i biznesie. 

Wszystkie chwyty dozwolone

Masz przed sobą zadanie. Zapoznajesz się z problemem. W Twojej głowie tworzy się obraz sytuacji, wyliczasz dostępne środki do rozwiązania go. Spróbuj pomyśleć z drugiej strony. Nie w sposób: co mogę zrobić, aby rozwiązać łamigłówkę. Inaczej: co jest zabronione. Dzięki temu wachlarz środków umożliwiających rozwiązanie problemu może znacząco wzrosnąć. Autor jako przykład podaje historyjkę przewiezienia wilka, kozy i kapusty na drugi brzeg rzeki za pomocą łódki, do której mieści się tylko on i jedna z powyższych rzeczy. Musisz pamiętać o tym, że nie możesz zostawić bez opieki: wilka z kozą, bo wilk zje kozę oraz kozy z kapustą, ponieważ koza zje kapustę.

Gdzie jest haczyk? Spróbuj rozwiązać zagadkę sam i dopiero wtedy wróć do dalszej lektury. Haczyk tkwi w tym, że sporo osób nie wpada na pomysł przewiezienia przez rzekę jakiejś rzeczy z powrotem na brzeg początkowy.

Upraszczaj problem

Spotykamy się czasami z problemami, które zasadniczo nie są trudne same w sobie. Ich trudność polega na ich rozmiarze. Dajmy przykład: masz posortować alfabetycznie po nazwisku i imieniu swoich 4 kolegów, z którymi realizujesz teraz projekt. Zadanie nie jest trudne. Są to tylko 4 osoby. Zmieńmy trochę przykład. Pracujesz w zespole składającym się z 1000 osób. Czy jest już trudniej? Możesz napisać do tego algorytm lub użyć jakiegoś gotowego rozwiązania, a potem sprawdzić, czy jest on poprawny. Z łatwością sprawdzisz wyniki dla 4 osób, a gdy dodasz jeszcze trudne przypadki i trochę zwiększysz rozmiar problemu, to będziesz mógł wykorzystać sposób rozwiązania do dużo większego problemu. Mówiąc w skrócie: zmniejsz rozmiar problemu, znajdź sposób jego rozwiązania, a następnie wykorzystaj go do rozwiązania większego problemu!

Zaczynaj rozwiązywanie od obszaru najbardziej ograniczonego

Przypomnij sobie grę Sudoku. Aby ją rozwiązać, należy wpisywać odpowiednie cyfry. Strategia rozwiązywania tej gry, to szukanie najpierw obszarów, gdzie jest najwięcej ograniczeń. Tym sposobem możemy znaleźć miejsce, gdzie wpisać można tylko jedną liczbę, która da nam ograniczenia w innych obszarach. Rozwiązując tak problemy, unikamy tracenia czasu na rozwiązania, które później zostaną odrzucone, gdy dotrzemy do już  istniejących ograniczeń.

Wykorzystaj rozwiązania, które już znasz  szukaj analogii

Domyślam się, że, jak to mówią, nie z jednego pieca chleb już jadłeś. Zapewne nie jeden problem już rozwiązałeś. Znasz więc zadania i sposoby na poradzenie sobie z nimi. Wykorzystaj to! Przerób swoje zadanie, poszukaj analogii, zastanów się nad transformacją jednego problemu w już Ci znany. Czasami prosta transformacja problemu ma rozwiązanie w dziedzinie na pozór w ogóle z tym niezwiązanej. Kilka lat temu słuchałem od kierownika działu utrzymania, jak wygląda cały proces zarządzania czasem pracowników, tak, aby trzy linie utrzymania (nowicjusze, średnio-zaawansowani i eksperci) obsługiwali optymalnie zadania o różnej trudności. To wszystko oparte było o długą analizę i rok doświadczeń. Problem dostępu do zasobów dla zadań o różnym priorytecie jest dobrze znany np. informatykom, którzy znają go w kontekście dostępu wątków do procesora. Wystarczy wziąć to rozwiązanie i wdrożyć w dział utrzymania!

Zrób plan

Na samym początku rozwiązywania problemu, stwórz plan jego rozwiązania, np. wczytanie danych, konwersja danych, analiza danych, sortowanie, wyświetlenie wyników. Dopiero później zastanów się, w jaki sposób te dane wczytać. Taki ogólny schemat jest bardzo przydatny m.in. przy analizowaniu problemu. Możesz go również wykorzystać, do zlecenia poszczególnych zadań na zewnątrz.

Opowiedz o problemie

Nie zmuszam Cię do opowiadania wszystkim o swoich problemach. Proponuję Ci powiedzieć głośno o swoim problemie. Kiedy zaczynasz o nim mówić, przez chwilę musisz skupić się na każdym jego aspekcie oraz użyjesz własnego języka i sposobu budowania zdań. Właśnie w tym momencie możesz wpaść na rozwiązanie albo znaleźć ograniczenia, których nie byłeś na początku świadomy. Programiści używają do tego techniki żółtej kaczuszki: w trakcie szukania błędu w poprawności działania swojego rozwiązania, analizują wiersz po wierszu, mówiąc na głos językiem naturalnym, co ma on robić  (kaczuszka nie zna języków programowania). Zazwyczaj nie potrzeba nikogo innego. Programista sam znajduje błędy w algorytmie.

Eksperymentuj

Rozwiązać problemy możesz również poprzez eksperymentowanie. Nie jest to oczywiście zgadywanie, lecz kontrolowany proces poszukiwania rozwiązania. Bez planu się nie obędzie! Mając np. jakieś rozwiązanie problemu, możesz eksperymentować i podkręcać jego parametry, aby otrzymać lepsze rezultaty.

Nie poddawaj się

A na koniec: nie poddawaj się! Nie każdy problem można rozwiązać w jeden dzień. Niektóre rozwiązuje się latami, czy nawet dekadami. Obserwuj, czy jest sens, aby nadal rozwiązywać problem. A jeśli jest, to pracuj! Zrób plan, trzymaj się go i aktualizuj. Życzę powodzenia!

Podsumowując, pamiętaj, że:

    1. Dozwolone jest wszystko to, co nie jest zabronione.
    2. Upraszczaj problem i znajdź dla niego sposób rozwiązania.
    3. Najpierw szukaj rozwiązania dla najbardziej ograniczonego obszaru.
    4. Wykorzystaj znane Ci sposoby rozwiązywania problemów.
    5. Zacznij z wiedzą, którą posiadasz.
    6. PLANUJ!


Dodaj komentarz