Dlaczego w C++ jest lepiej?

Skusiłem sie do napisania tej notatki w wyniku pogłębiającej się frustracji i zażenowania jakie mnie ogarnia, gdy po raz kolejny przeglądam jakiś kod źródłowy dowolnego oprogramowania napisanego (według jego autora) w C++. Niestety dosyć często się zdarza, że w rzeczywistości w ogóle to niewiele ma wspólnego z tym językiem, zastosowane techniki i styl mówią coś zupełnie innego. A jedyne co może łączyć z językiem C++ to użycie rozszerzenia .cpp dla plików źródłowych, zamiast .c.

Niniejszy blog jest chyba najwłaściwszym miejscem do wyładowania mojej "agresji" i niezadowolenia, a także przedstawienia tych fragmentów kodu źródłowego, które doprowadziło mnie do takiego stanu. Zaprezentowanie owych wycinków kodu wraz z kilkoma komentarzami i wyjaśnieniem co i dlaczego mi się nie podoba, co według mnie jest paskudne i nieodpowiednie, może być całkiem ciekawym doświadczeniem i zachętą do dyskusji. Oczywiście najważniejszą częścią byłyby spostrzeżenia i uwagi w stylu "co i jak" według mnie należy zmienić, dlaczego lepiej "zrobić to tak, a nie inaczej", wykorzystując czasem bardzo proste mechanizmy języka C++, aby poprawić nie tylko działanie, czy czytelność samego kodu, ale także pozwalające uniknąć wielu błędów na jakie mógłby natknąć sie programista używający tych "dziwnych" i nieodpowiednich konstrukcji (w dużej mierze rodem z C).

Myślę, że takie notatki na blogu, przedstawiające moje własne (i zapewne wielu innych programistów) dobre zwyczaje, techniki i style programowania w języku C++ nieco poprawią merytoryczną zawartość devbloga. Bo to prawda, że dosyć rzadko coś ciekawego tutaj się ostatnio pojawiało, ale jak sam pisałem w notce o zmianach na devblogu, nigdy nie chciałem traktować tego miejsca typowo dokumnetalono-manualowego, a więcej zawierać swoich uwag i spostrzeżeń, zdań i przemyśleń.

Wracając do wątku, mam nadzieję, że tym samym pomogą komuś dostrzec i zrozumieć nie tylko podstawowe aspekty programowania w tym wspaniałym języku, ale także dostrzec ciekawe techniki i style oraz szczypta pragmatyzmu, pozwolą tworzyć im o wiele lepszy kod, lepsze programy.

Idealnie pasuje tutaj przytoczenie kilku słów A. Koeniga ze wstępu z jednej z jego książek, które tutaj bardzo pasują i odzwierciedlają moje motywy:

Moim zamiarem nie jest nauczanie języka C++, a pokazanie, w jaki sposób myśleć podczas programowania w C++, jak podchodzić do problemów programistycznych i jak rozwiązywać je za pomocą kodu C++. Wiedzę można zdobywać systematycznie, z mądrością jest inaczej.

Nie jestem żadnym autorytetem, ani guru, nie chcę również być uważany za jakiegoś ewangelistę programowania w modern C++. Po prostu jestem programistą, myślę ze dobrym, na pewno nie bardzo dobrym, ani najlepszym, wystarczy być chociaż trochę dobrym, posiadającym jakieś doświadczenie. A wraz z nim w parze idzie cała reszta.

Na przestrzeni pewnego okresu zajmowania się daną techniką lub technologią, dochodzimy do takiego momentu, że posiadamy wypracowany własny styl i techniki jakie używamy na co dzień w swojej pracy. Do wielu z nich dochodziliśmy długą i ciężką drogą, czasami nawet na własnych błędach. Za każdym razem korygując i usprawniając swoją prace, ciągle dążąc do perfekcji.

Jakiś wkład ma w to również code review i to nie tylko własnego kodu, jaki stworzyliśmy na przestrzeni pewnego okresu, ale przede wszystkim zewnętrzny. Jesteśmy programistami, dziennie przeglądamy setki linijek kodu, a tym samym poznajemy punkt widzenia, styl oraz techniki wykorzystane przez jego autora. Nierzadko w ten sposób możemy nauczyć sie coś nowego, poznać inne, czasem o wiele lepsze rozwiązania, na które nigdy byśmy nie wpadli, a tym samym wykorzystali w swoich produkcjach.

Przeglądanie cudzego kodu pozwala w jakimś stopniu wyrobić i ukształtować swoje nawyki, dobre zwyczaje w programowaniu, szczególnie patrząc na kolejny paskudny kod, napisany przez genialnego programistę, który chyba pomylił zawody. W takich sytuacjach analizując kod, często układa nam się wizja jakby on wyglądał, gdyby autor zastosował choć kilka prostych możliwości czy nawyków, tych naszych, których my używamy już bezwarunkowo, bo stały sie one jakby niepisanym standardem, pozwalającym tworzyć lepszy i czytelniejszy kod oraz unikać wielu sytuacji do pomyłek i błędów.

Każdemu może się zdarzyć, że coś nie wychodzi dobrze, znam wielu dobrych specjalistów w różnych obszarach IT i szeroko pojętego software developmentu i security, którym pisanie w "prawdziwym" C++ niezbyt dobrze wychodzi. Programy działają, zawierają kilka błędów (przecież idealne oprogramowanie nie istnieje!), ale zastosowany styl i technika woła o pomstę do nieba. Gdzie niektóre bledy wynikają z braku znajomości niektórych możliwości C++. A wszystko pisane w stylu C. W końcu większość z nich to niskopoziomowcy, na co dzień grzebiący w binariach, asemblerze, a do C++ przechodzą głównie z C wraz z całym jego bagażem i nawykami, które w C++ stają się udręką.

Najbardziej co mnie przeraża to właśnie pisanie w C++ w stylu C. Nie ma nic do tego dla programistów C, którzy używają C++ jako lepsze C. Wielu programistów języka C tak zaczyna swoją przygodę z C++, ale niestety nie wielu z nich przechodzi na następny poziom. A co gorsza, w dużej mierze nie zdaja sobie sprawy, że w C++ mogą dużo więcej osiągnąć, większe korzyści i wygoda tworzenia oraz pielęgnowania kodu, a to wszystko przy użyciu nawet elementarnych możliwości i funkcji jakie oferuje język C++. Ale, żeby do tego dojść trzeba poznać język i jego możliwości, a wystarczy tak nie wiele.

Nie będę tutaj teraz rozpisywał sie na temat tego dlaczego w C++ byłoby lepiej niż w C, bo dosyć ciekawe uwagi i wnioski można znaleźć w kilku początkowych rozdziałach książki Andrewa Koeniga i Barbary Moo o tytule "Język C++: Koncepcje i techniki programowania" (Ruminations on C++: A Decade of Programming Insight and Experience).

Tytuł tej notatki nawiązuje i abstrahuje w pewnym sensie do tytułów kilku początkowych rozdziałów i podrozdziałów tejże książki - "Dlaczego... C++...".

Skoro już jesteśmy przy temacie książek, to zdaję sobie sprawę, że zapewne wiele tematów i aspektów jakie poruszę będzie można znaleźć w wielu książkach i publikacjach, jak chociażby autorstwa Meyersa z słowem "effective" w tytułach lub innych traktujących o stylach i technikach. Będzie to jedynie świadczyć o tym, że nie tylko ja myślę podobnie, a inni, czasem może nawet jacyś guru się ze mną zgadzają, co będzie na pewno miłym aspektem ;)

Nawiązując jeszcze do tematyki języków C i C++ to ciekawe informacje, które może pomogą zmienić nastawienie co bardziej zatwardziałych zwolenników tego pierwszego oraz obalić kilka mitów jakie wyrosły wokół tego drugiego, szczególnie w społeczności programistów języka C jest rozdział C mówimy nie! (małe advocacy) oraz Wiadomości wstępne w publikacji Sektora pt. "C++ bez cholesterolu".

Dla tych, którzy chcieliby poznać dlaczego, niektóre elementy języka "wyglądają tak a nie inaczej", zrozumieć założenia jakie przyświecały podczas projektowania języka, konkretne cele i zasady mające wpływ na jego kształt, polecam lekturę książki "Projektowanie i rozwój języka C++" (The Design and Evolution of C++) samego twórcy języka C++ pana Bjarne Stroustrupa. Wraz z jego pierwsza książka o C++ - "Język C++" (The C++ Programming Language) tworzą biblię programisty C++ ;)

Odnośnie technicznych aspektów notatek jakie się pojawią zgodnie z zapowiedzią z niniejszego postu, myślę ze notatki te będą pojawiać sie w różnych odstępach czasu. Głównie w sytuacjach, gdy trafie na "genialne" rozwiązania, styl, czy technikę w przeglądanym właśnie kodzie i będę miał czas, aby wylądować swoją frustracje, przedstawiając jak to należy zrobić, aby było lepiej, używając możliwości języka C++. Oczywiście czasem też mając trochę czasu i ochotę pojawia się notatki nie bazujące na żadnym kodzie, a przedstawiające jedną z dobrych praktyk czy reguł pragmatycznego programisty C++.

Poziom notatek będzie zróżnicowany, w przypadkowej kolejności, zależnie od wspomnianego natchnienia, czyli jutro może być coś prostego, łatwego, o czym wszyscy wiedzą i (prawie) wszyscy stosują, a pojutrze coś cięższego, po czym znów powalimy bardzo niskim poziomem przyziemnych spraw.

Notatki będą prócz standardowych etykiet (C++, programowanie) tagowane również jakimś specjalnym do tego celu tagiem, aby łatwo można było wyodrębnić wszystkie notatki.

Dobrze, już ochłonąłem, więc mogę wracać do swojej pracy - kodu ;)

Wkrótce może pojawi sie pierwsza notatka, ale to dopiero jak znów mnie coś przysporzy o ból głowy, zirytuje i wystawi moją cierpliwość na próbę, czyli trafie na iście genialny kod.

Mały disclaimer:
Mam nadzieję, że nikt się nie obrazi jeśli trafi w którejś notatce na swój kod lub zostanie podany jako autor danego fragmentu. Nie chcę nikogo obrażać ani bezpodstawnie krytykować (prócz konstruktywnej krytyki), a tym bardziej wytykać placami błędów (to chyba będzie się zdarzało), czy, o zgrozo, podważać czyjeś kompetencje, to nie jest moim celem i zamierzeniem. Po prostu wykonuję swoją pracę, robię to co muszę zrobić ;)

3 przemyślenia nt. „Dlaczego w C++ jest lepiej?”

  1. Chyba osobna kategoria przydałaby się na tego typu wpisy. I powiem, że czytam je z zaciekawieniem, mimo że nie mam praktycznie nic wspólnego z programowaniem w C++ poza niewielką ilością miniprojektów w szkole. Jest to dobra odskocznia od Javy i PHP, a dodatkowo mogę się dowiedzieć ciekawych rzeczy o języku.

  2. Dużo prawdy jest w tym co Pan napisał. Wszyscy myślą, że tworzenie aplikacji w C++ jest czymś na czym się znają ale jak przychodzi do sprawdzenia poprawności kodu wychodzi co innego… Pozdrawiam!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *