Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Итак, вы абстрактный программист в вакууме, работаете десять с лишним лет клепая сайты и решая простые однотипные задачи клиентов/компании. Вам хорошо и уютно в вашей нише, и только мучительно больно за бесцельно потраченное время в классе по теории вычислений и алгоритмическому анализу, который вам ничего не дал. По утрам закуривая сигарету за чашкой кофе, в глубине философских размышлений о бренности бытия вы задумываетесь: зачем же программистам, не решающим сложных задач, знать алгоритмы и основы анализа.
Мне правда непонятно: как можно в такой быстроизменяющейся отрасли пытаться создавать ПТУ?
Например, на мерче Яндекс.Практикума так и написано: ПТУ XXI века :)
Часто студенты делают интересные проекты в университете или для удовольствия
И он, профессионал, пойдёт в первую очередь ко мне, когда ему понадобится отлавливать баги в плавающей арифметики на PHP.В том-то и дело, что не пойдёт. Замена циклов на один SQL-запрос — это впечатляющий пример, но я сталкивался с ещё более впечатляющим: с заменой SQL запроса на тройной вложенный цикл — и получением при этом многократного ускорения! На PHP, да.
Ошибка начинается не в том месте, где кодер начал пытаться придумывать алгоритм, а в том, что в проекте (в спецификации) изначально не было объяснено, что делать. Кодер — исполнитель, он должен первоклассно исполнять. А каков алгоритм — это за него должен был придумать разработчик спецификации, по которой делается проект, точнее даже не он, а математик, продумывающий глубокие схемы взаимодействия всех элементов. Если нет спецификации, то значит сам по себе проект проектируется неправильно.Мне кажется вы сейчас о каком-то другом мире говорите.
Для каждого пункта требуется какой-то алгоритм, но что касается первого — это задача явно не программиста.Какой нафиг «алгоритм расчёт траектории нейтрона»? Тут физика нужна. А вот когда у вас уже есть программа, которая что-то там как-то рассчитывает в малых масштабах — тут уже потребуются и работа программиста. Причём алгоритмы там будут самые банальные, но когда вы обрабатываете сотни петабайт, то… нет, скриптиком для PHP не обойтись.
Хотел сказать, что есть алгоритмы, которые действительно лучше напишет профессионал в конкретной области, отличной от программирования.Не бывает так, извините.
то так важно ли, что после переписывания его со знанием алгоритмов и структур данных, оно станет работать полсекунды или нет?
Я не верю что три таблицы суммарно мегабайт весом нельзя взять запросом, да еще и чтобы построить какой-то график.Это была сложная иерархическая система, описывающая хранение книг в разных подразделениях. С кучей дополнительной информации. А реализована она была в виде списка (то ещё решение, конечно — но уж как было, так было): в записи про книгу была ссылка на ID следующей за ней книги.
А потом система ушла в продакшн, данных стало не мегабайт а под сотню, и вдруг сетка чего-то стала загружена, и вдруг памяти стало не хватать.А вот тут — уже нужно знание предметной области. Да, можно себе представить что вместо 10'000 позиций на складе появится 100'000. Легко. А вот больше — маловероятно. Куда они их складывать-то будут?
«нужны ли программисту алгоритмы» можно перевести как «нужно ли программисту уметь писать код»
оптимально написать что-то на PHP, чтобы сайт не тормози
чтобы писать простенькие сайты и скрипты, не нужно особого знания алгоритмов и структур данных
Итак, вы абстрактный программист в вакууме, только вам мучительно больно за бесцельно потраченное время в классе по теории вычислений и алгоритмическому анализу, который вам ничего не дал.
включая язык, на котором вы пишите.
и не бежали в гугл каждый раз, когда нужно сделать что-то нетривиальное.
Какую бы задачу вы не решали – будь то простой сайт с выборкой данных из БД, или баш скрипт на сервере, вы будете использовать какие-то структуры данных.
Почему в C# нежелательно использовать ArrayList, а вместо него использовать List?
В-третьих – есть множество задач, которые нельзя решить простым вызовом API библиотеки или фреймворка. Что вы будете делать в таком случае?
Если же ваша работа заключается в написание SQL запроса и вбивание команды в консоль, то хочу вас огорчить: вы не программист
Так о том и речь, что нетривиальное в большинстве случаев не требуется.
Вот если я буду использовать List или ArrayList, и у меня вдруг все будет тормозить, я возьму и поищу информацию об этом. А в задачи, где это надо на этапе проектирования, я не лезу. Да и новичков в компании к таким задачам обычно не подпускают.
Вся статья как раз о том, зачем нужно знать алгоритмы тем, кому нетривиальное не требуется.
бесцельно потраченное время в классе по теории вычислений и алгоритмическому анализу
Программист в первую очередь должен уметь анализировать и решать проблемы – это основной навык, которым должны обзавестись выпускники факультетов информатики. Написание кода – это просто необходимый инструмент, который используется для решения задач. Таким образом учить теорию – это наиболее оптимально с точки зрения образования.
В-третьих – есть множество задач, которые нельзя решить простым вызовом API библиотеки или фреймворка. Что вы будете делать в таком случае? Тратить часы на поиски возможных решений и просить помощи у друга?
примитивный text-wrap в одном из визуальных компонентов
Оказалось, что человек, который изначально делал этот проект, нагородил кучу ужасных конструкций из тройных вложенных циклов, которые долго и печально забирали данные из БД, и потом привязывали их к графикам. После небольшого рефакторинга страница стала грузится почти мгновенно.
понимание того, что происходит внутрях полезно знать всем
Для начала надо определиться с терминологией. Под знанием алгоритмов я понимаю знание алгоритмов обработки стандартных структур данных и умение оценивать их сложность в O-нотации — обходы графов, сложность различных сортировок и т.д.
Я говорю о том, что доказательства, приведенные в статье, ничего не доказывают — неправильно объясняют причины и не доказывают необходимость знания алгоритмов для выполнения любых задач.
Вырвал из контекста я те фразы, на основе которых в статье идет дальнейшее доказательство.
С первым предложением согласен, но не понимаю здесь логическую цепочку. «Анализировать и решать проблемы» это практический навык, причем в работе тесно связанный с написанием хорошего кода. А проблемы и методы их решения бывают разные, связанные с теорией алгоритмов и не связанные. Например, правильное применение ООП и паттернов проектирования.
Я наверно неправильно сформулировал ответ по этому пункту. Есть выбор — тратить часы сейчас, читая о любых алгоритмах и решениях, которые попадутся под руку, или тратить часы по мере возникновения задач, читая о решениях, которые требуются именно для этой задачи. Мне кажется, в большинстве случаев правильнее второй вариант, так как и времени уйдет меньше, и можно проверить решение на практике.
Здесь надо уметь представлять задачу и возможные пути решения, знание алгоритмов здесь не нужно. Что вы и сами подтверждаете, упоминая интерна-третьекурсника с аналитическим мозгом.
У меня похожий случай был. И я тоже сделал рефакторинг, хоть и не специалист в алгоритмах. А уж про оценку сложности я тогда и не слышал. Зачем здесь знание алгоритмов?
Понимание принципов работы и знание алгоритмов это не одно и то же.
Собственно, зачем я это все пишу. Я хочу сказать, что факт незнания программистом алгоритмов означает только то, что он не знает алгоритмы. Он ничего не говорит ни о знаниях и навыках в другой области, ни о сложности решаемых задач, ни даже об умении разобраться в алгоритмах в дальнейшем.
Если посмотреть на все эти статьи, то можно заметить, что люди, которые их пишут, фактически обижены на университеты за то, что их заставили учить много сложного материала — в виде алгоритмического анализа, сложных алгоритмов и структур данных — который им вроде бы не пригодился. По сути, авторы статей обижены на университеты из-за того, что там не смогли предсказать будущую область работы авторов и дать им только минимально нужный набор навыков. Ведь действительно, чтобы писать простенькие сайты и скрипты, не нужно особого знания алгоритмов и структур данных. Или всё-таки нужно?
«Любой человек должен уметь менять пеленки, планировать вторжения, резать свиней, конструировать здания, управлять кораблями, писать сонеты, вести бухгалтерию, возводить стены, вправлять кости, облегчать смерть, исполнять приказы, отдавать приказы, сотрудничать, действовать самостоятельно, решать уравнения, анализировать новые проблемы, бросать навоз, программировать компьютеры, вкусно готовить, хорошо сражаться, достойно умирать. Специализация — удел насекомых».Не надоело еще?
Но, в любом случае, конкретными алгоритмами, которые используют в программировании (даже очень сложными) теория алгоритмов не занимается.Вот прямо даже так? Вы вообще список литературы из той статьи, откуда это определения стащили видели? «Дональд Кнут. Искусство программирования.» — не припомнаете, нет? Никакой конкретики? Вот прямо совсем? MIX, MMIX и всё такое?
Если уж автор делает наброс на вентилятор, то сначала нужно научиться правильно термины употреблять.С больной головы…
Любое новое знание, вкладываемое в голову, должно быть экономически оправдано.
Или для вас экономика — это только деньги и их производные?
Как насчет поискать определение для термина «экономически оправданная деятельность»?
Чуть выше вы хотели привести примеры. Я бы хотел их услышать, потому что не могу представить ни одного.
Действительно, если руководствоваться определением из словаря/википедии, вы правы.
В контексте этого обсуждения для меня термин экономической оправданности идентичен термину оптимизируещей функции.
Но господа минусующие не задумались об этом. Не уверен, о чем именно они подумали, но одна из догадок:
«Я N лет пишу сайты/скрипты в 1С, и никогда не пользовался алгоритмами или структурами данных.»Странно. Вроде скриптовый язык 1С — это объектно-ориентированный язык… Как можно писать на нём и не иметь дело со структурами данных?
фактически обижены на университеты за то, что их заставили учить много сложного материала
не решают NP задач
Если же ваша работа заключается в написание SQL запроса и вбивание команды в консоль, то хочу вас огорчить: вы не программист, вы – пользователь
Зачем программисту знать алгоритмы