Меня в свое время очень впечатлил фильм Терминатор 2, первая часть тоже сильно зацепила, но когда я увидел, как Т-1000 легко менял формы и превращал части тела во всякие полезные штуки – то это был абсолютный ВАУ-эффект, который потом долго не мог никто перекрыть в фильмах, возможно только Нео с его уворотами от пуль.
В фильме, конечно, все поставлено так, что старый железный Арни в итоге разобрал T-1000, но согласитесь это несправедливо. И если бы не целый ряд супер-удачных моментов, то T-1000 уже в первых же сценах решил свою задачу уничтожения противников. Это же просто нереально: проникнуть на металлургический завод, оказаться над целым бассейном расплавленного металла, но сейчас не об этом.
Потом я часто вспоминал этого жидкого терминатора. В чем же его преимущества – он сильный, он может подстраиваться под решение самых разных задач. Отрастить себе руки-мечи, превратиться в линолеум или еще много всякого интересного.
Если сравнивать терминаторов, то между ними есть огромные различия. Арни умеет только то, что в него вложили. А T-1000 способен гибче подстраиваться под функции. Более слабая модель очень консервативна, а сильная умеет больше благодаря гибкости.
Способности программиста напрямую зависят от гибкости мышления. Когда я писал диплом, то искал самую разную информацию. Среди прочего нашел очень полезную книгу: «Искусство программирования» Дональда Кнута, прочитал я оттуда буквально несколько десятков страниц и выудил интересный алгоритм спуска по дереву и составлению узлов графа. Тогда для меня это было невероятное открытие, и я смог быстро решить задачу классификации. А после этого внедрил этот алгоритм в свою самописную CMS Sitebill, которая, кстати сказать, до сих пор работает и этот алгоритм является одним из ключевых в системе.
Например, широко применяю этот алгоритм в выводе хлебных крошек, создании каталога с вложенными категориями без ограничения уровня вложенности. Поиске списка объектов для заданного каталога со всеми дочерними подкаталогами и еще несколько других полезных фич, которые я не смог бы реализовать без знания работы алгоритма обхода деревьев.
Это замечательная история. Только мне так понравился этот алгоритм, что я потом практически во всех своих сложных задачах использовал только его, с некоторыми вариациями. Сил на изучение даже этой штуки ушло очень много.
Но на секундочку, я прочитал десять страниц, а в книге около 700 страниц в первом томе из четырех! Представляете, 1% информации, из этой книги обеспечил мне возможность алгоритмического мышления на следующие 17 лет работы.
Честно говоря, простому web-программисту больше и не нужно. Основные задачи – получить записи из базы данных и вывести их в виде красивого списка с пейджером. Редко встречались вложенные циклы для отрисовки каких-то иерархических меню или поиска маршрутов. Например, если требовалось найти расстояние на карте, то я использовал готовые рецепты, не вникая в подробности реализации.
Опыт постепенно копился. Клиенты моей CMS тоже росли. Если раньше они довольствовались простым каталогом на сайте, чтобы рекламу крутить. То постепенно им стало необходимо создавать организационные структуры для разделения доступа своих риэлторов, выделение наставников, руководителей, администраторов и все это с разными правами.
Математически я еще вывозил простые матричные структуры. Но чем дальше, тем сложнее все это давалось. Наконец, уперся в то, что моего математического аппарата стало не хватать. И алгоритмы требовались все более замысловатые.
Это и привело меня к мысли, что я очень долго оставался на примитивном уровне. Мне просто не могли прийти более сложные, интересные задачи с большим бюджетом, потому что я с ними не справился бы в силу своих ограниченных способностей.
С этого момента я решил регулярно прокачивать себя в алгоритмических задачах. Погуглил пару минут и сразу нашел интересный сайт с задачами leetcode.com. От элементарных списков и деревьев, до сложных графов и машинного обучения. Все можно отработать, посмотреть примеры решений и выполнять упражнения с проверкой.
Вывод
Большое количество программистов работает и не особо осознает, насколько они далеки от настоящей профессии. Особенно сейчас, когда можно поставить Wordpress, настроить пару плагинов и довольные клиенты будут щедро платить. А если еще и знаешь как в коде поменять стиль оформления, или новый список сгенерировать, то ты в их глазах, да и в собственных превращаешься в матерого разработчика.
Честно говоря, а зачем напрягаться и изучать что-то новое, если и так деньги платят. Только проблема тут в том, что такие «профессионалы» легко вышибаются с рынка шустрыми новичками, которые также нахватавшись поверхностных знаний, но чуть более свежих, легко перетягивают одеяло на себя.
Тут мне могут возразить опытные разработчика, например, на React’е: «Уж нам-то ничего не угрожает, мы вон чего умеем ваять, никакие конкуренты не помешают». Однако, часто эти программисты превращаются в экспертов одного фреймворка и за пределами этого любимого инструмента ровным счетом ничего не могут сделать. Например, абсолютно не понимают Angular и боятся его как огня.
Настоящую силу программист обретает, когда осознает простую истину – решение задачи с помощью четкого алгоритма, вот та добавочная стоимость, которую он приносит в этот мир, а вовсе не знание отличий Python от PHP.