Являются ли все проблемы программирования алгоритмом проблемами? [закрыто]

13

Мне нравится, как «Введение в алгоритмы» Cormen et al. передает знания. Одна из причин заключается в том, что все связано с проблемами программирования, и книга не реализована на каком-либо конкретном языке программирования. Эта языковая независимость позволяет сосредоточиться на идеях в целом.

Так что мой вопрос, как говорится в названии. Каждая решаемая задача программирования разрешима, думая таким алгоритмическим способом. Неважно, какой язык, поле и т. Д.? Если да, дайте аргументы, иначе, дайте аргументы!

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

Витгенштейн
источник
6
Наиболее распространенная проблема для программиста, imho, такова: «О, это было то, что вы имели в виду? Теперь я понимаю. Это не то, что я реализовал, извините». Это проблема программирования?
keppla
1
Этот вопрос очень похож.
back2dos
Вам необходимо составить отчет с клиентом, описать его требования и исходя из этого вам необходимо разработать, протестировать, внедрить, реорганизовать, оптимизировать и поддерживать программное обеспечение. Вам нужны среды для тестирования, разработки, развертывания, запуска и измерения программного обеспечения. В этой системе отдельный алгоритм - это просто деталь реализации.
inf3rno
@Keppla (плюс один) Опа, это проблема с требованиями, коренная причина всех программных проблем
Моуг говорит, что восстановите Monica

Ответы:

29

Это зависит от того, как вы определяете «проблему программирования».

В реальных проектах ответ однозначно НЕТ. Большинство проблем - это даже не технические проблемы, а проблемы со связью, неясные требования и т. Д.

Тогда у вас есть целые предметы проблемных классов, которые почти не требуют алгоритмов. Например, графические пользовательские интерфейсы часто просты для «программирования», но реальная проблема заключается в том, чтобы иметь хороший дизайн (с точки зрения удобства использования, а не только графического вида).

Есть некоторые области, где проблемы имеют тенденцию быть намного более алгоритмическими по природе этой области все же. Например, ИИ является основным предметом, где в основе лежат алгоритмы. Графика может быть интенсивным алгоритмом, но это зависит от того, что именно подразумевается под «Программирование графики».

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

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

Фрэнк
источник
2
Видимо, это также зависит от того, как вы определяете «Алгоритм». Я бы сказал, что очень немногие проблемы требуют новых алгоритмов, но поскольку компьютерная программа состоит только из двух частей - алгоритмов и структур данных - все задачи требуют некоторых алгоритмов, даже если эти алгоритмы тривиальны. Алгоритм не математическая модель, это последовательность инструкций.
Philododad
Это верно в самом строгом смысле этого слова, но я, например, не принимаю в i++качестве нашего нового повелителя .. эээ ... алгоритма.
Фрэнк
Но что, если мы не знали о сложении? Тогда введение сложения станет отличным новшеством в наших исследованиях алгоритмов! И так до тех пор, пока мы не встретим все более сложные алгоритмы.
CMCDragonkai
8

Что вы подразумеваете под проблемой программирования?

Согласно Википедии:

Компьютерное программирование (часто сокращаемое до программирования или кодирования) - это процесс проектирования, написания, тестирования, отладки и поддержки исходного кода компьютерных программ.

Это означает, что программирование в целом больше, чем перевод алгоритмов через код.

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

Точно так же многие задачи разработчика не связаны с алгоритмами. Пример: интернационализация. Точно так же многие приложения (например, CRUD) не слишком часто используют алгоритмы в своем исходном коде (не говоря о базовом коде фреймворка).

Теперь, если вы предполагаете, что в «задаче программирования» «программирование» является синонимом перевода алгоритмов через код, тогда да, логически любая проблема будет проблемой алгоритма: A × n = B × nесли A = B.

Арсений Мурзенко
источник
Есть разница между задачей и проблемой . Ваша проблема не в том, чтобы добавлять модульные тесты или поддерживать унаследованный код, а в решении проблемы, которая находится внутри базы кода, а не в поведении самой программы, которое код представляет в алгоритмах.
zxcdw
Ваша задача, как описано, не меняет поведение программы. Предположительно, это подготовительная работа для некоторых других изменений, которые могут включать или не включать алгоритмы. Я не думаю, что кому-то платят только за то, чтобы целый день перерабатывать рабочий код.
MarkJ
6

Я думаю, что ответ категорически нет . Алгоритмы - это просто строительные блоки в гораздо большем наборе навыков.

Я получил степень по CS, специализируясь на искусственном интеллекте

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

С точки зрения повседневного программирования это означает, что основная проблема заключается в определении подходящего предметно-ориентированного языка (DSL) для данной ситуации. Существует много способов создания DSL. Обычное программирование, в котором определены классы, переменные и методы, фактически создает DSL, потому что оно позволяет вам говорить вещи (сопоставлять свои ментальные структуры с кодом), которые вы не могли бы сказать без них.

Алгоритмы тоже важны, но они являются лишь частью истории.

Майк Данлавей
источник
5

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

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

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

Карл Билефельдт
источник
2

Большинство проблем программирования на самом деле являются проблемами системного администрирования.

Это своего рода легкомысленный ответ, но я обнаружил, что это правда чаще, чем можно было ожидать. Я не знаю, сколько раз я сталкивался со сбоями, потому что DNS был неверно настроен на тестовом компьютере, устаревший процесс все еще работает, загружая процессор / память / порты, программа работает с неправильным идентификатором пользователя и, следовательно, имеет неправильный разрешения, диск был разбит на разделы неправильно, поэтому места не хватило, была установлена ​​неправильная версия файла конфигурации и т. д.

Правильно подобранные алгоритмы обычно составляют лишь небольшую часть проблемы. Остальная часть проблемы - заставить программу работать над решением реальных проблем в реальном мире.

Стюарт Маркс
источник
«Правильно подобранные алгоритмы обычно составляют лишь небольшую часть проблемы» Проблемы на сайте kaggle.com НЕ [ТМ] подходят под это описание.
Гэндальф
Я согласен, я просто поместил их в категорию "сантехника". Работа со службами других программистов, API и иногда фреймворками просто связывает вещи, как кто-то думал, что они должны работать.
Джеффо
2

Я думаю, что да, все проблемы программирования решаемы алгоритмически. Ведь алгоритм - это просто набор инструкций, которые сообщают компьютеру, что делать.

Принимая некоторые из приведенных выше примеров

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

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

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

Но способ, которым вы подходите к добавлению модульных тестов, может быть описан таким алгоритмом, как

  1. Определить новый юнит тест
  2. Написать модульный тест
  3. Применить алгоритм нормализации капитализации
  4. Алгоритм применения комментариев

Пример: интернационализация. Это прекрасный пример алгоритмического решения. Проще всего вы ищете известное слово в словаре и заменяете его на другую языковую форму. (Конечно, реальная жизнь включает предложения и контекст, а алгоритм может включать шаги для проверки носителями языка, но основы верны)

Проблема с большинством ответов «Да» заключается в том, что люди думают об алгоритмах в терминах быстрой сортировки, сортировки по пузырям вместо набора инструкций, которые сводят подробное смутное описание проблемы к набору четко определенной логики / правил.

Армитаж
источник