Научете се да програмирате, за 10 години

Статията е препоръчана от Радослав Георгиев, при откриването на курса за Програмиране от нулата, който започна наскоро в Hack Bulgaria. Може да прегледате и оригиналния текст, публикуван от Peter Norvig.

Защо всички бързат толкова?

Влезте в някоя книжарница, ще видите Да научиш Java за 24 часа, заедно с безчет вариации, които ви предлагат да научите C, SQL, Ruby, алгоритми и т.н. само за няколко дни или часа. Разширеното търсене на Amazon по заглавие с ключови думи „уча“, „себе си“, „часове“ за издания от 2000 г. насам вади като резултат 512 подобни книги. От тези в челната десятка, 9 са книги за програмиране (и 1 е за счетоводство). Подобни резултати излизат и когато сменим търсенето на „уча се“ с „уча“ или „часове“ с „дни“.

Заключението е, че или хората много бързат да научат нещо за програмирането, или програмирането е нещо, което е в пъти по-лесно за научаване от всичко останало. Felleisen (професор по компютърни науки – бел. прев.) и колектив намекват за тази тенденция в книгата How to Design Programs, като казват, че „Лошото програмиране е лесно. Идиотите могат да го научат за 21 дена, дори и глупави.“ Комиксът на Abtruse Goose ни казва още по темата:

Abtruse Goose

Нека анализираме какво би могло да означава заглавие като Научете се на C++ за 24 часа:

  • Научете се: за 24 часа, няма да имате време да пишете някакви значими програми, както и да се учите паралелно от своите успехи и провали с тях. Няма да имате време да работите с някой по-опитен програмист и да разберете какво е да се живее в C++ среда. Накратко, няма да имате време да научите много. Така че книгата може да има предвид само повърхностно познаване, не дълбоко разбиране на нещата. Както е казал Александър Поуп (английски поет и писател, сатирик – бел. прев.), „да научиш само малко“ е опасно нещо.
  • C++: за 24 часа, може и да успеете да научите част от синтаксиса на С++ (ако вече знаете друг език), но не бихте могли да научите много за начина, по който да ползвате езика. Накратко, ако сте, да речем, програмист на основно ниво, бихте могли да се научите да пишете програми в стила на това основно ниво, ползвайки синтаксиса на С++, но не бихте могли да научите за какво наистина е добър (или лош) езикът С++. Така че, какъв е смисълът? Алън Перлис (американски учен, пионер в програмните езици – бел. прев.) веднъж е казал: „Език, който не се отразява на начина, по който мислите за програмирането, не си заслужава да се учи.“ Възможен е и сценарий, при който трябва да научите нещо малко от С++ (или, което е по-вероятно, нещо като JavaScript или Processing), понеже трябва да се занимавате с някакъв съществуващ инструмент, за изпълнението на определена задача. Но тогава вие не се учите как да програмирате; учите се как да изпълните въпросната задача.
  • за 24 часа: за съжаление, това не е достатъчно време, както показва следващият раздел.

Научете се да програмирате за 10 години

Изследователите (Блум 1985, Брайън и Хартър 1899, Хейс 1989, Симън и Чейс 1973) са показали, че отнема около 10 години, за да развиете експертност в нещо от разнообразния кръг области, вкл. играенето на шах, писането на музика, телеграфията, рисуването, свиренето на пиано, плуването, тениса, изследванията в невропсихологията и топологията. Ключът е в обмислената практика: не просто да правите едно и също отново и отново, а да предизвиквате сами себе си със задача, която просто е отвъд настоящите ви способноси, да се опитвате да я решите, да анализирате представянето си докато го правите и след това, както и да коригирате грешките си. И после го повтаряте. И пак повтаряте. Оказва се, че няма къси пътища: дори на Моцарт, който още на 4 години е бил музикално чудо, му отнема още 13 години, докато започне да продуцира музика от световна величина. В друг жанр, Бийтълс избухват на сцената с поредица от челни хитове и участие в шоуто на Ед Съливан през 1964. Но те свирят в малки клубове в Ливърпул и Хамбург още от 1957-ма, и въпреки че още по-рано привличат масата, първият им огромен и китичен успех, Sgt. Peppers, е пуснат през 1967 г. Малкъм Гладуел популяризира същата идея, макар че се концентрира върху 10 хиляди часа, вместо 10 години.

Може и 10 хиляди часа, а не 10 години, да са магическото число. Или пък може да е друга някаква метрика; Хенри Картиър-Бресън (1908-2004) (френски фотограф, смятан за баща на фотожурналистиката – бел. прев.) е казал: „Първите ти 10 000 фотографии са най-лошите.“ Истинската експертност може да ви отнеме цял живот, докато я постигнете: Самюел Джонсън (1709-1784) (английски писател – бел. прев.) е казал, че „Отличието във всеки бранш може да се постигне само с цял живот усилена работа; не е нещо, което можете да си купите на по-малка цена.“ А Чосър (1340-1400) се оплаква, че „животът е тъй кратък, а занаятът тъй дълго трябва да се учи“. Хипократ (400 г. пр.н.е.) е познат с фразата, „животът е кратък, изкуството е вечно“, която е част от един по-дълъг цитат: „Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile“. Това се превежда като „Животът е краък, занаятът дълъг, възможността е краткотрайна, експериментът крие рискове, а оценката е трудна“. Разбира се, че никое единствено число не може да бъде крайният отговор: не изглежда разумно да се приема, че всяко едно нещо – програмиране, шах, игра на пулове, свирене на музика – ще изисква точно едно и също време за овладяването му, нито пък че всички хора ще отделт това еднакво количество време.

И какво, значи искате да сте програмист

Ето и моята рецепта, за да имате успех в програмирането:

  • Заинтересовайте се от програмирането, и пробвайте нещо, понеже е забавно. Уверете се, че продължава да ви е все така забавно, за да може да вложите в това 10 години или 10 хиляди часа.
  • Програмирайте. Най-добрият начин за учене на нещо е ученето чрез правене. Казано на технически език, „максималното ниво на представяне за всеки един човек в дадена област не се постига автоматично, като функция на разширения опит, а нивото на представяне може да се увеличава дори при много опитните личности, в резултат на преднамерени усилия за подобряване.“ (стр. 366) и „най-ефективното учене изисква добре дефинирана задача, с подходящо ниво на трудност за дадения индивид, информация като обратна връзка и възможности да се повтори отново, и възможностти за коригиране на грешките.“ (стр. 20-21) Книгата „Познанието на практика: умът, математиката и културата във всекидневния живот“ е интересна препратка за тази гледна точка.
  • Говорете с други програмисти; четете други програми. Това е по-важно от която и да е книга или обучителен курс.
  • Ако искате, вложете четири години в колеж (или повече, за да се дипломирате). Това ще ви предостави достъп до работа, която изисква акредитация и ще ви даде по-дълбоко разбиране за областта, но ако учлището не ви радва, можете (с определено посвещаване) да получите подобен опит и сами, или в работата. Във всеки случай, да учите сами няма да ви е достатъчно. „Образованието в компютърните науки не може да направи от никого експерт програмист, както изучаването на четките и пигмента не може да направи някой художник експерт“, казва (софтуерният разработчик) Ерик Реймънд, автор на „Новия речник на хакера“. Един от най-добрите програмисти, които съм наемал някога, имаше само завършена гимназия; беше произвел голямо количество страхотен софтуер, има си собствена група за новини и е постигнал достатъчно на пазара, за да си купи собствен нощен клуб.
  • Работете по проекти с други програмисти. Бъдете най-добрият програмист по някои проекти; бъдете най-лошият програмист по други. Когато сте най-добрият, трябва да тествате способностите си да ръководите проект, да вдъхновявате другите със своята визия. Когато сте най-лошият, научавате какво правят мастърите, научавате какво не обичат да правят (понеже ви карат да го правите вие, вместо тях).
  • Работете по проекти след другите програмисти. Разбирайте програма, написана от някой друг. Вижте какво е нужно, за да я разберете и да я поправите, когато нейните автори не са под ръка. Помислете как да проектирате програмите си, за да ги направите по-лесни за онези, които ще ги поддържат след вас.
  • Научете поне половин дузина програмни езици. Включете един език, който акцентира върху абстракциите на класовете (като Java или C++), един, който акцентира на функционалната абстракция (като Lisp, ML или Haskell), един, който поддържа синтактична абстракция (като Lisp), един, който поддържа декларативни спецификации (като Prolog или C++ темплейтите) и един, който акцентира на паралелизма (като Clojure и Go). Помнете, че има „компютър“ в „компютърната наука“. Трябва да знаете колко време отнема на компютъра да изпълни дадена инструкция, да извади някаква дума от паметта (със и без пропуски в кеша), да прочете поредица от думи на диска, да стигне до ново място на диска.
  • Включете се в усилията по стандартизиране на един език. Може да е в Комитета по стандартизация на C++ (ANSI C++ committee) или пък в определянето на това дали във вашата работа стилът на писане да ползва 2 или 4 нива за индентацията с интервалите. И в двата случая, научавате какво харесват другите хора в един език, колко дълбоко е чувството им, и може би дори мъничко за това защо се чувстват така.
  • Имайте добо усещане кога да се отскубнете от усилията по стандартизиране на езика, възможно по-бързо.

Като имате предвид всичко това, много е под въпрос колко далеч бихте стигнали само с ученето от книги. Преди да се роди първото ми дете, изчетох всички книжки от типа на „Как да…“, и продължавах да се чувствам като тотален новак, който не знае какво да направи. 30 месеца по-късно, когато второто ми дете беше напът, дали се върнах да препрочета онези книжки, за опресняване на знанията? Не. Вместо това, разчитах на личния си опит, който се оказа далеч по-полезен и сигурен за мен от хилядите страници, написани от експертите.

Фред Брукс, в своето есе „Няма сребърен куршум – същност и акциденции на софтуерното инженерство“, идентифицира един план в три части за намиране на най-добрите софтуерни дизайни:

  1. Системно идентифицирайте най-добрите дизайнери, възможно по-рано.
  2. Назначете кариерен наставник, който да е отговорен за развитието на кандидата и грижливо пазете кариерния файл.
  3. Осигурете възможности за израстване на дизайнерите, за да могат да си взаимодействат и да се стимулират взаимно.

Това предполага, че някои хора вече имат качествата, които са нужни за да са добри дизайнери; работата е в това да бъдат склонени подходящо към това. Алан Пърлис го изразява по-сбито: „Всеки може да бъде научен на това да прави скулптури: Микеланджело е трябвало да се научи как да не ги прави. Така е и с големите програмисти.“ Пърлис казва, че големите имат някакво вътрешно качество, което надхвърля обучението, което са получили. Но откъде идва това качество? Вродено ли е? Или пък го развиват с усърдие? Както се изразява Агъст Густо (готвачът от Рататуи), „всеки може да готви, но само безстрашните могат да станат велики“. Мисля за това, повече като за желанието да посветиш голяма част от живота си на съзнателна практика. Но може би неустрашимостта е начинът да се обобщи това. Или, както казва Антон Его, критикът на Густо, „Не всеки може да стане голям артист, но големият артист може да се появи отвсякъде.“

Така че, давайте, купете си онази книга за Java/Ruby/JavaScript/PHP; вероятно ще ви е полезна с нещо. Но няма да можете да замените цял един живот или истинска цялостна експертност като програмист срещу 24 часа или 21 дена. Какво ще кажете, да опитате да поработите здраво, за да подобрите постепенно нещата за 24 месеца? Ето така се започва отнякъде…

Advertisements

One response to “Научете се да програмирате, за 10 години

Вашият коментар

Попълнете полетата по-долу или кликнете върху икона, за да влезете:

WordPress.com лого

You are commenting using your WordPress.com account. Log Out / Промяна )

Twitter picture

You are commenting using your Twitter account. Log Out / Промяна )

Facebook photo

You are commenting using your Facebook account. Log Out / Промяна )

Google+ photo

You are commenting using your Google+ account. Log Out / Промяна )

Connecting to %s