Примечание — Это адаптированный перевод статьи Execution in the Kingdom of Nouns by Steve Yegge. Мнение администрации Хекслета может не совпадать с мнением автора оригинала.
- Переполнение мусорного ведра
- Сказание о Королевстве Существительных
- Глаголы в соседних королевствах
- Если копнуть глубже...
- Счастливо ли живётся жителям Джаваленда?
- StateManager.getConsiderationSetter("Noun Oriented Thinking", State.HARMFUL).run()
В тридевятом царстве, в тридесятом государстве жил-поживал король Ява, да заставлял он всех отказываться от глаголов.
Предупреждение: скоро сказка сказывается, да нет в ней счастливого конца. А ещё эта сказка не для обидчивых людей. Если вас легко задеть, лучше не читайте эту историю.
Прежде чем начать наш рассказ, давайте разберёмся с концептуальными вещами.
Переполнение мусорного ведра
Все люди в Королевстве Существительных любят юзкейсы или сценарии использования. Давайте начнём рассказ с юзкейса — выноса мусора. Когда надо вынести мусор, мы говорим друг другу: «Вынеси мусор, ведро уже полное!»
Если вы — обычный русскоязычный человек, который чинит автомобили или строит дома, и вас попросят описать процесс выноса мусора, вы скажете или напишете примерно следующее:
- Достать мусорный мешок из ведра
- Отнести мешок к мусоропроводу или к мусорным бакам на улице
- Выбросить мусор
- Вернуться в квартиру
- Вымыть руки
- Снова бахнуться на диван
- Продолжить играть в «фифу» или что вы там делали
А если вы — простой англоязычный человек, ваше описание с поправкой на бытовые особенности будет выглядеть примерно так:
- get the garbage bag from under the sink
- carry it out to the garage
- dump it in the garbage can
- walk back inside
- wash your hands
- plop back down on the couch
- resume playing your video game
Независимо от того, на каком языке вы разговариваете, ваше описание состоит из набора действий, которые нужно выполнить, чтобы вынести мусор. Наши жизни и наши мысли состоят из действий: мы живём, дышим, ходим, разговариваем, смеёмся, плачем, надеемся, боимся, едим и так далее. Что очень важно, мы сами выбираем, что делать и как действовать. Именно в этом проявляется свобода воли.
Конечно, в наших жизнях и мыслях есть место для существительных. Мы едим существительные, покупаем их, сидим на них, спим на них, ездим на них. Существительное может свалиться вам на голову, и после этого у вас на существительном выскочит большое существительное. Существительные — это вещи, а как мы можем прожить без вещей? Но они — просто вещи, ничего более. Вот стоит дом, а за домом стоит гора. Любой ребёнок может назвать сотни вещей. Но вещи становятся интересными только благодаря изменениям, которые происходят с ними.
Изменения требуют действий. А действия наполняют жизнь красками. Нас окружают существительные, но вся полнота жизни раскрывается благодаря глаголам. Конечно, кроме существительных и глаголов есть ещё прилагательные, местоимения, союзы и все остальные части речи. Все они играют свои важные роли, поэтому их нельзя игнорировать. Разве это не было бы странным, если бы мы вдруг решили больше не использовать глаголы? Но есть на земле место, где происходит именно это.
Сказание о Королевстве Существительных
В Королевстве Джаваленд, где железной кремниевой рукой правит король Ява, людям запрещено думать и действовать так, как привыкли это делать мы с вами. В этом королевстве по приказу Явы самыми важными частями речи считаются существительные. Они — самые почитаемые граждане этого королевства. Они ходят по улицам с важным видом в красивых нарядах, которые стали красивыми благодаря прилагательным. Сами прилагательные живут не так хорошо, как существительные, но всё равно они благодарят небеса за то, что они не родились глаголами. Потому что у глаголов в этом королевстве незавидная судьба.
В Королевстве Джаваленд по указанию короля Явы глаголы принадлежат существительным. Но они не просто живут и радуются жизни, как домашние коты у людей. Глаголы в Джаваленде делают любую работу. По сути, они живут в королевстве на правах рабов или крепостных крестьян. Все жители Джаваленда привыкли к этому и даже не знают, что в других землях может быть по-другому.
За всю работу в Джаваленде отвечают глаголы. Но они бесправные, поэтому им нельзя даже просто свободно гулять. Глагол может появляться на людях только в том случае, если его сопровождает существительное, которому он принадлежит.
«Сопровождает» — это тоже глагол, он не может находиться на людях сам. Поэтому на сцену надо позвать существительное VerbEscorter («СопровождательГлаголов»), которое обеспечивает сопровождение. Но «позвать» и «обеспечивает» — тоже глаголы. Рядом с ними всегда будут существительные «Зватель» и «Обеспечитель», которые заставят свои глаголы выполнять «Вызывание» и «Обеспечение».
Король по указанию самого бога Солнца время от времени угрожал изгнать все глаголы из королевства Джаваленд.
Примечание — Здесь автор оригинала использует словосочетание Sun God. Это явный намёк на компанию Sun Microsystems, которая разработала язык Java в 90-е годы.
Если бы эти планы осуществились, жителям королевства понадобился бы как минимум один глагол чтобы выполнять действия. У короля Явы тонкое чувство юмора, поэтому он пообещал оставить один глагол — «выполнять».
Примечание — Это игра слов: английский глагол «to execute» переводится как «выполнять» или «казнить».
Глагол «выполнять» и его ближайшие родственники «запускать», «стартовать», «исполнять», «делать» (run, start, go и так далее) могут заменить любой другой глагол. Для этого они используют существительное Выполнитель (Executioner
) и вызов «выполнить» (execute()
). Например, нужно подождать (англ. to wait)? Появляется Ждун (Waiter
) с вызовом execute()
: Waiter.execute()
. Нужно почистить зубы? Появляется ToothBrusher(MyTeeth).go()
. Нужно вынести мусор? В дело вступает TrashDisposalPlanExecutor.doIt()
. Ни один глагол не может чувствовать себя в безопасности: всех в Джаваленде можно заменить на существительное-выполнителя.
Может показаться, что в самых патриотичных уголках Джаваленда существительные полностью изгнали глаголы. Но это не так: существительные просто лишили глаголы не только прав, но и имён. Они заставляют глаголы называться именем существительных: вместо Waiter.execute()
надо использовать Waiter.wait()
, а вместо ToothBrusher(MyTeeth).go()
— ToothBrusher(MyTeeth).brush()
. По сути, многочисленные палачи-вассалы короля Явы маскируются за именами своих существительных-сюзеренов.
Глаголы в соседних королевствах
В соседних королевствах избавление от мусора — простое действие. Его можно описать почти так же, как мы описываем его на русском или английском языке. Как и в Джаваленде, данные здесь — это существительные, а функции — глаголы. Но, в отличие от Джаваленда, в соседних королевствах существительные и функции существуют рядом и действуют сообща на равных правах, если это нужно для общего дела.
Например, в соседних Силяндии, Джаваскриптбурге, Перлсберри или Рубиленде избавление от мусора можно представить в качестве серии действий, то есть глаголов или функций. Чтобы вынести мусор, нужно применить эти действия к нужным объектам в правильном порядке. Например, взять мусорное ведро, отнести его к мусоропроводу, выбросить мусор в трубу мусоропровода. Действия здесь можно выполнять без сопровождающих и надзирателей.
В соседних королевствах глаголы — самостоятельные действующие лица, поэтому здесь очень редко возникает потребность в существительных-обёртках. Здесь нет Ждунов (Waiter
) или чистильщиков зубов (ToothBrusher
). В этих королевставах можно просто просто использовать подхотящие глаголы: wait()
чтобы подождать или brushTeeth()
чтобы почистить зубы.
В соседних королевствах обычно есть специальные механизмы, которые позволяют при необходимости создать важное существительное. Если изобретатели в этих королевствах создают что-то инновационное, например, комбайн для обработки полей, умный дом или электрическую зубную щётку, они могут использовать класс, у которого есть имя, описание, состояние и инструкции по использованию инновационного объекта.
Важное отличие соседних королевств от Джаваленда в том, что глаголы в них могут жить независимо. Они не нуждаются в существительных, которые ими управляют. Например, глаголу wait()
не нужен Ждун (Waiter
).
Но жители королевства Джаваленд презирают своих соседей. Так повелось издавна в Землях Программирования.
Если копнуть глубже...
В другом конце мира есть малоизведанные земли, в которых глаголы — важные и высокопоставленные граждане. В этих землях есть функциональные королевства Оккамлия, Хаскелляндия, Кложаленд и другие. Жители этих королевств редко встречаются с жителями Джаваленда. Поскольку функциональные королевства находятся в малоизведанных землях, у их жителей бывает много свободного времени. Иногда жители функциональных королевств от скуки ругают друг друга и даже воюют друг с другом.
В функциональных королевствах глаголы и существительные считаются гражданами с равными правами. Однако существительные здесь обычно ничего не делают. Они ничего не запускают и не выполняют, поскольку всё это делают за них глаголы. В этих королевствах нет странных законов, которые требовали бы создавать существительные для сопровождения глаголов. Поэтому в функциональных землях всегда ровно столько существительных, сколько есть вокруг реальных вещей.
Из-за такого порядка вещей глаголы в функциональных королевствах всегда на виду. Эти глаголы, то есть функции, даже могут показаться самыми главными жителями функциональных королевств. В конце концов, королевства ведь называются функциональными, а не предметными или объектными.
За функциональными королевствами, на самом краю земли, стоит легендарный град Лямбда-Абсолютий. В этом граде существительных вообще нет, в нём есть только глаголы. Конечно, в Лямбда-Абсолютии есть вещи, но их названия происходят от глаголов. Даже числа, с помощью которых считают лямбды (это местная валюта), происходят от глаголов. Здесь 0
обозначается так: lambda()
. А 1
— это lambda(lambda())
. Легко догадаться, что 2
— lambda(lambda(lambda()))
и так далее. Все существительные, глаголы и другие части речи в этом граде происходят от священного глагола lambda
.
Откровенно говоря, большинство жителей Джаваленда не знает о существовании далёких королевств. Вы можете представить их культурный шок, если бы они встретились с жителями функциональных земель? Чтобы выразить свои чувства, им пришлось бы придумать новые существительные, например, «ксенофобия».
Узнайте больше об операционных системах У нас есть курс по операционным системам. Зарегистрированные пользователи могут пройти его бесплатно. Другие бесплатные курсы можно найти по ссылке.
Счастливо ли живётся жителям Джаваленда?
Можно подумать, что жизнь в Джаваленде как минимум странная, а как максимум, жителям этой страны приходится решать задачи очень неэффективным способом. Вы можете оценить, как живётся джавалендерам, по детским стихам. Посмотрите, как дети в этой стране рассказывают известное стихотворение про гвоздь.
Примечание — Речь идёт о стихотворении о незабитом гвозде. На русском языке оно начинается так:
Из-за незабитого гвоздя потеряли подкову,
Из-за потерянной подковы потеряли лошадь,
Из-за потерянной лошади гонец не доставил послание,
Из-за недоставленного послания проиграли войну...
Автор представил его в виде псевдокода в характерном для Джаваленда стиле:
For the lack of a nail,
throw new HorseshoeNailNotFoundException("no nails!");
For the lack of a horseshoe,
EquestrianDoctor.getLocalInstance().getHorseDispatcher().shoot();
For the lack of a horse,
RidersGuild.getRiderNotificationSubscriberList().getBroadcaster().run(
new BroadcastMessage(StableFactory.getNullHorseInstance()));
For the lack of a rider,
MessageDeliverySubsystem.getLogger().logDeliveryFailure(
MessageFactory.getAbstractMessageInstance(
new MessageMedium(MessageType.VERBAL),
new MessageTransport(MessageTransportType.MOUNTED_RIDER),
new MessageSessionDestination(BattleManager.getRoutingInfo(
BattleLocation.NEAREST))),
MessageFailureReasonCode.UNKNOWN_RIDER_FAILURE);
For the lack of a message,
((BattleNotificationSender)
BattleResourceMediator.getMediatorInstance().getResource(
BattleParticipant.PROXY_PARTICIPANT,
BattleResource.BATTLE_NOTIFICATION_SENDER)).sendNotification(
((BattleNotificationBuilder)
(BattleResourceMediator.getMediatorInstance().getResource(
BattleOrganizer.getBattleParticipant(Battle.Participant.GOOD_GUYS),
BattleResource.BATTLE_NOTIFICATION_BUILDER))).buildNotification(
BattleOrganizer.getBattleState(BattleResult.BATTLE_LOST),
BattleManager.getChainOfCommand().getCommandChainNotifier()));
For the lack of a battle,
try {
synchronized(BattleInformationRouterLock.getLockInstance()) {
BattleInformationRouterLock.getLockInstance().wait();
}
} catch (InterruptedException ix) {
if (BattleSessionManager.getBattleStatus(
BattleResource.getLocalizedBattleResource(Locale.getDefault()),
BattleContext.createContext(
Kingdom.getMasterBattleCoordinatorInstance(
new TweedleBeetlePuddlePaddleBattle()).populate(
RegionManager.getArmpitProvince(Armpit.LEFTMOST)))) ==
BattleStatus.LOST) {
if (LOGGER.isLoggable(Level.TOTALLY_SCREWED)) {
LOGGER.logScrewage(BattleLogger.createBattleLogMessage(
BattleStatusFormatter.format(BattleStatus.LOST_WAR,
Locale.getDefault())));
}
}
}
For the lack of a war,
new ServiceExecutionJoinPoint(
DistributedQueryAnalyzer.forwardQueryResult(
NotificationSchemaManager.getAbstractSchemaMapper(
new PublishSubscribeNotificationSchema()).getSchemaProxy().
executePublishSubscribeQueryPlan(
NotificationSchema.ALERT,
new NotificationSchemaPriority(SchemaPriority.MAX_PRIORITY),
new PublisherMessage(MessageFactory.getAbstractMessage(
MessageType.WRITTEN,
new MessageTransport(MessageTransportType.WOUNDED_SURVIVOR),
new MessageSessionDestination(
DestinationManager.getNullDestinationForQueryPlan()))),
DistributedWarMachine.getPartyRoleManager().getRegisteredParties(
PartyRoleManager.PARTY_KING ||
PartyRoleManager.PARTY_GENERAL ||
PartyRoleManager.PARTY_AMBASSADOR)).getQueryResult(),
PriorityMessageDispatcher.getPriorityDispatchInstance())).
waitForService();
All for the lack of a horseshoe nail.
Как видите, в Джаваленде стихотворение сильно отличается от оригинала. Но жителям Джаваленда кажется, что в такой манере есть особый шарм.
Этот шарм, по мнению джавалендеров, заключается в том, что всем сразу видна архитектура. Король Ява сильно любит архитектуру, потому что она полностью состоит из существительных. Как мы помним, все существительные — это вещи, а в Джаваленде больше всего ценятся вещи. Архитектура состоит из вещей, которые можно увидеть и потрогать, которые состоят из камня и стекла и подпирают небосвод, которые громко звенят, если ударить по ним палкой. Король Ява очень любит громкий звон. Ему нравится пинать колёса и стучать по карете, когда он испытывает новый экипаж.
Одно из главных стремлений человека — построить убежище, которое надёжно защищает от любой стихии. В Джаваленде есть много вещей, которые помогают жителям почувствовать себя в безопасности. Люди смотрят на монументальные архитектурные сооружения и думают: «Это точно надёжный дизайн!»
Эти мысли подтверждаются, когда джавалендеры пытаются изменить структуру. Мощь архитектуры в такие моменты проявляется особенно сильно, и люди убеждаются, что никому не под силу разрушить здания.
В дополнение к надёжной архитектуре в Джаваленде всё упорядочено и разложено по полочкам. Вы всегда найдёте нужное существительное на его месте. И все истории развиваются по общему сценарию: объект является доминирующим типом выражения, в нём есть управляющий для каждой абстракции и метод run()
для каждого управляющего. Даже если у джавалендера нет большого опыта в проектировании, он понимает, что сможет оформить любую идею в характерном для Джаваленда стиле. В этом королевстве есть особый способ вычисления с помощью существительных, который помогает выразить любые абстракции и выполнить любые вычисления. Всё, что для этого нужно — существительные, конструкторы для них, методы доступа для обхода графов и execute()
, без которого никакие планы выполнить невозможно.
Жители Джаваленда не просто счастливы — они гордятся положением вещей!
StateManager.getConsiderationSetter("Noun Oriented Thinking", State.HARMFUL).run()
Или, как говорят в других королевствах за пределами Джаваленда, мышление, построенное на существительных, вредно. Именно эту мысль выражает псевдокод из подзаголовка.
Объектно-ориентированное программирование ставит существительные во главу угла. Но почему вы должны ставить одну часть речи выше других? Почему одна концепция должна быть лучше других? Ведь объектно-ориентированное программирование не делает глаголы менее важными в нашей повседневной жизни и в нашем способе мышления. Как сказал программист Джейкоб Гэбриэльсон из Amazon Web Services, отстаивать объектно-ориентированное программирование — это то же самое, что пропагандировать брюки-ориентированный стиль одежды.
Статическая типизация в королевстве Джаваленд, как и в других королевствах, тоже несёт с собой ряд проблем. Но слишком сильная зацикленность на существительных в процессе мышления и проектирования беспокоит даже сильнее. Любая система типизации заставляет разработчиков подстраиваться под неё, но отказ от глаголов выглядит необъяснимо и нерационально.
В C++ такой проблемы нет, поскольку в этом языке можно определять автономные функции. Более того, в C++ есть чёткая абстракция для пространства имён. А Java эксплуатирует идею классов для представления пространства имён, пользовательских типов, механизмов синтаксического делегирования, области видимости и много другого.
Не поймите этот посыл неправильно, здесь не идёт речь о том, что только C++ — хороший язык. Просто, по мнению автора этого сказания, в этом языке гибкая система типов, как минимум, по сравнению с Java. C++ страдает из-за проблем, вызванных тем, что разумные предложения заставляют слушателей закрывать уши и отмахиваться от вас или даже пытаться вас ударить. Из-за таких проблем с помощью C++ не всегда просто выразить конкретную мысль. Но по лаконичности C++ превосходит Java, потому что в C++ можно пользоваться глаголами. А кто захочет говорить на языке, в котором нет глаголов?
Действительно, классы — единственный инструмент проектирования, который есть в Java. Поэтому вам приходится брать приходящие в голову идеи и превращать их в предметы или существительные, даже если эти идеи по сути являются действиями, процессами или другими сущностями, не относящимися к вещам.
Автор этой истории всё время возвращается к тому, что когда-то говорили ему люди из древней страны Perl: «Эй, брат, не всё в этом мире есть объект».
Странно, что Java остаётся единственным из мейнстримных объектно-ориентированных языков, который придерживается радикального ориентированного на существительные способа думать и действовать. Вы не найдёте AbstractProxyMediator
, NotificationStrategyFactory
или подобные им существительные в Python или Ruby. Почему они так широко применяются в Java? Можно не сомневаться, что это объясняется разным отношением к глаголам. Python, Ruby, JavaScript, Perl и, конечно же, все функциональные языки позволяют объявлять и передавать функции как самодостаточные сущности, не оборачивая их в классы.
Конечно, это проще делать в динамически типизированных языках. Здесь вам достаточно передать ссылку на функцию, полученную из её названия. А ответственность вызывающего кода — выполнить функцию с подходящими аргументами и правильно использовать полученное значение.
Но многие языки со статической типизацией тоже позволяют работать с функциями как с объектами первого класса. В их число входят C, C++, Haskell, ML. Языку достаточно поддерживать синтаксис для создания, передачи и вызова функциональных литералов с подходящей сигнатурой типов.
Нет никаких причин, по которым Java не могла бы добавить поддержку функций первого класса и наконец-то войти во взрослый мир, где люди используют глаголы. На самом деле, существует язык на платформе JVM, который называется Nice. Его синтаксис похож на Java, а кроме того Nice поддерживает выразительные инструменты для использования глаголов: автономные функции, которые Java заставляет оборачивать в Callbacks или Runnables или другие анонимные интерфейсы классов, на которые можно ссылаться.
Sun даже не пришлось бы нарушать свою конвенцию, согласно которой все функции должны принадлежать классам. Каждая анонимная функция может иметь неявный указатель this
, который указывает на класс, в котором определена эта функция.
Неясно, почему Sun настаивает, чтобы Java оставалась в Королевстве Существительных. Автор этой истории сомневается, что дело в недооценке жителей Джаваленда. Sun добавили в язык дженерики, а это очень сложная концепция. То есть Sun не переживает о том, чтобы язык оставался простым. И это не значит, что всё плохо. Java — состоявшийся язык, и он давно готов к тому, чтобы у программистов появились инструменты, которые позволяют программировать так, как люди думают.
Если это произойдёт, жители Джаваленда смогут спокойно выносить мусор, а потом возвращаться домой, садиться на диван и дальше играть в «фифу».
Начните изучать разработку в групповом формате. В группах можно пройти профессии «Фронтенд-программист», «Node.js-программист», «PHP-программист», «Python-программист» и «Верстальщик».