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

Реши кто ты

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

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

Я настоятельно рекомендую второй путь, потому что он более универсален, интересен и приносит больше в долгосрочной перспективе. ИТ постоянно меняются, поэтому вы хотите быстро осваивать новые технологии. У вас также есть больший выбор. Если вы выберете трудный путь, остальная часть этого поста будет вам полезна.

Математика

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

Постоянно появляются новые технологии. Многие из них основаны на существующих математических моделях. Если вы хорошо знаете основную математику, вы получите очень хорошие льготы:

  • Выбирать новые модные вещи на порядки проще.
  • Вы понимаете, где можно применять новые методы, а где нельзя.
  • Обычно вы понимаете, почему решения такие, какие они есть. Затем вы можете настроить их, чтобы они лучше соответствовали контексту.

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

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

Учитесь у лучших, используйте лучшие инструменты

Тщательно выбирайте свой родной язык. Он должен быть хорошо спроектирован, что означает:

  • Последовательность.
  • Малое ядро.
  • Никаких лишних сложностей (часто это происходит из-за непоследовательности: есть вещи, которые нужно просто помнить или постоянно осознавать, но которые не приносят ничего полезного в таблицу).
  • Сложнее прострелить себе ногу.
  • Это также должен быть язык высокого уровня, потому что программирование - это решение проблем, а не владение конкретным языком. Знание всех мелких особенностей вашего любимого языка само по себе не является мастерством программирования.

Советую один из этих языков:

  • Схема (есть хороший классический вводный курс «Структура и интерпретация компьютерных программ»)
  • Болтовня
  • Эйфелева
  • ML

Пусть вас не вводит в заблуждение их кажущаяся непопулярность, в мире программирования популярность не означает качество.

Не начинайте с Python, пожалуйста! Он плохо спроектирован, непоследователен и не учит строгому мышлению. Не нужно привыкать к менталитету «ну, вроде как обычно работает». У Python есть свои применения, но не в качестве первого языка.

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

Например, представьте, что вы изучаете новый язык, Go. Погуглите: «Язык Go - отстой» и прочтите, почему люди его критикуют. Некоторые из них будут жалкими, но некоторые действительно правы. Скорее всего, вы получите новые знания, прочитав критические замечания и оценив, действительно ли они правы или просто хотят ныть.

Думайте самостоятельно

Я преподаю программирование (C и ассемблер) с 2009 года студентам Университета ИТМО в Санкт-Петербурге, Россия. У многих людей возникают проблемы с программированием, и они никогда не преуспевают в его изучении из-за невозможности создания кода. Когда они получают задание, они пытаются имитировать существующее решение, возможно, взять несколько фрагментов из Stack Overflow, настроить их по своему вкусу. Хорошо, у вас есть решение, что еще вам нужно?

Вам следует научиться писать код с нуля. Типы навыков, необходимых для этого, так отличаются от вмешательства в существующий код!

Программирование - это осознанный выбор. Вы находитесь в состоянии A (у вас есть доступ к ряду языковых функций / библиотек и вы знаете, как их комбинировать); вы хотите перейти в состояние B (языковые конструкции объединены таким образом, чтобы выразить решение). Как построить маршрут от А до Б? Это настоящее программирование, решение проблем.

Когда вы начнете писать программы с нуля, это будет сложно, но абсолютно необходимо научиться создавать что-то с нуля. Чтобы улучшить свои навыки решения проблем, очень важно, чтобы вы изучили алгоритмы и структуры данных. Возьмите хорошую книгу и решайте конкурсы онлайн. Для начала рекомендую «Алгоритмы» Дасгупты, потом классическую работу Кормена. Я обещаю, это откроет для вас совершенно новый мир.

Дополнительная часть процесса создания программного обеспечения - проектирование архитектуры программного обеспечения; опять же, невозможно научиться хорошо структурировать свои программы, не построив их от 0 до 100.

Расширьте свой кругозор

Программируйте каждый день, постоянно выполняйте побочные проекты. Для меня, как учителя, есть очень простой (и в большинстве случаев точный) способ понять, что мой ученик с большой вероятностью добьется успеха как программист. Один вопрос: Что ты программируешь в свободное время?

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

В идеале вы должны трогать все: написать собственный компилятор, возможно, игрушечную ОС, http-сервер, движок базы данных, игры, преобразование лучей, построить несколько нейронных сетей, поиграть с помощниками по проверке и зависимыми типами, написать простое мобильное приложение, написать для встроенных … Продолжай. Разместите все свои проекты на GitHub и гордитесь ими: ваш будущий работодатель может взглянуть на это. Используйте это портфолио в своих интересах.

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

Откройте для себя разные инструменты и языки. Если кто-то говорит вам, что все языки похожи, это либо упрощение, либо недостаток опыта. Позвольте мне немного это объяснить.

Модель вычислений - это набор основных операций и способов их объединения для построения сложных алгоритмов. Некоторые языки имеют очень похожие модели вычислений, но некоторые очень разные.

Программирование намного больше, чем ваш широко известный C / Python / Java / C ++ / C # / Go / Javascript, которые все построены на одних и тех же принципах: императивном, структурном, с редкими кусочками ООП и синтаксическим сахаром для имитации других стилей программирования. Мир языков программирования ОГРОМНЫЙ. Как насчет:

  • Промышленные языки функционального программирования со сложными и хорошо продуманными системами типов (Haskell, Ocaml)
  • Функциональные языки с зависимыми типами, позволяющие не только программировать, но и писать доказательства корректности (Coq, Agda, LEAN)
  • Конкатенативные языки на основе стека? (Четвертый)
  • Логическое программирование (Пролог, Рефал)
  • Конечные автоматы (регулярные выражения, Промела)
  • Сильно расширяемые языки, позволяющие реализовать практически любые синтаксические конструкции, такие как Lisp, Forth, Camlp4 / 5 или Rebol?
  • Инструментальные средства предметно-ориентированного языка, такие как JetBrains MPS или XText?

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

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

Быть социальным

Мне очень повезло познакомиться с удивительными людьми. Мои товарищи помогли мне усовершенствовать свои навыки, узнать что-то новое, увидеть мир с другой точки зрения. Изоляция себя в конечном итоге не принесет вам ничего хорошего: вам нужно, чтобы другие люди обсуждали, видели, что они задумали, что они думают. Если ваш партнер прочитал интересную статью и рассказал вам об этом, вы просто сэкономили много собственного времени, потому что он накормил вас обработанными, кристаллизованными знаниями.

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

Спросите у людей, которые лучше разбираются в коде, обзоры кода и прочтите их код. Если вы посмотрите на чью-то работу, если он лучше вас, вы можете многому научиться, чего вы не ожидаете. Обзор кода еще лучше, потому что парень расскажет вам, как он написал бы тот же код. Это, вероятно, один из самых эффективных способов очень и очень быстро стать лучшим программистом.

Напишите тесты

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

Я надеюсь, что это действительно может помочь кому-то получить более широкую картину, быстрее учиться и стать лучшим программистом; Если у Вас возникнут вопросы, буду рад помочь. Удачи!