Re[4]: Тест по C++ для моих студентов
От: night beast СССР  
Дата: 14.03.15 07:00
Оценка:
Здравствуйте, velkin, Вы писали:

V>>>С ума сходят потому, что мозг стремится построить целостную картину, но при данном подходе к обучению поступающей на обработку информации для этого явно недостаточно. Компилятор каждый раз генерирует одно и тоже, в нём нет магии, только жёсткие правила. С++ это вообще не интеллектуальный язык, иначе говоря весь интеллект заложен только в том, что пишет сам программист, за него ничего не додумывается.

V>>>Кто умеет, тот делает. Кто не умеет учит. А кто не умеет даже учить, руководит. Всегда нужно стремиться стать руководителем.
NB>>"Хoтелoсь бы, так сказать, в oбщих чертах пoнять, чтo ентому иностранцу нужнo" (с) Иван Васильевич.
NB>>расшифруйте для безграмотных, в чем смысл сообщения, то?

V>Вот смотрите, все мы люди, хотя, конечно, в интернете никто не узнает, даже если ты кот. Существует две роли, одна может быть от высокоинтелектуальной до самодурской "я начальник" — Вальяжный Учитель, вторая называется "ты дурак" — Шустрый Студент. Это значит буквально следующее, Вальяжный Учитель может придумывать любую теорию, причём я его понимаю, так как в процессе развития сам постоянно так делаю. С другой стороны Шустрый Студент, сокращённо шустрик, в дальнейшем буду звать его шестёркой, должен принимать всё то, что выдумывает Вальяжный Учитель, пусть будет валетом. Причём валет за свои слова и действия не отвечает по определению.


V>[skip]


фигасе у вас в общих чертах получилось.
если в двух словах, то "тест г-но потому что когда то меня обидел вальяжный учитель"? я ничего не перепутал?

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


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

V>Есть такой анекдот: "Полиция следит за порядком, беспорядки их не интересуют". Если человек изначально пишет ошибки, чтобы другие догадались, то особого смысла в этом нет. С++ существует для решения задач, но какую задачу решал Вальяжный Учитель? Научиться чему-то можно лишь решая реальные задачи, а не имитируя несуществующие ошибки. Так что в глобальном плане я против такого метода обучения, а шестёрок вообще никто не спрашивал, на то они и шестёрки. С другой стороны прежде чем выбрать стараюсь рассматривать все возможности. Совсем не против почитать доводы в пользу таких тестов, аля забьём гвоздь тысячью и одним неправильным способом.


вы разницу между обучением и тестом представляете?
Re[4]: Тест по C++ для моих студентов
От: -n1l-  
Дата: 14.03.15 11:40
Оценка:
Это конечно демагогия, но у меня есть довод в пользу таких тестов.
Если взять процесс, который сложнее забивания гвоздей, например создание красивой мебели, мягкой мебели, пусть в нем тоже будет забивание гвоздей.
Как научить человека делать красивую мебель? Никак. Вы не сможете показать ему все миллионы примеров, как надо в конкретном случае делать мебель.
Вы сможете научить его работать со станкам и инструментами, а вот делать мебель, он должен научится сам.
Путем практики, долгих треннировок и набитых шишех, от тех же гвоздей, ващ подопечный станет специалистом и знаете что, он будет пользоваться навыками, которые вы ему дали только в самых базовых случая, в основном он будет использовать уже свой, выработанный стиль работы, где гвозди в каркас для кожанного дивана забивают не под углом 90%, а под углом 100%-110%, что бы не согнуть гвоздь и не потрескать дорогую древесину.
Re[5]: Тест по C++ для моих студентов
От: smeeld  
Дата: 14.03.15 11:55
Оценка: 15 (1)
Здравствуйте, -n1l-, Вы писали:

N>Это конечно демагогия, но у меня есть довод в пользу таких тестов.


Принцип обучения всему что можно тут вспомнить выражается парадигмой "Делай как Я, когда научишься делать
как Я-делай как хочешь". Дыры в законах системы находят только те, кто эту систему знает в совершенстве.
Но это точно не работа изучающих систему. Это работа профессионалов, которая стоит денег.
Re[6]: Тест по C++ для моих студентов
От: -n1l-  
Дата: 14.03.15 12:08
Оценка:
Вся правда в том, что это не так где-то в половине случаев.
Re[5]: Тест по C++ для моих студентов
От: aik Австралия  
Дата: 14.03.15 12:27
Оценка:
Здравствуйте, jazzer, Вы писали:

V>> Если человек изначально пишет ошибки, чтобы другие догадались, то особого смысла в этом нет.

J>Этот код мог быи написан твоим партнером по команде, и попал к тебе на code review

вот если б я был ревьювером — то конструктор Pair не имел бы "= 0".
Re[6]: Тест по C++ для моих студентов
От: velkin Удмуртия https://kisa.biz
Дата: 14.03.15 14:12
Оценка:
Здравствуйте, smeeld, Вы писали:

N>>Это конечно демагогия, но у меня есть довод в пользу таких тестов.

S>Принцип обучения всему что можно тут вспомнить выражается парадигмой "Делай как Я, когда научишься делать как Я-делай как хочешь". Дыры в законах системы находят только те, кто эту систему знает в совершенстве.
S>Но это точно не работа изучающих систему. Это работа профессионалов, которая стоит денег.

Довольно точно выражено. Неправильно ученики и сами смогут сделать. А доскональное исследование мелочей удел профи. Плюс всё же не все понимают, что компьютер нужен для замены человеческого труда, и притворяться им с бумажкой в руках очень глупо.
Отредактировано 14.03.2015 14:15 velkin . Предыдущая версия .
Re[2]: Тест по C++ для моих студентов
От: Tilir Россия http://tilir.livejournal.com
Дата: 16.03.15 09:55
Оценка: -2
Здравствуйте, velkin, Вы писали:

V>Ещё вопросы?


Условия обычные -- 40 минут и никуда не подглядывать


Возможно я забыл добавить что при выполнении этого теста использование компьютера недопустимо. Разумеется после того как группа его написала, я всем им дал бланк домой с пожеланием отнестись к этому как к лабораторной работе -- то есть откомпилировать, погонять, найти точные ответы на все вопросы. Разумеется я приветствую то, что вы тоже так сделали (кстати я бы на вашем месте компилировал с более ограничивающим набором опций -- там всякие Wall, Wextra, pedantic, все такое). Но вот выкладывать это сюда как-то некорректно. Вы лишаете друих радости этого открытия.
Re[2]: Тест по C++ для моих студентов
От: Tilir Россия http://tilir.livejournal.com
Дата: 16.03.15 09:59
Оценка:
Здравствуйте, VTT, Вы писали:

VTT>1) Тесты по большей части написаны в ключе "представьте, что вы компилятор / процессор бла бла бла".


Да. В знании языка умение "притворится компилятором" и прочитать с листа код, распарсив в нем возможные проблемы is a must.

VTT>2) Использование идентификаторов из одной буквы или различающихся на одну букву превращает любой тест в тест на внимательность. Вроде как все борются за читабельность и качество кода, а тут студентам сразу дают плохой пример.


Хм. Спасибо. Наверное стоит это скорректировать.

VTT>3) Тесты на листочках, да еще и "без подглядывания" — это как-то не соответствует реалиям разработки. Тут конечно зависит от условий проведения, но вообще-то я не вижу как в данном тесте использование поисковиков поможет с решением. Если исключить "помощь друга". А вот навык поиска и копания в дебрях с++ очень бы пригодился. Можно было бы даже добавить вопрос на знание стандартов / поиск в исходниках или что-то подобное.


Я потом отдаю тест на дом как лабораторную для того чтобы можно было покопаться, набрать, исполнить, повертеть в разные стороны и исправить ошибки.
Re[2]: Тест по C++ для моих студентов
От: Tilir Россия http://tilir.livejournal.com
Дата: 16.03.15 10:04
Оценка:
Здравствуйте, Dym On, Вы писали:

DO>Спасибо! А еще есть ?


Я раньше ориентировался в основном на выдачу вычислительно сложных домашних работ. То есть в лоб нерешаемых за разумное время, но даже если придумать неплохой алгоритм, то он должен занимать минимум часок машинного времени на обсчет чтобы был виден эффект от тонких ручных оптимизаций. Ну вроде задачи поиска всех пятерок kissing primes при условии что каждый элемент пятерки <= 100000.

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

Так что если ещё что сделаю, выложу, тем более народу тут вроде тоже в целом понравилось.
Re[2]: Тест по C++ для моих студентов
От: Tilir Россия http://tilir.livejournal.com
Дата: 16.03.15 10:08
Оценка:
Здравствуйте, -n1l-, Вы писали:

N>Очень интересный, но, блин, напрягает использование односимвольных переменных.


Да, надо поправить, мне уже указали.

N>Кстати насчет того, как скоимпиллирована программа, как-то можно посмотреть, сколько функций нагенерил шаблон?


В случае gcc -- посмотреть гимпловый дамп. В момент когда программа в SSA, все эффекты от шаблонов C++ уже учтены.
Re[3]: Тест по C++ для моих студентов
От: smeeld  
Дата: 16.03.15 10:23
Оценка:
Здравствуйте, Tilir, Вы писали:

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


Какое Ваше мнение о том, насколько "наизусть" должен знать стандарт среднестатистический разработчик C++?
И насколько разработчие компилятора?
Re[4]: Тест по C++ для моих студентов
От: Tilir Россия http://tilir.livejournal.com
Дата: 16.03.15 11:11
Оценка: +3
Здравствуйте, smeeld, Вы писали:

S>Какое Ваше мнение о том, насколько "наизусть" должен знать стандарт среднестатистический разработчик C++?

S>И насколько разработчие компилятора?

Наизусть это лишнее. Знать структуру стандарта, ориентироваться в возможностях языка и иметь интуицию относительно основных решений в дизайне языка -- норм. Период обучения -- прекрасное время выработать эту интуицию разбором всяких интересных частностей.
Re[5]: Тест по C++ для моих студентов
От: smeeld  
Дата: 16.03.15 12:07
Оценка: -2 :)))
Здравствуйте, Tilir, Вы писали:

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


Ok. Как тогда Вам покажется вопросик типа

Дано
template<class T1 = float, class T2> class Foo;
В чём ошибка?


Это можно хоть на тестиках хоть на собеседовраниях спрашивать. Сложного ничего, но
подобное именно требует знания стандарта почти наизусть, и если на вопросик правильно не ответит,
то как бы и не знает хорошо C++.
Re[3]: Тест по C++ для моих студентов
От: velkin Удмуртия https://kisa.biz
Дата: 16.03.15 12:41
Оценка:
Здравствуйте, Tilir, Вы писали:

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

V>>Ещё вопросы?
T>

T>Условия обычные -- 40 минут и никуда не подглядывать

T>Возможно я забыл добавить что при выполнении этого теста использование компьютера недопустимо.

Я это прекрасно понял, отсюда и дальнейшие рассуждения о дурацких методах обучения программированию. Мы сторонники разных течений, как католическая и православная церковь, или как конструкторские бюро Королёва и Челомея, или как партии США республиканцев и демократов. Хотя в основе лежит программирование, но мои сторонники утверждают, что "кодирование компьютера без самого компьютера не бывает", а ваши напротив. Более того, мои сторонники выделили направление деятельности — системный анализ.

Конечно, здесь нет никакого спора, просто через много лет сторонники одних течений умрут, а новое поколение будет думать иначе. Есть такая книга "Кодеры за работой. Размышления о ремесле программиста", там как раз говорилось о том, что некоторые программисты думают, что компиляторы и отладчики создали некие комитеты по стандартизации.

Об авторе 8
Благодарности 9
Введение 11
Глава 1. Джейми Завински 15
Глава 2. Брэд Фицпатрик 55
Глава 3. Дуглас Крокфорд 93
Глава 4. Брендан Айк 129
Глава 5. Джошуа Блох 159
Глава 6. Джо Армстронг 191
Глава 7. Саймон Пейтон-Джонс 219
Глава 8. Питер Норвиг 255
Глава 9. Гай Стил 283
Глава 10. Дэн Ингаллс 321
Глава 11. Питер Дойч 357
Глава 12. Кен Томпсон 391
Глава 13. Фрэн Аллен 421
Глава 14. Берни Козелл 451
Глава 15. Дональд Кнут 491
Библиография 526
Алфавитный указатель 529

Re[6]: Тест по C++ для моих студентов
От: Tilir Россия http://tilir.livejournal.com
Дата: 16.03.15 15:42
Оценка: +1
Здравствуйте, smeeld, Вы писали:

Ok. Как тогда Вам покажется вопросик типа

Дано
template<class T1 = float, class T2> class Foo;
В чём ошибка?


Это слишком легкий вопрос. Он был бы сложнее если бы вы спросили "есть ли тут ошибка?".

Я совершенно честно не заглядывая в стандарт сейчас просто привлекаю интуицию и логику: представим что так можно делать. Как могло бы выглядеть инстанцирование с дефолтным первым аргументом?

Foo <int> t; /* T1 = float? */


Это очевидно противоречит базовому правилу языка "как пишется, так и указывается" и главное создает неоднозначности при разборе более слоных смешанных списков:

template<class T1 = float, class T2, class T3 = int> class Bar;
Bar <int, float> t; /* Hm? */


Ещё один вариант как это могло бы выглядеть -- явная запятая:

Foo <,int> t; /* T1 = float! */


Но (это уже интуиция) я не поверю, что такое уродство прошло через комитет.

Значит ошибка в том, что default template parameters могут быть только trailing.
Re[7]: Тест по C++ для моих студентов
От: DarkEld3r  
Дата: 16.03.15 15:47
Оценка: +1
Здравствуйте, Tilir, Вы писали:

T>Значит ошибка в том, что default template parameters могут быть только trailing.

Помимо того, что это логично и вполне интуитивно, добавлю, что с функциями точно так же. А о них узнают задолго до того как начинают в тонкостях шаблонов разбираться и новый опыт не противоречит старому. В общем, вопрос элементарный.
Re[7]: Тест по C++ для моих студентов
От: smeeld  
Дата: 16.03.15 16:08
Оценка:
Здравствуйте, Tilir, Вы писали:

T>
T>Foo <int> t; /* T1 = float? */
T>


T>Это очевидно противоречит базовому правилу языка "как пишется, так и указывается" и главное создает неоднозначности при разборе более слоных смешанных списков:


Понятно про нелогичность случая смешанных дефолтов

template <class T1=def2, class T2, class T3=def3, ... class Tn> class Foo;

Но чем не логична такая конструкция

template <class T1=def2, class T2=def2, class T3, ... class Tn> class Foo

при законности которой компилятор ожидал бы в таком случае инстанцирования в виде

Foo<def3, ...defn> f;

по аналогии с случаем когда

template <class T1, class T2, class T3=def3, ... class Tn=def3> class Foo

предпологающем интстанцирование вида

Foo<def1, def2> f;


Почему по стандарту законен только случай

template <class T1, class T2, class T3=def3, ... class Tn=def3> class Foo

?
Re[8]: Тест по C++ для моих студентов
От: Tilir Россия http://tilir.livejournal.com
Дата: 17.03.15 09:28
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Но чем не логична такая конструкция


template <class T1=def2, class T2=def2, class T3, ... class Tn> class Foo


Если это разрешить, все шаблоны будут разбиты на два класса -- те у кого leading default (назовем их классом L) и trailing default (класс T). Подстановка в точке инстанцирования для L должна идти очевидно справа-налево, а для T слева-направо. Это сразу блокирует всю идею из компиляторских соображений. Но, допустим, вы не хотите думать про проблемы парсера.

Тогда рассмотрим такой пример:

template <class T1 = float, class T2 = float> class Foo {/* ... */};
template <class T1, class T2 = float>         class Bar {/* ... */};
template <class T1 = float, class T2>         class Buz {/* ... */};

/* ... */
Buz <int> a; /* T2 = int */
Bar <int> b; /* T1 = int */
Foo <int> c; /* T1 = int or T2 = int? */


В этом случае "c" будет попадать и в класс L и в класс T. Тогда придется описывать для него отдельное исключение, оба варианта которого будут неочевидны. Это не согласуется с духом языка -- C++ построен на логичных правилах с минимальным количеством исключений.

Допустим мы описали исключение -- всегда относить такие к классу T. Проблемы только начинаются:

template <class T1 = float, class T2 = float, class T3> class ComplexFoo {/* ... */};

template <class T1, class T2> class ComplexFoo<T1, T2, int> {/* ... */}


Вспоминаем, что параметры по умолчанию наследуются при частичной специализации. Теперь имеем, что класс ComplexFoo принадлежит к классу L, а одна из его частичных специализаций -- к классу T (в связи с тем что все оставшиеся параметры остались по умолчанию). Добро пожаловать в мир безумия и отваги:

ComplexFoo <int> c; /* T1 = int or T3 = int? */


От себя добавлю, что такой подход, кроме всего прочего, создает понятные сложности с variadic templates.

В общем тут верно указали -- common sense для порядка аргументов в шаблонах должен быть наработан уже на функциях.

P.S. Есть ещё один вариант возможного синтаксиса в так скажем C99-style initializers:

template <class T1 = float, class T2 = float> class Foo {/* ... */};
template <class T1, class T2 = float>         class Bar {/* ... */};
template <class T1 = float, class T2>         class Buz {/* ... */};

/* ... */
Buz <T1:int> a; /* T2 = int */
Bar <T2:int> b; /* T1 = int */
Foo <T1:int> c; /* T1 = int! */


Почему так не сделали... Видимо потому же, почему не сделали named parameters для функций -- мрачное усложнение синтаксиса с неясной пользой для языка.
Re[9]: Тест по C++ для моих студентов
От: smeeld  
Дата: 17.03.15 12:22
Оценка:
Здравствуйте, Tilir, Вы писали:

T>Если это разрешить, все шаблоны будут разбиты на два класса -- те у кого leading default (назовем их классом L) и trailing default (класс T).


Всё верно, верно также и то, что стандартом выбран класс T, но почему не класс L? Чем T лучше L?
И вот здесь неоднозначность, можно много рассуждать про преимущества одного класса над другим, но
разрешить дилему однозначно, можно только помня соответствующую суру из Стандарта.
Тем более её нужно знать, если попросят обосновать, что интсанцирование производится именно так, а не иначе.
Re[10]: Тест по C++ для моих студентов
От: Tilir Россия http://tilir.livejournal.com
Дата: 19.03.15 08:32
Оценка: +1
Здравствуйте, smeeld, Вы писали:

S>Всё верно, верно также и то, что стандартом выбран класс T, но почему не класс L? Чем T лучше L?


В смысле вообще запретить trailing и оставить только leading default?

А почему бы, например, не писать repeat-until вместо do-while?

В любом языке есть вещи, которые надо запомнить. В данном случае единица для запоминания звучит так: "В шаблонах C++ возможны trailing default". Все. Дальше встретив вопрос "возможны ли leading default", студент уже может логически вывести что нет, никогда. Знание наизусть стандарта тут не нужно.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.