Recenzja książki „Myślenie algorytmiczne”

Myślenie algorytmiczne to sposób rozwiązywania problemów poprzez tworzenie uporządkowanych procedur (algorytmów), które prowadzą do rozwiązania zadania w sposób efektywny i powtarzalny, spełniający postawione wcześniej założenia. Polega na analizie problemu, rozbiciu go na mniejsze części, określeniu sekwencji działań i przewidywaniu możliwych wyników. 

Myślenie algorytmiczne jest podstawą programowania komputerowego, ale ma zastosowanie także w codziennym życiu, np. przy planowaniu zadań, optymalizacji procesów czy podejmowaniu decyzji. Przykładem myślenia algorytmicznego może być przepis kulinarny, który składa się z uporządkowanej sekwencji kroków prowadzącej do założonego celu, czyli dania. Ba, przepisy kulinarne zawierają także elementy programowania współbieżnego. 

W informatyce myślenie algorytmiczne obejmuje również analizę efektywności algorytmów (np. złożoność czasowa i użycie pamięci) oraz wybór odpowiednich struktur danych. Rozwija umiejętności logicznego myślenia, kreatywność i systematyczność.

Książka Myślenie algorytmiczne” jest przeznaczona dla programistów pragnących tworzyć programy spójne logicznie i efektywne. Grupą wyróżnioną przez autora są młodzi, zdolni programiści pragnący spróbować swych sił w olimpiadach informatycznych i konkursach programistycznych. Z tego powodu przykłady dyskutowanych zadań i problemów są przez autora pieczołowicie wybrane z zasobów kilku olimpiad informatycznych z różnych krajów. Także dlatego duży nacisk położono na wybór właściwych algorytmów, zapewniających optymalne użycie pamięci i czasu wykonywania napisanego programu, ponieważ te czynniki mają szczególnie duże znaczenie przy ocenianiu prac. 

Książka nie jest podręcznikiem programowania, nie omawia podstawowych, oklepanych algorytmów w rodzaju wież Hanoi, optymalizacji grafu czy metod sortowania. Autor celowo i z rozmysłem stawia i dokładnie omawia trudne zadania programistyczne, których zapewne nie potrafiłbyś rozwiązać samodzielnie. Szczególną uwagę zwraca na analizę problemu, dobór właściwych struktur danych i analizę wydajności algorytmu. Jest to szczególnie ważne na olimpiadach informatycznych, gdzie jest narzucony maksymalny czas wykonania programu. Także witryny oceniające rozwiązania zadań bezlitośnie odrzucają rozwiązania, które nie wyrabiają się w czasie”. Dlatego elegancja algorytmu nie jest tym, co tygrysy (czyt. algorytmy sprawdzające) lubią najbardziej. Algorytmy rekurencyjne są piękne, ale niewydajne. Jak to w życiu – liczy się skuteczność.

Książka przedstawia kilka klas problemów, a w każdym z nich starannie dobrane 2-3 zadania są dokładnie omówione w różnych wariantach rozwiązania:

  • tablice mieszające,
  • drzewa i rekurencja,
  • memoizacja i programowanie dynamiczne,
  • grafy i przeszukiwanie wszerz,
  • najkrótsze ścieżki na grafach ważonych,
  • wyszukiwanie binarne,
  • kopce i drzewa segmentów,
  • struktura zbiorów rozłącznych,
  • randomizacja.

Tytuł Myślenie algorytmiczne” jest dokładnie tym, co Autor chciał przekazać. Każde zadanie (matematyczne czy programistyczne) można i należy sprowadzić do abstrakcji, która z kolei pozwala wybrać metodę rozwiązania. W przypadku zadań złożonych dobrą praktyką jest poszukanie rozwiązania dla problemu uproszczonego, pozbawionego subtelności, podobnie jak w modelowaniu fizycznych układów dynamicznych. Pozwoli to określić sedno problemu, a w konsekwencji sposób jego rozwiązania. Pozwoli też ominąć pułapki związane z niewłaściwym wyborem metody. Wybór języka programowania jest sprawą drugorzędną, Autor wybrał język C. Nie jest to trudny język, może nieco przestarzały, ale za to czytelny i zrozumiały. Osobiście wybrałbym Pythona, ze względu na wyjątkowe cechy edukacyjne tego języka, zwłaszcza struktury danych.

Ostatni rozdział książki omawia efektywność algorytmów, bo rozwiązania zadań konkursowych nie tylko muszą podać poprawne wyniki. Powinny też spełniać wymagania dotyczące wykorzystania pamięci i czasu procesora. Dlaczego? Chociażby po to, żeby wyeliminować rozwiązania trywialne i naiwne oraz metody brutalne znane na przykład z łamania haseł z wykorzystaniem słownikowych baz danych. Czas wykonania programu świadczy też o jakości zastosowanego algorytmu. Biorąc pod uwagę powyższe wymagania można dojść do wniosku, że nie jest to książka dla każdego, mimo trochę mylącego podtytułu: “Jak rozwiązywać problemy za pomocą algorytmów”. Ale jeśli trafi do właściwej osoby…

Daniel Zingaro Myślenie algorytmiczne. Jak rozwiązywać problemy za pomocą algorytmów”. Wydanie II, Wydawnictwo Helion, 2025

Notka o autorze.
Daniel Zingaro jest wykładowcą University of Toronto. Główny obszar jego zainteresowań stanowi metodyka nauczania informatyki. Jest znany z niekonwencjonalnego podejścia do nauczania. 

Recenzja książki „Linux. Podręcznik dewelopera. Rzeczowy przewodnik po wierszu poleceń i innych narzędziach”

Wyobraź sobie, Czytelniku, że jesteś programistą od lat pracującym w Windowsach. Dostałeś nowe, obiecujące zlecenie z dziedziny, na której się znasz, wymagane narzędzia programistyczne też nie są Ci obce. Jest jednak pewien problem, środowiskiem operacyjnym nie jest Twój ulubiony system Windows ale Linux. Kiedyś pracowałeś z Linuksem, ale sporo pozapominałeś. Niby Linux wciąż jest taki sam, ale nie ten sam. Pojawiły się nowe narzędzia jak Docker, rozrósł się Git. Zresztą nie potrzebujesz zostać linuksowym administratorem, nie wszystko będzie Ci przydatne.  Oczywiście wiedza linuksowa znajduje się w internecie, ale jest rozproszona i często albo zbyt zdawkowa albo, dla odmiany, za bardzo szczegółowa. Książki o Linuksie, a jest ich mnóstwo, są albo „cegłami” albo wprost przeciwnie, omawiają podstawy podstaw.  

„Linux. Podręcznik dewelopera…” jest właśnie tym, czego szukasz. Na 240 stronach autorzy, którzy sami są programistami, napisali podręcznik „dla siebie” zawierający to, co potrzebne i ani grama więcej. Wiadomo, programista sam wie, czego potrzebuje, a oni wiedzą najlepiej.  

Czego potrzebuje programista, żeby sprawnie poruszać się po systemie operacyjnym?  

  1. Wiersz poleceń, bo siła Linuksa, posiadającego wprawdzie interfejs graficzny, tkwi w rozbudowanych poleceniach tekstowych. Dlatego pierwszy rozdział traktuje o podstawach systemu plików, składni poleceń plikowych, ścieżkach względnych i bezwzględnych itp. Jednym słowem podstawy podstaw. 
  2. Procesy. Wywołanie programu uruchamia proces, którym można zarządzać. Zarządzanie procesami jest tematem drugiego rozdziału. Poznamy tu podstawowe polecenia zarządzania procesami, ich wyszukiwaniem, identyfikacją, komunikacją międzyprocesową, “zabijaniem” procesów, łącznością międzyprocesową i z systemem plików. 
  3.  Usługi. Procesy, o których była mowa w poprzednim punkcie są procesami “pierwszoplanowymi”, uruchomionymi na tle powłoki, mającymi swój początek i koniec działania. Usługi, inaczej demony to procesy uruchamiane przez jądro systemu i działające przez cały czas. Usługami mogą być na przykład bazy danych, serwery WWW, usługi sieciowe. Znajomość usług przez programistę, nawet wysokiego poziomu abstrakcji, jest bardzo wskazana.  
  4. System plików. Ten rozdział omawia szerzej uniksowy system plików, którego znajomość jest niezbędna do pracy w systemie Linux. Jest to wiedza uniwersalna dla wszystkich dystrybucji Linuksa i systemów uniksopodobnych. Tu poznamy dokładniej atrybuty plików, rodzaje dowiązań, składnię polecenia grep i find oraz łączenie wielu poleceń mechanizmem potoku (pipe).  
  5. Edytory. Tu odświeżymy znajomość z edytorem tekstów Vi/Vim, narzędziem o ogromnych możliwościach, ale okupionych koniecznością opanowania pokaźnej pamięciówki, niezbędnej, ale skłonnej do ulatywania z naszej pamięci. Autorzy nie przekazują kompletnej składni Vim’a (zajęłoby to objętość co najmniej połowy tej książki), ale udzielają kilku cennych rad dla zaczynających przygodę z Vim’em.  
  6. Użytkownicy i grupy. Linux jest systemem wielodostępnym i wielozadaniowym, więc naturalne jest zarządzanie użytkownikami i grupami i to zarówno z poziomu administratora jak i zwykłego usera.  
  7. Własność i uprawnienia. W tym rozdziale omówione jest połączenie omawianego wcześniej systemu użytkowników i systemu plików, dostęp do plików, uprawnienia oraz wszelkie manipulacje w tym zakresie.  
  8. Instalowanie i konfiguracja oprogramowania. To są ważne dwa rozdziały, zwłaszcza dla programisty. Pracując w Linuksie na pewno będzie programy instalował i konfigurował, posługując się zewnętrznymi repozytoriami pakietów oprogramowania. Dlatego ten temat jest potraktowany nieco obszerniej. 
  9. Potoki i przekierowania. To specyfika Linuksa, jedno ze źródeł jego mocy. Naprawdę warto poznać, żeby wykorzystać te naprawdę potężne mechanizmy, dzięki którym znacząco podniesiemy efektywność swojej pracy. 
  10. Skrypty powłoki. Drugi filar Linuksa to rozbudowany język skryptowy powłoki (Bash). Siłą rzeczy nie jest omawiana składnia wszystkich poleceń skryptowych i elementów języka, jedynie podstawy, ale przecież adresatem książki są programiści – douczą się. 
  11. Bezpieczeństwo. Rozdział w całości poświęcony mechanizmom bezpieczeństwa wbudowanym w system, czyli SSH, SFTP, SCP, tunelowanie.  
  12. System kontroli wersji Git. Nie jest to wprawdzie element Linuksa, ale każdy programista Gita powinien znać, nawet jeśli nie pracuje w zespole. W rozdziale tym są omówione podstawowe pojęcia Gita (dość egzotyczne), terminologia oraz bezcenne porady dla początkujących.  
  13. Docker. Zyskujący coraz większą popularność Docker to darmowy system konteneryzacji i izolowania kompletnych środowisk oprogramowania. Docker rozwiązuje wiele problemów związanych z bezpieczeństwem oprogramowania, instalowaniem i konfigurowaniem pakietów, efektywnością pracy (zwłaszcza zespołowej), przenośnością oprogramowania. Docker jest omówiony dość dokładnie, z kompletnym przykładem projektu.  
  14. Dwa ostatnie rozdziały omawiają zagadnienia monitorowania dzienników aplikacji i podstaw protokołu HTTP. 

Celem tej książki nie jest dostarczenie kompendium wiedzy, takich kompendiów są dziesiątki. Chodzi raczej o sprawienie, że czytelnik zacznie „czuć” Linuksa, nie będzie tracił czasu na popełnianie typowych błędów początkującego użytkownika i otrzyma właściwe przygotowanie do osiągnięcia biegłości w korzystaniu z tego systemu. Uważam, że Autorom się to udało, za co chwała im.  

Dodam jeszcze, że wydawcą oryginału jest znane i cenione wśród informatyków wydawnictwo Packt, co jest dobrą rekomendacją.

David Cohen, Christian Sturm “Linux. Podręcznik dewelopera. Rzeczowy przewodnik po wierszu poleceń i innych narzędziach” Wydawnictwo Helion, 2025

Notka o autorach:

David Cohen, administrator systemu Linux, inżynier oprogramowania. Popularyzator i edukator.

Christian Sturm, konsultant oprogramowania i architektury systemów. Przez całe życie zawodowe jest aktywnym programistą, znawca systemów operacyjnych i baz danych.

Recenzja książki „Myśl w języku Python! Nauka programowania”

Programowanie jest i sztuką i rzemiosłem. W obu przypadkach opanowanie warsztatu jest podstawą. 

Python jest najpopularniejszym językiem programowania, łatwym do nauczenia się przez początkującego, a jednocześnie mocnym i uniwersalnym. Można w nim pisać obiektowo i proceduralnie, można pisać proste skrypty i rozbudowane aplikacje. Mimo, że to język interpretowany, program w nim napisany wykonuje się nad wyraz szybko. Dlatego Python jest liderem w systemach AI i data science. Składnię Pythona często wykorzystuje się jako wzorcową składnię uniwersalną do prezentacji i tłumaczenia algorytmów. Oczywiście Python nie zastąpi Javy w rozbudowanych i architekturowo skomplikowanych wielkich systemach, ani języka C++ lub Rust czy Go w oprogramowaniu systemowym, ale to tylko świadczy o mocy i pewności siebie Pythona, który nawet nie próbuje swoich sił w dziedzinach, do których nie został stworzony. Dlatego „myślenie Pythonem” wcale nie jest nadużyciem semantycznym, coś w tym rzeczywiście jest. 

Allen B. Downey napisał podręcznik do Pythona. Słowo „podręcznik” jest tu jak najbardziej na miejscu. Książka uczy Pythona konsekwentnie, z lekcji na lekcję odkrywając kolejne warstwy i cechy języka. Cierpliwy czytelnik „przerabiając” kolejne rozdziały, studiując przykłady i odrabiając dołączone do każdego z nich lekcje ma wielką szansę rzeczywiście posiąść praktyczną umiejętność programowania w tym języku. Kto wie, może nawet zacznie myśleć pythonicznie, co byłoby wielkim ukłonem w stronę Autora, który postawił przed sobą taki cel.

„Myśl w języku Python” to solidny, kompletny podręcznik. Omówione są w nim wszystkie aspekty Pythona, od absolutnych podstaw dla dopiero zaczynających przygodę z programowaniem po obszernie wyłożone programowanie obiektowe. 

Dużo uwagi przyłożono do struktur danych Pythona, które są jego wyróżnikiem i czynnikiem, który zdecydował o jego przydatności do programowania przetwarzania danych, zarówno liczbowych jak tekstowych i rozbudowanych strukturalnie. Gdybym miał wymienić jedną najważniejszą cechę Pythona, która zdecydowała o jego sile i popularności, wymieniłbym listy i słowniki oraz coś, co można nazwać „wszystko w Pythonie jest obiektem”. 

Jest jeszcze jedna cecha Pythona, o której warto powiedzieć wahającym się, czy zacząć się go uczyć. Otóż jest to język bardzo czytelny, wręcz można odnieść wrażenie, że nie jest to język programowania, ale sposób opowiadania o algorytmie. Pewnie dlatego jest używany jako metajęzyk w książkach traktujących niekoniecznie o programowaniu. I dlatego skłonił autora do użycia słowa „myśleć” w tytule książki. Bo coś w tym jest.

Nie będę wymieniał tytułów wszystkich rozdziałów, wiadomo, że będzie o wszystkim, o słownikach, funkcjach, klasach i obiektach, krotkach, debugowaniu i analizie tekstu. Zacytuję tylko tytuł pierwszego rozdziału: „Programowanie jako sposób rozumowania”. 

To trzecie wydanie książki, a to świadczy o dwóch rzeczach: po pierwsze dwa pierwsze wydania sprzedały się, po drugie Autor miał szansę (i zapewne z niej skorzystał) poprawić błędy, uzupełnić i udoskonalić treść. Wiadomo, że pierwsze wersje podręczników (i programów) często nie są ideałem. 

Allen B. Downey „Myśl w języku Python. Nauka programowania. Wydanie III”, Wydawnictwo Helion, 2025

Notka o autorze:

Allen B. Downey jest emerytowanym profesorem Olin College, znanym autorem podręczników z zakresu informatyki i analizy danych. Obecnie pełni funkcję głównego data scientist w PyMC Labs.