Научите Сами Да Програмирате за 10 Година

Петар Норвиг (Гугле Директор Истраживања)

Latinica | Оригинал на Енглеском и преводи на друге језике.

Зашто су сви у таквој журби?

Идите у било коју књижару, и видећете Научите Сами Јаву за 7 дана заједно са безбројним варијацијама које нуде учење Visual Basic-a, Windows-a, Internet-a, и тако даље за пар дана или сати. Урадио сам следећу претрагу на Amazon.com: (датум публикације: после 1992, наслов: научи или наслов: научи сам)
pubdate: after 1992 and title: days and
title: learn or title: teach yourself)
и добио 248 погодака. Првих 78 су компјутерске књиге (број 79 је била Learn Bengali in 30 days) (Научите Бенгали ѕа 30 дана). Заменио сам "days" (дани) са "hours" (сати) и добио невероватно сличне резултате: 253 књига са 77 компјутерских књига праћеним са Teach Yourself Grammar and Style in 24 Hours (Nauчите граматику и изражавање за 24 сата) на месту 78. Од првих 200 укупно, 96% су биле компјутерске књиге.

Закључак је да су људи или у великој журби да уче о компјутерима, или да су компјутери некако невероватно лакши да се науче него било шта друго. Нема књига за учење Бетовена, или Квантне Физике, или чак ни Неге Паса за пар дана.

Анализирајмо ста би наслов као сто је Learn Pascal in Three Days (Научите Паскал за Три Дана) могао да значи:

  • Научи: За 3 дана нећете имати времена да напишете неколико озбиљнијих програма, и да научите из својих успеха и неуспеха. Нећете имати времена да радите са искусним програмером и разумете како је то живети у таквој средини. Укратко, нећете имати много времена за ученје. Значи они могу само да причају о површном познавању материје, а не о суштинском разумевању. Као што је Александар Попа рекао, мало ученја је опасно ученје.

  • Паскал: За три дана ћете можда моћи да научите синтаксу Паскала (ако сте већ знали сличан језик), али неби могли да научите како да користите синтаксу. Укратко, ако сте на пример програмер Бејзика, могли бисте научити да напишете програм у стилу Бејзика користећи синтаксу Паскала, али не бисте могли научити зашта је Паскал добар (или лош). У чему је онда поента? Алан Перлис је једном рекао: "Језик који не утиче на начин како мислите о програмиранју није вредан познаванја." Једна могућа поента је ученје малецног дела Паскала (или вероватније, нечега као сто је Вижуал Бејзик или Јаваскрипт) зато што вам треба интерфејс са постојећим алатом за постизање специфичног задатка. Али тада не учите како да програмирате; учите како да обавите задатак.

  • зѕ Три Дана: На жалост, ово није довољно, као сто следећи параграфи показују.

Научите Сами Да Програмирате за 10 Година

Истраживачи (Хејс, Блум) су показали да треба око 10 година да се развије стручност у било којој од многобројних области, укључујући играње шаха, компоновање музике, сликање, свирање клавира, пливање, тенис, и истраживање у неуропсихологији и топологији. Изгледа да нема пречица: чак је и Моцарту, који је био музичко чудо од детета са 4 године, требало 13 и више година пре него што је почео да прави музику светске класе. У другом пољу, Битлси су постали славни са низом хитова и појављивањем у емисији Еда Суливана у 1964. Али они су пре тога свирали у малим клубовима у Ливерпулу и Хамбургу од 1957, и док их је публика волела и раније, први критичан велики успех, Sgt. Peppers, је објављен у 1967. Самјуел Џонсон је мислио да треба више од 10 година: "Савршенство у било којој области се може постићи само радом током целог живота; не може се постићи мањом ценом." И Шауцер се жалио "живот тако кратак, вештина толико много времена захтева."

Ево мог рецепта за успех у програмирању:

  • Заинтересујте се за програмирање, и то што је забавно. Побрините се да оно остане забавно тако да ће те бити жељни да уложите десет година.

  • Причајте са другим програмерима; читајте туђе програме. Ово је важније од било које књиге или курса-тренинга.

  • Програмирајте. Најбоље се учи кроз рад. Да се изразим формалније, "максималан ниво учинка за појединца у датој делатности се не постиже аутоматски као функција већег искуства, него степен учинка може да се увећа чак и код веома искусних особа као резултат намерног труда ка усавршавању." (p. 366) и "најефикасније учење захтева добро дефинисан задатак са примереном тежином за дату особу, информативан савет, и прилике за понављање и исправљање грешака." (p. 20-21) Књига Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life (Когниција у Пракси: Ум, Математика, и Култура у Свакодневном Животу) је занимљива референца за ово размишљање.

  • Ако желите, уложите четити године у факултет (или више на постдипломским студијама). То ће вам дати приступ неким пословима који захтевају дипломе, и даће вам боље разумевање области, али ако не уживате у школи, можете (са извесном посвећеношћу) добити слично искуство на послу. У сваком случају, учење из уџбеника само по себи неће бити довољно. "Образовање из области рачунарске технике и информатике не може никог учинити експертом у програмирању, ништа више него што студирање четкица и боја може неког учинити мајстором сликарства" каже Ерик Рејмонд, аутор The New Hacker's Dictionary (Нови Речник Хакера). Један од најбољих програмера које сам икада запослио је имао само средњошколску дипломуч направио је много импресивног програма, има своју news group, и кроз сток деонице је нема сумње много богатији него што ћу ја икада бити.

  • Радите на пројектима са другим програмерима. Будите најбољи програмер на неким пројектима; будите најгори на неким другим. Када сте најбољи, имаћете прилике да истестирате своје способности да управљате пројектом, и да инспиришете друге својом визијом. Када сте најгори, научите шта најбољи раде, и научите шта не воле да раде (зато што то натерају вас да урадите).

  • Радите на пројектима после других програмера. Будите укључени у разумевање програма које су писали други. Видите шта је потребно да бисте разумели и поправили програм када његови оригинални програмери нису ту. Мислите како да дизајнирате ваше програме да их направите једноставније за оне који ће их одржавати после вас.

  • Научите бар неколицину програмских језика. Укључите један језик који подржава абстракцију класа (као Јава или Це++), један који подрзава абстракцију функција (као Лисп или МЛ), један који подрзава абстракцију синтаксе (као Лисп), један који подрзава декларативне спецификације (као Пролог или Це++ темплатес), један који подрзава корутине (као Ицон или Сцхеме), и један који подрзава паралелизам (као Сисал).

  • Запамтите да постоји и "рачунар" у "рачунарској техници и информатици". Знајте колико дуго треба вашем рачунару да обави инструкцију, прочита реч из меморије (са или без кеша), прочита суседну реч из диска, и потражи нову локацију на диску. (Одговори овде.)

  • Укључите се у стандардизацију језика. То може бити АНСИ Це++ комитет, или одлучивање дал локалан стил кодирања треба да има 2 или 4 празна места за интендацију. У сваком слуцају, научићете ста други људи воле у језику, колико озбиљно, или можда колико мало о томе мисле.

  • Знај када је време да се скинеш с језичне стандардизације, што је пре могуће.
Са свим тим на уму, дискутабилно је колико далеко можете стићи само са учењем из књиге. Пре него што сам добио прво дете, прочитао сам све Како да книге, и даље сам се осећао као зелени без икаквог знања. 30 месеци касније, кад сам требао да добијем друго дете, дали сам поново обнављао градиво из тих книга? Не. Уместо тога, ослонио сам се на лично искуство, које се испоставило много корисније и охрабрујуће за мене него хиљаде страна написаних од стране експерта.

Фред Брукс, у његовом раду No Silver Bullets (Нема Сребрних Меткова) идентификује план од три дела за налажење сјајних дизајнера апликација:

  1. Систематично идентификуј најбоље дизајнере што је раније могуће.

  2. Додели ментора за каријеру да буде одговоран за развој кандидата, и пажљиво белези развој каријере.

  3. Омогући за дизајнере у развоју да комуницирају и стимулишу једни друге.

Ово подразумева да неки људи већ имају квалитете неопходне да би се постао сјајан дизајнер; циљ је препознати их. Алан Перлис је то рекао лепше: "Свако се мозе научити да ваја скулптуре: Микеланђело би се вероватно морао научити како да не ваја. Тако је и са великим програмерима".

Значи, само напред и купите книгу о Јави; вероватно ће вам бити од неке користи. Али неће вам променити живот, или вашу стварну свеукупну експертизу као програмера у 24 сата, дана, па чак и месеца.


Референце

Блyм, Бењамин (ед.) Developing Talent in Young People, Балантине, 1985.

Брyкс, Фред, No Silver Bullets, ИЕЕЕ Компјутер, вол. 20, но. 4, 1987, п. 10-19.

Хаyес, Јохн Р., Complete Problem Solver Лорвенце Ерлбаум, 1989.

Лаве, Јеан, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Кејмбриџ Универзитетска Штампа, 1988.


Одговори

Приближна времена разних операција на типичном 1GHz PC лета 2001:

execute single instruction 1 nsec = (1/1,000,000,000) sec
fetch word from L1 cache memory 2 nsec
fetch word from main memory 10 nsec
fetch word from consecutive disk location 200 nsec
fetch word from new disk location (seek) 8,000,000nsec = 8msec


Додатак: Избор Језика

Неколико људи ме је питало који програмски језик би требало да науче прво. Нема једног одговора, али размотрите следеће ставке:

  • Користите пријатеље. Када ме неко пита "који оперативни систем би требао да користим, Виндовс, Уникс, или Мак?", мој одговор је обично: "користи штагод твоји другови користе." Предност коју добијете учећи од другова ће надмашити сваку својствену разлику између ОС, или између програмских језика. Такође размотрите будуће пријатеље: кругови програмера којих ћете бити део ако наставите. Дали ваш изабран језик има велико растуће друштво, или мало које се губи? Има ли књига, wеб страница, интернет форума, од којих могу да се добију одговори? Да ли вам се свидјају људи на тим форумима?
  • Не компликујте. Програмерски језици као сто су Ц++ и Јава су дизајнирани за професионални развој од стране великих тимова искусних програмера које брине ефикасност извршења њиховог кода. Као резултат, ови језици имају компликоване делове дизајниране за те околности. Ваша брига је да научите да програмирате. Не требају вам додатне компликације. Зелите језик који је направљен да мозе брзо да се учи и да се запамти од стране појединачног програмера.
  • Играјте се. На који начин бисте радије научили да свирате клавир: на природан, интерактиван начин, у коме чујете сваку ноту чим притиснете клавијатуру, или у "batch" моду, у коме чујете ноте пошто сте завршили целу мелодију? Очигледно, интерактиван начин чини учење једноставније за клавир, а такодје и за програмирање. Инсистирајте на језику са интерактивном могућносшу, и користите је.
Имајући ове критеријуме у виду, моји предлози за први програмерски језик би био Python или Scheme. Али ваше околности могу да се разликују, и постоје и други добри избори. Ако имате мање од десет година, мозда ћете више волети Alice или Squeak (старији ученици ће можда такође уживати у овим). Важно је да одаберете и почнете.

Додатак: Књиге и други извори

Неколико људи је питало из којих књига и веб страница би требало да уче. Понављам да "учење само из книга неће бити довољно", али могу да препоручим следеће:

  • Scheme: Structure and Interpretation of Computer Programs (Abelson & Sussman) (Структура и Интерпретација Компјутерских Програма) је вероватно најбољи увод у рачунарску технику и информатику, и учи програмирању као начину разумевању информатике. Можете видети онлајн снимљене лекције засноване на овој књизи, као и цео текст на интернету. Књига је захтевна, и можда ће одбити неке људе који би иначе могли бити успешни са неким другим приступом.
  • Scheme: How to Design Programs (Felleisen et al.) (Како направити програм) је једна од најбољих књига о томе како стварно дизајнирати програме на елегантан и функционалан начин.
  • Python: Python Programming: An Intro to CS (Zelle) (Пајтон програмирање: увод у РИ) је увод у Пајтон.
  • Python: Неколико интернет туторијала је доступно на Python.org.
  • Oz: Concepts, Techniques, and Models of Computer Programming (Van Roy & Haridi) (Концепти, Технике, и Модели Компјутерског Програмирања) се сматра од стране неких као модерни наследник Абелсон Сусмана. То је водић кроз велике идеје програмирања, који покрива више тема од Абелсон Сусман а у исто време је вероватно једноставнији да се чита и прати. Користи језик, Oz, који није много познат али служи као основа за учење других језика.


Ауторска права: Петар Норвиг (2001) Превод: Лазар Ковачевић (2006) -- пошаљите примедбе на превод