Pull to refresh

Comments 15

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

Если бы это было невозможно, то не нужны бы были тестировщики
тестирование нужно не из-за нечетко поставленной задачи, а из-за неверной ее интерпретации разработчиком, или банальных ошибок при реализации. как бы строго задача не ставилась, баги будут до тех пор, пока реализацию пишет человек.
то же касается и тестировщиков. пока программу тестирует человек, нет гарантии, что он выявит все несоответствия требованиям, или верно интерпретирует их.
а нечетко поставленная задача просто еще более усиливает человеческий фактор, т.к. разработчик должен самостоятельно принимать решение в неучтенных ситуациях.
собственно абсолютно четко поставленная задача — это и есть сам код программы, не содержащий ошибок.
И что же такое программа, не содержащая ошибок? Дайте критерий существования ошибок в коде программы.
я имел ввиду, что любое текстовое, графическое и другое описание требует интерпретации разработчиком для написания кода. и на этом этапе неизбежны ошибки. сам же код является строгим и определенным, в нем не может быть двоякости толкования. в этом смысле, сам код является единственной точной спецификацией того, что выполнит программа после компиляции.
Любой код может «толковаться» по разному различными компиляторами под различные платформы. Да хотя бы посмотрите на один и тот же html код в разных браузерах и усомнитесь в своей несостоявшейся философии.
грубо говоря, независимо от того, что написано в требованиях, и насколько четко, нет никаких гарантий, что код не будет содержать ошибок. и тестирование нужно именно по этой причине.
цитата: «Если в программе больше 5 строк — в ней есть ошибка».
;-)
Существует общепринятое и распространенное мнение, что компьютеры могут делать только то, на что их запрограммировали. Это ложное суждение [...] Таким образом, компьютеры не надо программировать, слишком четко и ясно формулируя, что именно нужно выполнить и как именно это надо сделать.


Не понимаю…

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

Если программа что-то позволяет сделать, значит ее в том числе и на это программировали. И не обязательно делали это осознанно, и не обязательно в ходе программирования представляли все возможные эффекты. Да и во многих случаях вовсе не обязательно все эти эффекты представлять.

Вообще в отношении программиста/пользователя и результата выполнения программы можно выделись следующие варианты:
1. Ожидаемый результат выполнения программы совпадает с реальным результатом. Комментировать здесь особенно нечего: все так, как и должно быть.
2. Ожидаемый результат выполнения программы не совпадает с реальным результатом. Возможно, имеет место ошибка в программе, которую программист может найти и исправить. Если ошибки в программе нет, то либо есть ошибка с прогнозированием результата (неадекватные ожидания), либо см. вариант 3.
3. Программист/пользователь на самом деле не знает, чего ожидать от программы, поэтому результат выполнения программы может его удивить. Но это не обязательно плохо. Возможно, здесь просто имеет место сложная логика исполнения программы, которая даже будучи безошибочной может давать непредсказуемые (вернее будет говорить — трудно предсказуемые), но тем не менее верные результаты.

Таким образом, я не вижу причин считать ложным мнение «компьютеры могут делать только то, на что их запрограммировали». Это в моем понимании все-таки истина. Чудес не бывает: исправный компьютер делает только то, что предусмотрено (явно или неявно, сознательно или неосознанно) в программе. При этом я полностью согласен с мыслью, высказанной в заголовке заголовком топика: программирование действительно хороший способ выражения туманных идей. Но суждения и умозаключения по тексту местами заставляют меня морщиться.
На мой взгляд, вы путаете понятия «запрограммировано человеком» и «запрограммировано физикой». Автор оспаривает мнение, которое заключается, на мой взгляд, в следующем: компьютер может делать только то, что ему «приказал» программист (человек) — т.е. компьютер не может «творить», делать что-то вне рамок, которые обозначил человек. Идея автора в том, что под фразой «компьютер может выполнять только предопределенную последовательность операций» можно понимать как то, что единственное, что может вычислительная машина — это последовательно исполнять заданный набор инструкций (это физическая основа), как и то, что этот набор инструкций предопределен автором программы, которая исполняется на вычислительной машине. И если с первым утверждением спорить бессмысленно, то второе — обычно неверно.

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

Такие выводы тем очевидней, чем сложнее системы мы рассматриваем.
Что значит «запрограммировано физикой»?

Я все-таки настаиваю на том, что исправный компьютер может делать только то, что ему «приказал» программист (даже если это было сделано неявно или не полностью осознанно). При этом я согласен с тем, что компьютер вполне может делать что-то вне рамок, которые имел в виду человек. И абсолютно не вижу здесь какого-либо противоречия.

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

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

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

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

Это отнюдь не говорит о том, что компьютер в принципе не может творить. Может! Но только в том случае, если творить может программа, написанная программистом.

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

Чтобы было более понятно, приведу пример.
Существует «алгоритм построения муравейника», представьте поле заполненное муравьями, на поле в произвольном порядке лежат палочки, и произвольным образом бегают муравьи. Пускай муравей при столкновении с палочкой поднимет и несёт ей, если до этого у него палочки не было, и положит палочку, если он уже несёт её. Так вот алгоритм этот легко программируется, и код очень строгий-простой, но вот ответить на вопрос что делает программа непросто.

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

Т.е. программа действует строго по тому алгоритму, который мы запрограммировали, но делает она каждый раз разное.
ну так разве начальное расположение муравьёв и палочек не есть входные данные, программирующие поведение системы?


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

Картинка спёрта отсюда, если что.
судя по примерам, автор говорит о программах, меняющих свою логику под воздействием входных данных.

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

кто переводит с русского на английский — интерпретатор или подаваемая на него программа? а если провести грань между ними сложно, как в вышеприведённой программе STUDENT?

парадокс описан ещё Джоном Сёрлем
Sign up to leave a comment.

Articles