Предметы CS, которые студент должен знать [закрыто]

34

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

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

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

Каковы ваши предложения? Например, алгоритмы - это одна тема.

Карл
источник
3
Регулярные выражения основаны на теории автоматов, и это поможет вам, если вам когда-нибудь придется что-то анализировать. Я делал и изучал вещи в школе, которые не имели отношения к моей работе, но это говорит, по крайней мере, о том, над чем я работал, и о том, что я изучил. Ничто из того, что я узнал, не будет бесполезным на местах при любых обстоятельствах.
Дэвид Торнли
2
Я ненавижу работать с вашим типом ... JK (вроде). Если бы я был тобой, я бы сначала потратил время, чтобы рассмотреть то, что ты должен знать из школы - таким образом, ты не будешь выглядеть идиотом на своем следующем собеседовании. После этого я изучил бы разумное количество структур данных и алгоритмов, которые выглядят так, как будто они могут быть использованы в реальном мире. Вы должны выяснить, где вы хотите быть. Если разработчик игры, то вам, вероятно, понадобится линейная алгебра, 3d графика, вычислительная геометрия. В общем, вам нужно как минимум просмотреть данные str, alg, database, os и компилятор и продолжить обучение.
Работа
Трудно назвать конкретное приложение для теории автоматов так же, как трудно назвать конкретное приложение для арифметики. Может быть, преувеличение, но не так сильно. Диаграммы состояний часто полезны, и манипулирование ими в коде полезно для ряда целей. Деревья решений (свернутые в орграфы) являются для меня сравнительно недавним примером, и мне даже нужно было использовать модели состояний (в канонической форме) в качестве ключей для контейнеров. Если вы не видите приложений в приложениях, подумайте о добавлении слоя косвенности - генерации кода.
Steve314
1
Вы получаете множество отличных ответов по CS ниже, но я думаю, что, ограничивая свой вопрос, вы упускаете пару самых полезных вещей, которые я видел за 15 лет, прошедших с момента получения BSCS, что отличало людей которые хорошо зарекомендовали себя в отрасли: навыки общения в небольших группах и умение работать в команде. Глупо, кажется, отправляйтесь в отделение речи / языка / театра и возьмите курс, например, «общение в малых группах» или «лидерство / управление командой / группой». Даже если вы не планируете заниматься управлением, приобретенные там навыки сделают вас лучшим инженером и членом команды.
Кэбби

Ответы:

41

Хотите верьте, хотите нет, но одной из вещей, которая в последующем оказалась для меня критически важной, была конструкция компилятора. Не современная версия Namby-Pamby с использованием Lex и Yacc, вот для манекенов.

Реальная конструкция компилятора, где вы пишете свой собственный сканер символов и парсер с нуля.

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

Если бы мне пришлось подняться и поблагодарить преподавателя университетского курса по какому-либо одному предмету, это было бы так. Без этого я бы обошелся, но мои решения были бы намного ужаснее.

(И прежде чем кто-то подпрыгнет и скажет «ну, вы могли бы использовать lex и yacc ...», возможно, ответ таков - это во многом зависит от системы. В некоторых случаях языки программирования не были C (например, PL / M и Ада), в некоторых случаях для платформы не было доступно ни Lex, ни Yacc. Знание основ означает, что решение под рукой, а не ломать руки, пытаясь понять, как согнуть какой-нибудь инструмент для решения проблемы.)

quickly_now
источник
6
+1 Компиляторы были одним из моих любимых курсов в универе и всегда полезны. Я редко использовал lex / yacc / bison, основы имеют гораздо более конкретное применение.
Orbling
Я полностью согласен, хотя по другой причине. Знакомство с тем, как писать генератор кода - хотя я использовал Lex и Yacc - было моим первым и лучшим погружением в объектно-ориентированное программирование.
Питер Тернер
Вы можете (и должны также знать, как это сделать) написать генератор кода на простом C или на каком-либо другом языке, отличном от OO. Затем это урок написания очень больших частей процедурного кода и разбиения парсера / сканера / генерации кода на осмысленные и понятные фазы.
quick_now
+1 Компиляторы включают в себя так много шаблонов и принципов, что после того, как вы это сделали, вы сможете увидеть дизайн и код в совершенно ином свете.
Эндрю Финнелл
2
«Это то, что я думал, что никогда, никогда не буду использовать снова». Если бы у меня был доллар за каждый раз, я говорил это себе, когда был моложе ....
Ник Шпрайцер,
37
  1. Структуры данных / алгоритмы, особенно графики. Количество реальных ситуаций, в которых мне удалось использовать алгоритмы, связанные с графами, меня удивило. Сосредоточьтесь на знании характеристик, когда структура данных или алгоритм уместен. Например, важно видеть проблему и знать, как использовать динамическое программирование / жадный алгоритм, и это может сэкономить вам много времени.

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

  3. Концепции ОС. Управление памятью, планировщики и т. Д. Каждый разработчик должен иметь четкое представление об операционных системах, учитывая, что код, который вы пишете, постоянно взаимодействует с ним.

  4. NetSec. Я сталкивался с очень немногими разработчиками, которые хорошо понимают основные проблемы безопасности при разработке (переполнение буфера, xss, SQLI и т. Д.). Это действительно необходимо, если вы хотите быть успешным в отрасли. Было бы здорово, если бы вы могли написать следующую важную вещь, но у вас не будет много пользователей долго, если вы не защитите их данные.

  5. Парадигмы программирования. Знать характеристики и различия между ОО / функциональным / процедурным программированием. Один из лучших уроков для старшекурсников, который у меня когда-либо был, - написание простых 20 интерпретаторов инструкций для фортана, схемы, пролога и т.д. на самих языках. Само разоблачение действительно может помочь вам понять фундаментальные концепции разработки программного обеспечения.

Куртис
источник
1
+1 Весь список в значительной степени необходим, (4) особенно важен в современную распределенную эпоху.
Orbling
1
+1 на структуры данных / графики. Число программистов, которых я знаю, которые не знают, как правильно использовать Hashtable, или почему Связанный список вместо простого массива в некоторых случаях удивляет меня каждый день.
Мачадо
+1 за программирование парадигм. Хорошее понимание контрастов между разными типами языков очень помогает.
apoorv020
19

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

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

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

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

  3. Как писать - письменные навыки общения необходимы, будь то работа в промышленности или в научных кругах. Лучше всего, если вы найдете курс по механике, а не курс по письму, который фактически посвящен другой теме. То есть многие школы попытаются сделать курсы письма более актуальными или интересными, если речь пойдет о специальной теме. Попробуйте перейти на «скучную» версию курса.

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

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

  6. Проблема остановки - Большинство проблем не могут быть решены с помощью машин. Это довольно глубокая идея, что наша культура впитала так хорошо, что больше не звучит шокирующе. То же самое касается радио, Геделя и атомной бомбы; только после постмодернистского искусства и холодной войны мы снова смогли справиться с этими концепциями. Тем не менее, прохождение курса теории вычислимости может привести вас к этому удивительному доказательству.

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

  8. P и NP - ОК, этот уже на вашем критическом пути, но все равно обратите внимание. Вы хотите быть уверены, что можете исправить кого-то, когда они неправильно называют NP «неполиномиальным». Как будто!

  9. Темы из курса, который вы наверняка ненавидите - это может быть курс CS, который вы считаете слишком низкоуровневым, слишком теоретическим, или курс, не связанный с CS, который вы считаете слишком нежелательным, слишком сложным или слишком скучным , Если такой курс кажется вам проблемой, и вы обнаруживаете, что объясняете другим, почему вы так рады, что вам не нужно проходить то-то и то-то, это должно сказать вам, что вы многому научитесь взяв курс! Возможно, вы не будете изучать материалы курса, но вы узнаете о своих собственных ограничениях и, возможно, больше об оправданиях, которые вы делаете для себя. [Подсказка: они обычно слабы.]

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

Мой подход здесь был практичным, основан на курсах, которые вы действительно можете пройти. И я сосредоточился на учебных целях, которые, вероятно, будут изучены. Примечание. Этот ответ был взят из моего блога на тему « Десять вещей, которые должен изучать каждый специалист по информатике» .

оборота Макнейл
источник
Объяснение для downvote было бы полезно. Возможно, я могу изменить свой ответ, и тогда вы можете изменить свое мнение.
Макнейл
Профессор, я бы не стал голосовать за ваш ответ, но есть одна вещь, с которой я не согласен. Написание доказательств. До сих пор я не могу написать Дискретное доказательство, если вы не попросите меня доказать, что число нечетное или четное. Я не вижу связи между этим и отраслью. Может быть, я пропускаю «Аспект решения проблем?». Я никогда не смог бы обернуть свой мозг вокруг математической индукции или леммы прокачки. Я не думаю, что это замедляет меня.
Брайан Харрингтон
Написание доказательства похоже на написание программы. Например, изучение того, как доказать, что * 0 = 0, похоже на математический анализ FizzBuzz (ну, возможно, это немного сложнее). Поначалу это кажется пугающим, но вскоре вы начинаете понимать маленькие хитрости, как и при обучении программированию. Доказательства могут иметь разные структуры, которые помогут вам рекурсивно и структурно мыслить. Как я уже сказал, дискретный курс математики не позволяет изучать реальные доказательства. Вам нужна теория групп или реальный анализ для этого.
Макнейл
Хотя знание комплиментов, безусловно, полезно, я считаю, что знание комплиментов в большей степени относится к экономике.
ijw
1
@ijw: Что касается экономики для студентов CS, у Джоэля есть хорошая дискуссия, которую стоит прочитать: joelonsoftware.com/articles/CollegeAdvice.html
Macneil
8

После разговора с несколькими представителями компании и друзьями, у которых было много интервью:

  • Базы данных
  • OOP
  • Алгоритмы
  • Структуры данных

как правило, "необходимость" для новых сотрудников (или, как они сказали, "очень рекомендуемые" курсы).

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

Надеюсь, это поможет!

K-RAN
источник
1
Согласился бы с ООП и структурами данных.
apoorv020
4
Основные структуры данных ... ооооооооооо важно. Думаю, более важно, чем ООП. Вы должны уметь думать о том, как хранить и организовывать информацию. И если во встроенной системе структура ваших данных в памяти - это жизнь или смерть.
quick_now
3
+1 для математических классов. Они также помогают вам научиться отслеживать большие проблемы / системы.
Майкл К
1
Сеть также хороша.
Keyo
ООП? Вы можете программировать на Haskell или C без ООП ... Я дам вам, что он широко используется, но я не думаю, что это фундаментально. С другой стороны, воздействие различных парадигм представляется весьма полезным.
Матье М.
6

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

Я пришел со встроенного фона. Каждый человек, с которым я работаю, имел либо степень EE, либо степень CE, и это отчасти потому, что когда «стариков» в колледже не было так много программ CE. Таким образом, совершенно очевидно, что если вы хотите работать во встроенном поле, аппаратный фон желателен.

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

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

Pemdas
источник
+1, потому что степень информатики дает вам опыт с широким спектром предметов / технологий. Только обязательно обратите внимание на курс разработки программного обеспечения.
Мистер Муравей
+1 Для сборки всегда мудро понимать, что происходит внизу стека. Было бы неплохо, если бы все тоже знали аппаратное обеспечение, но для многих это было бы слишком далеко.
Orbling
5

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

  1. Структура данных
  2. Алгоритм анализа
  3. Объектно-ориентированного программирования
  4. Либо конкретный курс в C ++ или Java
  5. Операционные системы
  6. Дизайн пользовательского интерфейса
  7. Параллельное программирование

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

  1. Теория конечных языков и автоматов
  2. Конструкция компилятора
  3. Теория графов
  4. Искусственный интеллект
Fanatic23
источник
Не просто перечислите набор курсов, которые, по вашему мнению, являются необходимыми, укажите причины и опыт, которые вы определили в своем списке.
2

Я бы также добавил в список «Разработка программного обеспечения» или «Практикум проектирования», хотя их содержание обычно выбирают учащиеся отрасли.

Кроме того, по моему мнению (хотя это не подкреплено большим опытом), компании на самом деле не хотят, чтобы большинство теоретических вещей преподавали на таких курсах, как базы данных и т. Д., Они хотят, чтобы люди понимали и могли использовать эти вещи.

РЕДАКТИРОВАТЬ: Из-за downvote, я чувствую, как объяснить свой ответ. Я студент последнего года обучения информатике, и мой опыт основан на моих стажировках и собеседованиях с ведущими компаниями в этой области. По моему опыту, людям редко требуется использовать сложные алгоритмы или кодировать очень сложные структуры данных в интервью или на рабочих местах.

Более полезно, если вы можете создавать и использовать базы данных, использовать контроль исходного кода, знать, как правильно отлаживать, знать, как использовать шаблоны проектирования и т. Д. Однако, как я уже говорил, эти навыки обычно приобретаются в отрасли и не рассматриваются в курсах. Практика разработки программного обеспечения / проектирования обычно включает в себя создание проекта среднего размера, что очень полезно для изучения всех тезисов.

оборота apoorv020
источник
Пожалуйста, расскажите подробнее о вашем опыте и о том, почему кто-то должен пройти эти курсы.
@Mark: Можете ли вы объяснить обоснование downvote?
apoorv020
@ apoorv020, не объясняя, почему вы рекомендуете разработку программного обеспечения или методы проектирования, ваш ответ бесполезен. Ваше редактирование до сих пор не объясняет, почему вы их рекомендуете.
@ apoorv020 единственная ценность, которую вы можете получить, чтобы использовать Software Engineering или Design Practices - это то, что вы обычно создаете проект среднего размера (что бы это ни значило)? Чему вы лично научились на этих курсах?
Их приятно знать, но это не предметы CS.
Томас Оуэнс
2

Вещи, которые я узнал в колледже, которые я использую каждый день:

  • Методология объектно-ориентированного проектирования
  • Шаблоны проектирования
  • Регулярные выражения
  • Основные алгоритмы и анализ
  • Структуры данных

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

Я должен был пройти несколько курсов по математике. Я не использовал исчисление, так как я закончил. Я бы хотел пройти курс статистики. (Опять же, я поднял достаточно, чтобы обойтись после окончания, но я хотел бы знать больше.)

Помимо отдела CS, взять письменный курс. Хорошие письменные навыки общения необходимы для успеха.

ПвК
источник
+1 Удивлен, что базы данных не были обязательными в вашем курсе, как правило, считается важным компонентом.
Orbling
Это было. Я выбрался из-за технических соображений и пожалел об этом.
PWC
@ Orbling: Часто в небольших отделениях (в отличие от крупных в государственных школах) просто не хватает лекторов, чтобы требовать каждую основную тему. В моей школе, например, базы данных были факультативными.
Макнейл
@Macneil: На моем курсе основным курсом по базам данных было предварительное условие (охватывающее все основы: моделирование ER, нормальные формы, SQL (не только базовый SQL, составной / вложенный и т. Д.), Размещение индекса и т. Д.), Последнее, более сложное курсы баз данных были факультативными (я думаю, что их было всего три). Я никогда не выбирал их, так как полагал, что это вещи, которые я мог усвоить самостоятельно легче, чем другие курсы, которые я пропустил. Думаю, я взял расширенный ИЛИ вместо этого.
Orbling
@pwc: Могу поспорить, ты помнишь, почему ты вышел из этого, а не как?
Orbling
2

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

  • Структуры данных и алгоритмы

    Практически все в вычислениях возвращается к обработке данных с использованием алгоритмов. Обратите особое внимание на массивы и хеш-таблицы, поскольку они, безусловно, являются наиболее полезными структурами данных в общем использовании, но списки, деревья и графы (ну, списки - это ограниченные типы деревьев, а деревья - ограниченные типы графиков) также важно. Более того, понимание алгоритмов жизненно важно для создания кода, который не является ужасным. (В противном случае вы будете делать вещи, которые просто ужасны, например, использовать алгоритм O ( n 3 ), который будет выполнять O ( n log n ).) Если у вашей степени CS нет обязательного курса DS + A, это не CS. Или разработка программного обеспечения. Или даже просто программирование.

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

  • совпадение

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

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

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

Donal Fellows
источник
1

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

Если вы хотите подготовить себя к реальному миру, в дополнение к тому, что @ K-Ran рекомендует выше, я предлагаю прочитать Code Complete и использовать его в качестве основы для более глубокого изучения любых тем, которые вы считаете трудными или не чувствуете, что имеете достаточно покрыты.

glenatron
источник
Иногда я находил формальные методы полезными, хотя, очевидно, только на небольших компонентах. Я думал о Дейкстре и соавт. сказать что-то вроде: «Если вы идеальный математик, вы можете быть хорошим программистом».
Дэвид Торнли
Я подозреваю, что если вы работаете над кодом, жизнь которого будет зависеть от того, что вам нужно иметь полное представление об этом. Но для работы, которую я сделал, это никогда не было необходимо. Если бы мне это было нужно сейчас, мне пришлось бы вернуться и заново
изучить
Такие вещи, как Z, действительно используются только для критически важных программ в организациях, где, как вы говорите, жизнь подвергается риску. Тем не менее, я думаю, что изучение их привносит гораздо большее понимание правильности кода и дает глубину, чтобы полностью вернуться к спецификации всех видов. Иногда то, что вы изучаете, не само по себе, а помогает понять, что стоит выше.
Orbling
Думайте об этом как о создании больших строительных блоков, которые являются твердыми. Если вы доказали правильность своих компонентов (и проверили их, чтобы найти глупые ошибки, которые вы допустили при разработке и проверке), у вас будет меньше поводов для беспокойства при написании и отладке.
Дэвид Торнли
1

Я думаю, что вы должны изучить следующее:

Операционная система: - Даже если вам может не потребоваться, чтобы она работала программистом, но стоит знать, как работает операционная система, и это ожидается от выпускника CS. Любая хорошая книга может помочь.

ООП: - Это хлеб с маслом. Обязательно. Книги, если вы хотите спросить: Ваша первая книга должна быть: - Направляй сначала OOAD, затем ты можешь пойти за книгой Грэди Буча и Ивара Якобсона

Структуры данных и алгоритмы: - Очень важно развивать логическое мышление и мышление.

Для меня этого достаточно. Никогда не поздно. :)

Аби
источник
1

Как человек, который регулярно проводит собеседования с кандидатами на работу по программированию, и тот, кто после работы в отрасли более 12 лет чувствует себя достаточно хорошо, я бы предложил следующее

  • Дизайн базы данных и SQL: Удивительно, как много программистов не знают простого SQL, и те, кто обладает хорошими навыками SQL, неоценимы. Чтобы иметь возможность проектировать хорошую базу данных, может быть бесполезным в компании, которая имеет заданную структуру базы данных, для стартапов и компаний, проходящих через изменения, это ОБЯЗАТЕЛЬНО!
  • Шаблоны проектирования. Они просто помогут вам принять правильное решение о хорошем дизайне
  • ООП: Обычно это предварительное требование для большинства курсов, но это поможет.
  • Алгоритмы: потому что мало кто знает, что такое рекурсия, не говоря уже о том, когда она может спасти их от сложного кодирования
  • Структуры данных: большинство современных языков имеют дело с этим для вас, но понимание их является ключом к хорошему дизайну.

Затем, некоторые внеклассные работы, читать:

  • Сертификация типа книг. Они часто учат вас синтаксису и типам операторов. Гораздо важнее ЗНАТЬ, почему вы что-то делаете, а не «потому что это работает», что так часто встречается.
Codemwnci
источник
1

ЭТО ЗАВИСИТ , на этот вопрос нет ни одного хорошего ответа.

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

Теперь есть программное обеспечение всех видов. Например, используя википедию в качестве источника обобщения, мы можем встретить 3 великих обобщения :

  • системное программирование
  • программное обеспечение для программирования
  • программное обеспечение

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

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

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

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

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

Как ты кисло научился в теоретической информатике! ты пройдешь эти курсы? :П

Например, вы узнали, что весь компьютерный язык может быть приспособлен к набору вычислимых математических функций, и, например, если ваш опыт пойдет по тому же пути, что вскоре вы почувствуете себя неловко в этом небольшом наборе исчислений и, как и я, вы сможете начать понимать, как развиваются Программное обеспечение не так привлекательно и удивительно, потому что тот же самый DESIGN PATTERN возвращается снова и снова (вы проходили курсы по разработке шаблонов?), и, например, вы можете начать проявлять больший интерес к ПОЧЕМУ и КАК язык может быть переведен в математическую функцию и начинает узнать, что компьютерный язык не так уж и сложен! Например, вскоре вы можете быть более удивлены личностью и психологией, и вы можете получить больше интереса к этому и стать хорошим менеджером проекта! Вы проходите курсы по жизненному циклу программного обеспечения?

Итак, какой курс должен быть в вашей карьере в CS?

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

в информатике неправильное чувство реальности. например, ученый иногда очень далеко от разработчика программного обеспечения.

взгляните на объяснение википедии.

веселиться с life :)

мои 2 цента.

извините за мой действительно плохой английский.

Боос
источник
1

Подберите номер один, на котором студенты CS должны свободно владеть английским языком.

Без понимания устного и письменного английского языка вы навсегда останетесь в невыгодном положении.

Просто посмотрите на множество вопросов, которые приходят на сайтах стека. Слишком многие из них трудно расшифровать. Некоторые люди используют смесь l33t, текстовые сообщения (не уверен, правильный термин). Другие делают заявление и просто добавляют знак вопроса, пропуская важные мысли, такие как глаголы или прилагательные.

Если вы не можете общаться, вы не сможете понять себя, а тем более понять, что говорят другие.

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

Не я
источник
1

Я подхожу к этому с несколько иной точки зрения, потому что я не получил высшее образование в области CS, я получил высшее образование в области электроники (с небольшим в бизнесе)

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

То, что я бы сказал, я подобрал и считаю полезным:

  • Проектирование СУБД - СУБД находятся за большинством систем и сайтов, и вы должны хотя бы понять основы того, что происходит (я узнал об этом на работе).
  • Базовый дизайн пользовательского интерфейса - все лучшие программисты, с которыми я работал, могли бы создать удобное в использовании приложение, которое не было бы ужасным. За исключением одного, но он является исключением, которое подтверждает правило.
  • Некоторое базовое программирование - и я имею в виду базовое. Я выучил немного языка C (для обработки изображений и встроенных систем), немного языка ассемблера (который я забыл через несколько недель после окончания курса) и немного Pascal (базовый курс по вычислительной технике был стандартным для всех инженеров). Когда я беру интервью, я ошеломлен тем, как мало выпускников CS могут действительно программировать любым способом, который коммерческие организации сочли бы полезным, поэтому я не ожидаю многого, но я ожидаю, что они знают основы.
  • Логика - я изучил это с помощью цифровой электроники, математики с помощью теории, выпускников CS с помощью программирования, но как бы вы это ни изучали, вы должны хорошо это понимать, так как многое сводится к этому.
  • Коммуникативные навыки - я прошел пару курсов в университете за пределами моей реальной степени, презентационных навыков и уверенности в себе. Много здравого смысла, но никогда не бывает больно говорить разумные вещи несколько раз.
  • Основы бизнеса и бухгалтерского учета. Некоторые программисты действуют так, как будто это не имеет значения, но, на мой взгляд, это важно для любого, кто работает в компании - так работает игра, и она будет контролировать вашу жизнь, так почему бы вам не захотеть узнать хотя бы основы как и почему все происходит?

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

Джон Хопкинс
источник
0

Я бы также добавил в этот список некоторые базовые курсы по кадрам / психологии.

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

Знай своего врага, чтобы защитить себя.

Питер Бернье
источник
-1

1-й год:

  1. Базовый ООП на языке высокого уровня
  2. Структуры данных

2-й год:

  1. Компилятор, вы строите простую форму с нуля
  2. совпадение

3-й год:

  1. Алгоритм
  2. Операционная система, вы добавляете функциональные возможности и улучшения к простой
  3. Формальный язык

4-й год:

  1. сетей
  2. Распределенная Система
  3. Пользовательский интерфейс
  4. Расширенный компилятор
  5. Усовершенствованная операционная система
  6. Искусственный интеллект
  7. Компьютерная графика

Эти курсы должны предоставить много теории и практики кодирования.

Тьерри Лам
источник
-2

Странно, что никто не упомянул компьютерную архитектуру.

Sorantis
источник
Я думаю, что компьютерной архитектуре важно знать, хотите ли вы понять влияние
кешей