Чи всі проблеми програмування з алгоритмом? [зачинено]


13

Мені подобається, як "Вступ до алгоритмів" Cormen et al. передає знання. Однією з причин є те, що все пов'язане з проблемами програмування, і книга не реалізована на будь-якій конкретній мові програмування. Ця мовна незалежність забезпечує зосередженість на ідеях загалом.

Тож моє запитання, як сказано в назві. Чи можна вирішити кожну проблему програмування шляхом мислення таким алгоритмічним способом. Незалежно від мови, поля тощо? Якщо так, наведіть аргументи, інакше, аргументуйте!

Я не реалізував багато складних програм з графічним інтерфейсом, AI, графікою тощо ... Але ці проблеми також є питанням продумування хороших алгоритмів?


6
Найпоширеніша проблема для програміста, imho, полягає в тому, що: "о, ТО, що ти мав на увазі? Тепер я розумію. Це не те, що я реалізував, хоча, вибач". Це проблема програмування?
keppla

1
Це питання дуже схоже.
back2dos

Вам потрібно скласти звіт із клієнтом, описати його вимоги та виходячи з цього, ви повинні розробити, протестувати, впровадити, рефактор, оптимізувати та підтримувати програмне забезпечення. Вам потрібні середовища для тестування, розробки, розгортання, запуску та вимірювання програмного забезпечення. У цій системі індивідуальний алгоритм - це лише деталь реалізації.
inf3rno

@Keppla (плюс один) ope, це проблема з вимогами, першопричиною всіх проблем програмного забезпечення
Mawg каже відновити Моніку

Відповіді:


29

Це залежить від того, як ви визначаєте "Проблема програмування".

У реальних проектах відповідь, безумовно, є чітким "НІ". Більшість проблем - це навіть не технічні проблеми, а проблеми зв’язку, вимоги, які є незрозумілими тощо.

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

Є деякі поля, де проблеми, як правило, набагато алгоритмічніші за характером цього поля. Наприклад, AI є основним предметом, де алгоритми лежать в основі. Графіка може бути алгоритмною, але це залежить від того, що саме мається на увазі під "Графічним програмуванням".

Загалом, якщо проблема, яку ви вирішуєте програмно, підходить для математичного подання, то ви входите в алгоритмічну область. Звичайно, це лише приблизний показник, оскільки ви можете створити математичні моделі для майже всього. Але для більшості речей ти зазвичай не вважаєш це робити.

Остаточний приклад: Якщо проблема полягає у створенні графічного інтерфейсу, який дозволяє вводити дані для бізнес-об’єктів, ви б не замислювалися над математичними формулюваннями. Якщо ж проблема полягає у створенні графічного інтерфейсу, який динамічно змінюється і переміщує елементи на основі певного значення важливості, ви, швидше за все, закінчитеся з математичною моделлю та алгоритмічною реалізацією.


2
Мабуть, це також залежить від того, як ви визначаєте "Алгоритм". Я б сказав, що дуже мало проблем потребують нових алгоритмів, але оскільки комп'ютерна програма має лише дві частини - алгоритми та структури даних - всі проблеми потребують деяких алгоритмів, навіть якщо ці алгоритми є тривіальними. Алгоритм - це не математична модель, це послідовність інструкцій.
філосодад

Це правда в його найсуворішому сенсі, але я, наприклад, не приймаю i++наш новий алгоритм , що стосується супергенера.
Френк

Але що робити, якщо ми не знали про доповнення. Тоді введення додавання було б чудовим нововведенням у наших дослідженнях алгоритмів! І так далі, поки ми не зустрінемо все більш складні алгоритми.
CMCDragonkai

8

Що ви маєте на увазі під програмуванням?

За даними Вікіпедії:

Комп'ютерне програмування (часто скорочене до програмування чи кодування) - це процес проектування, написання, тестування, налагодження та підтримання вихідного коду комп'ютерних програм.

що означає, що програмування в цілому по суті більше, ніж переклад алгоритмів через код.

Для прикладу, проблема програмування, яка у мене зараз є, полягає в тому, що мені доводиться мати справу зі застарілим вихідним кодом спагеті, додаючи тести одиниці, а потім переробляючи її . Це також включає додавання коментарів у потрібних місцях, нормалізацію написання великої літери імен тощо. Це не має нічого спільного з алгоритмами.

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

Тепер, якщо ви припускаєте, що в "проблемі програмування", "програмування" є синонімом перекладу алгоритмів через код, то так, логічно, будь-яка проблема буде проблемою алгоритму: A × n = B × nякщо A = B.


Існує різниця між завданням і проблемою . Ваша проблема полягає в тому, щоб не додавати тестові одиниці чи підтримувати застарілий код, це рішення проблеми, яка знаходиться в кодовій базі, а не сама поведінка програми, яку код представляє алгоритмами.
zxcdw

Ваше завдання, як описано, не змінює поведінку програми. Імовірно, це підготовча робота до деяких інших змін, які можуть включати алгоритми або не матимуть цього. Я не думаю, що ніде ніхто платить просто за робочий код рефактора цілий день.
MarkJ

6

Я думаю, що відповідь наголошується « ні» . Алгоритми - це просто будівельні блоки в набагато більшому наборі навичок.

Я здобула ступінь CS, спеціалізуючись на AI

Основна проблема, принаймні, як я бачив, полягала в тому, щоб знайти хороші уявлення для інформації. Ці уявлення повинні намагатися відповідати структурам знань, що знаходяться в головах людей, і повинні полегшувати види маніпуляцій та змін, які робляться на них.

Що стосується повсякденного програмування, це означає, що основна проблема полягає у визначенні правильної мови домену (DSL) для даної ситуації. Існує багато способів створення DSL. Звичайне програмування, де визначені класи, змінні та методи, насправді створює DSL, оскільки воно дозволяє говорити речі (карта вашого розумових структур на код), які ви не могли сказати без них.

Алгоритми також важливі, але вони є лише частиною історії.


5

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

Іншими словами, комп’ютери не хвилюються, чи ваш код абсолютно незрозумілий для людини. У будь-якому випадку вони запускають це добре. Завдання полягає в тому, щоб зробити код достатньо зрозумілим, що будь-які помилки будуть виділятися як біль.

Цікаво, що технічні речі, які я дізнався в коледжі про алгоритми, давно затьмарені тим, що я навчився самостійно з того часу. У цей момент, якби я хотів отримати 3-й ступінь коледжу, щоб допомогти мені в роботі, це було б в англійській композиції.


2

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

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

Правильне встановлення алгоритмів - це лише невелика частина проблеми. Решта проблеми - це налагодження програми для роботи над вирішенням реальних проблем у реальному світі.


"Правильне встановлення алгоритмів зазвичай є лише невеликою частиною проблеми" Проблеми на kaggle.com НЕ [TM] відповідають цьому опису.
Гендальф

Я погоджуюсь, я просто ставлю їх до категорії «сантехніка». Робота з послугами інших програмістів, API, а іноді і фреймворками - це просто з'єднання речей, як хтось вважав, що вони повинні працювати.
JeffO

2

Я думаю, що так, всі проблеми програмування вирішуються алгоритмічним мисленням. Адже алгоритм - це лише набір інструкцій, який повідомляє комп’ютеру, що робити.

Беручи деякі приклади зверху

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

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

Для прикладу, проблема програмування, яка у мене зараз є, полягає в тому, що мені доводиться мати справу зі застарілим вихідним кодом спагеті, додаючи тести одиниці, а потім переробляючи її. Це також включає додавання коментарів у потрібних місцях, нормалізацію написання великої літери імен тощо. Це не має нічого спільного з алгоритмами.

Але спосіб підходу до додавання одиничних тестів може бути описаний за допомогою такого алгоритму, як

  1. Визначте новий блок-тест
  2. Пишіть одиничний тест
  3. Застосувати алгоритм нормування капіталізації
  4. Застосувати алгоритм коментарів

Приклад: інтернаціоналізація Це ідеальний приклад рішення алгоритму. Як найпростіший, ви шукаєте відоме слово у словнику та замінюєте його різною мовною формою. (Звичайно, реальне життя включає речення та контекст; алгоритм може передбачати кроки для перевірки з носіями мови, але основи справджуються)

Питання з більшістю відповідей "Так" полягає в тому, що люди думають про алгоритми в термінах QuickSort, Bubble сортування замість набору інструкцій, що зводять багатослівний розпливчастий опис проблеми до набору чітко визначених логік / правил.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.