Pull to refresh

Comments 25

Что-то типа GEB решили написать в виде цикла статей? :)

>Текущее состояние в области программирования — это обучение ремеслу по большей части личной практикой
>В результате программированию учишься по наитию.
Не понимаю такие обобщения. «в области программирования» — это где? В вашей средней школе? В вашем ВУЗе? В вашей стране (в какой конкретно)? В мире? Если в мире, то откуда вы знаете, как устроено обучение во всем мире? Ну вот не верю я, что знаете. Было бы честнее сказать, что это только личный опыт и есть.

Уж всяко кроме личной практики и наития еще бывают умные книги. Это как минимум.

Кстати, если уж вы стали рассказывать про Тьюринга, то не стоит забывать его учителя Алонзо, и его лямбда-исчисление. Это как минимум другой способ описания алгоритмов. И не последний.
Вы правы. Перестарался с этим обобщением. Конечно, тут говорится о моей школе, моём ВУЗе и месте работы.

А умные книжки — это очень хорошо. Они действительно помогают.

Для лямбда-исчисления А.Чёрча намечена отдельная часть в этой серии статей. Надеюсь, что режим самоизоляции позволит еще поработать в этом направлении.

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

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


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

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


Вы, собственно, для кого статью написали? Для учащегося или для преподавателя?
Почему вы думаете, что учащийся вообще понимает слова, которые вы пишете?


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

Является ли чтение строки из файла "действием"? Даже если имя файла предопределено, я могу произвольно менять его содержимое. А значит результат чтения может различаться от запуска к запуску.

Мне на ранних этапах изучения программирования (в школе или в ВУЗе) было бы очень полезно, если бы кто-то намеренно погонял меня по списку таких «граблей». И наглядно на маленьких потерях (например, специально стертого преподавателем моего отчета по лабораторной) помог усвоить необходимость «бэкапа». И это точно лучше горького опыта с потерянными фотографиями за период 2006-2008 гг. К сожалению, такой «компетенции» в программе по моей специальности не было.

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

Вы, собственно, для кого статью написали? Для учащегося или для преподавателя?
Почему вы думаете, что учащийся вообще понимает слова, которые вы пишете?

Нет, текущая статья — не для учащегося, и не для преподавателя.
Скорее она — для любящего докопаться до мелочей программиста.

Является ли чтение строки из файла «действием»? Даже если имя файла предопределено, я могу произвольно менять его содержимое. А значит результат чтения может различаться от запуска к запуску.

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

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

Простите, но не совсем понял смысл этих предложений. Когда это «раньше» так делали? И что значит «полуавтоматически компилировали в машинные коды».
Да и при разработке блок-схем не нужно быть «художником»!
Может, что то подобное, подразумевалось. :)
Алгоритмический язык ДРАКОН. Практика использования ИС ДРАКОН
Возможно. Но выводы обобщённые делают на основе одного языка. Странно.
Имелся в виду период программирования близкий к эпохе перфокарт:

image

Черчение блок-схем на ватмане (без плоттера) очень близко к рисованию, но, конечно, «художником» можно не быть.
Я и в школе постигал азы алгоритмизации на блок-схемах. Но из «реальных» языков программирования знаю только ДРАКОН
Боюсь, автор много кармы на этой теме не заработает.
Сама идея, взять инуитивно всем знакомое понятие и попытаться дать ему свою формулировку ни к чему кроме споров ни приведет. И дело даже в правильности или нет еще одного определения. В зависимости от того, с какой стороны на данное понятие смотреть, то или иное определение может точнее отражать суть.
Например:
  • описание задачи и получения результата с точки зрения математики является алгоритмом? почему нет! последовательность шагов задается формулами, исполнителем является человек.
  • конвейер по сортировке, например, яблок на фабрике по их упаковке/переработке чем не механический компьютер со специальной программой (меньше размера А — отправить на корм скоту, меньше размера Б — на сок, меньше размера В — на пюре, ...)?
  • электронные устройства взаимодействуют с человеком, под час достаточно сложным образом (у меня микроволновка знает рецептов приготовления блюд больше чем я), всегда ли речь идет о присутствии процессора и программы как таковой? не уверен. хотя само взаимодействие вполне может подчиняться интуитивно понятному алгоритму.
Верно подмечено. Карма это, конечно, важно, но иногда необходим спор.

В зависимости от того, с какой стороны на данное понятие смотреть, то или иное определение может точнее отражать суть

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

Спор нужен для оценки или опровержения этой уверенности.

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

Приведённые же в статье определения алгоритмов — не более, чем вульгаризация для тех, кто не считает знание математики необходимым для написания кода.
Согласен с Вами. И очень люблю эти математические абстракции. В особенности — алгорифм Маркова.

Но есть проблема — разрыв между понятием «алгоритм математика» и «алгоритм программиста». У математика дела обстоят лучше. Его термин очень четко определен. А вот программисту — тяжелее. Разрабатывая алгоритм управления автоматической теплицей, он использует не только «Алфавит» или «Формулы подстановки», но и закономерности распределения потоков воздуха, испарения влаги, суточные изменения температуры. И все эти процессы он применяет в своём алгоритме. Интересно, что определяет возможности программиста в этом творчестве. Нужен способ описать эту деятельность. Пусть пока не формально, но разложить по «кирпичикам».

Определения, используемые в статье, были взяты здесь (Алгоритм (Википедия)). Возможно, они действительно несколько «вульгарны», но это не сильно мешает нам попробовать использовать их для достижения обозначенной цели.

Спасибо Вам за отзыв.
Мне нравится определение алгоритма, как последовательности действий приводящей к результату. Именно эта последовательность действий и остановила развитие вычислительной техники.
Если говорить в целом, думаю автор слишком «мелко копает» и результата не будет. Превратить действия в алгоритм, будто никогда не слышал от товарища командира:
Делай что хочешь, но что бы к утру было ))
Мое мнение, такой посыл и есть главный принцип (основа) работы перспективной вычислительной техники.
Иначе будет как всегда: Я все сделал (последовательность действий), а оно не получилось (синий экран).
>>> в «действии» обязательно участвует некоторый объект или группа объектов;

Не думаю. Существуют процессы без объектов, а вот любой объект всегда часть процесса собственного существования. Я пока тоже не смог полностью уйти от понятия «объекта» в силу его привычности и самоочевидности, но меня не покидает идея, что сам по себе объект = процесс, и как следствие число «сущностей» можно сократить. ;)

>>>для группы объектов «действие» происходит только тогда, когда эти объекты «достаточно близко»;

с практической точки зрения это удобно, и в принципе достаточно объективно, особенно если «достаточно близко» — не буквально, а скорее о каких-то сложных «смысловых пространствах» и расстоянии Хэмминга, но… Ну например: если снайпер стреляет в противника вам придется описать всю весьма нетривиальную систему взаимодействий снайпер-винтовка-заряд пороха-пуля-противник (я уже не говорю о радио и гравитации) в то время, как взаимодействие снайпер-выстрел-противник в общем-то практичнее. Но снайпер и противник далеко друг от друга. Или вам придется добавить в модель условие, что наличие ружья сильно «сближает» людей!

>>> в действии изменяются связи и параметры объектов (включая параметры их движения);

«движение» — лишь один из возможных процессов. Зачем он отдельно? Как пример? «связи» — ранее нигде не определены. Хотя является важным элементом модели.

>>>«действие» всегда и обязательно должно быть повторимо.

Если под действием мы определяем события/процессы, порождаемые исполнителем/зависящие от него — то согласен. Однако не все процессы есть действия исполнителя! Есть процессы относящиеся к описанию системы — не зависящие от нас. К ним критерий «повторимости» не особенно применим.

Итак, нужно расширять/дополнять аксиоматику… Объекты — ок, пусть будут. Действие вы используете только в понятии «собственное действие», а оные являются подмножеством более широкой категории изменений, таких как процессы и события. Так же в отдельный класс можно/нужно вынести такой процесс/событие как взаимодействие. и такую абстракцию, как «связь» (например в приведенном выше примере «выстрел» — однозначно «взаимодействие» и возможно «связь»). И это вы пока не дошли до прчины-следствия, без которых алгоритм невозможен. Впрочем, там еще две части, может уже дошли? ;) Пойду почитаю.

Спасибо за Ваш отзыв.


Посмотрите, пожалуйста, в проекте, указанном в ссылках к статье [Open source (GPL) проект: (Общая теория алгоритмов wiki)]. Там уже есть многое из того, что Вы предложили.


К сожалению, в объеме одной статьи не получается поместить всё.


С уважением.

Sign up to leave a comment.

Articles