Некоторый контекст: недавно я окончил Университет Рутгерса по специальности «Компьютерные науки». Таким образом, мне казалось правильным подумать о том, какие курсы принесли мне наибольшую пользу для получения работы.

Эта статья также создана в формате видео на YouTube.

Предисловие

Если вы хотите сразу перейти к делу, можете пропустить предисловие. Нет стыда.

Несколько вещей, которые я хочу заявить в качестве напоминаний:

  1. Информатика может казаться такой же широкой, как и сам мир. Эта широта делает этот вопрос чрезвычайно сложным. Так что имейте в виду, что это в смысле общих знаний для неспецифической роли в разработке программного обеспечения.
  2. Названия этих курсов могут различаться (например, Дискретная математика == Дискретные структуры). Так что более важным, чем название, является содержание/темы, которые я объясню и оставлю ссылки.
  3. Учителя могут многое изменить, но я постараюсь написать этот пост о полезных темах, а не о качественных учителях.
  4. Введение в информатику не в счет. Хотя это отличное начало 🙂

#1 — Структуры данных

Страница учебного плана Университета Рутгерса

Это, вероятно, не удивительно для большинства людей, читающих это. Если это так, хорошо! Вы учитесь.

Если вы не знакомы со структурами данных и еще не проходили курс, вы можете ознакомиться с ними здесь.

Некоторые примеры структур данных включают деревья, кучи, связанные списки, стеки, очереди и массивы.

Почему это полезно:

  1. Большинство вопросов во время интервью по разработке программного обеспечения потребуют от вас решения, которое реализует хотя бы одну структуру данных.
  2. Это довольно творческая область, поскольку для решения одной задачи можно использовать множество различных структур данных. Выбор, который вы делаете, может показать вашему интервьюеру, насколько вы опытны (насколько эффективен ваш ответ).
  3. Говоря об эффективности, обычно это первый класс, где вы действительно погружаетесь в эффективность алгоритмов. Хотя эти темы могут быть не важны для вашей первой стажировки или собеседования, в конечном итоге они всплывут. Когда вы начнете подавать заявки на работу с полной занятостью, эффективность вашего решения может действительно иметь значение.
  4. Вы изучаете графики. Большинство стажировок и собеседований с выпускниками не содержат графиков, но их изучение действительно поднимает планку ваших способностей. Когда вы поднимаете планку, все, что ниже ее, становится немного проще… включая древовидные структуры данных, с которыми всегда полезно иметь опыт.
  5. Наконец, я думаю, что также может быть сложно (в хорошем смысле) с этим классом, так это тяжелая рекурсия, которую необходимо использовать, особенно для древовидных структур данных. Я скажу это здесь и еще раз позже… хорошее знание рекурсии — это то, что действительно отличает хорошего инженера-программиста от великого. Это не то, что вы хотите скопировать у человека рядом с вами. Вы найдете его снова и снова на следующих уроках.

Последние мысли

Когда люди репетируют задачи интервью на Leetcode и HackerRank, они почти всегда тренируются с использованием структур данных. Что приятно, эти платформы часто также оценивают, насколько быстро ваше решение сравнивается с другими.

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

Вы можете не понимать всего о структурах данных после этого курса, но если вы продолжите использовать их в других курсах и в Интернете, вы действительно улучшите свои навыки… так что не волнуйтесь!

# 2 - Методология программного обеспечения

Страница учебного плана Университета Рутгерса

Методология программного обеспечения — невероятно расплывчатое название (спасибо Рутгерсу). В разделе «почему это полезно» вы увидите, что я объясню важные темы методологии программного обеспечения. В какой бы школе вы ни учились, вы можете увидеть, какие предлагаемые курсы преподают эти темы.

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

Почему это полезно?

  1. Изучение глубоких аспектов одного языка.
  2. Мы все изучаем операторы if и циклы. Полная специализация на одном языке действительно может помочь вам лучше понять природу программирования. Многие говорят обобщать и разнообразить. Хотя это хорошо, может быть невероятно полезно действительно изучить все тонкости одного языка. Почему? Потому что они обычно появляются в других формах на других языках. Например, как только вы тщательно изучите Java, вы узнаете массу подобных шаблонов в Python.
  3. Выполнение большого количества Java-проектов. Последовательность является ключевым моментом, если вы будете постоянно программировать, вы станете лучше. Это класс, в котором вы делаете не менее 5 проектов с визуальными элементами за один семестр.
  4. Партнерское программирование. Групповая работа в колледже — отстой, но это начало того, как может выглядеть будущее. Научитесь разделять работу и не наступать другим на пятки.
  5. Гит. Иногда с такими вещами, как Git и терминал, вам просто нужно использовать их несколько раз, пока вы не освоите их.
  6. Единый язык моделирования (UML). Разбивка больших проектов на мелкие составляющие
  7. Планирование всегда экономит много времени. Особенно когда дело касается дизайна. Когда вы начинаете строить, внесение изменений занимает очень много времени. Если вы спланируете свой дизайн заранее, вы сэкономите так много времени. Стереть строку на листе бумаги намного проще, чем менять весь код для поддержки изменения дизайна.

#3 — Проектирование и анализ компьютерных алгоритмов

Страница учебного плана Университета Рутгерса

Этот класс был похож на Data Structures на стероидах.

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

Почему это полезно:

  1. Классификация проблем На собеседованиях хорошим навыком является умение классифицировать проблемы. С классификацией, которую я изучил в этом классе (например, проблемы P против NP), я еще никогда не сталкивался. Преимущество в том, что ваш ум улучшается при анализе алгоритмов в целом. Чем больше я делал, тем больше это напоминало закономерность, и в этом ключ. Вам дают какую-то случайную задачу, и вы хорошо классифицируете ее в уме — как приступить к ее решению. Вот и все интервью.
  2. Динамическое программирование Как начинающему инженеру-программисту вам, скорее всего, их не зададут. Они намного сложнее. У них есть свой раздел на Leetcode. Однако я думаю, что выполнение более сложных задач поднимает планку того, в чем вы хороши. Это похоже на экзамен по математике в старшей школе, где ваш учитель учит всем этим сложным вещам и проводит экзамен среднего уровня. Чувствуется намного легче.
  3. Больше рекурсии От которой невозможно уйти. Я прошел через Data Structures без полного понимания.
  4. Разделяй и властвуй Стратегия решения проблем, которая, кажется, никогда не исчезнет. Вы найдете много алгоритмов, и многие решения проблем будут использовать принцип «разделяй и властвуй». Это часто всплывает в вопросах на собеседовании.

Последние мысли:

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

Что общего у всего этого?

Быстрое итеративное решение задач. Вместо одного большого проекта множество мелких.

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

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

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

Вывод

Без сюрпризов? Иногда в жизни нет. Вы просто должны делать работу.

Первоначально опубликовано на https://acityaway.io 8 июля 2019 г.