Открытый семинар для студентов в компании CUSTIS (29 октября 2015 года).
Лекторы: Денис Гаврилов, архитектор, Денис Чекушин, ведущий разработчик .NET, и Игорь Шаталкин, разработчик .NET.
Аннотация: Очень часто основная деятельность разработчика заключается в автоматизации задач заказчика. Однако в процессе работы и самим программистам нередко приходится сталкиваться с рутиной: писать однотипный код, выполнять похожие операции.
Какие существуют средства автоматизации работы программиста? Зачем использовать ORM, автоформы и иные подобные инструменты? Что такое генерация кода? Как написать плагин для Visual Studio? Где находится предел автоматизации и существует ли он вообще? На семинаре мы ответим на эти вопросы и рассмотрим, как автоматизация применяется в повседневной практике.
Видеозапись семинара: https://vimeo.com/144341441.
Process и Case Management в информационной системе: от автоматизации As Is к ...
Долой рутину из разработки! Автоматизация при создании ПО
1. 29 октября 2015 года
Долой рутину из разработки!
Автоматизация при создании ПО
Архитектор
Денис Гаврилов
Денис Чекушин
Игорь Шаталкин
Ведущий разработчик .NET
Разработчик .NET
2. Творческий путь в CUSTIS
2/175
2010 2011 2012 2013 2014 2015
RMS TechEvol
МРТ Разработка
Диспетчеризация RMS
Развитие
3. Давайте познакомимся: Денис Гаврилов
3/175
Родился, учился, женился, двое детей
Программирую уже лет 20
Из них 12 лет – профессионально
C 2010 года в CUSTIS
5,5 лет, OMG!
4. Трудовой путь в CUSTIS
2010 – ведущий разработчик
в производственном подразделении
2011 – ведущий разработчик в отделе
технологического развития
2013 – руководитель группы
2015 – архитектор
Хорошо, когда в пределах одной компании
можно реализовать все запросы роста!
4/175
5. Отдел технологического развития
Компании уже 19 лет
Почти сразу появился отдел, сфокусированный
на технологизации производства
Я работал в ОТР с 2011 года
Рассказывать буду о том опыте, который
мы накопили за все это время
5/175
6. Давайте познакомимся: Денис Чекушин
Увлекаюсь программированием
В компании СUSTIS с 2012 года
Ведущий разработчик в RMS
6/175
7. Давайте познакомимся: Игорь Шаталкин
Образование – экономическое
Программирование – увлечение с детства
С 2011 года в IT-отрасли
Менеджер по продажам
Программист
Аналитик
Свободное время провожу с семьей,
читаю, играю на пианино
Люблю творческие задачи, стараюсь
автоматизировать то, что часто повторяется
7/175
8. О семинаре
Теоретическая часть – Денис Гаврилов
Примеры – Денис Чекушин
Разработка плагинов
для Visual Studio – Игорь Шаталкин
8/175
11. Из энциклопедии
Рутина – следование заведенному шаблону,
превратившееся в механическую привычку
Рутина – (франц. routine, от route – дорога),
привычные приемы, методы работы,
обычные для данного вида деятельности,
пристрастие к шаблону; боязнь перемен,
застой, косность
11/175
16. План
Теоретическая часть
3 способа убрать рутину
Эффективность и окупаемость
Экономим
Готовые решения?
Примеры
Разработка плагинов для Visual Studio
13/175
25. Еще про инструменты
Специализированный инструмент
позволяет делать быстрее,
но ограничивает область применения
Сложный инструмент повышает
требования к квалификации
Идеальный инструмент делает все
за вас, не требуя квалификации
18/175
30. Из Wikipedia
Автоматизация позволяет:
повысить производительность труда
улучшить качество продукции
оптимизировать процессы управления
отстранить человека от производств,
опасных для здоровья
21/175
31. Автоматизация vs инструмент
Практически всегда автоматизация
более выгодна, чем инструмент
Но не все можно автоматизировать
Автоматизация (за исключением
простейших случаев) требует
комплексного, системного подхода
к решению задачи
22/175
32. Человек и автомат
Роль человека заключается в:
подготовке исходных данных
выборе алгоритма (метода решения)
анализе полученных результатов
23/175
46. Третий способ убрать рутину
Просто ее не делать
Взять готовое
Делегировать тому, кто сделает лучше;
что для одного – рутина, для другого
может быть интересной работой
34/175
48. План
Теоретическая часть
3 способа убрать рутину
Эффективность и окупаемость
Экономим
Готовые решения?
Примеры
Разработка плагинов для Visual Studio
36/175
52. Как найти рутину?
Проанализировать свою работу
Найти повторяемое
Применить «критерий автоматизируемости»
Автоматизировать
Инструментализировать
38/175
53. С какой рутиной бороться
в первую очередь?
С той, которой больше
С той, которую проще устранить
С устранением которой все согласны
39/175
62. Окупаемость
Затраты на рутину – Sр
Затраты на устранение рутины – Sу
Если Sр > Sy, то…
42/175
63. Окупаемость
Затраты на рутину – Sр
Затраты на устранение рутины – Sу
Если Sр > Sy, то…
…бежим устранять?
42/175
64. Все немного сложнее
Погрешность оценки устранения
Стоимость на ПЖЦ
Побочные затраты
Неожиданные профиты
43/175
65. Погрешность оценки
Стоимость рутины мы оценили точно,
поскольку цифры уже есть
Стоимость устранения оцениваем
предположительно
Sр > Sу * «пи»
44/175
66. Стоимость «владения»
На каком временном промежутке
мы оценивали Sр?
Стоимость эксплуатации инструмента Sэ
Sр(t) > Sу * «пи» + Sэ(t)
45/175
67. Побочные затраты
Обучение
Инструментом нужно суметь овладеть
Нерыночный инструмент может
вызывать отторжение
46/175
68. Побочные затраты
Вывод из эксплуатации
Появился другой, более подходящий инструмент
В уже готовых частях продукта
может потребоваться замена
старого инструмента на новый
47/175
69. Неожиданные профиты
Комфорт от использования – повышение
мотивации
Повышение эффективности позволяет
решать задачу командой меньшего
размера – побочные расходы
на совместную работу становятся меньше
Высокая эффективность – ниже «прайс»,
больше заказов
48/175
71. Окупаемость. Итог
Итак, оценить окупаемость устранения рутины не так просто
В формулу входят параметры, которые почти невозможно
посчитать, можно только предположить
49/175
72. Окупаемость. Итог
Итак, оценить окупаемость устранения рутины не так просто
В формулу входят параметры, которые почти невозможно
посчитать, можно только предположить
Решение об устранении рутины – предпринимательское
49/175
73. Окупаемость. Итог
Итак, оценить окупаемость устранения рутины не так просто
В формулу входят параметры, которые почти невозможно
посчитать, можно только предположить
Решение об устранении рутины – предпринимательское
Готовое решение дать невозможно, однако в конкретной
ситуации вы можете оценить риски и выгоды
49/175
74. Окупаемость. Итог
Итак, оценить окупаемость устранения рутины не так просто
В формулу входят параметры, которые почти невозможно
посчитать, можно только предположить
Решение об устранении рутины – предпринимательское
Готовое решение дать невозможно, однако в конкретной
ситуации вы можете оценить риски и выгоды
Но… Если устранение на порядки дешевле самой рутины,
другие параметры уже не так важны
49/175
77. Окупаемость. Совсем итог
Рутину можно и нужно устранять
Но не всю
И это должно быть «командным» действием
50/175
78. План
Теоретическая часть
3 способа убрать рутину
Эффективность и окупаемость
Экономим
Готовые решения?
Примеры
Разработка плагинов для Visual Studio
51/175
81. Модульность
Модульность – это свойство системы, связанное
с возможностью ее декомпозиции на ряд
внутренне связанных между собой модулей
Модульность устройства – способность
устройства изменять свои возможности путем
использования функциональных блоков,
выполняющих различные задачи
54/175
82. IBM PC
Фирма IBM не придавала большого значения
персональным компьютерам, поэтому
в IBM PC было использовано много «чужих»
компонентов – одним из их ключевых решений
было использование разработок сторонних
производителей
Это одновременно экономило множество средств
и времени на собственные научные кадры
55/175
83. IBM PC. Ключевые технологии
Системная шина ISA со стандартными слотами,
позволяющая вставлять в компьютер разнообразные платы
расширения (видео-, звуковые, сетевые и прочие адаптеры)
BIOS – набор системных функций, позволяющий
разработчику ПО абстрагироваться от деталей работы
аппаратуры и не зависеть от конкретной конфигурации
системы (до этого все ПО разрабатывалось только
под конкретные машины и поставлялось вместе с ними)
Стандартный слот для процессора
Стандартный слот для ОЗУ
Стандартные интерфейсы подключения FDD и HDD
56/175
84. Что позволит модульность?
Уменьшить стоимость эксплуатации
Дешевле модернизировать компоненты,
так как изменения не затронут другие
части системы
Уменьшить стоимость вывода из эксплуатации
Дешевле заменять устаревшие компоненты
на более новые
57/175
93. Пример
Гоночный автомобиль
Хорош на треке
Непрактичен в жизни
Мешок картошки не увезешь
Средний «семейный» автомобиль
Плох на треке
Не «Газель»
Но сносно решает широкий круг задач
61/175
95. Два способа организации «пирамиды»
На каждом «слое» свой набор инструментов
Инструменты более высокого уровня
базируются на предыдущем уровне
63/175
96. Пример второго способа – UI
Средства отрисовки графики
Простые контролы
Специфичные для проекта контролы
Автоформы
64/175
97. Пример – модель OSI
65/175
OSI Model
Layer Data unit Examples
Host
layers
7. Application
Data
HTTP, FTP, SMTP, SSH, TELNET
6. Presentation HTML, CSS, GIF
5. Session RPC, PAP, SSL, SQL
4. Transport
Segments/
Datagram
TCP, UDP, NETBEUI
Media
layers
3. Network Packet IPv4, IPv6, IPsec, AppleTalk, ICMP
2. Data link Frame PPP, IEEE 802.2, L2TP, MAC, LLDP
1. Physical Bit
Ethernet physical
layer, DSL, USB, ISDN, DOCSIS
98. Пример – наследование в ООП
Каждый новый наследник класса
использует весь функционал предка
Но сам более специфичен
66/175
102. План
Теоретическая часть
3 способа убрать рутину
Эффективность и окупаемость
Экономим
Готовые решения?
Примеры
Разработка плагинов для Visual Studio
70/175
103. Готовое дешевле
Готовое решение
Фаза «создание» заменяется на «выбор»,
что дешевле
Фаза «эксплуатация» дешевле,
так как распределяется на все сообщество
71/175
104. Свое – это очень дорого
Делать решение «по месту» – риск,
что больше не пригодится
Делать универсальное – дополнительные
затраты на аналитику всех областей
применимости
В готовом и это тоже проделано за нас
72/175
105. Как понять – брать чужое
или делать свое?
Определить зрелость экосистемы
Определить специфичность задачи
73/175
109. Устоявшаяся экосистема
Все типовые задачи, скорее всего,
уже решены
Есть множество разных библиотек
Наш опыт (CUSTIS) и наши примеры
из устоявшихся экосистем
77/175
113. Как выбирать внешнее
Сравнение по критериям
Точнее описать рутину, которую убираем
(область использования будущего инструмента)
Собрать список конкурентов
Определить важные критерии
Проверить, возможно ли сделать тестовые
приложения (сценарии)
Отсеять тех, кто не прошел
Среди тех, кто остался, произвести
экспертный выбор
80/175
114. Правила хорошего тона при работе
с внешними библиотеками
Читать документацию
Понять, как правильно использовать инструмент
Репортить баги
Отправлять правки
Обмениваться опытом
81/175
115. Сделать свое общим
Выложить исходники на GitHub
Опубликовать в NuGet или репозитории
инструментов и расширений
Сообщество разделит с вами бремя поддержки
PR
82/175
116. Итог: ключевые слова
Повторяющееся
Инструмент, автоматизация, не делать
Эффективность, окупаемость
Используем готовое, если возможно
83/175
117. План
Теоретическая часть
Примеры
Трансформации
Построение типового UI
Шаблоны файлов и проектов
Hot Keys
Разработка плагинов для Visual Studio
84/175
120. Трансформации – это рутина
Трансформация – это то,
что хорошо автоматизируется
Четко описаны входные и выходные данные
Сам процесс хорошо формализован
87/175
131. Примеры кодогенерации
Динамические HTML-страницы ASP.NET
Шаблоны файлов и проектов в Visual Studio
ServiceReference в Visual Studio
Визуальный редактор форм в Visual Studio
Создание таблиц через мастер в SQL Server
Management Studio
97/175
143. Шаблоны Т4
T4 = Text Template Transformation Toolkit
Это инструмент генерации кода
на основе шаблонов
Позволяет писать логику шаблона
на C# или VB.NET
Позволяет генерировать все виды
текстовой информации (артефакты)
Шаблоны могут быть переиспользуемыми
(наследование, включение)
102/175
147. Текст шаблона
Шаблон результирующего файла
Задает структуру результата
Обычный текст
105/175
148. Управляющий код
Реализует логику работы шаблона
Три основные конструкции
<# … #> – стандартный блок
<#= … #> – блок выражений
<#+ … #> – может содержать поля, свойства, методы и классы
106/175
156. Основные ресурсы по T4
Семинар Павла Музыки:
http://vk.com/topic-52018779_31928178
Architecture of Text Templates:
https://msdn.microsoft.com/en-us/library/bb126261
Code Generation and T4 Text Templates
Oleg Sych blog: http://www.olegsych.com/
http://stackoverflow.com/search?q=T4
https://www.google.ru/#q=T4
Строго типизированный линк ASP.NET MVC: T4MVC
110/175
157. План
Теоретическая часть
Примеры
Трансформации
Построение типового UI
Шаблоны файлов и проектов
Hot Keys
Разработка плагинов для Visual Studio
111/175
162. План
Теоретическая часть
Примеры
Трансформации
Построение типового UI
Шаблоны файлов и проектов
Hot Keys
Разработка плагинов для Visual Studio
116/175
167. Snippet Результат
class class MyClass { … }
cw Console.WriteLine();
for for (int i = 0; i < UPPER; i++) {…}
foreach foreach (var I in arr) { … }
switch switch (@enum) { … }
try try { … } catch
if if (b) { … }
Code Snippets, включенные в Visual Studio
119/175
Visual C# Code Snippets
180. Создание нового проекта – рутина
1. Создать проект (Add → NewProject… →)
2. Включить файл ProductInfo.cs
из корня Solution
3. Редактировать *.proj-файл…
4. Отредактировать AssemblyInfo.cs
5. Добавить файл VersionInfo.cs
6. Добавить признак компиляции
7. В .csproj-файле выставить
<OutputPath> в bin
8. И так далее
129/175
181. Шаблоны проектов Visual Studio
Создаем шаблон
Устанавливаем шаблон в Visual Studio
Создаем проекты по шаблону Add →
NewProject → «Мой шаблон для проектов»
130/175
182. Создание шаблона проекта
131/175
Добавляем проект С# ProjectTemplate
Описываем метаданные шаблона
Добавляем шаблон проекта (.csproj)
189. Основные ресурсы по шаблонам
How to: Create a Basic Code Snippet
Snippet Designer
ReSharper Code Templates
How to create Visual Studio project templates
How to: Create Item Templates
137/175
190. План
Теоретическая часть
Примеры
Трансформации
Построение типового UI
Шаблоны файлов и проектов
Hot Keys
Разработка плагинов для Visual Studio
138/175
193. План
Теоретическая часть
Примеры
Разработка плагинов для Visual Studio
Возможности и ограничения
Создание команд
Объектная модель автоматизации
Хранение настроек
Инструментальные окна
141/175
195. Способы автоматизации сред
для программирования
Макросы
Запись событий клавиатуры
и (реже) нажатий мыши
Автоматизация простых действий
Расширения
(= плагины, подключаемые модули)
Компилируются
Можно скачать из «Галереи расширений»
Внешние процессы
AutoIt
143/175
196. Сравнение сред для программирования
Среда Макросы Расширения Галерея
расширений
Интегрированные среды разработки
IntelliJ IDEA Да Да Да
NetBeans IDE Да Да Да
Eclipse Да (как расширение) Да Да
Visual Studio Да (как расширение) Да Да
Продвинутые блокноты
Notepad++ Да Да Wiki-статья
VIM Да Да Wiki-статья
144/175
197. Что можно расширять в Visual Studio?
Кнопки в меню и на панелях инструментов
Инструментальные окна
Поддержка новых языков программирования
Поддержка новых типов проектов и документов
145/175
198. Что можно расширять в Visual Studio?
Кнопки в меню и на панелях инструментов
Инструментальные окна
Поддержка новых языков программирования
Поддержка новых типов проектов и документов
145/175
199. Требования для разработки расширений
Visual Studio
2005–2013 Professional
2015 Community
Visual Studio SDK
DreamSpark – пакет для студентов
BizSpark – пакет для стартапов
146/175
200. План
Теоретическая часть
Примеры
Разработка плагинов для Visual Studio
Возможности и ограничения
Создание команд
Объектная модель автоматизации
Хранение настроек
Инструментальные окна
147/175
201. Команда
Пункт меню
Кнопка на панели инструментов
Дополнительные способы вызова
Через CommandWindow
Через командную строку
Из другого расширения
148/175
202. Пример 1
Разработать расширение, которое позволит
копировать выделенный в редакторе текст
с информацией о его местоположении
149/175
CTRL + SHIFT + C
ExtendedCopier.CopySelectionWithLocation:14: var
activeDocument = dte.ActiveDocument;
204. Внутри проекта автоматизации
Как переместить команду в другое меню,
задать ей новое имя или поменять картинку?
Где писать обработчик команды?
151/175
205. Таблицы команд
Задают параметры команд
Подпись
Картинка
Положение в меню
Параметры видимости
Быстрые клавиши
И так далее
По форме: XML
Расширение: vsct
152/175
206. Таблицы команд. Структура
Commands
Buttons
Bitmaps
CommandPlacements
Стандартные меню Visual Studio
KeyBindings
Symbols
Есть и другие части
153/175
207. Пакетный класс
Атрибуты
Регистрируют расширение
Метод Initialize
Инициализирует расширение
Связывает команду
и ее обработчик
154/175
208. План
Теоретическая часть
Примеры
Разработка плагинов для Visual Studio
Возможности и ограничения
Создание команд
Объектная модель автоматизации
Хранение настроек
Инструментальные окна
155/175
209. Объектная модель автоматизации
Visual Studio
API для взаимодействия с Visual Studio
Откуда можно взаимодействовать
Из расширения
Из внешнего процесса
Модель может быть расширена за счет
пользовательского расширения самой
Visual Studio
156/175
212. Доступ к объектной модели
автоматизации
Из пакетного класса
var dte = (DTE2)GetService(typeof(SDTE));
Из внешнего процесса
Подробности (раздел «Независимый
внешний процесс»)
158/175
213. План
Теоретическая часть
Примеры
Разработка плагинов для Visual Studio
Возможности и ограничения
Создание команд
Объектная модель автоматизации
Хранение настроек
Инструментальные окна
159/175
214. Пример 2
Дать возможность пользователю настраивать
формат, в котором информация копируется
в буфер обмена
160/175
215. Пример 2
Дать возможность пользователю настраивать
формат, в котором информация копируется
в буфер обмена
160/175
ExtendedCopier.CopySelectionWithLocation:24: var
fileName = activeDocument.Name
216. Пример 2
Дать возможность пользователю настраивать
формат, в котором информация копируется
в буфер обмена
160/175
ExtendedCopier.CopySelectionWithLocation:24: var
fileName = activeDocument.Name
ExtendedCopier.CopySelectionWithLocation, 24
var fileName = activeDocument.Name
217. Пример 2
Дать возможность пользователю настраивать
формат, в котором информация копируется
в буфер обмена
160/175
ExtendedCopier.CopySelectionWithLocation:24: var
fileName = activeDocument.Name
ExtendedCopier.CopySelectionWithLocation, 24
var fileName = activeDocument.Name
ExtendedCopier, 24: var fileName =
activeDocument.Name
218. Интеграция в общие настройки
Visual Studio
Класс-наследник DialogPage
Настройки задаются через свойства
[DisplayName] – название настройки
[Description] – описание настройки
[ProvideOptionPage]
Указывает тип класса, через который
задаются настройки
Дополнительная информация
161/175
219. Получение настроек
Из пакетного класса
var options = (Options)GetDialogPage(typeof(Options));
162/175
220. План
Теоретическая часть
Примеры
Разработка плагинов для Visual Studio
Возможности и ограничения
Создание команд
Объектная модель автоматизации
Хранение настроек
Инструментальные окна
163/175
225. Внутри проекта автоматизации
Как переместить окно в другое меню,
задать ему новое имя или картинку?
Где разрабатывать внешний вид окна?
Как получить доступ к DTE?
167/175
226. Отображение окна
Пункт меню настраивается
через таблицу команд
Регистрируем окно в пакетном классе
В обработчике команды показываем окно
168/175
227. Внешний вид и поведение окна
Окно
Наследник ToolWindowPane
Внутри – WPF-контрол
Лучшие практики разработки WPF
169/175
228. Доступ к DTE
Передаем в конструктор контрола окно
Используем окно для получения DTE
var dte = (DTE2)_serviceProvider.GetService(typeof(SDTE));
170/175
229. О чем не поговорили?
Расширения для других сред программирования
Расширения для Visual Studio,
отличные от VSPackage
Доступность и видимость команд
Поддержка новых языков программирования,
новых типов проектов и пр.
Публикация расширений в галерее
171/175
230. Ссылки
Visual Studio SDK
Руководство по разработке модулей расширений
на C#
Extending Visual Studio 2013
Visual Studio 2010 Package Development
Fundamentals
Расширения с семинара
Исходный код
Copy with Location
Batch Replace
172/175
231. Семинары
В. Муравлев
«Разработка Enterprise-приложения
на основе Spring Framework: собираем
конструктор»
П. Музыка
«Реальная кодогенерация
с использованием T4-шаблонов»
С. Кошель
«Грязная магия Java»
173/175
232. Итоги
Что такое рутина и как с ней бороться
Автоматизируйте работу с умом
Ресурсы на автоматизацию и поддержку
Готовые решения
Модульность
Широта охвата и эффективность
Примеры
Трансформация
Метаданные
Шаблоны кода
Свои расширения
174/175