Средняя школа и PascalABC.NET 3.2


#1

Каждый проводит свободное время по-разному. Так уж вышло, что у меня последнее время его достаточно и часть своего свободного времени я провожу на одном из ресурсов, ориентированных на решение школьных и студенческих задач, конкретнее - в предмете “Информатика”. Стараюсь решать задачи на PascalABC.NET 3.2, но чаще всего потом получаю в ответ реплики вроде “Это неправильный какой-то паскаль, мы учим по-другому”.

Почему? Почему в школьном обучении до сих пор ориентировка в основном на Turbo Pascal 7.0, поддерживать который Borland прекратила в 1993 году? Двадцать четыре (!) года назад! Это почти вечность с точки зрения развития IT-отрасли. Я считаю, что основных причин три.

  1. Старая материальная база в компьютерных классах. До сих пор у многих стоят i386/486 или первые “пентиумы”, работающие исключительно в MS DOS.
  2. Школьные учебники в основной своей массе ориентированы на идеологию именно паскаля 7.0.
  3. Школьные учителя не знают иных версий паскаля и не горят желанием переучиваться.

В последние годы ряды школьных преподавателей информатики пополнили молодые кадры, у которых паскаль 7.0 вызывает стойкую идиосинкразию. Они ищут альтернативу и находят её в С/С++/С#, Python, Free Pascal, Delphi, Lazarus, Java, Ruby, PHP, … - все зависит от их “любимого” языка. После этого остается только уговорить руководство школы, развешав “морковки” в виде потенциальных первенств на межшкольных олимпиадах и прочих преференций за желание быть “на переднем крае”.

И детей из таких классов я тоже встречаю на упомянутом школьном ресурсе. Это типичные страдальцы, заложники амбиций “продвинутых” учителей. Они отличаются от остальных “паскалят” тем, что любят писать отдельные “умные слова” (не понимая, впрочем, их смысла) и еще - практически полным отсутствием навыков алгоритмизации задач. Это и понятно: в школе на информатику отводится 45 минут в неделю, а учебных недель в году всего 35 - это 35 академических часов в год. И если выбирается язык уровня С/С++ - то либо учат его, либо алгоритмы. Одновременно не получается. “Питоны” тоже не знают алгоритмов, потому что на Питоне сложновато “опуститься” на низкий уровень “вот так это устроено”. Можно пройтись и по другим языкам.

Межшкольные олимпиады тоже делают свой “оригинальный вклад”… Вот информация, которая была опубликована на ресурсе Всесоюзной олимпиады школьников (московский региональный этап):

Free Pascal, GNU C/C++, Java — гарантируется, что все задачи регионального этапа могут быть выполнены на полный балл с использованием данных компиляторов. Pascal ABC.NET — данный компилятор будет доступен в тестирующей системе, но не гарантируется, что все задачи можно решить на полный балл с использованием этого компилятора. Python, PHP, Perl, Ruby, C# — данные языки будут доступны в тестирующей системе, но скорее всего не все задания олимпиады могут быть выполнены на полный балл. Жюри предполагает, что при помощи данных языков возможно набрать балл, достаточный для призера олимпиады, но не дает никаких гарантий.

Нормально, да? С одной стороны, школы стараются себя показать на олимпиадах, с другой - устроители олимпиад по ходу игры меняют правила. И цели у школ и олимпиад диаметрально противоположные. Цель школы - массовое обучение среднестатистического школьника. Цель олимпиады - отобрать горстку “самородков”, которых школа сама подготовить не в состоянии. Что должны делать дети, которым преподают Питон? Основная масса школьников с Турбо Паскаль? Зачем им на олимпиаду вообще идти? А школе что делать? Преподавать С/С++ для трех учеников в классе, готовя их к олимпиаде, а остальным постоянное ставить двойки?

И вот думаю я, есть ли смысл пытаться пробиться с PascalABC.NET 3.2 на уровень олимпиад? И сам себе отвечаю, что нет, скорее всего. Подсказка: для чего убрали Питон?. Считаю, что это сделано специально: надо повысить шанс достижения призовых мест теми, кто пишет на С/С++. Поскольку конкурировать с тем же Питоном по скорости разработки и отладки С/С++ реально не может. То же бужет ждать и PascalABC.NET 3,2 - его просто не выпустят.

А почему же такое желание выбирать лучших из тех, кто работает с С/С++ ? У меня есть некоторые мысли по этому поводу, но, быть может, кто-то еще пожелает высказаться на эту тему.

P.S. А причем тут школа? Напомню только, что согласно словарям русского языка, “абитуриент” - это лицо, окончившее среднее учебное заведение.


#2

а хто это гарантирует, и почему в остальных компиляторах не гарантируется? некомпентные проверяльщики?


#3

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


#4

Это взято отсюда

Но самое удивительное, что на муниципальном (предшествующем) этапе указано следующее: “При решении задач можно использовать языки программирования, офисные пакеты, текстовый редактор, стандартные программы операционной системы (например, калькулятор), или составлять ответ вручную.”

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


#5

Странно, что убрали Питон. В Москве существует хорошее лобби для использования Python на олимпиадах.

А пробиться - да, вряд ли получится.


#6

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


#7

С учётом нестабильности среды (в плане том, что часто что-то новое добавляется, и часто некорректно работает случаями) это может быть вполне разумным решением.


#8

Зачем говорить о 3.2 при актуальной 3.3.5 ?

А с олимпиадами решается просто: версия фиксируется для данного этапа (или иного периода времени и официально указывается номер сборки.

Другое дело, что смысл олимпиад у нас в том, чтобы найти “жемчужное зерно в навозной куче”: фактически организаторам неинтересны все эти участники, а нужна горсточка победителей, владеющих С++. Собственно, я уже писал об этом.


#9

Пфф. Давно уже не писал, но почитываю регулярно. Чет бомбануло с этой темки. Прям RRRAAAAGGGEE!!! Несколько странно отвечать на пост годовой давности, но раз уж темку оживили…

Раз. Да бросьте вы! Уже надоело слушать эти интересные истории о том, как же сложны С/С++, и что на то, чтобы заставить школьников хоть как-то на них писать, надо потратить дикую уйму времени, и забить на все алгоритмы разом. Давно уже придумана годная и рабочая стратегия, которая активно и не к месту применяется в высших учебных заведениях (гхм, во времена моего первого курса на соседней ПМИ именно так и делали, судя по данным от соседа по комнате), а ей бы место как раз в школе. Суть ее проста: не углубляться. Вместо того, чтобы рассказывать о, например, структуре того же цикла for в виде

for(<declaration>,<condition>,<function>),

можно рассказать о том, что надо тупо писать так:

`for(int i = 0; i < N; i++)`

А теперь вопрос: чем же это сложнее, чем for i:= 1 to N do? Слегка больше букв?

Шаблоны, большая часть STL, даже написание заголовочных файлов этим доморощенным “олимпиадникам” совершенно не нужны. 95% стандарта - сахар, который упрощает разработку для тех, кто в курсе, но для тех, кому надо просто задачки порешать, хватит и тех 5, оставшихся. О всяких современных фичах новых стандартов даже говорить не буду. Все, что надо знать - это необходимость вписать ручками следующий текст (на все случаи олимпиадной жизни):

#include <iostream>
#include <vector>
#include <fstream>
#include <cmath>

int main() { <type your code here> return 0; }

Даже указатели не нужны, если научить писать амперсанд перед каждым параметром функции - благо, векторы и понятнее, и удобнее. Некоторым можно даже объяснить, что он делает :slight_smile: А остальным - просто дать домашнее задание вызубрить вышеупомянутый код наизусть. Между

function some_proc(t: integer, var k: integer): real

и

double some_proc(int t, int& k)

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

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

Два. На питоне сложно спуститься на нижний уровень? Гхм, а он вроде поддерживает функции, массивы, ветвления, циклы, базовые математические операции, операции с файлами. Или я что-то путаю? Скажите лучше, что глупо.

Три. Злобные лоббисты С++ запрещают языки с упрощенным циклом разработки? Думаю, причина исключения Питона несколько иная - пока С++сники пишут код, который работает ровно настолько быстро, насколько его написали, контроль за скоростью кода в Питоне при использовании его адекватных средств будет несколько ограничен. А использование неадекватных (именно съезжать на низкий уровень) хоть и приведет к решению, но будет использовать язык в совершенно неразумном стиле. Вывод: либо питоновец будет проигрывать только за счет того, что Питон в общем случае медленнее, чем нативный язык, либо будет писать как китаец с родителями из Индии в пьяном бреду с целью оптимизировать всякие LINQ-подобные вызовы, и все равно проиграет нативному коду за счет интерпретации. Самое плохое - будет пытаться это делать на языке, который в принципе предназначен для оптимизации скорости разработки, а не скорости кода на выходе. Единственное, чего не могу понять - что там делает Java. Вероятнее всего, у нее очень хорошее лобби, потому что по хорошему ей там тоже делать нечего. А если она там - почему в этом списке нет C#?

Четыре. Задача подготовки человека для олимпиады - не задача “подобрать вроде отличника и пнуть в понедельник в седьмую школу к 8 утра”. С человеком действительно нужно заниматься. Утверждаю это на опыте себя, частенько посещавшего олимпиады по информатике, математике, английскому языку, даже по химии и физике раз или два. Это касается абсолютно любого предмета - хоть химии, хоть русского языка, хоть информатики. И если уж ученик пришел на олимпиаду, зная только Питон на среднем школьном уровне, да еще и без алгоритмов, это говорит лишь о том, что у него дерьмовый учитель, который отправил ученика позориться. И этим не нужно заниматься посреди урока, забив на остальных - на это прекрасно хватает внеурочного времени в формате двадцати-тридцатиминутной беседы пару раз в неделю. По крайней мере, для учителя. То, что с олимпиадами по информатике у нас в России бардак (учат далеко не тому, что там есть, даже не приблизительно) - так это давно известно. Так что вопрос “что же делать детям” надо ставить иначе: “где взять учителей, у которых и идиосинкразия включилась, и голова на месте?”.

Пять. Уровень сложности задач, необходимых для получения места в первой тройке даже на уровне области, совершенно несравним ни с одним синтаксисом ни одного языка. Так что то, что побеждают в основном С++сники, подтверждается несколько иным образом: если уж смог осилить С++, значит, шансы осилить задачи уровня “конец второй страницы бланка” значительно выше того, кто пишет на трубопаскалях и иных трупах индустрии, либо языках уровня “даже у обезьяны работать будет”, вроде Питона. А еще - все-таки, из опыта общения с призерами и победителями таких олимпиад, все они занимаются дополнительно, причем очень суровым образом в плане количества часов в неделю, на это потраченных. Это, пардон, работа. А беспокоиться за школьника, которого вырвали с урока и отдали на олимпиаду, так или иначе бессмысленно - призером на фоне тех, кто занимается этим 30 часов в неделю, ему не стать в любом случае, на чем бы он там не писал.


#10

Я даже не стану ни по одному пункту писать возражения, потому что смысла не вижу. С Вами спорить - это примерно с таким же результатом, как спорить с женской логикой. Напомню, если что: “женская логика” имеет отношение к женщинам примерно же такое, как и розетка в разъемном соединении. Женская логика - это набор приемов, направленных не на выяснение истины, а на достижение победы в споре. Я заметил некоторые ее признаки в Вашем посте, посему и не вижу смысла дискутировать.


#11

Решил высказать свое мнение, а что в этом такого? Если версия фиксируется, то и претензий быть по поводу непоняток а будет ли работать у меня эта программа быть не должно, так как она конкретно оговаривается. Другое дело, если человек что-то не знает из особенностей конкретной версии.


#12

Да, детальные описания изменений от сборки к сборке не приводятся. Описание языка вообще отсутствует, к примеру, я почти постоянно вижу в параллельных ветках какие-то жуткие языковые конструкции, которые не встречались ни в Справке, ни в примерах, но они усиленно обсуждаются парой-тройкой людей, которые использовали их в “сишном семействе”. Вы сами уже видели, что вещи, вызывающие ошибку в той же 3.2, в актуальной версии работают. И наоборот, кое-что сейчас запрещено по сравнению со старыми версиями. Где взять конкретную сборку - я не знаю, скорее всего, нигде. Как проверить, работает ли программа, написанная в актуальной версии в той версии, что где-то установлена, я тоже не представляю. Поэтому, когда человек представляет текст работающей программы, следует указать, в какой конкретно сборке она была исполнена - это так. Но это “по жизни”. А вот зачем на форуме писать о проблемах, которые Вы имеете в 3.2 - это мне непонятно. Этой версии уже нет и никогда не будет. Следовательно, никто Вас с 3.2 тут не поддержит, а разработчики спокойно пройдут мимо.


#13

осиливание крестов (непонятно для чего?) не повышает профессиональный уровень, а скорее понижает.


#14

Не думаю, что знание крестов, как Вы выразились, что-то понижает…


#15

Никак не могу понять, почему так много возмущения по поводу C/C++/Python/TurboPascal на паскалевском форуме. То, что изучение TurboPascal сейчас не имеет смысла, все и так давно поняли. Про Питон - вообще другой разговор. Это, по моему мнению, один из худших языков программирования. А сравнивать, на чём лучше писать, на C/C++/C# или PascalABC.NET вообще немного странно. Все эти языки имеют как свои плюсы, так и минусы, но находятся примерно на одном уровне. То, что учителя информатики и эксперты ЕГЭ не знают (и не хотят знать) PascalABC.NET - это проблема, которую вряд ли мы с вами или разработчики сможем решить, во всяком случае чистой критикой. К сожалению.


#16

Если бы это было действительно так, C# бы не появился, когда есть С/С++, а разработчики PascalABC.NET не стали бы лезть в этот огромный многолетний проект. Конечно, есть немало конкретных аргументов, но не вижу смысла их приводить, поскольку и так все очевидно.


#17

Гхм, у меня на работе они :slight_smile: практически любой embedded или околожелезный dev включает в себя C/C++. Геймдев, опять таки (правильный, рисование падающих тетрисин для новых ведроидов не в счет). Практически любые системы реалтайм-обработки любых приходящих данных. В “пользовательских” и “энтерпрайзных” разработках есть более удобные языки.

Речь шла не об этом, к слову. Речь лишь о том, что тот, кто осилил синтаксис С++, в среднем умнее, чем тот, кто осилил синтаксис Python, а значит, вероятность того, что он попадет в призеры/победители выше. Ни о каких профессиональных уровнях тут речи не идет.

Кресты несут за собой некую привычку знать все обо всем. Ну, несли, по крайней мере, большую часть времени своего существования. Начиная с С++11 и вплоть до С++20 все постепенно меняется к лучшему. Тут ситуация двоякая - с одной стороны, полезно понимать, с чем работаешь, но с другой стороны - слишком много совершенно лишней информации, которая вывалена на программиста. Программист этот, переходя на другой ЯП (например, при смене места работы), будет по привычке искать в жабоскрипте способы поменять аллокатор вектора, дабы выжать лишние три наносекунды работы процессора/памяти. Это на выходе порождает 1) совершенно нечитаемый код для программистов, которые привыкли писать на этом новом ЯП и 2) лишнюю гору потраченных человекочасов, потому что вместо оптимизации логики/разработки новой функциональности человек уходит в перфекционизм и тратит гору времени на поиск и реализацию своих представлений о том, как должен выглядеть правильный (читай - С++ - подобный) код где-нибудь в Go или Ruby. Эту привычку вытравить невероятно сложно на ранних этапах, близко к невозможному, если “сишник” - закостенелый и перешел порог 35-40 лет. Короче, прямо - не понижает, но косвенно - создает условия для того, чтобы программист, знающий все трюки работы с кэшем процессора, памятью, и векторными инструкциями из <intrin.h>, был самым хреновым сотрудником в компании.

У меня на работе (используем как раз эти кресты) есть набор сотрудников, которым уже немало лет (ну, писали на С тогда, когда С++ еще не существовало, речь о таких). Еще есть такие, которые пришли порядка 7-10 лет назад. И есть те, кто, грубо говоря, оказались в разработке на С++ в пределах пятилетия - универ закончили, к примеру.

Несмотря на то, что язык - один и тот же (вроде), способы и подходы к программированию, стек используемых технологий, версии стандартов у этих групп отличаются настолько разительно - словами не передать. Кто-то до сих пор кодит на C++ Builder 5 [очень старые фекалии], кто-то не может слезть с VS2008 [фекалии чуть посвежее] с его C++98. Первые две группы практически поголовно не используют стандартную библиотеку даже на 10%, предпочитая оператор new использованию вектора, использование динамического подключения DLL с помощью богомерзкого LoadLibrary вместо годной статической линковки времени компиляции, и т.д.; отвратительные синглтоны, связывающие всю логику программы в один огромный морской узел, в котором ничего ни черта не поменять без разрушения всей программы. Они предпочитают папки с бэкапами вида “работает для платы А”, “упало 20.12.18 на показе” работе с репозитариями, записывают задачи в ежедневниках вместо тасков на том же Redmine. Да, лет 20 назад иначе было нельзя - именно это и породило тот самый миф о том, что программисты С++ не от мира сего, и учить его не нужно. А что, альтернативы были? Код и культура разработки на том же Delphi в те годы в лучшую сторону не отличались, к слову.

Третья группа - в основном те, кто пришел недавно - работаем несколько иначе. С++17, активное использование возможностей STL, современные версии библиотек, кроссплатформенные фреймворки вроде Qt, и т.д. Современный С++, на самом деле, в плане простоты написания кода стал гораздо ближе к тому же Питону, чем 10 лет назад - найти бы только тех преподавателей, которые готовы реально год за годом менять курс с учетом нового вышедшего стандарта. Вместо этого массово продолжает насиловаться труп С++98, попутно подпитывая огонек ненависти к С++ в целом. Помнится, к Admin это не относится - за что ему большой респект.

Из программистов третьей группы, если не потеряются в специфике языка, может получиться широкопрофильный специалист с разумным подходом к написанию кода, но первые две группы (которых на самом деле подавляющее большинство, учитывая количество легаси, написанного на С++, и популярность языка среди молодых программистов) потеряны навсегда, и лишь “портят воздух”, приходя на новое место. Именно они и создают то самое отношение к С++ как к языку, который “портит” программиста. При хреновом преподавателе/неправильно выбранном месте работы это действительно так.


#18

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

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

С этой позиции действительно не так уж и важно, на каком языке эта олимпиада пишется - код на выходе в общем случае почти всегда такой, который даже в страшном сне никому показывать нельзя. Различия в синтаксисах (проще/сложнее) тут проблему не решают, что в общем-то подтверждает мою изначальную мысль - у того, кто разобрался в синтаксисе С++, лучше получится писать замысловатый и практически нечитаемый код, который выжимает максимум производительности - это хоть и неправильно с профессиональной позиции, но тем не менее очень сложно.


#19

Собственно, Вы все сами и обозначили. С одной стороны,

а с другой, столько труда - и непонятно как жить дальше. И Вы совершенно правы, олимпиадники (особенно из тех, кто занимается “спортивным программированием”) имеют очень узкую нишу, куда потом можно встроиться работать. Если он “крутой прогер, строгающий нехилые ништяки”, то зачем он нужен в команде? Его код коллеги не поймут, зато будут постоянно обгонять по срокам реализации этапов проекта, благодаря привычке писать на “плохих языках”, не приучивших программистов бороться за байты и наносекунды, зато дающих возможность писать быстро и понятно для окружающих. В большинстве фирм (подавляющем большинстве!) бал правят менеджеры, не желающие вникать в детали, но старающиеся экономить средства, в том числе, путем буквального следования изречению “Время - деньги!”. И они следят, чтобы игра была командной, чтобы имелась взаимозаменяемость (иначе не получается напоминать сотрудникам про то, что “незаменимых у нас нет”) и чтобы код был легко модифицируем, позволяя в минимальные сроки реагировать на очередной бзик заказчика. Во все это олимпиадник вписывается с большим “скрежетом зубовным”, а оно менеджерам надо?


#20

Речь не о том, что пишется код “на плохих языках”, а о том, что код пишется хреновый. Языки тут не причем. На С++ тоже можно писать хороший и понятный код - иначе бы команд программистов С++ попросту не существовало в известном смысле. А так - да, по всем пунктам согласен.