Poznaj sztukę programowania w dziesięć lat
Peter Norvig
Tłumaczenie: Jakub Piotr Nowak
Last revised 2006.04.08
Dlaczego wszyscy są w takim pośpiechu?
Wejdź do obojętnie jakiej księgarni, a przekonasz się, że można poznać język Java w 24 godziny (Teach
Yourself Java in 7 Days), wśród innych równie zachęcających pozycji, które oferują naukę języka Visual Basic,
systemu Windows czy Internetu w ciągu kilku godzin bądź kilku dni. Przeprowadziłem takie oto zaawansowane
wyszukiwanie na Amazon.com:
pubdate: after 1992 and title: days and (title: learn or title: teach yourself)
i jako wynik dostałem 248 trafień. Pierwsze 78 dotyczyło książek z dziedziny informatyki (pozycja 79
to "Poznaj język Bengali w 30 dni"). Zaminiłem słowo "dni" na słowo "godzin" (hours) i dostałem
uderzająco podobny wynik: 253 pozycje, spośród których 77 było informatycznych, a tytuł kolejnej 78 pozycji
brzmiał: "Poznaj gramatykę i styl pisania w 24 godziny". W ogólności, spośród pierwszych dwustu książek,
96% stanowiły książki informatyczne.
Wniosek z tego taki, że albo ludzie muszą szybko zgłębić tajniki informatyki albo sama informatyka jest,
jakimś dziwnym sposobem, znacznie łatwiejsza do poznania niż inne dziedziny. Nie ma książek, jak poznać
w kilka dni utwory Beethovena, fizykę kwantową czy sposób wyczesywania psa.
Zastanówmy się, co taki tytuł, jak "Poznaj język Pascal w 3 dni" może znaczyć:
- Poznaj: W ciągu trzech dni nie będziesz miał czasu, aby napisać kilka znaczących programów ani
wyciągnać wnioski z sukcesów i porażek, które wynikłyby z ich napisania. Nie będziesz miał czasu na to,
aby popracować z doświadczonym programistą ani aby zrozumieć, jak żyje się w takim otoczeniu. W skrócie,
nie nauczysz się wiele. A więc książki tego typu mogą mówić tylko o niezwykle powierzchownej znajomości, a
nie o głębokim zrozumieniu. Jak powiedział Alexander Pope: "Niebezpiecznie jest uczyć się mało."
- język Pascal: W ciągu trzech dni być może zdołasz poznać składnię języka Pascal (jeśli znałeś
przedtem podobny język programowania), ale nie dowiesz się, jak jej używać. Innymi słowy, jeśli byłbyś
programistą od Basica, mógłbyś nauczyć się jedynie, jak pisać programy w stylu Basicowym przy użyciu
składni Pascala i nie dowiedziałbyś się, w czym właściwie Pascal wyróżnia się od innych języków. O co
więc w tym wszystkim chodzi? Alan Perlis
powiedział pewnego razu: "Język programowania, który nie odzwierciedla Twojego sposobu myślenia o samym
programowaniu, jest niewart poznania." Być może chodzi o to, że musisz poznać mały ułamek Pascala (albo, co
bardziej prawdopodobne, coś stylu JavaScript bądź Visual Basic), ponieważ potrzebujesz środka komunikacji z
istniejącym narzędziem, aby wykonać jakieś określone zadanie. Nie uczysz się więc, jak programować, ale w
jaki sposób zakończyć owe zadanie.
- w trzy dni: niestety, jak się okaże w dalszej części, trzy dni nie wystarczą
Poznaj sztukę programowania w dziesięć lat
Naukowcy (Hayes, Bloom) pokazali, że potrzeba około dziesięciu lat, aby rozwinąć umiejętność oceny w
jakiejkolwiek dziedzinie, włączając w to grę w szachy, komponowanie muzyki, malowanie, grę na pianinie, pływanie,
grę w tenisa, badania w dziedzinie neuropsychologii czy topologii. Zdaje się, że nie ma żadnych wyjątków od tej
zasady: nawet Mozartowi, który wykazywał niezwykłe zdolności muzyczne już w wieku czterech lat, zabrało dodatkowe
trzynaście lat nim zaczął tworzyć utwory światowej klasy. Weźmy inny rodzaj muzyki, wydawało się, że zespół
The Beatles pojawił się na scenie muzycznej i w Show Eda Sullivana z dnia na dzień. Grali oni jednakże
już od 1957 w małych klubach w Liverpoolu i w Hamburgu i ich pierwszy, wspaniały sukces, Sgt. Peppers,
zostały wydany w 1967.
Oto mój przepis na programistyczny sukces:
- Zainteresuj się programowaniem i zajmuj się tym dlatego, że daje radość. Miej pewność, że radość ta jest na
tyle duża, aby z chęcią oddać się jej przez następne dziesięć lat.
- Rozmawiaj z innymi programistami, czytaj programy innych. Jest to ważniejsze niż obojętnie jaka książka czy
kurs.
- Programuj! Praktyka jest najlepszą
nauczycielką. Ujmująć to bardziej technicznie: "Maksymalny poziom wydajności dla jednostki w danej
dziedzinie nie jest osiągany automatycznie, jako funkcja poszerzonego doświadczenia, ale poziom tej wydajności
może być zwiększony nawet przez wysoce doświadczone jednostki jako wynik przemyślanych wysiłków zmierzających
do jej ulepszenia."(p. 366) oraz
dalej "najbardziej efektywny sposób nauki wymaga dobrze zdefiniowanego problemu z odpowiednio dobranym
poziomem trudności w zależności od konkretnej jednostki, zasobnym w informacje feedbackiem i możliwością
powtarzania oraz korekcji błędów." (p.20-21). Książka
Cognition in Practice: Mind, Mathematics, and
Culture in Everyday Life to interesującą pozycją przedstawiającą ten punkt widzenia.
- Pracuj nad projektami wśród innych programistów. W pewnych projektach bądź najlepszy, a w innych
najgorszy. Kiedy jesteś najlepszy, masz okazję sprawdzić swoje umiejętności kierowania projektem i przekonać
się, jak to jest natchnąć innych swoją koncepcją. Kiedy jesteś najgorszy, uczysz się od innych, lepszych od
siebie, czego oni robić nie lubią, bo właśnie Tobie przykazali to zrobić.
- Bierz czynny udział w rozumieniu programu napisanego przez kogoś innego. Spróbuj się dowiedzieć, czego
potrzeba, aby go zrozumieć i umieć naprawić, gdy orgynialnych twórców nie ma w pobliżu. Myśl o tym, jak
zaprojektować swój program, aby był on później łatwy w utrzymaniu przez innych.
- Poznaj co najmniej sześć języków programowania. Uwzględniając taki, który wspiera programowanie obiektowe,
taki, który wspiera programowanie funkcyjne, taki, który wspiera programowanie ? taki, który wspiera programowanie
deklaratywne, taki, gdzie możliwe jest używanie "procedur symetrycznych" (coroutine) i taki, który wspiera
programowanie równoległe.
- Pamiętaj, że informatyka to nauka o komputerach. Musisz wiedzieć, ile zajmuje wykonanie jednej instrukcji
przez Twój komputer, ile zabiera pobranie słowa z pamięci tak z trafienie w pamięć podręczną, jak i bez trafienia,
przeczytanie dwóch następujących po sobie słów na dysku twardym i przejście do nowej pozycji na tymże dysku.
- Bierz udział w próbach ustandaryzowania języka. Może to być stowarzyszenie ANSI C++ bądź próba uzgodnienia
czy w Twój stylu programowanie wcięcia będą mieć dwie czy cztery spacje. Tak czy inaczej daj Ci to możliwość
poznania, co inni lubią bądź nie w języku, w jakim stopniu i być może dowiecie się, jaka jest przyczyna tych
uczuć.
- Bądź w każdej chwili przygotowany, aby szybko uwolnić się od tego wysiłku ustandaryzowania języka.
Mając to wszystko na względzie, widać, że gruntowane poznanie sztuki programowanie ucząć się tylko z książek
stoi pod znakiem zapytania. Zanim urodziło się moje pierwsze dziecko, czytałem wszystkie poradniki i nadal czułem,
że nie mam o niczym najmniejszego pojęcia. Po 30 miesiącach, kiedy moje drugie dziecko było w drodze, nie wróciłem
już do tych książek. Zamiast tego, postanowiłem polegać na swoim własnym doświadczeniu, które okazało się być
znacznie bardziej użyteczne i sprawiało, że miałem mniejsze obawy niż po przeczytaniu tysięcy stron napisanych przez
ekspertów.
Bibliografia
- Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
- Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
- Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
- Lave, Jean, Cognition in Practice: Mind,
Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.
Odpowiedzi
Przybliżony czas dla różnych operacji na typowym PC (1GHz) w lecie 2001:
| wykonanie jednej instrukcji | 1nsec = (1/1,000,000,000) sec |
| pobranie słowa z pamięci podręcznej typu L1 | 2nsec |
| pobranie słowa z pamięci głównej | 10nsec |
| pobranie słow z dysku twardego znajdującego się tuż za wczytanym | 200 nsec |
| pobranie dowolnego słowa z dysku twardego | 8,000,000nsec = 8msec |
Dodatek: Wybór języka programowania
Kilka osób zapytało mnie jakiego języka powinni oni nauczyć się w pierwszej kolejności. Nie ma na to
jednoznacznej odpowiedzi, ale warto rozważyć następujące sugestie:
- Wykorzystaj swoich znajomych!
Na pytanie, który system operacyjny jest warty spróbowania: Windows, Unix czy Mac, odpowiadam zazwyczaj:
"używaj tego, czego używają Twoi znajmoi" ... Weź poduwagę także swoich przyszłych znajomych: społeczność
programistów, której niewątpliwie staniesz się częścią, jeśli tylko będziesz kontynuował. Czy wybrany przez
Ciebie język ma dużą, prężnie się rozwijającą społeczność, czy raczej z lekka dogorywającą? Jest tam dostęp do
książek, stron internetowych bądź forum, z których można by czerpać odpowiedzi? Czy lubisz osoby przebywające
na tym forum?
- Niech to będzie łatwe i banalne! Języki programowania takie jak C++ i Java zostały zaprojektowane
z myślą o profesjonalnym procesie tworzenia oprogramowania przez duże zespoły doświadczonych programistów,
któym zależy na efektywności ich kodu. Z tej przyczyny, jęzki te zawierają elementy nader skomplikowanej natury.
Ty zaś jesteś zainteresowany nauką programowania i cała ta komplikacja nie jest Ci na razie potrzebna. Chcesz języka,
który został zaprojektowany, aby być łatwym do nauczenia i przyswojenia przez jednego, niewtajemniczonego
programistę.
- Baw się! W jaki sposób wolałbyś się nauczyć gry na pianinie: standardowo i interaktywnie kiedy każdy
dźwięk daje się usłyszeć zaraz po tym, jak naciśniemy klawisz, czy raczej wsadowo, kiedy słyszysz nuty dopiero,
gdy skończysz komponować cały utwór? Bez wątpienia w sposób interaktywny, który sprawia, że nauka gry na
pianinie jest łatwiejsza. Podobnie rzecz ma się z programowaniem. Połóż nacisk na język z interaktywnym trybem
i używaj tego trybu.
Mając na uwadze powyższe trzy zasady, wybrałbym na pierwszy język programowania język Pythona albo Scheme.
Ale okoliczności w Twiom wypadku mogą być inne i przez to inne są, możliwości wyboru. Jeśli Twój wiek, to
liczba jednocyfrowa, mógłbyś spróbować języka Alice. Ważne jest to, abyś wybrał i zaczął.
Dodatek: Książki i inne zasoby
Kilka osób zapytało mnie o książki i strony internetowe, które powinni wybrać do nauki. Powtarzam, że sama "książkowa nauka" jest
niewystarczająca, ale mogę polecić następujące rzeczy:
Peter Norvig (Copyright 2001)