Программирование: 
от сложного к простому 
Николай Гребенщиков, 
руководитель центра 
разработки Ланит-Терком 
в Абакане, к.т.н.
Что скрыто за фасадом?
8E+09 
7E+09 
6E+09 
5E+09 
4E+09 
3E+09 
2E+09 
1E+09 
0 
Трудозатраты, чел/час 
Дом – 100 000 
Linux – 30 000 000 
Vista – 80 000 000
Слагаемые трудоемкости 
• Размер и сложность решаемых задач 
• Ограничения человеческого организма 
• Разница между человеческим и 
машинным языком 
• Особенности командной работы
Сложность задачи
Сложность задачи
Сложность задачи
Сложность задачи 
• Модель 
• Алгоритмы 
• Данные: входные, хранение 
• Модульность и взаимодействие 
• Производительность
Программы пишут люди
Свойства психологии человека 
Интерференция — взаимоподавление одновременно 
осуществляющихся психических процессов. Она обусловлена 
ограниченным объёмом распределяемого внимания.
Свойства психологии человека 
«Магическое число семь плюс-минус два» — 
закономерность, обнаруженная американским учёным-психологом Джорджем 
Миллером, согласно которой кратковременная человеческая память, как 
правило, не может запомнить и повторить более 7 ± 2 элементов.
Один в поле не воин! 
• Всю программу не удержать в голове: 
– Делим на части – функции, процедуры, классы, объекты; 
– Абстрагируемся – абстрактные типы, классы, инкапсуляция, 
полиморфизм, шаблоны; 
– Выбираем другой язык – более близкий к задаче. 
• Большую программу даже не написать в 
одиночку: 
– Делим на части – модули, подсистемы; 
– Работаем командами.
Команда 
• Общее понимание задач. 
• Общие принципы написания кода: 
– Быстрое считывание; 
– Через полгода ваш код не ваш. 
• Средства для взаимодействия: 
– Задачи; 
– Код; 
– Документация. 
• Расходы на общение (нелинейная зависимость 
от размера команды)
Программист – переводчик с 
человеческого на компьютерный 
• Контекст задачи – неопределенный 
• Контекст компьютера: 
– Процессор (регистры, набор команд); 
– Память; 
– Внешняя память; 
– Дисплей; 
– Сеть.
От сложного к простому 
Источники сложности 
• Предметная область 
• Психология человека 
• Команда 
• Разность контекстов 
Способы упрощения 
• Сближение контекстов 
задачи и компьютера за 
счет языка 
программирования 
• Модель предметной 
области 
• Абстрактные типы 
• Общекомандные 
принципы работы
Практика программирования 
Сложные концепции: 
• Указатель на указатель 
• Функция как аргумент и результат 
• Наследование/Полиморфизм
Указатель на указатель 
Имя A B C 
Адрес 0 1 2 3 4 5 6 7 8 9 
Значение 3 5 8 
Указатель – переменная, которая хранит адрес другой переменной. 
* - операция, которая возвращает значение переменной, на которую 
указывает указатель. 
A = 3 
B = 5 
C = 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 + 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 } 
} 
Y1 = F(3, -5, 1); 
Y1(4) – ? 
Y1(-2) – ? 
Y2 = F(-4, -2, 10); 
Y2(4) – ? 
Y2(-2) – ? 
Придумайте свою 
функцию, которая 
возвращает 
функцию.
Наследование/Полиморфизм 
• Шахматная фигура (позиция, проверка хода). 
• Пешка, Конь, Ладья – фигуры. 
• Позиция – наследуется. Ходы у разных фигур 
разные, поэтому проверка хода должна быть 
изменена (полиморфизм). 
Фигура = Пешка 
Фигура.проверитьХод(x,y) 
Фигура = Конь 
Фигура.проверитьХод(x,y)
Наследование/Полиморфизм 
Придумайте свой пример наследования с 
полиморфизмом.
Спасибо за внимание!

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

  • 1.
    Программирование: от сложногок простому Николай Гребенщиков, руководитель центра разработки Ланит-Терком в Абакане, к.т.н.
  • 2.
    Что скрыто зафасадом?
  • 3.
    8E+09 7E+09 6E+09 5E+09 4E+09 3E+09 2E+09 1E+09 0 Трудозатраты, чел/час Дом – 100 000 Linux – 30 000 000 Vista – 80 000 000
  • 4.
    Слагаемые трудоемкости •Размер и сложность решаемых задач • Ограничения человеческого организма • Разница между человеческим и машинным языком • Особенности командной работы
  • 5.
  • 6.
  • 7.
  • 8.
    Сложность задачи •Модель • Алгоритмы • Данные: входные, хранение • Модульность и взаимодействие • Производительность
  • 9.
  • 10.
    Свойства психологии человека Интерференция — взаимоподавление одновременно осуществляющихся психических процессов. Она обусловлена ограниченным объёмом распределяемого внимания.
  • 11.
    Свойства психологии человека «Магическое число семь плюс-минус два» — закономерность, обнаруженная американским учёным-психологом Джорджем Миллером, согласно которой кратковременная человеческая память, как правило, не может запомнить и повторить более 7 ± 2 элементов.
  • 12.
    Один в полене воин! • Всю программу не удержать в голове: – Делим на части – функции, процедуры, классы, объекты; – Абстрагируемся – абстрактные типы, классы, инкапсуляция, полиморфизм, шаблоны; – Выбираем другой язык – более близкий к задаче. • Большую программу даже не написать в одиночку: – Делим на части – модули, подсистемы; – Работаем командами.
  • 13.
    Команда • Общеепонимание задач. • Общие принципы написания кода: – Быстрое считывание; – Через полгода ваш код не ваш. • Средства для взаимодействия: – Задачи; – Код; – Документация. • Расходы на общение (нелинейная зависимость от размера команды)
  • 14.
    Программист – переводчикс человеческого на компьютерный • Контекст задачи – неопределенный • Контекст компьютера: – Процессор (регистры, набор команд); – Память; – Внешняя память; – Дисплей; – Сеть.
  • 15.
    От сложного кпростому Источники сложности • Предметная область • Психология человека • Команда • Разность контекстов Способы упрощения • Сближение контекстов задачи и компьютера за счет языка программирования • Модель предметной области • Абстрактные типы • Общекомандные принципы работы
  • 16.
    Практика программирования Сложныеконцепции: • Указатель на указатель • Функция как аргумент и результат • Наследование/Полиморфизм
  • 17.
    Указатель на указатель Имя A B C Адрес 0 1 2 3 4 5 6 7 8 9 Значение 3 5 8 Указатель – переменная, которая хранит адрес другой переменной. * - операция, которая возвращает значение переменной, на которую указывает указатель. A = 3 B = 5 C = 8 *A = 5 **A = 8
  • 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 = ?
  • 19.
    Функция Квадратичный полином– 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]
  • 20.
    Функция Квадратичный полином– ax^2 + bx + c F = 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) – ? Придумайте свою функцию, которая возвращает функцию.
  • 21.
    Наследование/Полиморфизм • Шахматнаяфигура (позиция, проверка хода). • Пешка, Конь, Ладья – фигуры. • Позиция – наследуется. Ходы у разных фигур разные, поэтому проверка хода должна быть изменена (полиморфизм). Фигура = Пешка Фигура.проверитьХод(x,y) Фигура = Конь Фигура.проверитьХод(x,y)
  • 22.
    Наследование/Полиморфизм Придумайте свойпример наследования с полиморфизмом.
  • 23.