Перевод статьи Ника Шоупа «What it means to be a self taught developer».

Большинство разработчиков занимаются самообучением
Но те из них, у кого нет системного образования в сфере информатики, столкнутся с определенным «набором» сложностей. И не важно, занимается человек фрилансом, работает в команде или просто подрабатывает созданием сайтов.
Я не считаю, что один способ вхождения в сферу разработки лучше другого. Оба бэкграунда – самообучение и традиционное образование – имеют свои плюсы и минусы. Разработчики из обеих категорий являются ценной частью любой команды.
Но важно понимать: сложности, с которым будет сталкиваться человек без системного образования в сфере информатики, отличаются от сложностей, возникающих у выпускника вуза.
Чтобы получить сертификат по географическим информационным системам, я прошел два 10-недельных курса, имеющих отношение к разработке. Так что можно считать, что у меня нет того образовательного уровня, который дает обучение на факультете информатики.
Программирование в команде
Работа в команде с другими разработчиками (которые опережали меня на годы опыта), с применением подхода agile scrum, была для меня чем-то совершенно новым.
Ревью кода у нас не было обязательным, но меня, конечно, критиковали. Порой приходилось нелегко, когда коллеги разбирали мой код и указывали на ошибки. Но это меня мотивировало. Я думаю, это должно мотивировать каждого самоучку, который попадает в крупную компанию, занимающуюся разработкой.
На этом этапе меня еще можно было считать начинающим программистом, так что я рассматривал критику как возможность для совершенствования. Собственно, это был один из этапов моей карьеры, когда у меня наблюдался самый большой прогресс. Разборы моего кода побуждали меня объяснять причину, по которой я подошел к решению проблемы именно таким способом, а также быть открытым для идеи, что есть способы и получше.
Другим важным аспектом работы в команде был процесс планирования, сопутствующий проектам по разработке. Мы работали с использованием методологии agile/scrum, так что процесс включал создание истории и определение свойств и задач.
Архитектурное проектирование и использование белой доски для обсуждений, представления идей и пояснений, как что-то должно быть реализовано, отличалось от моего предыдущего опыта работы над проектами. Раньше я разбирался с различными проблемами самостоятельно и мне удавалось находить решения (главным образом, относящиеся к моей специальности — географическим информационным системам). Но мне не приходилось помогать разрабатывать решение, работая в команде.
Поскольку решения – именно то, что должно предоставлять программирование, в команде мне пришлось высказывать собственные идеи, даже если они были ошибочными. Иногда, впрочем, они и правильными бывали.
Нахождение решений, когда нет точного ответа
Именно это отличает хороших специалистов-разработчиков от обычных. Одно дело уметь найти решение на Stack Exchange и вставить его в свой код, изменив несколько строк. И совершенно другое – находить и реализовывать решение, которое еще не реализовано никем.
По реальным проблемам, которые мы решаем, нет готовых примеров и руководств. Нужно держать сознание «открытым» и обращаться к окружающим.
Признаю, что мне случалось зря терять время в поисках ответа в разнообразных источниках, чтобы не обращаться к членам моей команды. Я не хотел показаться им несведущим. Но на самом деле всегда стоит просить помощи у товарищей по команде. Даже если у них не будет точного ответа, они могут выслушать, а также поделиться своим опытом и знанием приложения, над которым вы работаете.
Синдром самозванца
Это засада. Лично я не написал ни строчки кода до своего 33-летия. И вот уже четыре года это моя основная работа. Я прошел всего два 10-недельных курса, так что попытка найти место в сфере разработки была сродни попытке прыгнуть выше головы. Я понятия не имел, куда попаду.
Помню, как пошел на ярмарку вакансий и поговорил там с кем-то из рекрутинговой компании, занимавшейся подбором людей для работы в IT-сфере. Я быстро понял, что мне не хватает многих необходимых навыков. Было страшно, когда я протянул тому человеку свое резюме, а он начал задавать вопросы, на которые я и понятия не имел, как отвечать. Однако он отнесся ко мне хорошо и посоветовал продолжать развиваться.
Полагаю, большинству разработчиков приходилось переживать нечто подобное несколько раз. На тот момент я занимался программированием полгода. После разговора с рекрутером я почувствовал себя уж совсем чужим в сфере разработки. Мне казалось, что даже мой сокурсник, с которым мы вместе проходили курс по Python, понимает отдельные темы гораздо лучше меня.
Как с этим справиться?
В такие моменты помогает настойчивость. Я продолжил попытки найти работу. Через некоторое время я прошел стажировку в отделе, где мог использовать свои знания географических информационных систем (моя специальность). Я смог применить на практике некоторые свои навыки работы с Python – это было классно. Также я получил опыт работы с реляционной базой данных (то, о чем не имел ни малейшего представления раньше). Спустя 6 месяцев я попал на другую стажировку, сходную с первой, но с долей веб-разработки.
Также в этот период я завершил свою сертификационную программу и в свободное от стажировки время старался как можно больше учиться и оттачивать свои новые навыки. Напоминаю, что у меня было образование, позволявшее справляться с работой, но в окружении ребят-информатиков я чувствовал себя самозванцем.
И, честно говоря, именно здесь и происходит чудо. Не всегда важно, каков у вас бэкграунд. У вас наверняка не будет такого же набора знаний и навыков, как у других людей.
Возможно, вы не понимаете, как именно работают индексируемые поля в базе данных, но если вы задаете вопросы и затем делаете все правильно, то вы справляетесь.
Может быть, вы с первого взгляда не поймете, как работает наследование классов, но если вы рассмотрите насколько примеров, поищете информацию и попробуете применить знания на практике, то вам все станет ясно.
Работая в команде, задавайте вопросы. Любой хороший разработчик уделит время, чтобы помочь кому-нибудь понять тему, в которой лучше разбирается. И не важно, является он членом команды или нет.
Понимание основ информатики
Это именно та сфера знаний, которой нужно уделить внимание помимо приобретения навыков программирования. Оно того стоит. Изучите основные структуры данных и часто применяемые алгоритмы. Вы увидите, что они так или иначе реализуются практически во всех языках. Во многих языках есть встроенные реализации вроде связанных списков и хэш-таблиц, но вы должны понимать, зачем они нужны и почему массив не всегда оптимален, а также – почему иногда это неважно.
«Грокаем алгоритмы» – отличная книга, с которой стоит начать. Автор проделал прекрасную работу, поясняя концепции, которые могут быть довольно абстрактными и трудными для понимания.
Проект Эйлер – хорошая площадка для того чтобы научиться решать проблемы и понимать, чем одни реализации лучше других. Также там можно узнать, в чем важность О-нотации и на что обращать внимание при написании кода.
Я довольно долго избегал этих тем. Но они все время «всплывали». Например, во время собеседования в одной компании были какие-то базовые вопросы по распределению памяти. Ответов я не знал. Я, собственно, об этом и не думал раньше. И это нормально. Зато теперь я знаю, как работает сборка мусора. Я просто воспринял это как возможность для роста и более глубокого понимания вещей.
Не сдавайтесь
Серьезно. Это касается любого разработчика, но я думаю, что стоит это сказать тем, у кого нет специального образования. Просто не сдавайтесь.
Присоединитесь к митап-группе в своем районе. Делитесь своими знаниями и вы удивитесь, узнав, что очень многое зависит от вашего отношения. Точно как и во многих других жизненных ситуациях.
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]
Хрень это все берешь и копируешь со стекпереполнентчкком бабло рубишь спинеры крутишь овец считешь знать ничего не нада.