SlideShare a Scribd company logo
XII международная конференция
CEE-SECR / РАЗРАБОТКА ПО
28 - 29 октября, Москва
Михаил Малеванный
Устойчивая привязка к синтаксическим
конструкциям в изменяющемся коде
Академия Строительства и Архитектуры
Донской Государственный Технический Университет
Введение
Предыдущий доклад (SECR-2015):
«Аспектная разметка кода для быстрой навигации по проекту»
Реализация:
https://github.com/MikhailoMMX/AspectMarkup
2
Сквозная функциональность
Рабочее множество
3
Рабочее множество...
...его:
 Трудно найти
 Легко потерять
 Невозможно забыть вспомнить
4
Chris Parnin and Spencer Rugaber. Resumption strategies
for interrupted programming tasks. Software Quality
Journal 19, 1 (March 2011), 5-34.
DOI=http://dx.doi.org/10.1007/s11219-010-9104-9
«Только в 7% случаев перед редактированием
не выполняется навигация по коду»
«Только в 10% случаев активная деятельность начинается
в пределах минуты после возврата к задаче»
5
6
7
Разметка кода
8
560 полей и методов
206 методов visit
9
Задача 1
Рабочее множество 1
Задача 2
Рабочее множество 2
10
Навигационные ссылки в 1C:Предприятие
11
Навигационная ссылка в IDE
12
• Почта
• Баг-трекер
• …
Модель привязки
• Сохраняемая информация
13
Синтаксическое дерево
 Строится легковесным парсером
по исходному коду
 Общее для разных языков
 Не зависит от среды разработки
A
B2B1
C1 C2 C3
D1 D2
E
14
Сохраняемая информация
 Имя + заголовок
 Тип
 Контекст
 Родительские узлы
 Соседние узлы
 Дочерние узлы
A
B2B1
C1 C2 C3
D1 D2
E
15
Сохраняемая информация
 Имя + заголовок
 Тип
 Контекст:
 Родительские узлы
A
B2B1
C1 C2 C3
D1 D2
E
16
Сохраняемая информация
 Имя + заголовок
 Тип
 Контекст:
 Родительские узлы
 Соседние узлы *
 Подузлы *
A
B2B1
C1 C2 C3
D1 D2
E
17
Имя и заголовок (Java)
public Component addChild(Component child)
{
repository.connectComponents(this, child,
EdgeKind.CONTAINS);
return child;
}
private int id;
Заголовок
Имя
18
Типы узлов (Java)
public Component addChild(Component child)
{
repository.connectComponents(this, child,
EdgeKind.CONTAINS);
return child;
}
private int id;
Тип: Method
Тип: Field
19
Внешний контекст (С#)
• namespace N
• class C1 : IVisitor
• namespace N
• class C2 : IVisitor
namespace N
{
class C1 : IVisitor
{
public void visit(IVisitor v) { }
}
class C2 : IVisitor
{
public void visit(IVisitor v) { }
}
}
20
Горизонтальный контекст (yacc)
selection_statement
: IF '(' expression ')'
statement ELSE statement
IF
'('
expression
'('
ELSE
statement
...
IF
'('
expression
'('
statement
ELSE
...
21
Внутренний контекст (Pascal)
var
X, Y : Double;
var
Name, Address : string;
Age : integer;
• X, Y : Double
• Name, Address: String
• Age : Integer
22
Модель привязки
• Алгоритм поиска
в изменяющемся коде
23
T – исходный узел
Ti – узлы в новом файле
Для всех Ti вычисляем величину «похожести»:
Si = Similarity(T, Ti)
Si ∈ [0, 1]; 0 = ничего общего, 1 = точное совпадение
Величина похожести
24
Редакционное расстояние
Минимальное количество правок, необходимых для
преобразования одной строки в другую
Выше Редакционное расстояние – ниже Похожесть
3 версии:
 Имена (String)
 Заголовки (Lists<String>)
 Внешние контексты (List<Headers>)
25
Примеры метрики «похожести»
Строка 1 Строка 2 Похожесть
String String 1
load_file loadFile 0.77
nextInt nextDouble 0.4
String Object 0
26
Примеры метрики «похожести»
 private static uint GetManagedResourceOffset(
ManagedResource resource, BlobWriter resourceWriter)
 private static uint GetManagedResourceOffset(
ManagedResource resource, BlobBuilder resourceWriter)
 public string GetLine(int LineIndex)
 public bool IsDocumentOpen(string FileName)
= 0.95
27
= 0.33
Аналогия с помехоустойчивыми кодами
28
Аналогия с помехоустойчивыми кодами
29
Сущности
Аналогия с помехоустойчивыми кодами
30
int GetHashCode()
void WithAttributes()
event EventHandler(…)
void visit(statement)
void visit(expression)int Count()
async Task TestElseIf()
Аналогия с помехоустойчивыми кодами
31
Изменения
Аналогия с помехоустойчивыми кодами
32
Изменения
Аналогия с помехоустойчивыми кодами
33
Аналогия с помехоустойчивыми кодами
34
Изменения
Аналогия с помехоустойчивыми кодами
35
Пример неоднозначности поиска
Первая версия:
class expr : Node
{
public void Visit(Visitor _vis)
{ /* */ }
}
Вторая версия:
class Expression : Node
{
public void Visit(Visitor _vis)
{ /* */ }
}
class Statement : Node
{
public void Visit(Visitor _vis)
{ /* */ }
}Исходный фрагмент
Переименован
Добавлен
36
Разрешение неоднозначности поиска
37
Разрешение неоднозначности поиска
38
Исходный узел из _expr
из Expression
из Statement
Исследование устойчивости привязки
39
Методика
Ревизия 1
(начало
анализа)
Ревизия 2
(конец
анализа)
Initial
commit Исследуемый период
Ревизии:
Привязка
ко всем
сущностям
в ревизии 1
Проверка
привязки
в ревизии 2
40
 Изменено файлов 95 из 2 668
 Изменено сущностей 406 из 83 082 (0,5%)
#326
Начало
анализа
#653
Конец
анализа
#1
Initial
commit 9 месяцев
разработки
Ревизии:
41
Предварительный результат поиска узлов
246160
Выдан список узлов
Узел найден
42
Предварительный результат поиска узлов
246160
Выдан список узлов
Узел найден
43
Удаленные узлы
211
35
160
Выдан список узлов
Узел удален
Узел найден
44
Удаленные узлы
211
35
160
Выдан список узлов
Узел удален
Узел найден
45
Без удаленных узлов
211160
Выдан список узлов
Узел найден
46
Без удаленных узлов
211160
Выдан список узлов
Узел найден
47
Перемещенные узлы
100
111
160
Выдан список узлов
Узел перемещен
Узел найден
48
Перемещенные узлы
100
111
160
Выдан список узлов
Узел перемещен
Узел найден
49
Анализ перемещенных узлов
100
98
13
160
Выдан список узлов
Выдан список узлов
(перемещенные)
Узел найден
(перемещенные)
Узел найден
50
После учета перемещенных узлов
198173
Выдан список узлов
Узел найден
51
Результат поиска узлов
198173
Первый результат в
списке
Узел найден
52
Окончательный результат поиска узлов
371
Найдено
безошибочно
53
Окончательный результат поиска узлов
371
Найдено
безошибочно
100%
54
Roslyn
55
Roslyn
Начало
анализа
Конец
анализа
Initial
commit
1 год разработки
56
Roslyn
 Изменено файлов 2 584 из 4 995
 Изменено сущностей 20 534 из 152 271 (13,5%)
Начало
анализа
Конец
анализа
Initial
commit
1 год разработки
10 340 ревизий
57
Roslyn
 Изменено сущностей: 20 534 (...много)
58
Roslyn
 Изменено сущностей: 20 534 (...много)
 Взята выборка из 500 случайных* сущностей
* RandomShuffle(), SubList(0, 500).
59
Предварительный результат поиска узлов
132
368
Выдан список узлов
Узел найден
60
Предварительный результат поиска узлов
132
368
Выдан список узлов
Узел найден
61
Удаленные узлы
83
49
368
Выдан список узлов
Узел удален
Узел найден
62
Удаленные узлы
83
49
368
Выдан список узлов
Узел удален
Узел найден
63
После учета удаленных узлов
83
368
Выдан список узлов
Узел найден
64
После учета удаленных узлов
83
368
Выдан список узлов
Узел найден
65
Перемещенные узлы
78
5
368
Выдан список узлов
Узел перемещен
Узел найден
66
Перемещенные узлы
78
5
368
Выдан список узлов
Узел перемещен
Узел найден
67
Анализ перемещенных узлов
78
1
4
368
Выдан список узлов
Выдан список узлов
(перемещенные)
Узел найден
(перемещенные)
Узел найден
68
После учета перемещенных узлов
79
372
Выдан список узлов
Узел найден
69
После учета перемещенных узлов
79
372
Выдан список узлов
Узел найден
70
Анализ неавтоматически найденных узлов
75
4
372
Первый результат в
списке
Не первый результат в
списке
Узел найден
71
Анализ неавтоматически найденных узлов
75
4
372
Первый результат в
списке
Не первый результат в
списке
Узел найден
72
Анализ автоматически найденных узлов
75
4
2
370
Первый результат в
списке
Не первый результат в
списке
Ошибочный результат
Узел найден
73
Окончательный результат поиска узлов
445
6
Узел найден
безошибочно
Ошибочный
результат
74
Окончательный результат поиска узлов
445
6
Найдено
безошибочно
Ошибочный
результат
98.7%
75
Результат
PascalABC.NET
 326 ревизий
 9 месяцев
Roslyn
 10340 ревизий
 1 год
371 445
6
76

More Related Content

Viewers also liked

Как организовать процесс дизайна в небольшой компании?
Как организовать процесс дизайна в небольшой компании?Как организовать процесс дизайна в небольшой компании?
Как организовать процесс дизайна в небольшой компании?
CEE-SEC(R)
 
Догнать и перегнать
Догнать и перегнатьДогнать и перегнать
Догнать и перегнать
CEE-SEC(R)
 
Visualization of Quality (Effective Reporting)
Visualization of Quality (Effective Reporting) Visualization of Quality (Effective Reporting)
Visualization of Quality (Effective Reporting)
SQALab
 
О SOLID-ности
О SOLID-ностиО SOLID-ности
О SOLID-ности
CEE-SEC(R)
 
Titanic.csv – Как заметить макушку айсберга в океане багов?
Titanic.csv – Как заметить макушку айсберга в океане багов?Titanic.csv – Как заметить макушку айсберга в океане багов?
Titanic.csv – Как заметить макушку айсберга в океане багов?
CEE-SEC(R)
 
Теория и практика сокращения релизного цикла
Теория и практика сокращения релизного циклаТеория и практика сокращения релизного цикла
Теория и практика сокращения релизного циклаSQALab
 
Потоковая фильтрация событий
Потоковая фильтрация событийПотоковая фильтрация событий
Потоковая фильтрация событий
CEE-SEC(R)
 
Как 3 тестировщика играючи тестируют приложение для 10млн пользователей
Как 3 тестировщика играючи тестируют приложение для 10млн пользователейКак 3 тестировщика играючи тестируют приложение для 10млн пользователей
Как 3 тестировщика играючи тестируют приложение для 10млн пользователей
SQALab
 

Viewers also liked (8)

Как организовать процесс дизайна в небольшой компании?
Как организовать процесс дизайна в небольшой компании?Как организовать процесс дизайна в небольшой компании?
Как организовать процесс дизайна в небольшой компании?
 
Догнать и перегнать
Догнать и перегнатьДогнать и перегнать
Догнать и перегнать
 
Visualization of Quality (Effective Reporting)
Visualization of Quality (Effective Reporting) Visualization of Quality (Effective Reporting)
Visualization of Quality (Effective Reporting)
 
О SOLID-ности
О SOLID-ностиО SOLID-ности
О SOLID-ности
 
Titanic.csv – Как заметить макушку айсберга в океане багов?
Titanic.csv – Как заметить макушку айсберга в океане багов?Titanic.csv – Как заметить макушку айсберга в океане багов?
Titanic.csv – Как заметить макушку айсберга в океане багов?
 
Теория и практика сокращения релизного цикла
Теория и практика сокращения релизного циклаТеория и практика сокращения релизного цикла
Теория и практика сокращения релизного цикла
 
Потоковая фильтрация событий
Потоковая фильтрация событийПотоковая фильтрация событий
Потоковая фильтрация событий
 
Как 3 тестировщика играючи тестируют приложение для 10млн пользователей
Как 3 тестировщика играючи тестируют приложение для 10млн пользователейКак 3 тестировщика играючи тестируют приложение для 10млн пользователей
Как 3 тестировщика играючи тестируют приложение для 10млн пользователей
 

Similar to Устойчивая привязка к синтаксическим конструкциям в изменяющемся коде

Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C code
Denis Efremov
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
Positive Hack Days
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
Positive Development User Group
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
Яковенко Кирилл
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыТехнологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Positive Development User Group
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
Andrey Karpov
 
Николай Волосатов — Работа с крэшами библиотек
Николай Волосатов — Работа с крэшами библиотекНиколай Волосатов — Работа с крэшами библиотек
Николай Волосатов — Работа с крэшами библиотек
CocoaHeads
 
Программные системы для латентно-семантического анализа
Программные системы для латентно-семантического анализаПрограммные системы для латентно-семантического анализа
Программные системы для латентно-семантического анализа
Спецсеминар "Искусственный Интеллект" кафедры АЯ ВМК МГУ
 
паскаль 10кл 14
паскаль 10кл 14паскаль 10кл 14
паскаль 10кл 14
Ирина Куликова
 
Лекция №1 Организация ЭВМ и систем
Лекция №1 Организация ЭВМ и системЛекция №1 Организация ЭВМ и систем
Лекция №1 Организация ЭВМ и систем
Александр Силантьев
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
Badoo Development
 
Парсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricksПарсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricks
Roman Dvornov
 
Специфика разработки и тестирования статического анализатора
Специфика разработки и тестирования статического анализатораСпецифика разработки и тестирования статического анализатора
Специфика разработки и тестирования статического анализатора
Andrey Karpov
 
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...Iosif Itkin
 
17 pdf -_programmi
17 pdf -_programmi17 pdf -_programmi
17 pdf -_programmi
MBOU Spasskaya SOSH
 
Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!
RAMBLER&Co
 
А.Левенчук -- системноинженерное мышление
А.Левенчук -- системноинженерное мышлениеА.Левенчук -- системноинженерное мышление
А.Левенчук -- системноинженерное мышление
Anatoly Levenchuk
 
Бинарные уязвимости и эксплойты: технологии и перспективы
Бинарные уязвимости и эксплойты: технологии и перспективыБинарные уязвимости и эксплойты: технологии и перспективы
Бинарные уязвимости и эксплойты: технологии и перспективыd_olex
 

Similar to Устойчивая привязка к синтаксическим конструкциям в изменяющемся коде (20)

Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C code
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыТехнологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
 
Николай Волосатов — Работа с крэшами библиотек
Николай Волосатов — Работа с крэшами библиотекНиколай Волосатов — Работа с крэшами библиотек
Николай Волосатов — Работа с крэшами библиотек
 
Программные системы для латентно-семантического анализа
Программные системы для латентно-семантического анализаПрограммные системы для латентно-семантического анализа
Программные системы для латентно-семантического анализа
 
паскаль 10кл 14
паскаль 10кл 14паскаль 10кл 14
паскаль 10кл 14
 
Лекция №1 Организация ЭВМ и систем
Лекция №1 Организация ЭВМ и системЛекция №1 Организация ЭВМ и систем
Лекция №1 Организация ЭВМ и систем
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
 
Парсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricksПарсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricks
 
Специфика разработки и тестирования статического анализатора
Специфика разработки и тестирования статического анализатораСпецифика разработки и тестирования статического анализатора
Специфика разработки и тестирования статического анализатора
 
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
 
17 pdf -_programmi
17 pdf -_programmi17 pdf -_programmi
17 pdf -_programmi
 
Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!Rambler.iOS #9: Анализируй это!
Rambler.iOS #9: Анализируй это!
 
А.Левенчук -- системноинженерное мышление
А.Левенчук -- системноинженерное мышлениеА.Левенчук -- системноинженерное мышление
А.Левенчук -- системноинженерное мышление
 
Бинарные уязвимости и эксплойты: технологии и перспективы
Бинарные уязвимости и эксплойты: технологии и перспективыБинарные уязвимости и эксплойты: технологии и перспективы
Бинарные уязвимости и эксплойты: технологии и перспективы
 

More from CEE-SEC(R)

Подбор и адаптация методологий разработки ПО под различные типы производствен...
Подбор и адаптация методологий разработки ПО под различные типы производствен...Подбор и адаптация методологий разработки ПО под различные типы производствен...
Подбор и адаптация методологий разработки ПО под различные типы производствен...
CEE-SEC(R)
 
Проектный офис и аналитик
Проектный офис и аналитикПроектный офис и аналитик
Проектный офис и аналитик
CEE-SEC(R)
 
Онлайн-революция: от ранних репозиториев – к современным МООС-курсам
Онлайн-революция: от ранних репозиториев – к современным МООС-курсамОнлайн-революция: от ранних репозиториев – к современным МООС-курсам
Онлайн-революция: от ранних репозиториев – к современным МООС-курсам
CEE-SEC(R)
 
Массовый параллелизм для гетерогенных вычислений на C++ для беспилотных автом...
Массовый параллелизм для гетерогенных вычислений на C++ для беспилотных автом...Массовый параллелизм для гетерогенных вычислений на C++ для беспилотных автом...
Массовый параллелизм для гетерогенных вычислений на C++ для беспилотных автом...
CEE-SEC(R)
 
Как компании с вузами вместе ИТ специалиста готовили или Чем ИТ компания може...
Как компании с вузами вместе ИТ специалиста готовили или Чем ИТ компания може...Как компании с вузами вместе ИТ специалиста готовили или Чем ИТ компания може...
Как компании с вузами вместе ИТ специалиста готовили или Чем ИТ компания може...
CEE-SEC(R)
 
«Знак качества» как инструмент анализа восприятия продукта клиентами
«Знак качества» как инструмент анализа восприятия продукта клиентами«Знак качества» как инструмент анализа восприятия продукта клиентами
«Знак качества» как инструмент анализа восприятия продукта клиентами
CEE-SEC(R)
 
Машинное обучение на каждый день
Машинное обучение на каждый деньМашинное обучение на каждый день
Машинное обучение на каждый день
CEE-SEC(R)
 
Process и Case Management в информационной системе:
Process и Case Management в информационной системе: Process и Case Management в информационной системе:
Process и Case Management в информационной системе:
CEE-SEC(R)
 
Проблемы процесса разработки с точки зрения тестирования
Проблемы процесса разработки с точки зрения тестированияПроблемы процесса разработки с точки зрения тестирования
Проблемы процесса разработки с точки зрения тестирования
CEE-SEC(R)
 
Как ЧПУ станку в домашней мастерской не превратиться в мульт героев “двое из ...
Как ЧПУ станку в домашней мастерской не превратиться в мульт героев “двое из ...Как ЧПУ станку в домашней мастерской не превратиться в мульт героев “двое из ...
Как ЧПУ станку в домашней мастерской не превратиться в мульт героев “двое из ...
CEE-SEC(R)
 
Ай-трекинг в UX исследованиях
Ай-трекинг в UX исследованияхАй-трекинг в UX исследованиях
Ай-трекинг в UX исследованиях
CEE-SEC(R)
 
Настоящее и будущее решений для разработки кросс-платформенных мобильных гибр...
Настоящее и будущее решений для разработки кросс-платформенных мобильных гибр...Настоящее и будущее решений для разработки кросс-платформенных мобильных гибр...
Настоящее и будущее решений для разработки кросс-платформенных мобильных гибр...
CEE-SEC(R)
 
Технологичный подход к повышению продуктивности – кейсы и исследования
Технологичный подход к повышению продуктивности – кейсы и исследованияТехнологичный подход к повышению продуктивности – кейсы и исследования
Технологичный подход к повышению продуктивности – кейсы и исследования
CEE-SEC(R)
 
Субъектно-ориентированные информационные системы на предприятиях
Субъектно-ориентированные информационные системы на предприятияхСубъектно-ориентированные информационные системы на предприятиях
Субъектно-ориентированные информационные системы на предприятиях
CEE-SEC(R)
 
Шаблоны контейнеров в Virtuozzo
Шаблоны контейнеров в VirtuozzoШаблоны контейнеров в Virtuozzo
Шаблоны контейнеров в Virtuozzo
CEE-SEC(R)
 
Apache Storm: от простого приложения до подробностей реализации
Apache Storm: от простого приложения до подробностей реализацииApache Storm: от простого приложения до подробностей реализации
Apache Storm: от простого приложения до подробностей реализации
CEE-SEC(R)
 
Семантическое ядро рунета
Семантическое ядро рунетаСемантическое ядро рунета
Семантическое ядро рунета
CEE-SEC(R)
 
Разработка требований для противоречащих законодательств
Разработка требований для противоречащих законодательствРазработка требований для противоречащих законодательств
Разработка требований для противоречащих законодательств
CEE-SEC(R)
 
IT-Лаборатория: кузница кадров и стартапов
IT-Лаборатория: кузница кадров и стартаповIT-Лаборатория: кузница кадров и стартапов
IT-Лаборатория: кузница кадров и стартапов
CEE-SEC(R)
 
Законы создания IT команд и следствия законов для IT проектов «на пальцах»
Законы создания IT команд и следствия законов для IT проектов «на пальцах»Законы создания IT команд и следствия законов для IT проектов «на пальцах»
Законы создания IT команд и следствия законов для IT проектов «на пальцах»
CEE-SEC(R)
 

More from CEE-SEC(R) (20)

Подбор и адаптация методологий разработки ПО под различные типы производствен...
Подбор и адаптация методологий разработки ПО под различные типы производствен...Подбор и адаптация методологий разработки ПО под различные типы производствен...
Подбор и адаптация методологий разработки ПО под различные типы производствен...
 
Проектный офис и аналитик
Проектный офис и аналитикПроектный офис и аналитик
Проектный офис и аналитик
 
Онлайн-революция: от ранних репозиториев – к современным МООС-курсам
Онлайн-революция: от ранних репозиториев – к современным МООС-курсамОнлайн-революция: от ранних репозиториев – к современным МООС-курсам
Онлайн-революция: от ранних репозиториев – к современным МООС-курсам
 
Массовый параллелизм для гетерогенных вычислений на C++ для беспилотных автом...
Массовый параллелизм для гетерогенных вычислений на C++ для беспилотных автом...Массовый параллелизм для гетерогенных вычислений на C++ для беспилотных автом...
Массовый параллелизм для гетерогенных вычислений на C++ для беспилотных автом...
 
Как компании с вузами вместе ИТ специалиста готовили или Чем ИТ компания може...
Как компании с вузами вместе ИТ специалиста готовили или Чем ИТ компания може...Как компании с вузами вместе ИТ специалиста готовили или Чем ИТ компания може...
Как компании с вузами вместе ИТ специалиста готовили или Чем ИТ компания може...
 
«Знак качества» как инструмент анализа восприятия продукта клиентами
«Знак качества» как инструмент анализа восприятия продукта клиентами«Знак качества» как инструмент анализа восприятия продукта клиентами
«Знак качества» как инструмент анализа восприятия продукта клиентами
 
Машинное обучение на каждый день
Машинное обучение на каждый деньМашинное обучение на каждый день
Машинное обучение на каждый день
 
Process и Case Management в информационной системе:
Process и Case Management в информационной системе: Process и Case Management в информационной системе:
Process и Case Management в информационной системе:
 
Проблемы процесса разработки с точки зрения тестирования
Проблемы процесса разработки с точки зрения тестированияПроблемы процесса разработки с точки зрения тестирования
Проблемы процесса разработки с точки зрения тестирования
 
Как ЧПУ станку в домашней мастерской не превратиться в мульт героев “двое из ...
Как ЧПУ станку в домашней мастерской не превратиться в мульт героев “двое из ...Как ЧПУ станку в домашней мастерской не превратиться в мульт героев “двое из ...
Как ЧПУ станку в домашней мастерской не превратиться в мульт героев “двое из ...
 
Ай-трекинг в UX исследованиях
Ай-трекинг в UX исследованияхАй-трекинг в UX исследованиях
Ай-трекинг в UX исследованиях
 
Настоящее и будущее решений для разработки кросс-платформенных мобильных гибр...
Настоящее и будущее решений для разработки кросс-платформенных мобильных гибр...Настоящее и будущее решений для разработки кросс-платформенных мобильных гибр...
Настоящее и будущее решений для разработки кросс-платформенных мобильных гибр...
 
Технологичный подход к повышению продуктивности – кейсы и исследования
Технологичный подход к повышению продуктивности – кейсы и исследованияТехнологичный подход к повышению продуктивности – кейсы и исследования
Технологичный подход к повышению продуктивности – кейсы и исследования
 
Субъектно-ориентированные информационные системы на предприятиях
Субъектно-ориентированные информационные системы на предприятияхСубъектно-ориентированные информационные системы на предприятиях
Субъектно-ориентированные информационные системы на предприятиях
 
Шаблоны контейнеров в Virtuozzo
Шаблоны контейнеров в VirtuozzoШаблоны контейнеров в Virtuozzo
Шаблоны контейнеров в Virtuozzo
 
Apache Storm: от простого приложения до подробностей реализации
Apache Storm: от простого приложения до подробностей реализацииApache Storm: от простого приложения до подробностей реализации
Apache Storm: от простого приложения до подробностей реализации
 
Семантическое ядро рунета
Семантическое ядро рунетаСемантическое ядро рунета
Семантическое ядро рунета
 
Разработка требований для противоречащих законодательств
Разработка требований для противоречащих законодательствРазработка требований для противоречащих законодательств
Разработка требований для противоречащих законодательств
 
IT-Лаборатория: кузница кадров и стартапов
IT-Лаборатория: кузница кадров и стартаповIT-Лаборатория: кузница кадров и стартапов
IT-Лаборатория: кузница кадров и стартапов
 
Законы создания IT команд и следствия законов для IT проектов «на пальцах»
Законы создания IT команд и следствия законов для IT проектов «на пальцах»Законы создания IT команд и следствия законов для IT проектов «на пальцах»
Законы создания IT команд и следствия законов для IT проектов «на пальцах»
 

Устойчивая привязка к синтаксическим конструкциям в изменяющемся коде

Editor's Notes

  1. На прошлогодней конференции была представлена разметка кода и инструмент. Сейчас я вкратце напомню цели и основные возможности разметки кода, после чего рассмотрим, как достигается устойчивость привязки к коду.
  2. Одна из проблем, с которыми ежедневно сталкиваются разработчики – это сквозная функциональность. Код, относящийся к решаемой задаче оказывается разбросан по всему проекту, и разработчику требуется держать в голове набор фрагментов, с которыми ему приходится работать. Будем называть его рабочим множеством.
  3. При этом на формирование такого множества тратится время, и при переходе к каждой задаче этот процесс нужно повторять. Если приходится отвлечься на другую задачу или по другим причинам, то потом приходится это рабочее множество восстанавливать заново.
  4. Исследование показывает, что после возврата к задаче разработчику почти всегда требуется просмотреть несколько мест в проекте, прежде чем он сможет продолжить работу и на это требуется время
  5. Которое может достигать от нескольких минут до часа и более.
  6. Разметка кода позволяет сохранить рабочее множество, сгруппировав фрагменты кода по задачам и подзадачам в произвольном виде.
  7. Разметка кода упрощает навигацию по текущему рабочему множеству. В больших проектах нужно еще постараться найти, а потом не потерять нужное место. И к нему нужно регулярно переходить.
  8. С использованием разметки жить становится проще. Множество фрагментов кода на виду, оно небольшое, в нем легко найти нужный фрагмент. И, в отличие от закладок, разметка к фрагменту привязывается более надежно.
  9. Разметка позволяет быстрее переключаться между задачами. Вот мы поработали пару недель над чем-то и нам нужно вернуться к предыдущей задаче, и что-то исправить. Вот оно, наше рабочее множество, заботливо собрано и сохранено.
  10. В 1С:Предприятии есть навигационные ссылки, это ссылки на документы в базе данных. Их можно отправить, например, по почте другому сотруднику. Это удобно. Правда, с объектами в базе данных проще, у них есть первичный ключ, по которому его можно найти, даже если он изменился. А с кодом это не так.
  11. Можно экспортировать кусочек разметки, передать другому разработчику или прикрепить к задаче или к баг-репорту где-нибудь в системе управления проектами. Особенно важно, что привязка – устойчива к изменению, ведь в это время разработчик может редактировать код. Сохраняется не номер строки, который может «поехать», а некоторая другая информация. Ее и рассмотрим.
  12. Мы привязываемся не к номерам строк, а к синтаксическим конструкциям в исходном коде на разных языках
  13. В сохраняемая информация берется из дерева разбора исходного кода. Оно строится легковесными парсерами. В составе инструмента есть несколько легковесных парсеров для нескольких языков, а при необходимости их не очень сложно дописать самостоятельно. Привязываться можно к любым узлам этого дерева. Мы не зависим от инфраструктуры конкретных сред разработки, что дает нам возможность встраивать инструмент в разные среды разработки и работать с разными языками, лишь бы для них был парсер.
  14. После этого если нам надо привязаться к некоторому узлу, то мы сохраняем следующий набор данных
  15. Имя и заголовок узла, а также его тип. Родительские узлы. Этой информации хватает во многих случаях, но не во всех.
  16. Кроме этого, дополнительно могут храниться соседние узлы и подузлы. В некоторых языках без этого не обойтись, кроме того это повышает устойчивость привязки.
  17. В заголовок может входить несколько лексем, среди которых отдельно может выделяться одна – это имя. Оно наиболее важно.
  18. Кроме того, хранение типа позволяют ускорить поиск и отсечь ненужные сущности в коде.
  19. Вот типичный пример, когда нужно хранить родительские узлы. У нас есть несколько одинаковых методов, но они входят в разные классы или пространства имен. Методы в классе уникальны, классы – тоже.
  20. Но так бывает не всегда. Фрагмент из грамматики ANSI C, в нем два раза встречается нетерминал statement. Хранение соседей позволяет их различить и найти нужный. Ключевое слово ELSE находится слева от одного из них и справа от другого.
  21. А в некоторых случаях узлы дерева могут не иметь собственного имени, как секции объявления переменных в языке Pascal, но различить их можно по вложенным узлам. Хранение даже небольшого подмножества узлов позволяет привязаться к конкретной секции.
  22. Но самое главное – по этой информации найти нужное место в коде, после того как код поменялся.
  23. У нас есть информация о старом узле T, и набор узлов Ti из нового файла. Вычисляется степень похожести искомого узла и всех узлов в дереве. При вычислении величины похожести используется вся сохраняемая информация, но с разными весами.
  24. Для этого используется редакционное расстояние или расстояние Левенштейна. Вычисляется оно для имен, заголовков (список строк) и внешних контекстов (списков имен – списков списков строк), при каждой следующей версии используется предыдущая.
  25. Пример похожести для отдельных лексем. Для похожих лексем она ближе к единице, для разных – близка к нулю.
  26. Если изменился только тип одного параметра – похожесть близка к единице. Если это два разных метода – то и похожесть будет ближе к нулю.
  27. В алгоритме поиска прослеживается аналогия с помехоустойчивыми кодами и тем, как они восстанавливают переданные сообщения после воздействия на них помех.
  28. Пусть в некотором файле есть несколько сущностей
  29. В некотором смысле, расстояние между ними тем меньше, чем более похожи эти сущности.
  30. Если какой-то узел
  31. изменился несильно, то он по-прежнему будет самым похожим на исходный с большим отрывом от остальных узлов.
  32. И он будет успешно и с высокой уверенностью найден. Здесь показаны, своего рода, области, в которых изменения безопасны. Они зависят от наличия поблизости других узлов.
  33. Но если изначально есть много других, очень похожих сущностей в коде,
  34. То даже небольшое изменение может привести к потере привязки.
  35. В некоторых случаях изменения могут быть досаточно сильными. Здесь привязка осуществлялась к методу класса. Класс был переименован и добавлен другой класс с таким же методом. Возникает неоднозначность.
  36. В этом случае выдается список узлов, отсортированных по величине похожести.
  37. В заголовке отображается исходный узел, а чуть ниже видны два метода visit, один из класса expression, другой из класса statement. Первый имеет более высокую степень похожести за счет того, что исходное имя класса expr больше похоже на Expression, чем на statement.
  38. А теперь рассмотрим, насколько же устойчивой получилась такая привязка.
  39. Берем две ревизии одного проекта и в первой из них привязываемся вообще ко всему, тотально и параноидально. То есть ко всем узлам, к которым в принципе возможна привязка. А во второй ревизии ищем все сохраненные узлы.
  40. В качестве первого проекта был взят PascalABC.NET За половину истории проекта в нем изменилось 406 сущностей. Считаются только изменения классов, заголовков методов и т.д., но не кода внутри методов. 406 - это немного, но как раз в процессе работы и нужна разметка, поэтому продолжаем.
  41. Получается не очень красивый результат. Примерно одна треть узлов находится автоматически, для остальных требуется участие разработчика. Давайте разбираться, почему так.
  42. Часть фрагментов кода была удалена за это время. Были поля и методы, которые уже не использовались, а затем они были подчищены. Инструмент всегда пытается найти сущность или помочь с ее поиском, даже если она была удалена. А если она была на самом деле удалена (это может понять разработчик), то он удалит и разметку. Мы такие случаи не рассматриваем.
  43. Выбрасываем их из рассмотрения.
  44. Уже чуть лучше. Дальше, среди оставшихся случаев есть…
  45. 111 фрагментов кода, перемещенных в другие файлы. Проводился рефакторинг. Пока в нашем инструменте файл сохраняется как есть, поэтому привязка ищется в исходном файле. Можно будет доделать и глобальный поиск, но пока есть возможность указать другой файл и поискать в нем. Что и было сделано.
  46. В результате эти случаи были переанализированы
  47. Часть из них теперь находится полностью автоматически, а часть – по прежнему требует участия разработчика.
  48. Теперь посмотрим повнимательнее на вот эту категорию «выдан список узлов»
  49. Так вот оказывается, что все до единого результаты поиска в этой категории попадают на первую строчку в списке наиболее вероятных узлов. Просто отрыв от второго места не двукратный. Это все возникает в случае если есть похожие сущности. Например, визитор, обрабатывающий иерархию узлов дерева (более 200 узлов), когда у нас изначально в одном классе есть сотни методов, отличающихся только типом одного параметра. Сама иерархия узлов. И тому подобные, достаточно сложные места в коде.
  50. Если немного поправить правило поиска и выдавать первый результат в списке, то получается вот такая картина. Поэтому такой результат можно считать очень хорошим.
  51. Мы получаем, грубо говоря, 100% точность поиска. С одной оговоркой – среди тех узлов, которые физически остались в коде. Удаленные узлы, как вы помните, мы исключали из рассмотрения.
  52. Или вот такой проект. Roslyn. Он побольше и развивается поактивнее.
  53. Для анализа я сразу решил взять интервал в один год разработки…
  54. …и оказалось, что за это время было сделано более 10 тысяч ревизий. Ну что же, тем интереснее будет посмотреть результаты.
  55. Изменилось за это время 20 с половиной тысяч сущностей, анализировать их вручную слишком долго
  56. Поэтому была взята выборка из 500 случайных узлов. Список был перемешан в случайном порядке (RandomShuffle, и взяты первые 500 элементов списка) Эту выборку и посмотрим.
  57. Здесь соотношение уже сразу лучше, почти три четверти узлов находятся автоматически. Смотрим дальше.
  58. Так же, как и в прошлом проекте, часть из не найденных узлов была удалена. Или изменена настолько, что найти этот код не удалось. Можно сказать, что некоторые вещи были полностью переписаны. Все-таки год разработки и 10 тысяч ревизий.
  59. Выбрасываем и их.
  60. И смотрим дальше
  61. Всего 5 сущностей было перемещено в другой файл
  62. Проверяем их
  63. Из них 4 теперь находятся автоматически и одна – нет.
  64. Теперь посмотрим на вот этот сектор (выдан список узлов).
  65. Здесь ситуация чуточку хуже. Почти все узлы оказываются на первом месте в списке, но 4 узла изменились сильнее, но их все же можно быстро найти в списке похожих узлов.
  66. А вот еще в двух случаях инструмент с полной уверенностью выдает неправильный узел.
  67. В итоге получается такое соотношение правильных и неправильных результатов поиска
  68. Тем не менее, в плохих случаях все же можно посмотреть список похожих узлов и быстро найти нужный. К тому же, сюда я отнес один случай, когда один большой метод был разбит на два и оба они занимали первые две строчки, но большая часть полезных действий была все же во втором методе, а значит скорее всего, разработчику потребуется заглядывать в список результатов. Я его отнес к ошибочным результатам, хотя это спорный момент. Привести примеры Успешный и не успешные
  69. Это и так большой период – год. Образный пример про город спустя 20 лет и старый план города. План это и есть разметка. Но плохая, статическая, не алгоритмическая. (В начало) А если добавить поддержку среды разработки, то будет 100%. За эти 100% мы и боремся.