SlideShare a Scribd company logo
1 of 67
Шаблонизация SQL
 еще один велосипед


             Алексей Романчук
Обо мне
О чем будем говорить?
Для кого

• Разработчики
• Много SQL
• Динамический SQL
Для чего стараемся?

• Сложные выборки
• Отчеты
• Любые SQL запросы
Очень простой пример
Очень простой пример
Простой пример
Простой пример
Простой пример
Пример
Пример
Не такой простой пример
Не такой простой пример
Не такой простой пример
Не такой простой пример
Пример почти из жизни
Пример почти из жизни
Почувствуйте разницу
Недостатки inline подхода
Недостатки inline подхода
• Невозможность ограничить текст запроса
• Дублирование логики в запросах и в
  параметрах
• Часть свойств в тексте запроса, часть как
  явные параметры
• Сложность разработки и отладки SQL
Как происходит разработка SQL
•   Получить SQL из кода
•   Заменить «?» на значения
•   Внести изменения в SQL редакторе
•   Внедрить изменения в код или «оживить»
    написанный SQL целиком
Что делать?
Шаблонизация FTW
Шаблонизация FTW
Шаблонизация FTW
Стало ли проще?
Стало ли проще?
Что дает шаблонизация?
• Возможность ограничить текст запроса
• Текст первичен
• Многострочные запросы легко копировать
Какой должна быть разработка SQL
•   Получить SQL из кода
•   Заменить «?» на значения
•   Внести изменения в SQL редакторе
•   Внедрить изменения в код или «оживить»
    написанный SQL целиком
Наконец!
Требования к шаблонизатору
• Шаблон должен быть максимально
  валидным SQL
• Возможность «выключить» ненужный join
• Поддержка типизированных параметров
• Автоматическое включение joinов
Где хранить метаданные чтобы
шаблон оставался валидным SQL?
XDoclet

        Java source
*.hbm                 javac   .class
И не только
•   Javadoc
•   Google Closure Compiler for JS
•   Eclipse localization (//$NON-NLS-1$)
•   UML Doclet
Шаблонизатор

               Шаблон
SQL редактор            Движок       Запрос




                        Parameters
Шаблонизатор в двух словах

• Элемент
• Дерево
Элемент
    Единственная языковая конструкция

       /*id(int */1045/*)*/
 /*cond(*/inner join orders o…/*)*/
• Имя
• Тип
• Значение
Варианты синтаксиса элемента
•   /*{name*/1045/*}*/
•   /*<name type=“int”>*/1045/*</name>*/
•   /*<name:int*/1045/*>*/
•   /*name(int */1045/*)*/
Работа с элементом
• По умолчанию элемент «выключен»
• Явное задание значение и проверка типа
• Использование значения из шаблона
Простой пример
select c.id, c.name
from company c
where c.name ilike ‘2 gis’
Простой пример
select c.id, c.name
from company c
where c.name ilike /*name(*/‘2 gis%’/*)*/
Простой пример
Template t = new Template(“…”);
t.assignValue(“name”, “Sbertech%”);
Простой пример
select c.id, c.name
from company c
where c.name ilike ‘Sbertech%’
Дерево

• Шаблон – дерево текста и элементов (xml)
• По умолчанию элемент «выключен»
• Включение элемента включает элемент
  родителя
Дерево
 /*filter(*/where name = /*name(*/’Jack’/*))*/


• Шаблон
 –filter
    • name
Пример с join
select distinct c.id, c.name
from company c
inner join comp_office co on co.comp_id = c.id
where c.name ilike '2 gis%’
and co.country ilike ‘russia%’
Пример с join
select distinct c.id, c.name
from company c
inner join comp_office co on co.comp_id = c.id
where c.name ilike /*name(*/'2 gis%’/*)*/
and co.country ilike /*country(*/ ‘russia%’/*)*/
Пример с join
select distinct c.id, c.name
from company c
inner join comp_office co on co.comp_id = c.id
where c.name ilike /*name(*/'2 gis%’/*)*/
/*office(*/and co.country ilike /*country(*/ ‘russia%’/*))*/
Пример с join
select distinct c.id, c.name
from company c
/*office(*/inner join comp_office co on co.comp_id = c.id/*)*/
where c.name ilike /*name(*/'2 gis%’/*)*/
/*office(*/and co.country ilike /*country(*/ ‘russia%’/*))*/
Пример с join
• Шаблон
  – office (join)
  – name
  – office (where)
     • country
Пример с join
Template t = new Template(“…”);
t.assignValue(“name”, “Sbertech%”);
Пример с join
select distinct c.id, c.name
from company c
where c.name ilike ‘Sbertech%’
Пример с join
Template t = new Template(“…”);
t.assignValue(“name”, “Sbertech%”);
t.assignValue(“country”, “Rus%”);
Пример с join
select distinct c.id, c.name
from company c
inner join comp_office co on co.comp_id = c.id
where c.name ilike ‘Sbertech%’
and co.country ilike ‘Rus%’
Реальный пример
select distinct c.id, c.name
from company c
inner join comp_office co on co.comp_id = c.id
inner join orders o on o.comp_id = c.id
where c.name ilike '2 gis%'
and co.country ilike 'russia%'
and co.city ilike 'novosibirsk%'
and co.street ilike 'marks%'
and o.date > currenttime - '6 month'::interval
limit 10 offset 5
Реальный пример
select distinct c.id, c.name
from company c
inner join comp_office co on co.comp_id = c.id
inner join orders o on o.comp_id = c.id
where c.name ilike /*name(*/'2 gis%’/*)*/
and co.country ilike /*country(*/'russia%' /*)*/
and co.city ilike /*city(*/'novosibirsk%’/*)*/
and co.street ilike /*street(*/'marks%'/*)*/
and o.date > currenttime - '6 month'::interval
limit /*limit(int*/10/*)*/ offset /*offset(int*/5/*)*/
Реальный пример
select distinct c.id, c.name
from company c
inner join comp_office co on co.comp_id = c.id
inner join orders o on o.comp_id = c.id
where c.name ilike /*name(*/'2 gis%’/*)*/
and co.country ilike /*country(*/'russia%' /*)*/
and co.city ilike /*city(*/'novosibirsk%’/*)*/
and co.street ilike /*street(*/'marks%'/*)*/
/*active(*/and o.date > currenttime - '6 month'::interval/*)*/
limit /*limit(int*/10/*)*/ offset /*offset(int*/5/*)*/
Реальный пример
select distinct c.id, c.name
from company c
inner join comp_office co on co.comp_id = c.id
/*active(*/inner join orders o on o.comp_id = c.id/*)*/
where c.name ilike /*name(*/'2 gis%’/*)*/
and co.country ilike /*country(*/'russia%' /*)*/
and co.city ilike /*city(*/'novosibirsk%’/*)*/
and co.street ilike /*street(*/'marks%'/*)*/
/*active(*/and o.date > currenttime - '6 month'::interval/*)*/
limit /*limit(int*/10/*)*/ offset /*offset(int*/5/*)*/
Реальный пример
select distinct c.id, c.name
from company c
/*office(*/inner join comp_office co on co.comp_id = c.id/*)*/
/*active(*/inner join orders o on o.comp_id = c.id/*)*/
where c.name ilike /*name(*/'2 gis%’/*)*/
/*office(*/and co.country ilike /*country(*/'russia%' /*)*/
and co.city ilike /*city(*/'novosibirsk%’/*)*/
and co.street ilike /*street(*/'marks%'/*))*/
/*active(*/and o.date > currenttime - '6 month'::interval/*)*/
limit /*limit(int*/10/*)*/ offset /*offset(int*/5/*)*/
Реальный пример
• Шаблон
  –   office (join)
  –   active (join)
  –   name
  –   office (where)
       • country
       • city
       • street
  – active (where)
  – limit и offset
Реальный пример
Template t = new Template(“…”);
t.assignValue(“name”, “2 gis”);
t.assignValue(“country”, “russia”);
t.assignValue(“city”, “novosibirsk”);
t.assignValue(“street”, “marksa”);
t.assignValue(“limit”, 10);
t.assignValue(“offset”, 5);
t.enable(“active”);
Что дает нам велосипед?
•   Ограничение текста запроса
•   Позволяет контролировать тип параметров
•   Позволяет не удалять значения параметров
•   Позволяет разрабатывать и использовать в
    программе один и тот же шаблон
Что дальше?
•   POJO как конфигурация запроса
•   Как получить PreparedStatement, а не текст?
•   “Reflection” API и автотесты
•   IDE plugins
Вместо заключения
•   Заимствуйте в смежных областях
•   Сфокусируйтесь на узкой задаче
•   Придумывайте простое решение
•   DSL FTW
?
              @1esha
www.linkedin.com/in/alexeyromanchuk
   alexey.romanchuk@gmail.com
Реализации

         https://github.com/seratch/scalikejdbc
        https://github.com/jbzdak/query-builder
http://amateras.sourceforge.jp/site/mirage/welcome.html

More Related Content

Similar to Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)

Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Ontico
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Oleksii Okhrymenko
 
Есть ли жизнь с ORM или типовая архитектура CRUD приложения
Есть ли жизнь с ORM или типовая архитектура CRUD приложенияЕсть ли жизнь с ORM или типовая архитектура CRUD приложения
Есть ли жизнь с ORM или типовая архитектура CRUD приложенияNicolay Velizhanin
 
Django South. Миграция баз данных.
Django South. Миграция баз данных.  Django South. Миграция баз данных.
Django South. Миграция баз данных. MoscowDjango
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
 
Фофанов Илья - Лучшие практики проектирования и реализации API на C#
Фофанов Илья - Лучшие практики проектирования и реализации API на C#Фофанов Илья - Лучшие практики проектирования и реализации API на C#
Фофанов Илья - Лучшие практики проектирования и реализации API на C#Elias Fofanov
 
Django шахрай. версия 4
Django шахрай. версия 4Django шахрай. версия 4
Django шахрай. версия 4smikler
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf Conference
 
Building corporate portals with liferay JEEConf 2011
Building corporate portals with liferay   JEEConf 2011Building corporate portals with liferay   JEEConf 2011
Building corporate portals with liferay JEEConf 2011Alexey Kakunin
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)Alexander Gornik
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)Andrey Gordienkov
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAndrey Gordienkov
 
Профилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаПрофилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаprivate_face
 
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Ontico
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Ivan Tsyganov
 
Igor Khotin - Domain Specific Languages
Igor Khotin - Domain Specific LanguagesIgor Khotin - Domain Specific Languages
Igor Khotin - Domain Specific LanguagesIgor Khotin
 

Similar to Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии) (20)

Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
Есть ли жизнь с ORM или типовая архитектура CRUD приложения
Есть ли жизнь с ORM или типовая архитектура CRUD приложенияЕсть ли жизнь с ORM или типовая архитектура CRUD приложения
Есть ли жизнь с ORM или типовая архитектура CRUD приложения
 
Django South. Миграция баз данных.
Django South. Миграция баз данных.  Django South. Миграция баз данных.
Django South. Миграция баз данных.
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 
Фофанов Илья - Лучшие практики проектирования и реализации API на C#
Фофанов Илья - Лучшие практики проектирования и реализации API на C#Фофанов Илья - Лучшие практики проектирования и реализации API на C#
Фофанов Илья - Лучшие практики проектирования и реализации API на C#
 
Ci
CiCi
Ci
 
Django шахрай. версия 4
Django шахрай. версия 4Django шахрай. версия 4
Django шахрай. версия 4
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
 
Building corporate portals with liferay JEEConf 2011
Building corporate portals with liferay   JEEConf 2011Building corporate portals with liferay   JEEConf 2011
Building corporate portals with liferay JEEConf 2011
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
idioms C++
idioms C++idioms C++
idioms C++
 
C++ idioms
C++ idiomsC++ idioms
C++ idioms
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design Patterns
 
Профилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаПрофилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кода
 
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
 
Igor Khotin - Domain Specific Languages
Igor Khotin - Domain Specific LanguagesIgor Khotin - Domain Specific Languages
Igor Khotin - Domain Specific Languages
 

More from DevDay

«Bdd и реактивщина в 2ГИС», Евгений Тютюев
«Bdd и реактивщина в 2ГИС», Евгений Тютюев«Bdd и реактивщина в 2ГИС», Евгений Тютюев
«Bdd и реактивщина в 2ГИС», Евгений ТютюевDevDay
 
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий МузюкинDevDay
 
«Я спросил у сервера...», Илья Пастушков
«Я спросил у сервера...», Илья Пастушков«Я спросил у сервера...», Илья Пастушков
«Я спросил у сервера...», Илья ПастушковDevDay
 
Фреймворк Slot, Good Parts, Александр Бирюков
Фреймворк Slot, Good Parts, Александр БирюковФреймворк Slot, Good Parts, Александр Бирюков
Фреймворк Slot, Good Parts, Александр БирюковDevDay
 
Рендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковРендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковDevDay
 
Devops-практики в разработке решений для бизнеса, Максим Пашук
Devops-практики в разработке решений для бизнеса, Максим ПашукDevops-практики в разработке решений для бизнеса, Максим Пашук
Devops-практики в разработке решений для бизнеса, Максим ПашукDevDay
 
Inversion of Control в деталях, Дмитрий Кожевников
Inversion of Control в деталях, Дмитрий КожевниковInversion of Control в деталях, Дмитрий Кожевников
Inversion of Control в деталях, Дмитрий КожевниковDevDay
 
«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин
«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин
«Используем неизменяемые данные и создаем качественный код», Игорь КудринDevDay
 
«Велогосипед», Данил Ильиных
«Велогосипед», Данил Ильиных«Велогосипед», Данил Ильиных
«Велогосипед», Данил ИльиныхDevDay
 
«Процесс создания продукта», Максим Берёзкин
«Процесс создания продукта», Максим Берёзкин«Процесс создания продукта», Максим Берёзкин
«Процесс создания продукта», Максим БерёзкинDevDay
 
«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета Алексеенко«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета АлексеенкоDevDay
 
Манипулятор на Ti Stellaris Launchpad, Лёша Романенко
Манипулятор на Ti Stellaris Launchpad, Лёша РоманенкоМанипулятор на Ti Stellaris Launchpad, Лёша Романенко
Манипулятор на Ti Stellaris Launchpad, Лёша РоманенкоDevDay
 
Лабиринт на Arduino, Вадим Ипполитов
Лабиринт на Arduino, Вадим ИпполитовЛабиринт на Arduino, Вадим Ипполитов
Лабиринт на Arduino, Вадим ИпполитовDevDay
 
«Хоба-хоба и в продакшн», Женя Пономарёв
«Хоба-хоба и в продакшн», Женя Пономарёв«Хоба-хоба и в продакшн», Женя Пономарёв
«Хоба-хоба и в продакшн», Женя ПономарёвDevDay
 
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев «Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев DevDay
 
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...DevDay
 
«Тестируем веб приложения», Павел Сташевский
«Тестируем веб приложения», Павел Сташевский«Тестируем веб приложения», Павел Сташевский
«Тестируем веб приложения», Павел СташевскийDevDay
 
«Открытая веб картография», Илья Таратухин
«Открытая веб картография», Илья Таратухин«Открытая веб картография», Илья Таратухин
«Открытая веб картография», Илья ТаратухинDevDay
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис РечкуновDevDay
 
Матвей Мальков «Ещё один поиск контактов на Android»
Матвей Мальков «Ещё один поиск контактов на Android»Матвей Мальков «Ещё один поиск контактов на Android»
Матвей Мальков «Ещё один поиск контактов на Android»DevDay
 

More from DevDay (20)

«Bdd и реактивщина в 2ГИС», Евгений Тютюев
«Bdd и реактивщина в 2ГИС», Евгений Тютюев«Bdd и реактивщина в 2ГИС», Евгений Тютюев
«Bdd и реактивщина в 2ГИС», Евгений Тютюев
 
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
 
«Я спросил у сервера...», Илья Пастушков
«Я спросил у сервера...», Илья Пастушков«Я спросил у сервера...», Илья Пастушков
«Я спросил у сервера...», Илья Пастушков
 
Фреймворк Slot, Good Parts, Александр Бирюков
Фреймворк Slot, Good Parts, Александр БирюковФреймворк Slot, Good Parts, Александр Бирюков
Фреймворк Slot, Good Parts, Александр Бирюков
 
Рендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковРендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей Солодовников
 
Devops-практики в разработке решений для бизнеса, Максим Пашук
Devops-практики в разработке решений для бизнеса, Максим ПашукDevops-практики в разработке решений для бизнеса, Максим Пашук
Devops-практики в разработке решений для бизнеса, Максим Пашук
 
Inversion of Control в деталях, Дмитрий Кожевников
Inversion of Control в деталях, Дмитрий КожевниковInversion of Control в деталях, Дмитрий Кожевников
Inversion of Control в деталях, Дмитрий Кожевников
 
«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин
«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин
«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин
 
«Велогосипед», Данил Ильиных
«Велогосипед», Данил Ильиных«Велогосипед», Данил Ильиных
«Велогосипед», Данил Ильиных
 
«Процесс создания продукта», Максим Берёзкин
«Процесс создания продукта», Максим Берёзкин«Процесс создания продукта», Максим Берёзкин
«Процесс создания продукта», Максим Берёзкин
 
«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета Алексеенко«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета Алексеенко
 
Манипулятор на Ti Stellaris Launchpad, Лёша Романенко
Манипулятор на Ti Stellaris Launchpad, Лёша РоманенкоМанипулятор на Ti Stellaris Launchpad, Лёша Романенко
Манипулятор на Ti Stellaris Launchpad, Лёша Романенко
 
Лабиринт на Arduino, Вадим Ипполитов
Лабиринт на Arduino, Вадим ИпполитовЛабиринт на Arduino, Вадим Ипполитов
Лабиринт на Arduino, Вадим Ипполитов
 
«Хоба-хоба и в продакшн», Женя Пономарёв
«Хоба-хоба и в продакшн», Женя Пономарёв«Хоба-хоба и в продакшн», Женя Пономарёв
«Хоба-хоба и в продакшн», Женя Пономарёв
 
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев «Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
 
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
 
«Тестируем веб приложения», Павел Сташевский
«Тестируем веб приложения», Павел Сташевский«Тестируем веб приложения», Павел Сташевский
«Тестируем веб приложения», Павел Сташевский
 
«Открытая веб картография», Илья Таратухин
«Открытая веб картография», Илья Таратухин«Открытая веб картография», Илья Таратухин
«Открытая веб картография», Илья Таратухин
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
 
Матвей Мальков «Ещё один поиск контактов на Android»
Матвей Мальков «Ещё один поиск контактов на Android»Матвей Мальков «Ещё один поиск контактов на Android»
Матвей Мальков «Ещё один поиск контактов на Android»
 

Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Романчук (СберБанк Технологии)