Так получилось, что свою карьеру я начинал сразу в ИТ, но был скорее теоретиком. По образованию я — математик, а это значит, что в университете меня учили доводить задачи ровно до той стадии, когда «далее все понятно, и реализация представляет чисто инженерную сложность». Хотим создать новый алгоритм — напишем на бумажке, в лучшем случае, реализуем на питоне и протестируем на небольших входных данных. Типичный пример «продовой» системы для меня в те годы и вскоре после выпуска — программа обработки электромагнитных геофизических данных, написанная на чистом си без понятия о том, что такое стандарт, собираемая в командной строке копи‑пастом команд компилятора и требующая для запуска двух отдельных конфигурационных файлов (редактируемых, естественно, вручную).
В какой‑то момент пришло осознание, что дальше так жить нельзя. Самые лучшие идеи так и останутся идеями, если их «реализацией» способен пользоваться только автор (и, в лучшем случае, его научный руководитель). И я решил расти как разработчик.
С тех пор прошло уже несколько лет. За это время было прочитано много книг, сделана куча типовых ошибок, изобретено пара десятков моделей велосипедов. Мой путь по‑прежнему далек от завершения, но какой‑то опыт по мере его прохождения накопился.
За последние несколько месяцев ко мне в разное время обратились три или четыре человека с просьбой порекомендовать им что‑нибудь, чтобы «научиться прогать». Особенность всех из них — наличие неплохого базового образование, общее понимание многих концепций, но лишь на теоретическом уровне. Короче, все так, как было у меня в свое время. Ответив им несколько раз примерно одно и то же в телеграме, я понял, что все это можно написать один раз, выложить в публичный доступ и расшаривать. Так и родилась идея этой статьи.
Дисклеймер
Эта статья плохо подходит для тех, кто хочет «войти в АйТи с нуля». Она для тех, кто хочет свои разрозненные знания немного привести в порядок и углубить.
Requirements
Чтобы качественно изучить приведенные здесь материалы за разумный срок, нужно знать основы:
математики на уровне 11 класса, а лучше первого курса технического вуза. Не обязательно помнить матан, но если вам нужно несколько дней, чтобы разобраться с Big‑O нотацией, лучше сначала поработать в этом направлении.
программирования на каком‑нибудь мэйнстримном языке. В целом все равно на каком, со времен Алгола-68 мало что в них нового добавилось, но, наверное, лучше все же язык с явной типизацией.
Linux/FreeBSD/ другого юниксового. Некоторые книги из списка подразумевают работу с низкоуровневыми вещами, и на Windows придется покопать и разобраться самому.
Поехали.
1. Computer Systems: A Programmers Perspective
Прекрасная книга, затрагивающая очень разные уровни проектирования. После нее вы сможете рассказать младшему брату «как работает компьютер», а на собеседовании не будете удивленно молчать, когда вас спросят, в чем разница между потоком и процессом, или чем стек отличается от кучи. Если при изучении си вы до сих пор стараетесь мнемонически запомнить, где использовать переменную, а где указатель — вам сюда. Если вы можете рассказать любому, что такое язык ассемблера, но никогда не видели написанную на нем программу — вам сюда. Если вы считаете, что exceptions — это хорошо — вам тоже сюда.
Даже если вы никогда не будете писать код на языках низкого уровня, понимать, как именно работают разные подсистемы компьютера очень полезно, пусть хотя бы на концептуальном уровне.
На подробное изучение книги и выполнение большинства упражнений у меня ушло около 40 часов.
Кто‑то скажет, что вместо этой книги нужно читать Таненбаума. Ну такое, мне показалось что он пишет не очень понятно, но тут дело вкуса.
2. Skiena, The Algorithm Design Manual
Кто бы и что бы мне ни говорил, считаю ее лучшей книгой по алгоритмам. Несколько раз брался за Кормена и компанию, но из‑за подавляющей обстоятельности этого труда ни разу не доходил до конца. Примерно как сравнивать монументальный труд Ширяева и практически на одном дыхании читающуюся книжку Феллера (кто занимался теорией вероятностей поймет).
Скиена пишет очень понятно, вставляет неплохие примеры из практики, в конце глав много задачек в том виде, в котором их любит типичный выпускник физмата — решаются в один или два хода при помощи хорошей идеи.
У меня на эту книгу ушло около 20 часов.
3. Computer Networking: A Top Down Approach
Очень приличная книжка по сетям. Не очень много кода, больше объяснения на концептуальном уровне. После прочтения можно идти глубже в заинтересовавшие уровни — например, погружаться в детали ethernet. После прочтения станет понятна разница между TCP и UDP и многие другие поверхностные вещи, которые часто спрашивают на собесах. В целом интернет — пример очень хорошего дизайна системы, выдерживающей колоссальные нагрузки и масштабирующейся до крайних пределов, воэтому изучить, как оно все работает — полезно и на некотором мета‑уровне.
Я потратил на книгу около 20 часов.
Кто‑то снова посоветует почитать Таненбаума, но, повторюсь, у меня духу на него не хватило, а эта книжечка ничего так, легко зашла.
Итог
Этот список ни в коей мере не претендует на полноту. Скорее, на мой взгляд, «фондоотдача» от этих книг максимальна — они те самые 20% чего‑то, которые покрывают 80% чего‑то другого, ну да вы меня поняли.
Как по мне, вложить время в построение крепкого фундамента понимания важнее, чем изучить на поверхностном уровне несколько языков программирования или фреймворков.
Удачи всем, кто решит пойти моим путем. Если данный формат статьи найдет своего читателя, в будущем составлю и другие списки — например, что почитать по прикладной математике или по computer science.