Ю.Л.Кетков - пионер в Нижегородском программировании

 

Впервые я узнал о Юлии Лазаревиче в 1996 году на первом курсе факультета ВМК ННГУ, где он преподавал дисциплину «Методы программирования» на языке Турбо/Борланд Паскаль. Позже я выбрал специализацию по кафедре МО ЭВМ и руководителем своей курсовой работы Кеткова Ю.Л. В то время он набирал только двух студентов. Моя работа была связана с доработкой языка описания графических изображений (расширением множества команд). После IV курса я поступил в магистратуру, и работа продолжилась ещё на 2 года, после чего Ю.Л. Кетков позвал меня работать в НИИ ПМК.

Первое, что бросилось в глаза на лекциях Ю.Л. Кеткова – это его подчерк. Практически всё написанное на доске, - от текстов программ, до обычных комментариев, - было написано почти как на печатной машинке: идеально ровные горизонтальные строки и буквы одинаковых размеров. Поначалу я думал, что это делается исключительно для удобочитаемости, но потом, во время написания курсовых работ, убедился, что также идеально выглядели не только надписи на доске, но и черновики.

Важной отличительной чертой лекций Ю.Л. Кеткова являлась «их адаптивность». Помимо обязательных сведений по предмету, он иногда рассказывал о различных новостях в мире компьютерной техники и программирования, предупреждал о появлении новых вирусов, рассказывал некоторые интересные задачи из прошедших олимпиад по программированию. При всём при этом, он всегда очень переживал, если по каким-либо причинам та или иная лекция отменялась. Раньше это случалось чаще всего из-за всяких праздников, а в последнее время добавилась и другая причина – по болезни. Чтобы Юлий Лазаревич не пришёл на лекции по болезни, болезнь должна быть очень веской. Например, при перенесённых воспалении легких и операциях по удалению тромбов в ногах Ю.Л. Кетков достаточно скоро начинал ходить на лекции и на работу в НИИ ПМК, хотя это ему и доставляло заметные со стороны трудности.

Отдельных слов заслуживает способ сдачи экзамена Ю.Л. Кеткову. В отличие от большинства преподавателей, которые достаточно критично относятся к наличию у учащихся разного рода шпаргалок, Юлий Лазаревич наоборот разрешал приносить на экзамены, не только шпаргалки, но и книги. На удивленные вопросы по этому поводу он отвечал: «Пусть используют что угодно, когда готовят ответ на вопросы билета, но когда человек садится ко мне отвечать, я по ответам на дополнительные вопросы всегда смогу понять, разбирается ли он в предмете или просто механически списал ответ откуда-нибудь». При сдаче экзамена обычно требуется написать простенькую программу (10-20 строк). Излюбленным приёмом проверки таких программ являлось указание на тот или иной участок текста и вопрос «а это что такое?». И действительно, если человеку кто-то помог написать программу или он нашёл готовое решение, то он терялся, а вот если экзаменуемый сам написал программу, он может объяснить любую строку кода. Когда Юлий Лазаревич ставил кому-нибудь двойку, он немного расстраивался и, похоже, воспринимал этот факт как свою недоработку.

На ведение курсовых и дипломных работ у Ю.Л. Кеткова тоже был свой взгляд. Если другие преподаватели требовали от учащихся явки в определённые дни, как на работу, то Юлий Лазаревич, напротив, выдавал задание и предоставлял учащимся практически полную свободу действий. Это означает, что человек сам уже потом решал, когда ему нужно будет явиться и показать результаты своей работы. Это ужасно удобно для людей, умеющих планировать своё время, и ужасно вредно для неумеющих. Последние начинали писать диплом/курсовую в последний месяц, а то и неделю, до окончания семестра. В результате, доставляли неудобства не только самим себе, но и Юлию Лазаревичу, которому иногда в спешке, почти в день сдачи, приходилось писать рецензии и отзывы на курсовые или дипломы.

Кстати и к выбору тем курсовых Юлий Лазаревич подходил достаточно демократично. Если пришедшие к нему студенты уже ясно представляли, чем хотят заниматься, то и тема курсовой подбиралась в соответствии с пожеланиями. При этом Юлий Лазаревич досконально пытался изучить эту тематику. Если же студент не определился с темой, то ему на выбор предлагался набор задач, решение которых, могло бы упростить нашу работу в НИИ ПМК. В основном это касалось отображения и редактирования дискретных знаков, а также других задач геоинформатики.

Вообще, Юлий Лазаревич всегда очень обстоятельно подходил к любой новой тематике или крупной покупке. В такие периоды на его столе появлялось большое количество различных заметок, а в компьютере куча сохранённых сайтов и книг по нужной теме. При всём этом он не считал зазорным дополнительно расспрашивать окружающих по интересующим вопросам. Аналогичным образом он относился и к жалобам на ошибки в нашем программном обеспечении, тщательно изучая вопрос, зачастую выявляя неверные входные данные. Благодаря этому, о многих ошибках люди предпочитали сообщать нам в обход Юлия Лазаревича. Дело в том, что за годы работы в НИИ ПМК сложилась традиция поставлять нам повреждённые данные (не соответствующие требованиям) с сообщением об ошибке в наших программах.

Подобный обстоятельный подход к каждой проблеме, конечно же, отнимал значительное время. Но благодаря этому, когда при написании программ по той или иной тематике мы сталкивались с какими-либо проблемами, мы всегда могли задать вопрос Юлию Лазаревичу и почти на 100% могли быть уверенными, что эта проблема им уже обдумана или даже решена. Например, когда мы создавали комплекс программ по морской тематике, Юлий Лазаревич нарисовал все мыслимые и немыслимые условные знаки в любых вариациях. Поэтому при написании кода обработки того или иного знака, мы по мере необходимости брали уже готовые изображения…

Особых слов заслуживает и писательский талант Юлия Лазаревича. Он практически стал главным редактором всех исходящих отчётов и статей нашего отдела, искусно заменяя тяжёлые или неудобочитаемые предложения лёгкими и более простыми. Очень поражала его способность прикинуться «деревенским лаптем» при оценке статьи или программы. Наверное, именно благодаря этому его книги написаны понятным и доступным для всех языком. При оценке программ на первое место он всё же ставил функциональность и работоспособность, а интерфейс пользователя называл необязательным украшательством.

В работе на посту начальника IV отдела Юлий Лазаревич руководил мягко в том смысле, что всегда старался избегать чётко указывать, кто и что должен делать и за какое время. Указания его носили скорее рекомендательный характер: «надо бы вот что сделать…», «надо бы статью на такую-то тему написать». В плане внесения каких-либо дополнений к программам мы были свободны, но обращались к нему в случае спорных вопросов или при планировании серьёзных изменений. В частности, Юлий Лазаревич частенько вставал на нашу сторону, когда требовалось написать что-то совсем уж невообразимое.

Когда я устроился в НИИ ПМК в 2002 году, Юлий Лазаревич позвал меня помочь в проведении олимпиады 2003 года: поначалу в качестве волонтёра – следить за соблюдением правил и порядка в терминал классах, а в последующие годы – в качестве члена жюри. В те времена олимпиадные задачи и контрольные тесты для них придумывали сами члены жюри. Иной раз придумывалось больше задач, чем нужно, поэтому они проходили некий отбор. Важным критерием отбора было, как говорил Ю.Л. Кетков: «В задаче должна быть «изюминка». Под этой «изюминкой» понималось то, что задача должна иметь два способа решения: первый – что называется «в лоб», который обычно занимает много времени; второй – нетривиальный и в то же время, существенно увеличивающий скорость решения. Такие задачи и считаются «олимпиадными»: кто заметит хитрость в задаче – тот сможет набрать максимум баллов, а кто не заметит – набирает меньше максимума. При этом важным является то, что задача при решении не разделяет людей, натасканных на решение задач, и людей, обладающих только знаниями по программированию: догадаться или не догадаться до хитрого решения могут и те и другие! Конечно, среди недогадливых специально подготовленные, всё равно, набирали больше баллов, чем не обладающие такой подготовкой участники. Тут уже играют роль знания по использованию быстрых алгоритмов для решения рутинных подзадач (например, таких как сортировка, поиск и т.п.).

После принятия задачи к олимпиаде, производилась её «доводка до ума». Традиционно к задачам готовились 5 тестов, поэтому «доводка до ума» заключалась главным образом в удобстве проверки. Юлий Лазаревич считал, что 5 тестов достаточно, чтобы рассмотреть все особенности задачи. Главными критериями удобства проверки являются однозначность ответа программы и наглядность этого ответа. Задачи формулировались таким образом, чтобы на любой допустимый набор данных программа должна ответить единственным верным образом (иными словами: на любой тест правильный ответ один единственный). Наглядность означает, что в случае неверного ответа программы, мы могли буквально «на пальцах» показать участнику, в чём заключалась ошибка, и какие случаи участник пропустил при создании алгоритма решения. Нередки были случаи, когда для наглядности подготавливались дополнительные материалы: картинки, графики, схемы решения и т.п. Эти материалы тоже способствовали обеспечению прозрачности проверки решений.

Непринятые или недоработанные задачи Юлий Лазаревич сильно упрощал и использовал в студенческих олимпиадах. На мои вопросы: «Почему для студентов нужны более лёгкие задачи?» Юлий Лазаревич отвечал: «Студенты более ленивые и уже неспособны быстро мыслить и решать задачи наравне со школьниками». Помню, что меня это очень удивило, но Юлий Лазаревич показал статистику решения подобных задач студентами, которая чётко продемонстрировала, насколько студенты слабее школьников. Будем надеяться, что в будущем студенты поумнеют.

Сам процесс проведения областной олимпиады в те годы был следующим: на написание решения участникам давалось 4 часа на каждом из двух туров (по часу на каждую задачу), после происходила проверка решений. Проверка была очной: член жюри садился вместе с участником за один компьютер, и программа вручную запускалась на каждом тесте. Такой метод проверки занимал порядка 2 часов, когда проверяло 8-10 человек. Проверка всегда велась достаточно демократично. Если участник забыл поправить в программе 1-2 символа, то ему разрешалось это сделать в присутствии проверяющего. Всякие бывали случаи: кто-то случайно нажал при финальном сохранении не ту клавишу и сохранил вместе с программой лишний символ, кто-то в спешке закомментировал не ту строку и т.п. При этом Юлий Лазаревич часто давал внести исправления, оговариваясь, что мы судим не способность не нервничать на олимпиаде, а способность решать задачи. В то же время его по этому поводу, похоже, мучили некоторые угрызения совести, т.к. кто-то попросит жюри об одолжении, а кто-то постесняется. Другим признаком демократии была проверка решений отсутствующих. Дело в том, что многие участники областных олимпиад приезжают издалека и поэтому вынуждены уезжать раньше. Такие решения мы проверяли заочно, и они нередко получали заслуженные ненулевые баллы.

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

В 2008-2009 годах в корне изменились правила проведения областных олимпиад. Вкратце опишу эти нововведения: теперь одни и те же задачи присылаются из Москвы во все города, к каждой задаче прилагается по 20-50 тестовых данных. Можно сказать, что с 2009 года и начался закат олимпиадного движения по программированию. Отношение Ю.Л. Кеткова к нововведениям было отрицательным, впрочем, такое отношение сформировалось у всех мало-мальски здравомыслящих людей. Дело тут даже не в том, что 20-50 тестов – это слишком много для того, чтобы проверить 1-3 особых случаев в решении задачи. Главным недостатком новых задач является то, что они совершенно бесхитростны, т.е. решаются «в лоб», как написано в учебниках. Таким образом, олимпиаду нового формата более правильно называть проверкой знаний информатики, а уж никак не олимпиадой. Причём таких задач с каждым годом всё больше и больше. В тестах внимание уделяется больше не творческому подходу к решению задач, а технике программирования. Новые тесты ловят не ошибки в алгоритмах, а ошибки в их кодировании: вдруг участник выбрал недостаточно большой тип данных, вдруг забыл о размерностях типов, вдруг не учёл размерность результата и т.п. Причём на таких вот мелочах участник теряет очень большое количество баллов.

Другим нюансом нового формата олимпиады стал огромный объём работы, которую требовалось произвести при проверке решений. На каждом туре участник решает по 4 задачи, каждое решение нужно проверить на 25-50 тестах и сравнить с правильным ответом. Естественно, ни о какой очной проверке речи уже идти не могло. Вдобавок задачи и тесты к ним были таковы, что даже объяснить участнику, почему его программа выдаёт неверный ответ, стало невозможным. Представьте тест размером в 1 Мегабайт и примерно такой же ответ программы, которая в одном байте где-то ошиблась, - нереально глазами даже найти место ошибки, не то, что понять, в чём ошибка. Единственный выход - это автоматическая система проверки, которую господа из Москвы не поставляют, а лишь предлагают где-то купить.

Благо тексты задач и тестов к ним были известны за два месяца до начала. За это время я успел написать скрипты, автоматически запускающие программы участников на тестовых примерах и проверяющие правильность ответов. Набор написанных скриптов и составил базис системы автоматического тестирования Тот (по названию египетского бога).

Генезис программы под новыми и новыми требованиями к проведению олимпиады - это материал для отдельной книги. Скажу только, что эта корявая первая версия системы очень помогла нам хоть как-то провести олимпиаду 2008 года. В виду того, что решения проверялись заочно, было много «криков» как от учителей, так и от самих участников по поводу результатов.

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

В первые годы олимпиад нового формата задачи допускали простой метод проверки, т.е. сравнение ответа программы с правильным ответом. В последующие же начали часто появляться задачи, где на каждый тест можно было дать несколько правильных ответов. В 2014 году таких задач было максимум 6 из 8. Именно подобные задачи составляют основную сложность при проверке – для каждой из них приходится писать отдельные программы верификации, которые отвечают на вопрос «правильно ли ответила программа на тест?». Программа верификации иногда по объёму и сложности превышает само решение раз в 10. Тут Юлий Лазаревич тоже проявлял свои демократические взгляды, никогда не навязывая свои способы проверки и даже не контролируя правильность моих программ.

В 2013 году придумали новые препятствия для проведения олимпиады: теперь задачи и тесты к ним выдаются членам жюри за 4 дня до начала олимпиады. За эти 4 дня нужно успеть написать проверяющие программы, их отладить, проверить на всякие экстремальные условия работы. Ясное дело, это нереально. Как следствие, в 2013 году тестирующая система дала первый сбой на одной задаче, из-за которой на нас и было много жалоб. Оказалось, что Москва сама не умеет проверять эту задачу (их алгоритм проверки считал их же решение неверным)!

Юлий Лазаревич каждый год писал свои замечания по поводу олимпиады «высшему начальству», где он перечислял все недостатки нового формата олимпиады, но всё это стабильно игнорировалось. Тем не менее, до самой смерти оставался бессменным председателем жюри. Когда 5 января 2014 года мы встретились по поводу предстоящей олимпиады, Юлий Лазаревич сказал, что откажется от преподавательской деятельности, перейдёт на ¼ ставки и будет заниматься только олимпиадами. К сожалению, этому не суждено было сбыться…

А.И.Кузнецов

работал в 4-м отделе НИИ ПМК в 2002-2014 гг.