Архивы: по дате | по разделам | по авторам

Евгений Роганов. Основы информатики и программирования

Архив
автор : Максим Отставнов   18.03.2002

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

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

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

Учебник Роганова (www.ctc.msiu.ru) вызывает двоякое чувство: с одной стороны, интерес, с другой -сочувствие к студентам Индустриального университета, которым предстоит за семестр «переварить» такой насыщенный курс.

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

Необходимый математический минимум (сверх школьной программы) введен в курс: это, прежде всего, элементы математической логики (исчисления предикатов - § I.3) и элементы других дисциплин, излагаемые применительно к решаемым задачам.

Демонстративное решение задач составляет основу изложения материала. «Парадигмальный» вопрос однозначно решен автором в пользу объектно-ориентированного подхода 1.

Знакомство с функциональной и логической парадигмами ограничивается несколькими страничками в § I.2, которые, полагаю, студенты тотчас забудут 2.

Так же однозначно решен и вопрос языка, на котором демонстрируется решение задач - это Java и ничего, кроме Java. Соответственно, примеры маленьких программ выглядят несколько вымученными, а введение понятий доказательного программирования - утяжеленным ненужными деталями: там, где хватило бы нескольких строк на псевдокоде 3 или на чистом директивном языке (Algol-60, Pascal, APL), пример обрастает ненужными подробностями, теряет прозрачность и ясность.

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

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

И тем не менее, «снаружи» я однозначно высказался бы в пользу того, что базовые понятия стоит демонстрировать в терминах поизящнее, чем любой «промышленный» язык программирования.

Пролистав книжку задом наперед, с удовлетворением обнаруживаем, что уровень задач, на которых ООП вводится «в полный рост» (гл. III), выбран очень точно. Из трех проектных задач - построения выпуклой оболочки на плоскости, написания компилятора формул и изображения проекции полиэдра - только решение, пожалуй, первой в чистом директивном стиле будет (при прочих равных) сопоставимо по трудоемкости с ООП-решением, на двух же последних преимущества ООП-подхода уже заметны 5.

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

Вот какие непростые размышления вызвало у меня знакомство с этой книгой - без сомнения, одним из самых интересных отечественных учебных пособий по основам программирования. Студентам книги пусть рекомендуют их преподаватели, а вот самим преподавателям - разработчикам аналогичных курсов - я с чистой совестью рекомендую знакомство с этой книгой (www.ctc.msiu.ru/materials/books.php).


1 (обратно к тексту) - Хотя в первой половине пособия, при решении простых задач («программирования в малом») - а именно на них вводятся и элементы доказательного программирования (отсюда исчисление предикатов как часть курса), и понятие о квалиметрии алгоримов - используется практически чистый директивный стиль.
2 (обратно к тексту) - Отчего предвижу массу проблем в их дальнейшей жизни и работе.
3 (обратно к тексту) - Как это сделали Дейкстра в монографии «Дисциплина программирования» и Грис в, на мой взгляд, наикрутейшем учебнике «Наука программирования».
4 (обратно к тексту) - Возможно для кого-то и сегодня окажется такой же новостью, как и для меня, то, что это весьма сложная задача. Именно потому, что псевдокод («алгоритмический язык») должен быть простым, его реализация оказывается нетривиальной. Например, учащегося весьма желательно, в целях простоты изложения основ доказательного программирования, максимально освободить от (пока) ненужных подробностей, связанных с особенностями компьютерного представления чисел. А в той мере, в которой это удастся (а это означает не только «арифметику произвольной длины» для целых, но и символьное представление действительных), квалиметрические характеристики смоделированных в такой среде алгоритмов будут радикально отличаться от квалиметрии «настоящих» программ.
5 (обратно к тексту) - Правда все три весьма красиво решаются и в функциональном подходе, о чем студенты не узнают - см. примечание 2.
© ООО "Компьютерра-Онлайн", 1997-2022
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.