Я недавно написал статью о том, нужна ли вам степень в области информатики, чтобы устроиться на работу в сфере технологий. Я подумал, что будет полезно просмотреть мою стенограмму. Надеюсь, обсуждение того, что я изучил, поможет людям. Я хочу, чтобы каждый мог принять максимально обоснованное решение при выборе пути для продолжения карьеры в сфере технологий.
Заявление об ограничении ответственности: это написано на основании моих воспоминаний о классах и с точки зрения разработчика мобильных устройств. Многие темы этих классов могут быть специализированы и превращены в карьеру. Так что все они важны для кого-то в мире. Я пишу со своей точки зрения и с точки зрения человека, выбравшего карьеру мобильного разработчика.
Программирование 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 раз лучше.
Последние мысли
Я мог бы не пройти большую часть занятий и по-прежнему оставаться программистом, которым я являюсь сегодня. Но я думаю, что пропуск некоторых из этих курсов может оставить огромный пробел в ваших знаниях как разработчика. Я думаю, что каждый инженер-программист должен обладать определенными знаниями по теме Структуры данных и алгоритмы.
Остальные классы зависят от выбранной вами карьеры. Если вы решили заняться разработкой встраиваемых систем, вам следует узнать об архитектуре компьютера. Если вы решили стать фронтенд-инженером, вам следует узнать о компьютерных сетях.
Ключевой вывод здесь заключается в том, что хороший инженер постоянно учится. Если вам не хватает знаний, которые, как вы знаете, были бы полезны и применимы в вашей работе, сходите на курсы, чтобы получить эти знания. Так вы научитесь лучше писать хороший код. Всегда учись.
Понравилось то, что вы прочитали? Посмотрите другие мои статьи
Начиная техническую карьеру с нуля.
Советы для вашего первого технического собеседования.