Важна ли концепция вычислительной сложности для разработчиков программного обеспечения? [закрыто]

11

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

Важна ли концепция вычислительной сложности для разработчиков программного обеспечения? И нужно ли это преподавать на курсах бакалавриата?

Мухаммед Алкарури
источник
1
Чтобы объяснить вопрос на примере: выпускники, с которыми я сталкивался, не знают, что O(n^2)значит.
Мухаммад Алкарури
1
Интересный связанный вопрос: programmers.stackexchange.com/q/20832/6184
Мухаммед Алькарури

Ответы:

12

В большинстве университетов я предполагаю (я надеюсь!), Что сложность времени и памяти определенно является частью их курсов.

Теперь эти "сложности" - очень эластичная тема. Должны ли люди действительно знать всю теорию, например: «ZPP - это класс сложности решений, который можно решить с нулевой ошибкой на вероятностной машине Тьюринга за полиномиальное время». и такие вещи сомнительны. Я лично считаю, что эти передовые теории не имеют отношения к разработке программного обеспечения.

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

dagnelies
источник
8

Многие начинающие страдают от одержимости микрооптимизацией. Учим комп. По моему опыту, сложность направляет студентов к гораздо более практичному способу оценки производительности и масштабируемости.

mpartel
источник
6

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

Хотя я считаю, что общие идеи и концепции важны, я не верю, что их формализация (например, нотация big-O и различная терминология) имеет почти такое же значение, за исключением целей коммуникации. Тот факт, что кто-то не знаком с формальными обозначениями и терминологией, не означает, что они не могут понять, как и почему один алгоритм будет быстрее, чем другой в конкретном случае. Люди могут видеть, что время, затрачиваемое на поиск сбалансированного бинарного дерева, относится к логарифму base-2 числа узлов без предварительного изучения теории сложности в каком-либо формальном смысле, если они понимают, как работает дерево, и имеют разумное понимание высокого школьная математика. Важно знать, когда обращать внимание на сложность и использование памяти, и учитывать типичные и наихудшие случаи, хотя ... но некоторые люди этого не делают.

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

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

Редактировать:

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

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

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

Дмитрий
источник
Интересный альтернативный взгляд. Можете ли вы объяснить, как бы вы представили концепции? Или как ты их понял? Это может указывать на альтернативный способ получить необходимое понимание.
Мухаммед Алкарури
1
@MuhammadAlkarouri Я отредактировал свой ответ, чтобы немного разобраться с этим.
Дмитрий
4

да

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

Обновление: почему это важно

Я был на миграции базы данных на конкретной работе. У нас был крайний срок, когда нужно было выполнить миграцию. Человек, написавший сценарий, не имел оснований в сложности. К сожалению, никто больше не присматривался к логике, которую он использовал в сценарии. Я не помню специфику, кроме того, что он использовал дважды вложенный цикл вместо хеш-таблицы. После недели непрерывного запуска сценария мы взяли логический взгляд и поняли проблему. После изменения прошло около 5 часов. Мы почти пропустили крайний срок завершения миграции из-за того, что кто-то не понимает сложности.

Суть в том, что легко случайно сделать что-то, что на несколько порядков медленнее, или всегда будет не хватать памяти до завершения задания. В то время как более быстрые машины с большим объемом памяти могут уменьшить небольшие ошибки, они часто не могут уменьшить проблемы сложности.

dietbuddha
источник
Но все же, вопрос «это важно?». Потому что даже если они перебирают список пар, означает ли это, что конечный продукт не выполняет то, что должен? Значит ли это, что это медленно? Значит ли это, что они не выполнили ту работу, за которую им платят?
Ям Маркович
Если программа завершится через 2 дня, но вместо этого займет 2 года, я бы сказал, что они не выполнили работу, за которую им заплатили.
dietbuddha
Проблема, как вы описали, была не столько проблемой плохого разработчика, сколько проблемой в процессе принятия решений, которая привела к тому, что неквалифицированный программист стал руководить такой программой.
Ям Маркович
Или, возможно, процесс принятия решений, который приведет к тому, что кто-то, не имеющий квалификации, будет работать в качестве «разработчика программного обеспечения» вместо «младшего разработчика программного обеспечения» или «интерна».
dietbuddha
3

Я считаю, что вопрос о том, «важно это или нет», довольно расплывчатый.

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

Это важно для программистов, которые должны писать чрезвычайно эффективный код или инновационные инфраструктурные алгоритмы? Да.

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

Это важно для программистов, которые разрабатывают GUI для приложений? Вероятно, нет, потому что успешные структуры GUI абстрагируют все эти мелкие детали.

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

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

Но в любом случае, с каких это пор делают CompSci. программы учат людей, как быть хорошими программистами? Для этого у вас есть специализированные программы обучения и практический опыт (ваш или ваши коллеги-программисты, которые могут поделиться своими знаниями с вами).

Ям Маркович
источник
1
Вторая часть, вероятно, менее расплывчата: нужно ли ее преподавать студентам компьютерных специальностей на уровне бакалавра?
Мухаммед Алкарури
1
Я отредактировал свой пост, чтобы ответить и на этот вопрос.
Ям Маркович