Меня огорчает реакция людей, когда на вопрос «Как мне стать хорошим программистом?» советуешь прочитать книгу по алгоритмам. Хорошо, если каждый десятый спрашивает, какую я посоветую. Остальные девять говорят, что им это не нужно. А ведь алгоритмы — это лишь одна из многих проблем у программистов‑самоучек.
Я это очень хорошо знаю: я сам из самоучек. У меня план по закрытию пробелов в знаниях расписан года на два вперёд. Так что я провожу на Coursera по 3–4 часа в неделю, только чтобы добрать базу. А ведь надо ещё и новые технологии изучать, и работать с хорошей эффективностью. И я считаю, что мне ещё повезло: моих знаний в математике пока хватает.
Не хочу сказать, что самоучки работают хуже, чем те, кто учился в университетах на компьютерных специальностях. Нет. Просто базовые знания сильно ограничивают карьерный рост. Пока ты junior, ты этого не замечаешь. Но чем выше забираешься, чем за более сложные задачи берёшься, тем очевиднее, что простого опыта недостаточно. Не хватает базовых знаний.
Тем более что сейчас идёт этап взросления отрасли. Количество грамотных специалистов становится больше, растёт конкуренция. При этом в индустрии достаточно высокие и стабильные зарплаты, а это привлекает всяких «левых» людей, которых нужно как‑то отсеивать. Вот и приходится компаниям менять подход к собеседованиям. А самый дешёвый и быстрый способ проверить профпригодность программиста — спросить его о базовых вещах: Big‑O, алгоритмах поиска, деревьях.
1. Алгоритмы и структуры данных
Основные алгоритмы и структуры данных надо знать. Неплохо бы оперировать понятием Big‑O и вообще уметь оценивать сложность алгоритмов. Как минимум это пригодится на собеседовании. Точнее, незнание алгоритмов — верный способ завалить собеседование. Да и в работе пригодится.
Хорошо, что получить эти знания не составит большого труда. Любите книги: на рынке полно книг по алгоритмам на любой вкус. Мне нравятся книги Кормена и Лафоре. На Coursera настоятельно рекомендую курсы Принстона по алгоритмам:
2. Языки программирования
Я не говорю о знании большого количества языков. В общем и целом выучить синтаксис любого языка для программиста не составит особого труда. Я говорю о лексерах, парсерах, интерпретаторах, компиляторах и прочем.
Во‑первых, рано или поздно придётся лезть в «кишки» своего основного языка и смотреть, как он там устроен. Во‑вторых, эти знания могут пригодиться в работе в самом неожиданном месте. На последнем PyCon Кирилл Борисов из Яндекс Директа рассказывал, как он делает рефакторинг 11 тысяч тестов с помощью синтаксических деревьев.
Толковых ресурсов или книг по данной тематике я не знаю. Разве что могу порекомендовать посмотреть: https://compscicenter.ru/courses/compilers/2013-autumn/. А потом уже искать статьи и ресурсы с ответами на конкретные вопросы.
3. Парадигмы программирования
Типичный выпускник компьютерной специальности уже успел попрограммировать на разных языках с разными парадигмами. Он уже в курсе функционального и объектно‑ориентированного стиля программирования. Некоторые из них пытались использовать логическое программирование. Это, безусловно, расширяет кругозор и набор доступных способов для решения задач, которые встретятся в дальнейшей карьере.
Самый лучший способ наверстать этот блок — домашние проекты. Если программируете на Python, попробуйте сделать какой‑нибудь проект на Haskell (ну или просто порешайте какие‑нибудь задачки на нём). Я так неплохо улучшил свой код.
4. Архитектура и операционные системы
Неплохо бы программисту знать, как работает компьютер. Ну хотя бы в общих чертах. Мало ли, придётся писать расширение для Python на C++. Тогда знания о кэше процессора и о том, как устроена память, помогут сделать осознанный выбор между вектором и списком, например.
Эти же соображения относятся и к операционным системам, POSIX и другим системным «штукам». Так что добавляем Таненбаума в список книг, которые надо прочитать в ближайшее время.
Из моего опыта и общения с коллегами эти четыре пункта — самые слабые места самоучек. А какие пробелы в знаниях мешают в работе вам?
P. S. Пока готовил пост, обнаружил, что Computer Science Center переносит курсы на Stepic. Это круто. Надо будет их обязательно оценить.