Slide 1

Slide 1 text

Modifiability Warsaw ~ Kyiv, Apr 2020 Oleg Kovalov Allegro https://olegk.dev

Slide 2

Slide 2 text

- Gopher for ~5 years - Open source contributor - Engineer at allegro.pl core team https://olegk.dev Кто я 2

Slide 3

Slide 3 text

Кто этот Modifiability 3

Slide 4

Slide 4 text

- As a user developer I want… Кто этот Modifiability 4

Slide 5

Slide 5 text

- As a user developer I want… - Менять код и делать это легко Кто этот Modifiability 5

Slide 6

Slide 6 text

- As a user developer I want… - Менять код и делать это легко - Мигрировать на другие компоненты Кто этот Modifiability 6

Slide 7

Slide 7 text

- As a user developer I want… - Менять код и делать это легко - Мигрировать на другие компоненты - Меньше действий - больше улучшений Кто этот Modifiability 7

Slide 8

Slide 8 text

Когда этот Modifiability 8

Slide 9

Slide 9 text

- Во время разработки - новые требования - адаптируемся Когда этот Modifiability 9

Slide 10

Slide 10 text

- Во время разработки - новые требования - адаптируемся - Во время эксплуатации - что-то поняли, когда уже заработало Когда этот Modifiability 10

Slide 11

Slide 11 text

- Во время разработки - новые требования - адаптируемся - Во время эксплуатации - что-то поняли, когда уже заработало - Во время эволюционирования - теперь нужно решить больше проблем Когда этот Modifiability 11

Slide 12

Slide 12 text

- Во время разработки - новые требования - адаптируемся - Во время эксплуатации - что-то поняли, когда уже заработало - Во время эволюционирования - теперь нужно решить больше проблем Если проект жив - нужно Когда этот Modifiability 12

Slide 13

Slide 13 text

Так есть же SOLID! 13

Slide 14

Slide 14 text

- Да, есть Так есть же SOLID! 14

Slide 15

Slide 15 text

- Да, есть - И использовать надо, очень надо Так есть же SOLID! 15

Slide 16

Slide 16 text

- Да, есть - И использовать надо, очень надо - Кстати, а ведь большинство использует - мне вот сложно вспомнить, кто не знал - еще сложнее, кто не использовал Так есть же SOLID! 16

Slide 17

Slide 17 text

- Да, есть - И использовать надо, очень надо - Кстати, а ведь большинство использует - мне вот сложно вспомнить, кто не знал - еще сложнее, кто не использовал - (многие не помнят пункты, факт) Так есть же SOLID! 17

Slide 18

Slide 18 text

- Да, есть - И использовать надо, очень надо - Кстати, а ведь большинство использует - мне вот сложно вспомнить, кто не знал - еще сложнее, кто не использовал - (многие не помнят пункты, факт) - Вопрос только в уровнях и детализации - а здесь вся идея Так есть же SOLID! 18

Slide 19

Slide 19 text

Уровни детализации 19 GopherCon Europe 2019: Egon Elbre - Psychology of Code Readability

Slide 20

Slide 20 text

Уровни детализации 20 GopherCon Europe 2019: Egon Elbre - Psychology of Code Readability Здесь чаще джуны

Slide 21

Slide 21 text

Уровни детализации 21 GopherCon Europe 2019: Egon Elbre - Psychology of Code Readability Здесь чаще джуны а здесь синьеры

Slide 22

Slide 22 text

Давайте примеры на Java и Go 22

Slide 23

Slide 23 text

- Почему эти языки? - я с ними связан, они интересные - на самом деле Java, Kotlin, Groovy, etc Давайте примеры на Java и Go 23

Slide 24

Slide 24 text

- Почему эти языки? - я с ними связан, они интересные - на самом деле Java, Kotlin, Groovy, etc - 1й постарше будет - а значит привычки окаменели - есть класс? - нужен интерфейс! Давайте примеры на Java и Go 24

Slide 25

Slide 25 text

- Почему эти языки? - я с ними связан, они интересные - на самом деле Java, Kotlin, Groovy, etc - 1й постарше будет - а значит привычки окаменели - есть класс? - нужен интерфейс! - 2й помоложе будет - а значит еще не все потеряно - ^^^ selling point Давайте примеры на Java и Go 25

Slide 26

Slide 26 text

- Почему эти языки? - я с ними связан, они интересные - на самом деле Java, Kotlin, Groovy, etc - 1й постарше будет - а значит привычки окаменели - есть класс? - нужен интерфейс! - 2й помоложе будет - а значит еще не все потеряно - ^^^ selling point Люблю оба, но каждый по своему Давайте примеры на Java и Go 26

Slide 27

Slide 27 text

public interface TokenGenerator { String generate(); } Абстрактный реальный пример 27

Slide 28

Slide 28 text

public interface TokenGenerator { String generate(); } class DefaultTokenGenerator implements TokenGenerator { public DefaultTokenGenerator(TokenHasher tokenHasher) { ... } public String generate() { this.th.hash(Rand.newString()); } } Абстрактный реальный пример 28

Slide 29

Slide 29 text

public interface TokenGenerator { String generate(); } class DefaultTokenGenerator implements TokenGenerator { public DefaultTokenGenerator(TokenHasher tokenHasher) { ... } public String generate() { this.th.hash(Rand.newString()); } } public interface TokenHasher { String hash(String s); } Абстрактный реальный пример 29

Slide 30

Slide 30 text

Так что плохого тут? 30

Slide 31

Slide 31 text

- TokenGenerator будет везде - реализация и потребитель должны явно требовать - это хорошо, ведь всё наглядно - это плохо, ведь таких интерфейсов много Так что плохого тут? 31

Slide 32

Slide 32 text

- TokenGenerator будет везде - реализация и потребитель должны явно требовать - это хорошо, ведь всё наглядно - это плохо, ведь таких интерфейсов много - нужен ли нам TokenHasher ? - на самом деле нет - DefaultTokenGenerator справился бы отлично Так что плохого тут? 32

Slide 33

Slide 33 text

- TokenGenerator будет везде - реализация и потребитель должны явно требовать - это хорошо, ведь всё наглядно - это плохо, ведь таких интерфейсов много - нужен ли нам TokenHasher ? - на самом деле нет - DefaultTokenGenerator справился бы отлично - Такого в Java-мире много - оно и работает, и буксует Так что плохого тут? 33

Slide 34

Slide 34 text

type TokenGenerator interface { Generate() string } А пример на Go? 34

Slide 35

Slide 35 text

type TokenGenerator interface { Generate() string } type SHAGenerator struct { ... } func (d *SHAGenerator) Generate() string { ... } // нам не нужно implements ведь в compile-time проверим А пример на Go? 35

Slide 36

Slide 36 text

Так чем Go лучше? 36

Slide 37

Slide 37 text

- Композиция, но не наследование - усложняет наслоение абстракций Так чем Go лучше? 37

Slide 38

Slide 38 text

- Композиция, но не наследование - усложняет наслоение абстракций - А еще duck typing - на самом деле structural typing Так чем Go лучше? 38

Slide 39

Slide 39 text

- Композиция, но не наследование - усложняет наслоение абстракций - А еще duck typing - на самом деле structural typing - compilation time, not run time - реализация удовлетворяет интерфейсу - значит будем использовать Так чем Go лучше? 39

Slide 40

Slide 40 text

Так чем Go лучше? - Композиция, но не наследование - усложняет наслоение абстракций - А еще duck typing - на самом деле structural typing - compilation time, not run time - реализация удовлетворяет интерфейсу - значит будем использовать - Интерфейс определяет потребитель - Be conservative in what you send, - be liberal in what you accept - Postel’s Law / Robustness principle 40

Slide 41

Slide 41 text

Грустная история 41

Slide 42

Slide 42 text

- 2015, делается важный сервис Грустная история 42

Slide 43

Slide 43 text

- 2015, делается важный сервис - Делаем по Java-канонам, с Spring™ - Везде появляются классы фреймворка Грустная история 43

Slide 44

Slide 44 text

- 2015, делается важный сервис - Делаем по Java-канонам, с Spring™ - Везде появляются классы фреймворка - Проходит 4 года и нужно принимать проект - В теории всё круто, все по SOLID - На практике ад и погибель Грустная история 44

Slide 45

Slide 45 text

- 2015, делается важный сервис - Делаем по Java-канонам, с Spring™ - Везде появляются классы фреймворка - Проходит 4 года и нужно принимать проект - В теории всё круто, все по SOLID - На практике ад и погибель - Много прогибов под абстракции Spring - Много вредного ушло в виде клиента Грустная история 45

Slide 46

Slide 46 text

Выводы 46

Slide 47

Slide 47 text

- Modifiability это важно Выводы 47

Slide 48

Slide 48 text

- Modifiability это важно - Абстракции нужны не просто так Выводы 48

Slide 49

Slide 49 text

- Modifiability это важно - Абстракции нужны не просто так - Не измеряется количеством интерфейсов Выводы 49

Slide 50

Slide 50 text

- Modifiability это важно - Абстракции нужны не просто так - Не измеряется количеством интерфейсов - Дело не в языках, а то как их использовать Выводы 50

Slide 51

Slide 51 text

- Modifiability это важно - Абстракции нужны не просто так - Не измеряется количеством интерфейсов - Дело не в языках, а то как их использовать - Абстракции нужно не заимствовать, а создавать Выводы 51

Slide 52

Slide 52 text

Thank you Questions? https://olegk.dev That’s all folks