«Опять двойка» — картина художника Фёдора Решетникова
Сначала приведу несколько постулатов, которые просто примем за истину, как аксиомы:
- Путь в серьёзное программирование долгий и сложный
- Программирование требует полного погружения и требует «безбашенно ворваться»
- Технологии и подходы меняются очень быстро
- Алгоритмы и основы практически не меняются, а только дополняются
- Освоить новую технологию, если вы уже специалист в какой то технологии, многократно проще
- Кроме технических навыков, самоорганизации, поиска информации и прочие нетехнические навыки также важны, и они не меняются от смены технологии или языка
Эти постулаты можно оспаривать и много обсуждать, но это не цель данной статьи.
Самое важное состоит в том что сменить язык и технологию многократно проще чем выучить первую, а множество навыков языконезависимы. Поэтому из сложного пути стоит выкинуть всё сложное что не является необходимым, всё что можно добрать потом, а взять в дорогу всё что вам поможет.
На протяжении всего времени, до того как вы сможете зарабатывать какие-то деньги при помощи программирования, вам придётся идти на голом энтузиазме. На пути вы встретите множество проблем которые на определённом этапе развития могут казаться непреодолимыми. И чтобы сюжет с КДПВ не состоялся, в этот момент у вас должно быть достаточно воли и желания этот период преодолеть. Поэтому управление собственной мотивацией я считаю наиболее важной частью процесса обучения. А утверждение что там много потом будут платить, как правило, не является хорошей мотивацией
Поэтому первый язык и технологию я рекомендую выбирать строго по любви. Во всех технологиях к которым вы сейчас свободно найдёте бесплатные онлайн курсы есть заработки, просто полностью исключите вопрос «сколько я заработаю» и «насколько данный язык/технология востребованы в моём городе» из критериев выбора. Также я считаю что бесплатных образовательных материалов сейчас неимоверно много и я не вижу особого смысла покупать платные онлайн курсы. Из платного образования кружки с программированием и роботостроением для детей я считаю хорошней идеей, также любые технические лицеи, гимназии, университеты, т.е. классическое образование, если вы находитесь в возрасте приемлемом для такого образования.
Курсы вида «мы сделаем из вас фронтендера за 2 месяца» я не рекомендую. В основном потому что за мой многолетний опыт я ни разу не видел состоявшегося программиста с таким бекграундом. Один раз прыгнуть выше головы может и получится, удержаться в полёте — нет. Из всех правил, конечно, бывают исключения, но готовы ли вы поставить столько времени и денег на лотерею где выигрыш зависит не от вас? А от вас он не зависит потому что вы не стоите в этот момент на ногах и следовательно не управляете ситуацией.
Тут отдельно для родителей: школа с углублённой технической программой многократно лучше обычной. Если уклон только в информатику, то это не так хорошо. Хорошо, когда углублены математика, физика, информатика, английский язык. Чем больше удастся впихать математики в обычный период стандартного обучения школа-вуз, тем легче будет с программированием, но без фанатизма, пережимать тоже нельзя. Проблема в том что базовая математическая подготовка, во-первых очень сильно развивает мозг, а во-вторых, к сожалению, практически не может быть освоена потом.
Про вузы похоже на школы: Диплом потом не нужен, вообще, совсем. Кроме момента эмиграции. Для получения рабочей визы в другой стране диплом очень поможет, но и это решаемо. В университет имеет смысл идти только за навыками. И это матанализ, линейная алгебра, дифференциальные уравнения, дискретная математика, теория вероятностей, матстатистика. Какие модные технологии сегодня есть в университете абсолютно не важно. Хорошо, когда вокруг университета бегают HR крупных компаний, всякие Яндекс, Intel, IBM, Касперский и другие. Туда вполне реально попасть, и они, как правило, содержат всякие лаборатории и спецкурсы, которые очень хороши.
Если вы взрослый человек и у вас нет математического бекграунда, то ничего страшного, не пытайтесь его создать прямо сейчас, просто спектр ваших направление несколько уже, что не отменяет продвижения в рамках доступных технологий. Если будет очень надо — онлайн образование в помощь, это тяжело, но возможно.
Итак, алгоритм как я советую выбрать язык программирования
Идёте и гугл, яндекс или чем вы пользуетесь и забиваете там запрос: «бесплатные онлайн курсы программирования» и выбираете просто по описаниям 5 разных языков. Почитайте про разные, может что-то зацепит. Если что-то зацепило, всё выбор сделан, берите это.
По каждому языку идёте в википедию и читаете про этот язык. Что-то не понравится, то выкидывайте. Останется 2-3 языка. Если что-то зацепило, всё выбор сделан, берите это.
Определитесь с предметной областью, что вам интересно: например модифицировать игры и писать для них скрипты или писать игры целиком, сделать сайт, телеграм бота, сделать финансовый расчёт, смоделировать что-нибудь типа эпидемии, управлять роботом, или ещё что-нибудь. Важно взять то, что лично вам интересно, а не что кто-то считает важным.
Поищите курсы про интересную вам специфику на разных языках.
Пробуйте всё что нравится.
Ключевой момент поймать желание в этом закопаться. И как только вы это желание поймали, начинайте любой онлайн курс. Если возникли сложности и проблемы, попробуйте другой курс или другой язык. Не бойтесь попробовать разное. Огонь в глазах должен быть вашим ориентиром и путеводной звездой.
Если выбрать направление в котором потенциальная зарплата больше, а фана нет, то риск не дойти многократно увеличивается. Поэтому первую технологию нужно выбирать только по любви. А по расчёту выбирать будете уже следующие технологии, когда будет некий бекграунд. Обычно это даже не второй а третий-четвёртый язык программирования. А менять технологии всё равно придётся, потому что всё меняется очень быстро. И даже такой консервативный язык как C++ качественно меняется и программирование на нём требует новых подходов.
Технологии которые сейчас можно изучать сильно устареют и изменятся, когда вы дойдёте до того чтобы применять их на работе. Технологии которые я сейчас использую в работе и хобби в принципе не существовали, когда я учился программировать. Поэтому вообще расслабьтесь и делайте то, что штырит и прёт, а не то что модно или кому-то нужно. Более того знать несколько языков и разных технологий крайне полезно для опыта и общего развития в отрасли. Можно сравнивать разные подходы и совершенствовать свой стиль и путь.
Несколько очень частых вопросов
Нужен ли английский?
Чтобы начать прямо сейчас — нет. Но вообще хорошо бы. Если можно сконцентрироваться на этом в школе и университете, то это неплохо. Но не стоит откладывать по принципу «выучу, потом займусь программированием».
Нужна ли высшая математика?
Чтобы начать прямо сейчас — нет. Но вообще хорошо бы. Если можно сконцентрироваться на этом в школе и университете, то это неплохо. Но не стоит откладывать по принципу «выучу, потом займусь программированием».
Нужна ли высшее образование?
Чтобы начать прямо сейчас — нет. Но вообще хорошо бы. Если можно сконцентрироваться на этом в школе и университете, то это неплохо. Но не стоит откладывать по принципу «выучу, потом займусь программированием».
Нужно ли X?
Чтобы начать прямо сейчас — нет. Точно не стоит откладывать по принципу «выучу, потом займусь программированием». Ну вы поняли :)
И самое главное: догматов — нет, понятия «правильно» — нет, мнений вокруг — миллионы. Получайте кайф и шлите всех лесом, в том числе меня и эту статью, если вам нравится что-то делать не так как я написал — делайте. Если это работает, то это не тупо.
В начале, когда вы учитесь ходить нужно учиться именно ходить, с любой скоростью и в любом направлении, направление выберете потом. Тоже самое с обучением плаванию, езде на велосипеде, автомобиле. Сначала вы учитесь правильно бегать, тренируетесь а потом бежите марафон. Список этих аналогий можно продолжать бесконечно. Сначала вы осваиваете инструмент и воспитываете в себе навыки, потом уже выбираете направление движения и интересные вам направления развития в рамках навыка. Вот с программированием ровно также. Просто начните с следуйте за удовольствием.
И напоследок пара прикольных игр, которые я считаю полезными: lightbot.com и www.euclidea.xyz/ru
sshikov
>Статья в основном направлена на школьников (и их родителей), студентов и может быть джунов.
Серьезно? Советовать начинающему, вообще без опыта, выбрать язык по впечатлениям из гугля или википедии? Или по описаниям курсов? Это же почти 100% гарантия ошибиться.
Aquahawk Автор
На первом языке никто никогда не будет программировать всегда. Вся статья о том что конкретный выбор не имеет значения.
sshikov
Ну, нахвататься нехороших привычек можно легко. Избавиться потом от них сложно.
>Вся статья о том что конкретный выбор не имеет значения.
Вот я и сомневаюсь. Если вы выберете в качестве первого языка Хаскель, или скажем Lisp (любой из), у вас в итоге будет совсем другой набор базовых навыков, чем если вы выберете тот же javascript (и пойдете в сторону веба). Психологические барьеры зачастую очень сложно преодолеть, я не думаю, что все люди такие же, как вы или я, и им легко свой выбор в любой момент поменять, и взяться за другое направление.
Выбор не имеет значения (почти) только если вы выбираете между очень похожими, и скажем так, обычными языками. Ну там, Java или C# — наверное все равно, переход на другой не будет так уж сложен (хотя экосистемы уже очень разные).
Ну то есть, в целом наверное можно согласиться, что начать можно с чего угодно — но результат все-таки будет отличаться. Если меня спросить, то я бы пожалуй сказал, что стоит взять сразу два или даже три языка, возможно разных, и попробовать с ними поиграться. В мое время это были скажем Алгол-60, Фортран, PL/1, ассемблер S/360 (причем три из них де-факто процедурные, и похожие), а сейчас можно и что-то поинтереснее найти для начала.
Zibx
Главное — пробудить и развить интерес. Потом можно будет повторить первый этап и найти язык который кажется лучшим с учётом полученного опыта.
Aquahawk Автор
Да, именно так.
sshikov
Я ничего не имею против интереса. Просто автор, если вы заметили, предлагает начинающему _самому_ выбрать язык. По интересу, да — как его описывают в интернете другие люди.
Мне вот далеко не очевидно, что это не будет результатом просто хайпа вокруг языка. То есть будет выбран язык не самый подходящий, а тот, о котором больше шумят. Модный, по-простому говоря. Более того, начинающий просто не сможет сам оценить, что на самом деле важно и интересно, а что — словесный мусор.
Как раз в этом направлении я бы ожидал, что начинающим дадут более конкретный совет — пусть даже не слишком детальный. Ну типа «Попробуйте Rust, если хотите писать что-то близкое к железу, но не на C», или «Попробуйте Хаскель, если вам нравится математика» (я тут упрощаю и утрирую, конечно же).
Aquahawk Автор
Статей которые говорят что именно с этого нужно начать — миллион. Я же хотел рассказать о более важных вещах. Я не верб в новичка на расте, простите но нет. Пусть новичёк выберет хайповую штуку и чувство участия в хайпе поможет ему в нелёгком пути. Ничего страшно, всё равно потом брать руль в свои руки и рулить в нужно направление. Когда учишься трогаться на машине нужно трогаться в том напроавлении в котором автомобиль стоит, крутить его на завадя — плохая идея. Тронешься, потом руль будешь крутить.
sshikov
Не, ну тут я не вижу особых причин для спора. Одного точного ответа все равно нет, и люди все разные. Я свой взгляд изложил, то что он от вашего отличается — нормальное явление.
Zenitchik
Ещё важный момент, чтобы была IDE, которую можно скачать и начать пользоваться, а не танцевать вокруг неё с бубном.
И чтобы эта IDE не была хуже блокнота и консоли, как, например, то, что поставляется с Питоном.
Krivitskiy_Anton
А как же PyCharm?
Zenitchik
Это уже другое дело.
kloppspb
Моей IDE была тетрадка, карандаш, и книжка про ассемблер в трясущейся электричке. И это незадолго до выхода на диплом по совсем другому профилю :)
Zenitchik
Ну, когда программа измеряется первыми сотнями строк — можно и так.
kloppspb
Первые программы длинней и не бывают :) Как-то слабо представляю сценарий уровня «бдыщь, хочу научиться программировать! и тут же фигакс, git clone git@github.com:freebsd/freebsd.git» :-)
semennikov
С моей точки зрения для начала все языки подходящие, вообще слово подходящие сразу вызывает вопрос «подходящие для чего?»
Zenitchik
Для меня Ваше утверждение звучит дико.
Искренне не понимаю какие такие барьеры сложно преодолеть, и какие такие трудности возникают в чтение спеки на новый язык.
sshikov
Возможно у вас нет тех 40+ лет опыта, как у меня? Я таких людей видел и вижу постоянно, которым тяжело переучиваться. Они изучили что-то одно, и пытаются на этом тянуть годами и десятками лет. Если у вас не так — это же не значит, что всем это легко?
Aquahawk Автор
Такие люди есть, с этим ничего нельзя сделать. Но вот угадать нужную через 20 лет технологию сегодня вевозможно даже имея опыт, а мы говорим об обучении. Кому-то повезёт больше, кому-то меньше. Но тот кто начал делать добьётся больше чем самы везучий давитель дивана.
sshikov
Насчет угадать — согласен. И насчет того что лучше начать хоть что-то, чем выбирать бесконечно — тоже. Собственно, чтобы не гадать (без опыта), можно было бы дать какие-то советы поконкретнее, скажем, описать некоторые группы языков, которые внутри более-менее похожи. Но я прекрасно понимаю в тоже время, что давать такие советы сложно.
semennikov
Ну не совсем, мне крайне сложно было справиться с lisp, Forth и тот легче пошел.
kloppspb
Первый мой язык был интеловский ассемблер, второй — C. Потом было до фига всяких. Прошло больше 20 лет, и сейчас я пишу на C и ассемблере (правда, уже не интеловском).
semennikov
Вы будете долго смеяться но 5 или 6 моих первых языков я действительно никогда уже не использую, да их и вообще почти никто не использует
kloppspb
Таким количеством я и сейчас похвастаться не могу :) Третьим был BASIC. Вот на нём и была написана первая серьёзная программа (моделирование выхода с хроматографической колонки, да с гуем, мышкой и прочими свисто… это самое). 1994-96. Потом плюсы, (как же без PHP), Java, Perl… Да вроде и всё из серьёзного. В конечном итоге, вот прямо сейчас, пилю CRTL для ОС. Си, ассемблер, иногда Perl :)
semennikov
Дела давно минувших дней, предания старины глубокой…
Лично у меня: машинные коды(в восьмиричной системе!) Урал-1, потом Алмир, фортран-4, ассемблер 8080, Бейсик в нескольких инкарнациях, Алгол-60, ассемблер Электроника-60, Паскаль, а вот дальше уже Lisp(это для AutoCAD), Forth(это для обработки измерений в реальном времени), Си и разные ассемблеры, Lua. Я пишу довольно редко и всегда для управления каким-либо железом, почти всегда в реальном времени, поэтому С++ никогда не пользуюсь, хотя знаю конечно, и вообще ООП с железом плохо дружит. Более высокие уровни я всегда сплавляю другим, сам смотрю только архитектуру и дизайн
kloppspb
Эх… На самом деле мой первый компьютер был СМ1800. 1984 примерно. Не зашло. Потом был бум ZX, вообще мимо.
semennikov
Ошибиться в чем? Если о том, что будет ненужен — 99,9% будет не нужен, но ПОТОМ! а сейчас если понравился — хватай и смотри, потом разберешься и это гораздо лучше чем тебя будут водить за ручку и говорить «Сначала учи это, а потом это» — ну не интересно это! Потом разберусь что надо, а сейчас запустить свое «Hello world» да еще с ошибкой и исправить ее тут же! Вот где кайф, а матрицы я уж как нибудь и потом подсчитаю
sshikov
>Ошибиться в чем?
В своем будущем. И потом не разберетесь, не надейтесь. Потеряете интерес, и уйдете в эффективные менеджеры. Хотите сказать, что такой сценарий невозможен?
>«Сначала учи это, а потом это» — ну не интересно это
Я совершенно согласен, что интерес (для начала) — это очень важно. Но обучение не может строиться на одном интересе, потому что ему свойственно пропадать. Иногда нужно усвоить некоторые фундаментальные вещи, возможно сложные для понимания. Или когда сразу не очень понятно, зачем они нужны.
Фактически, автор предложил пустить все на самотек. Я не могу доказать, что такой подход верный, или наоборот. Вряд ли такое вообще можно доказать. Но я считаю, что учить (и учиться) можно и нужно иначе. Скажем, нужно давать человеку принципиально разные языки. Даже если он никогда не будет писать на лиспе — нужно попробовать, как это делается. Нужно посмотреть на язык с реально мощными типами данных, желательно статически типизированный. И на другой язык, типизированный динамически. Попробовать разные подходы. Во-первых, это как раз реально интересно. А во-вторых, понимание, что одни и теже вещи можно делать разными способами — это очень полезно в перспективе.
Zenitchik
Значит судьба такая.
Если интерес пропал — значит он не настоящий.
sshikov
Так зачем это еще и стимулировать? При обучении стоит создавать его искусственно. В том числе — путем внесения разнообразия в языки.
Zenitchik
Если интерес приходится создавать искусственно, то нужно ли учиться?
sshikov
А можно простой вопрос — у вас дети есть? Они учатся в школе? И изучают там только те предметы, что им интересны? Хотел бы я на такое посмотреть.
Да, в моей вселенной интерес (и у детей, и у обучаемых, когда я преподаю) всегда приходится создавать, или как минимум поддерживать исскусственно.
Zenitchik
Простите, но здесь речь, кажется, о самообразовании?
Человек хочет стать программистом по зову души или сугубо ради денег? Если первое — то он не перегорит. Если второе — то зачем нам такой программист?
DrPass
Обычно в одном программисте прекрасно сочетается и то, и другое. Но не суть важно, этот самый зов души возникнет не на пустом месте. Профессия — это не девушка, к ней не бывает любви с первого взгляда за счёт выброса гормонов. Сначала надо как раз заинтересоваться с чьей-то помощью, потом опять же таки попробовать с чьей-то помощью, а уже после этого может возникнуть «зов души».
Zenitchik
И почему это мне ничья помощь не потребовалась? Читал книжку про компьютеры, узнал, что бывает такой BASIC. Решил попробовать — понравилось. Всё.
Сам процесс разработки и написания кода доставляет удовольствие. Это необходимое и достаточное условие, чтобы стать программистом.
DrPass
Таких как вы, среди миллионов программистов, в пределах статистической погрешности. И половина из них тут на Хабре :)
Zenitchik
Мне это странно. Если человеку не интересно программировать, то может ему не надо становиться программистом? Зачем себя насиловать?
Помощь в обучении — это понятно, это нужно. Но помощь в поддержании интереса — это что-то выходящее за рамки моего понимания.
DrPass
Потому что человеческое восприятие, оно не полярно. Да, бывают исключения, когда кто-то сам загорелся идеей, сам разобрался, сам довёл до конца. У меня, например, было точно так же, я вырос в семье горного мастера и химика, безнадёжно далекой от электроники в целом, и от вычислительной техники в частности. Но мне как-то случайно мама три с лишним десятка лет назад купила детскую книжку про кружок программирования на калькуляторах, я «загорелся», и отец, нифига не понимая собственно в этом деле, но видя мой интерес, подарил мне на день рождения МК-61.
А все остальные вокруг меня пришли в программирование другим путём. Кто-то просто пошел в институт, потому что специальность была популярная, кто-то курсы закончил, у кого-то семья ИТшников. И они хорошие программисты, никто себя не насилует, но без человека, который их заинтересовал, будь-то родители, преподаватели и так далее, они не стали бы программистами. И даже я сам, не будь той книжки (или какой-то другой такой же), чёрта с два стал бы программистом.
sshikov
>Человек хочет стать программистом по зову души или сугубо ради денег?
Это вопрос сложный. У меня ребенок вообще не думает про деньги. Хотя пора бы уже думать, на что собирается жить уже совсем скоро. Если деньги при выборе не единственный стимул — то это не самый плохой вариант, мне кажется.
Zenitchik
Я учился программировать, потому что мне этого хотелось. А потом я случайно узнал, что за это хорошо платят и сделал это своей профессией.
semennikov
Если пропал интерес на любом этапе то это очень плохо, поэтому (как мне кажется, я не настаиваю на своем, возможно ошибочном мнении) если обучение не строится на интересе как на фундаменте, то не будет результата.
А что касается разных языков, то да, это безумно интересно когда встречаешь что-то абсолютно новое, и пока хоть что то не сделаешь на этом языке (для себя, исключительно для себя) не успокоишься. Лично у меня одно из самых ярких воспоминаний, как я сражался с обратной польской нотацией и таки справился с нею.