Ответ на пост «Алгоритмы: Открытие тайн кода»

В чем я вижу проблему подобных статей, они “готовят” типичных “вхожденцев в айти”. Мне последние лет десять достаточно часто приходится собеседовать людей в основном на позиции от джуниора до экспа, реже на сеньора и заметил тренд на снижение уровня знаний у людей кто пришел в айти из других профессий, это где-то лет пять назад начало сильно провялятся, и если лет 15 назад люди которые переходили в IT из других профессий в частности алгоритмическую подготовку получали из чтения “нудных” книг типа Кнута, Кормена, чтения книг по дискретной математике и т.д, то сейчас онлайн курсы и различные статьи.

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

Если идти по порядку, то даже для совсем новичков нужно понимание сложности алгоритмов, примеры вычисления сложности алгоритма, понятие амортизированной сложности и пример вычисления для вставки в конец массива с удвоением памяти при заполнении, это раздел чистой математики, поэтому при правильном подходе нужна отдельная статья (или даже несколько) только про сложность алгоритмов и “волшебную О”. Так же полезно разобрать вычисление сложности алгоритма на примере вычисления чисел фибоначи, алгоритма поиска наибольшего общего делителя, ханойских башен.

Второй момент бинарный поиск, сам по себе бинарный поиск предполагает работу с отсортированным массивом данных и поиск не только конкретного элемента, но также алгоритмы upper_bound/lower_bound все это тоже реализуется через бинарный поиск, в статье ни слова об этом. Сама реализация в псевдокоде, но при этом есть “заточки” на язык программирования, что не требуется для псевдокода, реализация на С/С++ сразу в плохом стиле, нет проверок входных параметров, используется знаковый тип для значения длины массива. Все это можно сказать, что не существенно, но это реально формирует “базу” у “вхожденцев”, они пишут небрежно код, используют копипаст, что потом очень сложно исправить.  

Если автор просто тренируется писать технические статьи то это ок,  если же он хочет сделать полезное дело и действительно помочь качественно войти в айти с хорошей алгоритмической подготовкой, то рекомендую изучить материал на том же stepik, курсера конкретно курсы по алгоритмам. Посмотреть книги того же Окулова http://publ.lib.ru/ARCHIVES/O/OKULOV_Stanislav_Mihaylovich/_... если мы говорим про русскоговорящий сегмент.

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

Возможно идеальный курс должен решать какую то большую задачу , например разработка  “database engine ” (но без SQL), тут как раз будут почти все алгоритмы: деревья, сортировки, хеши, всякие  LRU-кеши, алгоритмы во внешней памяти, и т.д. Условно говоря первые полгода читаются статьи/лекции по сложности алгоритмов, базовые структуры данных и алгоритмы, потом постепенно шаг за шагом реализуется своя “СУБД” начиная с файлового стороджа (он же filepager), страничные/буферные кеши, B/B+ деревья, для упрощения можно выбрать простую транзакционную модель  two-phase locking, более продвинуто и заодно применение алгоритмов на графах, это реализация графа ожидания (wait-for graph) для детекта взаимных блокировок транзакций, где то за год можно реализовать, естественно это будет сугубо студенческий проект ни какого продакшен уровня. Есть отличная книга, по которой прям можно делать такой курс:

Database Systems: The Complete Book by Hector Garcia-Molina Jeffrey Ullman  

Можно упростить задачу и вместо СУБД делать реализацию “файловой системы”, естественно файловая система будет жить в user-space, в качестве диска использовать просто большой файл, в качестве бонуса можно прикрутить шифрование. В качестве идеи для вдохновения можно взять довольно старую книгу (но весьма актуальную для такой задачи):

Practical File System by Dominic Giampaolo

Лига программистов

1.5K постов11.4K подписчиков

Добавить пост

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества

Автор поста оценил этот комментарий

@ViacheslavS, если у вас будет время и желание, напишите, пожалуйста, список книг, которые позволят основательно освоить разработку (по вашему мнению)? Хотя бы, например, понимать алгоритмы.

Большое спасибо за статью.

раскрыть ветку (1)
Автор поста оценил этот комментарий

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

Если абстрактно про алгоритмы, чтобы просто понимать на уровне вот есть быстрая сортировка, есть AVL дерево, то можно прочитать Кормена, для более углубленного изучения можно того же Кормлена, но с решением задач которые есть в книге. Но Кормен как и Кнут авторы специфические кому то заходят кому то нет, мне как с математическим бэкграундом нормально их читать. Большой плюс Кормена то что он охватывает и достаточно не плохо много разных разделов от сортировок, графов, динамического программирования, до криптографии (в частности RSA).


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


Строки – огромный мир и пласт алгоритмов, лучшая книга на мой взгляд

Algorithms on Strings, Trees, and Sequences: Computer Science and Computational Biology by Dan Gusfield (у меня она даже есть в бумажном виде)

Как не странно) все тот же Окулов: Алгоритмы обработки строк


Если хотите углубиться в криптографию, именно как прикладной пользователь, то на мой взгляд отличный курс


https://www.youtube.com/@introductiontocryptography4223


в качестве практики хорошая книга Implementing SSL / TLS Using Cryptography and PKI by Joshua Davies. В ней автор постепенно на С делает реализацию протоколов SSL и TLS.

Есть хорошая платформа с задачками https://cryptopals.com/


По системному программирование, я не знаю какие прям хорошие книги, но из того, что я читал если по Windows:


Windows Graphics Programming: Win 32 Gdi and Directdraw (Hewlett-Packard Professional Books) by Feng Yuan книга старая но для Wndows достаточно актуальная многие примеры кода будут все так же работать.

Серия книг Windows internals, не давно у них же вышла книга Windows Kernel Programming. Так же есть интересная серия статей с практической реализацией гипервизора


Hypervisor From Scratch

https://rayanfam.com/topics/hypervisor-from-scratch-part-1/


Под Linux вообще не читал книг, тут больше документация и исходный код ядра/драйверов.  


Есть еще такой немецкий товарищ, у него “курс” по написанию ОС на С++ с многозадачностью, UI,  файловой системой, поддержкой сети

Write your own Operating System in 1 hour

https://youtu.be/1rnA6wpF0o4?list=PLHh55M_Kq4OApWScZyPl5Hhgs...


Так же просто для “абстрактной” алгоритмической подготовки и заодно возможно для подготовки к собеседованиям, я бы рекомендовал платформы типа leetcode. Там можно выбрать конкретный раздел задач по алгоритмам и сложность и спокойно решать, смотреть результат.

Предпросмотр
YouTube54:56
показать ответы