Если вы никогда не слышали про Алана Кэя, то как минимум слышали его знаменитые цитаты. Например, это высказывание 1971 года:
The best way to predict the future is to invent it.
Лучший способ предсказать будущее это изобрести его.
У Алана очень яркая карьера в информатике. Он получил Премию Киото и Премию Тьюринга за работу над парадигмой объектно-ориентированного программирования. Он был одним из первопроходцев в области персональных компьютеров и графического интерфейса, он разработал Smalltalk — один из первых самых влиятельных языков программирования всех времен.
У нас в Хекслете, особенно в чате, постоянно поднимается вопрос «что такое ООП» и «что имел ввиду Алан Кэй на самом деле». В этой заметке собраны интересные цитаты Алана о состоянии современной разработки, ООП и языке Лисп.
Про разработку ПО
Алан Кэй считает, что компьютерная революция еще впереди (The Real Computer Revolution Hasn’t Happened Yet), и разработка ПО развивается обратно пропорционально Закону Мура: железо улучшается каждый год, а софт становится раздутее без надобности:
проблема в слабых, плохо масштабируемых идеях и инструментах, лени, нехватке знаний и т.д.
Эту ситуацию хорошо описывает короткая шутка:
What Andy giveth, Bill taketh away
Энди дал, Билл взял
Энди Грув, CEO Интела, и Билл Гейтс, тогдашний CEO Майкрософта.
Улучшение текущего состояние разработки было целью исследовательского проекта STEPS Toward The Reinvention of Programming (pdf). Задача — достигнуть «Закона Мура» в выразительности через «сокращение количества необходимого кода в 100, 1000, 10000 раз и больше».
В его открывающем глаза докладе Programming and Scaling (видео) эта тема рассматриватеся подробнее. По мнению Алана, software engineering заглох и становится забытой наукой, которая не успевает за железом, другими науками и инженерными дисциплинами. Большие проекты стали свалками кода и достигли такой точки, когда никто не способен понять 100 миллионов строк кода MS Vista или MS Word. А в реальности кода в таких проектах должно быть на порядок меньше.
Алан считает Интернет, протоколы TCP/IP, интерпретаторы LISP, Nile (Math DSL for Vector Graphics) и OMeta (OO PEG) (PDF) примерами элегантного софта с минимальным кодом.
Он называет Интернет (TCP/IP) одним из немногих масштабных софтверных проектов, который был правильно разработан, и его уровень сложности — в балансе с уровнем комплексности (complication vs. complexity). Этот проект, в котором меньше 20 тысяч строк кода, работает как живая, динамическая система, способная поддерживать миллиарды узлов, и она ни разу не отключалась после первого запуска в сентябре 1969 года. Мы просто перестали считать Интернет нормальным софт-проектом, созданным людьми:
Интернет разработан настолько хорошо, что многие относятся к нему как к естественному ресурсу, вроде Тихого океана, а не к плоду человеческого труда. Когда в последний раз мы видели настолько стабильную, четкую технологию без ошибок? Для сравнения, Веб это ерунда. Веб создан дилетантами.
Про объектно-ориентированное программирование
Первое, что меня интересовало, это его первоначальное видение ООП. Его опыт в микробиологии сыграл важную роль:
Я считал объекты чем-то вроде биологических клеток, и/или отдельных компьютеров в сети, которые могут общаться только через сообщения.
и опыт в математике:
Мой опыт в математике заставил меня понять, что каждый объект может иметь несколько алгебр, они могут объединяться в семейства, и это может быть очень полезным.
Идеи позднего свзяывания и мощных мета-возможностей LISPa:
Вторая фаза — это понимание LISPa и использование этого понимания для создания более удобных, маленьких и мощных структур и более позднее связывание.
И вскоре Алан стал поддерживать идею того, что динамические языки это будущее разработки ПО (pdf). В частности, ему важна легкость изменения:
Позднее связывание позволяет с меньшими усилиями встраивать в проект идеи, которые возникли позже в процессе разработки (по сравнению с системами с более ранним связыванием вроде C, C++, Java, и пр.)
И потенциал для изменений на ходу и более быстрых итераций:
Одна из ключевых идей: система должна продолжать работу во время тестирования о особенно во время произведения изменений. Даже крупные изменения должны быть поэтапными и занимать не больше доли секунды.
который отсутствует в статически-типизированных языках:
Если вы используете языки с ранним связыванием, как это делает большинство, то вы запираете себя в рамки того, что уже написали. Переформулировать с легкостью уже не получится.
Удивительно, но его мысл про ООП ограничивались этим:
ООП для меня это сообщения, локальное удержание и защита, скрытие состояния и позднее связывание всего. Это можно сделать в Smalltalk и в LISP.
И ничего про наследование. Это не тот ООП, который мы знаем сегодня:
Мне жаль, что давным давно я использовал термин «объект» для этой темы, потому что из-за этого многие люди фокусируются на меньшей из идей.
Большая идея, которой не хватает современным статически-типизированным ОО-языкам:
Большая идея это «сообщения»
Он считает, что нужно фокусироваться на сообщениях, слабой связи и взаимодействии модулей, а не на внутренностях объекта:
Ключ к созданию хороших масштабируемых систем это проработка механизмов общения модулей, а не проработка их внутренних свойств и поведения.
Статически-типизированные языки кажутся ему неполноценными:
Я не против типов, но мне не знакома ни одна система типов, которая не вызывала бы боли. Так что мне все еще нравится динамическая типизация.
Некоторые популярные языки сегодня используют идеи передачи сообщений Smalltalk'а, позднее связывание, и конструкцию doesNotUnderstand: forwardInvocation в Objective-C, method_missing в Ruby и noSuchMethod в Гугловском Dart.
Уничтожить все и создать что-то лучше
У Алана есть интересная теория о развитии информатики:
Мне кажется, что существует только один тип компьютерной науки, и это наука похожа на строительство мостов. Кто-то строит мосты, а кто-то разрушает их и создает новые теории. И нам нужно продолжать строить мосты.
Про LISP
Алан Кэй считает Лисп
лучшим языком программирования всех времен
И что его должен изучать каждый выпускник в computer science:
Большинство людей, получающих дипломы в CS, не понимают всей важности Lisp. Lisp это самая важная идея в computer science.
Про правильную атмосферу и контекст
Он часто вспоминает об уникальной атмосфере в Xerox PARC и ARPA, где «видение важнее целей» и «финансирование людей, а не проектов».
Точка зрения дает 80 баллов IQ.
Алан Кэй считает:
История ARPA/PARC демонстрирует, как комбинация видения, скромного финансирования, правильного контекста и процесса может волшебным образом рождать новые технологии, которые не только влияют на цивилизацию, но и создают огромную ценность для общества.
И это правда. Взгляните на впечатляющий список изобретений PARC, многие из которых сыграли очень важную роль в развитии нашего мира. Например:
- Лазерные принтеры
- Объектно-ориентированное программирование / Smalltalk
- Персональные компьютеры
- Ethernet / распределенные вычисления
- GUI / компьютерная мышь / WYSIWYG
А в ARPA создали ARPANET, который стал прародителем Интернета.
P.S. Алан Кэй отвечает на вопросы сообщества Hacker News.