Дайджест интересных ссылок – Июль 2016

Почему объектно-ориентированное программирование - отстой, как технологии обманывают наш мозг и почему нужно избегать поверхностных задач...

Почему ООП - отстой

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

OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.

Dr. Alan Kay считает немного по-другому

Но, несмотря на огромную популярность объектно-ориентированной методологии, большинство ее реализаций в мейнстримовых языках программирования обладают множеством проблем. Автор статьи Goodbye, Object Oriented Programming показывает, как абстракции наследование и инкапсуляция благополучно протекают и не выполняют возложенные на них обязанности.

Дублирования кода (между проектами) не удается избежать при наличии обширных иерархий наследования, так как для переноса конкретного класса в другой проект требуется перенести его родителей, родителей его родителей и тп.

ООП - это про создание сущностей из реального мира (объектов, их свойств, поведения, отношений) в программе. Но иерархии в реальном мире могут не быть древовидными. Проблема ромбовидной иерархии (имеет место в жизни, но нельзя непротиворечиво реализовать в ЯП) и проблема фасетной классификации не могут быть решены традиционным наследованием.

Родительский класс не является на 100% черным ящиком для своих наследников. Из-за этого возникает проблема т.н. хрупких базовых классов, когда изменение реализации (но не интерфейса) родительского класса приводит к поломке наследников, которые зависели от особенностей реализации.

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

Инкапсуляция, в свою очередь, не работает из-за наличия ссылочных типов. Когда ссылка на существующий объект передается в конструктор нового объекта и сохраняется в приватном поле — это ложная инкапсуляция. При таком сценарии она вроде бы и есть (ссылка сохранена в приватном поле, никто за пределами объект-владельца не может получить к ней доступ), но на самом деле ее нет (изменение переданного в констуктор объекта за пределами объекта-"владельца" приводит к изменению состояния "владельца"). Автор предлагает решать такую проблему при помощи передачи по значению и использования неизменяемых типов данных.

Читая статью, складывается впечатление, что автор пропагандирует использование Go. Идеи, используемые в этом языке (компоновка типов из существующих, легковесные интерфейсы, повсеместная передача аргументов по значению) очень сильно перекликаются с идеями из статьи. Но, в конце оказывается, что, по мнению автора, функциональное программирование - наше все. В общем, всем рекомендую самостоятельно прочитать в оригинале Goodbye, Object Oriented Programming.

Как технологии обманывают наш мозг

При помощи не совсем честного пользовательского интерфейса и навязываемых сценариев использования программное обеспечение ежедневно изменяет наше поведение и привычки. Заметили, что очень часто проверяете телефон на предмет наличия новых email/сообщений в Facebook/лайков в Instagram? На самом деле ваш телефон - однорукий бандит. Принцип тот же, что и в казино. Простое действие (обновление страницы) - и мгновенная награда (новый коммент, лайк или сообщение). Человеческий мозг попадается на такие зависимости уже тысячи лет.

На коллективной фотке вас отметил ваш босс, а других коллег - нет? Не обольщайтесь и не ждите скорого повышения, в 99% случаев в этот момент он и не думал о вас. Просто Facebook смог распознать именно ваше лицо на снимке и подтолкнул его к действию. Он оказал внимание социальной сети, а не вам. Возникающее в такие моменты чувство социального подтверждения — ложное.

Про эти и многие другие опасные аспекты UI/UX круто написано тут How Technology Hijacks People’s Minds — from a Magician and Google’s Design Ethicist.

Избегайте поверхностных задач

Так много дел, которые нужно сделать. И так легко попасть в ловушку "поверхностных" задач. Есть задачи которые имеют значение в долгосрочной перспективе. А есть все остальные, которых куда больше и которые куда проще. И очень легко оказаться в водовороте таких мелких дел, которые забирают все твое время и энергию, а взамен не дают практически ничего. Наш мозг любит делать выбор именно в пользу таких дел-пустышек, потому что их легче и быстрее сделать и получить никому не нужный результат, который является легкой наградой для мозга (см. пример с постоянным обновлением ленты событий из Как технологии обманывают наш мозг, опять же однорукий бандит в действии). Ответить на дюжину email от коллег, вместо того, чтобы выключить все уведомления, сконцентрироваться и написать новый сложный модуль - ваш мозг к вашим услугам, и вот вы уже открываете ваш любимый редактор кода почтовый клиент...

Самые крутые ученые и писатели делают выбор именно в пользу "глубоких" задач, банально отфильтровывая все остальные. Внешне такое поведение может напоминать лень (когда игнорируются некоторые дела) или даже невоспитанность (когда игнориуется излишнее общение). Но только так можно добиться действительно значимых результатов! Концентрация, концентрация, концентрация!

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