Олег Макаренко (olegmakarenko.ru) wrote,
Олег Макаренко
olegmakarenko.ru

Categories:

История начинающего программиста



Меня регулярно спрашивают, как стать программистом. Ответить на этот вопрос мне одновременно и просто и сложно. Просто – так как я сам работал программистом и до сих пор изредка пишу какой-то код лично, и так как я постоянно с программистами работаю. Сложно – так как первые свои программы я писал ещё при Горбачёве, и все сложности тех лет успели уже выветриться как следует из моей памяти.

Сейчас однако мне прислал письмо начинающий программист, который впервые начал осваивать искусство выдачи ценных указаний твердолобым компьютерам. В письме изложена история его успеха – автор письма в довольно короткий срок переквалифицировался из аниматоров в программисты, и зарабатывает сейчас деньги написанием достаточно продвинутых программ.

Отмечу также важный момент – как вы увидите из письма, автор весьма неплохо владеет русским языком, а также рассказывает о своих навыках в понимании английской речи. Мой опыт показывает, что владение языками хоть и не обязательно для программиста, но всё же оно сильно помогает в работе: разница между человеческими и компьютерными языками не так велика, как кажется на первый взгляд.

Собственно, вот письмо:

Бэкграунд

Многие начинающие разработчики интересуются историями успеха более опытных коллег. Мой путь может быть интересен хотя бы потому, что я начинала как аниматор и не связывала будущее с программированием. Таким образом, я начинала с нуля.

Я получила обычное гуманитарное образование и ни дня не работала по профессии. В школе я получала ачивки районного масштаба, связанные, в основном, с гуманитарными дисциплинами. Кажется, я заняла какое-то место на районной олимпиаде по математике, когда мне светило 3 в четверти по геометрии.

Я любила решать задачи, но я делала это нерегулярно и неправильно. Как и многие школьники с увесистой самооценкой, я предпочитала выбирать самые сложные задачи, пренебрегая простыми. Естественно, я делала это, хоть и креативно, но медленно и плохо: как бы ни возмущались противники ЕГЭ, сложные логические построения — это, в первую очередь, комбинация более простых действий. Если вы плохо дружите с простыми задачами из части «B» ЕГЭ и допускаете «случайные» ошибки в вычислениях, от вас будет мало толку в сложных вещах.

Апофеозом моей самонадеянности была попытка, закрыв учебник, вывести и доказать все формулы по кинетике и молекулярной физике самостоятельно. Дабы не сомневаться в своём таланте, учебник физики я на время выведения формул забросила под диван. Как вы можете догадаться, в итоге с предметом отношения не сложились.

Анализ набитых в школе шишек предостерёг меня от тех же ошибок в программировании. Программист, который не боится читать чужой код, задавать простые вопросы и признавать свои ошибки, учится гораздо быстрее и работает лучше.

Надо отметить, что некоторые школьные знания пригождаются мне и сейчас. Например, курс геометрии помогает, когда нужно написать скрипт для Gimp, построить диаграмму на canvas или сделать какой-нибудь хитрый эффект на JavaScript. Если вы плохо помните школьные матаны, можете пролистать выжимку для поступающих (то, на что мы в школе тратили несколько лет, во взрослом возрасте, в принципе, можно освоить за выходные). И, главное, не стесняйтесь пользоваться Гуглом.

В вузе я отошла от математики совсем (не считая одной безуспешной попытки разработать альтернативную геометрию, в которой не нужно измерять площади в квадратах). Я начала неплохо зарабатывать на разного рода аниматорских халтурах, и всерьёз грезила стать актрисой, звездой сериала.

Счастье продолжалось ещё два года после выпуска. Потом я растолстела и утратила иллюзии. До конца жизни работать аниматором, копирайтером или секретарём мне не хотелось, а новые горизонты не спешили распахивать свои сияющие объятья.

Тогда я решила освоить новую профессию и засела за курсы по программированию. Как показала практика, это был отличный выбор.

Первые шаги

Мне посоветовали начать обучение программированию с SICP. Эта книга с 1979 года взрывает мозг подрастающей элите программистов, изначально — студентам Массачусетского университета. Она учит элиту древнему языку эльфов — LISP и особенно тяжёлым матанам. Я установила себе интерпретатор одного из диалектов LISP и ринулась в бой. SICP я осваивала так же медленно, как и открывала физику. Я задалась целью пройти все упражнения и, к счастью, у меня хватало терпения решать даже сложные задачи. Поэтому, когда я через несколько месяцев доползла почти до конца первой главы и, наконец, поняла, что я так много не напрограммирую, я не приуныла, а просто переключилась на другие задачи.

Кстати, несмотря на то, что в процессе поиска работы я нашла только одну вакансию, где бы вскользь упоминался LISP, SICP помог мне очень во многом. Во-первых, диалекты LISP время от времени вторгаются в мою жизнь. Например, как я уже писала, мне иногда нужно писать скрипты для графического редактора Gimp. Во-вторых, я всё же программировала, решала сложные задачи, а не выполняла стандартные действия.

Как я уже писала, для программиста важно не изобретать велосипедов, а уметь оперативно использовать чужие спортивные велосипеды по назначению. Но умение думать о том, как будет работать программа, ему также важно. Сначала кажется, что это не так актуально, ибо компьютеры мощные и выдержат многое. А потом у вас базы данных, и высокая нагрузка, и это всё нужно перетряхивать каким-нибудь хитрым образом.

По большому счёту, работа любого скрипта зависит от того, насколько стройно рассуждал его автор. В этом плане SICP — отличная тренировка, которая поможет выйти на новый уровень. Но всё же я не уверена, что для начинающего программиста это лучший старт. По крайней мере, не стоит пытаться пройти его обязательно до конца, не занимаясь параллельно ничем другим, если у вас, конечно, нет пары лет в запасе на обучение.

После нескольких месяцев штудий я начала, наконец, задаваться разумным вопросом: «А за что мне будут платить деньги?» Я пробежалась по сайтам по поиску работы и убедилась, что платят больше всего программистам на Java, но их редко берут без опыта. Зато неопытный web-программист может найти работу.

Поэтому я прочитала на Лурке статьи о том, что такое PHP, что такое JavaScript, и с чего мне лучше начать.* Кто-то в обсуждении статьи на Луркмор рекомендовал начинать с JavaScript, что я и сделала.

Синтаксис я изучала по курсам от Codecademy. Когда я проходила первые курсы, они были полностью бесплатны, потом разработчики добавили какие-то новые платные упражнения, но я ни разу к ним не обращалась. Курсы на английском, но написаны очень простым языком. В целом, это неплохая штука: благодаря Codecademy можно быстро и легко освоиться в синтаксисе нужных вам языков программирования и, что гораздо важнее, начать писать свои скрипты. Так как я нацелилась в web-разработчики, я начала с курса HTML и CSS (без них никуда).**

Пройдя курс, я немедленно купила себе доменное имя, нашла хостинг и развернула на нём сайт, на котором, вручную вводя текст вперемежку с HTML-тегами, начала излагать ценные советы от гуру.

Потом были курсы PHP, JavaScript, ещё что-то вроде курса «Сделайте свой первый сайт», и так далее. Надо отметить, больше всего толку принёс именно курс «Сделайте свой первый сайт», хотя он требовал знания jQuery,*** с которым я была тогда не знакома, и большую часть курса я проходила злобно матерясь, иногда наугад. Дело в том, что несколько команд на jQuery, которые я всё же постигла из курса, сразу пригодились мне для создания небольшой галереи.

После этого переломного момента я начала делать свои скрипты, и они даже работали. Примерно тогда стало понятно, насколько большую роль в обучении играет практика. Собственно, моё знакомство с JavaScript началось именно тогда, когда я начала писать первые скрипты и придумывать сложные эффекты.

Окрылённая этим опытом, я перенесла себе на ноутбук веб-сервер Apache (кстати, установите себе Linux, для программиста — лучшее решение, огромные плюсы и в обучении, и в работе, и, собственно, работодатели требуют). Теперь я могла писать скрипты на JavaScript или PHP прямо у себя на компьютере.

Тогда же я начала искать книги по синтаксису PHP. Я ориентировалась на самые свежие. Мне приглянулись записки программиста на русском, где парень примерно моего возраста систематизировал свой опыт. Изложение было разбито на логичные разделы (строки, массивы, работа с файлами, почтой, базами данных и т. д.), книга почти полностью состояла из кода с краткими комментариями, объяснявшими, что это за код.

Собственно, это было то, что нужно. Я повторяла каждый пример, видоизменяя его, писала новые варианты решения, даже маленькие скрипты. Больше всего мне понравилось писать себе на почту прямо с ноутбука. Это было для меня чем-то вроде чуда. Правда, книга сильно нуждалась в редакторе, кроме того, к примеру, для работы с базами данных там использовалось устаревшее расширение PHP.

Параллельно я активно просматривала сайты по поиску работы — в основном, чтобы узнать, какие навыки требуются от программиста, и спросить у Гугла, что это за странные слова. Чаще всего требовались Git, Bitrix, понимание работы архитектурного шаблона MVC, ООП, умение обращаться с Linux. В эту сторону я и начала копать.

Вскоре я начала ходить по собеседованиям. Если у вас устойчивые нервы, обязательно ходите. Если вы хикковаты, – лучше всё равно ходить, но беречь себя. Хорошо, когда на собеседованиях дают тесты или задают вопросы по синтаксису. Это позволяет увидеть свои пробелы в знаниях, и, придя домой, их устранить. Самое лучшее, что может быть, – это ТЗ. Как правило, в мелких конторах, которые берут программистов с маленьким опытом и не из элитных вузов, в качестве ТЗ дают настоящие задачи, которые этой конторе приходилось решать. То есть, выполнение тестовых заданий позволяет вам чуть-чуть поработать программистом.

Обязательно выполняйте ТЗ до конца и высылайте, даже если вы сорвали все сроки или работодатель уже нашёл кого-то ещё. Это одна из основных вещей, которые помогут освоиться в профессии и найти работу.

Собственно, где-то с шестого собеседования и второго ТЗ, я её и нашла. И да, программист – это важная и высокооплачиваемая профессия. Но не стоит рассчитывать на то, что руководители, которые нанимают неопытных программистов на небольшую зарплату, как-то особенно доброжелательны. Если бы у них было всё хорошо, они бы могли позволить себе более опытного специалиста. Это относится и к собеседованиям: собеседования очень важны, но не следует воспринимать их слишком всерьёз.

На моём первом месте работы я была единственным программистом. Кроме меня был ещё верстальщик, он же менеджер, и человек 25 сеошников. Все вместе мы занимались «разработкой и продвижением сайтов» на одной редкой CMS.

Техподдержка и документация по CMS были не на самом высоком уровне, поэтому моя работа, по больше части, напоминала работу хакера, который методами реверс-инжениринга выясняет секреты устройства сайта. Таким образом, некоторые очень простые задачи могли занимать по нескольку дней напряжённой работы. Помнится, я постоянно перебирала какие-то огромные массивы, чтобы вычислить ту самую переменную, которая поможет мне изменить формулу расчёта цены или вывести данные о товаре в другой колонке.

О программистах, которые работают на CMS, иногда отзываются недобро, однако после четырёх месяцев такой работы разработка движка сайтов с нуля показалась мне задачей простой и приятной.

Из компании я уволилась из-за открытых в декабре настежь окон (руководитель был морж). После этого я сделала несколько небольших собственных проектов, кое-что даже приносило мне прибыль, и устроилась уже на хорошую работу с высокой зарплатой.

Основные принципы

Пожалуй, стоит сформулировать основные принципы, которые, на мой взгляд, могут помочь начинающему программисту в учёбе и работе.

1. Ко всему подходить с практической точки зрения

Тут мне здорово помог SICP, в котором чётко давалось понять, что программы пишутся языком команд, а не описаний и определений.

В частности, это помогло мне подружиться с объектно-ориентированным программированием (ООП) и другими радостями начинающего программиста. ООП изначально было попыткой сымитировать объекты реального мира, но, вероятно, всё же к счастью для всех нас, эта попытка в полной мере не удалась.

Поэтому, если вы начнёте читать определения ООП и его принципов на разного рода познавательных сайтах, у вас волосы на голове встанут дыбом. Если же вы сосредоточите внимание на том, для чего используются объекты и классы в реальном коде, всё со временем станет проще.

Поэтому не стоит начинать с чистой теории. Нужно всегда самостоятельно делать все упражнения в курсах, выбирать те материалы, где есть понятные вам практические примеры, и сразу с ними экспериментировать.

2. Маленькими шажками строим домики из грязи

Нужно постоянно писать код и разбираться в том, как его лучше написать. Именно в процессе работы можно до конца понять нужную для программиста концепцию или, например, правила хорошего кода, освоить синтаксис языка на уверенном уровне и вообще стать программистом.

Если вы осваиваете какой-то язык, нужно позаботиться о том, чтобы обеспечить себе среду, позволяющую писать скрипты на этом языке (например, завести сайт или установить веб-сервер себе на компьютер, если вы начинающий веб-программист), и сразу пробовать что-нибудь кодить.

Сложные задачи нужно разбивать на мелкие, если с мелкими что-то не срастается, – на ещё более мелкие, и так далее. На первом этапе становится радостно от того, что на экране вообще что-то движется в результате какого-нибудь шаманства с JavaScript. Добившись этого, можно поставить себе задачу хоть немного контролировать траекторию движения, и так далее.

Конечно, с глобальных проектов начинать нельзя – есть риск вообще забросить программирование. Если горите чем-то масштабным, лучше пробовать делать из него по маленькому кусочку, так, чтобы скоро можно было увидеть результат и перейти к следующему шагу.

И, конечно, нельзя забрасывать курсы, но писать самостоятельно код, искать решения возникающих задач, – важнее.

3. Нужно всегда пользоваться поисковиками

Программисты львиную часть своих знаний получают не из курсов или книг (хотя они их постоянно читают и проходят), а из поиска.

Это происходит потому, что языки программирования, браузеры, программы постоянно меняются. Информация, которую вы узнали пять лет назад, может стать полностью не актуальна.

Кроме того, как я уже писала, программы написаны языком команд. Когда в книге вы читаете какое-нибудь определение, вы понимаете определение. Когда вы находите в поисковике ответ на вопрос: «Как сделать XX так, чтобы YY», вы, вполне возможно, хлопнете себя по лбу и воскликнете: «Ах вот как оно должно работать!» – даже если по этому XX вы пять минут назад были готовы докторскую диссертацию писать.

4. Не стоит расплываться, но и сплываться тоже не стоит

Как-то я читала на Хабре печальную историю под названием «Как я стал плохим программистом» от опытного, но вероятно, не очень успешного программиста. Там были упомянуты Джава, Делфи, курсы дизайна и рисования, работа то сисадмином, то разработчиком сайтов и жалобы на то, что очень тяжело разобраться во всём этом сразу.

С другой стороны, есть много программистов, которые застревают в одном языке программирования и, как следствие, часто на не самых высокооплачиваемых должностях. Возможно, это связано с тем, что люди, достигшие определённого уровня профессионализма в одном языке, боятся допускать глупые ошибки в другом.

Мне кажется, что лучше определить для себя, чем вы занимаетесь в ближайшие несколько лет, но не бояться решать прикладные задачи на других языках программирования или изучать что-нибудь новое в свободное от основного занятия время. При этом, если новый язык программирования может вполне пригодиться на новом этапе карьеры, то в дебри матанов или тонкости вёб-дизайна слишком глубоко погружаться не стоит, разве что это Ваше хобби. Всё-таки для того, чтобы освоить профессию на достаточно высоком уровне, требуются годы, и неразумно слишком сильно отвлекаться на что-нибудь другое.

Это обидно, но если вы выбираете конкретную профессию, значит достигать значимого для общества успеха получится, в основном, только в ней, и «также в области балета» вы впереди планеты всей не будете.

Ещё печальней всё получается, правда, если профессию не выбирать.

5. Не стоит бояться делать плохо

Сознательно косячить нельзя. И всегда нужно стараться делать лучше — без этого не стать хорошим программистом.

Но всё же программирование — это логика и команды. «Я делаю плохо» → «Я понимаю, что это плохо (или мне об этом говорят, иногда невежливо)» → «Я узнаю, как сделать лучше и делаю лучше» – вот вполне работающий алгоритм. Это путь отличного программиста от детских ошибок к более сложным, и от зарплаты в 20 тысяч к зарплате в 200.

Если вы попытаетесь каждый раз проходить этот путь, минуя первые итерации, вы сломаетесь.

6. И ещё, стоит поставить себе какой-нибудь человеческий дистрибутив Linux и понемногу привыкать пользоваться терминалом

Примечания:

* PHP — это самый популярный язык программирования, из тех, на которых пишутся сайты, он работает на сервере, и каждый раз, чтобы обратиться к нему, вам нужно послать на сервер запрос; JavaScript запускает скрипты прямо у вас в браузере, именно благодаря ему (и некоторым специальным технологиям) вы можете закрыть всплывающее окно или отправить форму, не перезагружая web-страницу.

** HTML — это язык разметки, программ на нём не напишешь, но именно на нём в подавляющем большинстве случаев программист или верстальщик указывает браузеру, как разместить элементы на странице сайта и что это за элементы. Вы можете нажать Cntrl + U, находясь на сайте, и вы увидите, скорее всего, HTML-разметку; кстати, HTML-тэги в ЖЖ именно так и работают. CSS определяет стили HTML-элементов, например, высоту или цвет.

Документацию и курсы по перечисленным языкам программирования и разметки можно найти вот здесь:

PHP:
http://php.net/manual/ru/

JavaScript:
https://learn.javascript.ru/

HTML:
https://webref.ru/
– и ещё в десятке мест, информации очень много.

*** jQuery — это библиотека (набор готовых скриптов, которые загружаются отдельно) для JavaScript.


Как показывает опыт, тут мне ещё раз стоит напомнить, что текст не мой: я просто опубликовал присланное мне моей читательницей письмо. Вместе с тем, если вы какие-нибудь вопросы по обучению начинающих программистов лично мне, я также попробую на них ответить.

Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 510 comments
Previous
← Ctrl ← Alt
Next
Ctrl → Alt →
Previous
← Ctrl ← Alt
Next
Ctrl → Alt →