Многие компании, нанимающие программистов, требуют от них знания алгоритмов. Некоторые даже устраивают отдельное собеседование по алгоритмам, зачастую весьма нешуточное.
Однако сами программисты нередко удивляются, зачем всё это? Действительно, работа наших коллег часто заключается в поиске и устранении ошибок в залежах legacy кода. Какие уж там алгоритмы? Даже те, кому посчастливилось участвовать в новом проекте знают, что зачастую новый проект состоит на 80% из чужого, уже кем-то написанного и найденного на просторах гитхаба кода, а новый код - это, по сути, клей и обёртки, которые позволяют склеить эти уже готовые запчасти между собой, чтобы получить заданный продукт.
Недавно мне попалась на глаза статья на Хабре статью о подготовке к алгоритмическому собеседованию в Яндексе. Видно, что ребята относятся к делу всерьёз. Однако на вопрос, зачем всё таки это нужно, статья отвечает в том духе, что алгоритмическая подготовка показывает полезную готовность кандидата поотжиматься (отмечу при этом, что это не мнение Яндекса, а личное мнение человека, получившего этот опыт с обеих сторон - и кандидата и интервьювера).
Однако всё же, действительно ли основная польза алгоритмической подготовки сводится к тому, чтобы продемонстрировать работодателю свою сообразительность и готовность потратить время жизни на подготовку к собеседованиям, а в целом она не слишком полезна для нормального рабочего процесса? Или всё же алгоритмы нужны?
Позволю себе привести сравнение.
Многие из нас или водят машину, или учатся сейчас ее водить.
Когда человек только начинает водить, сознание переполнено. Особенно на машине с механической коробкой передач. Надо помнить про передачи, делать в нужный момент правильное движение двумя ногами и рукой, чтобы их переключать, следить за скоростью, за разметкой, за состоянием дорожного полотна, за дорожными знаками, за светофорами, за другими машинами, за пешеходами, за маршрутом.
Однако ключ к безаварийному вождению - уметь видеть движение вокруг себя в целом и понимать, что от него ждать. Полагаться больше не на реакцию, а на понимание ситуации и прогноз.
Однако чтобы всё это делать, мозг должен быть свободен от рутинных задач.
Это называется, мануальный навык. Когда вам чтобы пройти поворот, не надо думать, "сейчас вот воткну вторую, поверну, потом подоткну третью", одновременно следя за траекторией и подруливая, чтобы на ней удержаться. И когда оказавшись на скользком покрытии, вы не паникуете, а спокойно удерживаете контроль над машиной, добавив где надо немножко газку и немного поработав рулём (и удивляетесь при этом в день, когда выпал снег, чего это владельцы крутых машин с мощными двигателями поутихли, и не наглеют, а скромненько едут 40 там, где вам комфортно и спокойно ехать 60). И вы знаете, что делать, руки-ноги сами знают, вы можете им доверять и освободить голову для анализа дорожной обстановки, отслеживания маршрута и поддержания разговора с пассажиром.
Мануальный навык вождения машины можно приобрести или за годы опыта, или пройдя соответствующие курсы. На курсах, кстати, начнут с того, что привьют водителю элементарную грамотность: как правильно держать руки на руле (многие не умеют!), как правильно рулить и пользоваться педалями. Только освоив эту базу, можно учиться чему-то более полезному.
Вот знание алгоритмов даёт тот самый мануальный навык в нашем ремесле. Вы занимаетесь какой-то реальной производственной проблемой (для меня это будет, скорее всего, что-то связанное с сетевыми протоколами и со взаимодействием с другими устройствами по сети, часто поиск обходного маневра, если устройство ведёт себя не так, как написано в спецификации и т.п., для других людей это будет что-то другое). Но когда вы разобрались со своей проблемой до уровня понимания, что с ней надо сделать, у вас нет особых сложностей, как это сделать - потому, что вы обладаете тем самым мануальным навыком. И вы выбираете решение не из набора готовых запчастей на гитхабе, а понимаете, что в принципе можно сделать програмным путём и в какую цену это выливается - для программиста и для компьютера. А потом уже принимаете сознательное решение, стоит ли оно этой цены и как делать - путём прилаживания готового решения, или путем написания своего кода.