На моей практике воспитание нескольких успешных разработчиков с нуля. Кроме того, я сам постоянно изучаю новые технологии и языки и с удовольствием делюсь своими знаниями с другими.
Сразу оговорюсь, если вас интересует только быстрый путь и другие варианты не нужны - следующий раздел можно смело пропустить.
Правильный путь
Лично я отношу себя к последователям редукционизма - веры в то, что, владея основополагающими знаниями системы можно объяснить явления любой сложности. Следуя этой идеологии, владея базовыми знаниями устройства операционной системы, принципов программирования, алгоритмов и структур данных не составит большого труда разобраться в какой-либо современной технологии. И это действительно так, если не учитывать один важный момент: разрыв между низким и высоким уровнем в современном мире настолько велик, что по факту 70% знаний первого никогда не пригодится во втором.
Вы спросите: почему же тогда этот путь я называю правильным?
Все дело в том, что этот багаж знаний делает из пользователя компьютера - Бога! Именно эти знания делают разработчика экспертом. Несмотря кажущуюся на первый взгляд бесполезность, понимание "внутренностей" системы позволяют находить оптимальные решения и более того, находить выход из ситуаций, из которых большинство выйти не сможет.
Как же собственно "стать Богом"?
- Изучить основы языка Си (Почему не ассемблер? Потому что его концепции не применимы ни к одному другому языку программирования и тех же задачи можно решить на Си).
- Разобрать базовые алгоритмы и реализовать их самостоятельно.
- Изучить структуры данных, научиться применять их на практике.
- Повторять циклически, повышая уровень сложности (т. е. погружаясь все глубже и глубже в тему) до тех пор, пока смена уровней не станет чем-то простым и понятным.
- Двигаться дальше в сторону любой технологии или языка, поэтапно поднимая уровень абстракции вверх.
Если вы выбрали для себя этот путь (либо уже ему следуете), то вам очень пригодится монография Дональда Кнута «Искусство программирования».
Почему так делать не стоит?
Если вы только начинаете свой путь в области разработки программного обеспечения сразу скажу - в 99% это тупик. Почему? Потому что не имея общих представления о том, что из себя представляет программирование, как выглядит типичная программа и что она по факту делает вы увязните в тоннах информации слепить воедино которую будете просто не в силах. В итоге после месяцев изучения вышеперечисленного у вас будет чувство непонимания что с этим всем делать. Потратив год-второй, на вопрос друга "как написать сайт" или "бота для телеграмм" вы просто пожмете плечами. Приведенный выше алгоритм в те времена, когда я начинал, с отсутствием постоянного доступа в интернет, занимал годы. Даже сейчас, со всеми возможностями и источниками информации высока вероятность что вы просто выгорите так и не получив отдачи.
Сильные стороны:
- Полное понимание любой программной системы
- Возможность управлять процессами, недоступными (либо труднодоступными) другими путями
- Высокий уровень квалификации - способность решать задачи любой сложности
Слабые стороны:
- Огромные затраты по времени
- Высокая сложность обучения
Эффективный путь
В свободное время я постоянно изучаю различные технологии, как новые так и старые. И за десяток лет выработал стратегию быстрого старта.
Чтобы максимально быстро и комфортно войти в тему начните с конца. Хотите написать приложение под Android для показа погоды? Определитесь с языком и стеком технологий, которые будете использовать. Их выбор зависит от цели разработки. Если вы рассматриваете свой путь как андроид-разработчика, то выбирать нужно максимально популярный язык (на самом деле стоит ознакомиться с рекомендациями компании Гугл, как разработчика ОС Андроид, но для простоты выбора на начальном этапе достаточно взять самый популярный). Существуют так называемые дорожные карты (roadmap), которые представляют из себя последовательность изучения технологий в той или иной области. Они прекрасно подойдут для этого выбора. В будущем, когда вы освоитесь, у вас появятся более осознанные критерии для подобных задач, а пока пойдем простым путем.
Важный нюанс - не нужно сразу пытаться реализовать большой проект. Возьмите что-нибудь маленькое, возможно неделимую часть того проекта, к реализации которого стремитесь.
Первый этап - получить представление о той технологии, с которой собираетесь работать. Для этой цели отлично подходят онлайн-учебники по типу метанита и профессора веб. В таких учебниках представлены лишь ключевые моменты, которых обычно достаточно для очень простых приложений погружения в тему. Сейчас очень много чатов в Telegram по разным темам (комьюнити), в которых люди задают вопросы и делятся опытом. Это просто великолепно для наших целей! Здесь вы можете задать вопросы, на которые вам с высокой долей вероятности ответят люди, уже имеющие за плечами некоторый опыт. Конечно, не стоит туда писать каждый вопрос, приходящий на ум, сначала нужно самостоятельно попытаться разобраться (гугл, книги, статьи, видео-уроки) и в случае неудачи, перепробовав все и получив максимально возможное понимание проблемы обращаться за помощью.
Когда вы уже разобрались в основных возможностях технологии (не обязательно во всех, хотя бы в тех, которые вас интересуют) наступает второй этап - развитие навыков. Теперь нужно как можно больше программировать. Пишите все, что придет в голову. Пишите, пишите и пишите. Например, на том же андроиде есть множество подсистем - датчики, смс, звонки, email, камера, звук, файловое хранилище и т.д. и т.п. Придумайте элементарную задачу для каждой из них и при помощи того же гугла (на самом деле нужно читать документацию по Android SDK, но сначала это может оказаться сложным) и решите её. В процессе решения этих задач у вы столкнетесь с уймой проблем, решение которых даст вам бесценный опыт и сильно расширит понимание технологии.
На этот момент вы уже должны более-менее четко понимать, что делаете. Теперь все просто - беритесь за документацию и литературу по языку. Особое внимание стоит уделить философии программирования - Чистый код, паттерны проектирования, методологии разработки и подобным вещам. Они сделают из вас хорошего специалиста.
Если вас интересует низкий уровень (разработка драйверов, прошивок для микроконтроллеров и т. п.) и вы не имеете никаких (или почти никаких) познаний в программировании зайти стоит все-равно с высокого уровня. Выбрать самый популярный язык, разобраться его в основах и уже после этого двигаться в низ. Так проще - изучать сложные (сначала) вещи имея понимание как работают простые.
Сильные стороны:
- Минимальное время до выпуска первого приложения
- Низкий порог входа (знания накапливаются в процессе, а не предварительно)
Слабые стороны:
- Долгое время многие вещи будут казаться "магией", которую нужно будет просто брать на веру
Рекомендации:
- Если не получается что-то понять, значит есть пробел в знаниях. Заполните пробел и все станет на свои места.
- Не берите неудачи на свой счет. Все проходят через этап "ничего не ясно" и "почему оно не работает". Причем не однократно.
Спасибо за внимание! Удачи в разработке и изучении материала.
На любые вопросы с радостью отвечу в комментариях. Замечания и предложения принимаются.
Понравилась статья? Поставьте лайк 🙂