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

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

Программирование I, II

Это была суть всего, что я узнал и помогло мне начать программировать. Это были классы, на которых вы учились программировать. До того, как я пошел на эти занятия, я вообще почти не программировал. Я пытался получить фору, но дальше петель не продвинулся.

Этот класс начался с создания пустого файла и его компиляции в среде IDE (я использовал Code :: Blocks). И мы полностью работали над созданием нашей собственной текстовой боевой игры. Оглядываясь на написанный мной код, я смущаюсь. С тех пор я прошел долгий путь. Вот репо, если вы хотите посмеяться (я использую только файл main.cpp с 1063 строками кода).

Итак, что я здесь узнал? Я хочу сказать все. Эти курсы были безумно ценными и дали мне как минимум 70% знаний, необходимых для профессиональной работы программистом. Я изучил операторы if, циклы, логическую логику, создание классов, создание структур, создание интерфейсов, полиморфизм, наследование и многое другое. Также использовались базовые структуры данных, такие как массивы и векторы.

Дискретные структуры в информатике

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

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

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

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

Структуры данных

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

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

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

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

Анализ алгоритмов

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

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

Нотация Big O позволяет вам оценивать производительность кода, просто глядя на код. Я не хочу вдаваться в подробности, но если вы не знаете о нотации Big O, прочтите это сообщение в блоге.

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

Базовое понимание того, какие существуют известные алгоритмы, их назначение и способы реализации, может быть полезно (в основном для проведения собеседований). Обозначение Big O является ключевым здесь. Это очень полезно на работе, а также невероятно полезно для собеседований.

Веб-разработка

Этот класс обладал наибольшим количеством навыков, которые можно было применить непосредственно к работе в сфере технологий. Я узнал о HTML, CSS, JQuery, JavaScript, PHP и JSON. Я узнал, как запрос отправляется с внешнего интерфейса веб-сайта на серверную часть, как он обрабатывается на серверной части, а затем отправляется обратно в интерфейсную часть с ответом. Я узнал, как создать пользовательский интерфейс и как взаимодействовать со слоем данных, который затем взаимодействует с сетью.

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

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

Введение в базы данных

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

Программная инженерия I, II

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

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

Компьютерная архитектура и язык ассемблера

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

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

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

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

Операционные системы

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

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

Введение в компьютерные сети

Этот урок был очень полезным. Было рассмотрено, как функционируют компьютерные сети. Это включало использование сетевых протоколов, таких как HTTP, HTTPS, TCP, IP, FTP, IMAP, POP3, SSH и DNS. Я узнал, для чего используется каждый из этих протоколов, как они реализованы, и понял, почему они были созданы.

Сетевые протоколы, о которых я упоминал выше, используются для критически важных функций современного программного обеспечения. Это включает в себя обработку электронной почты (POP3 и IMAP), отправку сетевых запросов между клиентом и сервером (HTTP, HTTPS) и безопасную обработку устройств через сеть (SSH). Это действительно дает вам представление о том, как работает Интернет и как устройства по всему миру могут взаимодействовать друг с другом.

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

Введение в юзабилити-инжиниринг

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

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

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

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

Разработка мобильного и облачного программного обеспечения

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

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

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

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

Программный проект Capstone

Говоря об устаревших технологиях, этот проект потребовал от нас создания графического интерфейса для доступа к базе данных с помощью curses. Вот полный проект, если интересно. У нас не было возможности выбрать, какой будет наш краеугольный проект, он был поручен нам. И все должны были сделать один и тот же проект. Это также было сделано группами по 3 человека, так что вы действительно охватили только одну небольшую часть проекта. Это был действительно плохо управляемый класс.

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

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

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

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

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

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

Понравилось то, что вы прочитали? Посмотрите другие мои статьи

Начиная техническую карьеру с нуля.

Выберите для себя лучшую техническую карьеру - Dev Ops, Mobile Engineer, Data Scientist, Project Manager и Front End.

Советы для вашего первого технического собеседования.

Стоит ли вам получить степень в области информатики?

Swift vs. Objective-C