Слайд 2Почему я здесь?
Приходится иметь дело с плохим или нестабильным кодом
![Почему я здесь? Приходится иметь дело с плохим или нестабильным кодом](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-1.jpg)
Слайд 3Пример номер раз
Нет опыта разработки;
Единственный разработчик.
![Пример номер раз Нет опыта разработки; Единственный разработчик.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-2.jpg)
Слайд 4Пример номер раз
Результат:
Огромные классы и методы;
Классы имели множество ответственностей и были сильно
![Пример номер раз Результат: Огромные классы и методы; Классы имели множество ответственностей](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-3.jpg)
связаны друг с другом;
Отсутствие юнит-тестов;
Расширять функциональность с каждым разом становилось всё сложней.
Слайд 5Пример номер два
Класс-команда для вычисления:
Класс разбит на 7 файлов;
Общий объем почти 10к
![Пример номер два Класс-команда для вычисления: Класс разбит на 7 файлов; Общий](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-4.jpg)
строк кода;
Слишком много умеет и знает.
Слайд 6Пример номер два
Результат:
Запутанный и нестабильный класс;
Невозможно покрыть тестами;
Страшно изменять.
![Пример номер два Результат: Запутанный и нестабильный класс; Невозможно покрыть тестами; Страшно изменять.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-5.jpg)
Слайд 77 смертных грехов
программирования
![7 смертных грехов программирования](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-6.jpg)
Слайд 15Наиболее частые ошибки.
Антипаттерны
![Наиболее частые ошибки. Антипаттерны](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-14.jpg)
Слайд 17God Object
— Мне нужен такой-то функционал
— Используй MegaCoreObject!
—
![God Object — Мне нужен такой-то функционал — Используй MegaCoreObject! — А](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-16.jpg)
А ещё, мне нужен …
— Я же сказал, используй MegaCoreObject!
Слайд 18God Object
Признаки:
Большое число несвязных и несогласованных свойств и методов;
Один класс содержит всю
![God Object Признаки: Большое число несвязных и несогласованных свойств и методов; Один](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-17.jpg)
основную логику приложения;
Внесение нового кода в уже существующие классы, вместо создания новых и пересмотра иерархии классов для лучшего распределения обязанностей.
Слайд 19God Object
Следствие:
Сложно вносить изменения внутри God Object;
Сложно использовать повторно;
Сложно тестировать.
![God Object Следствие: Сложно вносить изменения внутри God Object; Сложно использовать повторно; Сложно тестировать.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-18.jpg)
Слайд 20Golden Hammer (Silver Bullet)
— Когда у тебя в руках есть только молоток,
![Golden Hammer (Silver Bullet) — Когда у тебя в руках есть только](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-19.jpg)
тогда всё вокруг превращается в гвозди.
А. Маслоу
Слайд 21Golden Hammer (Silver Bullet)
Предпосылки:
Стремление использовать знакомую технологию;
Отсутствие опыта с другими технологиями;
Риск при
![Golden Hammer (Silver Bullet) Предпосылки: Стремление использовать знакомую технологию; Отсутствие опыта с](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-20.jpg)
переходе на другое решение;
Политические причины;
Уверенность в преимуществах собственного решения.
Слайд 22Golden Hammer (Silver Bullet)
Следствие:
неоптимальное решение;
ненужное усложнение или недопустимое упрощение системы.
![Golden Hammer (Silver Bullet) Следствие: неоптимальное решение; ненужное усложнение или недопустимое упрощение системы.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-21.jpg)
Слайд 23Lava Flow
— Не знаю, как это работает, но оно работает. Не удалять
![Lava Flow — Не знаю, как это работает, но оно работает. Не удалять и не менять!](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-22.jpg)
и не менять!
Слайд 24Lava Flow
Предпосылки
Отсутствие Code Review;
Отсутствие проектирования разработки;
Недостаток опыта работы с технологией;
Нет времени на
![Lava Flow Предпосылки Отсутствие Code Review; Отсутствие проектирования разработки; Недостаток опыта работы](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-23.jpg)
рефакторинг и технический долг.
Слайд 25Lava Flow
Следствие:
Увеличивается сложность проекта;
Замедляется скорость разработки проекта;
Сложно провести рефакторинг или внести новую
![Lava Flow Следствие: Увеличивается сложность проекта; Замедляется скорость разработки проекта; Сложно провести](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-24.jpg)
функциональность.
Слайд 27Hardcoding & Magic Number
var path = "C:/Projects/MyProject/Data/FirstTest";
var connection = Service.Connect("localhost/api");
var peopleAmount =
![Hardcoding & Magic Number var path = "C:/Projects/MyProject/Data/FirstTest"; var connection = Service.Connect("localhost/api");](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-26.jpg)
GetEuropePopulation() + 602005;
Слайд 28Hardcoding & Magic Number
Предпосылки:
Хардкод во время разработки или отладки;
Спешка.
![Hardcoding & Magic Number Предпосылки: Хардкод во время разработки или отладки; Спешка.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-27.jpg)
Слайд 29Hardcoding & Magic Number
Следствие:
Исправная работа только в окружении, в котором ведётся разработка;
Неустойчивость
![Hardcoding & Magic Number Следствие: Исправная работа только в окружении, в котором](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-28.jpg)
к изменениям;
Требуется повторный деплой.
Слайд 30Hardcoding & Magic Number
var path = "C:/Projects/MyProject/Data/FirstTest.xml";
var connection = Service.Connect("localhost/api");
var peopleAmount =
![Hardcoding & Magic Number var path = "C:/Projects/MyProject/Data/FirstTest.xml"; var connection = Service.Connect("localhost/api");](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-29.jpg)
GetEuropePopulation() + 602005;
Слайд 31Hardcoding & Magic Number
var path = Path.Combine(Directory.GetCurrentDirectory(), dataPath);
var connection = Service.Connect(Settings.OperationServiceAddress);
var peopleAmount
![Hardcoding & Magic Number var path = Path.Combine(Directory.GetCurrentDirectory(), dataPath); var connection =](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-30.jpg)
= GetEuropePopulation() + LuxembourgPopulation2018;
Слайд 33Programming by permutation
Предпосылки:
Отсутствие желания понять как работает код;
Отсутствие документации;
Низкая компетенция разработчика.
![Programming by permutation Предпосылки: Отсутствие желания понять как работает код; Отсутствие документации; Низкая компетенция разработчика.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-32.jpg)
Слайд 34Programming by permutation
Следствие:
Невозможно предусмотреть все сценарии;
Будет потрачено время на решение задачи перебором,
![Programming by permutation Следствие: Невозможно предусмотреть все сценарии; Будет потрачено время на](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-33.jpg)
а после, повторно потратится время на переделку решения;
Приучает разработчика к тому, что написание кода — это магия, а не инженерная работа.
Слайд 37Over-Engineering
Предпосылки:
Необходимость покрыть потребности небольшой части пользователей;
Преждевременное усложнение системы;
Желание продемонстрировать свои способности.
![Over-Engineering Предпосылки: Необходимость покрыть потребности небольшой части пользователей; Преждевременное усложнение системы; Желание продемонстрировать свои способности.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-36.jpg)
Слайд 38Over-Engineering
Следствие:
Потрачено слишком много сил/времени/денег на функционал, который не нужен большинству пользователей;
Продукт стал
![Over-Engineering Следствие: Потрачено слишком много сил/времени/денег на функционал, который не нужен большинству](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-37.jpg)
слишком дорогим и/или долгим, из-за чего он так и не был выпущен.
Слайд 39Not Invented Here & Reinventing the Wheel
![Not Invented Here & Reinventing the Wheel](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-38.jpg)
Слайд 40Not Invented Here & Reinventing the Wheel
Предпосылки:
Высокая цена решения;
Недоверие к чужой разработке;
Желание
![Not Invented Here & Reinventing the Wheel Предпосылки: Высокая цена решения; Недоверие](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-39.jpg)
поддержать свой продукт/компанию;
Гордыня;
Вера в то, что свои программисты лучше всех.
Слайд 41Not Invented Here & Reinventing the Wheel
Следствие:
Новый велосипед может оказаться недостаточно функциональным
![Not Invented Here & Reinventing the Wheel Следствие: Новый велосипед может оказаться](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1016185/slide-40.jpg)
или надёжным;
Нужно поддерживать собственными силами;
Потеря денег/времени.