Кто годится в программисты
Thursday, 1 February 2007 15:53(По наводке
avva).
Если вы достаточно хорошо понимаете английский язык, но при этом не сталкивались с программированием, то можете проверить себя вот по этому тесту. Вот здесь говорят, что около 50% людей не способны пройти этот тест - и, самое главное, не способны понять концепцию присваивания значения переменной даже после обучения. То есть в принципе не годятся в программисты.
Если вы достаточно хорошо понимаете английский язык, но при этом не сталкивались с программированием, то можете проверить себя вот по этому тесту. Вот здесь говорят, что около 50% людей не способны пройти этот тест - и, самое главное, не способны понять концепцию присваивания значения переменной даже после обучения. То есть в принципе не годятся в программисты.
no subject
Date: Thursday, 1 February 2007 14:10 (UTC)но теперь уже все основательно подзабылось
и первый вопрос теста честно поставил меня в тупик; если бы ты не сказал про "присваивание" - я бы, может, не смогла ответить вообще
что уж тут говорить о несчастных студентах первого года на третьей их неделе обучения?
no subject
Date: Thursday, 1 February 2007 14:18 (UTC)int a = 10;
int b = 20;
a = b;
получится
a = 20 b = 20 ?
Ну... "не дай бог так оголодать". В смысле, не дай бог настолько забыть основы программирования.
А прелесть этого теста в том, что его сравнили с результатами обучения этих же студентов. Те, кто не догадались, что там к чему, так и не смогли затем обучиться - хотя их учили и объясняли. Вот это совершенно неожиданный для меня результат.
no subject
Date: Thursday, 1 February 2007 14:57 (UTC)Не верю.
У нас в школе на уроке информатики бейсик проходили - и все что-то как-то писали. Значит, 100% нашего класса понять присваивание были способны.
no subject
Date: Thursday, 1 February 2007 15:36 (UTC)Ну а насчет оголодать - думаю, если придется, я все вспомню, чему училась. Но, наверное, не придется.
no subject
Date: Thursday, 1 February 2007 16:00 (UTC)no subject
Date: Thursday, 1 February 2007 17:21 (UTC)Людей, совершенно неспособных учиться даже на тройки, обычно называют не неспособными к программированию, а иначе.
Вот я понимаю, не быть способным понять рекурсию. Как я.
no subject
Date: Thursday, 1 February 2007 17:24 (UTC)Не думаю, что люди с нормальным мышлением (да хотя бы с хорошим математическим образованием) будут вникать в это уродство и воспринимать его как должное: ведь их учили, что значения символов не изменяются, если это не связано с обозначениями (например, в правой части выражения "f(x) = x^2" очевидно, что "x" может быть любым, но это из-за обозначения (обозначение определения функции в математике; на самом деле, есть и формальная теория, которая всё это нормально описывает)).
Я сам тест не увидел из-за .doc-формата, однако в обсуждении увидел пример
В первую очередь подумалось: "а зачем они объявляют типы, когда и без этого ясно, что это целые числа, т.к. без '.' внутри", во вторую очередь -- "дык ясно, 'False' получится". Только потом почитал, что они состояние хотели узнать. Ну так понятно, почему это у них возникло. В ц/ц++ ситуация уродская: позволены 1) объявления переменных без начального значения, 2) позволены одновременно и объявления вида "type var = val;", и присваивания вида "var = val;", что весьма путает людей, так как нелогично либо 1) иметь неинициализированные переменные с хрен знает каким значением, либо 2) иметь одинаковое обозначение как для инициализации, так и для присваивания.
Так что этот тест максимум что способен вычислить -- способность человека пользоваться виртуальным ластиком (затирать прошлые значения "переменных") и осознание переменных как "ячеек памяти, которые могут изменяться", что, в свою очередь, объясняет склонность к императивному программированию. Я рад, что _меньше_ половины людей (44%, если я правильно увидел) к нему имеют изначальную склонность -- значит, в будущем может быть ситуация получше, чем есть сейчас.
no subject
Date: Thursday, 1 February 2007 17:46 (UTC)no subject
Date: Thursday, 1 February 2007 18:19 (UTC)Либо "x^2 - 1 = 0" или "x = +- 1" (оба выражения эквивалентны определению "x является одним из членов множества {-1; +1}". Однако в подобных случаях ясно, что имеется ввиду уравнение или его решение (то есть, множество значений "x", каждое из которых удовлетворяет уравнению).
Остальные случаи то ли редки, то ли не существуют (не анализировал глубоко, могу ошибиться).
А с рекурсией всё просто.
Рассмотрим её на классическом примере факториала.
Процедурное определение:
fact(n) = 1 * 2 * 3 * ... * nМатематическое определение:
fact(0) = 1;fact(n) = n * fact(n-1)
Из математического определения получаем вдобавок к методу вычисления ещё и границы применимости: очевидно, что fact(-1) не существует.
Вот и вся рекурсия (записываю выражения так, как они следуют из данных выше определений, а следует примитивно):
fact(3) = 3 * fact(3-1) = 3 * fact(2) = 3 * 2 * fact(2-1) = 3 * 2 * 1 * fact(1) = 3 * 2 * 1 * fact(0) = 3 * 2 * 1 * 1 = 6.no subject
Date: Thursday, 1 February 2007 18:26 (UTC)//типа, я никогда не пыталась разобраться с рекурсией, ага
no subject
Date: Thursday, 1 February 2007 20:04 (UTC)Рекурсия: см. рекурсия. См. также выход из рекурсии.
no subject
Date: Thursday, 1 February 2007 20:06 (UTC)no subject
Date: Thursday, 1 February 2007 20:22 (UTC)простое символьное переписывание выражений, содержащих неизменные значения (как в случае с рекурсией, что видно в моём примере), на мой скромный взгляд, гораздо проще для понимания и для проверки, чем концепция изменяемых значений (которую многие вдобавок к этому не понимают, как мы выяснили в результате теста).
Впрочем, я не настаиваю. Я в этом плане слегка религиозен: как известно, "итерация свойственна человеку, а рекурсия -- богу".
no subject
Date: Thursday, 1 February 2007 20:29 (UTC)В итоге я о рекурсии знаю, могу ответить на экзамене, понимаю примеры, но не могу написать ни одного сама. Даже на перле.
no subject
Date: Friday, 2 February 2007 01:07 (UTC)Специально написал программу на С++ для проверки:
Вот этот кусочек:
int a=10;
int b=20;
a=b;
std::cout<<a<<'\n'<<b<<std::endl;
печатает вот такое:
Хммм. Наверное, я не способен к программированию :(
А всё потому, что без контекста это строго говоря не определено. Вот полный текст программы, где определяется контекст присваивания.
#include<cstdio>
#include<string>
#include<iostream>
class Int{
private:
std::string s;
public:
Int(const int & i):s("fignja"){}
Int(const Int & i):s("fignja redkostnaja"){}
const Int & operator=(const Int & i){s="nu polnaja ahineja"; return *this;}
friend std::ostream & operator<<(std::ostream & o, const Int & i);
};
std::ostream & operator<<(std::ostream &o, const Int & i){return o<<i.s;}
int main(){
#define int Int
////////////////////////////////////////////
int a=10;
int b=20;
a=b;
std::cout<<a<<'\n'<<b<<std::endl;
///////////////////////////////////////////
return 0;
}
Вот так вот, если в тесте не определён контекст, то я имею право предположить свой собственный - либо стандартный математический (равенство), либо стандартный программисткий (присваивание), либо всё, что мне угодно (как показано выше)
no subject
Date: Friday, 2 February 2007 14:05 (UTC)no subject
Date: Sunday, 4 February 2007 18:50 (UTC)Первое - что программирование бывает только процедурным. Те, кто не понимает, например, указателей - вероятно, способны программировать на функциональных языках. В которых, заметим, и присваивания как такового нет, а так называемый биндинг обычно делается только один раз.
Второе - что тот, кто будет программистом, должен самостоятельно осознать концепцию изменяющегося состояния, в котором "переменная" в общем случае просто маркер того или иного элемента состояния. Необходимые смысловые маркеры в обычном курсе просто не даются. Это же относится и к важнейшим понятиям пред-, постусловий и инвариантов. Те, кто по мнению авторов "не способны", в то же время беспроблемно способны понять, например, что утром чашки стоят в шкафу, днём - на столе, а вечером - в посудомойке; значит, возможность объяснить то же (зависимость состояния от времени) в применении к программируемому миру - есть. А чья-то неспособность - проблема методики.
Третье - зависимость от результатов осознания заведомо конфликтного обозначения (знаком "="). Его применение для присваивания - одна из ключевых диверсий Си и потомков (постоянно создающая синтаксические ошибки); поэтому ожидать что кто-то посторонний поймёт что есть "a=b" - нереально. Скорее удивительно, что 50% кое-как осознают, что здесь неправильно, и методом тыка находят правильный ответ (выбором из двух, один из которых явно с душком и потому не годится). Да, они при этом обладают базовыми задатками - которые ещё надо правильно развить.
Суммируя. 50% - гон, прикрывающий творческую импотенцию методистов. Более реально - 10-20%, и то - за счёт не проблем собственно в программировании, а за счёт недостатка и несистемности математического образования (а вот это - значительно более вероятно как основная причина). В условиях недостатка времени и средств, да, может вырасти и до 50% и выше и хоть до 99%, но это ничуть не от каких-то врождённых неумений - а только за счёт хилого образования.
no subject
Date: Sunday, 4 February 2007 19:05 (UTC)Я не был бы так категоричен. Присваивание - это прямое отражение метода работы на самом нижнем уровне (сиречь в железе), которое по понятным причинам исторически - из-за тесной связи с нижним уровнем - оказалось основным приёмом процедурных языков. Массовая возможность отхода от них - причём при своей массовости всё равно заведомо менее половины контекстов, ситуаций и применений - началась только в 90-е годы, и по причине огромной инерции IT ещё не вошла в обучение достаточно широко. Но если взять, например, методики MIT (они открыто выложены) - там основное обучение идёт со стороны функционального подхода и постепенно спускается к процедурному. Так что не присваиванием единым:), но без него всё равно на серьёзном уровне программирование не изучить.
> ведь их учили, что значения символов не изменяются, если это не связано с обозначениями
Математику (настоящему) объяснить присваивание тривиально - например, через поколения состояний и присваивание как вид оператора над состоянием. Помощь в этом окажут менее конфликтные обозначения (например, в Алголе с потомками (Паскаль, Ада...) ":=" вместо "="), а первым самостоятельным упражнением - описать математически выполнение оператора "x=x+1".
Ну а дальше - только практика. Которую, опять же, лучше делать не на Си.
> и осознание переменных как "ячеек памяти, которые могут изменяться", что, в свою очередь, объясняет склонность к императивному программированию. Я рад, что _меньше_ половины людей (44%, если я правильно увидел) к нему имеют изначальную склонность -- значит, в будущем может быть ситуация получше, чем есть сейчас.
Чтобы тут чему-то осмысленно радоваться, надо провести тестирование по всем основным склонностям. Не думаю, что функциональное программирование даст больше уровень понимания.