Программисты - покорители сложности.pptx
- Количество слайдов: 23
Программирование: от сложного к простому Николай Гребенщиков, руководитель центра разработки Ланит-Терком в Абакане, к. т. н.
Что скрыто за фасадом?
Трудозатраты, чел/час 800000 700000 600000 500000 400000 300000 200000 100000 Бе та d u М ани ows x ан хе е W Vist a тт i ен ndo ск w ий s 8 Ве ли пр ка ое як кт ит ай М ск К ая С ст ен а Lin -те ст ир ов W in До м 0 Дом – 100 000 Linux – 30 000 Vista – 80 000
Слагаемые трудоемкости • Размер и сложность решаемых задач • Ограничения человеческого организма • Разница между человеческим и машинным языком • Особенности командной работы
Сложность задачи
Сложность задачи
Сложность задачи
Сложность задачи • • • Модель Алгоритмы Данные: входные, хранение Модульность и взаимодействие Производительность
Программы пишут люди
Свойства психологии человека Интерференция — взаимоподавление одновременно осуществляющихся психических процессов. Она обусловлена ограниченным объёмом распределяемого внимания.
Свойства психологии человека «Магическое число семь плюс-минус два» — закономерность, обнаруженная американским учёным-психологом Джорджем Миллером, согласно которой кратковременная человеческая память, как правило, не может запомнить и повторить более 7 ± 2 элементов.
Один в поле не воин! • Всю программу не удержать в голове: – Делим на части – функции, процедуры, классы, объекты; – Абстрагируемся – абстрактные типы, классы, инкапсуляция, полиморфизм, шаблоны; – Выбираем другой язык – более близкий к задаче. • Большую программу даже не написать в одиночку: – Делим на части – модули, подсистемы; – Работаем командами.
Команда • Общее понимание задач. • Общие принципы написания кода: – Быстрое считывание; – Через полгода ваш код не ваш. • Средства для взаимодействия: – Задачи; – Код; – Документация. • Расходы на общение (нелинейная зависимость от размера команды)
Программист – переводчик с человеческого на компьютерный • Контекст задачи – неопределенный • Контекст компьютера: – – – Процессор (регистры, набор команд); Память; Внешняя память; Дисплей; Сеть.
От сложного к простому Источники сложности • • Предметная область Психология человека Команда Разность контекстов Способы упрощения • Сближение контекстов задачи и компьютера за счет языка программирования • Модель предметной области • Абстрактные типы • Общекомандные принципы работы
Практика программирования Сложные концепции: • Указатель на указатель • Функция как аргумент и результат • Наследование/Полиморфизм
Указатель на указатель Имя A Адрес 0 Значение 3 B 1 2 C 3 4 5 5 6 7 8 8 Указатель – переменная, которая хранит адрес другой переменной. * - операция, которая возвращает значение переменной, на которую указывает указатель. A=3 B=5 C=8 *A = 5 **A = 8 9
Указатель на указатель Имя 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 + c F = 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 + c F = function(a, b, c) { return function(x) { return ax^2 + bx + c } } Y 1 = F(3, -5, 1); Y 1(4) – ? Y 1(-2) – ? Y 2 = F(-4, -2, 10); Y 2(4) – ? Y 2(-2) – ? Придумайте свою функцию, которая возвращает функцию.
Наследование/Полиморфизм • Шахматная фигура (позиция, проверка хода). • Пешка, Конь, Ладья – фигуры. • Позиция – наследуется. Ходы у разных фигур разные, поэтому проверка хода должна быть изменена (полиморфизм). Фигура = Пешка Фигура. проверить. Ход(x, y) Фигура = Конь Фигура. проверить. Ход(x, y)
Наследование/Полиморфизм Придумайте свой пример наследования с полиморфизмом.
Спасибо за внимание!
Программисты - покорители сложности.pptx