Мы строим на абстракциях.

Это может быть сложным вопросом для новичка в разработке программного обеспечения. Сам термин, кажется, намекает на то, что идея фундаментальна и мощна, но сложна. И в этом он хорошо подобран.

Абстракция — это уровень косвенности. Что-то, что встает между вами и этим вопросом. Это способ легко понять и эффективно управлять вещами.

У нас есть педали и элементы управления, чтобы абстрагироваться от механизмов в наших автомобилях, у нас есть деньги, чтобы абстрагироваться от стоимости, у нас есть рестораны, чтобы абстрагироваться от приготовления пищи.

Оказывается, человеческий мозг отлично справляется с построением абстракций. Я почти уверен, что это часть всей уловки «большого мозга, стремящегося куда угодно и использующего инструменты животного».

За прошедшие годы мы создали их множество и использовали для обработки информации обо всем и обо всем.

А затем мы построили науку вокруг информации.

Когда мы манипулируем абстракциями в нашей повседневной жизни как разработчики, они часто менее масштабны, как деньги, и чаще очень специализированы, как класс IOStream.

Объект IOStream абстрагирует операции, необходимые для фактической обработки ввода и вывода. Большинству людей фактическая запись битов на жесткий диск показалась бы довольно утомительной.

И на самом деле, большинство используемых вами библиотек, вероятно, абстрагируются от чего-то, с чем вы не хотели — «или не чувствовали необходимости» — иметь дело. Даже языки по своей природе абстрагируются от некоторых вещей.

Хорошо, теперь, когда вы реализовали Фибоначчи для этого процессора, можете ли вы повторить это для того x86?

Создание хорошего программного обеспечения обычно означает поиск правильных абстракций, которые максимально упрощают обработку информации, которую они представляют. Плохая абстракция заставит вас чувствовать, что вы идете «против течения» каждый раз, когда вы манипулируете ею, утомляя разработчиков, которым приходится с ней иметь дело, и повсюду вызывая проблемы.

Негерметичная часть

Однако у абстракций есть любопытное свойство.

Ни одна концепция не является идеальной абстракцией того, что она стремится заменить.

Это означает, что все, что вы абстрагируете, вы можете увидеть, как оно сияет сквозь созданный вами слой косвенности, или даже различить реализацию самой абстракции.

Например, возьмем объект, представляющий геометрию, с методами периметра и площади, причем только первый из них является кэшированным свойством.

Когда вы запрашиваете периметр, он будет извлечен из памяти довольно легко, но метод площади должен будет вычислить его, а это означает намного худшую производительность. Мы говорим, что абстракция протекает.

Это не ограничивается только нашими программными абстракциями. Например, можно ожидать, что мои статьи будут абстракцией моих идей, способом взаимодействия читателей с ними без ограничений. Но правда в том, что я более склонен к написанию статей без кода, когда я пишу дома без надлежащей настройки программирования, чем когда у меня есть ноутбук или рабочая станция под рукой. Это еще один пример утечки абстракции.

Опять же, ни одна абстракция не идеальна. И мы занимаемся ими весь день, мы даже тратим много времени на проектирование и создание некоторых из них.

Итак, так же, как важно построить правильную абстракцию, важно знать, где наши абстракции протекают.