Обучение программированию — очевидный тренд. Даже при высоких зарплатах спрос на хороший разработчиков превышает предложение. Все это, в купе с возможностью в IT работать удаленно подталкивает все больше людей научиться программировать.
Давайте разберемся какие навыки точно нужно развивать, чтобы повысить свои шансы быть успешным разработчиком. Затронем так называемые Hard и Soft скилы, зачем они нужны и что дают программисту.
Про программистов
Кроме очевидных плюсов, как то зарплата, «независимость» и т.д. есть ряд минусов, про которые надо помнить перед тем как решить идти в программирование.
- Вы 5-8+ часов в день будете общаться исключительно с компьютером. Это накладывает свой отпечаток.
- Иногда поиск и правка одного бага может занять весь день. Потраченное время может показаться несоизмеримо сделанной работе и немного удручать.
- IT стремительно развивается. Следовательно вам нужно будет учиться. Всегда.
- Большинство ресурсов, примеров и ответов на вопросы будут на английском. Это значит его надо знать.
Обучение программированию
Итак, вы окончательно решили освоить профессию программиста. Встает резонный вопрос — с чего начать. Абсолютно независимо от выбранной сферы на первых порах наставник, более опытный товарищ, да кто угодно, кого можно будет немного помучать вопросами — must have. Это сэкономит массу времени и задаст правильный вектор развития.
Языки программирования
Сам смысл «программирование» не привязан к языку. Задача разработчика — объяснить машине что он от нее хочет. Язык программирования — всего лишь инструмент как это сделать.
Тут как и у людей, на каком языке говорить зависит от того, кому вы это говорите. Вряд ли вы будете Итальянцу что-то объяснять по-русски, верно? Но идея того, что вы хотите донести — не привязана ни к русскому, ни к итальянскому.
Вы выбираете язык программирования в зависимости от того, какие перед вами стоят задачи. Если это разработка под Android — то Kotlin или Java. iOS = Swift. Обработка текстов и изображений? Скорее всего это будет Python.
Основы программирования
Чтобы понять программу, нужно мыслить как программа
Программа — набор последовательных действий. Конкретных действий. Не получиться отделаться «ну тут примерно вот так должно работать». Аналогично ваши мысли и действия — они должны быть максимально конкретными, понятными и последовательными.
Нужна определенная аккуратность, если не сказать педантичность. При обучении программированию не достаточно взять кусок кода, вставить, убедиться что он работает и радоваться. Тут необходимо понимание, что как и почему работает, зачем применен конкретный алгоритм и можно ли использовать другой тип данных.
Все, что выделяется как «основы программирования», лаконично вытекают из аккуратного и последовательного представления алгоритма. Давайте на простом примере рассмотрим как эти основы формируются.
Представим, что есть совершенно реальная задача.
«Есть таблица результатов с очередного соревнования. Надо составить отсортированную таблицу участников».
Пройдемся по «основам» и посмотрим на каждый пункт. У нас будет 2 действующих лица, (О)бычный человек и (П)рограммист.
Типы данных. Переменные.
О: «Ну да, есть результаты, погнали…»
П: «Постойте, а что имеется в виду под результатами? Это целое число или дробное? А может быть на входе у нас список оценок по разным этапам соревнования?»
Отсюда и вытекает понятие разных типов данных. Это могут быть целые числа — Integer. Дробные с точкой — Float или Double.
Каждый тип данных имеет свои границы и может занимать разный размер в памяти.
Оператор цикла
О: «Ну мы просто возьмем и все расположим по возрастанию»
П: «Для начала нужно перебрать всех участников один за одним…»
Такой перебор — и есть цикл. Существуют разные вариации, с разными граничными условиями и обходящие структуру данных по разному. Их все объединяет то, что смысл цикла — просто повторять действия пока нам это нужно.
Условный оператор
О: «Ну еще в прошлом абзаце было все понятно — мы возьмем и расположим всё по возрастанию»
П: «… на каждом витке цикла мы будем сравнивать 2 результата. Если результат одного участника лучше чем следующего за ним, то поменяем их местами.»
Условные оператора могут быть простыми
if (var) exp1 else exp2
Или делающие выбор из множества вариантов
switch(var) { case o1:... case o2:... }
Смысл опять прост — выбрать следующий шаг нашей программы.
Массивы
О: «У нас результаты просто в виде последовательности чисел…»
П: «Так… А как хранить наши результаты в памяти? Наверное это будет массив»
Массив — способ хранения списка ваших объектов. Т.е. просто соотношение, что на первом месте — объект1, на втором — объект2 и т.д.
В Java чаще оперируют коллекциями. Они могут быть реализованы поверх тех же массивов. Также, один из вариантов — хранить ссылку на следующий элемент — это будет уже список. Реализации таких структур отличаются по производительности относительно разных операций — поиск объекта, вставка в конце или начало и т.д.
Функции
О: «Мы там их просто сортируем, все очевидно».
П: «Сейчас мы сортируем по возрастанию. А что если потом надо будет по убыванию? Или вообще входные данные поменяются, а сортировка должна работать?».
В программировании часть кода можно выделить в обособленную функцию. По сути это просто выделенные шаги программы, которые можно переиспользовать. Зачастую такой функции можно дать имя, чтобы было проще понять что она делает и использовать в дальнейшем.
Все выше сказанные я бы и определил как «основы программирования». Это понимание как, зачем и почему программа работает.
Git
Git естественно не входит в привычное понятия «Основ программирования». Просто на сегодня это то, чем разработчик сегодня просто не может не уметь пользоваться!
Что такое Git? Простыми словами — это программа-сервис, где вы храните вашу работу. Если чуть сложнее — это распределенная система контроля версий. Загружая очередную порцию изменений в коде вашего проекта, git сохраняет их в истории.
Отдельно прочитать про основы работы с Git можно в нашей отдельной статье. Поверьте, сегодня git — точно то, что стоит отнести к основам работы программиста. Потратьте время на его изучение.
Алгоритмы и структуры данных
Часто можно слышать, «алгоритмы» и «структуры данных» как одно целостное словосочетание. Это происходит потому, что зачастую определенный алгоритм работает поверх какой-то определенной структуры. Например:
Алгоритм | Структура данных |
---|---|
Сортировка | Массива |
Обход | Графа |
Поиск | В бинарном дереве |
Разворот | Односвязного списка |
На олимпиадах по программированию участники должны наизусть знать разных хитрые алгоритмы поисков путей в графе, обходов дерева и т.д. В реальной жизни общего представления о том какие задачи можно решить, используя определенную модель данных — достаточно. Например, понимать, что построение индекса по строке может быть эффективна в бинарном префиксном дереве…
Главный вопрос — «зачем мне нужно это знать?». Понимание алгоритмов как таковых формирует то самое аналитическое, последовательное мышление, о котором мы говорили в «основах программирования».
Курсы программирования
Когда обсуждали обучение программированию в целом, то говорили о необходимости ментора, того человека, который может подсказать куда копать. Ускорить и упростить процесс получения знаний можно с помощью курсов — как онлайн так и очных. Список платных и бесплатных ресурсов, которые можно использовать при обучении программированию:
- TutorTop — молодой, но удобный агрегатор онлайн-курсов. Там собраны все курсы онлайн-школ по программированию и другим направлениям.
- SkillBox — один из ведущих российских «онлайн-университетов». Дорого, но качественно.
- GeekBrains — образовательный портал с платными и бесплатными курсами от Mail.ru. Хороший выбор.
- Нетология — университет онлайн профессий.
- Академия Яндекса — есть далеко не все направления, но стоит заглянуть, особенно если хотите попытаться устроиться на стажировку в Яндекс.
- Udacity — англоязычные курсы. Есть интересные варианты, например совместно с Google запущенный курс по Advanced Kotlin для Android.
- Udemy — зачастую недорогие онлайн курсы.
- StackOverflow — это, конечно, не образовательная платформа как таковая, но ответы на многие вопросы можно найти там. Правда чем выше ваш уровень, тем меньше ответов можно будет получить, но на старте — самое то!
- PluralSight — удобная онлайн платформа с видео курсами. Есть система «сертификации» по разным вертикалям, которые в том числе можно разместить нативно на StackOverflow
- Сообщества и конференции по вашему стеку технологий. Общайтесь с людьми с теми же интересами в программировании, это позволит посмотреть на уже имеющиеся знания с разных сторон. По Android я веду канал в Телеграмм, где рассказываю про разработку. Также у нас есть Телеграмм Чат для общения с другими Android программистами.
Работа программистом
Когда получены начальные знания, необходимые для программирования, встает вопрос — где их применять. Работу в IT я бы поделил на 2 большие части — работа в офисе и удаленная работа. На эту тему есть старая, но не теряющая актуальности статья про плюсы и минусы разных вариантов.
Работа в офисе
Нормально делай, нормально будет
«Делать правильно» — критически важно на начальных этапах погружения в профессию, т.к. переучиваться намного тяжелее чем учиться. Именно по-этому работа в сильной команде в офисе — лучший выбор для начала карьеры.
Сам по себе офис, если вы единственный разработчик на проекте много не даст. Важно присутствие более опытных коллег. Code review, неформальное общение за чашкой кофе — все это экспоненциально усиливает скорость получения знаний. Тут важна не «слепая вера» в безошибочность старшего товарища, а в общей атмосфере разных точек зрения в комнате. Критическое мышление — ваш помощник, чтобы формировать свое видение решения проблем.
Прежде чем перейти к удаленной работе я прошел путь
- Небольшая Web студия, которая разрабатывала приложения на заказ.
- Infotecs — работа в команде над криптопровайдером.
- Яндекс — работа в команде над браузером.
Удаленная работа
Стоит начать с того, что она подходит не всем. Не из-за уровня знаний в программировании, а потому что она требует большей самоорганизации, самоконтроля и ответственности. Я знаю крутых разработчиков, которым, на мой взгляд, было бы не комфортно работать удаленно.
Коммуникация — вторая большая проблема в удаленной работе. Необходимо поддерживать живое нерабочее общение, которое происходит само собой в офисе. Также — эффективное взаимодействие с вашей командной требует работы от всех. В офисе это на порядок проще. К тому же в офисе изначально все настроено для продуктивной деятельности, а о рабочем месте при удаленке надо думать самостоятельно.
И главное, что важно помнить — при выходе на рынок удаленной работы вы начинаете соревноваться с разработчиками со всех регионов. А при выходе на международную арену — со всем миром. Требования и к уровню программирования и к уровню Soft скиллов выходят на новый уровень.
Кстати и сама удаленная работа делится на 2 класса: фриланс от проекта к проекту и длительный контракт, по сути найм, но при нахождении вне офиса.
Фриланс
К фрилансу я отношу небольшие проекты, которые оплачиваются по факту или же на почасовой ставке. Зачастую ставка на фрилансе в пересчете на час работы может быть выше, чем работа по ТК в офисе или удаленно. Это происходит, потому что поиск проекта, вся работа с документами по сделке и т.д. не учитываются в этом времени. Грубо говоря — получение и согласование заказа на 20 часов заняло у вас еще 5 часов. При ставке 1 000 рублей в час (164т.р. при пересчете в рабочие часы в офисе) реальная ставка 20 * 1000 / 25 = 800 рублей. Ведь вы 5 часов потратили условно бесплатно.
Работа по ТК подразумевает отпуска, праздники и т.д. Фриланс прост как валенок. Работаешь — получаешь деньги, не работаешь — нет. Зато вы сами регулируете свою загрузку. Правда не сразу. Стартовать на фрилансе при сильной конкуренции — сложно. Для наработки портфолио придется тратить больше времени на поиск проекта чем на его реализацию.
На фрилансе проекты ищут либо уже по наработанной базе клиентов, либо на площадках:
- Weblancer.net — русскоязычный ресурс поиска работы на фрилансе.
- Fl.ru — наверное крупнейший русскоязычный сайт, посвященный поиску проектов.
- Freelancer.com — зарубежный сайт поиска работы на фрилансе.
- Upwork — один из самых известных сайтов по фрилансу на мировой арене.
- Toptal при почасовой работе — площадка, на которую сложно попасть, но она стоит того.
Постоянная удаленная работа
Разница между фрилансом и удаленной работы для меня в том, что она не подразумевает частую смену проектов. Длительная работа над проектом это большее погружение в разрабатываемый сервис, соучастие и вовлеченность.
Честно говоря, фрилансом, как описал выше я практически не занимался. Первую удаленную работу я нашел через платформу Toptal будучи еще в Яндексе. Это был проект на ~10 месяцев с зарубежным заказчиком на полный удаленный рабочий день.
С момента начала своей удаленной работы я сменил порядка 5 проектов на Toptal. В перерывах между ними мониторил прямые вакансии от зарубежных компаний. Почему зарубежных? В связи с курсом, с 2014 работать с валютой стало намного выгоднее.
В итоге длительный проект нашел на StackOverflow.
Сравнение работы в офисе, фриланса и удаленной работы
Возможное сравнение всех вариантов приведено в таблице. Естественно некоторые опции могут отличаться от случая к случаю.
Работа в офисе | Фриланс | Удаленная работа |
---|---|---|
Время поиска несоизмеримо короче чем период работы. | Можно долго искать короткий проект. | Время поиска несоизмеримо короче чем период работы. |
Все плюшки оформления по ТК. Страховка, больничные, отпуска и т.д. | Никаких социальных льгот и гарантий. | Можно договориться на оплачиваемый отпуск. Командировки в офис к клиенту. |
Работа 8 часов в день, 5 дней в неделю. | Ненормированная загрузка, контролируемая разработчиком. | Работа 40 часов в неделю. Главное - результат. Не столь важно сколько времени тратишь в день. |
Фиксированная ЗП в месяц соразмерная с регионом проживания. | Сам контролируешь уровень дохода. Больше работы - больше заработок. | Фиксированная ЗП в месяц. Запросто может быть выше средней в регионе проживания. |
Всю бухгалтерию и налоги ведет работодатель. | Вся бухгалтерия на вас. При частой смене проектов - много бумажной работы. | Вся бухгалтерия на вас. При длительном контракте все идет по шаблону. |
Работа привязана к локации офиса работодателя. | Работа не привязана к месту. | Работа не привязана к месту. Могут быть "командировки" в офис клиента. |
Можно найти стажировку для Junior программиста. | Конкуренция как минимум на уровне Middle разработчика. | Клиент ищет удаленного разработчика, т.к. не может найти подходящего у себя в регионе. Требуется высокий уровень подготовки. |
Зарплата программиста
Самая интересная часть, не так ли? Но тут не будет однозначного ответа вида «100500 рублей». Также я не вижу смысл говорить о том, сколько стоил мой час или месяц в тот или иной момент времени.
Вместо этого, так как данный сайт посвящен Android программированию, давайте разберемся в возможной вилке зарплат именно для мобильного разработчика.
Для оценки уровня ЗП в офисе, на фрилансе и при удаленной работе используем данные из:
- hh.ru — сайта для поиска работы. Чтобы сравнить вилку ЗП в России.
- upwork — посмотреть распределение ставок в час в мире.
- Ежегодный отчет от Payoneer от 2018 года на тему ставок фрилансеров, пользующихся их системой.
- Payscale — сервис по мониторингу уровня ЗП в мире.
- Официальный FAQ от Toptal — там они пишут, сколько будет стоить работа топ 3% удаленных программистов для клиента.
Источник | Категория | Минимальная ЗП | Средняя ЗП | Максимальная ЗП |
---|---|---|---|---|
PayScale, Москва, 5 лет опыта | Работа в офисе | 83 333,33 руб. | 166 666,67 руб. | 250 000,00 руб. |
hh.ru, Android, Москва | Работа в офисе | 80 000,00 руб. | 136 779,22 руб. | 335 000,00 руб. |
hh.ru, Android, Все регионы | Работа в офисе | 55 000,00 руб. | 92 231,77 руб. | 270 000,00 руб. |
Payoneer отчет | Фриланс | 52 480,00 руб. | 230 912,00 руб. | 1 049 600,00 руб. |
Toptal официальный FAQ, почасовая оплата, ставка для клиента | Фриланс | 629 760,00 руб. | 813 440,00 руб. | 997 120,00 руб. |
Toptal официальный FAQ, fulltime, ставка для клиента | Удаленная работа | 512 000,00 руб. | 665 600,00 руб. | 819 200,00 руб. |
Upwork | Фриланс | 104 960,00 руб. | 247 544,56 руб. | 1 049 600,00 руб. |
Исходную таблицу можно найти по ссылке на Google docs.
Личностное развитие
Каким бы вы крутым разработчиком не были, важно помнить, что так или иначе вам придется работать с людьми. И тут вдруг становится важно то, как вы умеете ладить и общаться с коллективом. На сколько грамотно можете выражать свои мысли и подбирать доводы за предложенные идеи.
«Коммуникабельность, проактивность, работа в команде» — должны быть не пустыми словами в резюме. Это может стать вашим личным кредо. Вы должны решать проблемы вашего клиента, а не создавать ему новые.
Разговаривайте на языке клиента, будьте готовы, что вас могут не понять — и это нормально. Учитесь отстаивать свою точку зрения, но в то же время слышать и уметь принять чужое мнение.
Вместо заключения
Теперь, когда понятно «что такое программист» пришло время выбрать для себя язык программирования.
Никогда не переставайте учиться и не бойтесь делиться знаниями и опытом. Никто и никогда не бывает прав во всем на 100%, а порой правильно поставленный вопрос, пусть и самый «очевидный» приводит к интересным обсуждениям и появлению новых знаний. Специально для вас я собрал ряд примеров кода и даже собрал готовое приложение. Обо всем это читайте на отдельной странице.