Dziel i rządź

Dziel i rządź

Istnieje technika rozwiązywania problemów programistycznych, nazywana „divide and conquer” – „dziel i rządź” (to nie jest dosłowne tłumaczenie, jednak takie się przyjęło w polskich książkach). W najbardziej ogólnych założeniach polega ona na tym, że – gdy piszemy program, który rozwiązuje złożony problem – należy ten problem podzielić na mniejsze podproblemy i kontynuować dzielenie tak długo, aż dotrzemy do problemów prostych do bezpośredniego rozwiązania. Dokładnie ta sama metoda świetnie sprawdza się przy rozwiązywaniu życiowych problemów, szczególnie takich, które na pierwszy rzut oka przytłaczają i wydają się być całkowicie nierozwiązywalne.

Niech za przykład posłuży nam następująca sytuacja: mamy X, studenta 1. roku czegokolwiek, który chce się usamodzielnić i wyprowadzić od rodziców. Problem: mieszka z rodzicami i na ich utrzymaniu. Cel: chce mieszkać sam i samodzielnie się utrzymywać. Na pierwszy rzut oka, jednocześnie proste i skomplikowane. Proste, bo wystarczy odpowiedzieć: „zacznij zarabiać i wyprowadź się z domu”. Skomplikowane, bo taka odpowiedź nie daje absolutnie żadnych informacji, co dokładnie X powinien zrobić. Rozbijmy więc problem na mniejsze podproblemy.

Zaczynając od części „mieszka z rodzicami, chce mieszkać sam”. W celu wyprowadzki konieczne jest: mieszkanie, do którego się wyprowadzi i finanse na utrzymanie tego miejsca. Mieszkanie trzeba znaleźć – do rozwiązania są: zorientowanie się w cenach mieszkań w interesującej okolicy, znaleźć kilka interesujących ogłoszeń, znaleźć źródło finansowania mieszkania. Ostatni punkt zwykle będzie realizowany jako praca (rozwiązujemy od razu problem: „jakie źródło finansowania będzie odpowiednie”) i sprowadza się do: poznać swoje mocne i słabe strony, znaleźć ogłoszenia o pracę dopasowane do naszych zainteresowań i możliwości, zweryfikować jakie wymagania nie są spełnione, uzupełnić wymagania, przygotować CV, wysłać przygotowane CV w odpowiedzi na ogłoszenia, zgłosić się na rozmowy kwalifikacyjne w reakcji na odpowiedzi… wystarczy, powinniście już zrozumieć. Zasada ta sama, stosowana do skutku – aż osiągniemy problemy na tyle proste, żeby je rozwiązać zamiast dzielić.

„Dziel i rządź” ma na celu doprowadzenie początkowo beznadziejnej sytuacji do stanu, w którym każdy element z osobna staje się możliwy do samodzielnego ogarnięcia. Metoda w swoich założeniach jest banalna, a jednocześnie… niespodziewanie skuteczna. Nie spotkałem się jeszcze ze złożonym problemem, którego nie udało by się w ten sposób rozpisać i przeanalizować. Na pewnym etapie podziału problemu może się okazać, że trafiamy na sytuację niemożliwą lub nierozwiązywalną – cóż, zdarza się, przynajmniej wiadomo, że mamy do czynienia z problemem niemożliwym.

Niejako przy okazji, rozkładając zagadnienie na czynniki pierwsze, buduje się lista czynności do wykonania celem osiągnięcia naszego celu. Więc dodatkowo można potraktować ten mechanizm jako sposób na przygotowywanie listy zadań w obrębie danego zagadnienia. W końcu dużo łatwiej np. zamówić transport rzeczy, wyliczyć i zorganizować potrzebne kartony, a później spakować rzeczy, niż „po prostu” przeprowadzić się z jednego mieszkania do innego. Niby więcej zadań, ale przynajmniej wiadomo, co robić.

My, programiści, mamy kilka sposobów działania, które sprawdzają się w naszej pracy. Te same metody, adaptowane do codziennego życia, często okazują się być całkiem skuteczne w niepowiązanych z programowaniem zagadnieniach. Pytanie do fellow devs – jakie jeszcze elementy naszej pracy i sposobu działania warto w ten sposób opisać i przedstawić szerszej publice?