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


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

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

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

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

Бэкграунд
Многие начинающие разработчики интересуются историями успеха более опытных коллег. Мой путь может быть интересен хотя бы потому, что я начинала как аниматор, и не связывала будущее с программированием. Таким образом, я начинала с нуля.
Я получила обычное гуманитарное образование и ни дня не работала по профессии. В школе я получала ачивки районного масштаба, связанные, в основном, с гуманитарными дисциплинами. Кажется, я заняла какое-то место на районной олимпиаде по математике, когда мне светило 3 в четверти по геометрии.
Я любила решать задачи, но я делала это нерегулярно и неправильно. Как и многие школьники с увесистой самооценкой, я предпочитала выбирать самые сложные задачи, пренебрегая простыми. Естественно, я делала это, хоть и креативно, но медленно и плохо: как бы ни возмущались противники ЕГЭ, сложные логические построения — это, в первую очередь, комбинация более простых действий. Если вы плохо дружите с простыми задачами из части «B» ЕГЭ и допускаете «случайные» ошибки в вычислениях, от вас будет мало толку в сложных вещах.
Апофеозом моей самонадеянности была попытка, закрыв учебник, вывести и доказать все формулы по кинетике и молекулярной физике самостоятельно. Дабы не сомневаться в своём таланте, учебник физики я на время выведения формул забросила под диван. Как вы можете догадаться, в итоге с предметом отношения не сложились.
Анализ набитых в школе шишек предостерёг меня от тех же ошибок в программировании. Программист, который не боится читать чужой код, задавать простые вопросы и признавать свои ошибки, учится гораздо быстрее и работает лучше.
Надо отметить, что некоторые школьные знания пригождаются мне и сейчас. Например, курс геометрии помогает, когда нужно написать скрипт для Gimp, построить диаграмму на canvas или сделать какой-нибудь хитрый эффект на JavaScript. Если вы плохо помните школьные матаны, можете пролистать выжимку для поступающих (то, на что мы в школе тратили несколько лет, во взрослом возрасте, в принципе, можно освоить за выходные). И, главное, не стесняйтесь пользоваться Гуглом.
В вузе я отошла от математики совсем (не считая одной безуспешной попытки разработать альтернативную геометрию, в которой не нужно измерять площади в квадратах). Я начала неплохо зарабатывать на разного рода аниматорских халтурах, и всерьёз грезила стать актрисой, звездой сериала.
Счастье продолжалось ещё два года после выпуска. Потом я растолстела и утратила иллюзии. До конца жизни работать аниматором, копирайтером или секретарём мне не хотелось, а новые горизонты не спешили распахивать свои сияющие объятья.
Тогда я решила освоить новую профессию и засела за курсы по программированию. Как показала практика, это был отличный выбор.
Первые шаги
Мне посоветовали начать обучение программированию с SICP. Эта книга с 1979 года взрывает мозг подрастающей элите программистов, изначально — студентам Массачусетского университета. Она учит элиту древнему языку эльфов — Common 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.

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

http://fritzmorgen.livejournal.com/874274.html


Гриборыб и 4 пользователям это нравится

Чтобы упомянуть другого пользователя в комментарии, введите знак @

Упомянуть можно тех, на кого Вы подписаны или тех, кто принимал участие в дискуссии


Чтобы упомянуть ценную бумагу в комментарии, введите ее тикер после знака ^

Последние комментарии в блогах

Silver Surfer

Уже 10 лет наши управляющие успешно ведут портфель трендовой стратении SilverSurfer по российскому рынку акций.

Правила поведения в блогах и ограничение ответственности

Цель социальной сети TRADERNET – общение и дискуссии на тему финансовых рынков и экономики в широком ее спектре. Участие в общении может принимать любой желающий, придерживающийся настоящих правил.

ПРАВИЛА ИСПОЛЬЗОВАНИЯ САЙТА TRADERNET

1. Регистрация

1.1 Факт вашей регистрации означает, что вы согласны соблюдать настоящие правила.

1.2 Ник (имя профиля) выбирается индивидуально самим пользователем, старайтесь избегать ников, совпадающих с уже ранее существующими.

1.3 Аватара - это небольшое изображение, показываемое в ваших сообщениях и блогах. Выбирается пользователем самостоятельно. Аватарку можно менять в зависимости от желания и настроения, но при его частой смене есть риск «потеряться», так как собеседники к вашему виртуальному лицу привыкают.

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

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

2. Общение в блогах

2.1 Каждый пользователь имеет право вести свой блог.

2.2 Каждый пользователь имеет право оставлять комментарии к любому посту в сообществе.

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

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

3. Запрещается на ресурсе

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

3.2 Запрещено публично вести споры и перебранки, а также цитировать личную переписку с администрацией сайта и модераторами. Для разрешения спорных вопросов достаточно написать Личное сообщение модератору!

3.3 Обилие грамматических ошибок является основанием для удаления вашего поста из общей ленты.

3.4 Нарушение правил карается БАНом на 7 дней. Последующие нарушения могут вынудить администрацию продлить этот срок до бесконечности.

4. Администрация ресурса

4.1 Администрация предлагает строить отношения между самими пользователями и, пользователями и администрацией на дружественной и уважительной основе. Здоровое чувство юмора приветствуется.

4.2 Администрация готова рассмотреть любые предложения по улучшению работы ресурса. Свои идеи публикуйте в общей ленте с тегом «Инновация».

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

5. Отношения в сфере распространения информации:

5.1 Администрация сайта:

5.1.1 не осуществляет обязательную проверку размещаемых пользователями на Сайте материалов.

5.1.2 не несет ответственности за содержание материалов, за негативные последствия их использования.

5.1.3 вправе удалять любые публикации пользователей, не соответствующие политике Администрации Сайта.

5.2 Размещая материалы на настоящем сайте, пользователь сайта:

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

5.2.2 несет полную ответственность за соответствие применимому законодательству размещаемых материалов.

5.2.3 обязуется возместить любой ущерб, возникший у TRADERNET, вследствие нарушений Пользователем законодательства или прав третьих лиц.

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

5.2.5 по требованию Администрации сайта обязуется предоставить копии своих удостоверяющих личность документов.