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

Я это очень хорошо знаю. Я сам из самоучек. У меня план по закрыванию пробелов в знаниях расписан года на два вперед. Так что я провожу на Coursera часа по 3-4 в неделю только что бы добрать базу. А ведь надо еще и новые технологии изучать, и работать с хорошей эффективностью. И я считаю, что мне еще повезло: моих знаний в математике пока хватает.

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

Тем более, что сейчас идет этап взросления отрасли. Количество грамотных специалистов становится больше, растет конкуренция. При этом в индустрии достаточно высокие и стабильные зарплаты, а это привлекает всяких левых людей, которых нужно как-то отсеивать. Вот и приходится компаниям менять подход к собеседованиям. А самый дешевый и быстрый способ проверить проф. пригодность программиста - спросить его базовые вещи: Big-O, алгоритмы поиска, деревья.

  1. Алгоритмы и структуры данных

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

Хорошо, что эти знания получить не составит большого труда. Любите книги: на рынке полно книг по алгоритмам на любой вкус. Мне нравятся книги Кормэна и Лафоре. На Coursera настоятельно рекомендую курсы Принстона по алгоритмам https://www.coursera.org/course/algs4partI и https://www.coursera.org/course/algs4partII .

  1. Языки программирования

Я не говорю о знании большого количества языков. В общем и целом выучить синтаксис любого языка для программиста не составит особого труда. Я говорю о лексерах, парсерах, интерпретаторах, компиляторах и прочем. Во первых, рано или поздно придется лезть в кишки своего основного языка и смотреть, как он там устроен. Во вторых, эти знания могут пригодится в работе в самом неожиданном месте. На последнем PyCon Кирилл Борисов из Яндекс.Директ рассказывал, как он делает рефакторинг 11 тысяч тестов с помощью синтаксических деревьев.

Толковых ресурсов или книг по данной тематике я не знаю. Разве что могу порекомендовать посмотреть https://compscicenter.ru/courses/compilers/2013-autumn/ . А потом уже искать статьи и ресурсы с ответами на конкретные вопросы.

  1. Парадигмы программирования

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

Самый лучший способ наверстать этот блок - домашние проекты. Если программируете на Python, попробуйте сделать какой-нибудь проект на Haskell (ну или просто какие-нибудь задачки на нем порешайте). Я так неплохо улучшил свой код.

  1. Архитектура и операционные системы

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

Эти же соображения относятся и к операционным системам, POSIX и другим системным "штукам". Так что добавляем Таненбаума в список книг, которые надо прочитать в ближайшее время.

Из моего опыта и общения с коллегами, эти четыре пункта самые слабые места самоучек. А какие пробелы в знаниях мешают в работе вам?

P.S. Пока готовил пост, обнаружил, что Computer Science Center переносит курсы на Stepic. Это круто. Надо будет их обязательно оценить.



c