Często słyszę pytanie od moich uczniów, uczennic – jak powinien myśleć programista, programistka? W tym artykule postaram się odpowiedzieć na to pytanie oraz wyjaśnić, dlaczego wymieniam akurat te trzy metody – myślenie abstrakcyjne, strategia, taktyka. Podejście, które opiszę wynika z mojego doświadczenia jako programisty oraz mentora. Samemu stosuję wspomniane metody oraz uczę ich moich uczniów, uczennice.

Najpierw zacznę od wyjaśnienia przedstawionych pojęć. Następnie pojęcia przeniosę na grunt programistyczny. Należy pamiętać, że projektując, a następnie implementując dowolny element – nawet ten najmniejszy – sytemu informatycznego należy podejść do tematu bardzo abstrakcyjnie, mieć ustaloną strategię i realizować taktyczne działania.

Wyjaśnienie pojęć pozwoli ustalić wspólny pogląd na opisywane przeze mnie zagadnienia. Na gruncie programistycznym pojęcia przedstawię na przykładzie aplikacji, systemu informatycznego obsługującego prywatną przychodnię lekarską.

Myślenie abstrakcyjne

Myślenie abstrakcyjne – na czym polega?

To proces, który pozwala nam zastanowić się nad rzeczami, których nie ma w obecnej przestrzeni i chwili. […] Pozwala nam także zastanowić się nad ogólnymi koncepcjami i zasadami […]. Służy do pamiętania różnych aspektów sytuacji, przewidywania i planowania na przyszłość, myślenia symbolicznego i wyciągania wniosków. […] Źródło: https://pieknoumyslu.com/myslenie-abstrakcyjne-na-czym-polega/

Abstrakcja (programowanie)

Abstrakcja – pewnego rodzaju uproszczenie rozpatrywanego problemu, polegające na ograniczeniu zakresu cech manipulowanych obiektów wyłącznie do cech kluczowych dla algorytmu, a jednocześnie niezależnych od implementacji. Źródło: https://pl.wikipedia.org/wiki/Abstrakcja_(programowanie)

Dlaczego potrzebne jest abstrakcyjnie myślenie?

Dlaczego potrzebne jest abstrakcyjnie myślenie? Powyższe opisy, tego pojęcia bardzo dobrze wskazują na najważniejsze elementy tej metody. “To proces, który pozwala nam zastanowić się nad rzeczami, których nie ma w obecnej przestrzeni i chwili.”, programując będziemy tworzyć, pisać kod dla rzeczy, których jeszcze nie ma, nie istnieją. “Abstrakcja – pewnego rodzaju uproszczenie rozpatrywanego problemu, polegające na ograniczeniu zakresu cech manipulowanych obiektów wyłącznie do cech kluczowych dla algorytmu, a jednocześnie niezależnych od implementacji.”, tak właśnie należy tworzyć, pisać kod źródłowy, w dużym uproszczeniu: minimalny, niezbędny zestaw elementów, cech; niezależne od sposobu implementacji.

Przykład programistyczny

Wyobraźmy sobie, że zostaliśmy poproszeni o dodanie modułu, który nakłada limity rezerwacji wizyt w tygodniu, np.: maksymalnie trzy wizyty – system informatyczny obsługujący prywatną przychodnię lekarską. W systemie zapewne istnieją takie pojęcia jak: Przychodnia, Wizyta, Pacjent i Rezerwacja oraz mechanizmy i procesy ich wspólnej interakcji. Natomiast pojęcie Limitu Wizyt jeszcze nie istnieje, należy je zdefiniować, a następnie zaimplementować, czyli napisać kod źródłowy. Definicję pojęcia Limit Wizyt należy omówić i potwierdzić z osobami zamawiającymi dany moduł. Nowo powstały model dziedziny – Limit Wizyt – musi współgrać z istniejącymi mechanizmami oraz procesami. Nie traktujemy, tego etapu jako wyroczni, wiele elementów może ulec zmianie w późniejszych etapach.

Strategia

Strategia

Przemyślany plan działań w jakiejś dziedzinie. Źródło: https://sjp.pwn.pl/sjp/strategia;2576315

Strategia (teoria gier)

Strategia – plan działania gracza opisujący jego zachowanie w każdej możliwej sytuacji. Strategia w pełni określa akcję (ruch), którą gracz podejmie w danej sytuacji, na każdym etapie gry, dla każdej możliwej historii prowadzącej do tej sytuacji. […] Źródło: https://pl.wikipedia.org/wiki/Strategia_(teoria_gier)

Co daje strategia?

W telegraficznym skrócie, strategia, to plan działania, który pozwala zrealizować wyznaczony cel. Określa ona plan oraz cel, do którego dążymy. Na temat planowania implementacji kodu źródłowego pisałem już w artykule: Stop! Zanim zaczniesz pisać kod zastanów się, co chcesz kodować? Analiza, projekt i implementacja. “Strategia – plan działania gracza opisujący jego zachowanie w każdej możliwej sytuacji. Strategia w pełni określa akcję (ruch), którą gracz podejmie w danej sytuacji, na każdym etapie gry […]”. Tutaj słowo gracz śmiało można zastąpić wyrazem aplikacja, system informatyczny. Programista, programistka będą musieli zastanowić się nad tworzonym kodem źródłowym na różnych etapach jego działania.

Przykład programistyczny

W punkcie Myślenie abstrakcyjne – Przykład programistyczny powstał model dziedziny – Limit Wizyt – należy wyznaczyć sobie cel strategiczny. Może nim być implementacja, czyli kod źródłowy, który uniemożliwi pacjentowi rezerwację więcej wizyt niż ilość wskazana w limicie. Równie dobrze, może, to być funkcjonalność dostępna z panelu administracyjnego, dostępnego dla pracowników przychodni, umożliwiająca ustalenie takiego limitu. Na tym etapie planuję, wyznaczam kroki do osiągnięcia celu. Jednym z kroków może być konwencja nazewnicza dla tworzonych klas i/lub pakietów. Kolejny, to ustalenie czy będzie, to pojedyncza klasa, czy może cały nowy moduł. Bardzo ważnym krokiem jest sprawdzenie czy i jak będę mógł przetestować nową klasę, moduł w kontekście całego systemu – testy integracyjne.

Taktyka

Taktyka

Sposób postępowania mający doprowadzić do osiągnięcia celu. Źródło: https://sjp.pwn.pl/szukaj/taktyka.html

Taktyka

(1.2) sposób działania według wcześniej przemyślanego planu. Źródło: https://pl.wiktionary.org/wiki/taktyka

Czym jest taktyka?

Taktyka jest częścią strategi, można ją opisać jako kolejne kroki – elementy planu – które trzeba wykonać, aby zrealizować założony cel strategiczny. Tutaj po prostu realizuję kolejne kroki wyznaczone dla wybranej strategi.

Przykład programistyczny

Nawiązując do punktu Strategia – Przykład programistyczny, pierwszym krokiem jest ustalenie konwencji nazewniczej. W tym przypadku, ponownie odwołując się do punktu Myślenie abstrakcyjne – Przykład programistyczny, gdzie powstał model dziedziny – Limit Wizyt. Zastanawiam się jakie będą angielskie odpowiedniki – Limit Wizyt – większość systemów, które implementowałem były w języku angielskim, wyjątkiem był system rządowy, pisany w języku polskim. Wyraz Limit, może być zapisany jako Maximum lub Limit, wyraz Wizyta, może być zapisany jako Appointment lub Visit. Moim zdaniem, ustalenie właściwych nazw ma ogromne znaczenie. Kolejny krok taktyczny, to implementacja nowego modułu czy pojedynczej klasy. Jeżeli tworzony kod ma być używany przez inne moduły w systemie, to warto stworzyć oddzielny moduł, łatwiej go będzie współdzielić w formie zależności w postaci bibliotek – pliki JAR. Co do kwestii testów integracyjnych, to idealnie byłoby mieć możliwość wykonania takich testów na rzeczywistych danych testowych, jeżeli jest, to niemożliwe, to należy posłużyć się mockami – Mock, atrapa obiektu.


Podsumowując, projektując, a następnie implementując dowolny element – nawet ten najmniejszy – sytemu informatycznego należy podejść do tematu bardzo abstrakcyjnie. Po wykonaniu abstrakcyjnego myślenia – zastanowieniu się nad rzeczami, które nie istnieją – przechodzimy do strategi – planowania i wyznaczania celu, który chcemy osiągnąć – na końcu jest taktyka – przystępujemy do działania, czyli realizacji planu. Mając na uwadze powyższe metody myślenia o wiele łatwiej jest mi podejść do tworzenia i implementacji dowolnej aplikacji, systemu informatycznego. Zachęcam do stosowania tych metod.

Zdjęcie autorstwa Pavel Danilyuk z Pexels.