Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Долой рутину из разработки! Автоматизация при с...

CUSTIS
October 29, 2015

Долой рутину из разработки! Автоматизация при создании ПО

Открытый семинар для студентов в компании CUSTIS (29 октября 2015 года).
Лекторы: Денис Гаврилов, архитектор, Денис Чекушин, ведущий разработчик .NET, и Игорь Шаталкин, разработчик .NET.

CUSTIS

October 29, 2015
Tweet

More Decks by CUSTIS

Other Decks in Programming

Transcript

  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. Давайте познакомимся: Игорь Шаталкин  Образование – экономическое  Программирование

    – увлечение с детства  С 2011 года в IT-отрасли  Менеджер по продажам  Программист  Аналитик  Свободное время провожу с семьей, читаю, играю на пианино  Люблю творческие задачи, стараюсь автоматизировать то, что часто повторяется 7/175
  7. О семинаре  Теоретическая часть – Денис Гаврилов  Примеры

    – Денис Чекушин  Разработка плагинов для Visual Studio – Игорь Шаталкин 8/175
  8. Рутина – это…  Монотонное  Повторяемое  Скучное 

    Занудное  Обыденное  Застойное  Однообразное  … 10/175
  9. Из энциклопедии  Рутина – следование заведенному шаблону, превратившееся в

    механическую привычку  Рутина – (франц. routine, от route – дорога), привычные приемы, методы работы, обычные для данного вида деятельности, пристрастие к шаблону; боязнь перемен, застой, косность 11/175
  10. План  Теоретическая часть  3 способа убрать рутину 

    Эффективность и окупаемость  Экономим  Готовые решения?  Примеры  Разработка плагинов для Visual Studio 13/175
  11. Инструмент  Нужен человек, чтобы пользоваться  Не избавляет нас

    от рутины совсем, но позволяет делать ее быстрее 15/175
  12. Еще про инструменты  Специализированный инструмент позволяет делать быстрее, но

    ограничивает область применения  Сложный инструмент повышает требования к квалификации  Идеальный инструмент делает все за вас, не требуя квалификации 18/175
  13. Из Wikipedia  Автоматизация позволяет:  повысить производительность труда 

    улучшить качество продукции  оптимизировать процессы управления  отстранить человека от производств, опасных для здоровья 21/175
  14. Автоматизация vs инструмент  Практически всегда автоматизация более выгодна, чем

    инструмент  Но не все можно автоматизировать  Автоматизация (за исключением простейших случаев) требует комплексного, системного подхода к решению задачи 22/175
  15. Человек и автомат  Роль человека заключается в:  подготовке

    исходных данных  выборе алгоритма (метода решения)  анализе полученных результатов 23/175
  16. Третий способ убрать рутину  Просто ее не делать 

    Взять готовое  Делегировать тому, кто сделает лучше; что для одного – рутина, для другого может быть интересной работой 34/175
  17. План  Теоретическая часть  3 способа убрать рутину 

    Эффективность и окупаемость  Экономим  Готовые решения?  Примеры  Разработка плагинов для Visual Studio 36/175
  18. Как найти рутину?  Проанализировать свою работу  Найти повторяемое

     Применить «критерий автоматизируемости»  Автоматизировать  Инструментализировать 38/175
  19. С какой рутиной бороться в первую очередь?  С той,

    которой больше  С той, которую проще устранить  С устранением которой все согласны 39/175
  20. Единообразие  Одинаковые проблемы нужно решать одинаковым способом  Иначе

     Обучение  Переделывание  Затраты на поддержку – вот это все 41/175
  21. Окупаемость  Затраты на рутину – Sр  Затраты на

    устранение рутины – Sу  Если Sр > Sy, то… 42/175
  22. Окупаемость  Затраты на рутину – Sр  Затраты на

    устранение рутины – Sу  Если Sр > Sy, то…  …бежим устранять? 42/175
  23. Все немного сложнее  Погрешность оценки устранения  Стоимость на

    ПЖЦ  Побочные затраты  Неожиданные профиты 43/175
  24. Погрешность оценки  Стоимость рутины мы оценили точно, поскольку цифры

    уже есть  Стоимость устранения оцениваем предположительно  Sр > Sу * «пи» 44/175
  25. Стоимость «владения»  На каком временном промежутке мы оценивали Sр?

     Стоимость эксплуатации инструмента Sэ  Sр(t) > Sу * «пи» + Sэ(t) 45/175
  26. Побочные затраты  Обучение  Инструментом нужно суметь овладеть 

    Нерыночный инструмент может вызывать отторжение 46/175
  27. Побочные затраты  Вывод из эксплуатации  Появился другой, более

    подходящий инструмент  В уже готовых частях продукта может потребоваться замена старого инструмента на новый 47/175
  28. Неожиданные профиты  Комфорт от использования – повышение мотивации 

    Повышение эффективности позволяет решать задачу командой меньшего размера – побочные расходы на совместную работу становятся меньше  Высокая эффективность – ниже «прайс», больше заказов 48/175
  29. Окупаемость. Итог  Итак, оценить окупаемость устранения рутины не так

    просто  В формулу входят параметры, которые почти невозможно посчитать, можно только предположить 49/175
  30. Окупаемость. Итог  Итак, оценить окупаемость устранения рутины не так

    просто  В формулу входят параметры, которые почти невозможно посчитать, можно только предположить  Решение об устранении рутины – предпринимательское 49/175
  31. Окупаемость. Итог  Итак, оценить окупаемость устранения рутины не так

    просто  В формулу входят параметры, которые почти невозможно посчитать, можно только предположить  Решение об устранении рутины – предпринимательское  Готовое решение дать невозможно, однако в конкретной ситуации вы можете оценить риски и выгоды 49/175
  32. Окупаемость. Итог  Итак, оценить окупаемость устранения рутины не так

    просто  В формулу входят параметры, которые почти невозможно посчитать, можно только предположить  Решение об устранении рутины – предпринимательское  Готовое решение дать невозможно, однако в конкретной ситуации вы можете оценить риски и выгоды  Но… Если устранение на порядки дешевле самой рутины, другие параметры уже не так важны 49/175
  33. Окупаемость. Совсем итог  Рутину можно и нужно устранять 

    Но не всю   И это должно быть «командным» действием 50/175
  34. План  Теоретическая часть  3 способа убрать рутину 

    Эффективность и окупаемость  Экономим  Готовые решения?  Примеры  Разработка плагинов для Visual Studio 51/175
  35. Модульность  Модульность – это свойство системы, связанное с возможностью

    ее декомпозиции на ряд внутренне связанных между собой модулей  Модульность устройства – способность устройства изменять свои возможности путем использования функциональных блоков, выполняющих различные задачи 54/175
  36. IBM PC  Фирма IBM не придавала большого значения персональным

    компьютерам, поэтому в IBM PC было использовано много «чужих» компонентов – одним из их ключевых решений было использование разработок сторонних производителей  Это одновременно экономило множество средств и времени на собственные научные кадры 55/175
  37. IBM PC. Ключевые технологии  Системная шина ISA со стандартными

    слотами, позволяющая вставлять в компьютер разнообразные платы расширения (видео-, звуковые, сетевые и прочие адаптеры)  BIOS – набор системных функций, позволяющий разработчику ПО абстрагироваться от деталей работы аппаратуры и не зависеть от конкретной конфигурации системы (до этого все ПО разрабатывалось только под конкретные машины и поставлялось вместе с ними)  Стандартный слот для процессора  Стандартный слот для ОЗУ  Стандартные интерфейсы подключения FDD и HDD 56/175
  38. Что позволит модульность?  Уменьшить стоимость эксплуатации  Дешевле модернизировать

    компоненты, так как изменения не затронут другие части системы  Уменьшить стоимость вывода из эксплуатации  Дешевле заменять устаревшие компоненты на более новые 57/175
  39. Пример модульности  Нам не нужно иметь две разных дрели

    для отверстий «на 8» и «на 10»  Просто меняем «модульные» сверла 58/175
  40. Пример  Гоночный автомобиль  Хорош на треке  Непрактичен

    в жизни  Мешок картошки не увезешь 61/175
  41. Пример  Гоночный автомобиль  Хорош на треке  Непрактичен

    в жизни  Мешок картошки не увезешь  Средний «семейный» автомобиль  Плох на треке  Не «Газель»  Но сносно решает широкий круг задач 61/175
  42. Два способа организации «пирамиды»  На каждом «слое» свой набор

    инструментов  Инструменты более высокого уровня базируются на предыдущем уровне 63/175
  43. Пример второго способа – UI  Средства отрисовки графики 

    Простые контролы  Специфичные для проекта контролы  Автоформы 64/175
  44. Пример – модель 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
  45. Пример – наследование в ООП  Каждый новый наследник класса

    использует весь функционал предка  Но сам более специфичен 66/175
  46. Плохой пример  Были в нашей практике  Но признаться

    стыдно   Больше так не делаем! 68/175
  47. План  Теоретическая часть  3 способа убрать рутину 

    Эффективность и окупаемость  Экономим  Готовые решения?  Примеры  Разработка плагинов для Visual Studio 70/175
  48. Готовое дешевле  Готовое решение  Фаза «создание» заменяется на

    «выбор», что дешевле  Фаза «эксплуатация» дешевле, так как распределяется на все сообщество 71/175
  49. Свое – это очень дорого  Делать решение «по месту»

    – риск, что больше не пригодится  Делать универсальное – дополнительные затраты на аналитику всех областей применимости  В готовом и это тоже проделано за нас 72/175
  50. Как понять – брать чужое или делать свое?  Определить

    зрелость экосистемы  Определить специфичность задачи 73/175
  51. Устоявшаяся экосистема  Все типовые задачи, скорее всего, уже решены

     Есть множество разных библиотек  Наш опыт (CUSTIS) и наши примеры из устоявшихся экосистем 77/175
  52. Как выбирать внешнее  Сравнение по критериям  Точнее описать

    рутину, которую убираем (область использования будущего инструмента)  Собрать список конкурентов  Определить важные критерии  Проверить, возможно ли сделать тестовые приложения (сценарии)  Отсеять тех, кто не прошел  Среди тех, кто остался, произвести экспертный выбор 80/175
  53. Правила хорошего тона при работе с внешними библиотеками  Читать

    документацию  Понять, как правильно использовать инструмент  Репортить баги  Отправлять правки  Обмениваться опытом 81/175
  54. Сделать свое общим  Выложить исходники на GitHub  Опубликовать

    в NuGet или репозитории инструментов и расширений  Сообщество разделит с вами бремя поддержки  PR 82/175
  55. Итог: ключевые слова  Повторяющееся  Инструмент, автоматизация, не делать

     Эффективность, окупаемость  Используем готовое, если возможно 83/175
  56. План  Теоретическая часть  Примеры  Трансформации  Построение

    типового UI  Шаблоны файлов и проектов  Hot Keys  Разработка плагинов для Visual Studio 84/175
  57. Layers & Tiers 85/175 GUI ViewModel КСВ Прикладная логика БД

    БД Сервер Клиент Трансформации Слои DAL Звенья
  58. Трансформации – это рутина  Трансформация – это то, что

    хорошо автоматизируется  Четко описаны входные и выходные данные  Сам процесс хорошо формализован 87/175
  59. Примеры кодогенерации  Динамические HTML-страницы ASP.NET  Шаблоны файлов и

    проектов в Visual Studio  ServiceReference в Visual Studio  Визуальный редактор форм в Visual Studio  Создание таблиц через мастер в SQL Server Management Studio 97/175
  60. Шаблоны Т4  T4 = Text Template Transformation Toolkit 

    Это инструмент генерации кода на основе шаблонов  Позволяет писать логику шаблона на C# или VB.NET  Позволяет генерировать все виды текстовой информации (артефакты)  Шаблоны могут быть переиспользуемыми (наследование, включение) 102/175
  61. Директивы  Объявляются конструкцией <#@ … #>  Задают параметры

    шаблона  Управляют выполнением шаблона 104175
  62. Управляющий код  Реализует логику работы шаблона  Три основные

    конструкции <# … #> – стандартный блок <#= … #> – блок выражений <#+ … #> – может содержать поля, свойства, методы и классы 106/175
  63. Основные ресурсы по 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
  64. План  Теоретическая часть  Примеры  Трансформации  Построение

    типового UI  Шаблоны файлов и проектов  Hot Keys  Разработка плагинов для Visual Studio 111/175
  65. Автоматизация через автоформы  Автоформы экономят время разработки  Предоставляют

    инструмент прототипирования  Унифицируют интерфейсы 114/175
  66. План  Теоретическая часть  Примеры  Трансформации  Построение

    типового UI  Шаблоны файлов и проектов  Hot Keys  Разработка плагинов для Visual Studio 116/175
  67. 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
  68. Подключение Code Snippets в Visual Studio  Пункт меню TOOLS

     Code Snippets Manager  Import → Выбираем TestCodeSnippet.snippet  Используем! 122/175
  69. Создание нового проекта – рутина 1. Создать проект (Add →

    NewProject… →) 2. Включить файл ProductInfo.cs из корня Solution 3. Редактировать *.proj-файл… 4. Отредактировать AssemblyInfo.cs 5. Добавить файл VersionInfo.cs 6. Добавить признак компиляции 7. В .csproj-файле выставить <OutputPath> в bin\ 8. И так далее 129/175
  70. Шаблоны проектов Visual Studio  Создаем шаблон  Устанавливаем шаблон

    в Visual Studio  Создаем проекты по шаблону Add → NewProject → «Мой шаблон для проектов» 130/175
  71. Создание шаблона проекта 131/175  Добавляем проект С# ProjectTemplate 

    Описываем метаданные шаблона  Добавляем шаблон проекта (.csproj)
  72. Основные ресурсы по шаблонам  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
  73. План  Теоретическая часть  Примеры  Трансформации  Построение

    типового UI  Шаблоны файлов и проектов  Hot Keys  Разработка плагинов для Visual Studio 138/175
  74. План  Теоретическая часть  Примеры  Разработка плагинов для

    Visual Studio  Возможности и ограничения  Создание команд  Объектная модель автоматизации  Хранение настроек  Инструментальные окна 141/175
  75. Способы автоматизации сред для программирования  Макросы  Запись событий

    клавиатуры и (реже) нажатий мыши  Автоматизация простых действий  Расширения (= плагины, подключаемые модули)  Компилируются  Можно скачать из «Галереи расширений»  Внешние процессы  AutoIt 143/175
  76. Сравнение сред для программирования Среда Макросы Расширения Галерея расширений Интегрированные

    среды разработки IntelliJ IDEA Да Да Да NetBeans IDE Да Да Да Eclipse Да (как расширение) Да Да Visual Studio Да (как расширение) Да Да Продвинутые блокноты Notepad++ Да Да Wiki-статья VIM Да Да Wiki-статья 144/175
  77. Что можно расширять в Visual Studio?  Кнопки в меню

    и на панелях инструментов  Инструментальные окна  Поддержка новых языков программирования  Поддержка новых типов проектов и документов 145/175
  78. Что можно расширять в Visual Studio?  Кнопки в меню

    и на панелях инструментов  Инструментальные окна  Поддержка новых языков программирования  Поддержка новых типов проектов и документов 145/175
  79. Требования для разработки расширений  Visual Studio  2005–2013 Professional

     2015 Community  Visual Studio SDK  DreamSpark – пакет для студентов  BizSpark – пакет для стартапов 146/175
  80. План  Теоретическая часть  Примеры  Разработка плагинов для

    Visual Studio  Возможности и ограничения  Создание команд  Объектная модель автоматизации  Хранение настроек  Инструментальные окна 147/175
  81. Команда  Пункт меню  Кнопка на панели инструментов 

    Дополнительные способы вызова  Через CommandWindow  Через командную строку  Из другого расширения 148/175
  82. Пример 1  Разработать расширение, которое позволит копировать выделенный в

    редакторе текст с информацией о его местоположении 149/175 CTRL + SHIFT + C ExtendedCopier.CopySelectionWithLocation:14: var activeDocument = dte.ActiveDocument;
  83. Внутри проекта автоматизации  Как переместить команду в другое меню,

    задать ей новое имя или поменять картинку?  Где писать обработчик команды? 151/175
  84. Таблицы команд  Задают параметры команд  Подпись  Картинка

     Положение в меню  Параметры видимости  Быстрые клавиши  И так далее  По форме: XML  Расширение: vsct 152/175
  85. Таблицы команд. Структура  Commands  Buttons  Bitmaps 

    CommandPlacements  Стандартные меню Visual Studio  KeyBindings  Symbols  Есть и другие части 153/175
  86. Пакетный класс  Атрибуты  Регистрируют расширение  Метод Initialize

     Инициализирует расширение  Связывает команду и ее обработчик 154/175
  87. План  Теоретическая часть  Примеры  Разработка плагинов для

    Visual Studio  Возможности и ограничения  Создание команд  Объектная модель автоматизации  Хранение настроек  Инструментальные окна 155/175
  88. Объектная модель автоматизации Visual Studio  API для взаимодействия с

    Visual Studio  Откуда можно взаимодействовать  Из расширения  Из внешнего процесса  Модель может быть расширена за счет пользовательского расширения самой Visual Studio 156/175
  89. Доступ к объектной модели автоматизации  Из пакетного класса 

    var dte = (DTE2)GetService(typeof(SDTE));  Из внешнего процесса  Подробности (раздел «Независимый внешний процесс») 158/175
  90. План  Теоретическая часть  Примеры  Разработка плагинов для

    Visual Studio  Возможности и ограничения  Создание команд  Объектная модель автоматизации  Хранение настроек  Инструментальные окна 159/175
  91. Пример 2  Дать возможность пользователю настраивать формат, в котором

    информация копируется в буфер обмена 160/175 ExtendedCopier.CopySelectionWithLocation:24: var fileName = activeDocument.Name
  92. Пример 2  Дать возможность пользователю настраивать формат, в котором

    информация копируется в буфер обмена 160/175 ExtendedCopier.CopySelectionWithLocation:24: var fileName = activeDocument.Name ExtendedCopier.CopySelectionWithLocation, 24 var fileName = activeDocument.Name
  93. Пример 2  Дать возможность пользователю настраивать формат, в котором

    информация копируется в буфер обмена 160/175 ExtendedCopier.CopySelectionWithLocation:24: var fileName = activeDocument.Name ExtendedCopier.CopySelectionWithLocation, 24 var fileName = activeDocument.Name ExtendedCopier, 24: var fileName = activeDocument.Name
  94. Интеграция в общие настройки Visual Studio  Класс-наследник DialogPage 

    Настройки задаются через свойства  [DisplayName] – название настройки  [Description] – описание настройки  [ProvideOptionPage]  Указывает тип класса, через который задаются настройки  Дополнительная информация 161/175
  95. План  Теоретическая часть  Примеры  Разработка плагинов для

    Visual Studio  Возможности и ограничения  Создание команд  Объектная модель автоматизации  Хранение настроек  Инструментальные окна 163/175
  96. Пример 3  Разработать расширение, которое позволило бы делать массовые

    замены 165/175 Project Item Text Solution Проект Строка Текст Решение
  97. Внутри проекта автоматизации  Как переместить окно в другое меню,

    задать ему новое имя или картинку?  Где разрабатывать внешний вид окна?  Как получить доступ к DTE? 167/175
  98. Отображение окна  Пункт меню настраивается через таблицу команд 

    Регистрируем окно в пакетном классе  В обработчике команды показываем окно 168/175
  99. Внешний вид и поведение окна  Окно  Наследник ToolWindowPane

     Внутри – WPF-контрол  Лучшие практики разработки WPF 169/175
  100. Доступ к DTE  Передаем в конструктор контрола окно 

    Используем окно для получения DTE var dte = (DTE2)_serviceProvider.GetService(typeof(SDTE)); 170/175
  101. О чем не поговорили?  Расширения для других сред программирования

     Расширения для Visual Studio, отличные от VSPackage  Доступность и видимость команд  Поддержка новых языков программирования, новых типов проектов и пр.  Публикация расширений в галерее 171/175
  102. Ссылки  Visual Studio SDK  Руководство по разработке модулей

    расширений на C#  Extending Visual Studio 2013  Visual Studio 2010 Package Development Fundamentals  Расширения с семинара  Исходный код  Copy with Location  Batch Replace 172/175
  103. Семинары  В. Муравлев «Разработка Enterprise-приложения на основе Spring Framework:

    собираем конструктор»  П. Музыка «Реальная кодогенерация с использованием T4-шаблонов»  С. Кошель «Грязная магия Java» 173/175
  104. Итоги  Что такое рутина и как с ней бороться

     Автоматизируйте работу с умом  Ресурсы на автоматизацию и поддержку  Готовые решения  Модульность  Широта охвата и эффективность  Примеры  Трансформация  Метаданные  Шаблоны кода  Свои расширения 174/175