Jestem po kolejnej lekturze o programowaniu 🙂! Przez 4 miesiące studiowałem uważnie tytuł "C#. Praktyczny kurs" (trzecie wydanie 3️⃣) 🧠. W mojej ocenie, część treści jest daleka od poprawnie napisanej 💥! Sięgnij po moją recenzję, którą starałem się przygotować najbardziej rzetelnie jak tylko potrafię 💪.
RECENZJA KSIĄŻKI "C#. PRAKTYCZNY KURS"
Muszę przyznać, że tę książkę czytało się wyjątkowo uciążliwie 😰. Głównie przez wielki stos literówek i błędnych stwierdzeń ❌. Trochę czasu siedzę w programowaniu i daleko mi do tytułowania siebie "doświadczonym", aczkolwiek wyczytałem z tej lektury dużo tez, z którymi się po prostu nie zgadzam ✋. Trzecie wydanie książki ma już parę lat (pochodzi z 2016), więc jak najbardziej zasługuje na aktualizację, choć nie wiem jak wygląda sprawa z prawami autorskimi po śmierci autora, bo mam świadomość, że Pan Marcin Lis już nie żyje 🙁.
Zostawię tradycyjnie oświadczenie przed przedstawieniem swojego zdania 👇:
Recenzując książkę autorstwa śp. Pana Marcina Lisa i prezentując swoje zdanie na jej temat, nie leżało w mojej intencji żadne złośliwe wytykanie błędów. Jedynym moim celem publikacji recenzji było przedstawienie swojej opinii oraz sprostowanie pewnych przytoczonych treści, aby ewentualne ponowne wydanie książki było pozbawione wskazanych błędów, jeśli faktycznie takimi są (bo sam mogę się mylić!).
Od tej pory, treść będzie prezentować subiektywne zdanie na temat ogółu książki co mi się w niej nie podobało (co nie znaczy, że mam rację). Startuję ▶️!
Z CZEGO SKŁADA SIĘ KSIĄŻKA "C#. PRAKTYCZNY KURS"?
Jeżeli chodzi o samo przedstawienie zagadnień, wszystko jest OK. Kolejność idzie od najbardziej fundamentalnych, po nieco trudniejsze i bardziej złożone 👍. Z niej poznasz dużo cennych informacji o tym 👇:
- jak skompilować swój pierwszy program,
- co to jest zmienna,
- jakie występują typy danych,
- jak wygląda programowanie obiektowe z podziałem na klasy,
- jak korzystać ze struktury,
- jak obsługiwać wyjątki,
- jak wygląda system zapisu i odczytu plików,
- jak zdefiniować polimorfizm,
- czym jest interfejs,
- jak się tworzy aplikację okienkową w Windows Forms.
Mam jednak 2 istotne punkty, które zaskoczyły mnie wyjątkowo negatywnie:
- rzutowanie typu można było spokojnie zaprezentować już w lekcji 17. gdzie wystąpił pierwszy przypadek rzutowania podczas przekazywania obiektu do metody, a nie dopiero w chwili tłumaczenia zaawansowanych technik programowania obiektowego (lekcja 28.),
- typy generyczne i wyrażenia lambda powinny zostać szerzej rozwinięte, gdyż zostały przedstawione zbyt powierzchownie (a są równie istotne).
O samych wyrażeniach lambda jest zaledwie niecała strona, a podczas omawiania typów generycznych zabrakło mi pokazania metod generycznych, a także jak nakładać ograniczenia w związku ze wstawianymi typami danych (np. tylko klasa X i jej pochodne) ⛔. To też jest ważne, a tego zabrakło 😮!
Rozumiem, że można jedynie zainicjować temat, tak aby człowiek po prostu wiedział, że takie coś istnieje i że w każdej chwili może posiłkować się innymi zbiorami wiedzy, aby chcieć drążyć temat 💡. Z drugiej jednak strony nie powinno się pisać o jakimś rozdziale fragmentarycznie, nie ukazując wszystkich aspektów i ważnych zagadnień ❌. Lepiej byłoby już wspomnieć powierzchownie o każdej możliwości, niż skoncentrować się szczegółowo na jednym podpunkcie nie pisząc nic o całej reszcie.
W opisywanej książce trochę też zabrakło informacji podczas przedstawiania klasy abstrakcyjnej, czym się charakteryzuje i jaką odgrywa rolę w programowaniu. Jest wspomnienie o metodach abstrakcyjnych i...tylko o nich 😟. Zabrakło mi przykładów dotyczących pól i właściwości abstrakcyjnych 🚫. Szkoda. To warto wiedzieć, że poza metodą wolno wstawić również pole i właściwość abstrakcyjną 💡.
Co do nieaktualnej treści, pojawia się tylko jeden taki przypadek 🎯. Obiekty typu "MainMenu" i "MenuItem" dotyczących biblioteki do projektowania graficznych interfejsów użytkownika, "Windows Forms" (strona 366). Od wersji ".NET Core" 3.1 używa się odpowiedników o nazwach: "MenuStrip" oraz "ToolStripMenuItem" ℹ️. Natomiast to jest kwestia wynikająca z roku wydania książki (".NET Core" w wersji 3.1 pojawił się w 2019 roku, czyli 3 lata po jej wypuszczeniu na rynek) i ponadto dotyczy tylko ostatniego rozdziału, więc to naprawdę drobna rzecz 😉.
Mimo tego, całościowo rozdziały (czy też "lekcje" w tym przypadku) są dobrze dobrane poprzez "rosnący stopień trudności" 👍. Natomiast już w treści jest dużo miejsc, które albo nie powinny wystąpić, albo zostały źle sformułowane 😐.
JAKIE WADY MA KSIĄŻKA "C#. PRAKTYCZNY KURS"?
I tu przechodzimy do wad całego tytułu, których niestety jest od cholery 😬. Dużo sprzecznych informacji, błędy na każdym kroku oraz konieczność przechodzenia przez wiele stron książki od treści zadania, aby wiedzieć jak je zrobić - to tak w największym skrócie 😔.
SPRZECZNOŚCI POMIĘDZY KODEM, A TREŚCIĄ
W książce zdarzyło się kilkakrotnie, że porównując kod źródłowy z tłumaczeniem, fakty między sobą się nie kleiły 😔.
Na przykład listing 6.44 nie powodowałby zaprzeczenia jednego ze zdań, gdyby nie jeden szczegół 🔍. Zdanie o które mi chodzi jest na stronie 342 i tam jest napisane (pisząc własnymi słowami), że w poprzednich przykładach kodów źródłowych nie wstawiono żadnego modyfikatora dostępu dla klasy wewnętrznej, poza ostatnim. A na listingu 6.44 (na stronie 339), widać wyraźnie słowo "public" przed definicją klasy wewnętrznej 😳.
Albo inne zadanie na stronie 403, w którym mowa o tym, że wszystkie kontrolki (z Windows Forms) są tworzone w konstruktorze klasy (znowu piszę swoimi słowami). Natomiast jak się przyjrzymy listingowi 7.28, to okazuje się, że wspomniane kontrolki są tworzone, natomiast podczas deklarowania ich jako prywatne dane składowe, a nie w konstruktorze. Więc poprawna jest tylko druga część zdania na temat przypisywania właściwości.
To są najmniejsze problemy w porównaniu z tym, co jest niżej 🔴!
DUŻA LICZBA BŁĘDÓW ROZPRZESTRZENIONYCH PO CAŁEJ KSIĄŻCE
W środku książki znajduje się bardzo dużo błędów w postaci literówek i błędnych określeń 🤯. Jeżeli chodzi o "rodzaje" tych błędów, to są to 👇:
- błędnie użyta czcionka w niektórych zdaniach (zamiast czcionki przeznaczonej do tekstu, została zastosowana dla instrukcji kodu źródłowego tzw. "monospace"),
- nazwy metod w przykładach kodów źródłowych odchodzących od konwencji nazewniczych panujących w języku C# (pierwsze litery są małe, a powinny być duże),
- brak w niektórych przykładach kodów źródłowych korzystania z wygód jakie oferuje język C# (np. na str. 382 jest pobieranie wartości z klasy przy użyciu metodyki znanej z Javy czyli metody typu "getter", a można było bez problemu skorzystać z właściwości),
- pomyłki w odwołaniach do poprzednich rysunków, kodów źródłowych (np. pisanie "String", zamiast "string"), rozdziałów, lekcji, ćwiczeń,
- błędy podczas wyjaśniania niektórych zagadnień (często zaszyte w pojedynczych zdaniach), które przeczą występowaniu nazw w listingach albo tabelach.
Jednym określeniem: istny "roller coaster" (w negatywnym znaczeniu) 🫨! O wiele gorszy fakt, że te błędy są rozprzestrzenione niemal po całej treści książki, czyli to nie dotyczy jakiegoś konkretnego fragmentu 😔.
TAM I Z POWROTEM
Niepotrzebna rzecz, która psuje przyjemność z czytania. Wyprzedzanie materiału poprzez sugestie, że "można pominąć tę część lekcji" i tymczasowo zajrzeć sobie na pół książki dalej, aby się dowiedzieć o co chodzi w danym momencie 😬.
Pierwszy taki przypadek, to strona 190 i 191 1️⃣. Pod koniec strony 190 pojawiają się fragmenty kodów źródłowych wykorzystujących niewyjaśniony jeszcze temat 🤨. Jeżeli to już było konieczne, to można było poprzestać na zdaniu, że "Wyjątki zostaną omówione dopiero w kolejnym rozdziale" i wtedy tam już na miejscu przypomnieć o przykładzie ze strony 190 z podanym kodem źródłowym ✅.
A drugi punkt, to strona 199 2️⃣. Jest wspomnienie o terminie, skierowanie do odpowiedniego rozdziału ("Temat interfejsów zostanie omówiony dopiero w rozdziale 6.") i prezentacja kodu źródłowego z użyciem dotąd nieomówionej konstrukcji 😠. Dodatkowo nie spodobało mi się to, że budowę interfejsu "IPunkt" także przeniesiono "na potem" (strona 324, czyli 125 stron dalej 🤣) ⚠️. Definicji interfejsu brak, a w kolejnym listingu jest już ukazana implementacja przez strukturę bez słowa wyjaśnienia ("[...] tam też został opublikowany kod interfejsu IPunkt, który jest wykorzystany w poniższym przykładzie."). Jak człowiek, który dopiero zaczyna naukę programowania, ma sobie z tym poradzić 😅?
ĆWICZENIA DO SAMODZIELNEGO WYKONANIA
Druga rzecz, która mi się nie spodobała, to prezentacja ćwiczeń dla Czytelnika celem utrwalenia wiedzy i sprawdzenia dotychczasowych umiejętności ❌. Mianowicie 👇:
- część zadań wymaga wiedzy z matematyki, bez której nie da się ich wykonać nawet jak znasz składnię, co prowadzi do tego, że pozyskanie wiedzy z całego rozdziału nie daje szans na samodzielne rozwiązanie zadania bez sięgnięcia do internetu,
- niektóre zadania wymagają ukończenia poprzednich, czyli nie rozwiążesz ćwiczenia B, bez pomyślnego uzyskania rozwiązania ćwiczenia A, co jest dziwne (zwłaszcza w połączeniu z poprzednim punktem),
- zadania powołujące się na "listingi" (treści kodów źródłowych tłumaczących konkretne zagadnienie) każą wracać do nich nawet kilkanaście stron dalej od treści zadania, co budzi frustrację, bo nieraz trzeba "skakać" między nimi, aby sobie ułożyć w głowie nasze podejście do rozwiązania,
- część zadań każe sięgać do tematów, które nie zostały jeszcze omówione, tylko po to, abyś na szybko się z nim pobieżnie zapoznał(a), a następnie wrócił(a) z powrotem do niego i mógł/mogła zacząć wykonywać (absurd 🔥!).
Tak brzmi "too long, didn't read", a gdybyś potrzebował(a) szczegółów, to schodzimy wzrokiem niżej ⬇️.
W STRONĘ MATEMATYKI!
Pierwsza rzecz, która spowodowała grymas na mojej twarzy to to, że część zadań stała się sprawdzianem wiedzy matematycznej 1️⃣. Ćwiczenia odbiegają od postawionego celu, który ma polegać na nauczeniu Cię podstaw programowania w języku C# 💡. Zamiast tego przypominają kartkówkę, na której jeżeli nie znasz wzoru ani metody na policzenie czegoś, na nic Ci się przyda wiedza zaprezentowana na poprzednich stronach, co w mojej ocenie nie ma sensu 😐.
Jeżeli już tworzymy takie zadania, to powinno się dodać do nich taką wskazówkę, która wymagałaby umiejętnego wstawienia jej do kodu źródłowego, czyli po prostu dać wzór i oczekiwać od Czytelnika, że będzie umiał go wprowadzić do programu - i to byłoby w porządku ✅. Jedyne takie wcześniejsze wyjaśnienie było tylko na stronach 171-172, natomiast cała reszta to niestety sprawdzian matematyczny 😕.
Nie twierdzę, żeby nie wstawiać takich zadań w ogóle, tylko zwracam uwagę, że tytuł "C#. Praktyczny kurs" dotyczy programowania, nie matematyki ⚠️! To jest tak, jakbyś w książce do matematyki znalazł(a) zadanie do wykonania o treści 👇:
Oblicz miejsca zerowe dla funkcji f(x) = x2 + 6x + 1. Napisz program w języku C#, który sprawdzi otrzymany wynik. Nie używaj kalkulatora ani debuggera.
Czaisz 😄?
NIGDZIE CIĘ NIE PUSZCZĘ BEZ WYKONANIA POPRZEDNIEGO ZADANIA!
Druga sprawa, która może nieprzyjemnie zaskakiwać 2️⃣. Kilkanaście zadań w tej książce wymaga od Ciebie ukończenia poprzednich. Co gorsza, są też takie zadania, które oczekują jedynie od Ciebie sprawdzenia poprawności działania, czyli są o treści:
Napisz przykładowy program ilustrujący działanie X z ćwiczenia Y.
Nie prościej dopisać do tego samego zadania "Sprawdź rezultat" 😅? Mniej pracy, zero zakłopotania 👍.
ZADANIE DOTYCZY LISTINGU. ZAWRÓĆ!
Punkt trzeci: przymusowe "przeskakiwanie" w jedną i w drugą stronę, tylko by dowiedzieć się jak wygląda wskazany listing w treści ćwiczenia 3️⃣. Rozumiem, że lepiej jest odwołać się do raz napisanego kodu źródłowego, niż 2 razy pisać to samo. Tylko problem polega na tym, że pomiędzy fragmentem kodu, a treścią zadania, dzieli duża liczba stron, co może budzić frustrację 😐.
Ilekroć chcesz zastanowić się nad podejściem do tego zadania, to musisz raz spojrzeć na treść ćwiczenia, a raz na wskazany listing 👀. Co to oznacza? Każdorazowe wyszukiwanie tego listingu 😰. Dodatkowo trzeba przepisać kod i to wszystko tylko po to, aby przystąpić do rozwiązania zadania gdzie po takim czasie niejeden raz zapomnimy co w ogóle należało zrobić. I tak jest średnio co trzecie zadanie 😖.
Uwierz mi - to nie jest przyjemne 🙂.
SKOK W PRZYSZŁOŚĆ
Punkt nr 4 jako absolutne kuriozum 4️⃣ - "przeskakiwanie" naprzód, pomijając ileś stron, celem szybkiego poznania jakiegoś tematu tylko po to, aby móc wykonać zadanie, na którym stoisz obecnie 😅.
2 przypadki jakie występują, to ćwiczenia 20.5 i 20.6 ℹ️. W ich treści jest napisane, aby przerobić listing, który wykorzystuje interfejsy, zanim zostały one wyjaśnione 😝. Tam jest tylko pokazane jak struktura implementuje interfejs, natomiast nie ma ani definicji, ani słowa wyjaśnienia na tym etapie ❌. Dopiero od strony 319 znajduje się tłumaczenie interfejsów, zatem miłego "czekania" do tej strony 🙃!
Jak można oczekiwać od Czytelnika wykonania zadania wymagającego znajomości tematu, który nie został jeszcze omówiony 😆? To znowu wymusza na Tobie "przeskakiwanie" do określonej strony, a już sam fakt, że trzeba wracać do listingów, jest irytujący 😄.
To rzadkość widzieć takie zadanie, które mówi 👇:
Stary, co prawda musisz znać podstawy tematu, który nie został jeszcze omówiony, ale i tak sobie poradzisz.
OK, ja sobie poradziłem, bo wiem już od dawna jak obchodzić się z interfejsami, a także w jaki sposób napisać implementację przez klasę bądź strukturę, tylko przecież nie wszyscy mają tę wiedzę 😉. I co mają zrobić? Zgadywać? Zajrzeć od razu do rozwiązania 🤣?
CZY KSIĄŻKA "C#. PRAKTYCZNY KURS" JEST WARTA ZAKUPU?
W mojej ocenie, niestety nie 🙁! Książka przypomina trochę wersję beta, w której jest cała masa rzeczy do poprawienia 💥. Główne powody, dla których nie mogę polecić książki "C#. Praktyczny kurs", to 👇:
- odstawanie od konwencji nazewniczych,
- błędne stwierdzenia odnośnie niektórych instrukcji,
- częściowe wybrakowania istotnych informacji przy poruszanych tematach,
- ogromna liczba literówek.
Natomiast nie mam żadnych uwag co do poruszanych zagadnień (z wyjątkiem tych dwóch tematów wymienionych wyżej). Jak dla początkujących jest tam wszystko co powinno być, więc w ostateczności mogą po nią sięgnąć ludzie, którzy nie mają zielonego pojęcia o programowaniu 😄. Większość początkujących nie będzie świadoma, że w pewnych miejscach znajdują się niewłaściwe określenia 😊. Natomiast moim zdaniem, to nie jest odpowiednia lektura dla osób mających już jakieś pojęcie o programowaniu w języku C# 💣! Treści są chwilami pisane krzywdząco dla odbiorcy 🔪.
![]() |
"C#. Praktyczny kurs" posiada przyzwoicie sporządzony zestaw treści dla adeptów w dziedzinie programowania, aczkolwiek zawiera w sobie ogromną liczbę literówek i sprzecznych stwierdzeń przez co osoby, które już wiedzą co nieco na ten temat, mogą poddać pod wątpliwość jej zakup.
Tym akapitem kończę całą serię o języku C#, którą pisałem przez ponad 2 miesiące. Mam nadzieję, że ta recenzja pomoże Ci podjąć decyzję o jej zakupie 👍. Książka "C#. Praktyczny kurs" jako taka, nie jest złą pozycję, tylko przydałoby się stworzyć następne (czwarte 4️⃣) wydanie już bez literówek, błędnych określeń i z trzymaniem się konwencji nazewniczej 🚀. Nie wiadomo czy tak się stanie, z powodu śmierci Pana Lisa w tym samym roku, w którym wydano tę książkę 🔥.
