SlideShare a Scribd company logo
1 of 87
Download to read offline
Инструментируй это
Роман Дворнов
Avito
Минск 2015
Работаю в Avito
Делаю SPA
Автор basis.js
Я…
За любую движуху, 

кроме голодовки ;)
DEMO

поговорим про боль и немного интриги
Инструментирование
кода
«под инструментированием понимают
возможность отслеживания или установления
количественных параметров …, а также
возможность диагностировать ошибки и
записывать информацию для отслеживания
причин их возникновения…»
5
en.wikipedia.org/wiki/Instrumentation_(computer_programming)
• Трассировка
• Отладка
• Регистрация событий
• Подмена кода
• Счетчики производительности
• ...
6
Области применения
Code coverage
Пример №1
Как узнать что исполнялось?
9
function foo(a) {	
if (a > 5) {	
return 1;	
} else {	
return 2;	
}	
}
Оригинальный код
Как узнать что исполнялось?
9
function foo(a) {	
if (a > 5) {	
return 1;	
} else {	
return 2;	
}	
}
function foo(a) {	
__visit(1);	
if (a > 5) {	
__visit(2);	
return 1;	
} else {	
__visit(3);	
return 2;	
}	
}
Оригинальный код Трансформированный код
API (runtime)
10
var __count = [0, 0, 0, ...]; // столько нулей, сколько	
// частей в коде, которые	
// нас интересуют	
!
window.__visit = function(idx) {	
__count[idx - 1]++;	
};	
Упрощенная версия
После выполнения тестов 

в __count будет 

необходимая информация
11
Пример результатов
12
__count = [3, 3, 0]
функция исполнялась 3 раз
ветка if исполнялась 3 раза
ветка else не исполнялась
Покрытие кода
~67%
13
Проецируем данные на исходники
• трансформация оригинального кода
• запуск тестов
• агрегация данных или визуализация
• PROFIT!!!
14
Code coverage: все вместе
• трансформация оригинального кода
• запуск тестов
• агрегация данных или визуализация
• PROFIT!!!
15
это и есть инструментирование

(делается автоматически)
Code coverage: все вместе
Не стоит путать с другими
типами трансформаций,
например, транспиляцией
16
Транспиляция – преобразование
код в равнозначный код,
например, ES6 → ES5
17
en.wikipedia.org/wiki/Source-to-source_compiler
Инструментирование –
дополнение кода другим кодом,
который делает что-то еще
18
Инструментирование = 

код, добавляющий код в код
19
Инструментирование = 

код, добавляющий код в код
19
Loupe
Пример №2
Визуализация того, как работают
некоторые части в JavaScript 

(call stack, event loop, callback queue)
21
latentflip.com/loupe
(там есть видео доклада, рекомендую)
DEMO
22
• Инструментируем код
• отправляем код в Web Worker, где он исполняется
• по мере исполнения, в основной процесс
отправляются сообщения о том, что происходит –
это визуализируется
• немного «магии» ;)
23
Как это работает
React Hot Loader
Пример №3
Модификация React-компонентов

в реальном времени
25
gaearon.github.io/react-hot-loader/
DEMO
26
• Достаточно сложно объяснить в двух словах
• Ключевое:
• исходный код инструментируется
• патчатся классы компонент
• подменяются методы классов при изменении
исходного кода и делается полный re-render
27
Как это работает
Ищем концы
Пример №4
или с чего все начиналось
Начальная идея
29
Имея ссылку на объект уметь
определять местоположение
фрагмента кода его декларации
DEMO
31
!
• Не завязано на фреймворк/библиотеку
• Библиотеки могут расширять возможности и
предоставлять дополнительную информацию
32
Главное – идея
33
За пределами браузера
Браузер dev-server
Редактор
Файл
Команда в терминале
Запрос на
открытие файла
Инструментированный
код + source maps
Части решения
34
• Инструментирование кода
• Runtime API
• Инспекция DOM дерева
• dev-сервер
Инструментирование
36
Код Код
AST
(ESTree)
Парсинг
Трансформации
(Babel)
Трансляция
Esprima
Делаем трансформацию кода правильно
36
Код Код
AST
(ESTree)
Парсинг
Трансформации
(Babel)
Трансляция
Esprima
Делаем трансформацию кода правильно
Просто добавь 

свой плагин
Инструментирование делается
плагином для Babel
37
github.com/restrry/babel-plugin-source-wrapper
Что делает плагин
38
var foo = $devinfo(function(a, b) {	
return a + b;	
}, { … });	
!
var obj = $devinfo({ foo: 1 }, { … });
var foo = function(a, b) {	
return a + b;	
};	
!
var obj = { foo: 1 };
Делается автоматически

и только на этапе разработки
39
Runtime API
41
window.$devinfo = (function() {	
var map = new WeakMap();	
var api = function(ref, data) {	
if (!map.has(ref))	
map.set(ref, data);	
return ref;	
};	
api.get = function(ref) {	
return ref ? map.get(ref) : undefined;	
}	
return api;	
})();
Основное API
Упрощенный код
42
window.$devinfo = (function() {	
var map = new WeakMap();	
var api = function(ref, data) {	
if (!map.has(ref))	
map.set(ref, data);	
return ref;	
};	
api.get = function(ref) {	
return ref ? map.get(ref) : undefined;	
}	
return api;	
})();
Основное API
Упрощенный код
Используем WeakMap для
хранения информации:
- объекты как ключи
- не трансформирует объекты
- не создает утечек памяти
43
window.$devinfo = (function() {	
var map = new WeakMap();	
var api = function(ref, data) {	
if (!map.has(ref))	
map.set(ref, data);	
return ref;	
};	
api.get = function(ref) {	
return ref ? map.get(ref) : undefined;	
}	
return api;	
})();
Основное API
Упрощенный код
Основная функция регистрации,
"добавляет" информацию только
если ее еще нет у объекта
44
window.$devinfo = (function() {	
var map = new WeakMap();	
var api = function(ref, data) {	
if (!map.has(ref))	
map.set(ref, data);	
return ref;	
};	
api.get = function(ref) {	
return ref ? map.get(ref) : undefined;	
}	
return api;	
})();
Основное API
Упрощенный код
Получение информации,
используется инструментами
45
var obj = {};	
!
$devinfo(obj, { data: 123 });	
!
console.log($devinfo.get(obj));	
// > { data: 123 }
Использование
Возможность хранить
информацию, можно
использовать для других задач
46
DEMO
47
github.com/lahmatiy/t8
Инспектирование DOM
• знать границу компонента, т.е. определять 

элемент-контейнер компонента (DOM узел)
• определять владельца компонента (view) 

по элементу-контейнеру (по DOM узлу)
49
Для инструмента нужно
• если у DOM узла есть свойство __view – 

значит это контейнер компонента
• в свойстве __view хранится ссылка на view
50
Решение в лоб
Но лучше использовать

WeakMap (node ➝ view)
Крохотный патч для Backbone
51
!
var _setElement = Backbone.View.prototype._setElement;	
Backbone.View.prototype._setElement = function() {	
_setElement.apply(this, arguments);	
this.el.__view = this;	
};
Или с WeakMap
52
!
var map = new WeakMap();	
var _setElement = Backbone.View.prototype._setElement;	
Backbone.View.prototype._setElement = function() {	
_setElement.apply(this, arguments);	
map.add(this.el, this);	
};	
window.getBackboneViewByNode = function(el) {	
return map.get(el)	
};
Готовые решения
54
Работает из коробки
(нужен basis.js 1.5)
basis.js
component-inspector
55
github.com/lahmatiy/component-inspector
Другие фреймворки
npm install component-inspector --save-dev
React
56
Подключение в html перед React!
<script src="node_modules/component-inspector/dist/react.js">	
</script>	
<script src="react.js"></script>
Backbone
57
Подключение в html после Backbone
<script src="backbone.js"></script>	
<script src="node_modules/component-inspector/dist/backbone.js">	
</script>
Свое решение?
Запросто!
58
59
!
<script src="node_modules/component-inspector/dist/base.js"></script>	
Инициализация
<script>	
initComponentInspector({	
// просто добавь API	
});	
</script>
60
Описываем API
initComponentInspector({	
isComponentRootNode: function(node) {	
return Boolean(node && node.__view);	
},	
getInstanceByNode: function(node) {	
if (node) {	
return node.__view;	
}	
},	
…	
});
Можно определить многое
61
• isComponentRootNode(node)
• getComponentNameByNode(node)
• getInstanceByNode(node)
• getInstanceRootNode(instance)
• getInstanceClass(instance)
• getInstanceLocation(instance)
• ...
github.com/lahmatiy/component-inspector#api-free-build
dev-сервер
• отдавать инструментированный код
• исполнять команды, например, открытие
файла в редакторе
63
dev-сервер должен
64
Вариант настройки: webpack
Инструментирование
webpack
+ babel + babel-plugin-source-wrapper
!
Открытие файла в редакторе
express или webpack-dev-server
+ express-open-in-editor
65
Пример конфигурации
для Webpack + React
tinyurl.com/pwj6bln
Вариант настройки: basisjs-tools
66
> npm install basisjs-tools -g	
> npm install basisjs-tools-instrumenter	
// создать конфиг basis.config	
> basis server
{	
"plugins": [	
"basisjs-tools-instrumenter"	
]

}
Сервер будет отдавать
инструментированный код и
встраивать необходимое в html
• open-in-editor

npm пакет для программного открытия файла в редакторе

github.com/lahmatiy/open-in-editor
• express-open-in-editor

расширение для Express для открытия файла по урлу

github.com/lahmatiy/express-open-in-editor
• extract-code-fragment

получение раскрашенного фрагмента кода из файла

скоро
67
Побочные продукты
Проблемки
69
Проблема №1

«Захламляется» код
70
Решение: Source maps
71
Проблема №2

Runtime API мешает отладке
72
Решение: Blackbox Script
73
Проблема №2

Показывается не то место
74
function createObj() {	
return $devinfo({	
example: true	
}, {	
loc: "lib.js:…"	
});	
}
var obj = $devinfo(createObj(), {	
loc: "app.js:…"	
});
lib.jsapp.js
Нам нужно это место Но покажется это
75
require('babel-plugin-source-wrapper')({	
blackbox: [	
"/path/to/lib.js"	
]	
})
blackbox: [	
"/bower_components/**",	
"/node_modules/**"	
]
По умолчанию:
Решение: blackbox в инструментере
76
function createObj() {	
return $devinfo({	
example: true	
}, {	
loc: "lib.js:…",	
blackbox: true	
});	
}
var obj = $devinfo(createObj(), {	
loc: "app.js:…"	
});
lib.jsapp.js
Решение: blackbox в инструментере
Теперь будет показываться
это место
У такой информации меньший
приоритет
77
Проблема №4

«Зашумляется» стек вызова
78
ХотимВидим
79
Решение: магия :)
$devinfo(function()  {  
    …  
},  {  …  })
($devinfo)(function()  {  
    …  
},  {  …  })
Заключение
Инструментирование – метод,
расширяющий возможности
разработки
81
Местами это сложно, 

но безумно интересно!
82
Попробуйте!
Интересно, что получится у вас ;)
83
Вопросы?
84
Роман Дворнов
@rdvornov
rdvornov@gmail.com
github.com/lahmatiy
tinyurl.com/wsd-ci
Component Inspector

More Related Content

What's hot

Basis.js – «под капотом»
Basis.js – «под капотом»Basis.js – «под капотом»
Basis.js – «под капотом»Roman Dvornov
 
Жизнь в изоляции
Жизнь в изоляцииЖизнь в изоляции
Жизнь в изоляцииRoman Dvornov
 
DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"Roman Dvornov
 
Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоRoman Dvornov
 
Тестируй это / Виктор Русакович (GP Solutions)
Тестируй это / Виктор Русакович (GP Solutions)Тестируй это / Виктор Русакович (GP Solutions)
Тестируй это / Виктор Русакович (GP Solutions)Ontico
 
Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneАвтоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneCodeFest
 
Парсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricksПарсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricksRoman Dvornov
 
Особенности разработки API / Всеволод Шмыров (Яндекс)
Особенности разработки API / Всеволод Шмыров (Яндекс)Особенности разработки API / Всеволод Шмыров (Яндекс)
Особенности разработки API / Всеволод Шмыров (Яндекс)Ontico
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDKrivoy Rog IT Community
 
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ontico
 
Alexander manuhin selenium_php_v2.0
Alexander manuhin selenium_php_v2.0Alexander manuhin selenium_php_v2.0
Alexander manuhin selenium_php_v2.0matroskin1980
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.Igor Shkulipa
 
Unit-тестирование скриншотами: преодолеваем звуковой барьер
Unit-тестирование скриншотами: преодолеваем звуковой барьерUnit-тестирование скриншотами: преодолеваем звуковой барьер
Unit-тестирование скриншотами: преодолеваем звуковой барьерRoman Dvornov
 
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013Moscow.pm
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Ontico
 
Грязная автоматизация
Грязная автоматизацияГрязная автоматизация
Грязная автоматизацияSQALab
 
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)Ontico
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETDev2Dev
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаYandex
 

What's hot (20)

Basis.js – «под капотом»
Basis.js – «под капотом»Basis.js – «под капотом»
Basis.js – «под капотом»
 
Жизнь в изоляции
Жизнь в изоляцииЖизнь в изоляции
Жизнь в изоляции
 
Kranonit s16 (python). dmitry furzenko
Kranonit s16 (python). dmitry furzenkoKranonit s16 (python). dmitry furzenko
Kranonit s16 (python). dmitry furzenko
 
DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"
 
Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их много
 
Тестируй это / Виктор Русакович (GP Solutions)
Тестируй это / Виктор Русакович (GP Solutions)Тестируй это / Виктор Русакович (GP Solutions)
Тестируй это / Виктор Русакович (GP Solutions)
 
Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneАвтоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows Phone
 
Парсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricksПарсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricks
 
Особенности разработки API / Всеволод Шмыров (Яндекс)
Особенности разработки API / Всеволод Шмыров (Яндекс)Особенности разработки API / Всеволод Шмыров (Яндекс)
Особенности разработки API / Всеволод Шмыров (Яндекс)
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
 
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
 
Alexander manuhin selenium_php_v2.0
Alexander manuhin selenium_php_v2.0Alexander manuhin selenium_php_v2.0
Alexander manuhin selenium_php_v2.0
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.
 
Unit-тестирование скриншотами: преодолеваем звуковой барьер
Unit-тестирование скриншотами: преодолеваем звуковой барьерUnit-тестирование скриншотами: преодолеваем звуковой барьер
Unit-тестирование скриншотами: преодолеваем звуковой барьер
 
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
 
Грязная автоматизация
Грязная автоматизацияГрязная автоматизация
Грязная автоматизация
 
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кода
 

Viewers also liked

SphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricksSphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricksRoman Pavlushko
 
BabelJS - James Kyle at Modern Web UI
BabelJS - James Kyle at Modern Web UIBabelJS - James Kyle at Modern Web UI
BabelJS - James Kyle at Modern Web UImodernweb
 
Intro to Open Babel
Intro to Open BabelIntro to Open Babel
Intro to Open Babelbaoilleach
 
Ускоряем исследования с помощью конкурсов как их готовить и выигрывать / Иван...
Ускоряем исследования с помощью конкурсов как их готовить и выигрывать / Иван...Ускоряем исследования с помощью конкурсов как их готовить и выигрывать / Иван...
Ускоряем исследования с помощью конкурсов как их готовить и выигрывать / Иван...Ontico
 
Avito iab1502 olga ky
Avito iab1502 olga kyAvito iab1502 olga ky
Avito iab1502 olga kyIABRu
 
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013Roman Pavlushko
 
Agile — это не то, что ты думаешь
Agile — это не то, что ты думаешьAgile — это не то, что ты думаешь
Agile — это не то, что ты думаешьVasiliy Cheptsov
 
Современный фронтенд -- как не утонуть в море хайпа?
Современный фронтенд -- как не утонуть в море хайпа?Современный фронтенд -- как не утонуть в море хайпа?
Современный фронтенд -- как не утонуть в море хайпа?Vladimir Malyk
 
Современный фронтенд за 30 минут.
Современный фронтенд за 30 минут.Современный фронтенд за 30 минут.
Современный фронтенд за 30 минут.Vladimir Malyk
 
Avito usage of_data_in_media_campaigns_olga_ky
Avito usage of_data_in_media_campaigns_olga_kyAvito usage of_data_in_media_campaigns_olga_ky
Avito usage of_data_in_media_campaigns_olga_kyiabrussiaprez
 
Agile по Суворову
Agile по СуворовуAgile по Суворову
Agile по СуворовуVasiliy Cheptsov
 
Чем полезен PMBOK для Agile-менеджера
Чем полезен PMBOK для Agile-менеджераЧем полезен PMBOK для Agile-менеджера
Чем полезен PMBOK для Agile-менеджераVasiliy Cheptsov
 
Максим Савельев, 2ГИС: "Точки контакта с аудиторией. Секреты рекламы, которые...
Максим Савельев, 2ГИС: "Точки контакта с аудиторией. Секреты рекламы, которые...Максим Савельев, 2ГИС: "Точки контакта с аудиторией. Секреты рекламы, которые...
Максим Савельев, 2ГИС: "Точки контакта с аудиторией. Секреты рекламы, которые...web2win
 
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...Ryan Weaver
 

Viewers also liked (17)

SphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricksSphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricks
 
BabelJS - James Kyle at Modern Web UI
BabelJS - James Kyle at Modern Web UIBabelJS - James Kyle at Modern Web UI
BabelJS - James Kyle at Modern Web UI
 
Intro to Open Babel
Intro to Open BabelIntro to Open Babel
Intro to Open Babel
 
Clearing hurdles
Clearing hurdlesClearing hurdles
Clearing hurdles
 
Experiment Prototyping
Experiment PrototypingExperiment Prototyping
Experiment Prototyping
 
Ускоряем исследования с помощью конкурсов как их готовить и выигрывать / Иван...
Ускоряем исследования с помощью конкурсов как их готовить и выигрывать / Иван...Ускоряем исследования с помощью конкурсов как их готовить и выигрывать / Иван...
Ускоряем исследования с помощью конкурсов как их готовить и выигрывать / Иван...
 
Bezier curves
Bezier curvesBezier curves
Bezier curves
 
Avito iab1502 olga ky
Avito iab1502 olga kyAvito iab1502 olga ky
Avito iab1502 olga ky
 
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
 
Agile — это не то, что ты думаешь
Agile — это не то, что ты думаешьAgile — это не то, что ты думаешь
Agile — это не то, что ты думаешь
 
Современный фронтенд -- как не утонуть в море хайпа?
Современный фронтенд -- как не утонуть в море хайпа?Современный фронтенд -- как не утонуть в море хайпа?
Современный фронтенд -- как не утонуть в море хайпа?
 
Современный фронтенд за 30 минут.
Современный фронтенд за 30 минут.Современный фронтенд за 30 минут.
Современный фронтенд за 30 минут.
 
Avito usage of_data_in_media_campaigns_olga_ky
Avito usage of_data_in_media_campaigns_olga_kyAvito usage of_data_in_media_campaigns_olga_ky
Avito usage of_data_in_media_campaigns_olga_ky
 
Agile по Суворову
Agile по СуворовуAgile по Суворову
Agile по Суворову
 
Чем полезен PMBOK для Agile-менеджера
Чем полезен PMBOK для Agile-менеджераЧем полезен PMBOK для Agile-менеджера
Чем полезен PMBOK для Agile-менеджера
 
Максим Савельев, 2ГИС: "Точки контакта с аудиторией. Секреты рекламы, которые...
Максим Савельев, 2ГИС: "Точки контакта с аудиторией. Секреты рекламы, которые...Максим Савельев, 2ГИС: "Точки контакта с аудиторией. Секреты рекламы, которые...
Максим Савельев, 2ГИС: "Точки контакта с аудиторией. Секреты рекламы, которые...
 
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
 

Similar to Инструментируй это

Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCDevDay
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demomegakott
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5Technopark
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Yandex
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиAndrey Karpov
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияRuslan Shevchenko
 
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#Andrey Karpov
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Oleksii Okhrymenko
 
Как выглядит современный фронтенд
Как выглядит современный фронтендКак выглядит современный фронтенд
Как выглядит современный фронтендTimophy Chaptykov
 
Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Ontico
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentAnton Kirillov
 

Similar to Инструментируй это (20)

Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Aspect Oriented Approach
Aspect Oriented ApproachAspect Oriented Approach
Aspect Oriented Approach
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщики
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Спецификация WSGI (PEP-333)
Спецификация WSGI (PEP-333)Спецификация WSGI (PEP-333)
Спецификация WSGI (PEP-333)
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
 
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2
 
Как выглядит современный фронтенд
Как выглядит современный фронтендКак выглядит современный фронтенд
Как выглядит современный фронтенд
 
Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
 

More from Roman Dvornov

Масштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаRoman Dvornov
 
CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машинRoman Dvornov
 
My Open Source (Sept 2017)
My Open Source (Sept 2017)My Open Source (Sept 2017)
My Open Source (Sept 2017)Roman Dvornov
 
Rempl – крутая платформа для крутых инструментов
Rempl – крутая платформа для крутых инструментовRempl – крутая платформа для крутых инструментов
Rempl – крутая платформа для крутых инструментовRoman Dvornov
 
Remote (dev)tools своими руками
Remote (dev)tools своими рукамиRemote (dev)tools своими руками
Remote (dev)tools своими рукамиRoman Dvornov
 
CSS parsing: performance tips & tricks
CSS parsing: performance tips & tricksCSS parsing: performance tips & tricks
CSS parsing: performance tips & tricksRoman Dvornov
 
CSSO – история ускорения
CSSO – история ускоренияCSSO – история ускорения
CSSO – история ускоренияRoman Dvornov
 
CSSO – compress CSS (english version)
CSSO – compress CSS (english version)CSSO – compress CSS (english version)
CSSO – compress CSS (english version)Roman Dvornov
 
CSSO — сжимаем CSS (часть 2)
CSSO — сжимаем CSS (часть 2)CSSO — сжимаем CSS (часть 2)
CSSO — сжимаем CSS (часть 2)Roman Dvornov
 
CSSO — минимизируем CSS
 CSSO — минимизируем CSS CSSO — минимизируем CSS
CSSO — минимизируем CSSRoman Dvornov
 
Инструменты разные нужны, инструменты разные важны
Инструменты разные нужны, инструменты разные важныИнструменты разные нужны, инструменты разные важны
Инструменты разные нужны, инструменты разные важныRoman Dvornov
 
Карточный домик
Карточный домикКарточный домик
Карточный домикRoman Dvornov
 
Как построить DOM
Как построить DOMКак построить DOM
Как построить DOMRoman Dvornov
 
Компонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноКомпонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноRoman Dvornov
 
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)Roman Dvornov
 
basis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкbasis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкRoman Dvornov
 

More from Roman Dvornov (17)

Масштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтенда
 
CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машин
 
My Open Source (Sept 2017)
My Open Source (Sept 2017)My Open Source (Sept 2017)
My Open Source (Sept 2017)
 
Rempl – крутая платформа для крутых инструментов
Rempl – крутая платформа для крутых инструментовRempl – крутая платформа для крутых инструментов
Rempl – крутая платформа для крутых инструментов
 
Remote (dev)tools своими руками
Remote (dev)tools своими рукамиRemote (dev)tools своими руками
Remote (dev)tools своими руками
 
CSS parsing: performance tips & tricks
CSS parsing: performance tips & tricksCSS parsing: performance tips & tricks
CSS parsing: performance tips & tricks
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
 
CSSO – история ускорения
CSSO – история ускоренияCSSO – история ускорения
CSSO – история ускорения
 
CSSO – compress CSS (english version)
CSSO – compress CSS (english version)CSSO – compress CSS (english version)
CSSO – compress CSS (english version)
 
CSSO — сжимаем CSS (часть 2)
CSSO — сжимаем CSS (часть 2)CSSO — сжимаем CSS (часть 2)
CSSO — сжимаем CSS (часть 2)
 
CSSO — минимизируем CSS
 CSSO — минимизируем CSS CSSO — минимизируем CSS
CSSO — минимизируем CSS
 
Инструменты разные нужны, инструменты разные важны
Инструменты разные нужны, инструменты разные важныИнструменты разные нужны, инструменты разные важны
Инструменты разные нужны, инструменты разные важны
 
Карточный домик
Карточный домикКарточный домик
Карточный домик
 
Как построить DOM
Как построить DOMКак построить DOM
Как построить DOM
 
Компонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноКомпонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективно
 
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
 
basis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкbasis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворк
 

Инструментируй это