Программирование: от сложного к простому
DESCRIPTION
Слайды для моего выступления для участников Летней Проектной Академии в детском лагере Звездный, Абакан, 20 августа 2014 г.TRANSCRIPT
Программирование: от сложного к простому
Николай Гребенщиков, руководитель центра разработки Ланит-Терком в Абакане, к.т.н.
Что скрыто за фасадом?
ДомLin
ux
Windows V
ista
Бета-те
стирова
ние Windows 8
Ман
хетте
нский проект
МКС
Великая к
итайск
ая ст
ена0
1000000000
2000000000
3000000000
4000000000
5000000000
6000000000
7000000000
8000000000
Трудозатраты, чел/час
Дом – 100 000Linux – 30 000 000Vista – 80 000 000
Слагаемые трудоемкости
• Размер и сложность решаемых задач• Ограничения человеческого организма• Разница между человеческим и
машинным языком• Особенности командной работы
Сложность задачи
Сложность задачи
Сложность задачи
Сложность задачи
• Модель• Алгоритмы• Данные: входные, хранение• Модульность и взаимодействие• Производительность
Программы пишут люди
Свойства психологии человека
Интерференция — взаимоподавление одновременно осуществляющихся психических процессов. Она обусловлена ограниченным объёмом распределяемого внимания.
Свойства психологии человека
«Магическое число семь плюс-минус два» — закономерность, обнаруженная американским учёным-психологом Джорджем Миллером, согласно которой кратковременная человеческая память, как правило, не может запомнить и повторить более 7 ± 2 элементов.
Один в поле не воин!
• Всю программу не удержать в голове:– Делим на части – функции, процедуры, классы, объекты;– Абстрагируемся – абстрактные типы, классы, инкапсуляция,
полиморфизм, шаблоны;– Выбираем другой язык – более близкий к задаче.
• Большую программу даже не написать в одиночку:– Делим на части – модули, подсистемы;– Работаем командами.
Команда
• Общее понимание задач.• Общие принципы написания кода:
– Быстрое считывание;– Через полгода ваш код не ваш.
• Средства для взаимодействия: – Задачи;– Код;– Документация.
• Расходы на общение (нелинейная зависимость от размера команды)
Программист – переводчик с человеческого на компьютерный
• Контекст задачи – неопределенный• Контекст компьютера:– Процессор (регистры, набор команд);– Память;– Внешняя память;– Дисплей;– Сеть.
От сложного к простому
Источники сложности• Предметная область• Психология человека• Команда• Разность контекстов
Способы упрощения• Сближение контекстов
задачи и компьютера за счет языка программирования
• Модель предметной области
• Абстрактные типы• Общекомандные
принципы работы
Практика программирования
Сложные концепции:• Указатель на указатель• Функция как аргумент и результат• Наследование/Полиморфизм
Указатель на указатель
Имя A B C
Адрес 0 1 2 3 4 5 6 7 8 9
Значение 3 5 8
A = 3B = 5C = 8
Указатель – переменная, которая хранит адрес другой переменной.* - операция, которая возвращает значение переменной, на которую указывает указатель.
*A = 5**A = 8
Указатель на указатель
Имя A B C D E F G H I K
Адрес 0 1 2 3 4 5 6 7 8 9
Значение 3 9 5 5 6 8 7 2 5 9
Указатель – переменная, которая хранит адрес другой переменной.* - операция, которая возвращает значение переменной, на которую указывает указатель.
A = ?F = ?D = ?B = ?
*A = ?*F = ?*D = ?*B = ?
**A = ?**F = ?**D = ?**B = ?
Функция
Квадратичный полином – ax^2 + bx + cF = function(a,b,c) {
return function(x) { return ax^2 + bx + c }}Y = F(5, -3, 2);Y (4) – 5*4^2-3*4+2 = 70
A = [1,2,3,4,5]A = A.map(Y);A – [4, 16, 38, 70, 112]
Функция
Квадратичный полином – ax^2 + bx + cF = function(a,b,c) {
return function(x) { return ax^2 + bx + c }}
Y1 = F(3, -5, 1);Y1(4) – ?Y1(-2) – ?
Y2 = F(-4, -2, 10);Y2(4) – ?Y2(-2) – ?
Придумайте свою функцию, которая возвращает функцию.
Наследование/Полиморфизм
• Шахматная фигура (позиция, проверка хода).• Пешка, Конь, Ладья – фигуры.• Позиция – наследуется. Ходы у разных фигур
разные, поэтому проверка хода должна быть изменена (полиморфизм).
Фигура = ПешкаФигура.проверитьХод(x,y)Фигура = КоньФигура.проверитьХод(x,y)
Наследование/Полиморфизм
Придумайте свой пример наследования с полиморфизмом.
Спасибо за внимание!