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

Программирование — это очень обширная область человеческой деятельности. Можно программировать клиентскую часть для web (js), или backend for web (тут можно выбрать из большого зоопарка языков и их инфраструктур), или заниматься низкоуровневым программированием на C или даже ASM (драйвера, операционные системы, встроенные системы), или писать игры (обычно C++ и видеокарты), или мобильные приложения (Swift/Java), или многочисленные нишевые области, вроде банковской, в общем, список можно продолжать очень долго. Важно понять, что каждая область, во–первых, предусматривает свою обособленную «инфраструктуру» (языки, фреймворки, инструменты, даже подходы), во–вторых, требует определенных уникальных навыков. Поэтому первым делом начинающему программисту необходимо выбрать ту сферу, которая ему будет ближе всего, и, при этом, не будет требовать слишком тяжелых для изучения навыков.

Навскидку я вижу три области, имеющие невысокий порог вхождения, при этом довольно востребованные, это клиентская часть веб–приложений (html+css+js+js frameworks), backend веб–приложений (PHP, Java, NodeJS, Ruby, Python, whatever) и мобильная разработка (Android with Java or IOS with ObjectiveC/Swift).

Client–side требует скрупулезности, обычно нужно делать pixel–perfect верстку, более того, косяки на клиент–сайде обычно в первую очередь заметны пользователю. Кроме того, до сих пор существует зоопарк браузеров, каждый со своими особенностями, и тестировать придется в них всех. Сложность программирования тут очень сильно зависит от проекта, но, в среднем, чего–то экстраординарного не требуется. Да, автоматизация тестирования клиент–сайта «is a bit tricky».

Back–end очень сильно зависит от проекта. Обычно для простых веб–проектов используют PHP, так как он прост, имеет низкий порог вхождения и дешев. Для сложных высоконагруженных распределенных систем часто используют Java (из–за сложившейся enterprise инфраструктуры вокруг нее). Для программирования back–end’а, помимо основного языка, обычно нужно, как минимум, уметь работать с базами данных, знать какой–то минимум в Computer Science, чтобы не делать глупых ошибок. Более сложные системы требуют больше специфических знаний и «ломают» мозг. Например, если на client–side JS работает всегда в один поток, то, для распределенного back–end, нужно думать не только о производительности кода на одном сервере, но и об отказоустойчивости, целостности данных, синхронизации между нодами кластера и т.д.

Разработка под мобильные платформы — это что–то среднее между client и server side. Нужно много внимания уделять «визуальной части», но также придется писать и бизнес–логику и работу с БД. Отличительной чертой в мобильной разработке является небольшой размер команд, маленькие итерации разработки, часто — отсутствие автоматизированного тестирования.

Если основным требованием является возможность работать удаленно, то это существенно сужает возможности.

Если для того, чтобы получить первую работу программистом в офисе, нужно потратить несколько месяцев, то для получения адекватной удаленной работы нужны годы.
Можно пойти по пути фриланса, но, помимо очевидного преимущества, такой подход имеет достаточно много недостатков. Это только на первый взгляд фрилансер работает, когда хочет. Если фрилансер не обладает железной волей и умением time–management’а, то он работает 24/7. Ненормированный рабочий график, необходимость напрямую работать с неадекватными заказчиками, демпинг со стороны коллег — это только часть того, с чем сталкивается фрилансер. Более того, чтобы получить необходимый опыт и репутацию, фрилансер должен потратить много времени (явно больше года).

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

То есть, на мой взгляд, единственный вариант — быть готовым сначала поработать хотя бы год в обычной компании в офисе.

Самый популярный русскоязычный ресурс для программистов — habrahabr.ru. Там можно найти много материалов, которые помогут определиться с выбором сферы деятельности (обязательно читать не только статьи, но и комментарии, как на лепре).

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

Начать, пожалуй, стоит с чтения книжки. Лучшая книжка для новичков в Java (и программировании) — Thinking in Java by Bruce Eckel. Человек, прочитавший (и полностью понявший) эту книжку, обладает достаточными навыками Java, чтобы претендовать на должность Jr Java dev. Но, помимо теоретических знаний языка, есть еще множество вещей, необходимых для прохождения собеседования.

Параллельно с чтение книжки нужно создать аккаунт на github.com и присоединиться к одному/двум проектам. Помимо тренировки очень важного умения читать чужой код и умения локально разворачивать/собирать чужие проекты, github позволит получить навыки непосредственно кодинга. В больших проектах всегда хватает несложных задач, справиться с которыми по силам даже новичкам. Не нужно стесняться делать pull requests, вы ничего не сможете сломать, зато получите бесценный опыт, бесплатный code review, и, что немаловажно, строчку в будущем резюме.

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

Если нет специализированного образования, то нужно постараться хоть частично восполнить его. Один из самых важных предметов, которые изучают программисты — дискретная математика. Более того, это очень практичная дисциплина и различные элементы оттуда любят спрашивать на собеседованиях. Почитать можно, например, Дискретная математика для программистов (Новиков Ф.А.). Если я не путаю, там две книги.

Параллельно нужно записаться на курс Algorithms Part I на Cousera. Это очень хороший курс, он дает базовые знания по основным алгоритмам и структурам данных. Я не знаю, где можно найти эти знания в более доступном, практичном и интересном виде. Курс периодический, сейчас как раз завершается очередная сессия, еще можно успеть записаться и скачать лекции, потом придется ждать следующей сессии.

Теперь, по остаточному принципу, нужно восполнять пробелы в остальных знаниях. Поскольку большинство современных проектов так или иначе связаны с web–ом, нужно изучить networking, стек протоколов, детально разобраться в HTTP. Также обязательно нужно изучить ANSI SQL, почитать (хотя бы вкратце) теорию баз данных, нормальные формы, вот это все, попробовать поставить локально базу данных (например, MySQL) написать приложение, которое работает с ней.

Дальше идет уже более конкретная подготовка к собеседованию. Нужно открыть http://linkedin.com/ и найти резюме людей, претендующих на должность Java developer. Потом сопоставить несколько таких резюме и выписать технологии, которые есть у всех. И идти по этому списку, изучая каждую. Изучая — это выделить определенное время, почитать, посмотреть примеры, попробовать написать свой код с использованием.

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

Обычно на собеседовании гоняют по следующим темам:
* Вопросы по предыдущему опыту
* Вопросы по языку программирования
* Вопросы по фреймворкам/технологиям
* Design patterns
* Логические задачки
* Небольшие задачки с написанием кода

В качестве предыдущего опыта можно рассказать об участии в проектах на github.

Нужно ознакомиться с Design patterns (паттерны проектирования). Если нет времени — то просто в интернете, необходимо запомнить самые популярные. Если есть время/желание, то прочитать Design patterns explained (Alan Shalloway).

Логические задачки — это свой отдельный мир, который ценится участниками олимпиад, просто фанатами, и теми, кто проводит собеседования. Научиться их решать — дело непростое. Все, что я могу посоветовать, прочитать книжку «Как сдвинуть гору Фудзи».

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

Вот, в общем–то, и все. Напоследок повторю очевидную истину, собеседования — очень несовершенный способ проверять знания людей. На собеседовании, по большей части, проверяют умение проходить собеседование. Это умение, как и любое другое, оттачивается практикой. Поэтому правильная стратегия устройства на работу — посещение как можно большего количества собеседований. Соответственно, желательно наиболее понравившиеся компании оставить «на потом».

5 Responses to Как стать программистом

  1. prog:

    расскажи мне, настоящие программисты действительно рассуждают «а применю–ка я сейчас такой–то паттерн»? Просто по–моему большинство действует по наитию, типа «просуну–ка я вот это вот в это». Я просто никогда не знал всех этих названий и не понимаю, почему это плохо.

  2. Путен:

    А я внезапно понял, что с моими навыками в самый раз пора врубаться в R и остальной анализ данных, одновременно с этим изучая Ruby. Как раз специализация по data science на coursera подоспела. Из плюсов: теоретическая возможность удалённой работы, востребованность в любой стране мира, возможность делать свои проекты для души. Плюс, эти знания при желании можно конвертировать в 7к$+ в месяц.

  3. Аноним:

    Возьму себе структуру действий на заметку. Вернее, можно сказать, что уже взял.

  4. Аноним:

    Работал телемастером, потом ремонтировал лифты. Потом проучился 6 лет в университете и стал программистом (учимся_программировать_на_С++_за_21_день.jpg). Через полтора года стал работать полностью дистанционно. Проработал так 6 лет.
    Так вот, короче, чтобы работать дистанционным «программистом», навыков и мозгов особо не нужно. Но нужно понимать, что, например, на одеске, ты будешь конкурировать с миллионом индусов, способных работать за копейки. Знания программирования у вас будут примерно одинаковыми. Но они смогут вешать работодателю любую лапшу на прекрасном (хоть и с акцентом) английском.
    Поэтому совет — выбери себе какую–нибудь относительно простую нишу (вёрстка, шаблоны для вордпресса, хитровыебанный язык или фреймворк, за который никто не хочет браться) и постарайся прокачаться в ней до максимума. Тогда может что–то и получится. Ну и английский подтяни.

  5. Donskoy:

    Програмером быть охуенно, никого не слушай. Это и инженерное дело и хакерская романтика и эндорфины от успешной компиляции приложения.

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

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

Добавить комментарий