В свободное от работы время продолжаю учить детей добру и C++ (с упором на второе).
И вот вчера группа неплохо написала мне простенький midterm тестик на десять вопросов в части которых есть варианты ответа, в части — надо написать пару строчек несложного кода. Условия обычные -- 40 минут и никуда не подглядывать. Но что меня больше всего поразило -- какой фурор этот тест вызвал среди моих коллег, среди которых нашлось даже больше желающих попробовать в нем свои силы, чем среди студентов
Так что решил выложить сюда. Приветствуется конструктивная критика и все такое.
Здравствуйте, Tilir, Вы писали:
T>И вот вчера группа неплохо написала мне простенький midterm тестик на десять вопросов в части которых есть варианты ответа, в части — надо написать пару строчек несложного кода. Условия обычные -- 40 минут и никуда не подглядывать. Но что меня больше всего поразило -- какой фурор этот тест вызвал среди моих коллег, среди которых нашлось даже больше желающих попробовать в нем свои силы, чем среди студентов
Хотелось бы отметить три момента:
1) Тесты по большей части написаны в ключе "представьте, что вы компилятор / процессор бла бла бла".
2) Использование идентификаторов из одной буквы или различающихся на одну букву превращает любой тест в тест на внимательность. Вроде как все борются за читабельность и качество кода, а тут студентам сразу дают плохой пример.
3) Тесты на листочках, да еще и "без подглядывания" — это как-то не соответствует реалиям разработки. Тут конечно зависит от условий проведения, но вообще-то я не вижу как в данном тесте использование поисковиков поможет с решением. Если исключить "помощь друга". А вот навык поиска и копания в дебрях с++ очень бы пригодился. Можно было бы даже добавить вопрос на знание стандартов / поиск в исходниках или что-то подобное.
Первый вопрос повеселил, его можно было бы разделить на 4: когда произойдет вариант 1), когда вариант 2) и т.д.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Здравствуйте, Tilir, Вы писали: T>Так что решил выложить сюда. Приветствуется конструктивная критика и все такое.
по мне он какой-то сложный и запутанный
как тут написали, неприятно притворяться компилятором и внимательно выглядывать какие-то редкоиспользуемые мелочи
Здравствуйте, jazzer, Вы писали:
J>Хороший тест, можно на собеседовании давать
На собеседовании на какую позицию? Разработчика компиляторов ну или хотя бы системной библиотеки, аналога stl?
По моему мнению, такой тест имеет чисто академический интерес так как слишком уж слабо коррелирует (еще меньше чем тесты BrainBench) с реальной работой.
Здравствуйте, kaa.python, Вы писали:
KP>Здравствуйте, jazzer, Вы писали:
J>>Хороший тест, можно на собеседовании давать
KP>На собеседовании на какую позицию? Разработчика компиляторов ну или хотя бы системной библиотеки, аналога stl?
ну да, системной библиотеки, на которой потом вся система держаться будет
KP>По моему мнению, такой тест имеет чисто академический интерес так как слишком уж слабо коррелирует (еще меньше чем тесты BrainBench) с реальной работой.
Знание языка — вещь нужная, так как спасает от ошибок и экономит кучу времени на выискивание оных.
Здравствуйте, jazzer, Вы писали:
J>Знание языка — вещь нужная, так как спасает от ошибок и экономит кучу времени на выискивание оных.
Конечно нужно. Но вот на таком уровне? Очень сомнительно кроме пары крайне редких направлений. Не очень представляю специфику твоей работы, но не думаю что в эти пару направлений попадает, разве что вы нашли фатальный недостаток в STL
Здравствуйте, kaa.python, Вы писали:
KP>Здравствуйте, jazzer, Вы писали:
J>>Знание языка — вещь нужная, так как спасает от ошибок и экономит кучу времени на выискивание оных.
KP>Конечно нужно. Но вот на таком уровне? Очень сомнительно кроме пары крайне редких направлений. Не очень представляю специфику твоей работы, но не думаю что в эти пару направлений попадает, разве что вы нашли фатальный недостаток в STL
Когда начинали — очень даже попадало. Сейчас уже гораздо меньше, конечно — фундамент выстроен, а код, растущий на фундаменте, гораздо проще оного (было бы странно, если бы не). И выстроен без багов, кстати — за эти годы я не не помню ни одного более-менее серьезного бага. И это не в последнюю очередь благодаря тому, что разработчики знали закоулки языка.
ЗЫ Знание закоулков нужно не для того, чтобы их использовать, а в первую очередь — чтобы в них не попадать.
Здравствуйте, kaa.python, Вы писали:
KP>На собеседовании на какую позицию? Разработчика компиляторов ну или хотя бы системной библиотеки, аналога stl?
Знаешь к концу обучения на любом программистком факультете со специализацией в C, слово explicit должно быть выбито кровавыми мозолями на заднице студентов. Так что тут все ок.
KP>По моему мнению, такой тест имеет чисто академический интерес так как слишком уж слабо коррелирует (еще меньше чем тесты BrainBench) с реальной работой.
Тут сложно не согласиться, очень однобокий тест.
Здравствуйте, jazzer, Вы писали:
J>Когда начинали — очень даже попадало. Сейчас уже гораздо меньше, конечно — фундамент выстроен, а код, растущий на фундаменте, гораздо проще оного (было бы странно, если бы не).
Зависит от фундамента. Очень часто такие попадаются, что лучше бы их не было. Особенно если говорить о закрытых, а не OpenSource фундаментах.
J>И выстроен без багов, кстати — за эти годы я не не помню ни одного более-менее серьезного бага.
Это говорит не о качестве фундамента, а о модели разработки либо специфике ПО. Ну либо от того, что ты закладываешь в понятие "серьезного бага".
J>ЗЫ Знание закоулков нужно не для того, чтобы их использовать, а в первую очередь — чтобы в них не попадать.
Зависит от глубины закоулков, если честно. Очень многие из них стоит знать исключительно в академических целях (как, например, обсуждаемый тест).
Здравствуйте, kaa.python, Вы писали:
KP>Зависит от фундамента. Очень часто такие попадаются, что лучше бы их не было. Особенно если говорить о закрытых, а не OpenSource фундаментах.
Ну в нашем случае фундамент что надо. Ибо сами писали под наши задачи, так что не приходится хачить, . Плюс старались делать так, чтоб не возникало монолитного фреймворка (совсем от этого, конечно же, не уйти, и это, наверное, самая трудная задача, но мы старались).
J>>И выстроен без багов, кстати — за эти годы я не не помню ни одного более-менее серьезного бага. KP>Это говорит не о качестве фундамента, а о модели разработки либо специфике ПО. Ну либо от того, что ты закладываешь в понятие "серьезного бага".
А что должно говорить о качестве ПО, если не отсутствие багов?
Это достаточно важный параметр, на мой взгляд
J>>ЗЫ Знание закоулков нужно не для того, чтобы их использовать, а в первую очередь — чтобы в них не попадать.
KP>Зависит от глубины закоулков, если честно. Очень многие из них стоит знать исключительно в академических целях (как, например, обсуждаемый тест).
Фигня с закоулками состоит в том, что если ты про них не знаешь, то ты пишешь себе код, который выглядит невинно, и ни сном ни духом, что там затаилась какая-нть мерзость.
То есть когда говорят, что знать все не надо, ибо всегда можно нагуглить — чтоб гуглить, надо знать, что гуглить. А если у тебя программа на ровном месте то падает, то не падает — что ты будешь гуглить, чтобы понять, что написал невинно выглядящее UB? А априорное знание позволяет сразу не писать опасный код.
Здравствуйте, jazzer, Вы писали:
J>ЗЫ Знание закоулков нужно не для того, чтобы их использовать, а в первую очередь — чтобы в них не попадать.
Уверены в том, что дыры в прогах от незнания языка?
Самые опасные и известные уязвимости-это особенности архитектуры проги/либы.
А говорящий, с воздетым к небу перстом, про необходимость умения непопадать в ловушки языка-это или клинический идиот
с манией к такому попаданию, или использующий ЯП, который сам по себе есть одно сплошно попадалово. Вот смотрю на эти
С++-вые бороды кончиты, и всё больше удивляюсь тому, как глубоко филигранно продуман Lisp, начиная с самого своего фундамента,
что Lisp придумали именно те, кого нужно и можно подпускать к разработке ЯП, а C++ развивают те, кого к ЯП подпускать категорически
запрещено. ЯП должны развивать математики, а не скинтисты и инженеры, что и наблюдается при сравнении C++ с тем же Lisp.
Здравствуйте, jazzer, Вы писали:
J>Ну в нашем случае фундамент что надо. Ибо сами писали под наши задачи, так что не приходится хачить, . Плюс старались делать так, чтоб не возникало монолитного фреймворка (совсем от этого, конечно же, не уйти, и это, наверное, самая трудная задача, но мы старались).
Да-да-да, знаю я такой, совсем недавно с ним работал
J>А что должно говорить о качестве ПО, если не отсутствие багов? J>Это достаточно важный параметр, на мой взгляд
ПО без багов не бывает. От слова вообще. Так что либо ты что-то не договариваешь, либо вы тестируете так же, как софт для атомного реактора. Но тогда стоит похвалить ваши процессы (о чем я выше написал) и заслуга фрэймвока будет сильно второстепенной.
Здравствуйте, Tilir, Вы писали:
T>В свободное от работы время продолжаю учить детей добру и C++ (с упором на второе). T>И вот вчера группа неплохо написала мне простенький midterm тестик на десять вопросов в части которых есть варианты ответа, в части — надо написать пару строчек несложного кода. Условия обычные -- 40 минут и никуда не подглядывать. Но что меня больше всего поразило -- какой фурор этот тест вызвал среди моих коллег, среди которых нашлось даже больше желающих попробовать в нем свои силы, чем среди студентов T>Так что решил выложить сюда. Приветствуется конструктивная критика и все такое.
#include <cassert>
template <typename T, typename U> bool
operator == (const T &x, const U &y)
{
return !(x < y) && !(y < x);
}
template <typename T, typename U> bool
operator != (const T &x, const U &y)
{
return !(x == y);
}
struct Pair
{
int m_x, m_y;
Pair (int x, int y = 0): m_x(x), m_y(y) {}
};
bool
operator < (const Pair &lhs, const Pair &rhs)
{
return (lhs.m_x < rhs.m_x) || ((lhs.m_x == rhs.m_x) && (lhs.m_y < rhs.m_y));
}
int
main (void)
{
Pair a (2);
Pair b (2, 1);
int c = 2, d = 2;
/* 1 */ assert (b != a);
/* 2 */ assert (c == d);
/* 3 */ assert (a == c);
/* 4 */ assert (d == b);
return 0;
}
gcc main.cpp
a.out
a.out: main.cpp:31: int main(): Assertion `d == b' failed.
Аварийный останов (сделан дамп памяти)
Ещё вопросы?
gcc --help
Usage: gcc [options] file...
Options:
...
-S Compile only; do not assemble or link
..
Так кто же мы такие и куда движемся. Студенты, коллеги, зачем? Чёрный ящик, игральный автомат, русская рулетка. Почему вас это так заинтересовало. Бред ли? Нет, я компилятор. Понять значит предвидеть. Задумаемся. Пятница, выходной, понедельник. Головоломка. Для чего? Польза, генератор, строка. Дело было вечером, делать было нечего. Галка села на заборе, Кот забрался на чердак. Тут сказал ребятам Боря Просто так. А в-четвертых — наша мама Отправляется в полет, Потому что наша мама Называется — пилот!
А теперь серьёзно, самая неприятная часть С++ это его перегруженность разнообразными правилами. Игра в "Вальяжного профессора" и "Шустрого студента" (для тех кто не понял прочтите документ) не имеет ничего общего с практикой. Составление общей аналитической картины из разрозненных деталей напоминает фразу "опасно быть недоучкой".
Цитирую документ:
3) Я почему-то сейчас понял, что если пять лет писать компиляторы, то сходишь с ума
С ума сходят потому, что мозг стремится построить целостную картину, но при данном подходе к обучению поступающей на обработку информации для этого явно недостаточно. Компилятор каждый раз генерирует одно и тоже, в нём нет магии, только жёсткие правила. С++ это вообще не интеллектуальный язык, иначе говоря весь интеллект заложен только в том, что пишет сам программист, за него ничего не додумывается.
Кто умеет, тот делает. Кто не умеет учит. А кто не умеет даже учить, руководит. Всегда нужно стремиться стать руководителем.
Здравствуйте, velkin, Вы писали:
V>С ума сходят потому, что мозг стремится построить целостную картину, но при данном подходе к обучению поступающей на обработку информации для этого явно недостаточно. Компилятор каждый раз генерирует одно и тоже, в нём нет магии, только жёсткие правила. С++ это вообще не интеллектуальный язык, иначе говоря весь интеллект заложен только в том, что пишет сам программист, за него ничего не додумывается.
V>Кто умеет, тот делает. Кто не умеет учит. А кто не умеет даже учить, руководит. Всегда нужно стремиться стать руководителем.
"Хoтелoсь бы, так сказать, в oбщих чертах пoнять, чтo ентому иностранцу нужнo" (с) Иван Васильевич.
расшифруйте для безграмотных, в чем смысл сообщения, то?
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, velkin, Вы писали:
V>>С ума сходят потому, что мозг стремится построить целостную картину, но при данном подходе к обучению поступающей на обработку информации для этого явно недостаточно. Компилятор каждый раз генерирует одно и тоже, в нём нет магии, только жёсткие правила. С++ это вообще не интеллектуальный язык, иначе говоря весь интеллект заложен только в том, что пишет сам программист, за него ничего не додумывается. V>>Кто умеет, тот делает. Кто не умеет учит. А кто не умеет даже учить, руководит. Всегда нужно стремиться стать руководителем. NB>"Хoтелoсь бы, так сказать, в oбщих чертах пoнять, чтo ентому иностранцу нужнo" (с) Иван Васильевич. NB>расшифруйте для безграмотных, в чем смысл сообщения, то?
Вот смотрите, все мы люди, хотя, конечно, в интернете никто не узнает, даже если ты кот. Существует две роли, одна может быть от высокоинтелектуальной до самодурской "я начальник" — Вальяжный Учитель, вторая называется "ты дурак" — Шустрый Студент. Это значит буквально следующее, Вальяжный Учитель может придумывать любую теорию, причём я его понимаю, так как в процессе развития сам постоянно так делаю. С другой стороны Шустрый Студент, сокращённо шустрик, в дальнейшем буду звать его шестёркой, должен принимать всё то, что выдумывает Вальяжный Учитель, пусть будет валетом. Причём валет за свои слова и действия не отвечает по определению.
Давайте упростим, предположим валет решил научить шестёрку забивать гвозди. Для начала он попросил шестёрку наклонить гвоздь под углом 30 градусов к поверхности и попробовать его забить. Шестёрка измучился, но забил, естественно коряво. Валет снисходительно поучает, вот видишь шестёрка, так гвозди забивать не желательно. А теперь поставь гвоздь под 90 градусов к поверхности, обхвати его рукой и положи большой палец на шляпку и попробуй забить. Шестёрка всё так и сделал, и закономерно получил травму пальца ещё при первом ударе.
Мне думается лучше один раз показать как правильно забить гвоздь, а потом обучаемый пусть что хочет, то и делает. И второе, давным давно, практически ещё в прошлом тысячелетии мне как и всем остальным выдали задание. Если кратко, то я использовал принцип брутфорс, а вот остальные подобрали значения вручную. Но самое интересное алгоритм показал все значения, вплоть до отрицательных. Грубо говоря у меня было больше результатов, потому что я писал программу, а всю работу сделал компьютер.
Учителя же работают с людьми, и компьютер некоторые из них воспринимают тоже как человека. В отличие от них, я доверяю работу компьютеру и не пытаюсь его переплюнув загрузив себе в мозг знания миллионов инженеров, не говоря уже о скорости вычислений. Все эти листочки с бумажками говорят лишь об одном, Вальяжный Учитель не понимает самой сути компьютерных систем, то есть то, для чего они были созданы. А это уже из разряда психологии. Причём я бы ещё понял, если бы проводились детальные исследования компиляторов, но о об их устройстве ни слова, всё сводится к замене труда компилятора на труд человека.
Есть такой анекдот: "Полиция следит за порядком, беспорядки их не интересуют". Если человек изначально пишет ошибки, чтобы другие догадались, то особого смысла в этом нет. С++ существует для решения задач, но какую задачу решал Вальяжный Учитель? Научиться чему-то можно лишь решая реальные задачи, а не имитируя несуществующие ошибки. Так что в глобальном плане я против такого метода обучения, а шестёрок вообще никто не спрашивал, на то они и шестёрки. С другой стороны прежде чем выбрать стараюсь рассматривать все возможности. Совсем не против почитать доводы в пользу таких тестов, аля забьём гвоздь тысячью и одним неправильным способом.