Przesuwamy się ku coraz trudniejszym tematom i tym razem rozpocznę serię artykułów dotyczących wątków. Wątek w programowaniu jest już zaawansowanym rozdziałem i nawet doczekał się własnego działu naukowego, "programowanie współbieżne". Bez względu na wszystko, trzeba zacząć od samego początku i najpierw wyjaśnić sobie teorię zanim przejdziemy do części praktycznej. Zapraszam serdecznie do wpisu.

Dzisiaj przyjrzymy się uważnie co się dzieje "pod spodem" w chwili tworzenia obiektów i deklarowania zmiennych. To już dotyka niskich warstw systemu w kwestii przydzielania pamięci, aczkolwiek każdy programista powinien wiedzieć jak to wygląda w praktyce. Pokażę Wam jak wygląda stos i sterta. Pokażę czym się różnią te struktury danych od siebie oraz na czym polega przechowywanie danych na jednym i drugim.

Spodziewajcie się teraz artykułów dotyczących programowania jedynie z samej Javy. Dobra, 99%. Z tego względu iż "raylib" nie będzie na razie przeze mnie wykorzystywany, bo mnie zawiódł, nauka języka C została przeze mnie przerwana. Skupię się teraz na Javie z kilku osobistych powodów. Dzisiaj, rozwiązanie zagadki czemu dziedziczenie wielokrotne jest niedopuszczalne w językach wysokiego poziomu z wyjątkiem C++. Wpierw należy sobie wytłumaczyć co się kryje konkretnego pod tym terminem. Zapraszam wszystkich zaintrygowanych!

Dawno nie było żadnego artykułu na temat samego programowania więc macie ode mnie kolejny wpis dotyczący tym razem prostej rzeczy, którą można wykonać na kilka sposobów zarówno klasycznie, jak i wyjątkowo. Chodzi mi o często spotykany manewr jakim jest zamiana wartości dwóch zmiennych. Zdecydowana większość posługuje się metodą polegającą na użyciu zmiennej tymczasowej (pomocniczej) do tymczasowego przechowania jednej z dwóch liczb tuż przed operacją zamiany. To jak najbardziej logiczne podejście, bo podczas zamiany trzeba gdzieś przechować na chwilę jedną z dwóch wartości. Czy rzeczywiście to jest konieczne?

Na końcówkę tego dnia przygotowałem artykuł, który będzie próbował obalić teorię, że mniejszy zakres danych to zawsze lepszy wybór. Dysponujecie szerokim wachlarzem różnych zakresów typów danych (zależy też jaki język). C i C++ na ten przykład mają "int" jak każdy inny język, ale dysponują również typem "short", "long" czy nawet "long long". Byłbym zapomniał, są też podziały na typ ze znakiem ("signed") i bez znaku ("unsigned"). W niektórych sytuacjach człowiek jest absolutnie pewny, że niektóre wartości NIGDY nie będą musiały potrzebować ujemnych liczb, na przykład liczba użytkowników w bazie danych. Jeden programista to wie, drugi to wie, koledzy tego drugiego też to wiedzą, a mimo wszystko ludzie na upartego trzymają się kurczowo standardowego rodzaju "int". Co to może oznaczać? Czemu mimo tych "pewniaków", że pewne zakresy czy zbyt duże liczby nie będą wcale potrzebne, twórcy kodu wciąż wykorzystują typ danych "int"? Przeczytajcie moje hipotezy, a być może chociaż częściowo postaram się ukoić Waszą ciekawość.

Mam dla Was następną część z cyklu rekurencji. Wiemy już, że rekurencja oznacza odwoływanie się funkcji do samej siebie. A co w przypadku chęci zrobienia w drugą stronę? Powiedzmy, że ktoś grymasi przy rekurencji i chciałby zaaplikować wersję iteracyjną jakiegoś algorytmu poprzez zwykłą pętlę. Da się tak zrobić, ba, nawet na taki manewr wymyślono hasło. Nie połamcie sobie języka: "derekursywacja"!

W ten piękny (przynajmniej w moim rejonie) czwartek witam Was z następnym tematem programistycznym dotyczącym pewnej techniki wielokrotnego wykonywania tych samych instrukcji. Zachowanie identyczne jak w pętli, ale samo w sobie to nie jest pętla. To tak zwana "rekurencja", nie mylić z "referencją" (o niej było tu)! Eleganckie tłumaczenie w teorii plus przykład kodu źródłowego w języku C.

Programowanie obiektowe jest jednym z dostępnych paradygmatów programowania polegających na podzieleniu problemu na obiekty starając się zachować najbardziej zbliżony podział jak w rzeczywistości. Wszystko w informatyce rządzi się własnymi prawami, a wszystkie 4 zasady programowania obiektowego muszą Wam być znane. Opanujcie to jak najprędzej, gdyż znajomość tych zasad jest często weryfikowana na egzaminach. Najpopularniejszym "przedstawicielem" tego paradygmatu jest oczywiście Java, natomiast istnieje o wiele więcej języków wspierających programowanie obiektowe.

Jak zapowiedziałem, teraz podam szczegóły na temat inkrementacji i dekrementacji. Jest to proces zwiększania czy też zmniejszania wartości liczbowej dokładnie o jeden przy czym nie będę truł na temat samej definicji. Bardziej chcę przykuć uwagę odnośnie dwóch sposobów zapisu. Wchodząc w szczegóły jest to preinkrementacja i postinkrementacja. Niby nic, a istnieje bardzo istotna różnica między nimi.

W kolejnym artykule mam dla wszystkich chętnych parę wskazówek jak pisać dobry kod. "Dobry" czyli czytelny, efektywny i mniej obciążający dla procesora. Zachęcam wszystkich zainteresowanych do czytania!

Mamy 1 kwietnia! Nieuchronnie zbliża się pewna chwila a właściwie dwie, które dotyczą mojej osoby. Pierwsza z nich będzie pojutrze, zatem spodziewajcie się wtedy wyjątkowo szerokiego artykułu. Przechodząc do tematu właściwego, chciałem napisać o pewnej bardzo ciekawej funkcji umożliwiającej wyświetlanie zawartości pliku w programie, a także możliwość zapisywania wprowadzonej treści do nowego pliku oraz skopiowania zawartości do innego pliku. I to wszystko za pomocą prostego kodu! Co prawda, to nie jest najbardziej optymalne rozwiązanie, natomiast jest dużo prostsze i można je opanować w ciągu kilku godzin. O ile korzystamy z języka C, mamy szansę wykonać tak zwane "przekierowanie strumienia".

Coraz mniej czasu w ciągu dnia więc postanowiłem wziąć na klatę podobny temat, zbliżony do poprzedniego (poprzednio pisałem o przesunięciach bitowych). Mają ze sobą wiele wspólnego (przesunięcia to jeden z typów) więc postanowiłem "postawić" te wątki obok siebie. Przed Wami, następna opowieść o alternatywnych zapisach. W roli głównej, operatory bitowe, ale nie te, które już dobrze znacie.

Następny zalążek historii programowania. Opowiem dzisiaj o tym, jak w latach .80 trzeba było często stosować inny zapis do wykonywania działań arytmetycznych na liczbach całkowitych. Kolejny temat i kolejny termin: "przesunięcie bitowe".

Instrukcja wielokrotnego wyboru. Coś Wam to mówi? To kolejny ze sposobów czytelniejszego zapisu rozgałęzienia instrukcji warunkowej. W odróżnieniu od poprzednio omawianego operatora trójargumentowego, pozwala to obsłużyć wiele wartości w jednej klauzuli. Nie myślcie tylko, że to jest zapis bez wad bo jak w całej informatyce, wszystko ma swoje plusy i minusy. Zachęcam do lektury.

Kolejny lekki temat dla każdego chcącego się tego programowania nauczyć. Poboczny, ale warto opanować zapis który zaraz pokażę, bo potrafi świetnie zredukować treść kodu do jednej linii. Kodu w postaci instrukcji warunkowej. Kodu, który będzie w stanie występować zarówno w wyrażeniu, jak również w miejscu wstawiania parametru do funkcji. Za kolejną wygodą kryje się kolejny zapis i oczywiście kolejny termin: "operator trójargumentowy" (ang. "ternary operator"). Jeżeli to kogoś interesuje, to na pewno nie pożałuje. Nawet na studiach można nie spotkać się z tym zapisem, a jest on prosty i przyjemny.

W tę dużo swobodniejszą sobotę mam kolejne zjawisko programistyczne do omówienia. Dotyczy ono liczbowych typów danych, a dokładniej ich minimalnych i maksymalnych zakresów. Ich osiągnięcie może być czasem nieprzewidywalne i spowodować "zapętlenie", które bardziej kulturalnie wypadałoby nazwać "przekroczenie zakresu liczb całkowitych".

Wśród najczęściej wpisywanych fraz w Google, pojawia się między innymi pytanie "jak nauczyć się programować?". Myślałem o tym czy aby nie za wcześnie dla mnie, żeby rzetelnie odpowiedzieć na to pytanie. Ze względu na fakt, iż parę lat się kształcę w tym kierunku bo to masowy dział nauki, zwróciłem uwagę na parę rzeczy co się przyczyniło do znacznego wzrostu szybkości opanowywania materiału. Nie są to żadne wielkie spostrzeżenia, aczkolwiek mogą każdemu z Was dać do myślenia. Miejcie również na uwadze, że każdy z nas ma inne sposoby nabywania wiedzy i nie wszystkie porady mogą okazać się dla Was skuteczne. Oto one.

Finalizujemy wątek związany z konwersją systemów liczbowych i zabieramy się za system heksadecymalny. Zamienimy wspólnie system dziesiętny na szesnastkowy. W drugą stronę również. Nigdy nie wiadomo kiedy to się może przydać. Jeśli to nie ten system liczbowy Was interesuje, sięgajcie tutaj po tłumaczenie jak obchodzić się z liczbą binarną, a tutaj, ósemkową.

Kłopoty przy systemie oktalnym? Po tym artykule (mam nadzieję) będziecie mieli podstawowy zakres w kierunku konwertowania liczb dziesiętnych na ósemkowe i na odwrót. System dziesiętny na ósemkowy i odwrotnie, oto poradnik jak to wykonywać w obie strony. Jeśli interesujecie się systemem dwójkowym, to klikajcie tutaj lub tutaj, jeśli szesnastkowym.

Teraz dużo istotniejszy temat. Skoro zacząłem już pisać o tych konwersjach to pomyślałem, że dociągnę ten temat już do końca i napiszę o sposobach konwersji dowolnej liczby zamieniając system dziesiętny na dwójkowy (tu znajdziecie zamianę na ósemkowy, a tu na szesnastkowy). Nie traćmy czasu na bzdety i przejdźmy do tematu tego artykułu.

Na dzisiaj przygotowałem jeden z tematów pobocznych, które każdy z Was może opanować wedle własnego uznania. Nie jest to ani często widziane, ani szeroko wykorzystywane. Temat ten dotyczy szesnastkowego systemu liczbowego, a posługując się eleganckim słownikiem mogliście zetknąć się z terminem "heksadecymalny literał zmiennoprzecinkowy" ("hex float literal"). Jest to rzadki okaz, praktycznie już w ogóle niestosowany, aczkolwiek ze względów historycznych chciałem przybliżyć Wam ten wątek. Na końcu artykułu pokażę Wam jak zamienić coś takiego na liczbę w systemie dziesiętnym.

Kolejne pytanie, które pragnę poddać głębszej analizie: "czy każdy może nauczyć się programować?". Krótka odpowiedź brzmi "tak", chociaż doskonale sobie zdaję sprawę, że taka odpowiedź nikomu z Was nie wystarczy. Nieco dłuższa brzmi: "to zależy jak daleko sięgasz z tym nauczaniem".

Raz kolejny zbliżymy się do nieco innego tematu niż czyste programowanie. Na pewno niejednego z Was interesuje modyfikacja jakiegoś swojego ulubionego tytułu (mam na myśli gry na PC). Chcielibyście coś w nim dodać, zmienić, poprawić. Modyfikacja gry komputerowej już od dawna jest odrębnym zainteresowaniem wielu graczy i programistów. Spróbuję Wam rzucić "programistyczne" światło na tę sprawę, wytłumaczyć definicję i dać parę wskazówek co możecie zrobić gdy nie ma żadnego oprogramowania do edytowania zawartości gry, a wszystkie dane są zaszyfrowane.

Pętle po raz trzeci! Na do widzenia prezentuję ostatnią część tłumaczeń podstawowych pętli. Teraz pętla "do while" na celownik i szybko tłumaczę podając niektóre zastosowania i przykłady. Więcej informacji o pętli "for" znajduje się tutaj, a o pętli "while" jest tutaj.

Oto druga część z trzech na temat pętli. Tak jak obiecałem, teraz pętla "while". Układ będzie taki sam. Najpierw krótkie wyjaśnienie, następnie przykłady zastosowań, a na koniec dwa przykłady. Jak ktoś przegapił pierwszą część, niech klika tutaj i nadrabia zaległości.

Jeśli wyrywacie sobie włosy z głowy nad tym, co to jest pętla "for", to już się głowić nie musicie. W ten sobotni dzień postaram się wrzucić aż trzy artykuły w ciągu jednego dnia na temat każdej z podstawowych pętli, zatem traktujcie ten artykuł jako część 1 z 3. Tu jest część druga, a tu trzecia.

Napotkałem niejednokrotnie na pytanie powtarzane przez wiele osób: "czy programowanie jest trudne?". Cóż, patrząc na swoje przeżycia i kłopoty z tym związane przyznaję, że to JEST trudne zajęcie. Aby przetrwać lata w tym fachu nie wystarczy kucie na blachę. Trzeba mieć wiele wytrwałości i anielskiej cierpliwości. W oparciu o swoje (niewielkie) doświadczenie prezentuję fakty i mity z tym związane.

Mała niespodzianka! Ponieważ znalazło się trochę więcej czasu w dniu dzisiejszym, postanowiłem napisać po raz drugi tego samego dnia. Postaram się przedstawić swój punkt widzenia w odpowiedzi na pytanie: "od jakiego języka zacząć naukę programowania?". Niejeden z Was pewnie miał dylematy który język będzie dla Was najodpowiedniejszy. Zależy też do czego jednak w tym artykule uwzględnię podejście uniwersalne, czyli przedstawię język odpowiedni dla każdego żółtodzioba. Język, który jest prosty. Język, który się przyda teraz, za tydzień, za pięć lat, za dwadzieścia lat. Język, który jeszcze przez długi okres czasu nie wypadnie z obiegu. Język otwierający wrota do tworzenia graficznych interfejsów, obsługi baz danych, rozwiązywania problemów dotyczących sztucznej inteligencji oraz do kilku innych rzeczy. Tym językiem (moim zdaniem) jest Python!!!

Na dzisiaj kolejna dawka nauki programowania. Omówimy wspólnie różnicę pomiędzy słowem kluczowym "break" i "continue". Jakie jest ich zastosowanie w pętli i jaki mają wpływ na jej przebieg? Artykuł przyniesie odpowiedzi na te pytania, a na końcu znajduje się przykładowy kod źródłowy.

Dziś znowu oprę się o język C, a właściwie o C i C++ jednocześnie. Istnieje wiele debat na temat tego, który z tych dwóch języków wybrać. Większość programistów sugeruje się jedynie nazwą myśląc, że jeden jest bardziej rozbudowany od drugiego. Natomiast na tym nie może kończyć się podejmowanie decyzji. Języki nie różnią się od siebie tylko oferowanymi możliwościami. Czy C, czy C++, trzeba przeanalizować dużo więcej szczegółów niż nam się wydaje na pierwszy rzut oka. To nie jest aż tak oczywiste!

Czas napisać coś na temat odchodzący od mojej działalności. Ponieważ dość już siedzę w tym fachu i dopatruję się wielu powtarzających się sytuacji uważam, że mogę w jakimś stopniu odpowiedzieć na pytanie "jakie języki programowania opłaca się znać?" i podzielić się swoimi spostrzeżeniami tym bardziej, że ja sam mam zamiar opanować poniższe języki. Podkreślam, że to jest tylko moje subiektywne zdanie i jak zawsze poparte konkretnymi argumentami. Macie prawo się nie zgadzać. Przedstawiam języki programowania, które w 2019 roku uważam za fundamentalne, zarówno w kwestii znalezienia pracy, jak również rozwijania swoich zdolności w zaciszu domowym. Ponadto do każdego z nich przedstawiam garść zalet i wad.