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

Post on 21-Dec-2014

65 Views

Category:

Education

2 Downloads

Preview:

Click to see full reader

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)

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

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

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

top related