Czym właściwie zajmują się programiści? Kiedyś przeczytałem bardzo trafną odpowiedź na to pytanie. Programiści to po prostu osoby rozwiązujące pewne abstrakcyjne problemy (problem transportu na mieście, problem poszukiwania noclegu na wakacje, problem rezerwacji stolika w restauracji) w bardzo specyficzny, powtarzalny sposób.
Sposób ten polega na tym, że taki abstrakcyjny problem rozbija się na mniejsze kawałki do tego momentu, aż konkretna część tego problemu którą mamy akurat przed sobą jest “rozwiązywalna” (można na niej wykonać jakąś akcję, ponieważ zniknęła wystarczająca liczba niewiadomych). Jeśli rozwiążemy poszczególne składowe problemu to prawdopodobnie ten początkowy, bardzo abstrakcyjny problem zostanie rozwiązany w całości.
Jak rozwiązujemy poszczególne składowe? Przyjęło się, że chodzi o napisanie fragmentu kodu. Czasami jednak chodzi o prostą uwagę, że dana sprawa nie jest warta rozwiązywania, a czasami chodzi o wykonanie jakiejś fizycznej akcji która to problem rozwiązuje. W trakcie sprowadzania abstrakcyjnego problemu do bardzo jasnych i określonych składowych odkrywamy, że rozwiązanie to pewna ściśle określona sekwencja zadań która nie jest wcale tak trudna do wykonania jak mogłoby się wydawać na początku.
Sposób w jakim my, programiści, rozwiązujemy problemy, określa się czasem “specyficznym sposobem myślenia”. Mówi się, że programowania warto się uczyć dlatego, że człowiek zaczyna patrzeć na otaczającego go problemy nieco inaczej niż do tej pory.
Jeśli takie podejście do rozwiązywania problemów sprawdza się w naszej branży, to czemu nie miałoby się też sprawdzać u osób z naszego otoczenia które to programistami nigdy nie były?
Na pewno wielokrotnie w życiu prywatnym miałeś okazję słuchać osoby która stała przed problemem który ją przytłaczał. Mogła to być poważna decyzja życiowa, mogło to być duże przedsięwzięcie, ale czasami przytłaczające mogło być też coś bardziej przyziemnego jak zakup samochodu. Cokolwiek, co na pierwszy rzut oka wydawało się ponad siły danej osoby.
Jak w takim momencie postąpiłby programista? Na pewno zacząłby od zbierania wymagań. Co o danym problemie wiemy? Co jest niewiadomą? Jeśli coś jest niewiadomą, to dlaczego? Czy chodzi tylko i wyłącznie o brak informacji, czy może to tylko poboczna dygresja nad którą nie warto spędzać czasu? Jeśli to brak informacji, to kto lub co mogłoby nam pomóc dowiedzieć się o danej sprawie więcej? Pewnie warto byłoby się też zastanowić, czy dany problem to na pewno jeden “byt”, czy przypadkiem nie rozwiązujemy trzech spraw sklejonych w jedną całość? Pomyślelibyśmy też nad datą rozwiązania - czy musimy dany ruch wykonać już teraz, czy sprawa rozwiąże się sama np. za dwa tygodnie? Kolejne pytania mogłyby dotyczyć osób zaangażowanych w daną sprawę - czy rozwiązanie zależy tylko i wyłącznie od nas, czy potrzebujemy zadzwonić do kogoś o innych kompetencjach? I tak dalej…
Programowanie uczy myślenia które można zastosować do rozwiązywania problemów w niemal każdej dziedzinie życia, a my jesteśmy poniekąd odpowiedzialni za przekazywanie tego typu wiedzy dalej. Sposób na przytłaczające problemy to droga od abstrakcji, do jasno określonych składowych.
Podaj dalej.