SlideShare ist ein Scribd-Unternehmen logo
1 von 58
Downloaden Sie, um offline zu lesen
Как разработать надежное решение
Владимир Мельник

Харьков, 2016
Винегрет
Владимир Мельник

Харьков, 2016
Надежность - это свойство
системы продолжительное время
сохранять способность выполнять
возложенные на нее функции.
Эксплуатация подразумевает
под собой не только работу
приложения в production-
окружении, но и работу с
кодом приложения и
решениями предоставляемыми
третей стороной.
Надежное программное
решение - это решение, которое:
• работает без сбоев
• легко адаптируется к изменениям внешнего мира
• легко адаптируемо к изменениям внешнего мира
Доставка нефти
Требование: Отсутствие
потерь или минимальные
потери при повриждении
корпуса.



Решение:

- двойной корпус,

- секционирование
контейнера с нефтью
Работа без сбоев
• 24/7/356 доступность сервисов
• устойчивость к высоким нагрузкам
• обработка ошибок
• целостность данных и их устойчивость к
повреждениям
• SOA и микро-сервисная архитектуры
• 24/7/356 доступность сервисов
• устойчивость к высоким нагрузкам
• обработка исключительных ситуаций
• целостность данных и их устойчивость к
повреждениям
• SOA и микро-сервисная архитектуры
Адаптация как саморегуляция
• эластичная архитектура
• cloud, fog, etc.
• репликация
• балансирование нагрузки
• мета-программирование
• само-обучающиеся системы
• эластичная архитектура
• cloud, fog, etc.
• микро-сервисная архитектура
• реплики
• балансирование нагрузки
• мета-программирование
• само-обучающиеся системы
Адаптируемость из вне
• Легко изменяемый код или код, которые не
требует больших изменений.
• Гарантия отсутствия дефектов и обнаружение
регрессии
• Легко и безболезненно изменяемый код
• Независимость от решений предоставляемых
третьей стороной
Текущая функциональность продукта
занимает только второе место в списке
приоритетов. На первом месте стоит
функциональность вашего продукта
завтра.
Легко изменяемый код
В тезисах
• Гибкая архитектура - это архитектура
позволяющая отстрачивать принятие важных и
дорогостоящи решений.
• Гибкая архитектура ~ надежная архитектура.
• Гибкие методологии возможны только при гибкой
архитектуре.
• Гибкая архитектура - архитектура без жестких
зависимостей.
Общие принципы
• Low-coupling
• High-cohesion
• SOLID
SOLID
• Принцип единственной ответственности. Принцип согласно которому
функциональность объекта должна быть сильно ограниченной.
• Принцип закрытости к изменению и открытости к расширению. Кратко:
больше, но не иначе.
• Принцип подстановки Барбары Лисков - согласно ему, когда B < A,
экземпляры класса B должны быть способны заменить экземпляры класса
A, то есть сущности типа B не ломают унаследованный интерфейс. Частный
случай O/C принципа.
• Принцип разделения интерфейсов - согласно этому принципу множество
простых интерфейсов лучше, чем один сложный. Частный случай SR
принципа.
• Принцип инверсии зависимостей, согласно которому вышележащие слои не
должны зависеть от лежащих ниже.
Новый Завет
SLOC
Система как логика над
собственными компонентами
• Целое - больше суммы его частей. - Аристотель.
• Система - это её компоненты и логика над ними. - me.
• Компоненты ничего не знают друг о друге, как
шестерни в часах не знают ничего о других шестернях.
• Система организует компоненты и описывает
взаимодействие между ними.
• Система играет роль композиции и абстракции.
Компоненты системы - детали, система - черный ящик.
Ассоциации здорового человека
Неправильные ассоциации -
одна из самых дорогих ошибок
в разработке ПО, которая не
позволяет в адекватные сроки
поставлять запрашиваемую
функциональность. Кроме того,
при рефакторинге ассоциаций,
весь код, что их использует
идет в корзину. Ошибки в
модели предметной области и
архитектуре приводят к
бесполезной работе и
регрессии.
Правила ассоциирования
сущностей
• Сущности независимы. Это означает, что
сущности напрямую не ссылаются друг на друга и
ничего о существовании друг друга не знают.
• Для связывания сущностей используются
ассоциации.
• Ассоциации помещаются в агрегаты, которые
являются системами над сущностями, а сущности
- их компонентами.
Danger!
Все примеры подготовлены на
основе Rails, что не позволяет
добиться максимальной
независимости компонентов.
class Customer < ActiveRecord::Base

end



class Product < ActiveRecord::Base

end



class Order < ActiveRecord::Base

belongs_to :customer

has_many :items, class_name: “OrderItem”

end



class OrderItem < ActiveRecord::Base

belongs_to :order

belongs_to :product

end
• Экземпляры Product - безусловно сущности.
• OrderItem является ассоциацией. Судя по
наличию order_id и product_id - между Order и
Product.
• Чем является Order?
• Order не заществует самостоятельно. Без
customer_id он лишен смысла, как и без
OrderItem’ов.
• По этой причине Order не является сущностью,
но является купированной ассоциацией между
Customer и Product.
• Необходимости в Order нет. Добавлением
товаров в корзину Customer лишь устанавливает
ассоциацию между собой и товарами. Он их
желает, а они желаем им.
class Customer < ActiveRecord::Base

end
class Product < ActiveRecord::Base

end
class OrderedProduct < ActiveRecord::Base

belongs_to :customer

belongs_to :product

end
Оплата и доставка
class Payment < ActiveRecord::Base

belongs_to :customer

has_many :ordered_products

end



class Delivery < ActiveRecord::Base

has_many :ordered_products

end



class OrderedProduct < ActiveRecord::Base

belongs_to :order

belongs_to :product

belongs_to :payment

belongs_to :delivery

end
Что здесь не так?
• Отношение пользователя к товару не имеет
ничего общего с оплатой и доставкой.
• При использовании реляционных баз данных
payment_id и delivery_id у OrderedProduct будут
помечены пустыми (NULL).
• Оплата - это факт.
• Доставка - это процесс стартующий после
оплаты.
class PayedOrderedProduct < ActiveRecord::Base

belongs_to :ordered_product

belongs_to :payment

end



class Payment < ActiveRecord::Base

has_many :payed_ordered_products

end



class Delivery < ActiveRecord::Base

belongs_to :payed_ordered_product

end
Доставка - это процесс состоящий из фактов. Факт в случае с
доставкой - это передача товара одного участника процесса
доставки другому. Физически товар может не перемещаться.



Пускай доставка состоит из:

• Packaging
• Shipment
• Transport
• Unloading
• Commitment
Отображение процессов на
факты и результаты
Process Result Fact
Packaging PackagedOrderedProduct Ordered product is packaged
Shipping ShippedOrderedProduct Ordered product is shipped
Transporting TransportedOrderedProduct Ordered product is transported
Unloading UnloadedOrderedProduct Ordered product is unloaded
Committing CommittedOrderedProduct Ordered Product is committed
Нас не интересует процесс. Нас интересует
результат. Наличие результата является фактом,
например, если есть CommittedOrderedProduct, то
был осуществлен Commiting, то есть имеет место
факт - Commitment.
Процесс просто агрегирует факты, но у нас нет
необходимости в такой агрегации. Delivery - избыточная
сущность. Сам процесс описывается ассоциациями.

class Delivery < ActiveRecord::Base

belongs_to :payed_ordered_product

end
class PackagedOrderedProduct < ActiveRecord::Base

belongs_to :payed_ordered_product

end
class ShippedOrderedProduct < ActiveRecord::Base

belongs_to :packaged_ordered_product

end
class TransportedOrderedProduct < ActiveRecord::Base

belongs_to :shipped_ordered_product

end
class UnloadedOrderedProduct < ActiveRecord::Base

belongs_to :transported_ordered_product

end
class CommittedOrderedProduct < ActiveRecord::Base

belongs_to :unloaded_ordered_product

end
Как узнать текущее
состояние доставки?
# packaged?

!!op.try :packaged_ordered_product



# shipped?

!!try(…).try :shipped_ordered_product



# transported?

!!try(…).try(…).try :transported_ordered_product



# unloaded?

!!try(…).try(…).try(…).try :unloaded_ordered_product



# commited?

!!try(…).try(…).try(…).try(…).try :committed_…
Шутка
Foreign Key как Natural
Primary Key
• packaged_ordered_products.payed_order_id - является одновременно PRIMARY
KEY и FOREIGN KEY  ссылающимся на PayedOrderedProduct и OrderedProduct.
• shipped_ordered_products.payed_order_id - является одновременно PRIMARY KEY
и FOREIGN KEY  ссылающимся на PackagedOrderedProduct, PayedOrderedProduct и
OrderedProduct.
• transported_ordered_products.payed_order_id - является одновременно PRIMARY
KEY и FOREIGN KEY  ссылающимся на ShippedOrderedProduct, PackagedOrderedProduct,
PayedOrderedProduct и OrderedProduct.
• outloaded_ordered_products.payed_order_id - является одновременно PRIMARY
KEY и FOREIGN KEY  ссылающимся на TransportedOrderedProduct, ShippedOrderedProduct,
PackagedOrderedProduct, PayedOrderedProduct и OrderedProduct.
• commited_ordered_product.payed_order_id - является одновременно PRIMARY KEY
и FOREIGN KEY  ссылающимся на OutloadedOrderedProduct, TransportedOrderedProduct,
ShippedOrderedProduct, PackagedOrderedProducts, PayedOrderedProduct и
OrderedProduct.
# committed?

CommittedOrderedProduct.exists?
(ordered_product_id: ordered_product.id)
Гарантии отсутствия дефектов и
обнаружение регрессии
Все просто: их нет, но
количество дефектов можно
существенно минимизировать.
4 предназначения тестов:
• Разработка более удобного API.
• Разработка low-coupling кода.
• Предоставление информации о регрессии после
будущих изменений.
• Документирование кода.
Тесты позволяют посмотреть на разработку кода
глазами его пользователя.
BDD не только подразумевает инкрементальный
рефакторинг, но и обеспечивают возможность
оного.
Тесты позволяют обнаружить архитектурные
недостатки на ранних стадиях и устранить их.
Тесты не гарантируют отсутствия дефектов. Они
косвенным образом уменьшают их и позволяют
проверить, что покрытые тестами use case’ы
продолжают работать после внесенных изменений.
Тесты служат самой надежной и актуальной (если
их запускают) документацией.
Bonus: BDBF - Behaviour-
Driven Bug Fixing
• При помощи тестов описываем правильное
поведение системы. Тесты падают.
• Экспериментируем с решением проблемы
(пишем много грязного кода). Тесты становятся
зелеными.
• Рефакторим код, который исправляет поведение
системы. Тесты остаются зелеными.
RSpec.describe Something, type: :some_type do

describe “class” do

subject { described_class }



describe “.new” do

context “when good args” do

it “returns something” do

…

end

end



context “when bad args” do

it “raises ArgumentError” do

…

end

end

end

end



describe “instance” do

subject { described_class.new … }

…

end

end
Мутационное тестирование
Позволяет:
• получить более реалистичные метрики покрытия
кода тестами,
• обнаружить неиспользуемый код,
• разрабатывать более безопасный код.
Спасибо за внимание
Вопросы?

Weitere ähnliche Inhalte

Andere mochten auch

Testing in projects
Testing in projectsTesting in projects
Testing in projects
DataArt
 
Роман Еникеев - PHP или откуда взялся слон
Роман Еникеев - PHP или откуда взялся слонРоман Еникеев - PHP или откуда взялся слон
Роман Еникеев - PHP или откуда взялся слон
DataArt
 
Майстер-клас "Автоматизоване тестування. З чого почати?" (частина 1)
Майстер-клас "Автоматизоване тестування. З чого почати?" (частина 1)Майстер-клас "Автоматизоване тестування. З чого почати?" (частина 1)
Майстер-клас "Автоматизоване тестування. З чого почати?" (частина 1)
DataArt
 
«Чем занимается Google Life Sciences, и почему биотехнологии ожидает прорыв» ...
«Чем занимается Google Life Sciences, и почему биотехнологии ожидает прорыв» ...«Чем занимается Google Life Sciences, и почему биотехнологии ожидает прорыв» ...
«Чем занимается Google Life Sciences, и почему биотехнологии ожидает прорыв» ...
DataArt
 
Андрей Вересов - .NET Reflection
Андрей Вересов - .NET ReflectionАндрей Вересов - .NET Reflection
Андрей Вересов - .NET Reflection
DataArt
 
"В поисках эффективности: Slack и BitBucket", Юлия Писаревская, GoodSellUs
"В поисках эффективности: Slack и BitBucket", Юлия Писаревская, GoodSellUs"В поисках эффективности: Slack и BitBucket", Юлия Писаревская, GoodSellUs
"В поисках эффективности: Slack и BitBucket", Юлия Писаревская, GoodSellUs
DataArt
 

Andere mochten auch (18)

Ольга Котий: Конструктивные коммуникации с заказчиком.
Ольга Котий: Конструктивные коммуникации с заказчиком.Ольга Котий: Конструктивные коммуникации с заказчиком.
Ольга Котий: Конструктивные коммуникации с заказчиком.
 
E-Guardian Plus Kit Brochure
E-Guardian Plus Kit BrochureE-Guardian Plus Kit Brochure
E-Guardian Plus Kit Brochure
 
Testing in projects
Testing in projectsTesting in projects
Testing in projects
 
Наталья Шпот «Магия приоритетов как ключ к личному счастью»
Наталья Шпот «Магия приоритетов как ключ к личному счастью»Наталья Шпот «Магия приоритетов как ключ к личному счастью»
Наталья Шпот «Магия приоритетов как ключ к личному счастью»
 
Александр Кашеверов — Коротко про WEB: HTML, CSS, JS.
Александр Кашеверов — Коротко про WEB: HTML, CSS, JS.Александр Кашеверов — Коротко про WEB: HTML, CSS, JS.
Александр Кашеверов — Коротко про WEB: HTML, CSS, JS.
 
Роман Еникеев - PHP или откуда взялся слон
Роман Еникеев - PHP или откуда взялся слонРоман Еникеев - PHP или откуда взялся слон
Роман Еникеев - PHP или откуда взялся слон
 
Майстер-клас "Автоматизоване тестування. З чого почати?" (частина 1)
Майстер-клас "Автоматизоване тестування. З чого почати?" (частина 1)Майстер-клас "Автоматизоване тестування. З чого почати?" (частина 1)
Майстер-клас "Автоматизоване тестування. З чого почати?" (частина 1)
 
«Чем занимается Google Life Sciences, и почему биотехнологии ожидает прорыв» ...
«Чем занимается Google Life Sciences, и почему биотехнологии ожидает прорыв» ...«Чем занимается Google Life Sciences, и почему биотехнологии ожидает прорыв» ...
«Чем занимается Google Life Sciences, и почему биотехнологии ожидает прорыв» ...
 
Андрей Вересов - .NET Reflection
Андрей Вересов - .NET ReflectionАндрей Вересов - .NET Reflection
Андрей Вересов - .NET Reflection
 
Message queue demo
Message queue demoMessage queue demo
Message queue demo
 
Kudzu and Palmer Amaranth Weed Pests
Kudzu and Palmer Amaranth Weed PestsKudzu and Palmer Amaranth Weed Pests
Kudzu and Palmer Amaranth Weed Pests
 
"В поисках эффективности: Slack и BitBucket", Юлия Писаревская, GoodSellUs
"В поисках эффективности: Slack и BitBucket", Юлия Писаревская, GoodSellUs"В поисках эффективности: Slack и BitBucket", Юлия Писаревская, GoodSellUs
"В поисках эффективности: Slack и BitBucket", Юлия Писаревская, GoodSellUs
 
Constitucionalidad internet
Constitucionalidad internetConstitucionalidad internet
Constitucionalidad internet
 
ARCHVENTURE
ARCHVENTUREARCHVENTURE
ARCHVENTURE
 
Liquid/Syrup/Oral Manufacturing Plant
Liquid/Syrup/Oral Manufacturing PlantLiquid/Syrup/Oral Manufacturing Plant
Liquid/Syrup/Oral Manufacturing Plant
 
Pertumbuhan dan Perkembangan Manusia
Pertumbuhan dan Perkembangan ManusiaPertumbuhan dan Perkembangan Manusia
Pertumbuhan dan Perkembangan Manusia
 
Jornal HOJE! - Edição 840
Jornal HOJE! - Edição 840Jornal HOJE! - Edição 840
Jornal HOJE! - Edição 840
 
Thriller's best villains
Thriller's best villainsThriller's best villains
Thriller's best villains
 

Ähnlich wie «Как разработать надежное решение».Владимир Мельник, Ruby Developer, DataArt

Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
PVasili
 
Cергей Константинов, Яндекс
Cергей Константинов, ЯндексCергей Константинов, Яндекс
Cергей Константинов, Яндекс
Ontico
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
drupalconf
 
3 denys gobov - change request specification the knowledge base or the task...
3   denys gobov - change request specification the knowledge base or the task...3   denys gobov - change request specification the knowledge base or the task...
3 denys gobov - change request specification the knowledge base or the task...
Ievgenii Katsan
 
Ember.js - Назад в Будущее - Odessa JS 2014
Ember.js - Назад в Будущее - Odessa JS 2014Ember.js - Назад в Будущее - Odessa JS 2014
Ember.js - Назад в Будущее - Odessa JS 2014
Andrey Listochkin
 

Ähnlich wie «Как разработать надежное решение».Владимир Мельник, Ruby Developer, DataArt (20)

Есть ли жизнь с ORM или типовая архитектура CRUD приложения
Есть ли жизнь с ORM или типовая архитектура CRUD приложенияЕсть ли жизнь с ORM или типовая архитектура CRUD приложения
Есть ли жизнь с ORM или типовая архитектура CRUD приложения
 
Александр Корольков. LeSS Huge
Александр Корольков. LeSS HugeАлександр Корольков. LeSS Huge
Александр Корольков. LeSS Huge
 
Переход с Objective-C на Swift — все ли так просто? / Олег Алексеенко (SuperJob)
Переход с Objective-C на Swift — все ли так просто? / Олег Алексеенко (SuperJob)Переход с Objective-C на Swift — все ли так просто? / Олег Алексеенко (SuperJob)
Переход с Objective-C на Swift — все ли так просто? / Олег Алексеенко (SuperJob)
 
Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на Rails
 
Intersystems Cache - Как не загреметь в долговую яму
Intersystems Cache - Как не загреметь в долговую ямуIntersystems Cache - Как не загреметь в долговую яму
Intersystems Cache - Как не загреметь в долговую яму
 
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
 
redux: the best for isomorphic apps
redux: the best for isomorphic appsredux: the best for isomorphic apps
redux: the best for isomorphic apps
 
Programming Java - Lection 05 - Software Design - Lavrentyev Fedor
Programming Java - Lection 05 - Software Design - Lavrentyev FedorProgramming Java - Lection 05 - Software Design - Lavrentyev Fedor
Programming Java - Lection 05 - Software Design - Lavrentyev Fedor
 
Отладка веб-приложений на Javascript
Отладка веб-приложений на JavascriptОтладка веб-приложений на Javascript
Отладка веб-приложений на Javascript
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Cергей Константинов, Яндекс
Cергей Константинов, ЯндексCергей Константинов, Яндекс
Cергей Константинов, Яндекс
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production
ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с ProductionThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production
ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
 
Микросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и KubernetesМикросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и Kubernetes
 
3 denys gobov - change request specification the knowledge base or the task...
3   denys gobov - change request specification the knowledge base or the task...3   denys gobov - change request specification the knowledge base or the task...
3 denys gobov - change request specification the knowledge base or the task...
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
 
Ember.js - Назад в Будущее - Odessa JS 2014
Ember.js - Назад в Будущее - Odessa JS 2014Ember.js - Назад в Будущее - Odessa JS 2014
Ember.js - Назад в Будущее - Odessa JS 2014
 
Работа с требованиями в условиях Agile трансформации
Работа с требованиями в условиях Agile трансформацииРабота с требованиями в условиях Agile трансформации
Работа с требованиями в условиях Agile трансформации
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
 

Mehr von DataArt

Digital Marketing from inside
Digital Marketing from insideDigital Marketing from inside
Digital Marketing from inside
DataArt
 
A. Sirota "Building an Automation Solution based on Appium"
A. Sirota "Building an Automation Solution based on Appium"A. Sirota "Building an Automation Solution based on Appium"
A. Sirota "Building an Automation Solution based on Appium"
DataArt
 
Эмоциональный интеллект или как не сойти с ума в условиях сложного и динамичн...
Эмоциональный интеллект или как не сойти с ума в условиях сложного и динамичн...Эмоциональный интеллект или как не сойти с ума в условиях сложного и динамичн...
Эмоциональный интеллект или как не сойти с ума в условиях сложного и динамичн...
DataArt
 

Mehr von DataArt (20)

DataArt Custom Software Engineering with a Human Approach
DataArt Custom Software Engineering with a Human ApproachDataArt Custom Software Engineering with a Human Approach
DataArt Custom Software Engineering with a Human Approach
 
DataArt Healthcare & Life Sciences
DataArt Healthcare & Life SciencesDataArt Healthcare & Life Sciences
DataArt Healthcare & Life Sciences
 
DataArt Financial Services and Capital Markets
DataArt Financial Services and Capital MarketsDataArt Financial Services and Capital Markets
DataArt Financial Services and Capital Markets
 
About DataArt HR Partners
About DataArt HR PartnersAbout DataArt HR Partners
About DataArt HR Partners
 
Event management в IT
Event management в ITEvent management в IT
Event management в IT
 
Digital Marketing from inside
Digital Marketing from insideDigital Marketing from inside
Digital Marketing from inside
 
What's new in Android, Igor Malytsky ( Google Post I|O Tour)
What's new in Android, Igor Malytsky ( Google Post I|O Tour)What's new in Android, Igor Malytsky ( Google Post I|O Tour)
What's new in Android, Igor Malytsky ( Google Post I|O Tour)
 
DevOps Workshop:Что бывает, когда DevOps приходит на проект
DevOps Workshop:Что бывает, когда DevOps приходит на проектDevOps Workshop:Что бывает, когда DevOps приходит на проект
DevOps Workshop:Что бывает, когда DevOps приходит на проект
 
IT Talk Kharkiv: «‎Soft skills в IT. Польза или вред? Максим Бастион, DataArt
IT Talk Kharkiv: «‎Soft skills в IT. Польза или вред? Максим Бастион, DataArtIT Talk Kharkiv: «‎Soft skills в IT. Польза или вред? Максим Бастион, DataArt
IT Talk Kharkiv: «‎Soft skills в IT. Польза или вред? Максим Бастион, DataArt
 
«Ноль копеек. Спастись от выгорания» — Сергей Чеботарев (Head of Design, Han...
 «Ноль копеек. Спастись от выгорания» — Сергей Чеботарев (Head of Design, Han... «Ноль копеек. Спастись от выгорания» — Сергей Чеботарев (Head of Design, Han...
«Ноль копеек. Спастись от выгорания» — Сергей Чеботарев (Head of Design, Han...
 
Communication in QA's life
Communication in QA's lifeCommunication in QA's life
Communication in QA's life
 
Нельзя просто так взять и договориться, или как мы работали со сложными людьми
Нельзя просто так взять и договориться, или как мы работали со сложными людьмиНельзя просто так взять и договориться, или как мы работали со сложными людьми
Нельзя просто так взять и договориться, или как мы работали со сложными людьми
 
Знакомьтесь, DevOps
Знакомьтесь, DevOpsЗнакомьтесь, DevOps
Знакомьтесь, DevOps
 
DevOps in real life
DevOps in real lifeDevOps in real life
DevOps in real life
 
Codeless: автоматизация тестирования
Codeless: автоматизация тестированияCodeless: автоматизация тестирования
Codeless: автоматизация тестирования
 
Selenoid
SelenoidSelenoid
Selenoid
 
Selenide
SelenideSelenide
Selenide
 
A. Sirota "Building an Automation Solution based on Appium"
A. Sirota "Building an Automation Solution based on Appium"A. Sirota "Building an Automation Solution based on Appium"
A. Sirota "Building an Automation Solution based on Appium"
 
Эмоциональный интеллект или как не сойти с ума в условиях сложного и динамичн...
Эмоциональный интеллект или как не сойти с ума в условиях сложного и динамичн...Эмоциональный интеллект или как не сойти с ума в условиях сложного и динамичн...
Эмоциональный интеллект или как не сойти с ума в условиях сложного и динамичн...
 
IT talk: Как я перестал бояться и полюбил TestNG
IT talk: Как я перестал бояться и полюбил TestNGIT talk: Как я перестал бояться и полюбил TestNG
IT talk: Как я перестал бояться и полюбил TestNG
 

«Как разработать надежное решение».Владимир Мельник, Ruby Developer, DataArt

  • 1. Как разработать надежное решение Владимир Мельник
 Харьков, 2016
  • 3. Надежность - это свойство системы продолжительное время сохранять способность выполнять возложенные на нее функции.
  • 4. Эксплуатация подразумевает под собой не только работу приложения в production- окружении, но и работу с кодом приложения и решениями предоставляемыми третей стороной.
  • 5. Надежное программное решение - это решение, которое: • работает без сбоев • легко адаптируется к изменениям внешнего мира • легко адаптируемо к изменениям внешнего мира
  • 6. Доставка нефти Требование: Отсутствие потерь или минимальные потери при повриждении корпуса.
 
 Решение:
 - двойной корпус,
 - секционирование контейнера с нефтью
  • 8. • 24/7/356 доступность сервисов • устойчивость к высоким нагрузкам • обработка ошибок • целостность данных и их устойчивость к повреждениям • SOA и микро-сервисная архитектуры
  • 9. • 24/7/356 доступность сервисов • устойчивость к высоким нагрузкам • обработка исключительных ситуаций • целостность данных и их устойчивость к повреждениям • SOA и микро-сервисная архитектуры
  • 11. • эластичная архитектура • cloud, fog, etc. • репликация • балансирование нагрузки • мета-программирование • само-обучающиеся системы
  • 12. • эластичная архитектура • cloud, fog, etc. • микро-сервисная архитектура • реплики • балансирование нагрузки • мета-программирование • само-обучающиеся системы
  • 14. • Легко изменяемый код или код, которые не требует больших изменений. • Гарантия отсутствия дефектов и обнаружение регрессии • Легко и безболезненно изменяемый код • Независимость от решений предоставляемых третьей стороной
  • 15. Текущая функциональность продукта занимает только второе место в списке приоритетов. На первом месте стоит функциональность вашего продукта завтра.
  • 17. В тезисах • Гибкая архитектура - это архитектура позволяющая отстрачивать принятие важных и дорогостоящи решений. • Гибкая архитектура ~ надежная архитектура. • Гибкие методологии возможны только при гибкой архитектуре. • Гибкая архитектура - архитектура без жестких зависимостей.
  • 19. SOLID • Принцип единственной ответственности. Принцип согласно которому функциональность объекта должна быть сильно ограниченной. • Принцип закрытости к изменению и открытости к расширению. Кратко: больше, но не иначе. • Принцип подстановки Барбары Лисков - согласно ему, когда B < A, экземпляры класса B должны быть способны заменить экземпляры класса A, то есть сущности типа B не ломают унаследованный интерфейс. Частный случай O/C принципа. • Принцип разделения интерфейсов - согласно этому принципу множество простых интерфейсов лучше, чем один сложный. Частный случай SR принципа. • Принцип инверсии зависимостей, согласно которому вышележащие слои не должны зависеть от лежащих ниже.
  • 21. SLOC
  • 22. Система как логика над собственными компонентами • Целое - больше суммы его частей. - Аристотель. • Система - это её компоненты и логика над ними. - me. • Компоненты ничего не знают друг о друге, как шестерни в часах не знают ничего о других шестернях. • Система организует компоненты и описывает взаимодействие между ними. • Система играет роль композиции и абстракции. Компоненты системы - детали, система - черный ящик.
  • 24. Неправильные ассоциации - одна из самых дорогих ошибок в разработке ПО, которая не позволяет в адекватные сроки поставлять запрашиваемую функциональность. Кроме того, при рефакторинге ассоциаций, весь код, что их использует идет в корзину. Ошибки в модели предметной области и архитектуре приводят к бесполезной работе и регрессии.
  • 25. Правила ассоциирования сущностей • Сущности независимы. Это означает, что сущности напрямую не ссылаются друг на друга и ничего о существовании друг друга не знают. • Для связывания сущностей используются ассоциации. • Ассоциации помещаются в агрегаты, которые являются системами над сущностями, а сущности - их компонентами.
  • 26. Danger! Все примеры подготовлены на основе Rails, что не позволяет добиться максимальной независимости компонентов.
  • 27. class Customer < ActiveRecord::Base
 end
 
 class Product < ActiveRecord::Base
 end
 
 class Order < ActiveRecord::Base
 belongs_to :customer
 has_many :items, class_name: “OrderItem”
 end
 
 class OrderItem < ActiveRecord::Base
 belongs_to :order
 belongs_to :product
 end
  • 28. • Экземпляры Product - безусловно сущности. • OrderItem является ассоциацией. Судя по наличию order_id и product_id - между Order и Product. • Чем является Order?
  • 29. • Order не заществует самостоятельно. Без customer_id он лишен смысла, как и без OrderItem’ов. • По этой причине Order не является сущностью, но является купированной ассоциацией между Customer и Product. • Необходимости в Order нет. Добавлением товаров в корзину Customer лишь устанавливает ассоциацию между собой и товарами. Он их желает, а они желаем им.
  • 30. class Customer < ActiveRecord::Base
 end class Product < ActiveRecord::Base
 end class OrderedProduct < ActiveRecord::Base
 belongs_to :customer
 belongs_to :product
 end
  • 31. Оплата и доставка class Payment < ActiveRecord::Base
 belongs_to :customer
 has_many :ordered_products
 end
 
 class Delivery < ActiveRecord::Base
 has_many :ordered_products
 end
 
 class OrderedProduct < ActiveRecord::Base
 belongs_to :order
 belongs_to :product
 belongs_to :payment
 belongs_to :delivery
 end
  • 32. Что здесь не так? • Отношение пользователя к товару не имеет ничего общего с оплатой и доставкой. • При использовании реляционных баз данных payment_id и delivery_id у OrderedProduct будут помечены пустыми (NULL).
  • 33. • Оплата - это факт. • Доставка - это процесс стартующий после оплаты.
  • 34. class PayedOrderedProduct < ActiveRecord::Base
 belongs_to :ordered_product
 belongs_to :payment
 end
 
 class Payment < ActiveRecord::Base
 has_many :payed_ordered_products
 end
 
 class Delivery < ActiveRecord::Base
 belongs_to :payed_ordered_product
 end
  • 35. Доставка - это процесс состоящий из фактов. Факт в случае с доставкой - это передача товара одного участника процесса доставки другому. Физически товар может не перемещаться.
 
 Пускай доставка состоит из:
 • Packaging • Shipment • Transport • Unloading • Commitment
  • 36.
  • 37.
  • 38. Отображение процессов на факты и результаты Process Result Fact Packaging PackagedOrderedProduct Ordered product is packaged Shipping ShippedOrderedProduct Ordered product is shipped Transporting TransportedOrderedProduct Ordered product is transported Unloading UnloadedOrderedProduct Ordered product is unloaded Committing CommittedOrderedProduct Ordered Product is committed
  • 39. Нас не интересует процесс. Нас интересует результат. Наличие результата является фактом, например, если есть CommittedOrderedProduct, то был осуществлен Commiting, то есть имеет место факт - Commitment.
  • 40. Процесс просто агрегирует факты, но у нас нет необходимости в такой агрегации. Delivery - избыточная сущность. Сам процесс описывается ассоциациями.
 class Delivery < ActiveRecord::Base
 belongs_to :payed_ordered_product
 end
  • 41. class PackagedOrderedProduct < ActiveRecord::Base
 belongs_to :payed_ordered_product
 end class ShippedOrderedProduct < ActiveRecord::Base
 belongs_to :packaged_ordered_product
 end class TransportedOrderedProduct < ActiveRecord::Base
 belongs_to :shipped_ordered_product
 end class UnloadedOrderedProduct < ActiveRecord::Base
 belongs_to :transported_ordered_product
 end class CommittedOrderedProduct < ActiveRecord::Base
 belongs_to :unloaded_ordered_product
 end
  • 42. Как узнать текущее состояние доставки? # packaged?
 !!op.try :packaged_ordered_product
 
 # shipped?
 !!try(…).try :shipped_ordered_product
 
 # transported?
 !!try(…).try(…).try :transported_ordered_product
 
 # unloaded?
 !!try(…).try(…).try(…).try :unloaded_ordered_product
 
 # commited?
 !!try(…).try(…).try(…).try(…).try :committed_…
  • 44. Foreign Key как Natural Primary Key • packaged_ordered_products.payed_order_id - является одновременно PRIMARY KEY и FOREIGN KEY  ссылающимся на PayedOrderedProduct и OrderedProduct. • shipped_ordered_products.payed_order_id - является одновременно PRIMARY KEY и FOREIGN KEY  ссылающимся на PackagedOrderedProduct, PayedOrderedProduct и OrderedProduct. • transported_ordered_products.payed_order_id - является одновременно PRIMARY KEY и FOREIGN KEY  ссылающимся на ShippedOrderedProduct, PackagedOrderedProduct, PayedOrderedProduct и OrderedProduct. • outloaded_ordered_products.payed_order_id - является одновременно PRIMARY KEY и FOREIGN KEY  ссылающимся на TransportedOrderedProduct, ShippedOrderedProduct, PackagedOrderedProduct, PayedOrderedProduct и OrderedProduct. • commited_ordered_product.payed_order_id - является одновременно PRIMARY KEY и FOREIGN KEY  ссылающимся на OutloadedOrderedProduct, TransportedOrderedProduct, ShippedOrderedProduct, PackagedOrderedProducts, PayedOrderedProduct и OrderedProduct.
  • 46. Гарантии отсутствия дефектов и обнаружение регрессии
  • 47. Все просто: их нет, но количество дефектов можно существенно минимизировать.
  • 48. 4 предназначения тестов: • Разработка более удобного API. • Разработка low-coupling кода. • Предоставление информации о регрессии после будущих изменений. • Документирование кода.
  • 49. Тесты позволяют посмотреть на разработку кода глазами его пользователя.
  • 50. BDD не только подразумевает инкрементальный рефакторинг, но и обеспечивают возможность оного.
  • 51. Тесты позволяют обнаружить архитектурные недостатки на ранних стадиях и устранить их.
  • 52. Тесты не гарантируют отсутствия дефектов. Они косвенным образом уменьшают их и позволяют проверить, что покрытые тестами use case’ы продолжают работать после внесенных изменений.
  • 53. Тесты служат самой надежной и актуальной (если их запускают) документацией.
  • 54. Bonus: BDBF - Behaviour- Driven Bug Fixing • При помощи тестов описываем правильное поведение системы. Тесты падают. • Экспериментируем с решением проблемы (пишем много грязного кода). Тесты становятся зелеными. • Рефакторим код, который исправляет поведение системы. Тесты остаются зелеными.
  • 55. RSpec.describe Something, type: :some_type do
 describe “class” do
 subject { described_class }
 
 describe “.new” do
 context “when good args” do
 it “returns something” do
 …
 end
 end
 
 context “when bad args” do
 it “raises ArgumentError” do
 …
 end
 end
 end
 end
 
 describe “instance” do
 subject { described_class.new … }
 …
 end
 end
  • 56. Мутационное тестирование Позволяет: • получить более реалистичные метрики покрытия кода тестами, • обнаружить неиспользуемый код, • разрабатывать более безопасный код.