Алгоритмы для программистов

Недавно под одним из видео бал комментарий, что в реальности почти все (кажется, довелось число около 90%) программисты не используют алгоритмы и им это не нужно в работе. 

Если говорить про Web, то тут действительно большое количество программистов не заморачивается с алгоритмами и им их знать не нужно, потому что большая часть кода, который приходится писать – это просто отображение данных и чуть меньше - сохранение, обновление и удаление. 

Такой сайт как мой блог flenov.info может написать любой начинающий программист, которому не нужно знать ни одного алгоритма. Внешний вид сайт – это сплошное отображение данных из базы и тут не нужно задумываться об алгоритмах поиска, какой наиболее эффективный, потому что достаточно просто знать SQL запросы и немного о том, как работают индексы и как с их помощью можно оптимизировать. На тему индексов у меня есть отдельные видео на канале програмыслей:

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

Но разве интересно писать простые SELECT запросы или простой пользовательский интерфейс? В большинстве компаний это работа программистов низкого уровня. Да, их большинство, но если хочется заниматься более серьезными вещами, писать бизнес логику, создавать что-то новое то алгоритмы нужны. 

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

Listemployees = DataProvider.GetEmployees();

Listpositions = DataProvider.GetPositions();

foreach (Employee e in employees) {

  e.Position = positions.Where(p => p.PositionID == e.PositionId).FirstOrDefault();

}

Смысл кода простой – из базы данных получаем список работников employees и список позиций positions. У каждого работника в списке есть только ID позиции (Employee.PositionID). Наша задача найти по ID позицию в списке positions и смапить ее в работнику. 

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

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

Так что даже не смотря на то, что вы не будете писать алгоритм поиска, знание вы будете применять постоянно при написании подобного кода. И в данном случае лучше превратить второй массив в Lookup, Dictionary или Hash и он заработает на совершенно другой скорости:

Listemployees = DataProvider.GetEmployees();

var positions = DataProvider.GetPositions().ToLookup(….);

foreach (Employee e in employees) {

  e.Position = positions[e.PositionId];

}

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

На сколько сильно углубляться в них? Я считаю, что тут не должно быть предела. Как минимум нужно знать сортировки и поиск – это просто маст хэв. 

Кстати, в первом вопросе кажется, был еще и подпункт, что знание алгоритмов нужно только для прохождения интервью. Так вот, поиск и сортировка – это те вещи, в которых вам необходимо понимание для повседневной жизни и знание для удачного прохождения интервью. Очень редко приходится реально писать сортировку или поиск, я уже и не помню, когда это было в моей практике последний раз. 

А вот остальные алгоритмы, которые пишут в более серьезных книгах – возможно вы тоже никогда не будете в своей практике их использовать, особенно если будете работать в Web, но просто для саморазвития это же приятно почитать и познать какие-то вещи! 

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

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

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

Мне интересно реализовывать какую-то логику, которая сложнее простых Web приложений, наверно поэтому я и для фана пишу игры для iOS. 

Если подвести итог:

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

2. Да, именно реализацию алгоритмов большинство из нас не пишет. Чаще всего с этим фаном сталкиваются разработчики игр. 

3. На сколько глубоко нужно изучать алгоритмы – тут не должно быть предела и не нужно ограничивать себя. Как минимум познакомьтесь с поиском и сортировкой, этого будет достаточно для базы. Но ради развития логики я продолжаю знакомиться с различными книгами постоянно, освежаю в памяти алгоритмы, потому что это положительно сказывается на 



Внимание!!! Если ты копируешь эту статью себе на сайт, то оставляй ссылку непосредственно на эту страницу. Спасибо за понимание

Комментарии

Паника, что-то случилось!!! Ничего не найдено в комментариях. Срочно нужно что-то добавить, чтобы это место не оставалось пустым.

Добавить Комментарий

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне