SlideShare a Scribd company logo
1 of 58
Download to read offline
Мой сосед
Легаси
Федоров Сергей, Evil Martians
Проект AmplifrПроект AmplifrПроект Amplifr
Проект Amplifr
—  Музыкальная индустрия
—  4 соцсети
—  Публикации
—  Простая аналитика
Проект AmplifrПроект AmplifrПроект Amplifr
Проект Amplifr
—  100% SMM
—  12 соцсетей
—  Публикации
—  Аналитика
—  Рекомендации
—  Рассылки
Проект Amplifr
Эволюция VS Революция
О чем доклад?
О простых и дешевых приемах,
которые позволят вам и вашей
команде эффективно работать
с легаси кодом
ФорматированиеФорматированиеФорматирование
Форматирование
Форматирование
Никому не нравится читать плохо
отформатированный код
Форматирование
def write_stats(publication, total, data = {})
activity = count_total_from_publication_data(publication)
update_activity(publication, activity)
total = activity.values.sum
if override_stat_date?(publication, 'created_at')
data[:date] = Time.parse(publication.data['created_at'])
end
unless dont_write_stats
if plays_total = publication.data.try(:[], 'playback_count').to_i
stat = 
Stat.record_total(
"soundcloud_plays",
{ project: publication.project, resource: publication }.merge(data),
plays_total
)
end
end
super
end
Форматирование
def write_stats(publication, total, data = {})
activity = count_total_from_publication_data(publication)
total = activity.values.sum
update_activity(publication, activity)
if override_stat_date?(publication, 'created_at')
data[:date] = Time.parse(publication.data['created_at'])
end
unless dont_write_stats
if plays_total = publication.data.try(:[], 'playback_count').to_i
stat = 
Stat.record_total(
"soundcloud_plays",
{ project: publication.project, resource: publication }.merge(data),
plays_total
)
end
end
super
end
Форматирование
def write_stats(publication, total, data = {})
activity = count_total_from_publication_data(publication)
total = activity.values.sum
update_activity(publication, activity)
if override_stat_date?(publication, 'created_at')
data[:date] = Time.parse(publication.data['created_at'])
end
unless dont_write_stats
if plays_total = publication.data.try(:[], 'playback_count').to_i
stat = 
Stat.record_total(
"soundcloud_plays",
{ project: publication.project, resource: publication }.merge(data),
plays_total
)
end
end
super
end
Форматирование
def write_stats(publication, total, data = {})
activity = count_total_from_publication_data(publication)
total = activity.values.sum
update_activity(publication, activity)
if override_stat_date?(publication, 'created_at')
data[:date] = Time.parse(publication.data['created_at'])
end
unless dont_write_stats
if plays_total = publication.data.try(:[], 'playback_count').to_i
stat = 
Stat.record_total(
"soundcloud_plays",
{ project: publication.project, resource: publication }.merge(data),
plays_total
)
end
end
super
end
Форматирование
def write_stats(publication, total, data = {})
activity = count_total_from_publication_data(publication)
total = activity.values.sum
update_activity(publication, activity)
if override_stat_date?(publication, 'created_at')
data[:date] = Time.parse(publication.data['created_at'])
end
unless dont_write_stats
if plays_total = publication.data.try(:[], 'playback_count').to_i
stat = 
Stat.record_total(
"soundcloud_plays",
{ project: publication.project, resource: publication }.merge(data),
plays_total
)
end
end
super
end
Форматирование
def write_stats(publication, total, data = {})
activity = count_total_from_publication_data(publication)
total = activity.values.sum
update_activity(publication, activity)
if override_stat_date?(publication, 'created_at')
data[:date] = Time.parse(publication.data['created_at'])
end
unless dont_write_stats
if plays_total = publication.data.try(:[], 'playback_count').to_i
stat = 
Stat.record_total(
"soundcloud_plays",
{ project: publication.project, resource: publication }.merge(data),
plays_total
)
end
end
super
end
Форматирование
def write_stats(publication, total, data = {})
activity = count_total_from_publication_data(publication)
total = activity.values.sum
update_activity(publication, activity)
if override_stat_date?(publication, 'created_at')
data[:date] = Time.parse(publication.data['created_at'])
end
unless dont_write_stats
if plays_total = publication.data.try(:[], 'playback_count').to_i
stat = 
Stat.record_total(
"soundcloud_plays",
{ project: publication.project, resource: publication }.merge(data),
plays_total
)
end
end
super
end
Форматирование
Современные IDE поддерживают
функцию автоматического
форматирования кода
Форматирование
Концепции, тесно связанные друг
с другом, должны находиться
поблизости друг от друга
по вертикали
Форматирование
Взаимозависимые функции
должны размещаться
в нисходящем порядке
Форматирование
Единый стиль форматирования
уменьшает вероятность ошибки
Источник: Robert C. Martin: Clean Code, A Handbook of Agile Software Craftsmanship
Неправильные именаНеправильные именаНеправильные имена
Неправильные имена
Неправильные имена
Самое трудное
в программировании —
это придумывать имена
Неправильные имена
Комментарии могут обманывать
так же, как и неверные имена
Неправильные имена
Плохое имя — как магнит
для лишней функциональности
Неправильные имена
def access_token
# We store only refresh token and for each request
# just fetching new access token
api = Odnoklassniki::Client.new(
access_token: @account.token,
client_id: Settings.odnoklassniki.app_id,
client_secret: Settings.odnoklassniki.app_secret,
)
new_token = api.refresh_token!
raise Social::API::Unauthorized if new_token.blank?
api
end
Неправильные имена
def access_token
# We store only refresh token and for each request
# just fetching new access token
api = Odnoklassniki::Client.new(
access_token: @account.token,
client_id: Settings.odnoklassniki.app_id,
client_secret: Settings.odnoklassniki.app_secret,
)
new_token = api.refresh_token!
raise Social::API::Unauthorized if new_token.blank?
api
end
Неправильные имена
def access_token
# We store only refresh token and for each request
# just fetching new access token
api = Odnoklassniki::Client.new(
access_token: @account.token,
client_id: Settings.odnoklassniki.app_id,
client_secret: Settings.odnoklassniki.app_secret,
)
new_token = api.refresh_token!
if new_token.blank?
@account.disable!
raise Social::API::Unauthorized
end
api
end
Неправильные имена
def rest_client_with_refreshed_token
client = Odnoklassniki::Client.new(
access_token: @account.token,
client_id: Settings.odnoklassniki.app_id,
client_secret: Settings.odnoklassniki.app_secret,
)
refreshed_token = client.refresh_token!
raise Social::API::Unauthorized if refreshed_token.blank?
client
end
Дублирование и DRYДублирование и DRYДублирование и DRY
Дублирование и DRY
Дублирование и DRY
Все ли дублирование стоит
устранять?
module Social
module API
class Vkontakte
def initialize(access_token)
@access_token = access_token
end
# ...
end
end
end
module Social
module API
class Twitter
def initialize(access_token)
@access_token = access_token
end
# ...
end
end
end
Дублирование и DRY
module Social
module API
class Base
def initialize(access_token)
@access_token = access_token
end
end
end
end
module Social
module API
class Vkontakte < Base
# ...
end
end
end
Дублирование и DRY
Дублирование и DRY
module Social
module API
class Base
def initialize(access_token)
@access_token = access_token
end
def rescue_api_errors(error, args)
# ..
end
def send_notification
# ...
end
end
end
end
Дублирование и DRY
Понятность кода не должна быть
ценой устранения дублирования
Дублирование и DRY
С дублированием кода вполне
можно жить
Дублирование и DRY
Неверные абстракции устранять
сложнее, чем дублирование
Дублирование и DRY
Устраняя дублирование
руководствуйтесь примерами
использования кода
ИнтерфейсыИнтерфейсыИнтерфейсы
Интерфейсы
вместо методоввместо методоввместо методов
вместо методов
Интерфейсы вместо методов
Лучший код — код которого нет
Интерфейсы вместо методов
Копирование или расширение
существующих методов — ложный
reuse
Интерфейсы вместо методов
def fetch_account_publications(opts = {})
all = api_fetch
posts = all['feeds']
entities = all['entities'].try(:[], 'media_topics') || []
return unless posts.present? || entities.present?
posts.each do |story|
publication = find_publication(story)
likes = entities.find { |it| it['ref'] == story['target_refs'].try(:[], 0) }
likes = likes['like_summary']['count'] if likes
likes ||= 0
comments = story['discussion_summary'].try(:[], 'comments_count').to_i
shares = 0
update_activity(publication, {like: likes, share: shares, comment: comments})
total = comments + likes
write_stats(publication, total) if publication.is_a?(Social::ExternalPublication)
end
end
Интерфейсы вместо методов
def fetch_account_publications(opts = {})
all = api_fetch
posts = all['feeds']
entities = all['entities'].try(:[], 'media_topics') || []
return unless posts.present? || entities.present?
posts.each do |story|
publication = find_publication(story)
likes = entities.find { |it| it['ref'] == story['target_refs'].try(:[], 0) }
likes = likes['like_summary']['count'] if likes
likes ||= 0
comments = story['discussion_summary'].try(:[], 'comments_count').to_i
shares = 0
update_activity(publication, {like: likes, share: shares, comment: comments})
total = comments + likes
write_stats(publication, total) if publication.is_a?(Social::ExternalPublication)
end
end
Интерфейсы вместо методов
def fetch_account_publications(opts = {})
all = api_fetch
posts = all['feeds']
entities = all['entities'].try(:[], 'media_topics') || []
return unless posts.present? || entities.present?
posts.each do |story|
publication = find_publication(story)
likes = entities.find { |it| it['ref'] == story['target_refs'].try(:[], 0) }
likes = likes['like_summary']['count'] if likes
likes ||= 0
comments = story['discussion_summary'].try(:[], 'comments_count').to_i
shares = 0
update_activity(publication, {like: likes, share: shares, comment: comments})
total = comments + likes
write_stats(publication, total) if publication.is_a?(Social::ExternalPublication)
end
end
Интерфейсы вместо методов
def get_publication_activity(story)
publication = find_publication(story)
likes = entities.find { |it| it['ref'] == story['target_refs'].try(:[], 0) }
likes = likes['like_summary']['count'] if likes
likes ||= 0
comments = story['discussion_summary'].try(:[], 'comments_count').to_i
shares = 0
{likes: likes, comments: comments, shares: shares}
end
Интерфейсы вместо методов
class PublicationStatistics
def likes
# ...
end
def comments
# ...
end
def shares
# ...
end
end
Интерфейсы вместо методов
Производите анализ имеющегося
кода
ТестыТестыТесты
Тесты
Тесты
Код без тестов — легаси код
Источник: Michael Feathers: Working Effectively with Legacy Code
Тесты
Как бы небыл понятен код —
не факт, что ты ничего не сломал
Тесты
Критичные участки кода должны
быть покрыты тестами
РефакторингРефакторингРефакторинг
Рефакторинг
Рефакторинг
Довольно дорогой процесс
для бизнеса
Рефакторинг
Очень сложно уложиться
в отведенное время
Рефакторинг
Параллельная разработка делает
рефакторинг в разы сложнее
Заключение
Правило бойскаута — оставь
место стоянки чище, чем оно было
до твоего прихода
Заключение
Теория разбитых окон — устраняя
малозначительные недочеты, вы
не допускаете более крупных
Заключение
Разработка через рефакторинг
ВопросыВопросыВопросы
Вопросы
—  Почта: strech@evl.ms
—  Твиттер: @oni_strech
—  Слайды: strech.github.io/my-neighbor-legacy

More Related Content

Viewers also liked

Baral comunicaciòn efectiva
Baral comunicaciòn efectivaBaral comunicaciòn efectiva
Baral comunicaciòn efectiva4637267
 
Celebramos el 5to aniv beatificación
Celebramos el 5to aniv beatificaciónCelebramos el 5to aniv beatificación
Celebramos el 5to aniv beatificaciónSagrada Familia Urgell
 
New homeowner's checklist fbcad
New homeowner's checklist fbcadNew homeowner's checklist fbcad
New homeowner's checklist fbcadcutmytaxes
 
Повышаем отказоустойчивость без дорогих решений
Повышаем отказоустойчивость без дорогих решенийПовышаем отказоустойчивость без дорогих решений
Повышаем отказоустойчивость без дорогих решенийLenvendo
 
Гибкость и Структурированность Oбъектно Oриентированноя CSS
Гибкость и Структурированность Oбъектно Oриентированноя CSSГибкость и Структурированность Oбъектно Oриентированноя CSS
Гибкость и Структурированность Oбъектно Oриентированноя CSSEcommerce Solution Provider SysIQ
 
Animations a saint lary soulan du 4 au 19 fevrier 2017
Animations a saint lary soulan du 4 au 19 fevrier 2017Animations a saint lary soulan du 4 au 19 fevrier 2017
Animations a saint lary soulan du 4 au 19 fevrier 2017Philippe Villette
 
Smau Milano 2016 - Clarissa Molfino, Microsoft
Smau Milano 2016 - Clarissa Molfino, Microsoft Smau Milano 2016 - Clarissa Molfino, Microsoft
Smau Milano 2016 - Clarissa Molfino, Microsoft SMAU
 
Smau Firenze 2016 - Assintel, Roberta Gilardi
Smau Firenze 2016 - Assintel, Roberta GilardiSmau Firenze 2016 - Assintel, Roberta Gilardi
Smau Firenze 2016 - Assintel, Roberta GilardiSMAU
 
agenda culturel pays des nestes fevrier a mai 2017
agenda culturel pays des nestes fevrier a mai 2017agenda culturel pays des nestes fevrier a mai 2017
agenda culturel pays des nestes fevrier a mai 2017Philippe Villette
 
Alimentation et patrimoine gastronomique dans les Pyrenees
Alimentation et patrimoine gastronomique dans les PyreneesAlimentation et patrimoine gastronomique dans les Pyrenees
Alimentation et patrimoine gastronomique dans les PyreneesPhilippe Villette
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsLinkedIn
 

Viewers also liked (15)

Presentation1
Presentation1Presentation1
Presentation1
 
Baral comunicaciòn efectiva
Baral comunicaciòn efectivaBaral comunicaciòn efectiva
Baral comunicaciòn efectiva
 
Celebramos el 5to aniv beatificación
Celebramos el 5to aniv beatificaciónCelebramos el 5to aniv beatificación
Celebramos el 5to aniv beatificación
 
New homeowner's checklist fbcad
New homeowner's checklist fbcadNew homeowner's checklist fbcad
New homeowner's checklist fbcad
 
Adviento
AdvientoAdviento
Adviento
 
Esss
EsssEsss
Esss
 
Повышаем отказоустойчивость без дорогих решений
Повышаем отказоустойчивость без дорогих решенийПовышаем отказоустойчивость без дорогих решений
Повышаем отказоустойчивость без дорогих решений
 
Гибкость и Структурированность Oбъектно Oриентированноя CSS
Гибкость и Структурированность Oбъектно Oриентированноя CSSГибкость и Структурированность Oбъектно Oриентированноя CSS
Гибкость и Структурированность Oбъектно Oриентированноя CSS
 
Animations a saint lary soulan du 4 au 19 fevrier 2017
Animations a saint lary soulan du 4 au 19 fevrier 2017Animations a saint lary soulan du 4 au 19 fevrier 2017
Animations a saint lary soulan du 4 au 19 fevrier 2017
 
Smau Milano 2016 - Clarissa Molfino, Microsoft
Smau Milano 2016 - Clarissa Molfino, Microsoft Smau Milano 2016 - Clarissa Molfino, Microsoft
Smau Milano 2016 - Clarissa Molfino, Microsoft
 
Smau Firenze 2016 - Assintel, Roberta Gilardi
Smau Firenze 2016 - Assintel, Roberta GilardiSmau Firenze 2016 - Assintel, Roberta Gilardi
Smau Firenze 2016 - Assintel, Roberta Gilardi
 
agenda culturel pays des nestes fevrier a mai 2017
agenda culturel pays des nestes fevrier a mai 2017agenda culturel pays des nestes fevrier a mai 2017
agenda culturel pays des nestes fevrier a mai 2017
 
Alimentation et patrimoine gastronomique dans les Pyrenees
Alimentation et patrimoine gastronomique dans les PyreneesAlimentation et patrimoine gastronomique dans les Pyrenees
Alimentation et patrimoine gastronomique dans les Pyrenees
 
presentation
presentationpresentation
presentation
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving Cars
 

Similar to «Мой сосед Легаси», Сергей Федоров, Evil Martians

Algorithms and programming lecture in ru
Algorithms and programming lecture in ruAlgorithms and programming lecture in ru
Algorithms and programming lecture in russuser0562f1
 
Алгоритмизация и программирование С/С++
Алгоритмизация и  программирование С/С++Алгоритмизация и  программирование С/С++
Алгоритмизация и программирование С/С++ssuser0562f1
 
School IT recruiting
School IT recruiting School IT recruiting
School IT recruiting Olga Kotova
 
How to get knowledge and improve it all your professional life long
How to get knowledge and improve it all your professional life longHow to get knowledge and improve it all your professional life long
How to get knowledge and improve it all your professional life longTimur Shemsedinov
 
Ф'Yii'лософия
Ф'Yii'лософияФ'Yii'лософия
Ф'Yii'лософияPaul Klimov
 
Выступление: инструменты и методы эффективной удалённой работы
Выступление: инструменты и методы эффективной удалённой работыВыступление: инструменты и методы эффективной удалённой работы
Выступление: инструменты и методы эффективной удалённой работыryba4
 
Расширяем идею статического анализа от проверки кода до других процессов разр...
Расширяем идею статического анализа от проверки кода до других процессов разр...Расширяем идею статического анализа от проверки кода до других процессов разр...
Расширяем идею статического анализа от проверки кода до других процессов разр...Andrey Karpov
 
Эмоции в разработки. Спасаем продуктивность
Эмоции в разработки. Спасаем продуктивностьЭмоции в разработки. Спасаем продуктивность
Эмоции в разработки. Спасаем продуктивностьEgor Malkevich
 
Как начать применять R в Enterprise
Как начать применять R в EnterpriseКак начать применять R в Enterprise
Как начать применять R в EnterpriseIlya Shutov
 
инструменты веб разработчика
инструменты веб разработчикаинструменты веб разработчика
инструменты веб разработчикаSoftline
 
Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Dmitri Soshnikov
 
"IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский...
"IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский..."IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский...
"IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский...Yandex
 
Programming history. Algorithm
Programming history. AlgorithmProgramming history. Algorithm
Programming history. AlgorithmIhor Porotikov
 
лекция типовые ошибки
лекция типовые ошибкилекция типовые ошибки
лекция типовые ошибкиYury Zelensky
 
Дизайн. Глазами и руками разработчика
Дизайн. Глазами и руками разработчикаДизайн. Глазами и руками разработчика
Дизайн. Глазами и руками разработчикаAnton Winogradov
 

Similar to «Мой сосед Легаси», Сергей Федоров, Evil Martians (20)

Algorithms and programming lecture in ru
Algorithms and programming lecture in ruAlgorithms and programming lecture in ru
Algorithms and programming lecture in ru
 
Алгоритмизация и программирование С/С++
Алгоритмизация и  программирование С/С++Алгоритмизация и  программирование С/С++
Алгоритмизация и программирование С/С++
 
School IT recruiting
School IT recruiting School IT recruiting
School IT recruiting
 
How to get knowledge and improve it all your professional life long
How to get knowledge and improve it all your professional life longHow to get knowledge and improve it all your professional life long
How to get knowledge and improve it all your professional life long
 
Ф'Yii'лософия
Ф'Yii'лософияФ'Yii'лософия
Ф'Yii'лософия
 
Выступление: инструменты и методы эффективной удалённой работы
Выступление: инструменты и методы эффективной удалённой работыВыступление: инструменты и методы эффективной удалённой работы
Выступление: инструменты и методы эффективной удалённой работы
 
запахи кода
запахи кодазапахи кода
запахи кода
 
Yandex Direct
Yandex DirectYandex Direct
Yandex Direct
 
About Python
About PythonAbout Python
About Python
 
Расширяем идею статического анализа от проверки кода до других процессов разр...
Расширяем идею статического анализа от проверки кода до других процессов разр...Расширяем идею статического анализа от проверки кода до других процессов разр...
Расширяем идею статического анализа от проверки кода до других процессов разр...
 
Эмоции в разработки. Спасаем продуктивность
Эмоции в разработки. Спасаем продуктивностьЭмоции в разработки. Спасаем продуктивность
Эмоции в разработки. Спасаем продуктивность
 
Why does code style matter?
Why does code style matter?Why does code style matter?
Why does code style matter?
 
Как начать применять R в Enterprise
Как начать применять R в EnterpriseКак начать применять R в Enterprise
Как начать применять R в Enterprise
 
инструменты веб разработчика
инструменты веб разработчикаинструменты веб разработчика
инструменты веб разработчика
 
Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...
 
"IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский...
"IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский..."IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский...
"IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский...
 
Programming history. Algorithm
Programming history. AlgorithmProgramming history. Algorithm
Programming history. Algorithm
 
DLR Hosting
DLR HostingDLR Hosting
DLR Hosting
 
лекция типовые ошибки
лекция типовые ошибкилекция типовые ошибки
лекция типовые ошибки
 
Дизайн. Глазами и руками разработчика
Дизайн. Глазами и руками разработчикаДизайн. Глазами и руками разработчика
Дизайн. Глазами и руками разработчика
 

More from it-people

«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Coit-people
 
«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghub«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghubit-people
 
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrainsit-people
 
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologiesit-people
 
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс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 — почём опиум для народа?» Игорь Новиков, Scalrit-people
 
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...it-people
 
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАНit-people
 
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банкit-people
 
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Coit-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 Technologiesit-people
 
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn Systemit-people
 
«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologies«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologiesit-people
 
«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндексit-people
 
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...it-people
 
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognicianit-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
 
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
 

«Мой сосед Легаси», Сергей Федоров, Evil Martians