07 happydev-lite-2015 spring. Евгений Тюменцев. Зачем программисту...

42
Зачем программисту надо знать математику? HWdTech, LLC

Upload: happydev-lite

Post on 14-Apr-2017

105 views

Category:

Education


0 download

TRANSCRIPT

Page 1: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Зачем программисту надо знать математику?

HWdTech, LLC

Page 2: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Тюменцев Евгений14 лет преподаю ИМИТ, ФКН ОмГУ ИТ-компании Школа программиста10 лет разрабатываю ПО разработчик, архитектор PM, в подчинении до 70 чел.

О себе

Page 3: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

О стажировках

2007

Page 4: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

О стажировках

60 : 0

Page 5: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

О стажировках

Page 6: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Что могут студенты?Что было 4,5 с – время отклика

страницы

70 тыс. ошибок на 1 млн. страниц

30 с - время поиска по тексту объявления

БД более 200 таблиц

Page 7: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Что могут студенты?Что стало

800 мс – время отклика страницы

< 1 ош. на 10 тыс. страниц

Однушка в нефтахМатрешка до 700 т.р.

Page 8: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Подробнее о проекте

http://www.slideshare.net/etyumentcev/7-42045466

Page 9: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

SOLID5 архитектурных принципов

1988 г. Б. Мейер впервые описал

1995-96 г. Р. Мартин популяризировал, ввел термин SOLID

Page 10: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

The Open-Closed Principle

Программные объекты должны быть открыты для расширения, но в тоже время закрыты для

модификации.

Page 11: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Принцип подстановки Лисков

Функции, которые используют ссылки на объекты базовых

классов, должны использовать объекты производных классов,

ничего не зная о них.

Page 12: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Нарушают SOLID принципыenumswitchif – else – ifоператоры приведения типаnew

Page 13: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Что-о-о? switch, new? Ты кто такой?

Page 14: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

ВыводимостьПусть L – множество формул, B – формула.Тогда L B⊦ , если ∃ B1, B2, …, Bn , что1.Bn – это B,2.Bi – это либо формула из L, ,либо аксиома , либо общезначимая формула либо формула полученная при помощи правила вывода

Page 15: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Логика Хоара

Page 16: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Об авторе1969 г. An Axiomatic Basis for Computer Programming1971 г. Procedures and Parameters: An Axiomatic Approach

1980 г. премия Тьюринга1990 г. Медаль “Пионер компьютерной техники” 2000 г. рыцарский титул за заслуги в области образования и компьютерной техники, премия Киото

Чарльз Хоар

Page 17: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Тройка Хоара

{pred} statement {post}

Пример: {x == 42} y=x+1; {y == 43 ^ x == 42}

Page 18: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Аксиома пустого оператора

{P} skip {P}

Page 19: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Аксиома присваивания

Пример: {(y+1)*3+w*(y+1+3) ==z} x=y+1; { x*3+ w*(x+3)==z}

{P[E/x]} x := E {P}

Page 20: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Аксиомы оператора цикла

{P ^ B} S {P} {P} while B do S done {B’ ^ P} ╞

Page 21: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Аксиомы условного оператора

{B ^ P} S {Q}, {B’ ^P} T {Q} {P} if B then S else T endif {Q}╞

{B ^ P} S {Q} {P} if B then S endif {Q}╞

Page 22: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Аксиомы вывода

P1 → P, {P} S {Q}, Q → Q1 {P1} S {Q1}╞

P1 → P, {P} S {Q} {P1} S {Q}╞{P} S {Q}, Q → Q1 {P} S {Q1}╞

Page 23: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Аксиома вывода согласуется с условным оператором

Пусть L = {{P} f {Q}}, B – предикат.

P^B→P (A3 исчисления высказываний){P^B}f{Q} (аксиома вывода){P}if (B) then f endif {Q} (аксиома условного оператора)

Page 24: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Аксиома композиции

{P} S {Q}, {Q} T {R} {P} S;T {R} ╞

Page 25: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

• Предусловия• Постусловия• Инварианты

Контрактное программирование

Page 26: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Модульные тесты

ArrangeAct

Assert

Page 27: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Рефакторинг

Page 28: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Повторное использование кода — методология проектирования компьютерных и других систем, заключающаяся в том, что система (компьютерная программа, программный модуль) частично либо полностью должна составляться из частей, написанных ранее компонентов и/или частей другой системы, и эти компоненты должны применяться более одного раза (если не в рамках одного проекта, то хотя бы разных).

Повторное использование

https://ru.wikipedia.org/wiki/Повторное_использование_кода

Page 29: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

А можно ли по-другому?

Выводимость прямо предписывает строить новые тройки из предыдущих!

Page 30: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Когда происходит повторное использование?

Если нужно внести изменение в существующее приложение, то мы пытаемся повторно использовать свой же собственный код, чтобы получить тоже приложение, но с

новой функциональностью.

Page 31: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Чем грозят правки кода?

B1, B2, …, A1

B3, A1, …, A2

B5, A2, …, A3

A2, B6, …, A4

A2, A4, …, A5

Page 32: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Чем грозят правки кода?

B1, B2, …, A1

B3, A1, …, A2

B5, A2, …, A3

A2, B6, …, A4

A2, A4, …, A5

Page 33: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Матрицыclass matrix { int size; double *body; public: matrix(int s): size(s) { body = new double[s*s]; } void transform() { … } double det() const { … }};

Page 34: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Матрицы: добавляем matrix()class matrix { int size; double *body; public: matrix(int s): size(s) { body = new double[s*s]; } void transform() { … } double det() const { … }};

class matrix {public: matrix(): size(0), body(0) { }};

Page 35: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Придется изменять методыclass matrix { int size; double *body; public: matrix(): size(0), body(0) { } matrix(int s): size(s) { body = new double[s*s]; }

void transform() { if(!body) throw exception(); … } double det() const { if(!body) throw exception(); … }};

Page 36: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Что случилосьИнвариант класса matrix: size > 0

Конструктор matrix() нарушил инвариант: size = 0

Предусловия методов изменились с size > 0 на size ≥ 0, но

{size ≥ 0} det {Q} не выводится из {size > 0} det {Q} , Следовательно надо изменять сами методы

Page 37: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Конструкторы по умолчаниюКонструктор должен устанавливать

инвариант классаКонструкторы по умолчанию часто этого не

делают

Стоит несколько раз подумать, прежде чем использовать конструктор по умолчанию

Page 38: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Как избавиться от switch?

Page 39: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Нерассказанные факты об императивном программировании

oopguide.ru

Разработка серверов и серверных приложений

actorsmodel.ru

Мы пишем книги

Page 40: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

с/к Разработка серверов и серверных приложений (все желающие)

Студентам 2 курса ИМИТ: выполнение курсовых работ

Принять участие в разработке библиотеки для построения асинхронных, высоконагруженных приложений

Приглашаю

Page 41: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Наш слоган

Программировать – хорошо, а хорошо программировать – еще лучше. Мы знаем как!

Page 42: 07 HappyDev-lite-2015 spring. Евгений Тюменцев. Зачем программисту нужно знать математику?

Тюменцев ЕвгенийДиректор HWdTech, LLC

Звоните: +7 913 150 22 04Пишите: [email protected]

slideshare.com/etyumentcevhwdtech.ru

СпасибоСпасибо