netch: (Default)
[personal profile] netch


Продолжение. См. начало.




Второй фактор - понимание концепции "состояния, зависящего от времени" (опять же, на достаточно абстрактном уровне).

Эта концепция стоит в основе процедурных языков (от машинного выполнения и вплоть до высот самых сложных языков вроде C++). Попытаюсь её проиллюстрировать несколькими _контр_примерами (в двух я не сумел помочь, хотя пытался, а в одном - сумел, хоть и не стремился):

Первый - ещё из школьных времён (школа, однако, не простая - физ-мат;))). Одноклассник просит консультацию - "как оно вообще работает?" Я в классе считаюсь самым грамотным в общении с компьютерами (и наверно, заслуженно;)), а он - значительно более хороший математик. На листике написана сакраментальная фраза:

X=X+1


Выяснение контекста приводит к слову "Фортран"... ага, ясно. Сначала долго объяснял, что это - присваивание (а не утверждение равенства и не сравнение), а потом - чему равен X "до", и чему "после"... и вот тут наступил ступор. Сейчас бы я, скорее всего, пошёл по формально-математическому пути: есть "состояние исполнителя", в котором можно определить "переменные", и вот это состояние определённым образом изменяется при каждом выполнении "функции" одного шага исполнителя. Но дал бы что-то этот путь в случае математического мышления ученика? Всё равно нужно сделать так, чтобы что-то облегчало мышление в процедурном стиле.

(Я тут откровенно растекаюсь мысью по древу, но сейчас отвлёкся в вот какую сторону: чем хорош интерактивный отладчик и почему его многие любят несмотря на то, что как инструмент поиска ошибки он далеко не всегда лучший? Кажется, знаю ответ: именно потому, что подсветка (стрелкой, цветом, etc.) даёт _визуальную_ поддержку понятия текущего места исполнения. Что способствует структуризации мышления в нужную сторону.)

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


a := 10;
b := 20;
a := b;
print(a); // что выведет print?


С одноклассником я, похоже, не достиг хорошего результата - школьную информатику (ещё ершовского образца) он прошёл кое-как и, видимо, решил в эту сторону больше не идти. Когда я последний раз про него что-то слышал, он держал книготорговую фирму. А я сейчас думаю: а если бы был выбор между процедурными языками и функциональными - может, на функциональном он бы лучше понял тематику? Математиком-то он был отличным... только вот ближайшее что я мог предложить - это Lisp, и то на бумаге.

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

a[0] := A; b[0] := B;
i = 1;
while (продолжаем) {
  a[i] := f1(a[i-1], b[i-1]);
  b[i] := f2(a[i-1], b[i-1]);
}


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

Третий пример - не из программирования, но по сути о том же. Один знакомый на пару курсов младше (страшный разгильдяй) попросил у меня конспект - выучить и сдать предмет. Я предупредил: у меня нестандартная и совершенно специфическая система сокращений и обозначений, он ничего не поймёт. "Ничего", - сказал он, - "попробую". Через неделю возвращает довольный - говорит, по моему конспекту всё понял и смог сдать на твёрдую тройку (что для него было достижением;)) лучше чем по всем остальным, какие смог найти. Я почти в шоке, начинаем разбираться. Нашли следующие факторы:

1. То, что я тогда добросовестно всё посещал и записывал.
2. То, что обычно хватало времени на то, чтобы всё записать, наверно, благодаря той же системе сокращений.
3. Совет Трофимчука (кибфак поймёт;)) - "Если не хватает времени записывать всё - записывайте не формулы, а слова, которые произносятся между ними. Формулы вы найдете в любом учебнике."
4. Наконец, такая вроде бы мелочь. Как _записать_ (причём без лишних слов) введение нового обозначения? Типичное для промежуточных этапов назначение в стиле "обозначим a^2+3*x*b^3 как z". Что делает... мнэээ... добросовестная девочка (это такой метатип;)), записывая за лектором? Слов в этот момент много, появляется поэтому только формула: "z = a^2+3*x*b^3". А как теперь определить, что это "=" значит - назначение, проверяемое уравнение, уже доказанное уравнение? Заново продумывать всю логику? Так и этого недостаточно - вспоминая курс Оптимальное управление", к которому требовался при полном изложении ещё примерно семестр особой математики, который благополучно похерили (так что я сомневаюсь, что хотя бы три человека с курса его поняли. я не понял.) А я использовал в таком случае знаки ":=" или, наоборот, "=:", что было однозначно понятно любому читающему - что мы тут _назначили_ соответствие. Разумеется, для доказанного и других вариантов были другие знаки.)

В то же время практически все наши преподаватели не могли понять, зачем (на доске) надо что-то особо обозначать - откуда это возникло. Чуть отвлёкся - и на доске тебе абстрактный знак равенства. Сиди и думай, к чему оно... Нет, я безусловно верю, что нормальный студент должен после лекции сам всё продумать, проверить, проработать все промежуточные этапы... но это уже другая тема. А на дворе было начало 90-х.

Так вот - про себя я знаю, что мне в процедурном стиле мыслить легче, чем в функционально-декларативном. Но о чём говорит восприятие моего... мнэээ... коллеги - просто о достаточном уровне разгильдяйства, или же то, что и ему мой стиль "прежде чем что-то использовать, надо определить, откуда и как оно возникло" близок именно из-за его чёткого "временнОго" характера? Или там на самом деле нет явной связи со временем?
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

netch: (Default)
netch

December 2023

S M T W T F S
     12
3456789
10111213141516
171819 20212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 22nd, 2026 04:44 pm
Powered by Dreamwidth Studios