64
16 апреля 2014 года Поиск и чтение унаследованного кода Игорь Шаталкин Разработчик .NET

Поиск и чтение унаследованного кода

  • Upload
    custis

  • View
    81

  • Download
    0

Embed Size (px)

Citation preview

16 апреля 2014 года

Поиск и чтение

унаследованного кода

Игорь Шаталкин

Разработчик .NET

Давайте познакомимся

Образование

Программирование – увлечение с детства

С 2011 года в IT-отрасли

Менеджер по продажам

Программист

Аналитик

2/64

О компании

Проектирование Заказная разработка

Бережное внедрение Масштабных IT-систем

3/64

План

Введение

Поиск кода

Понимание кода

Примеры

4/64

Почему важно уметь искать

и читать код?

Дэйв Томас, Диомидис Спинеллис

Чтение кода – повседневное занятие

программиста

90% ошибок можно устранить

при чтении кода

Нас часто учат писать код,

но редко – читать код

Чтобы что-то написать, нужно прочитать

Зачем изобретать велосипед?

5/64

Задачи работы с кодом

Исправление и доработка кода

Поиск примеров

Найти шаблон для новой функции

Делал ли так кто-то раньше?

Рецензирование

6/64

Работа с артефактами

7/64

Семинар Дениса Гаврилова

«Практики командной работы:

о пользе письменных артефактов»

(CUSTIS, октябрь 2014)

Концепции и инструменты

Концепции – универсальны

Инструменты

C# (.NET)

Visual Studio

ReSharper

Бесплатные инструменты

Универсальные инструменты

8/64

Примеры

C#

ShareX

9/64

Где мы?

Введение

Поиск кода

Понимание кода

Примеры

10/64

Где мы?

Введение

Поиск кода

Перебором

По ключевым словам

По классификаторам

По стеку

Общие советы

Понимание кода

Примеры

11/64

Что такое перебор?

Последовательный просмотр

пользовательских форм

файлов с исходным кодом

12/64

Когда применять перебор

Задача поиска размыта

Мы плохо знакомы с системой

13/64

Где мы?

Введение

Поиск кода

Перебором

По ключевым словам

По классификаторам

По стеку

Общие советы

Понимание кода

Примеры

14/64

Что такое ключевое слово?

Словарь «Исследовательская

деятельность»:

Ключевое слово – слово

или словосочетание из текста документа

или запроса, несущее существенную

смысловую нагрузку с точки зрения

информационного поиска.

15/64

Стратегии поиска

по ключевым словам

Подбирать редкие ключевые слова

Сначала найти много, а затем сузить поиск

Стремиться найти хотя бы что-то,

а не именно то, что нужно

16/64

Откуда брать ключевые слова?

Описание задачи

Экранная форма и действия пользователя

Номер ошибки

Текст ошибки или сообщения

SQL-запрос и т. д.

17/64

Инструменты поиска

по ключевым словам

Встроенный поиск в Visual Studio

Файловый менеджер

Поисковые движки

OpenGrok

DocFetcher

Регулярные выражения

18/64

Поисковый движок по исходному коду

Модули

Модуль индексации исходного кода

Веб-приложение для поиска и навигации по коду

Индексирует папку с кодом в файловой системе

Веб-приложение работает под Apache

Написан на Java

Исходный код открыт, использование бесплатно

Откуда скачать

Как установить под Windows

19/64

Зачем использовать OpenGrok?

Гибкий поиск

Быстрый поиск

Наглядный поиск

Ограничения

Не работает с кириллицей

Можно использовать DocFetcher

Нет интеграции с Visual Studio

20/64

Где мы?

Введение

Поиск кода

Перебором

По ключевым словам

По классификаторам

По стеку

Общие советы

Понимание кода

Примеры

21/64

Что такое классификатор?

Wikipedia:

Классификатор – систематизированный

перечень наименованных объектов.

22/64

Инструменты поиска

по классификаторам

ReSharper

Go to Everything

Visual Studio

Solution Explorer

Class View

Object Browser

OpenGrok

Definition

Файловый менеджер

Структура файлов и папок

23/64

Когда применять классификаторы

Мы хорошо знакомы с системой

Знаем соглашения об именах

Знаем структуру классов, файлов и папок

Известно название класса, функции и т. д.

24/64

Где мы?

Введение

Поиск кода

Перебором

По ключевым словам

По классификаторам

По стеку

Общие советы

Понимание кода

Примеры

25/64

Поиск по стеку

Исследование стека

ReSharper – Stack Traces

Включение прерывания по ошибке

Exception Breaker

Какая функция вызывается, когда я нажимаю

на кнопку (выполняю другое действие)?

Веб-приложения – Fiddler

Расставить точки останова во всех методах

класса

26/64

Когда применять поиск по стеку

Стек известен

Стек можно получить

27/64

Где мы?

Введение

Поиск кода

Перебором

По ключевым словам

По классификаторам

По стеку

Общие советы

Понимание кода

Примеры

28/64

Общие советы

Начинать с самого простого

Найти чуть больше или чуть меньше

Общаться с командой

Читать документацию

Вспомнить, что уже известно

Перед добавлением новой функции найти

существующую и использовать ее как шаблон

29/64

Где мы?

Введение

Поиск кода

Понимание кода

Примеры

30/64

Где мы?

Введение

Поиск кода

Понимание кода

Без чтения кода

Чтение «черного ящика»

Чтение «белого ящика»

Улучшение кода

Общая картина

Общие советы

Примеры

31/64

Без чтения кода

Запустить на исполнение

Прочитать документацию

Пообщаться с командой или пользователями

32/64

Где мы?

Введение

Поиск кода

Понимание кода

Без чтения кода

Чтение «черного ящика»

Чтение «белого ящика»

Улучшение кода

Общая картина

Общие советы

Примеры

33/64

Черный ящик

Угадать по имени

Прочитать описание и комментарии

Какой тип возвращает функция?

Какие принимает параметры?

Изучить использование (в том числе тесты)

Какие действия пользователя сюда приводят?

Что пользователь получает в результате

выполнения функции?

34/64

Черный ящик: инструменты

ReSharper

Inspect This

Find Usages

Visual Studio

Call Hierarchy

35/64

Где мы?

Введение

Поиск кода

Понимание кода

Без чтения кода

Чтение «черного ящика»

Чтение «белого ящика»

Улучшение кода

Общая картина

Общие советы

Примеры

36/64

Белый ящик

Читаем как можно меньше

Чтобы понять код, не надо читать его весь

Читаем в определенном порядке

От последовательности чтения зависит

скорость понимания

37/64

Чтение «вглубь»

Вначале читаем код первого уровня

Затем – второго и т. д.

Инструмент – C# outline

38/64

Чтение «от ключевых мест»

Возвращаем (получаем) результат

Присваиваем значения переменным

Делаем вывод в файл, на экран и т. д.

Инструмент – RockMargin

39/64

Чтение от простого к сложному

Вначале понять простейшие фрагменты

Затем переходить к более сложным

40/64

Чтение шаблонов

Виды шаблонов

Общеиспользуемые

Специфичные

Читать как «слова», без «разбора букв»

41/64

Чтение при рецензировании кода

Просмотреть названия всех файлов

Понять, в каких файлах – ключевые

изменения

Начинать чтение с ключевых изменений

42/64

Где мы?

Введение

Поиск кода

Понимание кода

Без чтения кода

Чтение «черного ящика»

Чтение «белого ящика»

Улучшение кода

Общая картина

Общие советы

Примеры

43/64

Расстановка отступов

44/64

Рефакторинг

Переименования

Разделение длинных функций

Законы де Моргана

!(a && b) = (!a) || (!b)

!(a || b) = (!a) && (!b)

Инструмент

ReSharper

45/64

Где мы?

Введение

Поиск кода

Понимание кода

Без чтения кода

Чтение «черного ящика»

Чтение «белого ящика»

Улучшение кода

Общая картина

Общие советы

Примеры

46/64

Чтение вызываемых функций

ReSharper – Inspect This

Visual Studio – View Call Hierarchy

47/64

Диаграммы

Существующие

Новые

Автоматические

SQL

Диаграммы классов

Ручные

48/64

Быстрые переходы

Закреплять вкладки

Делать закладки

Делать записи от руки

49/64

Структура кода

ReSharper – File Structure

Visual Studio – Member

Общая структура – RockMargin

50/64

Где мы?

Введение

Поиск кода

Понимание кода

Без чтения кода

Чтение «черного ящика»

Чтение «белого ящика»

Улучшение кода

Общая картина

Общие советы

Примеры

51/64

Общие советы

Вспомнить, что уже известно

Держать в голове цель чтения кода

Знать соглашения об именах

Общаться с коллегами

Использовать точки останова

Смотреть в лог системы контроля версий,

баг-трекер

52/64

Перерыв

53/64

Где мы?

Введение

Поиск кода

Понимание кода

Примеры

Добавить загрузку из буфера

по пути к файлу

Добавить распознавание текста

Добавить захват окна по расписанию

54/64

Добавить загрузку из буфера

по пути к файлу

Пользователь копирует в буфер

путь к файлу

Хочет, чтобы ShareX загрузил в Интернет

файл, путь к которому скопирован в буфер

55/64

Где мы?

Введение

Поиск кода

Понимание кода

Примеры

Добавить загрузку из буфера

по пути к файлу

Добавить распознавание текста

Добавить захват окна по расписанию

56/64

Добавить распознавание текста

Пользователь захватывает изображение

на экране

Хочет, чтобы ShareX

Распознал текст на захваченном изображении

Скопировал распознанный текст

в буфер обмена

57/64

Где мы?

Введение

Поиск кода

Понимание кода

Примеры

Добавить загрузку из буфера

по пути к файлу

Добавить распознавание текста

Добавить захват окна по расписанию

58/64

Добавить захват окна по расписанию

Пользователь хочет, чтобы ShareX

захватывал изображение в некотором окне

по расписанию

59/64

О чем не поговорили на семинаре?

Проблемные области для понимания

Издатель-подписчик

Многопоточная обработка

Обратная инженерия (Reverse Engineering)

Поиск во внешних базах исходного кода

60/64

Инструменты

Для поиска кода

OpenGrok: скачать, установить на Windows

DocFetcher

Fiddler

Exception Breaker

Для чтения кода

C# outline

RockMargin

Универсальные

Visual Studio

ReSharper

61/64

Книги

Диомидис Спинеллис

«Анализ программного кода на примере проектов Open Source»

Грег Хогланд, Гари Мак-Гроу

«Взлом программ: анализ и примеры кода»

Майкл К. Физерс

«Эффективная работа с унаследованным кодом»

62/64

Статьи

Как улучшить свою способность понимать

прочитанный текст?

How do you dive into large code bases?

63/64

Спасибо!

Вопросы?

64/64

Игорь Шаталкин

[email protected]