Две абстракции в системном дизайне: скрывать или сокращать
The Two Abstractions of System Design: Hide or Reduce
Автор блога о распределённых системах размышляет о двух разных смыслах слова «абстракция», которые часто путают. Традиционная модульная абстракция (как в ADT, API, многослойной архитектуре) скрывает детали реализации и инкапсулирует сложность. Абстракция моделирования, используемая в TLA+ и других формальных методах, наоборот, выявляет суть поведения, сокращая систему до минимального скелета, сохраняющего нужные свойства. Это различие критично: модульная абстракция прячет конкурентность, а моделирующая — выставляет её напоказ, чтобы доказать корректность инвариантов и извлечь максимальную безопасную конкурентность. Автор приводит примеры из распределённых систем: логические часы Лэмпорта, консенсус, линеаризуемость, MapReduce. Иногда хороший артефакт может служить и спецификацией, и моделью, но роли остаются разными.
Модульная абстракция скрывает конкурентность. Моделирующая абстракция выставляет её напоказ.
- BoiledCabbage
Я в целом слышал, как эти два понятия обсуждаются как абстракция против обобщения.
Абстракция скрывает ненужные детали. Обобщение находит/выявляет общность между элементами.
> oop - В чем разница между абстракцией и обобщением? - Stack Overflow - https://stackoverflow.com/questions/19291776/whats-the-diffe...
Создание процедуры/метода — это форма абстракции. Разрешение ей принимать параметры — это форма обобщения (поскольку позволяет использовать её для ряда похожих входных данных).
Простое создание целочисленного типа данных — это очень простая форма обобщения. Разрешение операциям работать обобщённо с любым целым числом.
- danparsonson
> Абстракция модульности стремится скрыть переплетения и представить операции так, как если бы они были атомарными. Её цель — сделать модуль лёгким в использовании, но при этом она отказывается от раскрытия возможностей конкурентности или эффективности.
> В полную противоположность, абстракция моделирования заключается в выявлении того, что должно протекать, и использовании этого! Она раскрывает мелкозернистые действия и порядки и доказывает, что инварианты сохраняются несмотря на переплетения. Наградой за эту работу является получение максимальной безопасной конкурентности из системы.
Полагаю, я не понимаю аргумента здесь, потому что это просто звучит как два разных вкуса одного и того же заварного крема; разница лишь в балансе работы, которую вы делаете на каждой стороне интерфейса, и это решение зависит от конкретных случаев использования проекта.
Это больше похоже на замечание о системном дизайне? Абстракция — это абстракция: вы можете применять её на разных уровнях в проекте, и большая часть развития навыков в разработке ПО заключается в умении приближать и отдалять и точно определять абстракцию на каждом этапе, но в конечном счёте вы делаете одно и то же снова и снова. Лично я не думаю, что нам нужны категории для этого.
- sigbottle
Я думаю, это показывает, насколько разными могут быть понятия «сжатия» (это слово сейчас часто используется из-за ИИ). Людям определённо нравится простота, но у простоты могут быть разные варианты использования.