В колледже я никогда не интересовался теорией. Я никогда не читаю это. Независимо от того, сколько я старался, я не мог читать вещи и не знал, что на самом деле происходит на самом деле. Как, например, в моем курсе теории автоматов, мой профессор рассказал мне все, что возможно, касалось его математического аспекта, но ни разу не упомянул, где он будет использоваться практически. Это всего лишь пример.
Мне удалось пройти мой колледж и также стажироваться в компании, где я занимался проектом, и, к счастью, они не беспокоились о моих оценках, так как они были выше среднего.
Теперь мне интересно знать, по каким предметам студент CS обязательно должен быть абсолютно и положительно осведомлен? Предметы, которые могут иметь отношение к отрасли. Это потому, что у меня есть немного свободного времени, и это поможет мне лучше понять их.
Каковы ваши предложения? Например, алгоритмы - это одна тема.
Ответы:
Хотите верьте, хотите нет, но одной из вещей, которая в последующем оказалась для меня критически важной, была конструкция компилятора. Не современная версия Namby-Pamby с использованием Lex и Yacc, вот для манекенов.
Реальная конструкция компилятора, где вы пишете свой собственный сканер символов и парсер с нуля.
Это то, что я думал, что никогда, никогда не буду использовать снова. Но за последние 20 лет этот курс доказал свой вес в золоте в 4 раза. Всегда, когда мне приходилось писать командный процессор, каждый сканер входящих сообщений, каждый диспетчер пользователей, каждый интерпретатор сценариев использовали принципы этого курса. Делай так, и жизнь сладка, понятна и проста. И я даже передал всю информацию коллеге, который этого не сделал - он должен был написать компилятор для абстрактной машины. То, что я мог бы добавить, стало очень коммерчески успешным.
Если бы мне пришлось подняться и поблагодарить преподавателя университетского курса по какому-либо одному предмету, это было бы так. Без этого я бы обошелся, но мои решения были бы намного ужаснее.
(И прежде чем кто-то подпрыгнет и скажет «ну, вы могли бы использовать lex и yacc ...», возможно, ответ таков - это во многом зависит от системы. В некоторых случаях языки программирования не были C (например, PL / M и Ада), в некоторых случаях для платформы не было доступно ни Lex, ни Yacc. Знание основ означает, что решение под рукой, а не ломать руки, пытаясь понять, как согнуть какой-нибудь инструмент для решения проблемы.)
источник
Структуры данных / алгоритмы, особенно графики. Количество реальных ситуаций, в которых мне удалось использовать алгоритмы, связанные с графами, меня удивило. Сосредоточьтесь на знании характеристик, когда структура данных или алгоритм уместен. Например, важно видеть проблему и знать, как использовать динамическое программирование / жадный алгоритм, и это может сэкономить вам много времени.
Рабочие знания вычислительной сложности. Вам не обязательно знать, что такое нижняя граница радикальной сортировки, но знать, как определить, какое наихудшее время выполнения того, что вы пишете, важно, особенно для проектов, критичных к производительности.
Концепции ОС. Управление памятью, планировщики и т. Д. Каждый разработчик должен иметь четкое представление об операционных системах, учитывая, что код, который вы пишете, постоянно взаимодействует с ним.
NetSec. Я сталкивался с очень немногими разработчиками, которые хорошо понимают основные проблемы безопасности при разработке (переполнение буфера, xss, SQLI и т. Д.). Это действительно необходимо, если вы хотите быть успешным в отрасли. Было бы здорово, если бы вы могли написать следующую важную вещь, но у вас не будет много пользователей долго, если вы не защитите их данные.
Парадигмы программирования. Знать характеристики и различия между ОО / функциональным / процедурным программированием. Один из лучших уроков для старшекурсников, который у меня когда-либо был, - написание простых 20 интерпретаторов инструкций для фортана, схемы, пролога и т.д. на самих языках. Само разоблачение действительно может помочь вам понять фундаментальные концепции разработки программного обеспечения.
источник
Чтобы быть лучшим специалистом по информатике, вам не обязательно соответствовать требованиям для получения диплома. Для типичной учебной программы колледжа, вот десять лучших вещей, которые вы должны обязательно изучить:
Основы экономики - вводный курс, охватывающий такие темы, как дополнения и заменители , жизненно важен для работы в большой экономике или просто для ее понимания. В то время как концепция Giffen Good не обязательно поможет вам, знание внешних факторов поможет. Это также может помочь вам понять, что больше ситуаций беспроигрышно, чем вы могли себе представить.
Как написать доказательство - Все специалисты по информатике должны знать, как написать доказательство. И дискретная математика, хотя и является частью хорошо сбалансированного завтрака, не считается. [Индукция - это всего лишь один метод доказательства, и вы можете обойтись, не зная на самом деле много о доказательствах.] Для написания доказательств необходим курс по алгебре или реальному анализу. И под алгеброй я имею в виду теорию групп или абстрактную алгебру, а не курс, который вы прошли в старшей школе. Для полной выгоды возьмите алгебру и реальный анализ в одном и том же термине.
Почему доказательство важно? Потому что это программирование! Подумайте, когда вы впервые узнали, как программировать: если задача требовала
if
и цикл, у вас, возможно, не было какой-либо интуиции о том, где их разместить по отношению друг к другу. Но теперь та же задача будет чувствовать себя совершенно естественно. Написание доказательства очень похоже. Есть ряд трюков, которые вы изучаете, и как только вы изучаете их, все выглядит совсем по-другому.Как писать - письменные навыки общения необходимы, будь то работа в промышленности или в научных кругах. Лучше всего, если вы найдете курс по механике, а не курс по письму, который фактически посвящен другой теме. То есть многие школы попытаются сделать курсы письма более актуальными или интересными, если речь пойдет о специальной теме. Попробуйте перейти на «скучную» версию курса.
Вероятность и статистика - Есть некоторые вещи, которые вы только правильно поймете, пройдя курс. Вместе с основными требованиями CS (которые должны дать вам дискретную математику, исчисление одной переменной и нескольких переменных и линейную алгебру), а также алгеброй и / или реальным анализом, сбор статистики, вероятно, даст вам небольшую часть по математике. Изучение статистики может помочь вам работать с другими учеными над их проектами.
Актуальная тема - в предыдущие десятилетия это могли быть базы данных или объектно-ориентированное программирование. Сегодня это может быть веб-программирование или сервис-ориентированная архитектура. Какой бы ни была текущая причуда, обязательно изучите ее. Если только посмотреть, о чем эта причуда.
Проблема остановки - Большинство проблем не могут быть решены с помощью машин. Это довольно глубокая идея, что наша культура впитала так хорошо, что больше не звучит шокирующе. То же самое касается радио, Геделя и атомной бомбы; только после постмодернистского искусства и холодной войны мы снова смогли справиться с этими концепциями. Тем не менее, прохождение курса теории вычислимости может привести вас к этому удивительному доказательству.
Чистое функциональное программирование. Скорее всего, вы не пойдете на чисто функциональное программирование, если не будете заниматься его исследованиями или работать в нескольких избранных компаниях, но знание этого поможет вам стать лучшим программистом. Причина в том, что вы изучите много новых форм абстракции, и такие понятия, как числа и продолжения Церкви, монады и, да, рекурсия, и эти инструменты могут быть применены и к вашей следующей Java-программе.
P и NP - ОК, этот уже на вашем критическом пути, но все равно обратите внимание. Вы хотите быть уверены, что можете исправить кого-то, когда они неправильно называют NP «неполиномиальным». Как будто!
Темы из курса, который вы наверняка ненавидите - это может быть курс CS, который вы считаете слишком низкоуровневым, слишком теоретическим, или курс, не связанный с CS, который вы считаете слишком нежелательным, слишком сложным или слишком скучным , Если такой курс кажется вам проблемой, и вы обнаруживаете, что объясняете другим, почему вы так рады, что вам не нужно проходить то-то и то-то, это должно сказать вам, что вы многому научитесь взяв курс! Возможно, вы не будете изучать материалы курса, но вы узнаете о своих собственных ограничениях и, возможно, больше об оправданиях, которые вы делаете для себя. [Подсказка: они обычно слабы.]
Курс без CS, который вы обязательно полюбите - В конце концов, вы должны повеселиться. Это курс, который вы, вероятно, получите меньше всего, но все равно возьмите его. Сделай это один раз. Если вам нравятся многие курсы, тогда это хорошо для вас, но убедитесь, что это не мешает освещать остальные курсы в этом списке.
Мой подход здесь был практичным, основан на курсах, которые вы действительно можете пройти. И я сосредоточился на учебных целях, которые, вероятно, будут изучены. Примечание. Этот ответ был взят из моего блога на тему « Десять вещей, которые должен изучать каждый специалист по информатике» .
источник
После разговора с несколькими представителями компании и друзьями, у которых было много интервью:
как правило, "необходимость" для новых сотрудников (или, как они сказали, "очень рекомендуемые" курсы).
Другие полезные курсы - это компьютерная безопасность, сборка и машинная архитектура. Многие из моих профессоров тоже рекомендовали мне курс по компилятору. Кроме того, если у вас есть время, я очень рекомендую математические курсы, такие как теория графов, дискретная математика и комбинаторика. Вы изучаете много умственных способностей в тех классах, которые большинство курсов по CS затушевывают, но в конечном итоге они очень полезны при написании очень сложных программ.
Надеюсь, это поможет!
источник
Это во многом зависит от того, что вы планируете делать со степенью. Похоже, что большинство специализаций CS в конечном итоге становятся разработчиками программного обеспечения. Имея это в виду, я действительно не уверен, почему больше людей не занимаются разработкой программного обеспечения. Я подозреваю, что программ для разработки программного обеспечения недостаточно, особенно в государственных учреждениях.
Я пришел со встроенного фона. Каждый человек, с которым я работаю, имел либо степень EE, либо степень CE, и это отчасти потому, что когда «стариков» в колледже не было так много программ CE. Таким образом, совершенно очевидно, что если вы хотите работать во встроенном поле, аппаратный фон желателен.
Однако, независимо от области, в которой вы хотите работать, я считаю, что каждый программист должен пройти курс обучения программированию. Вы можете никогда не использовать его, но он научит вас, что именно происходит на уровне процессора во время вызова функции, как обрабатываются прерывания, как структурируется память или как используются разные режимы адресации. Я верю, что все это сделает вас лучшим программистом.
Кроме того, хотя это может быть неочевидным, поэтому некоторые из них являются важными темами при рассмотрении структур данных и алгоритмов для конкретной платформы.
источник
Есть 2 способа ответить на ваш вопрос. Позвольте мне попробовать оба. Первый способ - взглянуть на вещи с точки зрения потенциального рынка труда, навыков кодирования и т. Д. Итак, вот мой список:
Второй способ - смотреть на вещи с некоторой абстрактной точки зрения, и, кто знает, может быть немного философским. Приведенный ниже список может не обладать самыми горячими навыками, которые требуются рынку труда, но я уверен, что к моменту выхода из этих курсов у вас появится более глубокое понимание искусства разработки программного обеспечения.
источник
Я бы также добавил в список «Разработка программного обеспечения» или «Практикум проектирования», хотя их содержание обычно выбирают учащиеся отрасли.
Кроме того, по моему мнению (хотя это не подкреплено большим опытом), компании на самом деле не хотят, чтобы большинство теоретических вещей преподавали на таких курсах, как базы данных и т. Д., Они хотят, чтобы люди понимали и могли использовать эти вещи.
РЕДАКТИРОВАТЬ: Из-за downvote, я чувствую, как объяснить свой ответ. Я студент последнего года обучения информатике, и мой опыт основан на моих стажировках и собеседованиях с ведущими компаниями в этой области. По моему опыту, людям редко требуется использовать сложные алгоритмы или кодировать очень сложные структуры данных в интервью или на рабочих местах.
Более полезно, если вы можете создавать и использовать базы данных, использовать контроль исходного кода, знать, как правильно отлаживать, знать, как использовать шаблоны проектирования и т. Д. Однако, как я уже говорил, эти навыки обычно приобретаются в отрасли и не рассматриваются в курсах. Практика разработки программного обеспечения / проектирования обычно включает в себя создание проекта среднего размера, что очень полезно для изучения всех тезисов.
источник
Вещи, которые я узнал в колледже, которые я использую каждый день:
Я бы хотел пройти курс обучения по базе данных. (Я подобрал достаточно, чтобы обойтись с тех пор, как закончил, но мне хотелось бы знать больше.) Я также хотел бы, чтобы преподавали контроль версий - это повсеместно, чрезвычайно полезно и полностью игнорировалось в школьной программе.
Я должен был пройти несколько курсов по математике. Я не использовал исчисление, так как я закончил. Я бы хотел пройти курс статистики. (Опять же, я поднял достаточно, чтобы обойтись после окончания, но я хотел бы знать больше.)
Помимо отдела CS, взять письменный курс. Хорошие письменные навыки общения необходимы для успеха.
источник
Есть много важных курсов, в зависимости от того, в каком направлении вы планируете идти. Однако, если вы можете программировать вообще, самый важный курс должен быть:
Структуры данных и алгоритмы
Практически все в вычислениях возвращается к обработке данных с использованием алгоритмов. Обратите особое внимание на массивы и хеш-таблицы, поскольку они, безусловно, являются наиболее полезными структурами данных в общем использовании, но списки, деревья и графы (ну, списки - это ограниченные типы деревьев, а деревья - ограниченные типы графиков) также важно. Более того, понимание алгоритмов жизненно важно для создания кода, который не является ужасным. (В противном случае вы будете делать вещи, которые просто ужасны, например, использовать алгоритм O ( n 3 ), который будет выполнять O ( n log n ).) Если у вашей степени CS нет обязательного курса DS + A, это не CS. Или разработка программного обеспечения. Или даже просто программирование.
Кроме того, курс, который я нашел наиболее полезным за эти годы в нескольких областях, был:
совпадение
У параллелизма есть много аспектов, но я ожидаю понимания различий между разделяемой памятью и передачей сообщений. Я также хотел бы, чтобы был сильный охват стратегий блокировки (мьютексы, семафоры и т. Д.) И транзакций.
Это, конечно, жизненно важно для понимания распараллеливания, но оно также важно для всего, что распространяется (например, для написания службы, доступной через Интернет, даже если она однопоточная, поскольку клиенты в любом случае будут асинхронными). Я понимаю, что это также полезно для написания игр (которые обычно многопоточные) и работы со встроенными устройствами.
Кроме того, я думаю, что в интересах большинства магистрантов, чтобы они познакомились с как можно большим количеством различных идей. Много языков программирования и парадигм. Много разных областей применения. Разумное количество математики (опять же, потому что это очень часто полезно), а также некоторая подверженность человеческим факторам и психологии (потому что любое программное обеспечение, которое взаимодействует с пользователями, имеет дело с людьми). В конце концов, вы никогда точно не знаете, чем будете заниматься в будущем, поэтому планирование гибкости - это отличная жизненная стратегия.
источник
Когда я учился в колледже, было довольно много тем, которые я не мог использовать в своей реальной жизни, и иногда эта интуиция была доказана правильной (формальные методы действительно практичны только для тривиальных проблем в большинстве случаев), а в других случаях было совершенно неверно (нотация Big-O очень полезна), поэтому я думаю, что в целом мое младшее я было частично правым.
Если вы хотите подготовить себя к реальному миру, в дополнение к тому, что @ K-Ran рекомендует выше, я предлагаю прочитать Code Complete и использовать его в качестве основы для более глубокого изучения любых тем, которые вы считаете трудными или не чувствуете, что имеете достаточно покрыты.
источник
Я думаю, что вы должны изучить следующее:
Операционная система: - Даже если вам может не потребоваться, чтобы она работала программистом, но стоит знать, как работает операционная система, и это ожидается от выпускника CS. Любая хорошая книга может помочь.
ООП: - Это хлеб с маслом. Обязательно. Книги, если вы хотите спросить: Ваша первая книга должна быть: - Направляй сначала OOAD, затем ты можешь пойти за книгой Грэди Буча и Ивара Якобсона
Структуры данных и алгоритмы: - Очень важно развивать логическое мышление и мышление.
Для меня этого достаточно. Никогда не поздно. :)
источник
Как человек, который регулярно проводит собеседования с кандидатами на работу по программированию, и тот, кто после работы в отрасли более 12 лет чувствует себя достаточно хорошо, я бы предложил следующее
Затем, некоторые внеклассные работы, читать:
источник
ЭТО ЗАВИСИТ , на этот вопрос нет ни одного хорошего ответа.
Программист - это общий мир, позволяющий идентифицировать человека, который пишет компьютерные программы.
Теперь есть программное обеспечение всех видов. Например, используя википедию в качестве источника обобщения, мы можем встретить 3 великих обобщения :
В первой области системного программирования разрабатывают драйверы устройств, операционную систему, серверы, поэтому, например, вы можете следовать курсу операционной системы.
а как насчет программного обеспечения для программирования ? здесь, как написала википедия, вы можете кодировать компиляторы, отладчики, интерпретаторы, компоновщики, текстовые редакторы, поэтому курс по теории автоматизации, теории языка, языку и компиляторам может быть полезен.
Не можем ли мы говорить о прикладном программном обеспечении любого вида:
- видеоигры: алгебра, физика, объектно-ориентированные курсы?
- математическое обеспечение: математические курсы?
- редактирование изображений: математика, физика, алгоритм курсов?
- промышленная автоматизация: математика, физика, алгоритм, курсы робототехники?
- медицинское программное обеспечение: биология, медицинский, какой еще курс?
- много вещей здесь: много курсов здесь.
Как вы видите, есть много вещей, которым вы можете следовать, и они станут полезными для вашей работы.
По своему опыту я являюсь разработчиком системного программного обеспечения и прикладного программного обеспечения в области безопасности (вы хотите следовать курсу безопасности?), Начиная с небольшого опыта программирования, я становлюсь более интересным в алгоритмах и распределенной системе и снова чувствую неудобно из-за простоты приложения общего назначения, которое я написал (сниффер, система обнаружения сетевых вторжений, анализатор протоколов и детектор и т. д.).
Как ты кисло научился в теоретической информатике! ты пройдешь эти курсы? :П
Например, вы узнали, что весь компьютерный язык может быть приспособлен к набору вычислимых математических функций, и, например, если ваш опыт пойдет по тому же пути, что вскоре вы почувствуете себя неловко в этом небольшом наборе исчислений и, как и я, вы сможете начать понимать, как развиваются Программное обеспечение не так привлекательно и удивительно, потому что тот же самый DESIGN PATTERN возвращается снова и снова (вы проходили курсы по разработке шаблонов?), и, например, вы можете начать проявлять больший интерес к ПОЧЕМУ и КАК язык может быть переведен в математическую функцию и начинает узнать, что компьютерный язык не так уж и сложен! Например, вскоре вы можете быть более удивлены личностью и психологией, и вы можете получить больше интереса к этому и стать хорошим менеджером проекта! Вы проходите курсы по жизненному циклу программного обеспечения?
Итак, какой курс должен быть в вашей карьере в CS?
Я предлагаю учиться столько, сколько вы можете изучать во всех областях, особенно в области теории, потому что в общей области работы вы скоро почувствуете, что вам действительно надоедает небольшая сложность вокруг вас, и, став полноценным работником, у вас действительно меньше времени на обучение. как все работает на самом деле, и гораздо больше времени, чтобы увидеть, как люди с сильными теоретическими знаниями спроектировали вещи для работы и дают вам возможность писать код, чтобы получить еду дома.
в информатике неправильное чувство реальности. например, ученый иногда очень далеко от разработчика программного обеспечения.
взгляните на объяснение википедии.
веселиться с life :)
мои 2 цента.
извините за мой действительно плохой английский.
источник
Подберите номер один, на котором студенты CS должны свободно владеть английским языком.
Без понимания устного и письменного английского языка вы навсегда останетесь в невыгодном положении.
Просто посмотрите на множество вопросов, которые приходят на сайтах стека. Слишком многие из них трудно расшифровать. Некоторые люди используют смесь l33t, текстовые сообщения (не уверен, правильный термин). Другие делают заявление и просто добавляют знак вопроса, пропуская важные мысли, такие как глаголы или прилагательные.
Если вы не можете общаться, вы не сможете понять себя, а тем более понять, что говорят другие.
Все остальное просто детали. Если вы умеете общаться, обладаете, по крайней мере, средним интеллектом и понимаете, что вы читаете, то у вас также может быть успешное программирование карьеры.
источник
Я подхожу к этому с несколько иной точки зрения, потому что я не получил высшее образование в области CS, я получил высшее образование в области электроники (с небольшим в бизнесе)
Исходя из этого, я думаю, что список вещей, которые вы должны понять, относительно короткий, так как я (и многие другие выпускники CS) выживаю счастливо, не зная ничего о дизайне компилятора или тому подобное.
То, что я бы сказал, я подобрал и считаю полезным:
И если у вас есть возможность узнать об управлении проектами вообще, это действительно не повредит, но во многих случаях это преподается довольно плохо в университете, и это то, о чем вы немного узнаете на работе, просто работая над проектами.
источник
Я бы также добавил в этот список некоторые базовые курсы по кадрам / психологии.
Это может показаться странным дополнением, но профессиональная часть работы заключается в том, чтобы научиться продавать себя и вести переговоры. Прогулка по вашему первому «настоящему» собеседованию без четкого знания мотивов дронов-HR - это рецепт катастрофы, который может закончиться тем, что ученика завалили на низкую зарплату.
Знай своего врага, чтобы защитить себя.
источник
1-й год:
2-й год:
3-й год:
4-й год:
Эти курсы должны предоставить много теории и практики кодирования.
источник
Странно, что никто не упомянул компьютерную архитектуру.
источник