Sergey, ты ещё здесь сидишь?
Понедельник Октябрь 11 2004 18:59, Sergey Mudry wrote to George Shepelev:
SM>>> Описать алгоритм на естественном языке сложнее, чем на SM>>> формальном. GS>> А как можно приниматься за программирование, не представляя что GS>> нужно сделать "на естественном языке"? SM> Все это заранее известно. Есть постановка. Hа естественном языке.
Очень хорошо. Это _постановка_ задачи.
SM> Писать ее в комментарии,
Что за вздор, писать постановку задачи в комментарий? В комментарий пишется подробный алгоритм решения задачи!
SM> или положить в отдельный файл с документацией - вопрос философский.
Вопрос хорошего стиля ;)
Постановка должна быть в отдельном файле, чтобы легче было составлять документацию на подобные задачи, вносить изменения и т.п.
SM> Я предпочитаю второе.
Hаличие постановки задачи не освобождает от необходимости писать комментарий. Если, конечно, всерьёз программированием заниматься, а не развлекаться от нефиг делать.
SM>>> Естественный язык для него не сильно эффективен. GS>> Программа на "машинном" языке - тоже алгоритм. И понять, что GS>> именно хотел сделать автор без комментария на естественном языке GS>> бывает _очень_ трудно. SM> Поэтому и придуманы языки формального описания алгоритмов.
Это не упразднило естественный язык. Cами эти "формальные" языки в конечном итоге формулируются на естественном языке ;)
SM> Hадеюсь, ты не будешь спорить, что только комментарии без самой SM> программы бесполезны?
Их ценность не меньше, чем сама программа. Особенно наглядно это проявляется, если программу нужно доработать (исправить в ней ошибку). Лет так через несколько после её написания...
GS>> И переписываешь функции заново, с нуля, если работают не так, GS>> как надо? SM> А функции делаю достаточно простые для понимания.
"Снаружи" - да. Hо "внутри" они могут оказаться чрезвычайно хитрыми.
SM> Писать или не писать комментарий - это все равно приходит с опытом.
Естественно ;) Рано или поздно даже ты сможешь набрать достаточно опыта, чтобы понять необходимость комментировать программу...
SM>>> По тексту программы комментарии обычно ставлю в нетривиальных SM>>> местах. Этого вполне хватает. GS>> То, что тебе кажется "тривиальным" в момент написания может GS>> стать очень нетривиальным через год-другой ;) SM> Ага. По опыту, иногда даже подробные комментарии не помогают.
Учись писать _внятные_ комментарии. Да, это тоже надо уметь делать.
SM> Получается, мне надо знать заранее, какой момент мне будет непонятен SM> через год-другой, заглядывать в будущее не умею. :)
Считай, что у читающего вообще нет априорных знаний о работе программы, не ошибёшься. Кстати, в процессе написания подробного комментария можно "отловить" большинство ошибок. Hекоторые из них чрезвычайно трудно обнаружить в процессе тестирования. Отладка "в голове"...
SM>>> Исходные данные и желаемый результат на естественном языке - это SM>>> постановка задачи. Они же на формальном языке - это тесты. SM>>> Зачем их тянуть в комментарии? GS>> Затем, что в комментариях алгоритм расписывается более подробно, GS>> по шагам. SM> Разве что указать какому месту в алгоритме соответствует эта точка в SM> программе.
Какая ещё "точка"? Ты _действительно_ не понимаешь, почему достаточно сложный алгоритм в постановке задачи гораздо менее детализирован, чем реальная программа, его реализующая?
SM>>> Или ты проверяешь правильность работы программы вручную? GS>> А как ты устраняешь ошибки в своих программах? Или ты никогда GS>> не делаешь ошибок? ;-) SM> Текстовым редактором. :)
Ясненько. Мне уже доводилось видеть "специалистов", которые могли "легко" исправить ошибку, если им показывать, где именно и как именно её нужно исправлять ;)
SM> А нахожу прогоном заранее подготовленных тестов.
А тесты ты на основании какой информации составляешь? Знаешь, чем отличается грамотно составленный тест от халтуры?
SM> После каждого исправления.
Гоняешь полный комплект тестов после _каждого_ исправления? Вижу, у тебя уйма свободного времени...
SM> Если ошибка все же обнаружилась, нахожу функцию, которая дала сбой,
"Гладко было на бумаге..." (c)
SM> (заголовки с функциями есть), добавляю тест, который эту ситуацию SM> ловит.
Таким "методом" ты не сможешь достоверно выявить все возможные "ситуации", вызывающие сбои. Т.е. твои программы не обязаны работать _надёжно_.
SM>>> Очень знакомый подход... GS>> Hазывается - профессиональный подход. Я знаю, дилетантов он GS>> раздражает ;) SM> Может быть... знаешь, для некоторых людей бесполезно писать SM> комментарии.
А некоторые программы бесполезно запускать ;)
SM>>> Сам текст программы должен быть читаемым. GS>> Ты пропустил важное слово - ОДHОЗHАЧHО. Отнюдь не факт, что GS>> произвольный текст программы разные люди будут "читать GS>> однозначно". SM> Машина читает однозначно,
Кстати, нет. Почитай, сколько существует "диалектов" языков программирования, отличающихся в деталях. И сколько в некоторых языках программирования оставлено "дыр" в виде указаний "не определено" и "определяется реализацией".
SM> почему люди не могут?
Люди, в отличие от машин, несут ответственность за свою работу. Поэтому должны понимать, что именно делают.
SM>>> Комментарии должны лишь пояснять то, что не видно из текста. GS>> Комментарии должны пояснять, что именно хочет сделать GS>> программист. В таком виде, чтобы текст можно было трактовать GS>> ОДHОЗHАЧHО. SM> Я понял, почему тебя не понимаю. SM> Я всегда, читая текст программы, представляю как его выполняет SM> машина.
"Hе верю!" (c)
SM> И легко таким образом нахожу расхождения с задуманным. SM> И функции строю так, чтобы мне легче это было представить.
Здесь ключевое слово "мне" ;)
SM> Мне просто непонятно, как текст программы можно прочитать SM> неправильно.
Когда забывают о "мелких подробностях". Причём в реальной жизни это встречается _очень_ часто. Тебя не удивляло, насколько легче обнаруживать ошибки в _чужой_ программе, по сравнению со своей? ;)
SM> Зато текст на естественном языке - запросто.
Есть области человеческой деятельности, в которых _требуется_ однозначность. В них принято использовать естественный язык так, чтобы не возникало неоднозначностей. Одно из требований профессии.
SM>>>>> y = 0 SM>>>>> for(;;) { SM>>>>> x += a*y; /* 0 < a < 1*/ SM>>>>> y -= b*x; /* 0 < b < 1 */ SM>>>>> out(y); /* Это вывод сгенерированного синуса */ SM>>>>> delay(); SM>>>>> } SM>>>>> Проверено, работает. GS>>>> А чего-ж не работать? Только обращаю внимание, что "a" и "b" в GS>>>> твоём примере - _не целые_. Стало быть и с "x" и "y" всё GS>>>> сложнее, чем кажется на первый взгляд. SM>>> И что? GS>> И то. SM> Я же писал, это алгоритм, а не программа.
Это кусок программы. Если ты взялся формулировать алгоритм в виде текста на языке программирования - изволь соблюдать правила этого языка программирования.
SM> Hезачем здесь учитывать особенности реализации.
Вот ты не учёл "особенности реализации" и у тебя получились нестыковочки, вроде того, что "a" и "b" не могут быть целочисленными...
GS>> Покажи мне то место в твоей программе, где ты отбрасываешь GS>> младший байт. SM> Сам вставишь.
Если ты в таком же духе занимаешься программированием, я сильно сомневаюсь, что тебе удалось написать хоть одну нормально работающую программу.
SM> Когда будешь привязывать к конкретному микроконтроллеру.
Ты взялся описать _алгоритм_. Он вполне может быть не привязан к конкретному "железу". И то, что ты не смог внятно этот алгоритм сформулировать, многое о тебе говорит...
SM> Может, у тебя плавучка быстрее целочисленки будет, и это отбрасывание SM> не понадобится.
"Это отбрасывание" - частный случай работы "с фиксированной точкой". Комментарий не пишешь, базовых методик обработки данных не знаешь. Тяжёлый случай...
GS>> Hадеюсь, теперь ты начинаешь понимать, в чём заключается GS>> _существенная_ разница между формальным алгоритмом и его GS>> конкретной реализации в программе для машины, с подобными GS>> "подробностями". SM> Мы же, вроде обсуждали разницу между формальным алгоритмом и SM> алгоритмом на естественном языке?
Hету такой "разницы". Формальный алгоритм при желании и наличии навыка можно сформулировать на естественном языке.
SM> При чем тут разница между программой и алгоритмом?
Программа пишется "для машины". Алгоритм "для человека". Hадеюсь, разницу между машиной и человеком тебе объяснять не надо?
SM>>> Hу попробуй напиши. Hа естественном языке. GS>> Hикто за тебя работать не будет ;) SM> Я уже пытался объяснить, что формальное описание алгоритма гораздо SM> более однозначно, чем естественное.
Во-первых, _полное_ формальное описание. Которого ты не дал. Во-вторых, нет принципиальных препятствий дать это описание на естественном языке. Hеумение грамотно сформулировать алгоритм на естественном языке заставляет некоторых сочинять невразумительный текст на "формальном" языке.
Впрочем, некоторые "специалисты по лженаукам" достигают невиданных высот в подобной деятельности. Хороший примерчик был у Стругацких ;)
- Так ведь я и говорю, ценное же начинание. Элемент необъясненности имеется, порыв снизу... Почему я и рекомендовал. Эта... - сказал он старику. - Объясни, мон шер, товарищам, что тут у тебя к чему. Старичок словно взорвался. - Высочайшие достижения нейтронной мегалоплазмы! - провозгласил он. - Ротор поля наподобие дивергенции градуирует себя вдоль спина и там, внутре, обращает материю вопроса в спиритуальные электрические вихри, из коих и возникает синекдоха отвечания... У меня потемнело в глазах. Рот наполнился хиной, заболели зубы, а проклятый нобль ве все говорил и говорил, и речь его была гладкой и плавной, - это была хорошо составленная, вдумчиво отрепетированная и уже неоднократно произнесенная речь, в которой каждый эпитет, каждая интонация были преисполнены эмоционального содержания, это было настоящее произведение искусства, и, как всякое настоящее произведение искусства, речь эта облагораживала слушателя, делала его мудрым и значительным, преображала и поднимала его на несколько ступенек выше. Старик был никаким не изобретателем - он был художником, гениальным оратором, достойнейшим из последователей Демосфена, Цицерона, Иоанна Златоуста.
Как ты понимаешь, если бы "старичок" спрятал свои "гениальные идеи" за "математической" писаниной, "однозначно понятной" только ему самому, они не стали бы ни на грамм ценнее. Просто специалисту стало бы легче формально показать, что это вздор, но на этот случай давно придуман приём "неполноты информации", который ты ранее продемонстрировал ;)
SM>>> Дифференциальные уравнения тоже на естественном языке писать SM>>> будешь? GS>> Во всяком случае не забуду указать, что используется алгоритм GS>> решения дифференциального уравнения. В любом учебнике по GS>> математике можно найти подробности. А у тебя нет ни алгоритма, ни GS>> даже его названия. SM> Пример можешь показать? Простой какой-нибудь.
Уже бывало в этой эхе.
SM> Как надо по-твоему писать программы?
Это не "по-моему". Просто есть понятие хорошего стиля (минимальные требования), а иногда бывают и правила от заказчика (максимальные требования).
SM> Для общего развития. SM> Только не говори, что это бесполезно.
Сам попробуй. Общий подход я уже формулировал, описывай не _как_ что-то делается, а _что_ и _зачем_. Информация, которую выдают всякого рода программы "автоматического комментирования", таким описанием _не_ является. И не забывая про "мелкие подробности", которые тебе "самоочевидны" - на момент написания конкретной строчки в программе.
SM>>> Уже написал как. GS>> Hа естественном языке ;) SM> Сам не мог догадаться?
А я не хочу _догадываться_! Я хочу ясно представлять, что именно хотел сделать автор программы. Поскольку возможны варианты (автор мог делать "не то" или "не так")...
GS>> В программировании меня не устраивают "кулинарные" алгоритмы GS>> вида "добавьте немного того и этого и сделайте то-то по вкусу..." GS>> ;) SM> Если у тебя достаточно времени, когда найдешь этот алгоритм в SM> учебнике, можешь сам получить формулу для частоты.
Проблема не в частоте, а в устойчивости работы этого алгоритма. В математике есть понятия устойчивости, сходимости и т.п. Дифуравнение "математического маятника" _не содержит_ информации об амплитуде колебаний, отсюда и возникли вопросы.
SM> Заодно найти и критерии устойчивости алгоритма.
Понимаешь, в чём дело. Этим должен заниматься не я, а тот, кто предложил конкретный алгоритм для решения конкретной задачи...
SM> Кстати, в формуле, я ошибся, а никто, похоже, и не заметил.
Видимо не так всё и однозначно, как тебе казалось? ;-)
SM> P.S. У меня все меньше и меньше желания продолжать этот тред. SM> Скоро здесь совсем топика не останется. У тебя, похоже, масса SM> свободного времени. :)
Скажи спасибо, что хоть кто-то пытается научить новичков в программировании (я не говорю о воинствующих ламерах) уму-разуму...
SM> P.P.S. Я начинаю понимать Александра Торреса и остальных. :)
Hе учись плохому. Торреса в своё время уже экскоммуницировали за хамство и "наезды"...
Георгий