Код
#статьи

Идти в IT, не зная информатики: а что, так тоже можно было?

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

Кадр: фильм «Скрытые фигуры»

На самом деле заголовок немного лукавый: ответ на вопрос «учить или не учить» оказался не столь однозначным. Наши респонденты неожиданно разделились на четыре группы:

  • Одни смело утверждают, что в IT можно уверенно себя чувствовать и без Computer Science.
  • Другие говорят, что начинать можно и будучи полным валенком в информатике. Но позже теоретические знания всё-таки придётся наверстать.
  • Третьи настаивают, что без серьёзных познаний в Computer Science даже соваться в профессию не стоит.
  • Наконец, четвёртые подошли к вопросу сугубо практически: Computer Science — наука глобальная, не всем понятная. Поэтому не надо пытаться объять необъятное: каждой специальности — свой конкретный раздел CS.

Давайте выслушаем все мнения — а дальше решайте, какое вам ближе.

Position №1


Репетируют те, кто играть не умеет

Сергей Головин

Principal Frontend Developer, CTO в CSSSR

Начинающему разработчику можно совсем не погружаться в Computer Science. Уверяю вас: если он окажется совершенно незнаком с системой типов Хиндли — Милнера, ничего страшного не произойдёт. Более того: он, возможно, даже будет пользоваться им на прикладном уровне, сам того не подозревая. Ведь работа новичка чаще всего — ремесленничество. К инженерной деятельности он приближается уже на более поздних этапах карьеры.

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

Андрей Мельников

Principal Frontend Developer в CSSSR

Скажу слегка провокационно: Computer Science не нужны 99% разработчиков, решающих практические задачи. Бывают редкие случаи, требующие специальных знаний в каких-то разделах и областях, — но даже тогда проще серьёзно изучить конкретный раздел, чем углубляться во всю теорию информатики.

Значит ли это что Computer Science совсем бесполезны? Нет. Профессионализм разработчика определяется не только скиллами в конкретных технологиях и типах задач. Знание кучи паттернов и библиотек не сделает вас сеньором, если оно не обеспечено культурой инженерного мышления. Без неё вы не сможете решать нетипичные задачи, что-то изобретать.

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

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

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

Нэлия Логинова

Член команды Podlodka Techlead Crew


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

Если бэкграунд не технический, минимальный курс по Computer Science, наверное, нужен: нельзя сделать что-то осознанное, не понимая, как функционирует программная инженерия.

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

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

Position №2


Никто не может знать всего

Михаил Фесенко

SRE


Пишет на Go, PHP, Python, Bash, далее со всеми остановками по требованию заказчика. Сейчас работает в Booking.com, до этого работал в «Яндекс.Облаке» и во «ВКонтакте». Любит жену, кино и снимать видео =)

twitter

Я долго писал программы без базовых знаний в Computer Science. Получалось так себе. Сейчас немного освоился в теории — стал кодить не то чтобы отлично, но местами лучше. Когда постоянно оптимизируешь код, пытаешься искать адекватные и быстрые решения, общая планка скиллов повышается. Больше не пишешь брутфорс-решение, чтобы перебрать два массива.

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

Например, если вы занимаетесь highload-приложениями, core-частью, оптимизацией под миллионы запросов в секунду, пишете демоны на бэкенде — без Computer Science не обойтись. Надо знать оптимальные алгоритмы, иначе неправильный for или структура могут съедать не 3, а 10 и даже 2000 циклов, что потребует на 10% больше CPU. При огромной инфраструктуре это может привести к необходимости иметь на 10–00 серверов больше, что очень дорого.

Но учиться сложно и долго, конечный профит не очень понятен. Хорошо, если вам повезло с университетом, где всему обучат, покажут, помогут понять на хороших примерах. Но таких университетов мало. При этом можно годами перекладывать CRUD’ы и JSON’ы, вообще не соприкасаясь с Computer Science, и это тоже нормально.

Если хотите развиваться, старайтесь просто брать задачи из своей текущей работы и потихоньку их разрабатывать. Будет возможность параллельно учиться в универе — отлично. Можно также позаниматься на курсах, смотреть их фоново. Всё это обязательно пригодится на собеседованиях: например, чтобы устроиться в крупную компанию, нужно решать задачи на LeetCode, учить алгоритмы, уметь объяснять и защищать свои решения.

Олег Накрайников

Technical Lead


Любит GYM, путешествия и компьютерные игры. Пишет технические статьи и иногда технические треды в Twitter.

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

  • Ознакомьтесь с базовыми понятиями, устройством компьютера, компьютерными сетями и операционными системами;
  • Освойте первый язык программирования, а параллельно базово изучите структуры данных, алгоритмы и дискретную математику;
  • После этого путь изучения Computer Science зависит от выбранной IT-области. Получив стажировку или даже первую работу, вы поймёте, без каких дисциплин вообще не обойтись, какие хорошо было бы знать, а какие не встретятся вовсе.

Евгений Антонов

Тимлид


IT-консультант. Более 15 лет в IT-индустрии. Ведёт Telegram-канал «Тимлид Очевидность» и подкаст «Кода Кода». В Twitter известен как @_jeck.

В программистских чатиках и в твиттере можно встретить два воюющих лагеря.

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

В другом сидят люди, которые не учили Computer Science вовсе, попали в профессию джунами, кто-то даже до мидлов дорос, имеет свой стабильный доход и не хочет дополнительно напрягаться. Приходилось работать и с такими ребятами — порой у них на ровном месте были пробуксовки или изобретение велосипеда, хотя уже изобретённый давно за углом стоит. Им я рекомендую почитать про мысленный эксперимент «Китайская комната». Без знаний в CS можно превратиться именно в такую комнату для своего фреймворка: в рамках типовых задач всё вроде ок, но любой шаг влево или вправо — и сразу ступор.

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

Могу предложить хорошо и вдумчиво почитать небольшую, но довольно толковую книгу «Теоретический минимум по Computer Science. Всё, что нужно программисту и разработчику». Она поможет понять, куда двигаться дальше.

Михаил Рубанов

Mobile Head в Dodo Engineering


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

twitter

На мой взгляд, даже «уверенный пользователь ПК» может научиться программировать, главное — желание. Но через год-два карьеры точно понадобится копнуть поглубже. В какую сторону — зависит от сферы вашей работы и интересов.

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

Самый яркий пример — доступность интерфейсов. В России много отличных, красивых приложений, но почти никто не знает, что их можно адаптировать, например, для незрячих людей. Меня это настолько впечатлило, что я написал целую книгу «Про доступность iOS».

Профессионализм специалиста всегда измеряется тем, насколько он понимает контекст текущей задачи. Если дизайнер рисует макет телефона, не учитывая, как он будет лежать в руке, — это плохой дизайнер. Бэкенд-разработчик, не понимающий, как устроен интернет или база данных, не сделает надёжный сервис. Без знания аффинных преобразований не получится красивая 3D-игра. Но всё это можно узнать по пути, главное — интересоваться.

Position №3


Не зная броду, не суйся в воду

Виктор Карпов

разработчик Amazon


Автор Telegram-канала Coding interviews in a nutshell. Живёт в Эдинбурге, Шотландия.

twitter

Польза Computer Science для многих новичков неочевидна. Им кажется: зачем знать протоколы передачи данных, если всё сводится к HTTP-запросам, которые можно сделать к API, описанному в документации? Или: к чему алгоритмы обхода дерева, если рендерингом занимается React, который прекрасно обходит всё как надо?

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

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

А есть ещё уровень платформ: если вы хотите писать мап-редьюс для «Яндекса» (YT), добро пожаловать в мир алгоритмов и на курс Бабенко. Тут не получится вызвать из библиотеки «функцию, которая магическим образом сама всё сделает», потому что твоя задача как раз в том, чтобы эту функцию сделать.

Точно так же важно понимать, что практические навыки и теория — вещи параллельные. Не нужно защищать диссертацию, прежде чем начать писать на React 😊

Если говорить о матчасти, я бы рекомендовал посмотреть гарвардский курс CS50 (есть и на русском):

Можно также почитать «Код: тайный язык информатики» Петцольда, даже если вы уже работаете по своей основной специальности — во фронтенде или бэкенде.

Валерий Жила

Software Engineer


Разрабатывает системы управления городской инфраструктурой для мегаполисов по всему миру. Основная деятельность — бэкенд, database engineering.

twitter

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

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

Не рискну сгоряча раздавать советы по книгам. Дам лишь базовый обзорный плейлист, который мне самому очень понравился, — Computer Science Crash Course на английском:

Position №4


Лучше меньше, да лучше

Виталий Емельянцев

автор сайтов и веб-приложений на Ruby on Rails с 2012 года


Учит людей, пишет об индустрии, ведёт open-source-проекты.

Личный сайт

Необязательно изучать ВЕСЬ Computer Science — читать от корки до корки SICP и паттерны «банды четырёх». Не обязателен и вуз — у меня самого за спиной пять лет на факультете CS, но в реальности мне пригодилась от силы треть всех усвоенных там знаний.

Но база (так я называю Computer Science) важна. Первую работу, конечно, можно получить и без неё, обладая лишь практическими навыками — умением писать код по образу и подобию, совещаясь со Stack Overflow. Но дальнейший рост в мидлы, сеньоры и выше требует более глубоких знаний.

Постепенно изучать внутрянку того, с чем вы имеете дело, — круто, полезно и не так уж сложно. Достаточно лишь постоянно задавать себе вопрос: «А как это работает?», получать ответы, задавать его снова, и снова, и снова.

Например, если вы работаете во фронтенде с API, здорово, если вы задаётесь вопросами:

  • А что такое вообще HTTP?
  • Чем HTTPS отличается от HTTP?
  • Как работает GET PUT POST?
  • Что означают коды 20x, 30x, 40x, 50x?
  • Почему иногда я вижу в ответе Nginx? Что это и для чего?

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

Вадим Пацев

Тимлид


Руководит фронтендом в «Яндекс.Маршрутизации». Участвовал в проектах про медицину и гонки беспилотных автомобилей. В Twitter известен под ником @basvasilich. Интересы: теннис, космос и «Формула-1».

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

  • хеш-таблицы (hash table);
  • стек (stack);
  • очередь (queue);
  • бинарные деревья (binary trees);
  • кучи (heap);
  • графы (graph).

По алгоритмам:

  • бинарный поиск (binary search);
  • работа с массивами с помощью указателей (two pointers technique);
  • сортировки (quick, merge, counting, heap sort);
  • обходы деревьев и графов (BFS/DFS);
  • асимптотический анализ алгоритмов (asymptotic analysis);

Зачем это надо? Если кратко — чтобы не терять возможности уже в начале пути.

Не знать и тем более воинственно отрицать CS — значит закрыть себе доступ к интересным и сложным областям разработки, оставаясь в мире рутинных и скучных задач вроде рисования кнопок или создания очередного CRUDа. А в итоге разочароваться в профессии.

Евгений Красников

фрилансер


Создатель канала и чата «Параллельный код || Оптимизация» в Telegram. Увлекается вокалом, любит велосипед и семейные поездки на природу.

Изучать Computer Science, конечно, нужно, однако, как и в любом другом деле, всё зависит от цели. Важно:

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

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

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

Например, если вас интересует фронтенд, углубляться в низкоуровневые темы необязательно. Куда важнее разбираться в UI/UX и дизайне, знать JavaScript, CSS, соответствующие фреймворки.

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

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

Какое бы направление вы ни выбрали, очень полезно понимать основные структуры данных и алгоритмы, а со временем и освоить паттерны проектирования. При изучении языков программирования стоит потратить время на основные библиотеки и фреймворки для этих языков, чтобы не изобретать велосипед (например, для C++ это STL, Boost и Qt). Также облегчает работу хорошее владение инструментами: средами разработки и отладчиками, пакетными менеджерами, системами контроля версий и так далее.

Важно понимать английский язык (хотя бы на уровне чтения технической литературы) — без этого очень сложно. Кроме того, любому программисту нужно знать устройство компьютера и операционных систем на базовом уровне. Понимание необходимости всего остального придёт со временем и опытом, не стоит пытаться объять необъятное. IT — довольно динамичная сфера, поэтому, если вы решили войти в IT, будьте готовы постоянно учиться и практиковаться, а для этого нужен неподдельный интерес к индустрии :)

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

Сейчас есть много сообществ (чаты в Telegram, Stack Overflow, форумы), в которых можно найти единомышленников. Там вам помогут разобраться с трудностями и подскажут, где искать ответы. Не стесняйтесь задавать вопросы, даже если они кажутся вам глупыми.

Всем новичкам желаю энтузиазма и успехов! ;)


Научитесь: Python Узнать больше
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована