Нужно ли разработчикам знать алгоритмы?

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

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

Разработка в наше время — это не столько про написание алгоритмов, сколько про перекидывание данных из одного места в другое. Структуры данных (массивы, списки, словари, множества) уже написаны. Алгоритмы для работы с ними (вставка, удаление, поиск, сортировка) — тоже уже есть. Вам не нужно знать, как устроено, например, добавление элемента в красно-черное дерево, и каждый раз писать его заново.

Но при этом все-таки важно знать основы. Если вы работаете с C++, то полезно знать, что std::map в своей основе имеет это самое красно-черное дерево, а значит, вставка нового элемента имеет вычислительную сложность O(log n). Или, в случае C#, что Dictionary — это хеш-таблица и что вставка в нее имеет сложность O(1), но при коллизиях хешей вырождается в O(n).

Мое мнение такое: не нужно знать алгоритмы наизусть, но нужно знать, что они есть и какие у них границы применимости. Ведь если вы знаете, что что-то существует, то это можно просто загуглить. Если вам в вашей игре или проекте нужно что-то алгоритмически сложное, то лучшим вариантом будет вспомнить, что где-то уже было что-то похоже, и почитать, как оно сделано там. На основе прочитанного можно уже подумать, как это применить к конкретно вашему случаю, и сделать что-то крутое, как, например, Oskar Stålberg.

I only update one or two boids per frame, and then bezier lerp them along. I was afraid this might cause oscillations, but if it does I'm not sure its even bad. https://t.co/p4wp9fRm3h
Нужно ли разработчикам знать алгоритмы?

Подобный принцип я использую в своей работе. Например, недавно мне нужно было перевести выражения из инфиксной формы записи, удобной для человека (2 + 2), в префиксную форму, удобную для компьютера (+ 2 2). Я просто знал, что есть такие формы, но я не помнил алгоритм перевода из одной в другую. Поэтому я просто загуглил его, изучил, понял, что мне он не совсем подходит, и адаптировал его для построения синтаксического дерева. Да, я сейчас просто написал разные сложные слова, чтобы вы считали, что я шарю, но я еще напишу об инфиксной, префиксной и постфиксной формах в одном из следующих постов, и вы тогда тоже будете шарить.

99
5 комментариев

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

2
Ответить

Это безусловно, понимание алгоритмов нужно. Но вот нужно ли учить существующие алгоритмы просто так? Нужно ли читать Кормена или Кнута (все 4 тома), чтобы знать как устроена быстрая сортировка, поиск остова графа или разворот связного списка?
С одной стороны, надо бы знать хотя бы основы, чтобы не изобретать велосипеды.
С другой - если на собеседовании спрашивают про алгоритм быстрой сортировки, я бы задал встречный вопрос - зачем им это нужно и как часто они пишут собственные реализации алгоритмов.

2
Ответить