Ученые-компьютерщики, которым приходится зарабатывать на жизнь написанием кода, постоянно балансируют на грани между красивым и аккуратным мирком теории и несколько запутанным, «макгиверским» миром практической разработки программного обеспечения.

В мире теории милые приятные предметы передают друг другу послания мира и любви. Они живут на прекрасной планете, изобилующей природными ресурсами.

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

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

Однажды даже мне повезло. Большой компании, в которой я работал, требовалась система каталогов, чтобы помочь клиентам ориентироваться в их здании размером с городской квартал. Вы знаете те карты You-Are-Here, которые есть в торговых центрах с большой красной точкой, которая показывает, где вы находитесь. Вот так, но на больших цифровых экранах.

Короче говоря, руководитель проекта предсказал, что на завершение этого проекта уйдет много недель из-за кажущейся сложности маршрутизации клиентов из любой точки А в здании в любую точку Б.

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

Простой поиск в Google выдал полную реализацию алгоритма, называемого алгоритмом Дейкстры. Все это, сверху вниз, должно быть, составляло 100 строк кода на Java. Очень лаконично.

Поскольку я ничего не знал о том, как это работает или что он пытается решить, я наткнулся на статью в Википедии:

Алгоритм Дейкстры — это алгоритм поиска кратчайших путей между узлами в графе.

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

Ох, ладно. Так что все, что мне нужно сделать, это смоделировать все точки в здании как «узлы», связать их с помощью «ребер» и назначить расстояние для каждого ребра. Затем алгоритм может использовать эту информацию для определения кратчайшего пути из любой точки A в любую точку B. Звучит просто.

Я скопировал код в свой проект, загрузил его несколькими точками выборки и протестировал на паре конечных точек. Это сработало.

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

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

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

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

Первоначально опубликовано на сайте creactiviti.com 11 июня 2018 г.