Привет, я часто слышу, что компьютеры состоят из нулей и единиц, и я даже открыл системный блок, чтобы увидеть эти самые нули и единицы, и знаете, что? Ни чего подобного там нет, и всему виной абстракции.
Уровень абстракции
Абстракции в программировании встречаются повсеместно, например объектно-ориентированные абстракции служат для того, чтоб выделить из моделированного объекта главные черты и реализовать их в объекте для решения поставленной задачи. Уровень абстракции — это один из способов сокрытия деталей реализации определённого набора функциональных возможностей. Применяется для управления сложностью проектируемой системы при декомпозиции, когда система представляется в виде иерархии уровней абстракции. В уровне абстракции скрыта внутренняя реализация и есть интерфейс для доступа к этой скрытой информации. Можно привести пример с жёстким диском и подсистемой, то каким образом хранятся файлы на диске мы не знаем, мы не знаем, как технически работает диск, у нас есть интерфейс, который позволяет получать и записывать данные на жёсткий диск, это и есть интерфейс, который является абстракцией. Вообще абстракция — это инструмент, который позволяет развиваться вычислительной технике и программированию.
Абстракции и прогресс
В то время, когда компьютеры были большие, а программисты умные, не было таких сложных высокоуровневых абстракций. Программисты работали на существенно более низком уровне, практически с железом в машинных кодах, и задачи были тоже существенно проще. Именно абстракции позволили усложнить данную схему, многие считают, что компьютеры позволили ошибаться человеку меньше, на самом деле они позволили ошибаться быстрее, а абстракции в свою очередь позволили делать эти ошибки всё более сложными. Если подумать, то машинный код плавно перетёк в новую абстракцию, которую называли ассемблером. Дальше появились высокоуровневые языки, виртуальные машины, и ещё более высокоуровневые языки и, по сути, каждый виток развития базировался на предыдущем уровне абстракции. То же самое происходило и с операционными системами, появлялись новые концепции, а они базировались на старых и развивались. Так со временем появилось веб программирование, когда браузер работает в операционной системе, но мы совершенно ничего не знаем из браузера о файловой структуре, о устройствах и так далее. Это ещё одна абстракция, которая наслоилась на предыдущие, и процесс создания новых абстракций это и есть прогресс.
Machine learning
Мы всё больше усложняем абстракции и тем самым позволяем себе решать всё более сложные проблемы. Так, например сейчас формируется ещё одна абстракция, я даже затрудняюсь куда её отнести. С одной стороны у нас есть императивные языки, функциональные и так сказать старый стиль разработки, а сейчас появляется новый стиль который называется machine learning. Когда у нас есть модель, которая базируется на этих старых языках программирования, но программируются совершенно иначе, она обучается на основе данных которые имеют разметку, мы обучаем модель, и дальше уже она на не размеченных данных выполняет псевдоинтеллектуальные действия. Так, например можно даже создать генератор псевдослучайных чисел, это будет никакой то алгоритм, это будет обученная нейронная сеть, которая будет выдавать псевдослучайное число. Вполне может быть, что у нас появятся умные помощники, роботы, которые будут программироваться именно таким образом. И это тоже абстракция, она тоже лежит на существующих уровнях абстракции. Она, естественно, проникает во все области жизни, где может быть применена.
Закон протекающих абстракций
Таким образом усложнение абстракции вовлечение новых уровней, которые не когда не заканчиваются, способствует прогрессу в области вычислительной техники и программирования. Но здесь есть маленький нюанс в 2002 году Джоэл Спольски опубликовал статью "Закон протекающих абстракций", он написал что ни одна сколько ни будь сложная абстракция не может быть целостной, и речь не об ошибках, речь о том что если мы используем какую-то сложную абстракцию, то мы гарантировано должны знать её внутреннею реализацию для решения каких то сложных задач. Например, язык SQL, по идеи, по задумке это надстройка над базой данных, которая должна полностью скрывать от нас внутреннею реализацию, работы самой СУБД, но тем не менее сегодня, чтобы писать оптимальные решения мы должны знать внутреннею организацию. То же самое с JavaScript, чтобы писать оптимальный код мы должны знать, как он интерпретируется, исполняется. Это и есть протечка абстракций, и хорошие программисты сегодня вынуждены знать то, как устроены те абстракции, с которыми они работают. Собственно, это и с одной стороны хорошо, мы можем создавать оптимальные решения и с другой стороны плохо, потому что немножко искажает саму идею абстракции. Более того каждый программист в своей работе регулярно создаёт новые абстракции. Именно эти абстракции лежаться в основу готовых программ. Если вы вспомните SOLID, то там есть принцип единственной ответственности, который говорит о том, что мы должны создавать классы, объекты с единственно целью, чтобы у них не было множество задач. И это тоже следствие закона протекающих абстракций, если мы будем создавать сложные классы, с большим количеством обязанностей, то это будет сложная абстракция, и она будет неминуемо протекать. В это же время если мы создаём простые классы, то гарантировать их внутреннею целостность и сокрытие информации о их работе мы уже можем.
Если посмотреть на принципы программирования на то, как всё устроено то окажется, что во многом все законы принципы и идеи в программировании связаны друг с другом и в основе всего развития так или иначе лежит абстракция, именно абстракция позволяет нам убрать лишние детали и двигать прогресс вперёд.