Bardzo czÄ™sto zgÅ‚aszajÄ… siÄ™ do mnie osoby które programujÄ… stosunkowo niedÅ‚ugo, lub wÅ‚aÅ›nie rozpoczynajÄ…ce swojÄ… przygodÄ™ z programowaniem, i pytajÄ… o to jakÄ… książkÄ™ bym poleciÅ‚ do jÄ™zyka XYZ, czy znam jakiÅ› dobry tutorial, ewentualnie jak rozwiÄ…zać dany problem (np. jak poprawić błąd kompilacji lub błąd logiczny), czy jakÄ… funkcjÄ™ użyć aby uzyskać okreÅ›lony efekt. Przez ostatnie 10 lat które "spÄ™dziÅ‚em" w Internecie takich rozmów odbyÅ‚em dziesiÄ…tki, jeÅ›li nie setki. Tak wiÄ™c wychodzÄ…c na przeciw przyszÅ‚ym programistom, postanowiÅ‚em stworzyć Poradnik poczÄ…tkujÄ…cego programisty (sÅ‚owo "poradnik" jest tutaj kluczowe). Zapraszam do lektury!
1. Jaki język wybrać?
Jednym z najczęściej pojawiających się pytań jest "jaki język powinienem wybrać?", lub "jaki język będzie dla mnie najlepszy?". Jak można się domyślić, nie ma prostej odpowiedzi na to pytanie, ba, powiem więcej, przez ostatnie 20 lat odpowiedź staje się coraz trudniejsza.
W czasie gdy rozpoczynaÅ‚em swojÄ… przygodÄ™ z programowaniem (niecaÅ‚e 20 lat temu) sprawa wyglÄ…daÅ‚a bardzo prosto - kupowaÅ‚o siÄ™ maÅ‚y komputer marki Atari (np. Atari 800 XL), Commodore (np. C64) lub podobny 8-bitowy sprzÄ™t, uruchamiaÅ‚o go, i pokazywaÅ‚ siÄ™ interpreter jÄ™zyka BASIC. Tak wiÄ™c do wyboru byÅ‚ BASIC, ewentualnie Logo które dostawaliÅ›my na kasecie/dyskietce, i które raczej przypominaÅ‚o zabawkÄ™ niż jÄ™zyk programowania, oraz ewentualnie assembler jeżeli ktoÅ› byÅ‚ na tyle wytrwaÅ‚y by siÄ™ dowiedzieć jak dysponujÄ…c jedynie interpreterem BASIC'a pisać w assemblerze. OczywiÅ›cie, czym bardziej zaawansowany byÅ‚ komputer i użytkownik, tym wiÄ™cej jÄ™zyków miaÅ‚ do wyboru - np. Action!, Pascal, lub Turbo BASIC, ewentualnie C, Fortran, lub kilka innych dostÄ™pnych gÅ‚ównie na silniejszych platformach.
Teraz, 20 lat później, nie dość iż poczÄ…tkujÄ…cy programista ma dużo wiÄ™kszy wybór, to jeszcze oprócz wyboru jÄ™zyka musi wybrać Å›rodowisko programistyczne które go zadowoli i które bÄ™dzie dziaÅ‚ać na jego systemie komputerowym.
Co w takim razie poczÄ…tkujÄ…cy programista powinien wybrać? ZacznÄ™ od tego, że pytanie jest nie do koÅ„ca dobrze postawione - moim zdaniem powinno brzmieć "jaki jÄ™zyk powinienem wybrać na poczÄ…tek?". Różnica, mimo iż minimalna, jest bardzo ważna, a wynika z faktu iż programista nie powinien ograniczać siÄ™ do jednego jÄ™zyka. Powinien raczej popróbować różnych jÄ™zyków, tak aby poznać różne punkty widzenia, dowiedzieć siÄ™ jakie mechanizmy istniejÄ… w różnych jÄ™zykach, pomyÅ›leć jak symulować pewne rozwiÄ…zania natywne dla pewnych jÄ™zyków w innych jÄ™zykach, nie majÄ…cych natywnego wsparcia dla danej funkcjonalnoÅ›ci, etc. ProszÄ™ zauważyć iż nie twierdze, że programista powinien w nieskoÅ„czoność skakać miÄ™dzy jÄ™zykami, wrÄ™cz przeciwnie! Każdy programista prÄ™dzej czy później znajdzie jakiÅ› swój jeden, jedyny, ukochany jÄ™zyk, w którym bÄ™dzie siÄ™ specjalizowaÅ‚, i który po pewnym czasie bÄ™dzie znaÅ‚ na wspak i po rumuÅ„sku. TwierdzÄ™ natomiast iż programista który pozna rożne jÄ™zyki, bÄ™dzie lepiej pisaÅ‚ w swoim ulubionym jÄ™zyku, niż programista który ograniczyÅ‚ siÄ™ tylko do tego jednego jÄ™zyka, nie poznajÄ…c innych rozwiÄ…zaÅ„. Np. zdradzÄ™ że moim ulubionym jÄ™zykiem jest C (w dialekcie C99), natomiast przez ostatnie 20 lat miaÅ‚em przyjemność programować w okoÅ‚o 40 różnych jÄ™zyków/dialektów.
Kolejna ważna uwaga: nie ma jÄ™zyków które sÄ… "zawsze zÅ‚e", tak samo jak nie ma jÄ™zyków które sÄ… "zawsze dobre". JÄ™zyk to tylko i wyłącznie narzÄ™dzie w rÄ™kach programisty, narzÄ™dzie które do pewnych zadaÅ„ nadaje siÄ™ lepiej, a w innych przypadkach sprawdza siÄ™ gorzej. OczywiÅ›cie pewne jÄ™zyki każdy z nas polubi bardziej, a inne wrÄ™cz znienawidzi, niemniej jednak pamiÄ™tajmy o potrzebie obiektywnoÅ›ci, oraz o tym że nawet "znienawidzonego wroga" należy poznać. ZresztÄ…, a nuż polubimy ów jÄ™zyk po bliższym poznaniu ;>. PrzykÅ‚adowo, kiedyÅ› nie przepadaÅ‚em za JavÄ…, uważaÅ‚em że jÄ™zyk jest strasznie wolny i do tego niewygodny. Nie przeszkadzaÅ‚o mi to natomiast przez pewien czas pracować jako programista Java, a później przez pewien okres interesować siÄ™ wewnÄ™trznÄ… budowÄ… VM Java'y i byte codem samego jÄ™zyka, przez co JavÄ™ poznaÅ‚em i nawet polubiÅ‚em ;>
Czas w końcu odpowiedzieć na pytanie z tematu - jaki język wybrać na początek, tak aby się nie zniechęcić? Moje osobiste propozycje wyglądają następująco:
- Python - Bardzo prosty do opanowania język, z ogromną liczbą bibliotek, i przy okazji uczący ładnego formatowania kodu, oraz posiadający niezłą dokumentację.
- Java - Java ma w sobie pewnÄ… prostotÄ™ która może przypaść do gustu sporej części osób. JÄ™zyk, podobnie jak Python, jest obecnie open source (wiÄ™c w razie czego można rzucić okiem do źródeÅ‚ - patrz punkt o źródÅ‚ach wiedzy o programowaniu niżej), jest nieźle udokumentowany (chociaż dokumentacja Javy, moim zdaniem, wymaga przyzwyczajenia siÄ™), i posiada masÄ™ najróżniejszych bibliotek.
- C# - TrochÄ™ siÄ™ wahaÅ‚em czy ten jÄ™zyk tu umieÅ›cić, z uwagi na jego głęboki zwiÄ…zek z pewnÄ… firmÄ…. C# jest jÄ™zykiem obiektowym, odrobinÄ™ trudniejszym niż Python, jednak Å‚atwiejszym na poczÄ…tek niż C czy C++. Dokumentacja dostÄ™pna jest na MSDN, z którym trzeba siÄ™ jednak na poczÄ…tku zapoznać, gdyż nie zawsze jest intuicyjny, ale po zapoznaniu siÄ™ z nim, staje siÄ™ on niezastÄ…piony.
Który z powyższych jÄ™zyków wybrać na poczÄ…tek? Jest to w zasadzie obojÄ™tne, gdyż po popisaniu trochÄ™ w jednym, powinno siÄ™ zapoznać siÄ™ z drugim. OczywiÅ›cie jeżeli ktoÅ› uważa, że inny jÄ™zyk byÅ‚by dla niego jednak lepszy na poczÄ…tek, to może spróbować - proponujÄ™ jednak zasiÄ™gnąć rady doÅ›wiadczonego kolegi w tym wypadku, gdyż znam niejednÄ… historiÄ™ o tym jak to np. C czy C++ okazaÅ‚y siÄ™ za trudne, i zniechÄ™ciÅ‚y potencjalnego programistÄ™ do dalszego rozwoju w tej dziedzinie. OczywiÅ›cie należy zwrócić uwagÄ™ na to czy kolega mówi o jÄ™zyku, czy może mówi czy go lubi czy nie ;>
Co znaczy "trochÄ™ popisać" w powyższym stwierdzeniu? To zależy od czÅ‚owieka. Najlepiej na poczÄ…tku popisać z póÅ‚ roku, a może i rok, w jednym jÄ™zyku. Dlaczego tak dÅ‚ugo? Problemem na poczÄ…tku drogi jest to iż trzeba uczyć siÄ™ dwóch rzeczy na raz:
- po pierwsze: jÄ™zyka programowania - skÅ‚adni, funkcji, bibliotek, IDE, dodatków (np. preprocesora)
- po drugie: programowania - czyli umiejÄ™tnoÅ›ci przelewania myÅ›li/pomysÅ‚u na kod, czyli takiego korzystania z jÄ™zyka (skÅ‚adni/funkcji/bibliotek/IDE) aby napisany przez nas program robiÅ‚ dokÅ‚adnie to co chcemy w możliwie najbardziej optymalny (nie koniecznie chodzi tu o optymalnÄ… szybkość) sposób
UmiejÄ™tność programowania jest niejako niezależna od znajomoÅ›ci jÄ™zyka. Znane sÄ… przypadki (szczególnie na różnego rodzaju konkursach programistycznych, czy compo), gdy osoby sÅ‚abo znajÄ…ce dany jÄ™zyk potrafiÅ‚y stworzyć dużo ciekawszÄ… aplikacjÄ™ niż osoby które dany jÄ™zyk znaÅ‚y perfekcyjnie. PamiÄ™tajmy wiÄ™c, że jÄ™zyk to nie wszystko. Należy jeszcze wiedzieć jak go używać - i to wÅ‚aÅ›nie na celu ma nauka programowania.
PopisaliÅ›my wiÄ™c trochÄ™ w Pythonie i C#, co dalej? OsobiÅ›cie proponowaÅ‚bym zapoznanie siÄ™ z C/C++ i assemblerem (najlepiej równolegle), PHP, Perlem lub Rubym, JavÄ…, oraz z innymi jÄ™zykami które wpadnÄ… nam w rÄ™kÄ™. Jak pisaÅ‚em wczeÅ›niej, i co bÄ™dÄ™ powtarzaÅ‚ do znudzenia: czym wiÄ™cej jÄ™zyków poznamy, tym lepiej. OczywiÅ›cie w każdy kolejny jÄ™zyk wejdziemy Å‚atwiej, gdyż na pewnym poziomie sÄ… one bardzo podobne.
Warto również rzucić okiem na inne rodzaje jÄ™zyków programowania - np. na jÄ™zyki funkcyjne jak Lisp, Haskell, jÄ™zyki logiczne jak Prolog, a nawet zabawkowe jÄ™zyki ezoteryczne jak Brainfuck czy LOLCODE.
Ważne jest również aby poznać narzÄ™dzie którego siÄ™ używa - tj. edytor, IDE czy kompilator. PosiadajÄ… one zazwyczaj masÄ™ pomocnych opcji, które uÅ‚atwiÄ… tworzenie lub debugowanie programowania. PrzykÅ‚adem opcji które warto znaleźć w swoim IDE/edytorze jest np. skok do deklaracji, skok do definicji, skok do użycia danej funkcji/zmiennej czy szybkie wyszukanie funkcji w podrÄ™cznej pomocy. Warto sprawdzić również czy kompilator umie wypisywać dodatkowe informacje na temat błędów lub ostrzeżeÅ„ w kodzie (o tym jeszcze bÄ™dÄ™ pisać), lub czy np. można obejrzeć wynik preprocessingu, czy kompilacji do assemblera (nie mylić z kodem maszynowym). Know your tools!
2. Jaką książkę wybrać?
Do drugiej grupy pytaÅ„ które bardzo czÄ™sto sÅ‚yszÄ™ można zaliczyć "z jakiej książki uczyć siÄ™ jÄ™zyka XYZ?", "jaki tutorial bÄ™dzie najlepszy dla jÄ™zyka XYZ?", lub "czy znasz jakieÅ› strony z tutorialami do jÄ™zyka XYZ po polsku?". Bardzo czÄ™sto w takim przypadku osoba poczÄ…tkujÄ…ca zakÅ‚ada iż wystarczy przeczytać jakÄ…Å› książkÄ™ lub jakiÅ› tutorial by nauczyć siÄ™ programować. Nic bardziej mylnego! OczywiÅ›cie w żadnym wypadku nie twierdzÄ™, że książki/tutoriale sÄ… niepotrzebne, czy że nie warto ich kupować/Å›ciÄ…gać. Problemem jest to w jaki sposób siÄ™ z nich korzysta.
Moim zdaniem, wynikajÄ…cym z osobistych doÅ›wiadczeÅ„, książki/tutoriala nie powinno siÄ™ czytać. Zamiast czytania polecam natomiast wyszukiwanie listingów, i ich przepisywanie (tak, przepisywanie! nie kopiowanie, nie używanie kodu z dołączonej do książki pÅ‚yty CD, tylko przepisywanie, literka po literce). PrzepisujÄ…c kod programu mamy pewność że nic ważnego z jego treÅ›ci nam nie umknie, dodatkowo zapamiÄ™tujemy skÅ‚adnie, nazwy funkcji i poleceÅ„ oraz różne mechanizmy stosowane w jÄ™zyku.
JednoczeÅ›nie przepisujÄ…c kod powinniÅ›my starać siÄ™ zrozumieć co siÄ™ w nim dzieje. Wiem że może to brzmieć jak duże wyzwanie - skÄ…d osoba która nigdy wczeÅ›niej nie programowaÅ‚a miaÅ‚a by wiedzieć jak dany program dziaÅ‚a? Jednak jest to możliwe, wystarczy zastosować pewnÄ… prostÄ… sztuczkÄ™:
W kodzie programu jest peÅ‚no wyrazów, które albo sÄ… angielskimi sÅ‚owami, albo zlepkami lub skrótami od angielskich sÅ‚ów. Tak wiÄ™c sÅ‚ownik w rÄ™kÄ™ (a raczej w przeglÄ…darkÄ™ internetowÄ…) i tÅ‚umaczymy. Rozważmy np. poniższy kod (pochodzÄ…cy z losowej strony znalezionej na google):
private void KeyDown(object sender, KeyboardEventArgs e)
{
switch (e.Key)
{
case Key.Escape:
// Will stop the app loop
Events.QuitApplication();
break;
[...]
Jak wyraźnie widać powyżej, mamy w kodzie następujące słowa:
- private (ang. prywatny) - czyli coÅ› jest prywatne, (i tu wchodzi wiedza ogólna) czyli nie jest publiczne, nie jest ogólnodostÄ™pne
- void (ang. pusty, nieważny, próżnia) - coÅ› jest nieistotne, nie ważne (kolejne pytanie: co ?)
- KeyDown - zlepek sÅ‚ów: Key (ang. klucz, klawisz, przycisk) i Down (ang. pod, w dóÅ‚, na dole) - czyli "klawisz w dóÅ‚" - nietrudno siÄ™ domyÅ›lić że chodzi o naciÅ›niÄ™cie klawisza
- object - (ang. obiekt, przedmiot) - czyli mamy do czynienia z jakimÅ› obiektem
- sender - (ang. nadawca) - obiekt nadawca?
- KeyboardEventArgs - zlepek sÅ‚ów Keyboard (ang. klawiatura), Event (ang. zdarzenie, wydarzenie) i Args (i tutaj pojawia siÄ™ problem! nie ma w sÅ‚owniku sÅ‚owa "args" ani "arg", chociaż wybitnie kojarzy siÄ™ z jakimÅ› piratem rodem z Karaibów ("Argh matee!"); w takim wypadku możemy to wrzucić w google, i zobaczyć podpowiedzi, ewentualnie jakie sÅ‚owa znajduje; no i proszÄ™, pod koniec pierwszej strony wyników znajdujemy podÅ›wietlone sÅ‚owo "arguments", czyli argument (mój sÅ‚ownik podpowiada nawet że chodzi o"argument funkcji")) - Klawiatura Zdarzenie Argumenty - Argumenty zdarzenia które dotyczy klawiatury! OczywiÅ›cie sÅ‚owo "argumenty" też może być na poczÄ…tku nieznajome - w takim wypadku możemy poszperać po wikipedii czy sÅ‚owniku wyrazów bliskoznacznych - a nuż siÄ™ coÅ› nowego dowiemy
Podsumowując, pierwsza linia kodu to: prywatne nieistotne KlawiszNaciśnięty(obiekt nadawca, ArgumentyZdarzeniaKlawiatury e). Nawet jeżeli nie jest nadal do końca jasne co to jest, to wiemy już dużo więcej niż gdybyśmy po prostu rzucili okiem na tajemnicze private void KeyDown(object sender, KeyboardEventArgs e) i od razu polecieli dalej.
Warto zauważyć iż wiedza ogólna i matematyczna również siÄ™ przydaje - w programowaniu widzimy sporo symboli znanych z matematyki, takich jak choćby + - * =, etc. CzÄ™sto sami możemy wywnioskować o co chodzi (mimo iż zapis programistyczny jest różny od matematycznego). Analogicznie jest z niektórymi nazwami funkcji, takimi jak sin czy log.
Tak wiÄ™c przepisaliÅ›my pewien listing, potÅ‚umaczyliÅ›my sÅ‚ówka, ba, udaÅ‚o nam siÄ™ nawet skompilować i uruchomić (poprawiajÄ…c wczeÅ›niej literówki) program. Co dalej? Teraz modyfikujemy przepisany kod, czyli na chwilÄ™ zamieniamy siÄ™ w naukowców, i zaczynamy przeprowadzać eksperymenty zmieniajÄ…c pewne rzeczy w kodzie, patrzÄ…c uważnie co to zmienia w wykonaniu programu. Np. zamieniamy jakiÅ› + na - i patrzymy co to zmieniÅ‚o w wykonaniu programu. Usuwamy (lub komentujemy) jakÄ…Å› liniÄ™, i patrzymy co to zmieniÅ‚o. Zmieniamy jakieÅ› literki tu i tam, i patrzymy czy siÄ™ nadal kompiluje, ewentualnie jakiego rodzaju błąd wyskakuje (to nam siÄ™ przyda później). I oczywiÅ›cie próbujemy zrozumieć jak każda część programu dziaÅ‚a.
A teraz, jeżeli nadal widzimy potrzebÄ™, możemy przeczytać tekst w książce/tutorialu towarzyszÄ…cy listingowi który przepisaliÅ›my, przeanalizowaliÅ›my i przerobiliÅ›my, jednak jest to raczej "bonus" niż konieczność.
Natomiast to nie jedyny pożytek z książki / tutoriala. Książka może sÅ‚użyć jeszcze jako Å›ciÄ…ga z mechanizmów używanych w danym jÄ™zyku, oraz jako zestaw przykÅ‚adów użycia różnych funkcji czy bibliotek. Również jeżeli brakuje nam jakiegoÅ› Å›rodka ekspresji, tj. jeżeli zdajemy sobie sprawÄ™ że pewna konstrukcja w tym jÄ™zyku prawdopodobnie istnieje i wiemy że by nam siÄ™ ona przydaÅ‚a - warto przekartkować książkÄ™, i rzucić okiem na różne listingi, tytuÅ‚y rozdziaÅ‚ów, etc. A nuż trafimy na to czego szukamy ;>
JacuS sÅ‚usznie również zauważyÅ‚, że dla niektórych zestaw zadaÅ„ i pytaÅ„ znajdujÄ…cych siÄ™ pod koniec rozdziaÅ‚u w niektórych książkach również może być bardzo pomocny i pożyteczny.
PodsumowujÄ…c, poczÄ…tkujÄ…cy programista nie powinien czytać książki / tutoriala od deski do deski. Przede wszystkim powinien przepisać/przeanalizować listingi, a po za tym powinien próbować z książki korzystać jak z leksykonu lub zbioru podpowiedzi.
ProszÄ™ również zauważyć, iż korzystajÄ…c z tego sposobu uniezależniamy siÄ™ od jÄ™zyka w jakim jest tekst. Książka może być po chiÅ„sku, japoÅ„sku, fiÅ„sku czy w jakimÅ› innym egzotycznym jÄ™zyku, ale kod i tak bÄ™dzie w jÄ™zyku programowania którego siÄ™ uczymy, z nazwami pochodzÄ…cymi z jÄ™zyka angielskiego. Tak wiÄ™c listing i tak bez problemu przepiszemy i przeanalizujemy, nie tracÄ…c czasu na naukÄ™ jÄ™zyka chiÅ„skiego ;>
DrugÄ… rzeczÄ… godnÄ… zauważenia jest fakt, iż tak na prawdÄ™ przestaje mieć znaczenie z jakiej książki / tutoriala siÄ™ uczymy, czy też jak tekst jest napisany (przystÄ™pnie? a może dla robotów?). Z każdej książki czy tutoriala możemy przepisać kod.
3. Z czego korzystać przy nauce języka/programowania?
To jest pytanie którego niestety nie sÅ‚yszÄ™ zbyt czÄ™sto, a jest bardzo istotne. Książki i tutoriale nie sÄ… oczywiÅ›cie jedynym źródÅ‚em informacji jakim programista dysponuje. PosunÄ™ siÄ™ nawet dalej, i powiem, że moim zdaniem książki i tutoriale sÄ… jednym z mniej ważnych materiaÅ‚ów.
Z czego powinien wiÄ™c korzystać programista podczas nauki? Krótka lista pozostaÅ‚ych możliwoÅ›ci (w kolejnoÅ›ci losowej):
- Oficjalna dokumentacja jÄ™zyka oraz bibliotek - Nikt nie zna tak dobrze zakamarków jÄ™zyka programowania jak jego twórca! Dodatkowo, ów tajemniczy twórca bardzo czÄ™sto udostÄ™pnia dokumentacje za równo samego jÄ™zyka, jak i standardowych bibliotek dołączonych do jÄ™zyka. OczywiÅ›cie oficjalna dokumentacja jest prawie zawsze w jÄ™zyku angielskim, i niestety od tego nie uciekniemy. Owszem, istniejÄ… translatory, i co bardziej uparte osoby bÄ™dÄ… z nich korzystać, jednak bardzo szybko jasne siÄ™ stanie, że jeżeli ktoÅ› chce być dobrym programistÄ…, to jÄ™zyk angielski musi znać przynajmniej na poziomie umożliwiajÄ…cym czytanie dokumentacji.
- Kod źródÅ‚owy innych aplikacji - PrzeglÄ…dajÄ…c listingi innych programistów również siÄ™ dużo uczymy, za równo o jÄ™zyku programowania, jego funkcjach, jak i o samym programowaniu. Obecnie, w dobie Internetu, mamy pod dostatkiem stron na których możemy Å›ciÄ…gnąć źródÅ‚a jakiejÅ› aplikacji, i zobaczyć co ciekawego w niej siedzi. A nuż znajdziemy jakÄ…Å› ciekawÄ… konstrukcje, czy może w koÅ„cu dowiemy siÄ™ jak poprawnie używać jakiejÅ› funkcji. Warto również zapoznać siÄ™ z wyszukiwarkami kodu źródÅ‚owego, takimi jak Krugle czy Google Code Search.
- ArtykuÅ‚y w (e)czasopismach - Gdy zaczynaÅ‚em uczyć siÄ™ programować wychodziÅ‚o pewne czasopismo o nazwie Bajtek. KosztowaÅ‚o grosze, a caÅ‚e skÅ‚adaÅ‚o siÄ™ prawie wyłącznie z listingów kodu (gÅ‚ównie w BASICu lub w Assemblerze). Szczerze przyznaje że wiele nauczyÅ‚em siÄ™ z artykuÅ‚ów zawartych w tym czasopiÅ›mie. Dzisiaj, niecaÅ‚e 20 lat później, rynek (e)czasopism siÄ™ trochÄ™ rozwinÄ…Å‚, chociaż z bólem serca przyznaje iż nic równie taniego czy przystÄ™pnego jak Bajtek dawno nie widziaÅ‚em. Niemniej jednak warto zainteresować siÄ™ czy czasem na rynku / w Internecie nie ma czasopisma traktujÄ…cego o jÄ™zyku którego siÄ™ wÅ‚aÅ›nie uczymy. Warto rzucić okiem również na serwisy zwiÄ…zane z demoscenÄ… czy gamedev scenÄ…, czy czasem nie ma informacji o jakimÅ› nowym wydaniu e-zina.
- WnÄ™trze jÄ™zyka i bibliotek - Dokumentacja może być nieprecyzyjna, jednak kod źródÅ‚owy zawsze jest precyzyjny (mimo iż nie zawsze poprawny czy czytelny ;>). Tak wiÄ™c jeżeli mamy dostÄ™p do źródeÅ‚ danego jÄ™zyka programowania (kompilatora, interpretera, VM), lub/i do źródeÅ‚ standardowych bibliotek, rzućmy na nie okiem. ŹródÅ‚a te mogÄ… na poczÄ…tku wydawać siÄ™ dla nas zbyt skomplikowane, jednak czym szybciej nauczymy siÄ™ z nich korzystać, tym dla nas lepiej. CzÄ™sto również pliki nagÅ‚ówkowe różnych bibliotek sÄ… bardzo pomocne (szczególnie piszÄ…c w C/C++). OczywiÅ›cie osoby zaawansowane mogÄ… dodać reverse engineering do tego punktu.
- Fora, listy dyskusyjne - Każdy problem który my mamy teraz, z dużym prawdopodobieÅ„stwem ktoÅ› kiedyÅ› już miaÅ‚, i prawdopodobnie zapytaÅ‚ o rozwiÄ…zanie na jakimÅ› forum lub na jakiejÅ› liÅ›cie dyskusyjnej. Odpalmy wiÄ™c naszÄ… ulubionÄ… wyszukiwarkÄ™, i poszukajmy. Przejrzyjmy również tematy na różnych forach zwiÄ…zanych z programowaniem, skorzystajmy z wyszukiwarki wewnÄ…trz forum, etc. Natomiast starajmy siÄ™ nie pytać nikogo o rozwiÄ…zanie. W momencie kiedy zapytamy kogoÅ› jak rozwiÄ…zać dany problem, sami skÅ‚adamy broÅ„, poddajemy siÄ™ i przestajemy o problemie myÅ›leć. Może to wielu z was zaskoczyć, ale tak jest na prawdÄ™ - czym mniej ktoÅ› prosi innych o pomoc, tym lepszym programistÄ… siÄ™ staje, a czym wiÄ™cej ktoÅ› prosi o pomoc, tym mniej samodzielny i bardziej uzależniony od innych bÄ™dzie. Poproszenie kogoÅ› o rozwiÄ…zanie za nas problemu jest straconÄ… okazjÄ… do nauczenia siÄ™ czegoÅ› nowego, i straconÄ… okazjÄ… do nauczenia siÄ™ jak takie problemy rozwiÄ…zywać. Zapewniam was że samodzielność w rozwiÄ…zywania problemów w programowaniu jest bardzo ważna. Po za tym pamiÄ™tajcie, że kto pyta, ten błądzi z innymi ;>
- Książki i tutoriale - Mimo iż celowo umniejszam rangÄ™ tychże mediów, to w żadnym wypadku ich nie skreÅ›lam. Należy pamiÄ™tać o ich istnieniu, i korzystać z nich w miarÄ™ potrzeby. Tak na prawdÄ™ czym dalej w las, tym bardziej książki zaczynajÄ… siÄ™ przydawać, szczególnie książki wysoko specjalistyczne.
- Kursy, szkolenia, videoarty, konferencje - Jeżeli mamy możliwość in real life bÄ…dź przez Internet uczestniczyć w jakimÅ› kursie lub szkoleniu, to skorzystajmy z okazji. Być może pewna kwestia stanie siÄ™ dla nas jaÅ›niejsza, lub dowiemy siÄ™ nowych rzeczy. OczywiÅ›cie koniecznoÅ›ciÄ… jest późniejsze przećwiczenie samemu tego co siÄ™ nauczyliÅ›my. Celowo videoarty wrzuciÅ‚em do tej, a nie poprzedniej kategorii.
- Konsultacje z bardziej doÅ›wiadczonymi kolegami - WczeÅ›niej pisaÅ‚em że nie powinniÅ›my nikogo prosić o pomoc, wiÄ™c czemu nagle "wyskakuje" z konsultacjami? Ponieważ czymÅ› innym jest proszenie o rozwiÄ…zanie wÅ‚asnego problemu, a czymÅ› innym jest proszenie o radÄ™ o lub o komentarz dotyczÄ…cy naszych zaproponowanych rozwiÄ…zaÅ„. Jeżeli koniecznie chcemy już z kimÅ› porozmawiać o problemie, to wymyÅ›lmy kilka rozwiÄ…zaÅ„, i przedstawmy je osobie którÄ… uważamy za bardziej doÅ›wiadczonÄ… - wtedy nie "zwalamy" odpowiedzialnoÅ›ci za rozwiÄ…zanie problemu na niÄ… (bo sami wymyÅ›liliÅ›my już kilka rozwiÄ…zaÅ„), a możemy siÄ™ czegoÅ› ciekawego nauczyć. Po za tym zapewniam was (jako swojego rodzaju konsultant) iż dużo fajniej rozmawia siÄ™ z osobami samodzielnymi o ich rozwiÄ…zaniach, niż rozwiÄ…zuje, zazwyczaj bÅ‚ahe, problemy ludzi uzależnionych od pomocy innych.
PodsumowujÄ…c, mamy przynajmniej 7 różnych grup narzÄ™dzi pozyskiwania wiedzy które możemy używać samodzielnie, oraz jednÄ… grupÄ™ w której o radÄ™ (nie o rozwiÄ…zanie!) możemy poprosić osobÄ™ z wiÄ™kszym doÅ›wiadczenie.
4. Jak samodzielnie rozwiązywać problemy?
Problemy w programowaniu zasadniczo sÄ… dwa:
1. Coś się nie kompiluje (kompilator lub interpreter wypisują błędy)
2. Coś działa nie tak jak powinno
W pierwszym przypadku przede wszystkim przeczytajmy jaki błąd jako pierwszy wypisaÅ‚ kompilator/interpreter! WiÄ™kszość kompilatorów/interpreterów wypisuje zazwyczaj numer linii w której wystÄ…piÅ‚ błąd, opisuje (zazwyczaj w bardzo skróconej formie) jaki to błąd jest, i czasami cytuje fragment kodu. Każda z tych informacji jest dla nas cenna (w miarÄ™ możliwoÅ›ci należy siÄ™ dowiedzieć w jakim formacie dany kompilator wypisuje błędy, i co w nich zawiera), mimo iż nie zawsze te informacje sÄ… prawidÅ‚owe (jest to swoista puÅ‚apka na poczÄ…tkujÄ…cych programistów). Krótkie wyjaÅ›nienie jeszcze czemu piszÄ™ o czytaniu tylko informacji o pierwszym błędzie: czÄ™sto zdarza siÄ™ że dostajemy 2 strony ekranowe błędów, ale w 99% przypadków tylko pierwszy błąd jest prawdziwy, a całą reszta jest wynikiem tego pierwszego błędu. Tak że po usuniÄ™ciu pierwszego błędu może siÄ™ okazać iż wiÄ™cej nie byÅ‚o, lub że z 2ch stron ekranowych robi siÄ™ 5 linii.
Co dalej ?
- Po zapoznaniu siÄ™ z informacjÄ… którÄ… dostaliÅ›my od kompilatora otwórzmy w edytorze liniÄ™ którÄ… kompilator wskazuje, i rozejrzyjmy siÄ™ czy nie widać tam nić podejrzanego. CzÄ™sto błędem jest literówka, nadmiarowa spacja (Python), zagubiony Å›rednik, lub inny prosty błąd skÅ‚adniowy.
- Jeżeli nie widzimy nic oczywistego w danej linii, spójrzmy parÄ™ linii w górÄ™ - czÄ™sto zdarza siÄ™ iż np. błąd sygnalizowany w linii 40 wynika z niedokoÅ„czonego wyrażenia w linii 38.
- Kolejnym krokiem jest wrzucenie kodu lub opisu błędu w wyszukiwarki internetowe / oficjalny help - a nuż ktoś kiedyś o to już pytał, i dostał odpowiedź, lub w dokumentacji jest pokazany przypadek wystąpienia takiego błędu.
- W tym momencie zazwyczaj warto sprawdzić czy na pewno kompilujemy plik który nam siÄ™ wydaje że kompilujemy - nie raz widziaÅ‚em sytuacjÄ™ w których okazywaÅ‚o siÄ™ że błąd poprawiliÅ›my już 10 minut temu, tylko skompilowaliÅ›my nie ten plik co trzeba.
- Jeżeli to nic nie da, przekopiujmy kilka linii na chwilÄ™ do notatnika, i przepiszmy (rÄ™cznie) je z powrotem do naszego programu - eliminuje to niezauważone przez nas literówki (albo je wyÅ‚apiemy przy przepisywaniu, albo "przez przypadek" w locie poprawimy) oraz naprawia przypadki w których edytor z jakiegoÅ› niesprecyzowanego powodu dodaÅ‚ jakiÅ› tajemniczy znak w danÄ… liniÄ™ kodu (zdarza siÄ™ to np. gdy kopiowaliÅ›my jakiÅ› fragment kodu z PDF'a, ze strony WWW, lub z komunikatora internetowego).
- Jeżeli żaden z powyższych sposobów nic nie daÅ‚, skopiujmy minimalny fragment kodu w którym sygnalizowany jest błąd do oddzielnego projektu, i spróbujmy tam go skompilować - może siÄ™ okazać że to jakiÅ› inny fragment kodu (np. zapomniana deklaracja preprocesora) powoduje błąd w tym miejscu. Możemy również spróbować w drugÄ… stronÄ™, tj. usunąć z naszego projektu niepotrzebny kod, i zostawić tylko fragment sprawiajÄ…cy trudnoÅ›ci.
- Jeżeli i to nic nie daÅ‚o, Å›ciÄ…gnijmy innÄ… wersjÄ™ kompilatora/interpretera/Å›rodowiska, i zobaczmy czy tam problem również wystÄ™puje. Ewentualnie poproÅ›my kolegÄ™ aby sprawdziÅ‚ czy u niego również siÄ™ nie kompiluje.
Szczerze mówiÄ…c chyba nie zdarzyÅ‚o mi siÄ™ aby po wyczerpaniu powyższej listy kod nadal siÄ™ nie kompilowaÅ‚ ;>
Co natomiast zrobić w przypadku gdy kod się kompiluje, natomiast program nie działa tak jak byśmy chcieli? Zdebugować!
Debugowanie jest bardzo ogólnym terminem, pochodzÄ…cym zresztÄ… od pozbywania siÄ™ prawdziwych (biologicznych ;>) robaków chodzÄ…cych wÅ›ród lamp pierwszych komputerów i powodujÄ…cych losowe zwarcia. Tak na prawdÄ™ debugowanie wcale nie musi oznaczać skorzystania z debuggera, i prawdÄ™ mówiÄ…c z debuggera korzysta siÄ™ może w 1/3 przypadków. Poniżej prezentuje 4 metody debugowania których ja używam (w kolejnoÅ›ci losowej, tzn. każdÄ… z poniższych metod należy znać, i wiedzieć jak stosować; żadne nie jest bardziej czy mniej ważna od innej):
1. Print it!
Pierwsza metoda polega na powrzucaniu w kod instrukcji wypisujÄ…cych dodatkowe informacje (najlepiej ów informacje wypisywać na konsolÄ™ lub zapisywać do pliku). Umożliwia to kilka rzeczy:
1. Namierzenie dokÅ‚adnego miejsca wystÄ™powania błędu. W tym celu wystarczy powrzucać w różne miejsca w kodzie instrukcje wypisania np. numeru linii, albo różne literki. NastÄ™pnie uruchamiamy program, i patrzymy które wiadomoÅ›ci i w jakiej kolejnoÅ›ci zostaÅ‚y wypisane - dziÄ™ki temu dowiadujemy siÄ™ do którego momentu program dochodzi, które warunki sÄ… speÅ‚nione, i w które funkcje i zagłębienia program wchodzi. Zazwyczaj zaczyna siÄ™ na najwyższym poziomie zagłębieÅ„, i dodaje z 3-5 "printów" w różne miejsca, a nastÄ™pnie na podstawie informacji które uzyskujemy po uruchomieniu, część "printów" przesuwamy w inne miejsca, za każdym razem zbliżajÄ…c siÄ™ o krok do zlokalizowania błędu logicznego.
Np. w poniższym kodzie jedna z funkcji "crashuje" program:
FUNC_A();
FUNC_B();
FUNC_C();
Aby dowiedzieć siÄ™ która funkcja zawiera błąd, wrzucamy kilka printów:
PRINT "przed A";
FUNC_A();
PRINT "przed B";
FUNC_B();
PRINT "przed C";
FUNC_C();
PRINT "po";
Uruchamiamy i patrzymy co się wypisało:
przed A
przed B
*** CRASH ***
Wiemy więc że wykonanie dotarło do "przed B", ale nie dotarło do "przed C", tak więc błąd jest w funkcji FUNC_B. Idąc dalej przenieśli byśmy "printy" wewnątrz FUNC_B, tak aby namierzyć w końcu dokładną linię błędu.
2. Uzyskanie informacji dlaczego błąd wystÄ™puje. W tym celu dodajemy "printy" wypisujÄ…ce wartoÅ›ci zmiennych, wyniki warunków. Jeżeli wiemy że błąd jest w FUNC_B, i wiemy że korzystamy tam z 5ciu zmiennych które mogÄ… mieć wpÅ‚yw na program, wypiszmy te zmienne. BÄ™dziemy wtedy dokÅ‚adnie wiedzieć co siÄ™ dzieje, i bÄ™dziemy mogli zadecydować jak poprawić dany kod.
Rozważmy poniższy kod:
def FUNC_B()
A=4;
B=3;
WHILE(A>B)
B=A/B;
B=B-1;
Dodajemy "printy":
def FUNC_B()
A=4;
B=3;
PRINT "przed", A, B;
WHILE(A>B)
PRINT "w1", A, B;
B=A/B;
PRINT "w2", A, B;
B=B-1;
PRINT "w3", A, B;
Uruchamiamy, i spoglÄ…damy na output:
przed 4 3
w1 4 3
w2 4 1
w3 4 0
w1 4 0
*** CRASH ***
Analizujemy wynik, i już wiemy że błąd polega na tym iż B w pewnym momencie osiąga wartość 0, i następuje dzielenie przez 0. Co z tym teraz zrobimy zależy oczywiście od nas, i od tego jak program ma działać ;>
Metoda "Print it!" jest niesamowicie skutecznÄ… metodÄ… debugowania, i można niÄ… z powodzeniem zlokalizować całą masÄ™ różnych błędów, w tym takich które np. nie objawiajÄ… siÄ™ przy włączonym debuggerze. Na prawdÄ™ zachÄ™cam do stosowania tej metody!
Na koniec jeszcze jedna uwaga (o której przypomniaÅ‚ mi Makdaam) - niektóre jÄ™zyki programowania w niektórych przypadkach buforujÄ… tekst przez chwilÄ™ przed jego wypisaniem, przez co jeżeli tekst nie zostaÅ‚ jeszcze wypisany (tj. nadal czeka w buforze), a aplikacja siÄ™ "wyÅ‚ożyÅ‚a" (np. z powodu krytycznego błędu), to ów tekst nigdy nie zostanie wyÅ›wietlony. W takim przypadku należy po każdym dodanym "print'cie" dodać również wymuszenie opróżnienia bufora (zazwyczaj komenda od tego ma sÅ‚owo 'flush' w sobie; przykÅ‚adowo, w jÄ™zyku C/C++ w przypadku konsoli piszemy fflush(stdout)).
2. "Na pluszowego misia"
Sprawa jest prosta - znajdujemy jakÄ…Å› cierpliwÄ… osobÄ™ (np. pluszowego misia ;>) lub przedmiot, któremu tÅ‚umaczymy, dokÅ‚adnie, od A do Z, jak dziaÅ‚a problematyczny fragment naszego kodu, oraz jak objawia siÄ™ problem. Z bardzo dużym prawdopodobieÅ„stwem podczas tÅ‚umaczenia przyjdzie nam do gÅ‚owy na czym problem polega i jak go rozwiÄ…zać.
Domyślam się że pomysł brzmi zabawnie, niemniej jednak zaręczam o jego skuteczności. Na koniec dodam że nazwę tej metody usłyszałem na konferencji IGK, podczas prelekcji Adama Sawickiego.
3. Zabawa w procesor
Bierzemy kartkÄ™ papieru, lub otwieramy edytor tekstu, wypisujemy sobie zmienne, i ich wartoÅ›ci, używane w problematycznym fragmencie kodu, po czym linia po linii "wykonujemy" program, czyli na chwilÄ™ zamieniamy siÄ™ w procesor/interpreter. PostÄ™pujÄ…c w ten sposób albo natkniemy siÄ™ na błąd, albo (co zazwyczaj wymaga połączenia z metodÄ… "Print it!") natkniemy siÄ™ na różnicÄ™ w pojmowaniu kodu przez nas i przez interpreter (tj. interpreter inaczej wykonuje kod niż my myÅ›leliÅ›my że on to robi).
TÄ… metodÄ™ polecam również przy operowaniu na wskaźnikach/referencjach, do testowania zaimplementowanego rozwiÄ…zania po jego napisaniu. Nie raz uratowaÅ‚a mnie przed późniejszym debugowaniem ;>
4. Debugger
I w koÅ„cu dojechaliÅ›my do debuggera, czyli wyspecjalizowanego narzÄ™dzia pozwalajÄ…cego na Å›ledzenie przebiegu programu i wartoÅ›ci zmiennych. Debuggery czÄ™sto przerażajÄ… poczÄ…tkujÄ…cych programistów swojÄ… zÅ‚ożonoÅ›ciÄ…, niemniej jednak umiejÄ™tność korzystania z debuggera czÄ™sto pozwala wyÅ›ledzić pewnego rodzaju błędy dużo szybciej niż pozostaÅ‚ymi metodami. PrzykÅ‚adowo, wiÄ™kszość debuggerów potrafi z dokÅ‚adnoÅ›ciÄ… do linii kodu wskazać miejsce w którym program siÄ™ "wysypaÅ‚" (tj. rzuciÅ‚ nieobsÅ‚użonym wyjÄ…tkiem i zostaÅ‚ zabity przez system operacyjny).
Niestety (a może stety) w przypadku niektórych jÄ™zyków i niektórych przypadków, do poprawnej interpretacji informacji przekazanych przez debugger, wymagana jest znajomość jÄ™zyka niższego poziomu, np. assemblera. Szczerze mówiÄ…c, nie taki straszny assembler jak go malujÄ… ;>
Prewencja
CzÄ™sto możemy zaoszczÄ™dzić czas po prostu starajÄ…c siÄ™ stosować pewne Å›rodki prewencyjne. Przede wszystkim zalecam zmuszenie kompilatora do wypisywania jak najwiÄ™kszej iloÅ›ci informacji o potencjalnych błędach, czy dodatkowych ostrzeżeÅ„. PoczÄ…tkujÄ…cy programiÅ›ci majÄ… niestety tendencje do robienia dokÅ‚adnie na odwrót - tj. wyłączajÄ… lub ignorujÄ… wszystkie ostrzeżenia, co niestety powoduje iż zamiast poprawić pewne błędy od razu, zaczynajÄ… ich szukać gdy nie jest to już takie Å‚atwe. OstrzeżeÅ„ nie usuwa siÄ™ poprzez ich ukrywanie, tylko poprzez naprawÄ™ kodu źródÅ‚owego!
KolejnÄ… metodÄ… jest po prostu testowanie kodu co jakiÅ› czas, lub nawet testowanie każdej napisanej funkcji osobno (patrz testy jednostkowe) - napiszmy krótki programik testowy dla danej funkcji, upewnijmy siÄ™ że dane wyjÅ›ciowe sÄ… tym czego oczekujemy.
Dobrym pomysÅ‚em jest również używanie assertów. Assert'y sÄ… pewnymi zaÅ‚ożeniami, które twórca funkcji uważa za oczywiste, i które ma nadzieje że użytkownik funkcji (którym oczywiÅ›cie czÄ™sto jest po prostu jej twórca) również bÄ™dzie stosowaÅ‚. Jeżeli użytkownik funkcji nie zastosuje siÄ™ do zaÅ‚ożenia, wtedy assert zasygnalizuje błąd. Warto sprawdzić czy dany jÄ™zyk ma mechanizm assertów (ewentualnie jak go emulować), i warto z nich korzystać.
Bardzo czÄ™stym błędem, za równo poczÄ…tkujÄ…cych, jak i zaawansowanych programistów, jest ignorowanie tzw. "obsÅ‚ugi błędów". WiÄ™kszość funkcji w każdej bibliotece może z jakiegoÅ› powodu siÄ™ nie wykonać poprawnie - w takim wypadku funkcja zasygnalizuje błąd, który powinien zostać wyÅ‚apany i odpowiednio obsÅ‚użony przez program (np. poprzez wypisanie informacji o zaistniaÅ‚ym błędzie). Informacje o tym jak funkcja sygnalizuje błąd, i jakie błędy mogÄ… siÄ™ pojawić, znajduje siÄ™ oczywiÅ›cie w oficjalnej dokumentacji danej funkcji (tj. w dokumentacji jÄ™zyka, biblioteki, czy systemu operacyjnego). Dodam że nie powinno siÄ™ starać naprawiać takich zgÅ‚oszonych-przez-funkcje błędów na siłę - czÄ™sto powoduje to wprowadzenie kolejnych błędów. Czasami lepiej po prostu napisać użytkownikowi że coÅ› poszÅ‚o nie tak, i pozostawić jemu decyzjÄ™ co z tym zrobić.
KoÅ„czÄ…c temat rozwiÄ…zywania problemów dodam jeszcze, ponownie z wÅ‚asnego doÅ›wiadczenia, że późnym wieczorem, gdy czÅ‚owiek jest już zmÄ™czony, pewne oczywiste błędy stajÄ… siÄ™ nie do znalezienia. W takim wypadku wystarczy iść spać. Raz, że mózg nadal bÄ™dzie myÅ›laÅ‚ nad problemem (patrz "wglÄ…d") i być może obudzimy siÄ™ znajÄ…c rozwiÄ…zanie, a dwa, że wypoczÄ™ty umysÅ‚ może dostrzec oczywistość która nam wczeÅ›niej umknęła.
5. Droga ku doskonałości
Każdy poczÄ…tkujÄ…cy programista prÄ™dzej czy później zacznie siÄ™ zastanawiać czego nowego powinien siÄ™ nauczyć lub jakie ćwiczenia powinien wykonywać, tak aby stawać siÄ™ coraz lepszym. Poniżej prezentuje kilka moich przemyÅ›leÅ„:
1. Programuj, programuj, programuj!
Sprawa jest prosta - programowania uczy siÄ™ programujÄ…c, tj. jeżeli chcesz być dobrym programistÄ…, musisz stworzyć na prawdÄ™ wiele programów/skryptów. PrzykÅ‚adowo, osoby które uważam za dobrych programistów, codziennie coÅ› piszÄ…. A piszÄ… krótkie programiki do przetestowania nowo poznanej funkcji/biblioteki lub zweryfikowania jak jÄ™zyk zachowuje siÄ™ przy zastosowaniu jakiegoÅ› niestandardowego triku, piszÄ… różne funkcje i biblioteki które być może przydadzÄ… siÄ™ przy nastÄ™pnym projekcie, rozpoczynajÄ… nowe maÅ‚e, Å›rednie i duże projekty, i nastÄ™pnie dÅ‚ubiÄ… przy nich przez kilka dni/tygodni/miesiÄ™cy, testujÄ… inne jÄ™zyki programowania by nastÄ™pnie zapożyczyć z nich pewne rozwiÄ…zania i użyć ich w ich ulubionym jÄ™zyku, próbujÄ… modyfikować kody stworzone przez innych, etc. DziÄ™ki temu każdy z nich zdobywa doÅ›wiadczenie oraz Å‚atwość w posÅ‚ugiwaniu siÄ™ jÄ™zykiem, oraz uczy siÄ™ programować (a tego czÅ‚owiek uczy siÄ™ caÅ‚e życie).
Tak więc jeżeli chcesz zostać dobrym programistą - pisz! Napisz codziennie kilkadziesiąt-kilkaset (a może i kilka tysięcy!) linii kodu.
Ludzie oczywiÅ›cie sÄ… różni - jedni majÄ… tyle pomysÅ‚ów "co by tu napisać" że muszÄ… wybierać za co siÄ™ wezmÄ…, a inni majÄ… problem z wymyÅ›leniem jednej rzeczy którÄ… chcieli by napisać. Ci pierwsi majÄ… Å‚atwiej, natomiast ci drudzy muszÄ… starać siÄ™ poszukać jakiÅ› inspiracji. ŹródÅ‚o inspiracji jest oczywiÅ›cie kwestiÄ… indywidualnÄ…. Czasami wystarczy wyjść do parku (np. mnie zawsze po wizycie w parku strasznie ciÄ…gnie żeby napisać jakiegoÅ› MMORPG ;>), przejrzeć screeny z gier tworzonych przez innych programistów (polecam http://gamedev.pl), czy otworzyć książkÄ™ o programowaniu na losowej stronie. ZachÄ™cam do poszukania wÅ‚asnych źródeÅ‚ inspiracji ;>
Dodam że warto wyznaczać sobie cele które przekraczajÄ… nasze możliwoÅ›ci - tak uczymy siÄ™ najwiÄ™cej. Nawet jeżeli w koÅ„cu nie skoÅ„czymy danego projektu, to i tak dużo siÄ™ nauczymy w ten sposób. Przy okazji, ważna uwaga - dużo osób rozpoczyna jakieÅ› projekty, które po jakimÅ› czasie porzucajÄ…, i nie biorÄ… siÄ™ za nic nowego, ponieważ mÄ™czÄ… ich wyrzuty sumienia że porzucili poprzedni projekt, i chcieli by go dokoÅ„czyć. To że nie koÅ„czymy wÅ‚asnych projektów jest jak najbardziej normalne (czy też "jak najbardziej ludzkie), i najgorszÄ… rzeczÄ… jakÄ… możemy zrobić to pogrążyć siÄ™ w wyrzutach sumienia. Zamiast siÄ™ zamartwiać że nie skoÅ„czyliÅ›my tamtego projektu, weźmy siÄ™ za nastÄ™pny - tracimy tak dużo mniej czasu, a i być może po kolejnym projekcie wrócimy do poprzedniego. OczywiÅ›cie mimo to należy starać siÄ™ koÅ„czyć projekty, ale gdy już projekt padnie, powinniÅ›my po prostu wziąć siÄ™ za nastÄ™pny, i spróbować jeszcze raz ;>
2. Poznawaj!
Przy okazji wyboru języka pisałem już o potrzebie poznawania nowych rzeczy. Jako programiście powinniśmy uczyć się następujących rzeczy:
1. Nowych funkcji i bibliotek
2. Algorytmiki i struktur danych
3. Nowych jÄ™zyków
4. Nowych narzÄ™dzi uÅ‚atwiajÄ…cych programowanie i debuggowanie (debuggerów, profilerów, systemów wersjonowania, IDE, systemów automatycznego generowania dokumentacji, systemów budowania aplikacji, etc)
5. Nowych "specjalnoÅ›ci" programistycznych - np. programowania sieciowego, programowania aplikacji webowych, programowania gier, proceduralnego tworzenia grafiki, systemów operacyjnych, pisania pluginów, etc
6. Systemu operacyjnego - API systemowego, oraz tego jak działa i jak jest zbudowany
7. Nowych metod rozwiÄ…zywania różnych problemów programistycznych
8. SÅ‚ów zwiÄ…zanych z programowaniem - na poczÄ…tek wymieniÄ™ choćby: deklaracja, definicja, prototyp, argument funkcji - ale tych sÅ‚ów jest dużo wiÄ™cej ;>
9. Etc.
Programowanie to ciÄ…gÅ‚a nauka (to stwierdzenie jest prawdziwe dla każdej dziaÅ‚ki w której chcemy siÄ™ specjalizować ;>).
3. Dziel siÄ™ wiedzÄ…!
W Å›rodowiskach akademickich krąży taki jeden dowcip (który postaram siÄ™ w dość luźny sposób zacytować):
Profesor opowiada koledze:
- Tłumaczyłem ostatnio studentom pewną rzecz. Tłumaczę pierwszy raz, nie zrozumieli. Tłumaczę drugi raz, znowu nie zrozumieli. Tłumaczę więc kolejny, nadal nic. Tłumaczę czwarty raz, sam zrozumiałem, a oni nadal nic...
Dowcip ten zawiera bardzo ważnÄ… wskazówkÄ™ - pomagajÄ…c rozwiÄ…zać problem innym, sami uczymy siÄ™ go rozwiÄ…zywać. A nawet jeÅ›li wiedzieliÅ›my już jak to zrobić, to czÄ™sto dowiadujemy siÄ™ czegoÅ› nowego, lub po prostu utrwalamy sobie trochÄ™ informacji. ProszÄ™ zauważyć, że jest to dokÅ‚adnie odwrócenie tego o czym pisaÅ‚em przy okazji for internetowych - nie proÅ›my o pomoc, sami pomagajmy - tak uczymy siÄ™ najwiÄ™cej.
Jeżeli uważamy że staliÅ›my siÄ™ wystarczajÄ…co silni z jakiejÅ› dziedziny, możemy spróbować również napisać jakiÅ› artykuÅ‚, kurs czy tutorial. Przy okazji tworzenia takich rzeczy bardzo czÄ™sto musimy przeprowadzić trochÄ™ dodatkowych badaÅ„ jak coÅ› dziaÅ‚a, czy poszperać w dokumentacji by upewnić siÄ™ że faktycznie jest tak jak piszemy - i dziÄ™ki temu uczymy siÄ™ nowych rzeczy, jak i utrwalamy sobie to co już wiedzieliÅ›my. Dodatkowo, taki artykuÅ‚ może przydać siÄ™ w przyszÅ‚oÅ›ci jakiemuÅ› mniej lub bardziej poczÄ…tkujÄ…cemu programiÅ›cie ;>
Przy okazji tego punktu jednak bardzo ważna uwaga: od braku informacji gorsza jest dezinformacja. Tak wiÄ™c wypowiadajÄ…c siÄ™ na forum czy liÅ›cie dyskusyjnej, piszÄ…c artykuÅ‚ czy tutorial, pamiÄ™tajmy o tym że jesteÅ›my przez czytelnika traktowani z dużą dozÄ… zaufania, i że prawdopodobnie wszystko co napiszemy zostanie potraktowane jako "na pewno prawdziwe". Przez to spoczywa na nas duża odpowiedzialność za prawdziwość, prawidÅ‚owość i aktualność informacji. Możemy na prawdÄ™ dużo zamieszania narobić puszczajÄ…c w obieg nieprawdziwe informacje, lub po prostu możemy opublikować coÅ› za co później, za 5-10 lat, bÄ™dziemy musieli siÄ™ wstydzić.
Pamiętaj, że nie chodzi o to by opublikować artykuł, tylko o to by go napisać. Nawet nieopublikowany artykuł uczy bardzo dużo ;>
4. Znajdź jakieś wyzwanie
Niektórzy ludzie, gÅ‚ównie mężczyźni, bardzo lubiÄ… wyzwania. Bardzo motywuje ich wspóÅ‚zawodnictwo, konkurowanie z innymi, etc. Jeżeli jesteÅ› takim czÅ‚owiekiem, wykorzystaj to! Na różnych scenach/forach/serwisach programistycznych czÄ™sto organizowane sÄ… różne konkursy (zwane czÄ™sto "compo"), czÄ™sto organizowane po prostu przez nudzÄ…cych siÄ™ ludzi (tj. bez nagród). Bierz udziaÅ‚ w takich konkursach, dużo można siÄ™ w nich nauczyć, a także poznać wielu bardzo ciekawych ludzi.
CzÄ™sto również możliwość pochwalenia siÄ™ innym swoim programem wpÅ‚ywa bardzo motywujÄ…co ;>
Koniec, a w zasadzie dopiero poczÄ…tek!
Jeżeli doczytaÅ‚eÅ›/Å‚aÅ› do tego miejsca, gratuluje wytrwaÅ‚oÅ›ci i cierpliwoÅ›ci! Dodam że cieszÄ™ siÄ™ podwójnie z tego, gdyż cierpliwość i wytrwaÅ‚ość to bardzo ważne cechy dla programisty ;>
Na koniec chciałbym życzyć Ci powodzenia i wytrwałości!
HF GL!
Gynvael Coldwind
team Vexillium
http://gynvael.coldwind.pl
Notka na temat kopiowania "Poradnika Początkującego Programisty": Niniejszym udzielam zgody na kopiowanie, rozpowszechnianie i publikowanie niniejszego artykułu, pod warunkiem iż forma i treść pozostanie niezmieniona, prawdziwy autor jasno określony, a artykuł będzie prezentowany nieodpłatnie, w pełnej postaci. W przypadku wątpliwości można się ze mną skontaktować, nie gryzę ;>