МРТ для данных / Анастасия Горячева (avito)

93
МРТ для данных Как увидеть внутренние процессы и состояния веб-приложения Анастасия Горячева, Avito

Upload: ontico

Post on 10-Feb-2017

181 views

Category:

Engineering


2 download

TRANSCRIPT

Page 1: МРТ для данных / Анастасия Горячева (Avito)

МРТ для данныхКак увидеть внутренние процессы

       и состояния веб-приложения

Анастасия Горячева, Avito

Page 2: МРТ для данных / Анастасия Горячева (Avito)

Настя Горячева

Работаю в Avito

Делаю SPA

Пишу на basis.js

Почта [email protected]

twitter @tyanasgo

1

Page 3: МРТ для данных / Анастасия Горячева (Avito)

Инструменты для профи – SPA на basis.js2

Page 4: МРТ для данных / Анастасия Горячева (Avito)

3

Page 5: МРТ для данных / Анастасия Горячева (Avito)

4

Page 6: МРТ для данных / Анастасия Горячева (Avito)

5

Page 7: МРТ для данных / Анастасия Горячева (Avito)

6

Page 8: МРТ для данных / Анастасия Горячева (Avito)

Потоки данных Как они устроены?7

Page 9: МРТ для данных / Анастасия Горячева (Avito)

Мировыепрактики

Page 10: МРТ для данных / Анастасия Горячева (Avito)

Devtoolsв браузере

9

Page 11: МРТ для данных / Анастасия Горячева (Avito)

console.log  

10

Page 12: МРТ для данных / Анастасия Горячева (Avito)

console.log??

11

Page 13: МРТ для данных / Анастасия Горячева (Avito)

twitter.com/JavaScriptDaily/status/718471086246072320

12

Page 14: МРТ для данных / Анастасия Горячева (Avito)

css.yoksel.ru/funny-little-console

13

Page 15: МРТ для данных / Анастасия Горячева (Avito)

14

Page 16: МРТ для данных / Анастасия Горячева (Avito)

Мировыеэксперименты

Page 17: МРТ для данных / Анастасия Горячева (Avito)

rxvision для RxJS

16

Page 18: МРТ для данных / Анастасия Горячева (Avito)

17

Page 19: МРТ для данных / Анастасия Горячева (Avito)

xstream-runдля cycle.js

18

Page 20: МРТ для данных / Анастасия Горячева (Avito)

twitter.com/andrestaltz/status/729742864561917953

19

Page 21: МРТ для данных / Анастасия Горячева (Avito)

streams... channels...

callback chains...

20

Page 22: МРТ для данных / Анастасия Горячева (Avito)

Как "чиним"человека?

Page 23: МРТ для данных / Анастасия Горячева (Avito)

Сначала диагностика

• Гастроскоп :?

• Рентген

• Компьютерная томография: 3D-рентген

• МРТ – Магнитно-резонансный томограф

• ...

22

Page 24: МРТ для данных / Анастасия Горячева (Avito)

Как работает МРТ?

Водород в тканях

+ Магнитное поле

=> Фиксируем их взаимодействие

23

Page 25: МРТ для данных / Анастасия Горячева (Avito)

Как диагностироватьсостояние

приложения?

24

Page 26: МРТ для данных / Анастасия Горячева (Avito)

Чиним шаблоны

Page 27: МРТ для данных / Анастасия Горячева (Avito)

Диагностика шаблонов

Видео

26

Page 29: МРТ для данных / Анастасия Горячева (Avito)

0:50

28

Page 30: МРТ для данных / Анастасия Горячева (Avito)

Подробнее про инспектор шаблонов

Доклад Романа Дворнова (февраль 2015)

Слайды slideshare.net/basisjs/spa-45289195Видео youtu.be/IUtbbN9aevU

Адаптация для backbone, react, "white label"github.com/lahmatiy/component-inspector

29

Page 31: МРТ для данных / Анастасия Горячева (Avito)

component-inspector для React

Отзывы: Константин Кривленя доклад на FrontendDevConf, Минск, апрель 2016

30

Page 32: МРТ для данных / Анастасия Горячева (Avito)

Словари l10n

31

Page 33: МРТ для данных / Анастасия Горячева (Avito)

Локализация, строки в интерфейсе32

Page 34: МРТ для данных / Анастасия Горячева (Avito)

Demo

33

Page 35: МРТ для данных / Анастасия Горячева (Avito)

34

Page 36: МРТ для данных / Анастасия Горячева (Avito)

l10n-МРТ никуда без ast-парсера для json

npmjs.com/package/json-to-ast

35

Page 37: МРТ для данных / Анастасия Горячева (Avito)

Вернемся к примеру с кнопкой36

Page 38: МРТ для данных / Анастасия Горячева (Avito)

Заглянем ненадолго

под капот

37

Page 39: МРТ для данных / Анастасия Горячева (Avito)

Dataset

Value

disabled

Состояние кнопкиvar feeds = new ( ... ); // ~observableArray

var hasMoney = .from(profile, 'data.hasMoney');

var = new Expression( // computed

count(feeds.selection),

hasMoney, // observable

function(feedsCount, hasMoney) {

return feedsCount && hasMoney;

}

);

38

Page 40: МРТ для данных / Анастасия Горячева (Avito)

Value – скаляр

Object – модель

Dataset – набор моделей (коллекция)

39

Page 41: МРТ для данных / Анастасия Горячева (Avito)

Value, Object, Dataset

• Состояния

• Подписка на изменения

• Синхронизация с подписчиками

Разные модели хранения данных

40

Page 42: МРТ для данных / Анастасия Горячева (Avito)

Трансформациязначений

41

Page 43: МРТ для данных / Анастасия Горячева (Avito)

square

square

Value → Value (RP)

var number = new Value({ value: 5 });

var = number.as(function(n) {

return n * n;

});

.value

// 25

42

Page 44: МРТ для данных / Анастасия Горячева (Avito)

sumTwo

sumTwo

Value&Value → Value (RP)

var a = new Value({ value: 4 });

var b = new Value({ value: 6 });

var = new Expression(a, b, function(a, b) {

return a + b;

});

.value

// 10

43

Page 45: МРТ для данных / Анастасия Горячева (Avito)

Трансформациянаборов

44

Page 46: МРТ для данных / Анастасия Горячева (Avito)

oddA

oddA

Dataset → Dataset (RP)

var A = new Dataset({ items: [1, 2, 3, 4] });

var = new Filter({ // нечетные

source: A,

rule: basis.getter('data.value % 2')

});

.getValues() // [1, 3]

45

Page 47: МРТ для данных / Анастасия Горячева (Avito)

46

Page 48: МРТ для данных / Анастасия Горячева (Avito)

common

common

Dataset&Dataset → Dataset (RP)

var A = new Dataset({ items: [1, 2, 3, 4] });

var B = new Dataset({ items: [2, 4, 8] });

var = new Merge({

sources: [A, B],

rule: Merge.INTERSECTION

});

.getValues() // [2, 4]

47

Page 49: МРТ для данных / Анастасия Горячева (Avito)

48

Page 50: МРТ для данных / Анастасия Горячева (Avito)

Значениепо набору

49

Page 51: МРТ для данных / Анастасия Горячева (Avito)

sumA

sumA

Dataset → Value (RP)

var A = new Dataset({

items: [1, 2, 4]

});

var = sum(A, function(item) {

return item.data.value;

});

.value // 7

50

Page 52: МРТ для данных / Анастасия Горячева (Avito)

51

Page 53: МРТ для данных / Анастасия Горячева (Avito)

Все виды трансформаций52

Page 54: МРТ для данных / Анастасия Горячева (Avito)

Та же кнопка53

Page 55: МРТ для данных / Анастасия Горячева (Avito)

Та же кнопка54

Page 56: МРТ для данных / Анастасия Горячева (Avito)

new

disabled new

function

return

Код кнопки Button({

caption: 'Опубликовать',

: Expression(

count(classifieds.selection),

count(feeds.selection),

(countClassifieds, countFeeds) {

!(countClassifieds || countFeeds);

}

)

});

55

Page 57: МРТ для данных / Анастасия Горячева (Avito)

Как получить цельноепредставление?

56

Page 58: МРТ для данных / Анастасия Горячева (Avito)

Инспекторданных

Page 59: МРТ для данных / Анастасия Горячева (Avito)

0:33

58

Page 60: МРТ для данных / Анастасия Горячева (Avito)

Demo data flow

59

Page 61: МРТ для данных / Анастасия Горячева (Avito)

В чём же магия?60

Page 62: МРТ для данных / Анастасия Горячева (Avito)

Формируем мета-информацию

(devinfo)

61

Page 63: МРТ для данных / Анастасия Горячева (Avito)

1. Локация (инструментирование)

github.com/restrry/babel-plugin-source-wrapper

62

Page 64: МРТ для данных / Анастасия Горячева (Avito)

Подробнее про инструментирование

Доклад Романа Дворнова

Слайды slideshare.net/basisjs/ss-52963081

Видео youtu.be/watch?v=UPtDcAbg6EI&t=2h41m12s

ноябрь 2015, WSD в Минске

63

Page 65: МРТ для данных / Анастасия Горячева (Avito)

2. Детали трансформации данных64

Page 66: МРТ для данных / Анастасия Горячева (Avito)

devInfo

'path/to/file.js:2:8:5:3'

1. + 2. = то, что нужно (devinfo)Исходный объект остается без изменений (WeakMap: объект → мета-данные)

.get(value) →

{

loc: , // Итог инструментирования.

// Описание трансформации.

source: ..., // Добавляется

transform: ... // в библиотеке.

}

65

Page 67: МРТ для данных / Анастасия Горячева (Avito)

Распаковываемdevinfo

66

Page 68: МРТ для данных / Анастасия Горячева (Avito)

Мета-данные – в дерево (JSON)67

Page 69: МРТ для данных / Анастасия Горячева (Avito)

Дерево (JSON) – в картинку68

Page 70: МРТ для данных / Анастасия Горячева (Avito)

Победа!

69

Page 71: МРТ для данных / Анастасия Горячева (Avito)

Победа?

70

Page 72: МРТ для данных / Анастасия Горячева (Avito)

Сложности

71

Page 73: МРТ для данных / Анастасия Горячева (Avito)

Фабрики

Паттерн фабрика: производим функции, создающие значения

Проблемы:

№1 Локация конструктора

           vs. локация результата

№2 Кэш значений портит локации

72

Page 74: МРТ для данных / Анастасия Горячева (Avito)

value

value :(

№1. Локацииvar = createFactory( ... ); // app.js

...

function createFactory( ... ){ // lib.js

return function factory( ... ) {

return { ... };

}

}

devInfo.get( ).loc // 'lib.js:2:12:4:5'

01.

02.

03.

04.

05.

73

Page 75: МРТ для данных / Анастасия Горячева (Avito)

factory

factory

factory

value :D

№1. Решение – подмена локацииfunction createFactory( ... ){ // lib.js

return function ( ... ) {

var x = { ... };

setInfo(x, 'loc', getInfo( ).loc); // dev only

return x;

}

}

devInfo.get( ).loc // 'lib.js:1:1:7:1' (blackboxed)

devInfo.get( ).loc // 'app.js:1:21:1:41'

01.

02.

03.

04.

05.

06.

07.

74

Page 76: МРТ для данных / Анастасия Горячева (Avito)

A

B

A B

A B

:(

№2. Кэшvar = createFactory(address, 'data.city'); // profile.js

var = createFactory(address, 'data.city'); // action.js

===

devInfo.get().loc == devInfo.get().loc

== devInfo.get(cachedAorB).loc

'action.js' ? 'profile.js'

75

Page 77: МРТ для данных / Анастасия Горячева (Avito)

res

res

res

res

res :(

function cacheFactory(x) {

var ;

if (x in cache) { // где-то выше var cache = {...}

= cache[x];

} else {

= cache[x] = {...}

}

return ;

}

devInfo.get( ).loc // 'action.js' ? 'profile.js'

01.

02.

03.

04.

05.

06.

07.

08.

09.

76

Page 78: МРТ для данных / Анастасия Горячева (Avito)

:D

:D

№2. Решение – PROXYfunction cacheFactory(...) {

...

return new Proxy(res, {}):

}

A !== B

devInfo.get(A).loc // profile.js

devInfo.get(B).loc // action.js

77

Page 79: МРТ для данных / Анастасия Горячева (Avito)

proxyToOriginal

proxyToOriginal

Как теперь сравнивать?var = new WeakMap();

function compare(x, y) {

return resolveOriginal(x) === resolveOriginal(y);

}

function resolveOriginal(x) {

return .get(x);

}

78

Page 80: МРТ для данных / Анастасия Горячева (Avito)

• Значения по-прежнему считаются идентичными

• ...кроме момента, когда хотим узнать локацию создания

Добавляется только в dev-режиме

79

Page 81: МРТ для данных / Анастасия Горячева (Avito)

Итоги

Page 82: МРТ для данных / Анастасия Горячева (Avito)

Есть ли жизнь без basis.js?81

Page 83: МРТ для данных / Анастасия Горячева (Avito)

Адаптация дляknockout.js

82

Page 84: МРТ для данных / Анастасия Горячева (Avito)

83

Page 85: МРТ для данных / Анастасия Горячева (Avito)

Главное – идея

Специфика для %ваш фреймворк%

там, где происходят

трансформации данных

84

Page 86: МРТ для данных / Анастасия Горячева (Avito)

Точки трансформации данных85

Page 87: МРТ для данных / Анастасия Горячева (Avito)

Точки трансформации данных86

Page 88: МРТ для данных / Анастасия Горячева (Avito)

Точки трансформации данных87

Page 89: МРТ для данных / Анастасия Горячева (Avito)

Точки трансформации данных88

Page 90: МРТ для данных / Анастасия Горячева (Avito)

Точки трансформаций для RxJSRxMarbles.com

89

Page 91: МРТ для данных / Анастасия Горячева (Avito)

Ключи к успеху

1. Инструментирование

2. Описание трансформаций

3. Сборка мета-данных в дерево

4. Визуализация дерева

90

Page 92: МРТ для данных / Анастасия Горячева (Avito)

Сложно, но можно91

Page 93: МРТ для данных / Анастасия Горячева (Avito)

ВопросыНастя Горячева

[email protected]

твиттер @tyanasgo

92