Re[5]: Императивное программирование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.09.12 16:39
Оценка:
Здравствуйте, alex_public, Вы писали:

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


Когда люди начинают программировать, у них в голове нет никаких абстракций-понятий. Адепты ФП занимаются обманом, не объясняя вычислительную модель заставляют гонять задачи до тех пор, пока в голове у обучаемого не сложится полная картина. Идея рабочая, разница только в том, какой процент студентов сможет освоить это дело.
Re[2]: Императивное программирование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.09.12 16:41
Оценка:
Здравствуйте, b-3, Вы писали:

b-3>Ничего этого, на самом деле, не нужно.

b-3>Достаточно единственной концепции — map

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

b-3>Поясню:

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

b-3>Сложно? Возьмите соседскую девочку и посмотрите, во что она быстрее вьедет. В for или .each.


Проверил на задачах вроде "покупки в магазине". Решение задачи на естественном языке один в один переводится в for.
Re: TMTOWTDI
От: Roman Odaisky Украина  
Дата: 22.09.12 12:47
Оценка:
По-моему, основная проблема здесь — TMTOWTDI. Естественный язык обладает этим свойством (можно перефразировать: TMTOWTSI), поэтому и появляются идиомы (в особо запущенных случаях — кеннинги), и нужно изучать, что же идиомы обозначают и когда они уместны, а когда нет.

По определению, идиома в языке программирования возникает, когда есть несколько способов добиться желаемого, и один из них является более удачным. Нет лишних способов — нет идиом. Если при разработке языка ставить целью единообразие, и, например, имея each, не вводить for в язык вообще, то не будет и проблем с идиомами.

А императивность здесь ни при чём. Что естественнее для начинающего?
quicksort [] = []
quicksort (x:xs) = quicksort small_elements ++ [x] ++ quicksort large_elements
   where small_elements = [y | y <- xs, y <= x]
         large_elements = [y | y <- xs, y >  x]


template <class RAI> // специфичную для C++ магию старался минимизировать
void quicksort(RAI first, RAI last)
{
    if(std::distance(first, last) <= 1)
    {
        return;
    }

    RAI pivot = first;

    typename std::iterator_traits<RAI>::value_type const pivot_value(*pivot);
    std::iter_swap(pivot, last - 1);
    RAI new_pivot = first;
    for(RAI it = first; it + 1 != last; ++it)
    {
        if(!(pivot_value < *it))
        {
            std::iter_swap(new_pivot, it);
            ++new_pivot;
        }
    }
    std::iter_swap(new_pivot, last - 1);

    quicksort(first, new_pivot);
    quicksort(new_pivot + 1, last);
}
До последнего не верил в пирамиду Лебедева.
Re[3]: Императивное программирование
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.09.12 02:58
Оценка:
Здравствуйте, Ikemefula, Вы писали:

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


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


Ага, давай еще формализовывать "эффективность обучения".
Умея работать с функциями и последовательностями можно написать большую часть программ. Зная for и массивы — увы нельзя.

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


I>примерно 90% вузов именно так и готовят, а оставшиеся 10% постепенно отказывается от того бреда что ты перечислил в пользу императивщины, пример — МИТ, Стенфорд. Опаньки !

Не знаю насчет того как готовит MIT и Стенфорд, а вот российсуие вузы крайне плохо готовят программистов.
Re[6]: Императивное программирование
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.09.12 03:02
Оценка:
Здравствуйте, Ikemefula, Вы писали:

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


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


I>Когда люди начинают программировать, у них в голове нет никаких абстракций-понятий. Адепты ФП занимаются обманом, не объясняя вычислительную модель заставляют гонять задачи до тех пор, пока в голове у обучаемого не сложится полная картина. Идея рабочая, разница только в том, какой процент студентов сможет освоить это дело.


А зачем знать "вычислительную модель"? Тем более что она сильно зависит от языка.

Излишнее внимание к вычислительной модели приводит к тому что на собеседованиях по C# люди говорят что value-type это тип, который размещается на стеке.
Re[3]: Императивное программирование
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.09.12 03:03
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, b-3, Вы писали:


b-3>>Ничего этого, на самом деле, не нужно.

b-3>>Достаточно единственной концепции — map

I>Я видел слишком много людей, которые работая программистами, с большим трудом понимали это.


Потому что их учили массвам и циклам for
Re[4]: Императивное программирование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.09.12 07:59
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Ага, давай еще формализовывать "эффективность обучения".

G>Умея работать с функциями и последовательностями можно написать большую часть программ. Зная for и массивы — увы нельзя.

Это вовсе не значит, что в обучении можно пропустить такой вот этап как императивное программирование.
Re[7]: Императивное программирование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.09.12 08:03
Оценка:
Здравствуйте, gandjustas, Вы писали:

I>>Когда люди начинают программировать, у них в голове нет никаких абстракций-понятий. Адепты ФП занимаются обманом, не объясняя вычислительную модель заставляют гонять задачи до тех пор, пока в голове у обучаемого не сложится полная картина. Идея рабочая, разница только в том, какой процент студентов сможет освоить это дело.


G>А зачем знать "вычислительную модель"? Тем более что она сильно зависит от языка.


Для того, что бы писать код самостоятельно. Вычислительная модель завит конечно от языка, но неправильно связывать её с языком. Знаешь вычислительную моджель — сможешь решать задачи на её основе. Не знаешь — ищи рецепты в инете.

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


Твой пример показывает косяки в освоении инструмента. Люди которые вообще не интересуются value-type пишут на редкость тормозной и глючный код.
Re[2]: TMTOWTDI
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.09.12 08:08
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>А императивность здесь ни при чём. Что естественнее для начинающего?


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

Примеры я скипнул. Извини, ни разу не видел начинающего программиста, которому хаскель зашел бы легче, чем Си. Количество кода в сортировке мало чего показывает.
Re[4]: Императивное программирование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.09.12 08:27
Оценка:
Здравствуйте, gandjustas, Вы писали:

I>>Я видел слишком много людей, которые работая программистами, с большим трудом понимали это.


G>Потому что их учили массвам и циклам for


Императивное мышление не получится отменить.
Re[3]: TMTOWTDI
От: Klapaucius  
Дата: 24.09.12 08:41
Оценка: 1 (1) +1
Здравствуйте, Ikemefula, Вы писали:

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


Ну, в обиходе используется арифметика, которая вообще-то декларативна.

I>ни разу не видел начинающего программиста, которому хаскель зашел бы легче, чем Си. Количество кода в сортировке мало чего показывает.


А есть опыт сравнения обучения программистов, начинающих с С и с Хаскеля? Вопрос без подвоха, мне действительно интересен опыт, потому как сам я не знаю ни одного примера обучения программированию на хаскеле, как на первом языке.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[4]: TMTOWTDI
От: Курилка Россия http://kirya.narod.ru/
Дата: 24.09.12 08:48
Оценка: 12 (2)
Здравствуйте, Klapaucius, Вы писали:

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


I>>ни разу не видел начинающего программиста, которому хаскель зашел бы легче, чем Си. Количество кода в сортировке мало чего показывает.


K>А есть опыт сравнения обучения программистов, начинающих с С и с Хаскеля? Вопрос без подвоха, мне действительно интересен опыт, потому как сам я не знаю ни одного примера обучения программированию на хаскеле, как на первом языке.


Вот такая ссылка есть
Re[5]: Императивное программирование
От: Roman Odaisky Украина  
Дата: 24.09.12 10:38
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Это вовсе не значит, что в обучении можно пропустить такой вот этап как императивное программирование.


Верно, но не потому, что оно каким-то образом естественнее для человека, а потому, что на низком уровне компьютер всё равно управляется на 100% императивными методами.
До последнего не верил в пирамиду Лебедева.
Re[6]: Императивное программирование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.09.12 11:35
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

I>>Это вовсе не значит, что в обучении можно пропустить такой вот этап как императивное программирование.


RO>Верно, но не потому, что оно каким-то образом естественнее для человека,


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

> а потому, что на низком уровне компьютер всё равно управляется на 100% императивными методами.


Управление не требует императивщины. Императивщину требует мышление и текущий уровень развития технологий. Например аналогичная проблема есть в менеджменте, когда начинающий руководитель начинает отдавать приказы "каждой гусенице" подчиненного. Со временем это переходит на другой уровень "к времени Х занять точку А" или "уничтожить пулеметное гнездо Б"
Re[7]: Императивное программирование
От: Roman Odaisky Украина  
Дата: 24.09.12 12:24
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Это вовсе не значит, что в обучении можно пропустить такой вот этап как императивное программирование.

RO>>Верно, но не потому, что оно каким-то образом естественнее для человека,
I>Это мышление более прокачано, чем другие виды. Можно проверить как люди решают бытовые проблемы или занимаются планированием. Можно даже посмотреть, как начинающие руководители отдают распоряжения.
>> а потому, что на низком уровне компьютер всё равно управляется на 100% императивными методами.
I>Управление не требует императивщины. Императивщину требует мышление и текущий уровень развития технологий. Например аналогичная проблема есть в менеджменте, когда начинающий руководитель начинает отдавать приказы "каждой гусенице" подчиненного. Со временем это переходит на другой уровень "к времени Х занять точку А" или "уничтожить пулеметное гнездо Б"

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

«Для каждого элемента списка: вывести элемент, затем вывести запятую, если он не последний»

или

«Вывести элементы списка через запятую»?
До последнего не верил в пирамиду Лебедева.
Re[4]: Императивное программирование
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 24.09.12 12:32
Оценка: +2
Здравствуйте, Гест, Вы писали:

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


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

Подобное программирование я бы ассоциировал с карго-культом: пишем аналогично, не понимая сути происходящего, аки жители островов Океании строят радары из бамбука и расчищают взлетные полосы. Работает --- прекрасно. Не работает, --- вызываем специалиста и наблюдаем за магическим ритуалом.

Многие практиковали карго-культы в институте. Не понимая смысла отладки, и вообще, как оно выполняется внутри, оно пробовали решать упражнения по аналогии с решением других упражнений. Так из кода поиска максимального значения на паскале они могли составить код поиска минимального значения. Может вставить одно условие. Но если случайными изменениями кода не удавалось заставить его работать, то выполнить задачу было свыше их сил.
Re[8]: Императивное программирование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.09.12 12:39
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

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


Потому, что это это дается не просто так, а является результатом многолетнего приложения усилий. Привить абстракции сверху, просто объясняя на пальцах, ен получится.
Декларативная арифметика осваивается через императивный период — на пальцах, на палочках, счетах и тд и тд. Только после этого люди могут писать 2+2 и понимать, что же это означает.
Фокус в том, что чем сложнее концепции тем дольше этот самый императивный период по времени.
Re[5]: Императивное программирование
От: Roman Odaisky Украина  
Дата: 24.09.12 12:45
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Я видел слишком много людей, которые работая программистами, с большим трудом понимали это [map].

G>>Потому что их учили массвам и циклам for ;)
I>Императивное мышление не получится отменить.

«Сумма квадратов первых n нечетных чисел» — это императивное или декларативное построение?

-- Сумма     квадратов  первых n  нечетных чисел
-----------  ---------  --------  --------
foldl (+) 0 (map (^2)  (take n    [1, 3..]))

// А это как соответствует человеческому пониманию?
int s = 0;
for(int i = 0, x = 1; i < n; ++i, x += 2) // как бы не ошибиться на единицу
{
    s += x * x;
}
return s;

«Ответом на этот HTTP-запрос есть этот шаблон, заполненный такими-то данными» — где императивность?
До последнего не верил в пирамиду Лебедева.
Re[6]: Императивное программирование
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.09.12 12:49
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

I>>>>Я видел слишком много людей, которые работая программистами, с большим трудом понимали это [map].

G>>>Потому что их учили массвам и циклам for
I>>Императивное мышление не получится отменить.

RO>«Сумма квадратов первых n нечетных чисел» — это императивное или декларативное построение?


Декларативное. Но это только результат и нет ничего про организацию вычислений.

RO>
RO>-- Сумма     квадратов  первых n  нечетных чисел
RO>-----------  ---------  --------  --------
RO>foldl (+) 0 (map (^2)  (take n    [1, 3..]))
RO>

RO>
RO>// А это как соответствует человеческому пониманию?
RO>int s = 0;
RO>for(int i = 0, x = 1; i < n; ++i, x += 2) // как бы не ошибиться на единицу
RO>{
RO>    s += x * x;
RO>}
RO>return s;
RO>

RO>«Ответом на этот HTTP-запрос есть этот шаблон, заполненный такими-то данными» — где императивность?

В задаче для получения результата нужно организовать вычисления. Это совсем не то же самое, что и решать уравнения на бумаге. И осваивается эта деятельность как и все другие, с сенсомоторной стадии,по своей природе императивной.
Re[2]: TMTOWTDI
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 24.09.12 12:55
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>А императивность здесь ни при чём. Что естественнее для начинающего?

RO>
RO>quicksort [] = []
RO>quicksort (x:xs) = quicksort small_elements ++ [x] ++ quicksort large_elements
RO>   where small_elements = [y | y <- xs, y <= x]
RO>         large_elements = [y | y <- xs, y >  x]
RO>


RO>
RO>template <class RAI> // специфичную для C++ магию старался минимизировать
RO>void quicksort(RAI first, RAI last)
RO>{
..................
RO>


Ну это иллюстрация преимуществ встроенной библиотеки для работы со списками. Например, код на C++ вполне может быть и таким:

list list::sort() const
{
  if (empty()) return list();

  list small_elements, greater_elemets;
  for (size_t i=1; i<size(); ++i)
    if (items[i] >= items[0])
      greater_elemets += items[i];
    else
      smaller_elemets += items[i];

  return smaller_elemets.sort() + list(l[0]) + greater_elemets.sort();
}


Ну а так C++ вариант это все-таки сортировка по месту, да и там элемент по честному вытягивается из середины (чтобы не было падения производительности на почти отсортированных последовательностях). Так что изначально сравнивается оптимизированный код против неоптимального, и задается вопрос: а что понятнее???
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.