SlideShare a Scribd company logo
Гибридное приложение
Яндекс.Авиабилетов
Полгода после релиза
avia.yandex.ru
3
avia.yandex.ru
4
iOS Android
5
iOS Android
Разработчики
Mobile Web
50 %50 %
6
iOS Android
Архитектура сервиса
7
Ticket Daemon
Web Backend Mobile APISERP
Desktop Mobile iOS Android
Partner
› Дублирование кода
› … а значит, и багов
› Низкий bus-factor
› Различия в реализации
› Неравномерное развитие
Проблемы
8
Скорость и стоимость
увеличить уменьшить
React Native
› Нативный интерфейс, логика на React
Cordova
› Нативная оболочка, приложение на HTML + CSS + JavaScript
Гибрид
› Замена части экранов на web-view
Пути решения
10
Архитектура сервиса
11
Ticket Daemon
Web Backend Mobile APISERP
Desktop Mobile iOS Android
Partner
Архитектура сервиса
12
Ticket Daemon
Web BackendSERP
Desktop Mobile iOS Android
Partner
Web Backend
› вёрстка для гибридного приложения
› общение приложения с веб-сайтом
› обратная совместимость
Адаптация веб-сайта под приложение
14
Создание запроса
15
var url = URLComponents(string: "https:!//avia.yandex.ru/")!
url.queryItems = [
URLQueryItem(name: "fromName", "Екатеринбург"),
URLQueryItem(name: "toName", value: "Симферополь"),
URLQueryItem(name: "when", value: "2017-05-01"),
]
let request = URLRequest(url: url.url) !// malkovich malkovich
let webView = WKWebView()
webView.load(request)
Небольшие отличия
16
Идентификатор платформы передаётся

в кастомном HTTP-заголовке
Handshake
17
var request = URLRequest(url: requestURL)
request.addValue("ios", forHTTPHeaderField: "X-Platform")
webView.load(request)
18
const platforms = {
ios: 'ios',
android: 'android',
wp: 'wp',
}
module.exports = (req, res, next) !-> {
const name = req.headers['x-platform']
const platform = platforms[name] !|| 'web'
res.cookie('platform', platform)
next()
}
Условия в шаблонах
19
bt.match('search-form', ctx !-> {
ctx.setContent([
!platform.isWeb() !&&
{ elem: 'action-back' },
{ elem: 'info' },
platform.isWeb() ?
{ elem: 'action-setting' } :
{ elem: 'action-share' }
])
})
Обработка событий
20
› Приложение принимает решение на основе URL
› Не требует изменений в коде веб-сайта
› Добавляет неявную связь между сайтом и приложением
Перехват события навигации
21
Приложение принимает решение на основе URL
Перехват события навигации
22
<a class="y-button"
href="/search/?fromName=Москва&when=2017-04-18">
Купить
!</a>
Приложение принимает решение на основе URL
Перехват события навигации
23
<a class="y-button"
href="/search/?fromName=Москва&when=2017-04-18">
Купить
!</a>
В приложении описываются методы, которые может
использовать JavaScript веб-сайта
Декларация интерфейса
24
this._liveBind(‘click', (event, data) !-> {
coordinator.doAction('showPartnerRedirect', {
offer: data.offer,
redirectUrl: data.redirectUrl,
})
})
В приложении описываются методы, которые может
использовать JavaScript веб-сайта
Декларация интерфейса
25
this._liveBind(‘click', (event, data) !-> {
coordinator.doAction('showPartnerRedirect', {
offer: data.offer,
redirectUrl: data.redirectUrl,
})
})
26
class Coordinator {
doAction(name, payload) {
switch (platform) {
case 'ios':
return iosInterface.handle(name, payload)
case 'android':
return androidInterface[name](payload)
default:
return this.propagateEvent(name, payload)
}
}
})
27
class Coordinator {
doAction(name, payload) {
switch (platform) {
case 'ios':
return iosInterface.handle(name, payload)
case 'android':
return androidInterface[name](payload)
default:
return this.propagateEvent(name, payload)
}
}
})
Добавление функции
28
Сервер принимает решение:

отдать вёрстку либо ответить ошибкой.
Версионирование
29
var request = URLRequest(url: requestURL)
request.addValue("ios",
forHTTPHeaderField: «X-Platform")
request.addValue("1.14",
forHTTPHeaderField: "X-Version")
iOS
› выбор компонента WebView (WKWebView, UIWebView)
› обработка событий (WKScriptMessageHandler,
WKNavigationDelegate, WKUIDelegate)
› Apple Transport Security
Гибридизация iOS-приложения
31
WKWebView
› Apple рекомендует
› Новый JS-движок Nitro
WKWebView
33
› Apple рекомендует
› Новый JS-движок Nitro
› Не работает с Interface Builder
› Работает в отдельном процессе
› Выпущен недоделанным
WKWebView
34
Обработка событий
Перехват события навигации
36
extension SearchViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: @escaping (WKNavigationActionPolicy) !-> Void) {
if isAviaDomain(navigationAction.request.url!) {
decisionHandler(.allow)
} else {
decisionHandler(.cancel)
openURLInBrowser(navigationAction.request.url!)
}}}}
Перехват события навигации
37
extension SearchViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: @escaping (WKNavigationActionPolicy) !-> Void) {
if isAviaDomain(navigationAction.request.url!) {
decisionHandler(.allow)
} else {
decisionHandler(.cancel)
openURLInBrowser(navigationAction.request.url!)
}}}}
target="_blank"
38
extension SearchViewController: WKUIDelegate {
func webView(_ webView: WKWebView,
createWebViewWith configuration: WKWebViewConfiguration,
for navigationAction: WKNavigationAction,
windowFeatures: WKWindowFeatures) !-> WKWebView? {
if navigationAction.targetFrame !== nil {
webView.load(navigationAction.request)
}
return nil
}
}
target="_blank"
39
extension SearchViewController: WKUIDelegate {
func webView(_ webView: WKWebView,
createWebViewWith configuration: WKWebViewConfiguration,
for navigationAction: WKNavigationAction,
windowFeatures: WKWindowFeatures) !-> WKWebView? {
if navigationAction.targetFrame !== nil {
webView.load(navigationAction.request)
}
return nil
}
}
Декларация интерфейса
40
final class ScriptMessageHandler: WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController,
didReceive message: WKScriptMessage) {
if let payload = message.body as? ["String": Any] {
delegate!?.recieveMessage(withPayload: payload)
}
}
}
Декларация интерфейса
41
final class ScriptMessageHandler: WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController,
didReceive message: WKScriptMessage) {
if let payload = message.body as? ["String": Any] {
delegate!?.recieveMessage(withPayload: payload)
}
}
}
42
!// iOS
let scriptMessageHandler = ScriptMessageHandler()
let userContentController = WKUserContentController()
userContentController.add(scriptMessageHandler, name: "notification")
let configuration = WKWebViewConfiguration()
configuration.userContentController = userContentController
let webView = WKWebView(configuration: configuration)
!// Browser (JavaScript)
class iosDelegate {
handle(name, payload) {
const sender = window.webkit.messageHandlers["notification"]
sender.postMessage({ name, payload })
}
}
43
!// iOS
let scriptMessageHandler = ScriptMessageHandler()
let userContentController = WKUserContentController()
userContentController.add(scriptMessageHandler, name: "notification")
let configuration = WKWebViewConfiguration()
configuration.userContentController = userContentController
let webView = WKWebView(configuration: configuration)
!// Browser (JavaScript)
class iosDelegate {
handle(name, payload) {
const sender = window.webkit.messageHandlers["notification"]
sender.postMessage({ name, payload })
}
}
App Transport Security
HTTPS в браузере
45
HTTPS HTTP???
NSURLErrorSecureConnectionFailed
HTTPS-ish?
46
47
func webView(_ webView: WKWebView,
didFailProvisionalNavigation navigation: WKNavigation!,
withError error: Error) {
let nsError = error as NSError
if #available(iOS 9.0, *) {
let sslErrorCodes = [
NSURLErrorAppTransportSecurityRequiresSecureConnection,
NSURLErrorSecureConnectionFailed,
]
if sslErrorCodes.contains(nsError.code) {
let url = nsError.userInfo["NSErrorFailingURLKey"] as! URL
self.openURLInBrowser(url)
}
}
48
func webView(_ webView: WKWebView,
didFailProvisionalNavigation navigation: WKNavigation!,
withError error: Error) {
let nsError = error as NSError
if #available(iOS 9.0, *) {
let sslErrorCodes = [
NSURLErrorAppTransportSecurityRequiresSecureConnection,
NSURLErrorSecureConnectionFailed,
]
if sslErrorCodes.contains(nsError.code) {
let url = nsError.userInfo["NSErrorFailingURLKey"] as! URL
self.openURLInBrowser(url)
}
}
Android
› обработка событий (JSInterface)
› разделение на несколько сборок
› поэтапная выкатка
Гибридизация Android-приложения
50
Передача данных из веба в приложение
51
!// Android

webview.addJavascriptInterface(

JSInterface(),

"MyInterface"

)



!// Website

MyInterface.addToFavorites(JSON.stringify({

flight: 'S7 01'

}))
52
inner class JSInterface {

@JavascriptInterface

fun addToFavorites(json: String) {

onAddToFavorites(json)

}



@JavascriptInterface

fun removeFromFavorites(json: String) {

onRemoveFromFavorites(json)

}

}
Фрагментация
Поддержка JS API
По данным caiuse.com 54
Android 4.3
Android 4.4
Android 4.4.4
Chrome 53
0 % 25 % 50 % 75 % 100 %
Да Частично Нет
Crosswalk
Поддержка JS API
По данным caiuse.com 56
Android 4.3/w Crosswalk
Android 4.4/w Crosswalk
Android 4.4.4/w Crosswalk
Chrome 53
0 % 25 % 50 % 75 % 100 %
Да Частично Нет
Последний коммит в crosswalk
57
Размер приложения
58
8.74 Mb 53.66 Mb
Crosswalk
Crosswalk lite
59
› Весит примерно ~10MB
Crosswalk lite
60
› Собран с оптимизацией для снижения размера
› Весит примерно ~10MB
Crosswalk lite
61
› Весит примерно ~10MB
› Собран с оптимизацией для снижения размера
› Отключены: WebRTC, WebP, Web Video, Web
Audio, Web Bluetooth, Web Notifications, …
Crosswalk lite
62
› Сжат с применением LZMA
› Собран с оптимизацией для снижения размера
› Отключены: WebRTC, WebP, Web Video, Web
Audio, Web Bluetooth, Web Notifications, …
› Весит примерно ~10MB
Несколько apk – это просто
63
!// build.gradle
productFlavors {
api16_armv7 {
!!...
}
api16_x86 {
!!...
}
api21 {
!!...
}
}
64
api16_armv7 {
!// Chromium должен собираться на 23-й версии

targetSdkVersion 23

compileSdkVersion 23

buildToolsVersion "23.0.3"



minSdkVersion 16



versionCode defaultConfig.versionCode + 2



ndk {

abiFilters "armeabi-v7a", ""

}

}
Результат
65
API21 (ARM&x86) 6,92 МБ (83.2%)
API16+ (x86) 34,03 МБ (0.7%)
API16+ (ARM) 30,24 МБ (16.1%)
Crosswalk
x86 binary
ARM binary
Рейтинг приложения
Android, данные из Google Developer Console 66
Параллельная выкладка
0 %
25 %
50 %
75 %
100 %
дни
1 2 3 4
API21 API16x86 API16ARM
67
0 %
100 %
200 %
300 %
дни
1 2 3 4 5 6 7 8
API21 API16x86 API16ARM
68
Последовательная выкладка
Игого
Роадмап
70
Апрель
М
ай
И
ю
нь
И
ю
ль
Август
Сентябрь
О
ктябрь
Н
оябрь
Д
екабрь
Количество строк
71
Декабрь 2016
iOS Android
25 20325 858
Затраты на разработку
72
Апрель 2016
Mobile Web
50 %50 %
Обновления без ревью
73
★★★★★
Очень здорово!
Спасибо за календарь цен!
by Ksenia Pankratova for v1.20 (126) – Android 6.0, Asus Z00l
iOS, переходы к партнёрам
75
› больше гибридных экранов
› оптимизация производительности
› Progressive Web Apps: оффлайн, веб-пуши
Что дальше?
76
PWA: Add to home screen
77
Андрей Легчилин
Яндекс.Авиабилеты, 

frontend/Android
firnis@yandex-team.ru
@sameoldmadness
grumpy@yandex-team.ru
Роман Парадеев
Яндекс.Авиабилеты, 

frontend/iOS
iOS party – июнь
bit.ly/iOSekb
@iospartyekb
Droid party – 20 апреля, 18:30
Минутка рекламы!
79

More Related Content

What's hot

Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Magneta AI
 
DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин ИльяDUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
it-people
 
Knockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-ОнлайнKnockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-Онлайн
DevDay
 

What's hot (12)

Простой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NETПростой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NET
 
Web deployment
Web deploymentWeb deployment
Web deployment
 
REST и HATEOAS
REST и HATEOASREST и HATEOAS
REST и HATEOAS
 
Рендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковРендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей Солодовников
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
 
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
 
DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин ИльяDUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
 
Vue.js - реактивный фронтенд фреймворк для людей
Vue.js - реактивный фронтенд фреймворк для людейVue.js - реактивный фронтенд фреймворк для людей
Vue.js - реактивный фронтенд фреймворк для людей
 
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
 
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
 
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
 
Knockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-ОнлайнKnockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-Онлайн
 

Similar to "Гибридное приложение: полгода после релиза" Легчилин Андрей, Парадеев Роман, Яндекс

Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
UA Mobile
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
7bits
 
CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению
CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлениюCodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению
CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению
CodeFest
 
CodeFest 2012. Сошников Д. — Разработка мобильных приложений на платформе Mic...
CodeFest 2012. Сошников Д. — Разработка мобильных приложений на платформе Mic...CodeFest 2012. Сошников Д. — Разработка мобильных приложений на платформе Mic...
CodeFest 2012. Сошников Д. — Разработка мобильных приложений на платформе Mic...
CodeFest
 
Вебинар "Оптимизация производительности мобильных веб-приложений"
Вебинар "Оптимизация производительности мобильных веб-приложений"Вебинар "Оптимизация производительности мобильных веб-приложений"
Вебинар "Оптимизация производительности мобильных веб-приложений"
MobiDev
 

Similar to "Гибридное приложение: полгода после релиза" Легчилин Андрей, Парадеев Роман, Яндекс (20)

Appium для народа
Appium для народаAppium для народа
Appium для народа
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
 
The Old New ASP.NET
The Old New ASP.NETThe Old New ASP.NET
The Old New ASP.NET
 
Devcamp nodejs-2010
Devcamp nodejs-2010Devcamp nodejs-2010
Devcamp nodejs-2010
 
Vuejs composition API
Vuejs composition APIVuejs composition API
Vuejs composition API
 
CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению
CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлениюCodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению
CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
 
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
 
2014-08-02 03 Дмитрий Шматко. Первые впечатления от Node.js
2014-08-02 03 Дмитрий Шматко. Первые впечатления от Node.js2014-08-02 03 Дмитрий Шматко. Первые впечатления от Node.js
2014-08-02 03 Дмитрий Шматко. Первые впечатления от Node.js
 
"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс
 
CodeFest 2012. Сошников Д. — Разработка мобильных приложений на платформе Mic...
CodeFest 2012. Сошников Д. — Разработка мобильных приложений на платформе Mic...CodeFest 2012. Сошников Д. — Разработка мобильных приложений на платформе Mic...
CodeFest 2012. Сошников Д. — Разработка мобильных приложений на платформе Mic...
 
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляции
 
Yii: миграции и инсталляции
Yii: миграции и инсталляцииYii: миграции и инсталляции
Yii: миграции и инсталляции
 
Вебинар "Оптимизация производительности мобильных веб-приложений"
Вебинар "Оптимизация производительности мобильных веб-приложений"Вебинар "Оптимизация производительности мобильных веб-приложений"
Вебинар "Оптимизация производительности мобильных веб-приложений"
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
 
Alexander manuhin selenium_php_v2.0
Alexander manuhin selenium_php_v2.0Alexander manuhin selenium_php_v2.0
Alexander manuhin selenium_php_v2.0
 

More from it-people

«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
it-people
 
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
it-people
 
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
it-people
 
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
it-people
 
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
it-people
 
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
it-people
 
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
it-people
 
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
it-people
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
it-people
 
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
it-people
 
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
it-people
 
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
it-people
 
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
it-people
 

More from it-people (20)

«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
 
«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghub«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghub
 
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
 
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
 
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
 
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
 
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
 
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
 
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
 
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
 
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
 
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
 
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
 
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
 
«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologies«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologies
 
«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс
 
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
 
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
 
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
 

"Гибридное приложение: полгода после релиза" Легчилин Андрей, Парадеев Роман, Яндекс