Убьет ли книга Ричтера начинающего программиста?

Снобизм в среде программистов – острая проблема. Многие опытные разработчики убеждают начинающих, что обучение должно начинаться с изучения алгоритмов, устройства C++, и классических работ по этому языку. Разберемся в этом вопросе. У меня около семи лет опыта коммерческой разработки, я обучался самостоятельно и сейчас руковожу школой программирования со стажировкой. Ежемесячно к нам приходит примерно 15 человек, прошедших обучение и приступающих к профессиональной разработке. За это время я сформировал ряд радикальных мнений.

Ошибки в обучении

Изначально мы преподавали, как советуют многие: курсы начинались с лекций об устройстве C++, формальных системах типов и эволюции языков. Даже добавив практику по книге Ричтера (показывали, как компилировать проект из консоли, разбирали через WinDbg и прочее), студенты жаловались: «Когда же мы начнём работать?». Я поначалу возражал: «Ребята, это же основы!», но со временем понял, что мой энтузиазм бесполезен. Курсы длились два-три месяца, а на выходе люди писали ужасный код и были не готовы к работе, несмотря на знание отличий компилируемых и интерпретируемых языков, или того, что процессор – тоже интерпретатор.

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

Книга Ричтера: польза и вред

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

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

Альтернативный подход

Поэтому я рекомендую: начните с написания игр, скриптов на C# или другого языка, с книг, которые быстро вводят в дело и заставляют писать код. Если вы будете часами разбираться в ковариантности и контравариантности типов делегатов, вы не вырастете как разработчик и забудете это через неделю. Вы должны столкнуться с проблемой на практике, а потом найти решение в книге (например, Ричтера), а затем забыть – это нормально. Вы должны забывать ненужное.

Мне нравится книга Ричтера, но я не понимаю, зачем её читать. Она не даёт той глубины, которую я хотел бы, показывает вещи, которые применяются немного иначе, и контекст не задан. Я не могу сказать своему ученику: «Почитай Ричтера», потому что он спросит: «Зачем?». А я не знаю ответа. Что я должен проверить у него? Провести тест из 10 вопросов? Нет, мы так не работаем. Мы оцениваем по результатам работы.

Практическое применение

Какую роль должна сыграть книга Ричтера в коде учеников? Допустим, задача: сделать сохранение в игре. Я могу дать ученику главу из книги Ричтера про сериализацию, «Чистый код» Роберта Мартина (чтобы он понимал разделение слоёв), книгу Марка Симона (чтобы он не сделал слишком жёсткую систему сохранений), рассказать про сериализацию в .NET. Ричтер расскажет больше, чем нужно, но введёт в курс дела, или я могу дать ссылку на MSDN. В сочетании с другими книгами он создаст систему лучше, чем если бы просто прочитал Ричтера и стал искать информацию о сериализации для сохранения.

Книга Ричтера – как занудный собеседник, который закидывает вас не связанными с вопросом фактами. Она содержит много интересного и полезного, но я не понимаю, кому её следует читать. Мы, как разработчики, двигаемся не так, как принято.

Стоит ли читать Ричтера? Если хотите пройти маразматичные технические интервью – да. В остальных случаях – нет. Не вижу смысла накапливать 101 бесполезный факт о виртуальных таблицах. Делайте, как хотите.

Что будем искать? Например,программа