Императивное программирование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.09.12 16:07
Оценка:
http://dev.by/blog/67127#devcut1
http://learncodethehardway.org/blog/AUG_19_2012.html

А теперь перечислим концепции, с которыми нужно познакомить читателя, чтобы объяснить ему, как работают, соответственно, циклы .each и for. Начнем с .each:
1.Переменные
2.Массивы
3.Перечни (enumerables)
4.Наследование
5.Примеси и их связь с множественным наследованием
6.Передача и диспетчеризация сообщений
7.Вызовы функций
8.Блоки, передаваемые вызовам функций
9.Вставка переменных в блоки
10.Область видимости – в частности, при работе с блоками

Но это же просто бездна понятий, которые придется объяснять человеку, который порой еще даже не может найти, где у него Terminal, а тем более разобраться, что передается Enumerable из mixin с блоком... А мой метод – сначала научить читателя писать код, а потом уже добиваться его внимания и понимания. Именно поэтому пока что, по моему опыту, сложнее всего научить человека ООП, и это самая неподходящая вещь для абсолютных новичков.

А что насчет циклов for?
1.Переменные
2.Массивы
3.Оператор if
4.Команды перехода (goto или jump)

И все. Я могу научить человека работе с циклом for, объяснив только четыре эти концепции.

Re: Императивное программирование
От: Sharov Россия  
Дата: 20.09.12 16:10
Оценка: +2
Здравствуйте, Ikemefula, Вы писали:

и?
Кодом людям нужно помогать!
Re: Императивное программирование
От: batu Украина  
Дата: 20.09.12 17:00
Оценка:
Здравствуйте, Ikemefula, Вы писали:
>Но это же просто бездна понятий, которые придется объяснять человеку, который порой еще даже не может найти, где у него Terminal, а тем более разобраться, что передается Enumerable из mixin с блоком... А мой метод – сначала научить читателя писать код, а потом уже добиваться его внимания и понимания. Именно поэтому пока что, по моему опыту, сложнее всего научить человека ООП, и это самая неподходящая вещь для абсолютных новичков.

I>А что насчет циклов for?

I> 1.Переменные
I> 2.Массивы
I> 3.Оператор if
I> 4.Команды перехода (goto или jump)

I>И все. Я могу научить человека работе с циклом for, объяснив только четыре эти концепции.


I>[/q]

Я думаю массивы даже лишнее что бы объяснить императивную парадигму. Это структуры данных. А вот присвоения не хватает.
ООП это уже стиль программирования.. Не думаю что и ООП будет сложно объяснить начав с процедуры, затем функции.. затем класс..
И вообще что бы объяснять нужно самому твердо усвоить..
Re: Императивное программирование
От: b-3 Россия  
Дата: 20.09.12 17:17
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>А теперь перечислим концепции, с которыми нужно познакомить читателя, чтобы объяснить ему, как работают, соответственно, циклы .each и for. Начнем с .each:

I> 1.Переменные
I> 2.Массивы
I> 3.Перечни (enumerables)
I> 4.Наследование
I> 5.Примеси и их связь с множественным наследованием
I> 6.Передача и диспетчеризация сообщений
I> 7.Вызовы функций
I> 8.Блоки, передаваемые вызовам функций
I> 9.Вставка переменных в блоки
I> 10.Область видимости – в частности, при работе с блоками
Ничего этого, на самом деле, не нужно.
Достаточно единственной концепции — map

Поясню:
1. Символ из .each не является примером переменной, потому что в норме не изменяется;
2. Массивы тут не при чём, поскольку обращения по индексу в .each не происходит;
3. Перечни (enumerables) тождественны спискам в данном контексте;
4-5. Наследование и примеси не имеют смысла, это способ реализации типа "перечисление" в конкретном ЯП.
6. Передача и диспетчеризация имеют к .each такое же отношение, как и скажем движение указателя стека;
7. Вызовов функций в приведённом примере кода нет (на уровне синтаксиса)
8. Блок, передаваемый вызову функции, также деталь реализации, которая для понимания не нужна
В сухом остатке имеем "область видимости", "метод" и "перечисление". Плюс нечто, применяющее метод к каждому элементу перечисления.

Сложно? Возьмите соседскую девочку и посмотрите, во что она быстрее вьедет. В for или .each.
Забанен с формулировкой "клинический дисидент".
Re: Императивное программирование
От: Гест Украина https://zverok.github.io
Дата: 20.09.12 17:28
Оценка: 9 (1) -1
Здравствуйте, Ikemefula, Вы писали:

Ох уж мне эти теоретики.

Покажите школьнику

var
  a: array[1..5] of integer = (1,2,3,4,5);
begin
  for i := 1 to 10 do
    writeln(a[i])
end


и

[1,2,3,4,5].each{|e| puts e}


И посмотрите на его реакцию.

Я — показывал.
Re: Императивное программирование
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 20.09.12 17:42
Оценка: +2
I>И все. Я могу научить человека работе с циклом for, объяснив только четыре эти концепции.

начинай сразу с объяснения машины тьюринга — там концепций еще меньше..

ps
Если серьезно — то необходимо не минимальное кол-во концепций, а возможность за минимальное кол-во усилий решить реальную задачу стоящую перед пользователем. На основе лишь концепций массив, переменная, if и goto — это сделать очень и очень непросто.
Re[2]: Императивное программирование
От: AlexRK  
Дата: 20.09.12 17:45
Оценка: +5 -1
Здравствуйте, Гест, Вы писали:

Г>Покажите школьнику


Код на паскале читается проще, несмотря на больший объем. Считай, программа последовательно и читается, как есть. Что написано, то и происходит.
А код на руби школьник — даже если и угадал, что программа делает — я думаю не понял.

Г>Я — показывал.


Ну, реакция одного школьника, какой бы она ни была, ничего не доказывает и не опровергает.
Re[3]: Императивное программирование
От: Гест Украина https://zverok.github.io
Дата: 20.09.12 17:51
Оценка: +1 -1
Здравствуйте, AlexRK, Вы писали:

ARK>Здравствуйте, Гест, Вы писали:


Г>>Покажите школьнику


ARK>Код на паскале читается проще, несмотря на больший объем. Считай, программа последовательно и читается, как есть. Что написано, то и происходит.

ARK>А код на руби школьник — даже если и угадал, что программа делает — я думаю не понял.

Если вам действительно кажется, что "код на паскале читается проще" — поздравляю, у вас инженерчанка!

В коде на руби написано "раз, два, три, четыре, пять — каждый — напечатать"

В коде на паскале написана криптография.

Иными словами, код на паскале ДЕЙСТВИТЕЛЬНО требует объяснения всех вот тех понятий, перечисленных в исходном посте.

Код на руби объясним через "человеческие" понятия, и позволяет сначала сделать что-то интересное, а потом уже по мере необходимости разбирать, как это всё работает и почему.

Г>>Я — показывал.


ARK>Ну, реакция одного школьника, какой бы она ни была, ничего не доказывает и не опровергает.


Кто говорил про одного? Я учителем информатики в школе работал.
Re[4]: Императивное программирование
От: AlexRK  
Дата: 20.09.12 18:09
Оценка: +1
Здравствуйте, Гест, Вы писали:

Г>Если вам действительно кажется, что "код на паскале читается проще" — поздравляю, у вас инженерчанка!


Да, действительно кажется.

Г>В коде на руби написано "раз, два, три, четыре, пять — каждый — напечатать"


Хм. А что там за "e"? Или такие мелочи на данном уровне абстракции не важны?

Г>В коде на паскале написана криптография.


В коде на паскале написано:
1) объявить структуру данных "массив" с пятью элементами;
2) взять с первого по десятый элементы массива и напечатать.

Если вам действительно кажется, что "в коде на паскале написана криптография" — поздравляю, у вас рубичанка!

Г>Иными словами, код на паскале ДЕЙСТВИТЕЛЬНО требует объяснения всех вот тех понятий, перечисленных в исходном посте.


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

Г>Код на руби объясним через "человеческие" понятия, и позволяет сначала сделать что-то интересное, а потом уже по мере необходимости разбирать, как это всё работает и почему.


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

Г>Кто говорил про одного? Я учителем информатики в школе работал.


Окей, скольким же вы показывали и каковы результаты?
Re[5]: Императивное программирование
От: Гест Украина https://zverok.github.io
Дата: 20.09.12 18:34
Оценка: -1 :)))
Ох. Простите ради бога, я не готов общаться на таком накале инженерного мышления.
Re[2]: Императивное программирование
От: alex_public  
Дата: 20.09.12 19:04
Оценка: +1
Здравствуйте, Гест, Вы писали:

Г>Ох уж мне эти теоретики.

Г>Покажите школьнику
...
Г>И посмотрите на его реакцию.
Г>Я — показывал.

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

Например возьмём Питон (кстати, а почему его до сих пор нет в списке подсветки форума, хотя он явно популярнее всяких там nemerle?).

Императивный пример:
a=[1, 2, 3, 4, 5]
for i in range(len(a)): a[i]=a[i]*a[i]
print a

Функциональный пример:
a=[1, 2, 3, 4, 5]
a=map(lambda x: x*x, a)
print a

Ну и какой из этих двух примеров проще для восприятия школьником? ) Фиг знает уже...

Да, кстати, лично мне оба не нравятся и я предпочитаю третий питоновский вариант, через генераторы. Который кстати выглядит чем-то промежуточным:
a=[1, 2, 3, 4, 5]
a=[x*x for x in a]
print a
Re[3]: Императивное программирование
От: Гест Украина https://zverok.github.io
Дата: 20.09.12 19:24
Оценка: 9 (1) +1 :)
Здравствуйте, alex_public, Вы писали:

_>Здравствуйте, Гест, Вы писали:


Г>>Ох уж мне эти теоретики.

Г>>Покажите школьнику
_>...
Г>>И посмотрите на его реакцию.
Г>>Я — показывал.

_>Безотносительно к теме обсуждения, но данный пример это типичная подтасовка и демагогия. Естественно что будет такая разница в восприятие, при использование принципиально разных языков, с разной типизацией! А слабо один использовать?


_>Например возьмём Питон (кстати, а почему его до сих пор нет в списке подсветки форума, хотя он явно популярнее всяких там nemerle?).


Python — на мой личный вкус — вообще чудо "понятности".

Ну вот, пожалуйста:

array = [1,2,3,4,5]

# подход, названный туповатым автором исходной статьи "объектно-ориентированным"
# хотя на деле он, понятно, функциональный
array.each do |e| 
  puts e
end

# императивный подход
# (хотя руби - мой основной язык - это первый раз в жизни я использую его цикл for)
# что о чём-то да говорит
for i in 0...5
  puts array[i]
end


По-моему, разница очевидна. В первом случае, мы "перебираем этот список, делая что-то с каждым элементом e", второй вводит дополнительную переменную, какие-то цифры (хотя по-честному следовало написать 0...array.size), понятие "индексации массива", объяснение "индексации с нуля" (для большинства языков).

Просто у автора исходной статьи такая же инженерчанка, как у AlexRK — люди с таким типом мышления не давали бы прав водителям, которые не могут собрать-разобрать "Жигули" с закрытыми глазами. Поэтому мой первый пример они начнут объяснять с лямбд и функций высшего порядка.
Re[3]: Императивное программирование
От: Гест Украина https://zverok.github.io
Дата: 20.09.12 19:28
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Здравствуйте, Гест, Вы писали:


_>Например возьмём Питон (кстати, а почему его до сих пор нет в списке подсветки форума, хотя он явно популярнее всяких там nemerle?).


_>Императивный пример:

_>
_>a=[1, 2, 3, 4, 5]
_>for i in range(len(a)): a[i]=a[i]*a[i]
_>print a
_>

_>Функциональный пример:
_>
_>a=[1, 2, 3, 4, 5]
_>a=map(lambda x: x*x, a)
_>print a
_>

_>Ну и какой из этих двух примеров проще для восприятия школьником? ) Фиг знает уже...

_>Да, кстати, лично мне оба не нравятся и я предпочитаю третий питоновский вариант, через генераторы. Который кстати выглядит чем-то промежуточным:

_>
_>a=[1, 2, 3, 4, 5]
_>a=[x*x for x in a]
_>print a
_>



А, адеквтаное отображение именно ваших питоновских примеров:

# императивный:
for i in 0...a.size
  a[i] = a[i]*a[i]
end

# функциональный:
a = a.map{|e| e*e}


Аргументы применимы все те же, что и в моём предыдущем сообщении.
Re: Императивное программирование
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.09.12 20:50
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>http://dev.by/blog/67127#devcut1

I>http://learncodethehardway.org/blog/AUG_19_2012.html

I>

I>А теперь перечислим концепции, с которыми нужно познакомить читателя, чтобы объяснить ему, как работают, соответственно, циклы .each и for. Начнем с .each:
I> 1.Переменные
I> 2.Массивы
I> 3.Перечни (enumerables)
I> 4.Наследование
I> 5.Примеси и их связь с множественным наследованием
I> 6.Передача и диспетчеризация сообщений
I> 7.Вызовы функций
I> 8.Блоки, передаваемые вызовам функций
I> 9.Вставка переменных в блоки
I> 10.Область видимости – в частности, при работе с блоками


Мне повезло, я не знаю Ruby. В приведенном примере с each не увидел:
1) перечней или массивов, там явно что-то одно
2) Наследования, примесей и диспетчеризации. На таком уровне обучения можно .each рассматривать как бинарный оператор для arr и того что внутри скобок.
3) Блоки, передаваемые вызовам функций, Вставка переменных в блоки, Область видимости – в частности, при работе с блоками — WTF? Там есть простая лямбда функция, без всяческих замыканий.

Итого: переменные, вызовы функций, последовательности, лямбда-функции (анонимные функции).


I>

I>А что насчет циклов for?
I> 1.Переменные
I> 2.Массивы
I> 3.Оператор if
I> 4.Команды перехода (goto или jump)

I>И все. Я могу научить человека работе с циклом for, объяснив только четыре эти концепции.


А разве для for\in не надо понимать те же самые последовательности? Автор что-то лукавит.


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

Поэтому научив последовательностям (как они работают, а не как устроены) и each\map\fold\filter\flatmap\какие_там_еще_функции можно ожидать что человек таки напишет программу, такую что другой человек её поймет.
А вот если обучать массивам, goto, присваиваниям итп, полученная программа будет понята только компьютером, и то не факт что правильно.
Re[2]: Императивное программирование
От: Sharowarsheg  
Дата: 20.09.12 20:54
Оценка:
Здравствуйте, Гест, Вы писали:

Г>Ох уж мне эти теоретики.


Г>Покажите школьнику


Вы бы еще hello world показывали.
Re[4]: Императивное программирование
От: alex_public  
Дата: 20.09.12 21:41
Оценка:
Здравствуйте, Гест, Вы писали:

Г>А, адеквтаное отображение именно ваших питоновских примеров:

Г>
Г># императивный:
Г>for i in 0...a.size
Г>  a[i] = a[i]*a[i]
Г>end

Г># функциональный:
Г>a = a.map{|e| e*e}
Г>

Г>Аргументы применимы все те же, что и в моём предыдущем сообщении.

Вот это уже достаточно объективный пример для дискуссии о сравнение понятности кода в императивном и функциональном стиле.

Ну что тут можно сказать (кстати с Ruby я не знаком)... Лично мне конечно ближе второй вариант (с одной поправкой — см. ниже). Но это естественно потому, что я хорошо знаком с функциональным стилем. Я не уверен что он бы мне более понятен в тот момент, когда я начинал изучать программирование.

Поправка. Я не знаю тонкостей реализации Ruby, но подзреваю что второй вариант всё же выделяет дополнительную память. Соответственно если мы имеем дело с массивом не из пары чисел, а на гигабайт, то разница между стилями будет уже не только в понятности кода, но и в работе, что как бы сразу всё определяет.
Re[3]: Императивное программирование
От: Философ Ад http://vk.com/id10256428
Дата: 20.09.12 21:56
Оценка: +1 -2 :)
Python ужасен.
Руби я никогда раньше не видел, но код на руби мне понравился сразу, а в код на питоне я некоторое время фтыкал...
Всё сказанное выше — личное мнение, если не указано обратное.
Re[2]: Императивное программирование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.09.12 16:27
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>начинай сразу с объяснения машины тьюринга — там концепций еще меньше..


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

DG>ps

DG>Если серьезно — то необходимо не минимальное кол-во концепций, а возможность за минимальное кол-во усилий решить реальную задачу стоящую перед пользователем. На основе лишь концепций массив, переменная, if и goto — это сделать очень и очень непросто.

В общем случае нужно объяснять вычислительную модель.
Re[2]: Императивное программирование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.09.12 16:32
Оценка:
Здравствуйте, gandjustas, Вы писали:


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


Вообще то надо, разумеется для случая, если пользователь ЯП будет писать код самостоятельно а не набирать из книги рецептов.

G>Поэтому научив последовательностям (как они работают, а не как устроены) и each\map\fold\filter\flatmap\какие_там_еще_функции можно ожидать что человек таки напишет программу, такую что другой человек её поймет.


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

G>А вот если обучать массивам, goto, присваиваниям итп, полученная программа будет понята только компьютером, и то не факт что правильно.


примерно 90% вузов именно так и готовят, а оставшиеся 10% постепенно отказывается от того бреда что ты перечислил в пользу императивщины, пример — МИТ, Стенфорд. Опаньки !
Re[4]: Императивное программирование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.09.12 16:36
Оценка:
Здравствуйте, Гест, Вы писали:

Г>Просто у автора исходной статьи такая же инженерчанка, как у AlexRK — люди с таким типом мышления не давали бы прав водителям, которые не могут собрать-разобрать "Жигули" с закрытыми глазами. Поэтому мой первый пример они начнут объяснять с лямбд и функций высшего порядка.


Выйди на базар какой или просто послушай, как люди планируют скажем покупки или ремонт и тд и тд — императивщина чистой воды. Обычно это так: "Зайди в Соседи, купи молока, сыра, если не будет Рокфора, возьми Мацарелу, посмотри колбаски, если будут Охотничьи, возьми два десятка, прихвати два десятка яиц и если будет Очаково Черное, возьми две бутылки"
То есть, это люди так думают на родном языке, в чисто императивном стиле. Странно ожидать, что программировать они будут в каком то другом стиле.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.