Mariusz Bartosik's website

Graphics programming, demoscene and book reviews

This review is in Polish, just like the book. You can try to translate it to English.

Zrozumieć programowanie

Zrozumieć programowanie book cover

Gynvael Coldwind

PublisherWydawnictwo Naukowe PWN
Published2015-10-27
ISBN9788301184605
FormatEbook
Print pages624
Genre

Stały rozwój oprogramowania powoduje przyrost ilości dostępnych bibliotek, frameworków i wrapperów. Kolejne warstwy przykrywają poprzednie i łatwo zapomnieć o tym, co tak naprawdę dzieje się na niższych poziomach. Na szczęście aby to zrozumieć lub przypomnieć sobie, wystarczy sięgnąć po książkę Gynvaela Coldwinda.

Dla kogo jest ta książka?

Tytuł książki może być różnie interpretowany. Z jednej strony może sugerować jakieś monumentalne dzieło, w którym autor będzie chciał zawrzeć uniwersalną teorię, ostateczną odpowiedź na pytanie o sens dziedziny. “Zrozumieć fizykę”, “Zrozumieć programowanie”, “Zrozumieć kobietę” – to muszą być jakieś trudne rzeczy! Czy to w ogóle możliwe?! Z drugiej strony, można go odebrać jako rzecz dla początkujących, którzy nie rozumieją jeszcze o co chodzi i trzeba im to trochę wyjaśnić. Jak jest w tym przypadku?

Tematyka obejmuje zagadnienia, które powinny być wykładane na pierwszym roku studiów informatycznych. Architektura komputerów, komunikacja sieciowa, formaty zapisu liczb, procesy, wątki, systemy plików i inne.

Autor nie uczy samego programowania. Czytelnik powinien już znać przynajmniej podstawy języka takiego jak C, C++, Python czy Java. W przeciwnym wypadku sporo zagadnień może okazać się zbyt abstrakcyjnych. Książka nie jest więc elementarzem programowania. Dla nowego adepta tej sztuki powinien nim być podręcznik do nauki wybranego języka. Z tej książki można się za to dowiedzieć rzeczy, które są najczęściej pomijane lub omawiane skrótowo w tych podręcznikach.

Co ciekawego w środku?

Książka jest podzielona na 5 części. Zobaczmy, co można w nich znaleźć.

Część I – Kilka codziennych czynności. Autor omawia posługiwanie się konsolą i interpreterem poleceń, standardowe wejście stdin, wyjścia stdout i stderr, przekierowania – wszystko co będzie potrzebne, gdy nie używa się środowiska graficznego.

Inną przydatną umiejętnością jest czytanie źródeł w nieznanym języku. Na podstawie podobieństw składni, nazw funkcji itp., programista może domyślić się zasady działania programu. Dostajemy tutaj praktyczny przykład takiego czytania wraz z wyjaśnieniem kolejnych wniosków. Nie da się jednak ukryć, że skuteczność będzie wzrastała wraz z poznawaniem kolejnych języków, niczym przykładanie kolejnych części układanki.

Część II – Podstawy. Wraz z omówieniem podstaw architektury komputerów, mamy możliwość zbudowania własnego! Oczywiście wirtualnego, ale analiza działania instrukcji takiego procesora pozwala zrozumieć, co dzieje się wewnątrz tych prawdziwych. Dla osób, które nie miały jeszcze styczności z asemblerem, może to być trudny temat. Na szczęście Gynvael udostępnia gotową implementację takiej maszyny, więc można skupić się na eksperymentowaniu z własnymi, prostymi programami.

W podstawach znajduje się też dokładne omówienie typów liczb naturalnych i całkowitych, a także zmiennoprzecinkowych. Całość dopełniają informacje związane z posługiwaniem się znakami i łańcuchami znaków.

Część III – Wykonywanie programu. W systemie operacyjnym nasz program nie jest jedynym, który wykonuje procesor. Co więcej, on sam może być podzielony na wątki i wykonywany równolegle. Z tej części dowiadujemy się o większości kwestii związanych z procesami, wątkami oraz ich synchronizacją.

Część IV – Pliki i formaty danych. Programując, nie można się obejść bez wiedzy, jak wczytywać i zapisywać dane do plików. Wszystkie podstawowe zagadnienia związane z ich systemem i samymi plikami binarnymi i tekstowymi są opisane w tej części. Dodatkowo, otrzymujemy dokładne opisy budowy popularnych formatów BMP i PNG.

Część V – Komunikacja. Tutaj można się dowiedzieć, jak komunikują się ze sobą procesy oraz jak przekazywać informacje w sieci.

Każdy rozdział kończy się zestawem ćwiczeń, które można wykonać dla utrwalenia wiedzy. Sama teoria jest poparta praktycznymi przykładami. Co ciekawe, autor zmienia język programowania; raz może to być rozwiązanie w C/C++, a chwilę później czytamy źródła w Pythonie lub w Javie. Podoba mi się takie podejście, ponieważ podkreśla to fakt, że sam język to tylko narzędzie.

W ostatnim rozdziale Gynvael przekonuje też, że warto rozwijać swoje umiejętności przez programowanie dla zabawy. Można pisać jak najkrótszy kod realizujący dane zadanie albo używać języków ezoterycznych. Istnieją też serwisy z zagadkami algorytmicznymi w których rozwiązywaniu można konkurować z innymi. Ciekawym doświadczeniem może być udział w konkursach gamedev; np. stworzenie gry z zadanym motywem w ciągu 24 godzin. Jeszcze inną formą programowania dla zabawy, którą oczywiście również polecam, jest tworzenie produkcji demoscenowych. Miłym akcentem jest wzmianka o magazynie Hugi, do którego dawno temu zrobiłem “Headlines demo”.  Nie mogło też zabraknąć polecenia udziału w konkursach CTF, o czym więcej za chwilę.

Jeśli chodzi o samą formę przekazu, to język użyty w książce jest przystępny, autor potrafi wyjaśniać proste jaki i trudne zagadnienia. W wielu miejscach znajdziemy dodatkowe przypisy. W wersji elektronicznej powoduje to jednak uczucie przesytu; co jakiś czas trzeba “klikać” palcem w ekran, aby przeczytać informację i następnie ponownie “kliknąć”, aby zamknąć okno przypisu. I tak 305 razy. Jest to trochę niewygodne, część dygresji mogła się znaleźć w głównym tekście. Drugą rzeczą rzucającą się w oczy, jest nadmierne stosowanie wyrażenia “de facto”, które to, de facto, można usunąć, a zdania nie stracą sensu.

Flagi

Gynvael jest również kapitanem zespołu Dragon Sector, który odnosi sukcesy na scenie CTF, czyli “Capture The Flag”. Dla niewtajemniczonych: kilkuosobowe drużyny spotykają się w określonym miejscu (lub uczestniczą w wydarzeniu zdalnie), aby w ograniczonym czasie rozwiązać praktyczne zadania związane z bezpieczeństwem systemów, inżynierią wsteczną, kryptografią lub steganografią. Dowodem na obejście zabezpieczenia, odkodowanie hasła lub odczytanie ukrytej informacji jest “flaga”, czyli ciąg znaków ze stałym identyfikatorem i unikalną treścią, np. Flag{w3ll_d0n3!}. Flagi mają swoją wartość punktową, wynikającą z poziomu trudności. Wygrywa drużyna, która zdobędzie najwięcej punktów.

W książce jest ukrytych 12 flag, oznaczonych kodami od Alpha do November (z jakiegoś względu brakuje Hotel i India; może to sugerować, że jednak jest ich więcej, a nieodkryte nie są pokazywane w rankingu). Ich poszukiwanie i rozwiązywanie jest oczywiście opcjonalne, ale może przynieść sporo dodatkowej zabawy. Znalezienie 11 z nich (jak do tej pory, choć nawet podczas pisania tego tekstu znalazłem jedną), zajęło mi więcej czasu niż przeczytanie samej treści. Jeżeli do książek ktoś używa podobnego przelicznika jak do gier (stosunek ilości godzin rozrywki do ceny), to myślę, że będzie nawet bardziej niż usatysfakcjonowany.

Stopień trudności zdobycia flagi jest zróżnicowany, do najprostszych nie są potrzebne szczególne umiejętności programistyczne. Wystarczy być wyczulonym na bajty o wartościach 0x46, 0x6c, 0x61, 0x67, 0x7b, czyli na początkowy ciąg “Flag{” zapisany heksadecymalnie. Na inne trzeba poświęcić więcej czasu, wykonując i analizując przykładowe programy lub pisząc własne rozwiązanie. Rekordowo dużo czasu zajęło mi rozpracowanie flagi Juliet (mogło to być nawet kilka godzin), ale to temat na osobny artykuł. Znalezione flagi można zgłosić na podstronie książki, gdzie znajduje się ranking dociekliwych czytelników.

Drobna uwaga do wielbicieli papieru elektronicznego. Zdziwiłem się, gdy po przeczytaniu książki okazało się, że odnalazłem tylko trochę ponad połowę flag. Zaintrygowany tym faktem rozpocząłem poszukiwania jeszcze raz, tym razem otwierając ebooka na komputerze. Rzeczywiście, niektóre ilustracje zawierające napisy są mało czytelne na 6 calowym Kindlu (nawet w trzeciej generacji z większym DPI), a brak koloru i automatyczne przeskakiwanie okładki również nie ułatwiają sprawy. Jeśli czujecie, że coś przeoczyliście, zwróćcie na to uwagę.

Podsumowanie

Książka obejmuje dosyć szeroką tematykę, przez co nie można jej porównywać z tymi skupiającymi się tylko na jednym zagadnieniu typu “Effective Modern C++”. Nie można się z niej nauczyć nowego języka programowania, jak tworzyć algorytmy albo optymalizować wydajność kodu. Zawiera za to dużo informacji o niskopoziomowych mechanizmach, o których nawet starsi programiści mogli już zapomnieć, jeśli ich na co dzień nie używają, lub robią to nieświadomie.

Przypominanie o nich jest ważne, ponieważ w zawodzie pojawia się coraz więcej osób bez akademickiego wykształcenia w tym kierunku. Może się okazać, że nigdy nie zastanawiały się one, co tak naprawdę się dzieje, gdy program wyrzuca wyjątek, lub też czy do dopasowania stringa do wzorca lepiej napisać własną procedurę, czy też jedną linijką uruchamiać cały silnik Regex’a. Lektura książki pomoże początkującym w uzyskaniu świadomości procesów zachodzących bliżej sprzętu, a bardziej doświadczonym umożliwi odświeżenie wiedzy.

Podoba mi się też pomysł na zamieszczenie ukrytych flag. Daje to dodatkową rozrywkę, rozwija umiejętności i czyni książkę na swój sposób wielopoziomową. Wymagało to też dodatkowego wysiłku i czasu na ich przygotowanie.

“Zrozumieć programowanie” mogę polecić nie tylko początkującym znającym już jakiś język, ale też wszystkim entuzjastom programowania, bez względu na to, czy robią to hobbistycznie, czy zawodowo. Chętnie przeczytam też kolejne książki autorstwa Gynvaela Coldwinda.

Avatar

Written by Mariusz Bartosik

I'm a software engineer passionate about 3D graphics programming and the demoscene. I'm also an educator and enthusiast of e-learning. I enjoy reading books. In my free time, I secretly work in my lab on the ultimate waffles with whipped cream recipe.

Comments

2 comments on “Zrozumieć programowanie”

Leave a Reply

Required fields are marked *. Your email address will not be published. You can use Gravatar to personalize your avatar.

Allowed HTML tags: <blockquote> <a href=""> <strong> <em> <pre> . Use [code lang="cpp"] and [/code] for highlighted code.