Привет, Хабр! Представляю вашему вниманию перевод статьи " Советы студентам, изучающим программирование ".
Есть много вещей, которые мне хотелось бы знать, когда я начинал свой путь в качестве студента-программиста.
С тех пор прошло почти 10 лет, и, к сожалению, я не могу поделиться своим опытом и знаниями с самим собой прошлым, только с более молодыми коллегами.
Этот пост содержит несколько полезных советов, которые мне хотелось бы услышать, когда мне было 18 лет. Решите, что вам нужно Вам, конечно, не обязательно быть знакомым с формальной логикой или категории , если вы просто хотите научиться создавать что-то практичное (скажем, интерфейс) и делать именно это.
Есть два основных пути, которые различаются усилиями, продолжительностью и результатом.
- Освоить одну область можно быстро — скажем, за один-два года.
Ты не будешь бесполезным, ты будешь чем-то заниматься и зарабатывать на жизнь.
Существует множество вакансий (по крайней мере, на данный момент), которые не требуют особой гибкости.
- Вы можете стать состоявшимся специалистом, потратившим много времени и сил на фундаментальные вещи.
Тогда вы сможете адаптироваться, и смена карьеры станет относительно легкой.
Вы можете заняться машинным обучением, затем формальной проверкой, затем каким-нибудь низкоуровневым программированием для торговли или перейти к разработке игр.
Это требует времени и самоотверженности – по моим оценкам, этот процесс займет не менее 6-8 лет.
Технологии постоянно меняются, поэтому вам захочется быстро перейти на новые технологии.
Математика Изучайте математику, потому что математика полезна.
Я не могу это подчеркнуть.
Когда вы начинаете, вы можете подумать, что вам не нужна линейная алгебра, потому что вы не знаете ее приложений.
Однако для любого нетривиального машинного обучения оно вам понадобится.
Вам нужна статистика и вероятность.
Вам понадобятся логика, комбинаторика, теория множеств, все виды дискретной математики, теория графов, теория вычислимости, формальные грамматики, лямбда-исчисление, формальная семантика, топология, теории типов, теория чисел, группы, кольца, поля, категории.
Постоянно появляются новые технологии.
Многие из них основаны на существующих математических моделях.
Если вы хорошо знаете основы математики, вы получите несколько очень хороших преимуществ:
- Выбор среди новомодных технологий станет значительно проще.
- Вы поймете, где следует использовать новые методы, а где нет.
- Вы поймете, почему решения такие, какие они есть.
Затем вы можете изменить их, чтобы они лучше соответствовали контексту.
Это потребуется, когда ошибки обычно распределяются с соответствующим средним значением.
Если это не так, вы будете слепо применять неадекватное решение, даже не задумываясь о том, что часть модели нуждается в доработке.
Изучите математику, чтобы научиться мыслить математически.
Написание доказательств заставляет вас быть строгим в своих действиях.
Вы всегда будете думать обо всех возможных путях выполнения вашей программы, чтобы избежать ошибок и проблем с безопасностью.
Ясность мысли, полученная в результате построения доказательств, драгоценна.
Это также поможет вам написать короткий и лаконичный код. Учитесь у лучших, используйте лучшие инструменты Выберите свой первый язык.
Он должен быть хорошо спроектирован, то есть иметь:
- Последовательность.
- Маленькое ядро.
- Отсутствие лишней сложности (например, при изучении «сложного» языка есть вещи, которые просто необходимо знать или постоянно помнить, они не несут ничего полезного для изучения).
- Низкий шанс «выстрелить себе в ногу».
- Высокий уровень, потому что программирование – это решение проблем , а не владение языком.
Знать все тонкости любимого языка не означает быть идеальным программистом.
- Схема (есть отличный классический вводный курс «Структура и интерпретация компьютерных программ»).
- Болтовня
- Эйфелева
- М.
Л.
Не начинайте с Python, умоляю вас! Он плохо спроектирован, непоследователен и не научит вас строгому мышлению.
Вам не нужно привыкать к менталитету «хорошо, обычно работает».
Python имеет свое применение, но не в качестве первого языка.
Если вы привыкли к низкому качеству языки и некачественные инструменты, и некачественное ПО, и некачественные решения, вы неизбежно повторите их в своей работе .
Будьте критичны, задавайте вопросы, критикуйте все, ищите нестыковки и недостатки.
Например, представьте, что вы изучаете новый язык Go. Загуглите «Язык Go — отстой» и прочитайте, почему люди его критикуют. Некоторые комментарии будут незначительными, но другие действительно будут иметь смысл.
Скорее всего, вы получите новые знания, прочитав критические замечания и оценив их, чтобы определить, имеют ли они смысл или являются просто пустыми словами.
Подумайте сами Преподаю программирование (C и ассемблер) с 2009 года студентам Университета ИТМО в Санкт-Петербурге.
Многие люди имеют проблемы с программированием и никогда не изучают его, потому что не создают код. Когда они получают задание, они пытаются имитировать существующее решение, возможно, беря некоторые фрагменты из Stack Overflow и настраивая их по своему вкусу.
Хорошо, мы нашли решение, что еще вам нужно? Вы должны научиться писать код с нуля.
Типы навыков, необходимых для этого, настолько отличаются от навыков, полученных путем изменения существующего кода! Программирование означает принятие осознанного выбора.
Вы находитесь в состоянии A (у вас есть доступ к ряду языковых функций/библиотек и вы знаете, как их комбинировать); вы хотите получить состояние Б (языковые конструкции объединены для решения проблемы).
Как построить маршрут от А до Б? Вот это настоящее программирование, решение проблем .
Становится немного сложнее, когда вы начинаете писать программы с нуля, но абсолютно необходимо научиться создавать вещи с нуля.
Чтобы улучшить свои навыки решения проблем, важно изучить алгоритмы и структуры данных.
Возьмите хорошую книгу и решите олимпиадные задачи онлайн.
Я рекомендую начать с «Алгоритмов» Дасгупты, а затем с классической книги Кормана.
Все это откроет для вас совершенно новый мир, я обещаю.
Дополнительной частью процесса создания программного обеспечения является разработка архитектуры программного обеспечения; Невозможно научиться правильно структурировать свои программы, не создавая их от 0 до 100. Расширьте свой кругозор Пишите код каждый день, постоянно занимайтесь сайд-проектами.
Для меня как учителя это очень простой (и в основном точный) способ узнать, что мой ученик, скорее всего, добьется успеха.
Один вопрос: чем вы программируете в свободное время? У ваших учителей просто не хватает времени, чтобы все охватить.
Ведь после окончания университета вам следует продолжать учиться самостоятельно до выхода на пенсию.
Если вы увлечены тем, что делаете, вы ради развлечения изучите различные типы программного обеспечения, и это даст вам гораздо больше опыта и навыков, чем ваши менее мотивированные коллеги.
В идеале вам следует попробовать все: написать свой собственный компилятор, может быть, игрушечную ОС, http-сервер, движок базы данных, игры, рейкастинг, создать несколько нейронных сетей, написать простое мобильное приложение, написать программу для встраиваемых систем.
, вы можете продолжайте самостоятельно.
Разместите все свои проекты на GitHub и гордитесь ими; ваш будущий работодатель может взглянуть на это.
Используйте это портфолио в своих целях.
Общеизвестно, что найти хорошего программиста чрезвычайно сложно.
У многих программистов, претендующих на работу, возникают проблемы с написанием таких тривиальных вещей, как FizzBuzz. Если у вас есть существующие проекты, размещенные на GitHub, работодатель будет более уверен, что вы подходите ему.
Испытайте себя, используя различные инструменты и языки.
Если кто-то вам скажет, что все языки похожи, то это либо упрощение, либо недостаток опыта.
Позвольте мне немного объяснить.
Вычислительная модель это набор, состоящий из основных операций и способов их склейки в порядке, необходимом для создания сложных алгоритмов.
Некоторые языки имеют очень похожие вычислительные модели, а некоторые сильно отличаются.
Программирование — это нечто большее, чем обычный C/Python/Java/C++/C#/Go/Javascript, построенное на тех же принципах: императивное, структурированное, немного ООП и синтаксический сахар для эмуляции других стилей программирования.
Мир программирования ОГРОМЕН.
Как насчет:
- Промышленные функциональные языки программирования со сложными и продуманными стандартными системами (Haskell, Ocaml).
- Функциональные языки с зависимыми типами, позволяющие не только программировать, но и писать доказательства (Coq, Agda, LEAN).
- Конкатенативные языки (Форт).
- Логическое программирование (Пролог, Рефал).
- Конечные автоматы (регулярные выражения, Promela).
- Высокорасширяемые языки, позволяющие реализовать практически любые синтаксические конструкции, такие как Lisp, Forth, Camlp4/5, Rebol.
- Предметно-ориентированные языки (JetBrains MPS, XText).
Но затраченные усилия и время того стоят. Будьте общительным Мне очень повезло встретить замечательных людей.
Мои помощники помогли мне улучшить свои навыки, узнать что-то новое и увидеть мир с другой точки зрения.
Самоизоляция не принесет вам пользы в долгосрочной перспективе: вам нужно поговорить с другими людьми, чтобы понять, что они делают и о чем думают. Если ваш друг прочитал интересную статью и рассказал вам о ней, вы просто сэкономили уйму своего времени, потому что он дал вам обработанные, кристаллизованные знания.
Держитесь за увлеченных и умных людей и постарайтесь учиться у них.
Вы будете удивлены, как много вы можете узнать за обедом со своими друзьями, которые хотят поделиться подробностями своей работы или исследований.
Такое разнообразие идей является одной из главных причин, почему такие корпорации, как Google, дают вам бесплатную еду.
Спросите людей, которые лучше разбираются в коде и читают его код. Вы можете многому научиться, изучая чью-то работу.
Обзоры кода могут помочь вам научиться писать лучший код. Это, пожалуй, один из самых эффективных способов очень и очень быстро стать лучшим программистом.
Написание тестов Это настолько важно, что требует отдельной статьи.
Тестирование — неотъемлемая часть создания программного обеспечения, и даже такие ребята, как я, которые работают над формально проверенным программным обеспечением (то есть оно должно быть математически строгим), пишут тесты, хотя вы можете подумать, что гарантии, предоставляемые доказательствами, гораздо надежнее.
Я надеюсь, что это поможет кому-то получить лучшее представление, быстрее учиться и стать лучшим программистом; Если у вас есть какие-либо вопросы, я буду рад помочь.
Удачи! Теги: #программирование #обучение программированию #обучение программированию #перевод #Образовательный процесс в IT #Карьера в IT-индустрии
-
Основы Брандмауэра И Портов
19 Oct, 24 -
Что Делает Хороший Веб-Хостинг
19 Oct, 24 -
Настройка Wi-Fi В Ubuntu
19 Oct, 24 -
Кто Хочет Стать Фоторепортером?
19 Oct, 24 -
Godebug — Кроссплатформенный Отладчик Для Go
19 Oct, 24