27
Некоторые трудности при обучении программированию: что нельзя обойти и умолчать… Незнанов Алексей Андреевич, доцент департамента анализа данных и искусственного интеллекта факультета компьютерных наук НИУ ВШЭ Максименкова Ольга Вениаминовна, старший преподаватель департамента программной инженерии факультета компьютерных наук НИУ ВШЭ © Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 1

Некоторые трудности при обучении программированию:что нельзя обойти и умолчать…

Embed Size (px)

Citation preview

Некоторые трудности при обучении программированию:

что нельзя обойти и умолчать…

Незнанов Алексей Андреевич, доцент департамента анализа данных и искусственного интеллекта факультета компьютерных наук НИУ ВШЭ

Максименкова Ольга Вениаминовна, старший преподаватель департамента программной инженерии факультета компьютерных наук НИУ ВШЭ

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 1

Базовые понятияСистема, интерфейс и протокол

Алгоритм, программа и исходный код

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 2

О контринтуитивности

• Программирование часто контринтуитивно• При обучении программированию многие концепции,

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

• Аналогия часто не просто лжива – она антисистемна!

• Очень помогает навык рационального мышления• LessWrong на русском (http://lesswrong.ru)

• Особенно это помогает при тестировании

• 97 вещей, которые должен знать каждый программист (http://copist.ru/books/97things-dev)

• Себеста Р. Основные концепции языков программирования. – М. : Вильямс, 2001. – 672 с.

• Макконнелл С. Совершенный код. Практическое руководство по разработке программного обеспечения. – Спб. : Питер, 2005. – 896 с.

• Хант Э., Томас Д. Программист-прагматик. – Лори, 2004. – 270 с.• Фаулер М. Рефакторинг. Улучшение существующего кода. – М.: Символ-Плюс,

2005. – 432 с.

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 3

О системном подходе

Система [system] – такое объединение множества элементов некоторыми связями, у которого появляются свойства, отсутствующие у любого элемента по отдельности

• Системный подход – подход к моделированию, акцентирующий внимание на выявлении систем и их взаимодействий

• Основа развития современных технологий!

• Иерархия систем• Надсистемы и подсистемы

• Синергия и эмерджентность!• Система интегративные свойства и системные свойства• Система состав и структура• Система поведение и взаимодействие с другими системами• Система иерархия (стратификация и классификация подсистем и

надсистем)• Система антагонистические свойства (диалектика)

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 4

Системы и принцип абстракции

• Абстракция [abstraction] –• Разграничение внешних (существенных с точки зрения надсистем) свойств

системы и внутренних деталей её строения и функционирования

• Принцип моделирования, заключающийся в игнорировании аспектов проблемы, не оказывающих существенного влияния на её решение

Иерархия систем => Иерархия абстракций

• Именно принцип абстракции позволяет использовать специализацию и модуляризацию

• См. интерфейс (API – Application Programming Interface) и протокол

• Закон дырявых абстракций (Джоэл Сполски): все нетривиальные абстракции дырявы

• Следствие – при ошибке в интерфейсе для её исправления может потребоваться знание как минимум трёх смежных уровней абстракций

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 5

Интерфейс

Интерфейс [interface] (inter – внешнее, между + face – лицо, фасад, если inter – между, то смысл хорошо передаёт юмористический

перевод – «междумордие»):

• В широком смысле – формальное или неформальное определение связи в тройке «сущность1 – связь – сущность2» [entity1 – relationship – entity2]

• Часть системы, открытая для других систем, внешнее восприятие системы

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

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 6

Системы и интерфейсы (иллюстрация)

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 7

Обычно из контекста ясно, о каком значении термина идёт речь

Система 2

Система 1

Интерфейс

системы 1

Интерфейс

системы 2

Внешняя часть

системы

(неотъемлемая! )

Система 2

Система 1

Интерфейс

взаимодействия

Система связей +

протокол

Случай 1: Случай 2:

Протокол

• Протокол (протокол взаимодействия) [protocol] – формально описанный способ взаимодействия двух и более субъектов (систем! посредством их интерфейсов!) для их совместной деятельности с учётом контекста

• Естественно, протокол использует интерфейсы!

• Стек протоколов – иерархически организованный набор протоколов взаимодействия определённых систем в соответствии с выбранными уровнями абстракции

• Примеры: стек сетевых протоколов, стек протоколов доступа к данным во внешней памяти, …

• Всегда можно говорить и о стеке соответствующих интерфейсов, это просто не принято

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 8

Интерфейсы и протоколы (иллюстрация)

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 9

Уровень k (низший)

Уровень 3

Уровень 2

Уровень 1 (высший)

Уровень k (низший)

Уровень 3

Уровень 2

Уровень 1 (высший)

Ik,1 Ik,2

Во

зрас

тан

ие

уро

вня

абст

рак

ци

и

ПротоколыСистема 1 Система 2

P2

P1

P2

Pk

Алгоритм как сущность. Определения и основные свойства

• Алгоритм [algorithm] – чётко описанная последовательность элементарных действий исполнителя над исходными данными для достижения предварительно сформулированного результата

• В программировании: • Исполнитель [executor, actor] – средства вычислительной техники (компьютер)

• Данные [data] – любая информация, представленная в форме, пригодной для хранения, передачи и обработки средствами вычислительной техники

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 10

Алгоритм

ИсполнительИсходные

данныеРезультат

Описание на

некотором языке

О проблеме формализации алгоритма

• На самом деле вопрос «что такое алгоритм?» очень глубок:• Что мы хотим от формального определения алгоритма• Сравнение различных исполнителей алгоритмов и их классификация• Модели вычислений и аксиоматический подход• Формализация входа и выхода алгоритма• Связь формализации алгоритма с теорией групп и теорией категорий• Конечность алгоритма и алгоритмическая разрешимость • Массовость алгоритмов• Понятие корректности алгоритма• Параллельные, распределённые, квантовые алгоритмы

• Yuri Gurevich – Introduction to Algorithms and Computational Complexity, 2 of 3: What Is An Algorithm?(http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Yuri-Gurevich-Introduction-to-Algorithms-and-Computational-Complexity-2-of-n)

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 11

Алгоритм и программа

• Программа [program] – формальная запись алгоритма и обрабатываемых им данных на некотором формальном языке для некоторого класса исполнителей

• Глубокое понимание программирования как создания программы требует понимания теории формальных языков и теории трансляции

• Но «на пальцах» можно объяснить это через рассмотрение различных представлений «исходного кода» на языках программирования различного уровня – от Ассемблера до СиПлюсПлюса и ЯвыСкрипта

• Исходный код [source code] – текст компьютерной программы на языке программирования, который может быть прочтён человеком

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 12

Системный взгляд на программирование

• Программа – подсистема некоторой информационной системы с набором интерфейсов и соответствующих протоколов!

• Реализация интерфейса прикладного программирования (API –Application Programming Interface)

• Протокол взаимодействия с API• Архитектура программной системы, которая их определяет

Ссылки:• API Design for C++ (http://www.apibook.com/blog/archives/tag/design)

• Martin Fowler articles tagged by: API design• (http://martinfowler.com/tags/API%20design.html)

• An Introduction to APIs (https://zapier.com/learn/apis)

• API Design by Matt Gemmell (http://mattgemmell.com/api-design)

• Web API Design – Crafting Interfaces that Developers Love• (https://pages.apigee.com/rs/apigee/images/api-design-ebook-2012-03.pdf)

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 13

Чек-лист [Check-list] с комментариямиТрудности, разбитые на разделы

Пояснения в особо «тёмных» случаях

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 14

Русскоязычная терминология, связанная с частями исходного кода

• Больше половины переводов трудов по программированию на русский – «отстой» с точки зрения качества терминологии

• Точно определена терминологическую систему целиком и нет необоснованных отступлений от неё

• Как минимум точно введены: оператор, операция, предложение, выражение, команда, инструкция

• При ссылке на источник → Указана используемая терминологическая система

• «Оператор» и «выражение» → Выражение может являться частью оператора (отношение «содержит» или «часть-целое»)

• «Оператор» и «управляющая конструкция» → Управляющая конструкция является оператором, но есть и другие виды операторов(отношение «обобщения» или «это есть»)

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 15

Базовые единицы исходного кода

• Фраза [phrase] – любая последовательность лексем, являющаяся правильной (валидной), то есть удовлетворяющая синтаксическим и семантическим правилам языка программирования

• Выражение [expression] – фраза на языке программирования, предназначенная для выполнения вычислений, которые позволяют получить некоторый результат, называемый значением выражения

• Выражение состоит из операндов (переменных, констант и др.), объединенных знаками операций. Вызов подпрограммы как функции тоже можно считать операцией

• В зависимости от типа результата выражения могут быть арифметическими (возвращающими число), логическими (логическое значение), символьными (строку символов) и др.

• ‼ Выражение нужно для получения своего значения!

• Оператор [statement, operator] – фраза на языке программирования, определяющая законченный этап обработки данных. В состав операторов входят ключевые слова, данные, выражения и др. Различают:

1. Атомарные операторы, никакая часть которых не является самостоятельным оператором 2. Структурные операторы, объединяющие набор операторов в единый (укрупненный)

оператор

• Конструкция (управляющая конструкция) [construction, structure] – структурный оператор, предназначенный для управления ходом выполнения программы

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 16

Переменные

• Переменная [variable] – именованный элемент данных, значение которого может изменяться

• Имя [name] переменной – правильный идентификатор языка программирования, однозначно определяющий переменную

• Значение [value] переменной – значение элемента данных, который идентифицируется именем переменной

• Переменная содержит некоторое значение, само по себе «значение» – базовое неопределяемое понятие

• Тип [type] переменной – тип данных, которые могут храниться в переменной

• Адрес [address] переменной – адрес начала участка памяти, занимаемого значением переменной

• В случае динамического распределения памяти среди всех возможных адресов выделяют специальный адрес, указывающий на отсутствие значения переменной. В языке C++ таким значением является NULL.

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 17

Объявление и определение переменных

• Объявление [declaration] переменной – первое упоминание имени переменной, задающее имя, тип и другие свойства переменной

• Самый популярные варианты: • C: <тип_данных> <имя_переменной>;

• Pascal: var <имя_переменной>: <тип_данных>

• Объявления могут располагаться почти в любом месте исходного кода

• Одно объявление может вводить несколько имён

• Место объявления переменной определяет область видимости [scope], то есть тот участок программы, в котором эту переменную можно использовать

• Определение [definition] – описание того, какие данные или код соотнесены с именем переменной

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 18

Классификация операторов и различия в их применении

• Указаны различия:• Цикла и условного оператора с использованием оператора goto

• Составного оператора и блока операторов• Особенно важно это различие при рассмотрении подпрограмм

• Явно введено понятие главного блока

• Условного оператора и операции (функции) выбора аргумента

• При наличии нескольких форм управляющих конструкций:• Пояснены критерии выбора той или иной формы

• Например, цикла с предусловием и цикла с постусловием

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 19

Оператор присваивания

• Объяснение императивного программирования через изменение состояния исполнителя путём присваивания

• Различие левых и правых значений (l-value и r-value)

• Значение как «l-value» – объект, существующий за пределами одного выражения

• Значение l-value можно представить как объект с именем.

• В большинстве императивных ЯП все переменные (включая константы) являются значениями l-value

• Название происходит от левой части оператора присваивания, где такие значения могут появляться (к константам это относится не всегда )

• Значение как «r-value» – временное значение, которое не сохраняется за пределами выражения, в котором оно получено

• Название происходит, соответственно, от правой части оператора

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 20

Пример на l-value и r-value

• Чтобы лучше понять разницу между значениями l-value и r-value, рассмотрим следующий пример из MSDN:

1. // lvalues_and_rvalues1.cpp

2. // compile with: /EHsc

3. #include <iostream>

4. using namespace std;

5. int main()

6. {

7. int x = 3 + 4;

8. cout << x << endl;

9. }

• В этом примере x — l-value, поскольку оно продолжает существовать за пределами выражения, в котором оно определено

• Выражение 3 + 4 (со значением, равным 7) — r-value, поскольку оно возвращает временное значение, которое не сохраняется за пределами выражения, в котором оно определено

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 21

Система типов языка программирования

• Введена система типов как характеристика языка

• Объяснена связь типа данных и формата данных

• При рассказе про ОДЗ → рассказано про переполнение и его варианты

• Проиллюстрировано отличие объявления от определения

• При рассказе об определяемых пользователем типах →• Описана идеология расширения системы типов языка

программирования

• Разъяснены базовые способы организации ссылок –индексами и указателями

• В рассказе про ООП → сказано, что класс – это тип данных

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 22

Подпрограммы

• Пояснён смысл алгоритмической декомпозиции

• Прояснён состав сигнатуры подпрограммы• Соглашение о вызове как часть сигнатуры

• Выявлены отличия процедур от функций• Функция – не оператор! Это вообще r-value в большинстве случаев!

• Объяснены различия формального параметра и аргумента

• Уточнены:• Передача по значению (by value) и передача по ссылке (by reference)

• Именованные параметры и смешивание схем передачи (по номеру и по имени)

• Параметры со значениями по умолчанию

• Перегрузка подпрограмм

• …

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 23

Структурное программирование

• Э. Дейкстра: «структурное программирование – дисциплина, которую программист навязывает сам себе»

• В структурном программировании:• 3 вида операторов: присваивание, управляющие конструкции и вызов

подпрограмм

• Управляющие конструкции делятся на: следование, условные операторы, циклы

• goto – нельзя! Зато можно break, continue, exit, и т.п.

• Отдельный и большой кусок связан с модуляризацией• Понятие «модуль» – неотъемлемый «кусок» структурного

программирования

• Нельзя рассказывать о структурном программировании, не рассказывая о модулях

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 24

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

2. Код модуля отделён от кода других модулей как логически, так и физически

3. Предельный размер модуля – 100 операторов (сейчас с развитием IDE не критично)

4. Любой модуль имеет одну точку входа и одну точку выхода

5. Связи модулей друг с другом – строго иерархические

6. Максимальное число связей одного модуля с другими – 10

7. Модуль комментируется• Комментарии содержат назначение модуля, описание связей этого модуля с другими по данным и управлению,

полное описание всех входных и выходных данных, а также предусловия и постусловия его вызова

8. Желательно использование только стандартных управляющих конструкций: составной оператор, ветвление, цикл, вызов подпрограммы

9. Конструкции с неочевидной семантикой (как стандартные, так и пользовательские) используются только в случае крайней необходимости

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

11. Одна строка кода содержит не более одного оператора

12. Строки имеют отступы, соответствующие уровню вложенности управляющих конструкций

13. Предельный уровень вложенности условных конструкций – 3

14. Все идентификаторы по возможности должны быть осмысленными

15. Для смысловой связи идентификаторов используются одинаковые префиксы

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 25

Но это ещё не конец?!

Спасибо за внимание к тёмным углам в обучении программированию!

Контакты:• Алексей Незнанов

• School of Data Analysis and Artificial Intelligence, Faculty of Computer Science, NRU HSE, Moscow, Russia

• E-mail: [email protected]• Web-site: http://hse.ru/staff/aneznanov• Blog: http://siberianshamanssongs.blogspot.ru (RU)

• Ольга Максименкова• School of Software Engineering,

Faculty of Computer Science, NRU HSE, Moscow, Russia• E-mail: [email protected]• Web-site: http://hse.ru/staff/maksimenkova• Blog: http://stoptoscale.blogspot.ru (RU)

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 26

О стандартах языков С и С++

• ANSI C (также стандартизирован ISO). Развивает группаJTC1/SC22/WG14 - C (http://www.open-std.org/jtc1/sc22/wg14)

• С89/С90 – ISO/IEC 9899:1990• C99 – ISO/IEC 9899:1999• C11 – ISO/IEC 9899:2011

• Аналогично JTC1/SC22/WG21 - C++ (http://www.open-std.org/jtc1/sc22/wg21)

• Standard C++ или C++98 – INCITS/ISO/IEC 14882:2003• C++11 – ISO/IEC 14882:2011• Очень интересен ISO/IEC TR 18015:2006 Technical Report on C++

performance

• A complete online reference for the C and C++ languages and standard libraries (http://en.cppreference.com/w/cpp/language)

© Максименкова О.В., Незнанов А.А., ДПИ и ДАдиИИ ФКН НИУ ВШЭ 27