iTechArt logo

Нужно ли учить Computer Science, если ты уже в IT?

Development & QA

Учить или нет Computer Science? Сергей Семенцов, Group Manager iTechArt, считает этот вопрос риторическим, и на OPEN IT Minsk он подробно разъяснил свою позицию. 

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

Наш собеседник
Семенцов Сергей.jpg

Сергей Семенцов

Group Manager iTechArt

Имеет свыше 10 лет практического опыта разработки. Является ментором и преподает в it-academy.by.

Что такое Computer Science (CS)?

CS — это широчайший диапазон теоретических знаний. Сюда входит практически всё, что разработчики знают в той или иной степени.

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


Computer Science на пальцах 

Давайте рассмотрим, что такое CS, на простом примере — оценке сложности алгоритмов. 

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

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

Но далеко не всегда зависимость будет выглядеть как O(nlog n) или O(n). Может получиться и O(n!) — вы видите, насколько меняется сложность алгоритма.

Может получиться и O(n!) - вы видите, насколько меняется сложность алгоритма.

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

Если взять массив из 10 элементов, то при сортировке пузырьком сортировка элементов будет происходить примерно за 85 перестановок, а при Quick Sort — всего за 29.

Если взять массив из 10 элементов, то при сортировке пузырьком сортировка элементов будет происходить примерно за 85 перестановок, а при Quick Sort - всего за 29.
Если чуть усложнить задачу и взять в массиве 50 элементов, получится куда более интересная картина: при сортировке пузырьком потребуется почти 2000 перестановок, при Quick Sort — всего 262. Отличие в количестве перестановок уже идет на порядок.

Если чуть усложнить задачу и взять в массиве 50 элементов, получится куда более интересная картина: при сортировке пузырьком потребуется почти 2000 перестановок, при Quick Sort - всего 262.
Поиграться с алгоритмами вы можете тут: sorting.at

А что, если количество элементов будет равно 100? Снова впечатляющий разрыв: при сортировке пузырьком потребуется порядка 10 000 операций, а при quick sort — всего 664. 

И это мы разобрали только 2 алгоритма сортировки. Бывают и другие варианты, где сортировка может идти быстрее или медленнее в зависимости от самих данных. А ведь ещё есть структуры данных: массив, список, граф, стэк и многие другие. И у всех у них есть свой показатель по Time Complexity и Space Complexity:


Роль Computer Science в систематизации знаний

Приведу простую аналогию. Михаил Васильевич Ломоносов говорил: «Математику уже затем учить следует, что она ум в порядок приводит». Computer Science — эта та же математика, но не для школьников, а для действующих программистов. 

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

После изучения CS у вас в голове будет “дерево” знаний - вы будете знать, что и как искать

Связь Computer Science и ваших зарплатных ожиданий

Если вопрос систематизации знаний для вас вторичен, давайте обратимся к другим причинам изучения CS. 

Сейчас в IT многие приходят во многом из-за денежного аспекта. IT-специалисты уже на старте работы рассчитывают получить 500$ и выше (хотя ещё 10 лет назад о таких зарплатах джуны не могли и мечтать). Согласно данным Бюро трудовой статистики США, число профессий, связанных с Computer Science к 2028 году увеличится на 12%, что более чем в 2 раза превышает средний темп роста для всех профессий, составляющий всего 5%.

Обратите внимание на примере статистики по американскому рынку на то, насколько профессии, связанные со STEM (естественными науками, технологиями, инжинирингом и математикой), оцениваются выше, нежели в остальных областях.

Пример статистики по американскому рынку на то, насколько профессии, связанные со STEM (естественными науками, технологиями, инжинирингом и математикой), оцениваются выше, нежели в остальных областях.

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

Вот несколько реальных описаний вакансий для начинающих — все они содержат требования о наличии образования (степени) в CS.

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

Примеры описаний вакансий для профессионалов из Glassdoor

Не секрет, что IT-сфера в Беларуси сейчас переживает бурный качественный и количественный рост. Так, экспорт ПВТ в 2020 году превысил 2,7 млрд $, а в самой сфере сейчас заняты более 70 тыс человек, что сравнимо с населением целого города, например, Жлобина. 

Возникает логичный вопрос: может ли это продолжаться бесконечно? Прогноз «на коленке» даст нам 2 варианта. Первый — да, рост продолжится. В таком случае, количество людей в этой сфере будет расти, вместе с ним будет расти и конкуренция. Тот, кто будет знать больше и разбираться в чём-то лучше (в т.ч. в Computer Science) будет на вершине, остальные будут менее конкурентны на рынке труда. А значит, нужно продолжать учиться, чтобы быть среди тех, кто более востребован.

Второй вариант — всё, что сейчас происходит, на самом деле является мыльным пузырем, который рано или поздно лопнет. При таком варианте развития событий проектов будет становиться всё меньше, компании начнут сокращать людей. И — как логичный вывод — те, кто будет обладать большей широтой знаний, в частности и Computer Science, будут более ценными кадрами. 

Таким образом, не важно, куда будет идти отрасль — вы должны оставаться конкурентоспособными на рынке труда.

Computer Science на Job Interview

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

Например, приходят ребята и говорят: «Я умею в JS/C#/Java/etc». Чтобы быстро проверить мастерство владения этим языком программирования как инструментом, а также проверить общие знания в CS, можно дать однотипное задание, с описанием сути того, что нужно выполнить, и с примерами входных и выходных параметров.

Пример задания на CS

Далее вы как кандидат садитесь, начинаете решать и рассуждать с интервьюером. Описываете как ваше решение работает, можно ли его оптимизировать. Обсуждаем time и space complexity, пробуем улучшить решение, если это возможно. Это может выглядеть примерно вот так:

Пример обсуждения и решения задачи на CS

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

В Беларуси есть достаточно большое количество классных компаний, в которых можно работать (в т.ч. iTechArt), но есть и мировые компании, в которых многие мечтают оказаться, тот же FAANG (Facebook, Apple, Amazon, Netflix, Google). Сюда же я бы отнес крупные компании типа LinkedIn, Twitter, Yandex и eBay — они тоже задают тренды в сфере.

Посмотрим на Google: по статистике, которую я нашел (данные на 2014 год), всего 1 из 130 претендентов получал работу (для сравнения: в Гарварде — 1 из 14). Как Google среди огромного количества кандидатов выявляет лучших? Как правило, кандидат проходит серию из 5 интервью, которая занимает 37 дней. При этом поиск заточен на так называемых T-shaped people — когда основанием буквы Т является твоя глубокая экспертиза в какой-либо области, а «верхней палочкой» — массив знаний по другим областям, кругозор и начитанность. Именно поэтому возможность обучаться для Google важнее IQ, и компания проводит интервью, где вы пишете код не чтобы проверить вас на ошибки, а чтобы выяснить, как вы мыслите.

T-shaped people - когда основанием буквы Т является твоя глубокая экспертиза в какой-либо области, а “верхней палочкой” - массив знаний по другим областям, кругозор и начитанность.

Кстати, по моему мнению CS актуален не только для разработчиков. Да, это не нужно маркетологам, но какие-то общие основы для бизнес-аналитика - вполне могут пригодиться. На многих проектах у бизнес-аналитика есть возможность работы с базами данных (которые могут быть реляционными и нереляционными), аналитику нужно проанализировать эти данные, найти взаимосвязи - всё это гораздо проще делать при наличии базовых основ в CS. И даже PM, у которых я преподаю в IT-Academy, учат CS как одну из дополнительных дисциплин.

Вместо резюме

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

Никто не говорит, что будет легко. Но давайте задумаемся вот о чём: приходя на приём к доктору, мы ожидаем, что он не только отучился 6 лет в университете и 1 год в интернатуре, но и продолжает обучаться, чтобы понимать, как функционирует тело человека в целом. Почему же тогда для программиста приемлемо изучить, к примеру, JavaScript или любой другой язык программирования и не обращать внимания на другие аспекты, которые окружают разработчика каждый день? Если делать себе такое послабление, то нужно быть честными: мы не сможем быть инженерами, а будем всего лишь «кодонабирателями». Может быть кого-то это вполне и устроит, судить явно не мне, но всегда хочется работать с профессионалами в своей сфере.

Учить или не учить? Для меня ответ очевиден. А для вас?..