23
Программирование: от сложного к простому Николай Гребенщиков, руководитель центра разработки Ланит-Терком в Абакане, к.т.н.

Программирование: от сложного к простому

Embed Size (px)

DESCRIPTION

Слайды для моего выступления для участников Летней Проектной Академии в детском лагере Звездный, Абакан, 20 августа 2014 г.

Citation preview

Page 1: Программирование: от сложного к простому

Программирование: от сложного к простому

Николай Гребенщиков, руководитель центра разработки Ланит-Терком в Абакане, к.т.н.

Page 2: Программирование: от сложного к простому

Что скрыто за фасадом?

Page 3: Программирование: от сложного к простому

ДомLin

ux

Windows V

ista

Бета-те

стирова

ние Windows 8

Ман

хетте

нский проект

МКС

Великая к

итайск

ая ст

ена0

1000000000

2000000000

3000000000

4000000000

5000000000

6000000000

7000000000

8000000000

Трудозатраты, чел/час

Дом – 100 000Linux – 30 000 000Vista – 80 000 000

Page 4: Программирование: от сложного к простому

Слагаемые трудоемкости

• Размер и сложность решаемых задач• Ограничения человеческого организма• Разница между человеческим и

машинным языком• Особенности командной работы

Page 5: Программирование: от сложного к простому

Сложность задачи

Page 6: Программирование: от сложного к простому

Сложность задачи

Page 7: Программирование: от сложного к простому

Сложность задачи

Page 8: Программирование: от сложного к простому

Сложность задачи

• Модель• Алгоритмы• Данные: входные, хранение• Модульность и взаимодействие• Производительность

Page 9: Программирование: от сложного к простому

Программы пишут люди

Page 10: Программирование: от сложного к простому

Свойства психологии человека

Интерференция — взаимоподавление одновременно осуществляющихся психических процессов. Она обусловлена ограниченным объёмом распределяемого внимания.

Page 11: Программирование: от сложного к простому

Свойства психологии человека

«Магическое число семь плюс-минус два» — закономерность, обнаруженная американским учёным-психологом Джорджем Миллером, согласно которой кратковременная человеческая память, как правило, не может запомнить и повторить более 7 ± 2 элементов.

Page 12: Программирование: от сложного к простому

Один в поле не воин!

• Всю программу не удержать в голове:– Делим на части – функции, процедуры, классы, объекты;– Абстрагируемся – абстрактные типы, классы, инкапсуляция,

полиморфизм, шаблоны;– Выбираем другой язык – более близкий к задаче.

• Большую программу даже не написать в одиночку:– Делим на части – модули, подсистемы;– Работаем командами.

Page 13: Программирование: от сложного к простому

Команда

• Общее понимание задач.• Общие принципы написания кода:

– Быстрое считывание;– Через полгода ваш код не ваш.

• Средства для взаимодействия: – Задачи;– Код;– Документация.

• Расходы на общение (нелинейная зависимость от размера команды)

Page 14: Программирование: от сложного к простому

Программист – переводчик с человеческого на компьютерный

• Контекст задачи – неопределенный• Контекст компьютера:– Процессор (регистры, набор команд);– Память;– Внешняя память;– Дисплей;– Сеть.

Page 15: Программирование: от сложного к простому

От сложного к простому

Источники сложности• Предметная область• Психология человека• Команда• Разность контекстов

Способы упрощения• Сближение контекстов

задачи и компьютера за счет языка программирования

• Модель предметной области

• Абстрактные типы• Общекомандные

принципы работы

Page 16: Программирование: от сложного к простому

Практика программирования

Сложные концепции:• Указатель на указатель• Функция как аргумент и результат• Наследование/Полиморфизм

Page 17: Программирование: от сложного к простому

Указатель на указатель

Имя A B C

Адрес 0 1 2 3 4 5 6 7 8 9

Значение 3 5 8

A = 3B = 5C = 8

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

*A = 5**A = 8

Page 18: Программирование: от сложного к простому

Указатель на указатель

Имя 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 = ?

Page 19: Программирование: от сложного к простому

Функция

Квадратичный полином – 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]

Page 20: Программирование: от сложного к простому

Функция

Квадратичный полином – 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) – ?

Придумайте свою функцию, которая возвращает функцию.

Page 21: Программирование: от сложного к простому

Наследование/Полиморфизм

• Шахматная фигура (позиция, проверка хода).• Пешка, Конь, Ладья – фигуры.• Позиция – наследуется. Ходы у разных фигур

разные, поэтому проверка хода должна быть изменена (полиморфизм).

Фигура = ПешкаФигура.проверитьХод(x,y)Фигура = КоньФигура.проверитьХод(x,y)

Page 22: Программирование: от сложного к простому

Наследование/Полиморфизм

Придумайте свой пример наследования с полиморфизмом.

Page 23: Программирование: от сложного к простому

Спасибо за внимание!