Примечание — Это адаптированный перевод статьи Execution in the Kingdom of Nouns by Steve Yegge. Мнение администрации Хекслета может не совпадать с мнением автора оригинала.
В тридевятом царстве, в тридесятом государстве жил-поживал король Ява, да заставлял он всех отказываться от глаголов.
Предупреждение: скоро сказка сказывается, да нет в ней счастливого конца. А ещё эта сказка не для обидчивых людей. Если вас легко задеть, лучше не читайте эту историю.
Прежде чем начать наш рассказ, давайте разберёмся с концептуальными вещами.
Содержание
Переполнение мусорного ведра
Все люди в Королевстве Существительных любят юзкейсы или сценарии использования. Давайте начнём рассказ с юзкейса — выноса мусора. Когда надо вынести мусор, мы говорим друг другу: «Вынеси мусор, ведро уже полное!»
Если вы — обычный русскоязычный человек, который чинит автомобили или строит дома, и вас попросят описать процесс выноса мусора, вы скажете или напишете примерно следующее:
-
Достать мусорный мешок из ведра
-
Отнести мешок к мусоропроводу или к мусорным бакам на улице
-
Выбросить мусор
-
Вернуться в квартиру
-
Вымыть руки
- Снова бахнуться на диван
-
Продолжить играть в «фифу» или что вы там делали
А если вы — простой англоязычный человек, ваше описание с поправкой на бытовые особенности будет выглядеть примерно так:
-
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.
Откровенно говоря, большинство жителей Джаваленда не знает о существовании далёких королевств. Вы можете представить их культурный шок, если бы они встретились с жителями функциональных земель? Чтобы выразить свои чувства, им пришлось бы придумать новые существительные, например, «ксенофобия».
Узнайте больше об операционных системах
У нас есть курс по операционным системам. Зарегистрированные пользователи могут пройти его бесплатно. Другие бесплатные курсы можно найти по ссылке.
Счастливо ли живётся жителям Джаваленда?
Можно подумать, что жизнь в Джаваленде как минимум странная, а как максимум, жителям этой страны приходится решать задачи очень неэффективным способом. Вы можете оценить, как живётся джавалендерам, по детским стихам. Посмотрите, как дети в этой стране рассказывают известное стихотворение про гвоздь.
Примечание — Речь идёт о стихотворении о незабитом гвозде. На русском языке оно начинается так:
Из-за незабитого гвоздя потеряли подкову,
Из-за потерянной подковы потеряли лошадь,
Из-за потерянной лошади гонец не доставил послание,
Из-за недоставленного послания проиграли войну...
Автор представил его в виде псевдокода в характерном для Джаваленда стиле:
Как видите, в Джаваленде стихотворение сильно отличается от оригинала. Но жителям Джаваленда кажется, что в такой манере есть особый шарм.
Этот шарм, по мнению джавалендеров, заключается в том, что всем сразу видна архитектура. Король Ява сильно любит архитектуру, потому что она полностью состоит из существительных. Как мы помним, все существительные — это вещи, а в Джаваленде больше всего ценятся вещи. Архитектура состоит из вещей, которые можно увидеть и потрогать, которые состоят из камня и стекла и подпирают небосвод, которые громко звенят, если ударить по ним палкой. Король Ява очень любит громкий звон. Ему нравится пинать колёса и стучать по карете, когда он испытывает новый экипаж.
Одно из главных стремлений человека — построить убежище, которое надёжно защищает от любой стихии. В Джаваленде есть много вещей, которые помогают жителям почувствовать себя в безопасности. Люди смотрят на монументальные архитектурные сооружения и думают: «Это точно надёжный дизайн!»
Эти мысли подтверждаются, когда джавалендеры пытаются изменить структуру. Мощь архитектуры в такие моменты проявляется особенно сильно, и люди убеждаются, что никому не под силу разрушить здания.
В дополнение к надёжной архитектуре в Джаваленде всё упорядочено и разложено по полочкам. Вы всегда найдёте нужное существительное на его месте. И все истории развиваются по общему сценарию: объект является доминирующим типом выражения, в нём есть управляющий для каждой абстракции и метод 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-программист» и «Верстальщик».
<!DOCTYPE html>
<html class="h-100" data-bs-theme="light" data-mantine-color-scheme="light" lang="ru" prefix="og: https://ogp.me/ns#">
<head>
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<link crossorigin="true" href="https://cdn.hexlet.io" rel="preconnect">
<link href="https://mc.yandex.ru" rel="preconnect">
<meta content="aa2vrdtq64dub8knuf83lwywit311w" name="facebook-domain-verification">
<link href="/favicon.ico" rel="icon" sizes="any">
<link href="/favicon.svg" rel="icon" type="image/svg+xml">
<link href="/apple-touch-icon.png" rel="apple-touch-icon">
<link href="/manifest.webmanifest" rel="manifest">
<script>
//<![CDATA[
window.gon={};gon.ym_counter="25559621";gon.is_bot=true;gon.applications={};gon.current_user={"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26 23:24:35 UTC","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false};gon.token="XP1P2unfkbKVwPz8ggIwdRNJH93iaVlo0WArnycckDGzLITtG6E80iOD2GSODcAC00Ayd-pep8psgLHLdRt3Xw";gon.locale="ru";gon.language="ru";gon.theme="light";gon.rails_env="production";gon.mobile=false;gon.google={"analytics_key":"UA-1360700-51","optimize_key":"GTM-5QDVFPF"};gon.captcha={"google_v3_site_key":"6LenGbgZAAAAAM7HbrDbn5JlizCSzPcS767c9vaY","yandex_site_key":"ysc1_Vyob5ZPPUdPBsu0ykt8bVFdzsfpoVjQChLGl2b4g19647a89","verification_failed":null};gon.social_signin=false;gon.typoreporter_google_form_id="1FAIpQLSeibfGq-KvWQ2Fyru-zkFFRVTLBuzXAHAoEyN1p49FtDmNoNA";
//]]>
</script>
<meta charset="utf-8">
<title>О тяжёлой судьбе глаголов в Королевстве Существительных</title>
<meta name="description" content="В королевстве Джаваленд, где кремниевой рукой правит король Ява, людям запрещено думать и действовать так, как привыкли это делать мы с вами. В этом королевстве по приказу Явы самыми важными частями речи считаются существительные. Они — самые почитаемые граждане этого королевства. Они ходят по">
<link rel="canonical" href="https://ru.hexlet.io/blog/posts/javaland">
<meta property="og:title" content="О тяжёлой судьбе глаголов в Королевстве Существительных">
<meta property="og:description" content="В королевстве Джаваленд, где кремниевой рукой правит король Ява, людям запрещено думать и действовать так, как привыкли это делать мы с вами. В этом королевстве по приказу Явы самыми важными частями речи считаются существительные. Они — самые почитаемые граждане этого королевства. Они ходят по улицам с важным видом в красивых нарядах, которые стали красивыми благодаря прилагательным.">
<meta property="og:image" content="https://ru.hexlet.io/vite/assets/blog_post-7eTyeLLt.webp">
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="h0ys53_AaTad2uyk-MjYwJ4xzN5CKz1UFMb1GUQimWdonWfQjb7EViuZyDz0xyi3XjjhdEocw_apJm9NFiV-CQ" />
<script src="/vite/assets/inertia-DfXos102.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/preload-helper-BJ4cLWpC.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-BrRXra1y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ahoy-DrlRQ-1D.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/analytics-cb8xch9l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Surface-DL2bpZA-.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/extends-C-EagtpE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/inheritsLoose-BBd-DCVI.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/objectWithoutPropertiesLoose-DRHXDhjp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/index.esm-DAqKOkZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Button-CGPUux8l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/CloseButton-D1euiPao.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Group-BX48WcuU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Loader-BQEY8g6v.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Modal-Cy3HByv7.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/OptionalPortal-1Hza5P2w.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Stack-CtjJzfw4.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Textarea-Ck64llAy.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/DirectionProvider-Dc9zdUke.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/events-DJQOhap0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-reduced-motion-D2owz4wa.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-disclosure-zKtK5W1r.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-hotkeys-Cnc_Rwkb.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/random-id-DOQyszCZ.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/exports-C_MrNx_T.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<link rel="stylesheet" href="/vite/assets/application-BqhCP46M.js" />
<script src="/vite/assets/application-Df9RExpe.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/autocomplete-VMNbxKGl.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/createPopper-C3aM9r1M.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/js.cookie-D1-O8zkX.js" as="script" crossorigin="anonymous"><link rel="stylesheet" href="/vite/assets/application-C8HjmMaq.css" media="screen" />
<script>
window.ym = function(){(ym.a=ym.a||[]).push(arguments)};
window.addEventListener('load', function() {
setTimeout(function() {
ym.l = 1*new Date();
ym(window.gon.ym_counter, "init", {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true
});
// Загружаем скрипт
var k = document.createElement('script');
k.async = 1;
k.src = 'https://mc.yandex.ru/metrika/tag.js';
document.head.appendChild(k);
ym(window.gon.ym_counter, 'getClientID', function(clientID) {
window.ymClientId = clientID;
});
}, 1500);
});
</script>
<!-- Google Tag Manager - deferred -->
<script>
// dataLayer stub сразу — пуши работают до загрузки скрипта
window.dataLayer = window.dataLayer || [];
// Сам скрипт — отложенно после load
window.addEventListener('load', function() {
setTimeout(function() {
dataLayer.push({'gtm.start': new Date().getTime(), event: 'gtm.js'});
var j = document.createElement('script');
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=GTM-WK88TH';
document.head.appendChild(j);
}, 1500);
});
</script>
<!-- End Google Tag Manager -->
</head>
<body>
<noscript>
<div>
<img alt="" src="https://mc.yandex.ru/watch/25559621" style="position:absolute; left:-9999px;">
</div>
</noscript>
<header class="sticky-top bg-body">
<nav class="navbar navbar-expand-lg">
<div class="container-xxl">
<a class="navbar-brand" href="/"><img alt="Логотип Хекслета" height="24" src="https://ru.hexlet.io/vite/assets/logo_ru_light-BpiEA1LT.svg" width="96">
</a><button aria-controls="collapsable" aria-expanded="false" aria-label="Меню" class="navbar-toggler border-0 mb-0 mt-1" data-bs-target="#collapsable" data-bs-toggle="collapse">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsable">
<ul class="navbar-nav mb-lg-0 mt-lg-1">
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
Все курсы
<span class="bi bi-chevron-down align-middle ms-1"></span>
</button>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item d-flex py-2" href="/courses"><div class="fw-bold me-auto">Все что есть</div>
<div class="text-muted">117</div>
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные категории</b>
</li>
<li>
<a class="dropdown-item py-2" href="/courses_devops">Курсы по DevOps
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_data_analytics">Курсы по аналитике данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_programming">Курсы по программированию
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_testing">Курсы по тестированию
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные курсы</b>
</li>
<li>
<a class="dropdown-item py-2" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/go">Go-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/java">Java-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/python">Python-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/qa-auto-engineer-java">Автоматизатор тестирования на Java
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/data-analytics">Аналитик данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/frontend">Фронтенд-разработчик
</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
О Хекслете
<span class="bi bi-chevron-down align-middle"></span>
</button>
<ul class="dropdown-menu bg-body">
<li>
<a class="dropdown-item py-2" href="/pages/about">О нас
</a></li>
<li>
<a class="dropdown-item py-2" href="/blog">Блог
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/hse-research" role="button">Результаты (Исследование)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://career.hexlet.io" role="button">Хекслет Карьера
</span></li>
<li>
<a class="dropdown-item py-2" href="/testimonials">Отзывы студентов
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://t.me/hexlet_help_bot" role="button">Поддержка (В ТГ)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/referal-program/?promo_creative=priglasite-druzei&promo_name=referal-program&promo_position=promo_position&promo_start=010724&promo_type=link" role="button">Реферальная программа
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/certificate" role="button">Подарочные сертификаты
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://hh.ru/employer/4307094" role="button">Вакансии
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://b2b.hexlet.io" data-target="_blank" role="button">Компаниям
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexly.ru/" data-target="_blank" role="button">Колледж
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexlyschool.ru/" data-target="_blank" role="button">Частная школа
</span></li>
</ul>
</li>
<li><a class="nav-link" href="/subscription/new">Подписка</a></li>
</ul>
<ul class="navbar-nav flex-lg-row align-items-lg-center gap-2 ms-auto">
<li>
<a class="nav-link" aria-label="Переключить тему" href="/theme/switch?new_theme=dark"><span aria-hidden="true" class="bi bi-moon"></span>
</a></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="/u/new" role="button"><span>Регистрация</span>
</span></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="https://ru.hexlet.io/session/new" role="button"><span>Вход</span>
</span></li>
</ul>
</div>
</div>
</nav>
</header>
<div class="x-container-xxxl">
</div>
<main class="mb-6 min-vh-100 h-100">
<link rel="preload" as="image" href="/vite/assets/blog_post-7eTyeLLt.webp"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzczNSwicHVyIjoiYmxvYl9pZCJ9fQ==--883f3fd4e1b571538035b5680c8d4a9eb504b1f6/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Source%20code-amico.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAxNiwicHVyIjoiYmxvYl9pZCJ9fQ==--eb66b9b5e26fafa32844ce0f4522c3ed84544040/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Hand%20coding-rafiki.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAxOSwicHVyIjoiYmxvYl9pZCJ9fQ==--84efd2b6854b7000046e9ce06e6be85d38af5ab8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/JavaScript%20frameworks-cuate.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc0OSwicHVyIjoiYmxvYl9pZCJ9fQ==--846349326718432328cf5c0677091aca67f80af3/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Developer%20activity-amico%20(1).png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAwNywicHVyIjoiYmxvYl9pZCJ9fQ==--f0b38f0e25ed59255acec6eaeaeec0a99aec453f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Binary%20code-rafiki.png"/><link rel="preload" as="image" href="/vite/assets/development-BVihs_d5.png"/><div id="app" data-page="{"component":"web/blog/posts/show","props":{"errors":{},"locale":"ru","language":"ru","httpsHost":"https://ru.hexlet.io","host":"ru.hexlet.io","colorScheme":"light","auth":{"user":{"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26T23:24:35.406Z","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false}},"cloudflareTurnstileSiteKey":"0x4AAAAAAA15KmeFXzd2H0Xo","vkIdClientId":"51586979","yandexIdClientId":"88d071f1d3384eb4bd1deb37910235c7","formAuthToken":"fEkCVYO05IzlCDkVv-noHMIw0dtPwqMB00rVu6duNiCTmMliccpJ7FNLHY2z5hhrAjn8cUf1XaNuqk_v9WnRTg","post":{"model_name":"BlogPost","category":{"id":6,"name":"Мотивация","slug":"motivation","state":"published","created_at":"2016-10-06T18:31:38.903Z"},"creator":{"public_name":"Дмитрий Дементий","id":174372,"is_tutor":false},"tags":[{"id":887,"slug":"java","name":"Java"}],"id":1096,"title":"О тяжёлой судьбе глаголов в Королевстве Существительных","slug":"javaland","state":"published","summary":"В королевстве Джаваленд, где кремниевой рукой правит король Ява, людям запрещено думать и действовать так, как привыкли это делать мы с вами. В этом королевстве по приказу Явы самыми важными частями речи считаются существительные. Они — самые почитаемые граждане этого королевства. Они ходят по улицам с важным видом в красивых нарядах, которые стали красивыми благодаря прилагательным. Сами прилагательные живут не так хорошо, как существительные, но всё равно они благодарят небеса за то, что они не родились глаголами. Потому что у глаголов в этом королевстве незавидная судьба. ","votes_count":10,"created_at":"2020-11-09T10:01:59.684Z","published_at":"2020-11-10T08:38:28.682Z","body":"*Примечание — Это адаптированный перевод статьи [Execution in the Kingdom of Nouns](http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html) by Steve Yegge. Мнение администрации Хекслета может не совпадать с мнением автора оригинала.*\n\nВ тридевятом царстве, в тридесятом государстве жил-поживал король Ява, да заставлял он всех отказываться от глаголов. \n\nПредупреждение: скоро сказка сказывается, да нет в ней счастливого конца. А ещё эта сказка не для обидчивых людей. Если вас легко задеть, лучше не читайте эту историю. \n\nПрежде чем начать наш рассказ, давайте разберёмся с концептуальными вещами. \n\n::programs\n\n## Содержание\n\n## Переполнение мусорного ведра\n\nВсе люди в Королевстве Существительных любят юзкейсы или сценарии использования. Давайте начнём рассказ с юзкейса — выноса мусора. Когда надо вынести мусор, мы говорим друг другу: «Вынеси мусор, ведро уже полное!»\n\nЕсли вы — обычный русскоязычный человек, который чинит автомобили или строит дома, и вас попросят описать процесс выноса мусора, вы скажете или напишете примерно следующее:\n\n- *Достать* мусорный мешок из ведра\n- *Отнести* мешок к мусоропроводу или к мусорным бакам на улице\n- *Выбросить* мусор\n- *Вернуться* в квартиру\n- *Вымыть* руки\n- Снова *бахнуться* на диван\n- *Продолжить играть* в «фифу» или что вы там делали\n\nА если вы — простой англоязычный человек, ваше описание с поправкой на бытовые особенности будет выглядеть примерно так:\n\n- *get* the garbage bag from under the sink\n- *carry* it out to the garage\n- *dump* it in the garbage can\n- *walk* back inside\n- *wash* your hands\n- *plop* back down on the couch\n- *resume* playing your video game\n\nНезависимо от того, на каком языке вы разговариваете, ваше описание состоит из набора действий, которые нужно выполнить, чтобы вынести мусор. Наши жизни и наши мысли состоят из действий: мы живём, дышим, ходим, разговариваем, смеёмся, плачем, надеемся, боимся, едим и так далее. Что очень важно, мы сами выбираем, что делать и как действовать. Именно в этом проявляется свобода воли. \n\nКонечно, в наших жизнях и мыслях есть место для существительных. Мы едим существительные, покупаем их, сидим на них, спим на них, ездим на них. Существительное может свалиться вам на голову, и после этого у вас на существительном выскочит большое существительное. Существительные — это вещи, а как мы можем прожить без вещей? Но они — просто вещи, ничего более. Вот стоит дом, а за домом стоит гора. Любой ребёнок может назвать сотни вещей. Но вещи становятся интересными только благодаря изменениям, которые *происходят* с ними. \n\nИзменения требуют действий. А действия наполняют жизнь красками. Нас окружают существительные, но вся полнота жизни раскрывается благодаря глаголам. Конечно, кроме существительных и глаголов есть ещё прилагательные, местоимения, союзы и все остальные части речи. Все они играют свои важные роли, поэтому их нельзя игнорировать. Разве это не было бы странным, если бы мы вдруг решили больше не использовать глаголы? Но есть на земле место, где происходит именно это. \n\n## Сказание о Королевстве Существительных\n\nВ Королевстве Джаваленд, где ~~железной~~ кремниевой рукой правит король Ява, людям запрещено думать и действовать так, как привыкли это делать мы с вами. В этом королевстве по приказу Явы самыми важными частями речи считаются существительные. Они — самые почитаемые граждане этого королевства. Они ходят по улицам с важным видом в красивых нарядах, которые стали красивыми благодаря прилагательным. Сами прилагательные живут не так хорошо, как существительные, но всё равно они благодарят небеса за то, что они не родились глаголами. Потому что у глаголов в этом королевстве незавидная судьба. \n\nВ Королевстве Джаваленд по указанию короля Явы глаголы принадлежат существительным. Но они не просто живут и радуются жизни, как домашние коты у людей. Глаголы в Джаваленде делают любую работу. По сути, они живут в королевстве на правах рабов или крепостных крестьян. Все жители Джаваленда привыкли к этому и даже не знают, что в других землях может быть по-другому. \n\nЗа всю работу в Джаваленде отвечают глаголы. Но они бесправные, поэтому им нельзя даже просто свободно гулять. Глагол может появляться на людях только в том случае, если его сопровождает существительное, которому он принадлежит. \n\n«Сопровождает» — это тоже глагол, он не может находиться на людях сам. Поэтому на сцену надо позвать существительное VerbEscorter («СопровождательГлаголов»), которое обеспечивает сопровождение. Но «позвать» и «обеспечивает» — тоже глаголы. Рядом с ними всегда будут существительные «Зватель» и «Обеспечитель», которые заставят свои глаголы выполнять «Вызывание» и «Обеспечение». \n\nКороль по указанию самого бога Солнца время от времени угрожал изгнать все глаголы из королевства Джаваленд. \n\n*Примечание — Здесь автор оригинала использует словосочетание Sun God. Это явный намёк на компанию Sun Microsystems, которая [разработала язык Java в 90-е годы](https://ru.hexlet.io/blog/posts/yazyk-programmirovaniya-java-osobennosti-populyarnost-situatsiya-na-rynke-truda).* \n\nЕсли бы эти планы осуществились, жителям королевства понадобился бы как минимум один глагол чтобы выполнять действия. У короля Явы тонкое чувство юмора, поэтому он пообещал оставить один глагол — «выполнять». \n\n*Примечание — Это игра слов: английский глагол «to execute» переводится как «выполнять» или «казнить».*\n\nГлагол «выполнять» и его ближайшие родственники «запускать», «стартовать», «исполнять», «делать» (run, start, go и так далее) могут заменить любой другой глагол. Для этого они используют существительное Выполнитель (`Executioner`) и вызов «выполнить» (`execute()`). Например, нужно подождать (англ. *to wait*)? Появляется Ждун (`Waiter`) с вызовом `execute()`: `Waiter.execute()`. Нужно почистить зубы? Появляется `ToothBrusher(MyTeeth).go()`. Нужно вынести мусор? В дело вступает `TrashDisposalPlanExecutor.doIt()`. Ни один глагол не может чувствовать себя в безопасности: всех в Джаваленде можно заменить на существительное-выполнителя. \n\nМожет показаться, что в самых патриотичных уголках Джаваленда существительные полностью изгнали глаголы. Но это не так: существительные просто лишили глаголы не только прав, но и имён. Они заставляют глаголы называться именем существительных: вместо `Waiter.execute()` надо использовать `Waiter.wait()`, а вместо `ToothBrusher(MyTeeth).go()` — `ToothBrusher(MyTeeth).brush()`. По сути, многочисленные палачи-вассалы короля Явы маскируются за именами своих существительных-сюзеренов. \n\n## Глаголы в соседних королевствах\n\nВ соседних королевствах избавление от мусора — простое действие. Его можно описать почти так же, как мы описываем его на русском или английском языке. Как и в Джаваленде, данные здесь — это существительные, а функции — глаголы. Но, в отличие от Джаваленда, в соседних королевствах существительные и функции существуют рядом и действуют сообща на равных правах, если это нужно для общего дела. \n\nНапример, в соседних Силяндии, Джаваскриптбурге, Перлсберри или Рубиленде избавление от мусора можно представить в качестве серии действий, то есть глаголов или функций. Чтобы вынести мусор, нужно применить эти действия к нужным объектам в правильном порядке. Например, *взять* мусорное ведро, *отнести* его к мусоропроводу, *выбросить* мусор в трубу мусоропровода. Действия здесь можно выполнять без сопровождающих и надзирателей. \n\nВ соседних королевствах глаголы — самостоятельные действующие лица, поэтому здесь очень редко возникает потребность в существительных-обёртках. Здесь нет Ждунов (`Waiter`) или чистильщиков зубов (`ToothBrusher`). В этих королевставах можно просто просто использовать подхотящие глаголы: `wait()` чтобы подождать или `brushTeeth()` чтобы почистить зубы.\n\nВ соседних королевствах обычно есть специальные механизмы, которые позволяют при необходимости создать важное существительное. Если изобретатели в этих королевствах создают что-то инновационное, например, комбайн для обработки полей, умный дом или электрическую зубную щётку, они могут использовать класс, у которого есть имя, описание, состояние и инструкции по использованию инновационного объекта. \n\nВажное отличие соседних королевств от Джаваленда в том, что глаголы в них могут жить независимо. Они не нуждаются в существительных, которые ими управляют. Например, глаголу `wait()` не нужен Ждун (`Waiter`). \n\nНо жители королевства Джаваленд презирают своих соседей. Так повелось издавна в Землях Программирования. \n\n## Если копнуть глубже...\n\nВ другом конце мира есть малоизведанные земли, в которых глаголы — важные и высокопоставленные граждане. В этих землях есть функциональные королевства Оккамлия, [Хаскелляндия](https://ru.hexlet.io/blog/posts/haskell-yazyk-pozvolyayuschiy-glubzhe-ponyat-programmirovanie-kak-on-ustroen-i-pochemu-ego-vybirayut-razrabotchiki), [Кложаленд](https://ru.hexlet.io/blog/posts/clojure) и другие. Жители этих королевств редко встречаются с жителями Джаваленда. Поскольку функциональные королевства находятся в малоизведанных землях, у их жителей бывает много свободного времени. Иногда жители функциональных королевств от скуки ругают друг друга и даже воюют друг с другом. \n\nВ функциональных королевствах глаголы и существительные считаются гражданами с равными правами. Однако существительные здесь обычно ничего не делают. Они ничего не запускают и не выполняют, поскольку всё это делают за них глаголы. В этих королевствах нет странных законов, которые требовали бы создавать существительные для сопровождения глаголов. Поэтому в функциональных землях всегда ровно столько существительных, сколько есть вокруг реальных вещей. \n\nИз-за такого порядка вещей глаголы в функциональных королевствах всегда на виду. Эти глаголы, то есть функции, даже могут показаться самыми главными жителями функциональных королевств. В конце концов, королевства ведь называются функциональными, а не предметными или объектными. \n\nЗа функциональными королевствами, на самом краю земли, стоит легендарный град Лямбда-Абсолютий. В этом граде существительных вообще нет, в нём есть только глаголы. Конечно, в Лямбда-Абсолютии есть вещи, но их названия происходят от глаголов. Даже числа, с помощью которых считают лямбды (это местная валюта), происходят от глаголов. Здесь `0` обозначается так: `lambda()`. А `1` — это `lambda(lambda())`. Легко догадаться, что `2` — `lambda(lambda(lambda()))` и так далее. Все существительные, глаголы и другие части речи в этом граде происходят от священного глагола `lambda`. \n\nОткровенно говоря, большинство жителей Джаваленда не знает о существовании далёких королевств. Вы можете представить их культурный шок, если бы они встретились с жителями функциональных земель? Чтобы выразить свои чувства, им пришлось бы придумать новые существительные, например, «ксенофобия».\n\n\n> ### Узнайте больше об операционных системах\n> У нас есть [курс по операционным системам](https://ru.hexlet.io/courses/operating_systems). Зарегистрированные пользователи могут пройти его бесплатно. Другие бесплатные курсы можно найти [по ссылке](https://ru.hexlet.io/courses/free). \n\n## Счастливо ли живётся жителям Джаваленда?\n\nМожно подумать, что жизнь в Джаваленде как минимум странная, а как максимум, жителям этой страны приходится решать задачи очень неэффективным способом. Вы можете оценить, как живётся джавалендерам, по детским стихам. Посмотрите, как дети в этой стране рассказывают известное стихотворение про гвоздь. \n\n*Примечание — Речь идёт о [стихотворении о незабитом гвозде](https://easyspeak.ru/company/archive/mother-goose/46). На русском языке оно начинается так:*\n\n*Из-за незабитого гвоздя потеряли подкову,*\n\n*Из-за потерянной подковы потеряли лошадь,*\n\n*Из-за потерянной лошади гонец не доставил послание,*\n\n*Из-за недоставленного послания проиграли войну...*\n\n*Автор представил его в виде псевдокода в характерном для Джаваленда стиле:*\n\n```java\nFor the lack of a nail,\n throw new HorseshoeNailNotFoundException(\"no nails!\");\n\nFor the lack of a horseshoe,\n EquestrianDoctor.getLocalInstance().getHorseDispatcher().shoot();\n\nFor the lack of a horse,\n RidersGuild.getRiderNotificationSubscriberList().getBroadcaster().run(\n new BroadcastMessage(StableFactory.getNullHorseInstance()));\n\nFor the lack of a rider,\n MessageDeliverySubsystem.getLogger().logDeliveryFailure(\n MessageFactory.getAbstractMessageInstance(\n new MessageMedium(MessageType.VERBAL),\n new MessageTransport(MessageTransportType.MOUNTED_RIDER),\n new MessageSessionDestination(BattleManager.getRoutingInfo(\n BattleLocation.NEAREST))),\n MessageFailureReasonCode.UNKNOWN_RIDER_FAILURE);\n\nFor the lack of a message,\n ((BattleNotificationSender)\n BattleResourceMediator.getMediatorInstance().getResource(\n BattleParticipant.PROXY_PARTICIPANT,\n BattleResource.BATTLE_NOTIFICATION_SENDER)).sendNotification(\n ((BattleNotificationBuilder)\n (BattleResourceMediator.getMediatorInstance().getResource(\n BattleOrganizer.getBattleParticipant(Battle.Participant.GOOD_GUYS),\n BattleResource.BATTLE_NOTIFICATION_BUILDER))).buildNotification(\n BattleOrganizer.getBattleState(BattleResult.BATTLE_LOST),\n BattleManager.getChainOfCommand().getCommandChainNotifier()));\n\nFor the lack of a battle,\n try {\n synchronized(BattleInformationRouterLock.getLockInstance()) {\n BattleInformationRouterLock.getLockInstance().wait();\n }\n } catch (InterruptedException ix) {\n if (BattleSessionManager.getBattleStatus(\n BattleResource.getLocalizedBattleResource(Locale.getDefault()),\n BattleContext.createContext(\n Kingdom.getMasterBattleCoordinatorInstance(\n new TweedleBeetlePuddlePaddleBattle()).populate(\n RegionManager.getArmpitProvince(Armpit.LEFTMOST)))) ==\n BattleStatus.LOST) {\n if (LOGGER.isLoggable(Level.TOTALLY_SCREWED)) {\n LOGGER.logScrewage(BattleLogger.createBattleLogMessage(\n BattleStatusFormatter.format(BattleStatus.LOST_WAR,\n Locale.getDefault())));\n }\n }\n }\n\nFor the lack of a war,\n new ServiceExecutionJoinPoint(\n DistributedQueryAnalyzer.forwardQueryResult(\n NotificationSchemaManager.getAbstractSchemaMapper(\n new PublishSubscribeNotificationSchema()).getSchemaProxy().\n executePublishSubscribeQueryPlan(\n NotificationSchema.ALERT,\n new NotificationSchemaPriority(SchemaPriority.MAX_PRIORITY),\n new PublisherMessage(MessageFactory.getAbstractMessage(\n MessageType.WRITTEN,\n new MessageTransport(MessageTransportType.WOUNDED_SURVIVOR),\n new MessageSessionDestination(\n DestinationManager.getNullDestinationForQueryPlan()))),\n DistributedWarMachine.getPartyRoleManager().getRegisteredParties(\n PartyRoleManager.PARTY_KING ||\n PartyRoleManager.PARTY_GENERAL ||\n PartyRoleManager.PARTY_AMBASSADOR)).getQueryResult(),\n PriorityMessageDispatcher.getPriorityDispatchInstance())).\n waitForService();\n\nAll for the lack of a horseshoe nail.\n```\n\nКак видите, в Джаваленде стихотворение сильно отличается от оригинала. Но жителям Джаваленда кажется, что в такой манере есть особый шарм. \n\nЭтот шарм, по мнению джавалендеров, заключается в том, что всем сразу видна *архитектура*. Король Ява сильно любит архитектуру, потому что она полностью состоит из существительных. Как мы помним, все существительные — это вещи, а в Джаваленде больше всего ценятся вещи. Архитектура состоит из вещей, которые можно увидеть и потрогать, которые состоят из камня и стекла и подпирают небосвод, которые громко звенят, если ударить по ним палкой. Король Ява очень любит громкий звон. Ему нравится пинать колёса и стучать по карете, когда он испытывает новый экипаж. \n\nОдно из главных стремлений человека — построить убежище, которое надёжно защищает от любой стихии. В Джаваленде есть много вещей, которые помогают жителям почувствовать себя в безопасности. Люди смотрят на монументальные архитектурные сооружения и думают: «Это точно надёжный дизайн!» \n\nЭти мысли подтверждаются, когда джавалендеры пытаются изменить структуру. Мощь архитектуры в такие моменты проявляется особенно сильно, и люди убеждаются, что никому не под силу разрушить здания. \n\nВ дополнение к надёжной архитектуре в Джаваленде всё упорядочено и разложено по полочкам. Вы всегда найдёте нужное существительное на его месте. И все истории развиваются по общему сценарию: объект является доминирующим типом выражения, в нём есть управляющий для каждой абстракции и метод `run()` для каждого управляющего. Даже если у джавалендера нет большого опыта в проектировании, он понимает, что сможет оформить любую идею в характерном для Джаваленда стиле. В этом королевстве есть особый способ вычисления с помощью существительных, который помогает выразить любые абстракции и выполнить любые вычисления. Всё, что для этого нужно — существительные, конструкторы для них, методы доступа для обхода графов и `execute()`, без которого никакие планы выполнить невозможно. \n\nЖители Джаваленда не просто счастливы — они гордятся положением вещей!\n\n## StateManager.getConsiderationSetter(\"Noun Oriented Thinking\", State.HARMFUL).run()\n\nИли, как говорят в других королевствах за пределами Джаваленда, мышление, построенное на существительных, вредно. Именно эту мысль выражает псевдокод из подзаголовка. \n\nОбъектно-ориентированное программирование ставит существительные во главу угла. Но почему вы должны ставить одну часть речи выше других? Почему одна концепция должна быть лучше других? Ведь объектно-ориентированное программирование не делает глаголы менее важными в нашей повседневной жизни и в нашем способе мышления. Как сказал программист [Джейкоб Гэбриэльсон из Amazon Web Services](https://twitter.com/jacobgabrielson), отстаивать объектно-ориентированное программирование — это то же самое, что пропагандировать брюки-ориентированный стиль одежды. \n\n[Статическая типизация](https://ru.hexlet.io/blog/posts/sistemy-tipov-v-yazyke-kakie-byvayut-i-chem-otlichayutsya) в королевстве Джаваленд, как и в других королевствах, тоже несёт с собой ряд проблем. Но слишком сильная зацикленность на существительных в процессе мышления и проектирования беспокоит даже сильнее. Любая система типизации заставляет разработчиков подстраиваться под неё, но отказ от глаголов выглядит необъяснимо и нерационально. \n\nВ C++ такой проблемы нет, поскольку в этом языке можно определять автономные функции. Более того, в C++ есть чёткая абстракция для пространства имён. А Java эксплуатирует идею классов для представления пространства имён, пользовательских типов, механизмов синтаксического делегирования, области видимости и много другого. \n\nНе поймите этот посыл неправильно, здесь не идёт речь о том, что только C++ — хороший язык. Просто, по мнению автора этого сказания, в этом языке гибкая система типов, как минимум, по сравнению с Java. C++ страдает из-за проблем, вызванных тем, что разумные предложения заставляют слушателей закрывать уши и отмахиваться от вас или даже пытаться вас ударить. Из-за таких проблем с помощью C++ не всегда просто выразить конкретную мысль. Но по лаконичности C++ превосходит Java, потому что в C++ можно пользоваться глаголами. А кто захочет говорить на языке, в котором нет глаголов?\n\nДействительно, классы — единственный инструмент проектирования, который есть в Java. Поэтому вам приходится брать приходящие в голову идеи и превращать их в предметы или существительные, даже если эти идеи по сути являются действиями, процессами или другими сущностями, не относящимися к вещам. \n\nАвтор этой истории всё время возвращается к тому, что когда-то говорили ему люди из древней страны Perl: «Эй, брат, не всё в этом мире есть объект».\n\nСтранно, что Java остаётся единственным из мейнстримных объектно-ориентированных языков, который придерживается радикального ориентированного на существительные способа думать и действовать. Вы не найдёте `AbstractProxyMediator`, `NotificationStrategyFactory` или подобные им существительные в [Python](https://ru.hexlet.io/blog/posts/programmirovanie-na-python-osobennosti-obucheniya-perspektivy-situatsiya-na-rynke-truda) или [Ruby](https://ru.hexlet.io/blog/posts/yazyk-programmirovaniya-ruby-osobennosti-perspektivy-rynok-truda). Почему они так широко применяются в Java? Можно не сомневаться, что это объясняется разным отношением к глаголам. Python, Ruby, [JavaScript](https://ru.hexlet.io/blog/posts/stoit-li-uchit-javascript-perspektivy-situatsiya-na-rynke-truda-mneniya-ekspertov), Perl и, конечно же, все функциональные языки позволяют объявлять и передавать функции как самодостаточные сущности, не оборачивая их в классы. \n\nКонечно, это проще делать в динамически типизированных языках. Здесь вам достаточно передать ссылку на функцию, полученную из её названия. А ответственность вызывающего кода — выполнить функцию с подходящими аргументами и правильно использовать полученное значение. \n\nНо многие языки со статической типизацией тоже позволяют работать с функциями как с объектами первого класса. В их число входят C, C++, Haskell, ML. Языку достаточно поддерживать синтаксис для создания, передачи и вызова функциональных литералов с подходящей сигнатурой типов. \n\n::posts\n\nНет никаких причин, по которым Java не могла бы добавить поддержку функций первого класса и наконец-то войти во взрослый мир, где люди используют глаголы. На самом деле, существует язык на платформе JVM, который называется [Nice](http://nice.sourceforge.net/). Его синтаксис похож на Java, а кроме того Nice поддерживает выразительные инструменты для использования глаголов: автономные функции, которые Java заставляет оборачивать в Callbacks или Runnables или другие анонимные интерфейсы классов, на которые можно ссылаться. \n\nSun даже не пришлось бы нарушать свою конвенцию, согласно которой все функции должны принадлежать классам. Каждая анонимная функция может иметь неявный указатель `this`, который указывает на класс, в котором определена эта функция. \n\nНеясно, почему Sun настаивает, чтобы Java оставалась в Королевстве Существительных. Автор этой истории сомневается, что дело в недооценке жителей Джаваленда. Sun добавили в язык дженерики, а это очень сложная концепция. То есть Sun не переживает о том, чтобы язык оставался простым. И это не значит, что всё плохо. Java — состоявшийся язык, и он давно готов к тому, чтобы у программистов появились инструменты, которые позволяют программировать так, как люди думают. \n\nЕсли это произойдёт, жители Джаваленда смогут спокойно выносить мусор, а потом возвращаться домой, садиться на диван и дальше играть в «фифу».\n\n\n> Начните изучать разработку в групповом формате. В группах можно пройти профессии [«Фронтенд-программист»](https://ru.hexlet.io/professions/frontend), [«Node.js-программист»](https://ru.hexlet.io/professions/backend), [«PHP-программист»](https://ru.hexlet.io/professions/php), [«Python-программист»](https://ru.hexlet.io/professions/python) и [«Верстальщик»](https://ru.hexlet.io/professions/layout-designer). ","reading_time":10,"url":"https://ru.hexlet.io/blog/posts/javaland","cover_thumb_variant":null,"cover_list_variant":"/vite/assets/blog_post-7eTyeLLt.webp","cover_main_variant":"/vite/assets/blog_post-7eTyeLLt.webp","related_stacks_count":5},"relatedPosts":[{"model_name":"BlogPost","id":420,"title":"50 лучших фильмов и сериалов о технологиях","slug":"filmoteka-dlya-programmistov-25-filmov-o-programmirovanii-tehnologiyah-i-iskusstvennom-intellekte","summary":"Сделали подборку фильмов о технологиях, программировании, искусственном интеллекте и роботах.","created_at":"2019-07-30T13:04:28.309Z","published_at":"2022-12-30T12:14:16.059Z","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTY5OSwicHVyIjoiYmxvYl9pZCJ9fQ==--ecd38e914c68debadef03c88a60804b37146e5b5/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%D1%8B%20IT-01.png"},{"model_name":"BlogPost","id":694,"title":"8 книг, которые помогут вам в жизни и в работе: советует комьюнити-менеджер Хекслета Наталья Мусина","slug":"marketolog-heksleta-natalya-musina-8-knig-kotorye-pomogut-vam-v-zhizni-i-v-rabote","summary":"Комьюнити-менеджер Хекслета Наталья Мусина делится подборкой своих любимых книг, которые помогают расширять кругозор.","created_at":"2020-02-12T14:19:01.136Z","published_at":"2022-12-29T12:48:31.067Z","cover_list_variant":"/vite/assets/blog_post-7eTyeLLt.webp"},{"model_name":"BlogPost","id":111,"title":"Как эффективно читать профессиональную литературу","slug":"how-to-read-books","summary":"Cооснователь Хекслета Кирилл Мокевнин рассказывает, как эффективно читать профессиональную литературу и каким образом правильно выбирать книги.","created_at":"2017-03-19T16:40:36.334Z","published_at":"2022-12-14T13:51:37.375Z","cover_list_variant":"/vite/assets/blog_post-7eTyeLLt.webp"}],"category":{"id":6,"name":"Мотивация","slug":"motivation","state":"published","created_at":"2016-10-06T18:31:38.903Z"},"mainStackCategory":{"id":2,"name":"Курсы по веб-разработке","slug":"web_development","short_name":"Веб-разработка","order":190,"state":"published","category_slug":"courses_web_development"},"categories":[{"id":6,"name":"Мотивация","slug":"motivation","state":"published","created_at":"2016-10-06T18:31:38.903Z"},{"id":3,"name":"Истории успеха","slug":"success","state":"published","created_at":"2016-07-30T12:57:18.308Z"},{"id":14,"name":"Дневник студента","slug":"student-diary","state":"published","created_at":"2019-02-25T13:27:09.471Z"},{"id":4,"name":"Код","slug":"code","state":"published","created_at":"2016-08-23T13:33:44.258Z"},{"id":12,"name":"Карьера","slug":"career","state":"published","created_at":"2017-07-21T15:42:21.481Z"}],"relatedLandings":[{"stack":{"id":3,"slug":"java","title":"Java-разработчик","audience":"for_beginners","start_type":"weekly","pricing_model":"purchase","priority":"high","kind":"profession","state":"published","stack_state":"finished","order":30,"duration_in_months":10},"id":3,"slug":"java","title":"Java-разработчик","subtitle":"Изучите Java и фреймворк Spring Boot и REST API","subtitle_for_lists":"Изучите Java и фреймворк Spring Boot и REST API","locale":"ru","current":true,"duration_in_months_text":"10 месяцев","stack_slug":"java","price_text":"от 6 792 ₽","duration_text":"10 месяцев","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzczNSwicHVyIjoiYmxvYl9pZCJ9fQ==--883f3fd4e1b571538035b5680c8d4a9eb504b1f6/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Source%20code-amico.png"},{"stack":{"id":36,"slug":"java-sicp","title":"СИКП на Java","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":4100,"duration_in_months":1},"id":60,"slug":"java-sicp","title":"СИКП на Java","subtitle":"Навык понимать программы на фундаментальном уровне, уверенно проходить собеседования и решать сложные задачи","subtitle_for_lists":"Изучите фундаментальные принципы программирования на Java","locale":"ru","current":true,"duration_in_months_text":"1 месяц","stack_slug":"java-sicp","price_text":"от 3 900 ₽","duration_text":"1 месяц","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAxNiwicHVyIjoiYmxvYl9pZCJ9fQ==--eb66b9b5e26fafa32844ce0f4522c3ed84544040/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Hand%20coding-rafiki.png"},{"stack":{"id":29,"slug":"js-oop","title":"ООП на Javascript","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":4250,"duration_in_months":2},"id":46,"slug":"js-oop","title":"ООП на Javascript","subtitle":"Навык глубокого понимания архитектуры и написания чистого кода, позволяющий решать сложные задачи","subtitle_for_lists":"Изучите архитектуру и принципы чистого кода на JS","locale":"ru","current":true,"duration_in_months_text":"2 месяца","stack_slug":"js-oop","price_text":"от 3 900 ₽","duration_text":"2 месяца","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAxOSwicHVyIjoiYmxvYl9pZCJ9fQ==--84efd2b6854b7000046e9ce06e6be85d38af5ab8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/JavaScript%20frameworks-cuate.png"},{"stack":{"id":67,"slug":"python-oop","title":"ООП на Python","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":4350,"duration_in_months":2},"id":120,"slug":"python-oop","title":"ООП на Python","subtitle":"Навык понимания архитектуры и чистого кода, позволяющий проходить собеседования, решать задачи и увеличивать зарплату","subtitle_for_lists":"Изучите архитектуру и чистый код на Python","locale":"ru","current":true,"duration_in_months_text":"2 месяца","stack_slug":"python-oop","price_text":"от 3 900 ₽","duration_text":"2 месяца","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc0OSwicHVyIjoiYmxvYl9pZCJ9fQ==--846349326718432328cf5c0677091aca67f80af3/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Developer%20activity-amico%20(1).png"},{"stack":{"id":71,"slug":"js-domain-driven-design","title":"DDD на Javascript","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":4700,"duration_in_months":2},"id":127,"slug":"js-domain-driven-design","title":"DDD на Javascript","subtitle":"Навык ООП и предметно-ориентированного программирования для создания масштабируемого кода и карьерного роста","subtitle_for_lists":"Изучите ООП и DDD для создания масштабируемого кода","locale":"ru","current":true,"duration_in_months_text":"2 месяца","stack_slug":"js-domain-driven-design","price_text":"от 3 900 ₽","duration_text":"2 месяца","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAwNywicHVyIjoiYmxvYl9pZCJ9fQ==--f0b38f0e25ed59255acec6eaeaeec0a99aec453f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Binary%20code-rafiki.png"}]},"url":"/blog/posts/javaland","version":"8f286f6358a90a7bef2263b3a6edf5a90a94fa42","encryptHistory":false,"clearHistory":false}"><style data-mantine-styles="true">:root, :host{--mantine-font-family: Arial, sans-serif;--mantine-font-family-headings: Arial, sans-serif;--mantine-heading-font-weight: normal;--mantine-radius-default: 0rem;--mantine-primary-color-filled: var(--mantine-color-indigo-filled);--mantine-primary-color-filled-hover: var(--mantine-color-indigo-filled-hover);--mantine-primary-color-light: var(--mantine-color-indigo-light);--mantine-primary-color-light-hover: var(--mantine-color-indigo-light-hover);--mantine-primary-color-light-color: var(--mantine-color-indigo-light-color);--mantine-spacing-xxl: calc(4rem * var(--mantine-scale));--mantine-font-size-xs: 12px;--mantine-font-size-sm: 14px;--mantine-font-size-md: 16px;--mantine-font-size-lg: clamp(16.0000px, calc(15.2727px + 0.2273vw), 18.0000px);--mantine-font-size-xl: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-display-3: clamp(32.0000px, calc(26.1818px + 1.8182vw), 48.0000px);--mantine-font-size-display-2: clamp(36.0000px, calc(25.8182px + 3.1818vw), 64.0000px);--mantine-font-size-display-1: clamp(40.0000px, calc(25.4545px + 4.5455vw), 80.0000px);--mantine-font-size-h1: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-font-size-h2: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-font-size-h3: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-font-size-h4: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-font-size-h5: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-h6: 1rem;--mantine-primary-color-0: var(--mantine-color-indigo-0);--mantine-primary-color-1: var(--mantine-color-indigo-1);--mantine-primary-color-2: var(--mantine-color-indigo-2);--mantine-primary-color-3: var(--mantine-color-indigo-3);--mantine-primary-color-4: var(--mantine-color-indigo-4);--mantine-primary-color-5: var(--mantine-color-indigo-5);--mantine-primary-color-6: var(--mantine-color-indigo-6);--mantine-primary-color-7: var(--mantine-color-indigo-7);--mantine-primary-color-8: var(--mantine-color-indigo-8);--mantine-primary-color-9: var(--mantine-color-indigo-9);--mantine-color-red-0: #ffeaea;--mantine-color-red-1: #fed4d4;--mantine-color-red-2: #f4a7a8;--mantine-color-red-3: #ec7878;--mantine-color-red-4: #e55050;--mantine-color-red-5: #e03131;--mantine-color-red-6: #e02829;--mantine-color-red-7: #c71a1c;--mantine-color-red-8: #b21218;--mantine-color-red-9: #9c0411;--mantine-color-violet-0: #fce9ff;--mantine-color-violet-1: #f1cfff;--mantine-color-violet-2: #e09bff;--mantine-color-violet-3: #d16fff;--mantine-color-violet-4: #be37fe;--mantine-color-violet-5: #b51afe;--mantine-color-violet-6: #b009ff;--mantine-color-violet-7: #9b00e4;--mantine-color-violet-8: #8a00cc;--mantine-color-violet-9: #7800b3;--mantine-color-indigo-0: #edecff;--mantine-color-indigo-1: #d6d5fe;--mantine-color-indigo-2: #aaa9f4;--mantine-color-indigo-3: #7b79eb;--mantine-color-indigo-4: #5451e4;--mantine-color-indigo-5: #3b37e0;--mantine-color-indigo-6: #2d2adf;--mantine-color-indigo-7: #1f1ec7;--mantine-color-indigo-8: #1819b2;--mantine-color-indigo-9: #0c149e;--mantine-color-cyan-0: #dffdff;--mantine-color-cyan-1: #caf5ff;--mantine-color-cyan-2: #99e8ff;--mantine-color-cyan-3: #64daff;--mantine-color-cyan-4: #3ccffe;--mantine-color-cyan-5: #24c8fe;--mantine-color-cyan-6: #00c2ff;--mantine-color-cyan-7: #00ade4;--mantine-color-cyan-8: #009acd;--mantine-color-cyan-9: #0085b5;--mantine-color-green-0: #e9fdec;--mantine-color-green-1: #d7f6dc;--mantine-color-green-2: #b0eab9;--mantine-color-green-3: #86df94;--mantine-color-green-4: #62d574;--mantine-color-green-5: #4ccf5f;--mantine-color-green-6: #3fcc54;--mantine-color-green-7: #2fb344;--mantine-color-green-8: #25a03b;--mantine-color-green-9: #138a2e;--mantine-color-yellow-0: #fff7e2;--mantine-color-yellow-1: #ffeecd;--mantine-color-yellow-2: #ffdc9c;--mantine-color-yellow-3: #ffc966;--mantine-color-yellow-4: #feb93a;--mantine-color-yellow-5: #feae1e;--mantine-color-yellow-6: #ffa90f;--mantine-color-yellow-8: #ca8200;--mantine-color-yellow-9: #af7000;--mantine-h1-font-size: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-h1-font-weight: normal;--mantine-h2-font-size: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-h2-font-weight: normal;--mantine-h3-font-size: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-h3-font-weight: normal;--mantine-h4-font-size: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-h4-font-weight: normal;--mantine-h5-font-size: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-h5-font-weight: normal;--mantine-h6-font-size: 1rem;--mantine-h6-font-weight: normal;}
:root[data-mantine-color-scheme="dark"], :host([data-mantine-color-scheme="dark"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-dark-filled: var(--mantine-color-dark-5);--mantine-color-dark-filled-hover: var(--mantine-color-dark-6);--mantine-color-dark-light: rgba(105, 105, 105, 0.15);--mantine-color-dark-light-hover: rgba(105, 105, 105, 0.2);--mantine-color-dark-light-color: var(--mantine-color-dark-0);--mantine-color-dark-outline: var(--mantine-color-dark-1);--mantine-color-dark-outline-hover: rgba(184, 184, 184, 0.05);--mantine-color-gray-filled: var(--mantine-color-gray-5);--mantine-color-gray-filled-hover: var(--mantine-color-gray-6);--mantine-color-gray-light: rgba(222, 226, 230, 0.15);--mantine-color-gray-light-hover: rgba(222, 226, 230, 0.2);--mantine-color-gray-light-color: var(--mantine-color-gray-0);--mantine-color-gray-outline: var(--mantine-color-gray-1);--mantine-color-gray-outline-hover: rgba(241, 243, 245, 0.05);--mantine-color-red-filled: var(--mantine-color-red-5);--mantine-color-red-filled-hover: var(--mantine-color-red-6);--mantine-color-red-light: rgba(236, 120, 120, 0.15);--mantine-color-red-light-hover: rgba(236, 120, 120, 0.2);--mantine-color-red-light-color: var(--mantine-color-red-0);--mantine-color-red-outline: var(--mantine-color-red-1);--mantine-color-red-outline-hover: rgba(254, 212, 212, 0.05);--mantine-color-pink-filled: var(--mantine-color-pink-5);--mantine-color-pink-filled-hover: var(--mantine-color-pink-6);--mantine-color-pink-light: rgba(250, 162, 193, 0.15);--mantine-color-pink-light-hover: rgba(250, 162, 193, 0.2);--mantine-color-pink-light-color: var(--mantine-color-pink-0);--mantine-color-pink-outline: var(--mantine-color-pink-1);--mantine-color-pink-outline-hover: rgba(255, 222, 235, 0.05);--mantine-color-grape-filled: var(--mantine-color-grape-5);--mantine-color-grape-filled-hover: var(--mantine-color-grape-6);--mantine-color-grape-light: rgba(229, 153, 247, 0.15);--mantine-color-grape-light-hover: rgba(229, 153, 247, 0.2);--mantine-color-grape-light-color: var(--mantine-color-grape-0);--mantine-color-grape-outline: var(--mantine-color-grape-1);--mantine-color-grape-outline-hover: rgba(243, 217, 250, 0.05);--mantine-color-violet-filled: var(--mantine-color-violet-5);--mantine-color-violet-filled-hover: var(--mantine-color-violet-6);--mantine-color-violet-light: rgba(209, 111, 255, 0.15);--mantine-color-violet-light-hover: rgba(209, 111, 255, 0.2);--mantine-color-violet-light-color: var(--mantine-color-violet-0);--mantine-color-violet-outline: var(--mantine-color-violet-1);--mantine-color-violet-outline-hover: rgba(241, 207, 255, 0.05);--mantine-color-indigo-filled: var(--mantine-color-indigo-5);--mantine-color-indigo-filled-hover: var(--mantine-color-indigo-6);--mantine-color-indigo-light: rgba(123, 121, 235, 0.15);--mantine-color-indigo-light-hover: rgba(123, 121, 235, 0.2);--mantine-color-indigo-light-color: var(--mantine-color-indigo-0);--mantine-color-indigo-outline: var(--mantine-color-indigo-1);--mantine-color-indigo-outline-hover: rgba(214, 213, 254, 0.05);--mantine-color-blue-filled: var(--mantine-color-blue-5);--mantine-color-blue-filled-hover: var(--mantine-color-blue-6);--mantine-color-blue-light: rgba(116, 192, 252, 0.15);--mantine-color-blue-light-hover: rgba(116, 192, 252, 0.2);--mantine-color-blue-light-color: var(--mantine-color-blue-0);--mantine-color-blue-outline: var(--mantine-color-blue-1);--mantine-color-blue-outline-hover: rgba(208, 235, 255, 0.05);--mantine-color-cyan-filled: var(--mantine-color-cyan-5);--mantine-color-cyan-filled-hover: var(--mantine-color-cyan-6);--mantine-color-cyan-light: rgba(100, 218, 255, 0.15);--mantine-color-cyan-light-hover: rgba(100, 218, 255, 0.2);--mantine-color-cyan-light-color: var(--mantine-color-cyan-0);--mantine-color-cyan-outline: var(--mantine-color-cyan-1);--mantine-color-cyan-outline-hover: rgba(202, 245, 255, 0.05);--mantine-color-teal-filled: var(--mantine-color-teal-5);--mantine-color-teal-filled-hover: var(--mantine-color-teal-6);--mantine-color-teal-light: rgba(99, 230, 190, 0.15);--mantine-color-teal-light-hover: rgba(99, 230, 190, 0.2);--mantine-color-teal-light-color: var(--mantine-color-teal-0);--mantine-color-teal-outline: var(--mantine-color-teal-1);--mantine-color-teal-outline-hover: rgba(195, 250, 232, 0.05);--mantine-color-green-filled: var(--mantine-color-green-5);--mantine-color-green-filled-hover: var(--mantine-color-green-6);--mantine-color-green-light: rgba(134, 223, 148, 0.15);--mantine-color-green-light-hover: rgba(134, 223, 148, 0.2);--mantine-color-green-light-color: var(--mantine-color-green-0);--mantine-color-green-outline: var(--mantine-color-green-1);--mantine-color-green-outline-hover: rgba(215, 246, 220, 0.05);--mantine-color-lime-filled: var(--mantine-color-lime-5);--mantine-color-lime-filled-hover: var(--mantine-color-lime-6);--mantine-color-lime-light: rgba(192, 235, 117, 0.15);--mantine-color-lime-light-hover: rgba(192, 235, 117, 0.2);--mantine-color-lime-light-color: var(--mantine-color-lime-0);--mantine-color-lime-outline: var(--mantine-color-lime-1);--mantine-color-lime-outline-hover: rgba(233, 250, 200, 0.05);--mantine-color-yellow-filled: var(--mantine-color-yellow-5);--mantine-color-yellow-filled-hover: var(--mantine-color-yellow-6);--mantine-color-yellow-light: rgba(255, 201, 102, 0.15);--mantine-color-yellow-light-hover: rgba(255, 201, 102, 0.2);--mantine-color-yellow-light-color: var(--mantine-color-yellow-0);--mantine-color-yellow-outline: var(--mantine-color-yellow-1);--mantine-color-yellow-outline-hover: rgba(255, 238, 205, 0.05);--mantine-color-orange-filled: var(--mantine-color-orange-5);--mantine-color-orange-filled-hover: var(--mantine-color-orange-6);--mantine-color-orange-light: rgba(255, 192, 120, 0.15);--mantine-color-orange-light-hover: rgba(255, 192, 120, 0.2);--mantine-color-orange-light-color: var(--mantine-color-orange-0);--mantine-color-orange-outline: var(--mantine-color-orange-1);--mantine-color-orange-outline-hover: rgba(255, 232, 204, 0.05);--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-9) 0%, var(--mantine-color-cyan-7) 100%);--app-color-surface: #2e2e2e;}
:root[data-mantine-color-scheme="light"], :host([data-mantine-color-scheme="light"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-red-light: rgba(224, 40, 41, 0.1);--mantine-color-red-light-hover: rgba(224, 40, 41, 0.12);--mantine-color-red-outline-hover: rgba(224, 40, 41, 0.05);--mantine-color-violet-light: rgba(176, 9, 255, 0.1);--mantine-color-violet-light-hover: rgba(176, 9, 255, 0.12);--mantine-color-violet-outline-hover: rgba(176, 9, 255, 0.05);--mantine-color-indigo-light: rgba(45, 42, 223, 0.1);--mantine-color-indigo-light-hover: rgba(45, 42, 223, 0.12);--mantine-color-indigo-outline-hover: rgba(45, 42, 223, 0.05);--mantine-color-cyan-light: rgba(0, 194, 255, 0.1);--mantine-color-cyan-light-hover: rgba(0, 194, 255, 0.12);--mantine-color-cyan-outline-hover: rgba(0, 194, 255, 0.05);--mantine-color-green-light: rgba(63, 204, 84, 0.1);--mantine-color-green-light-hover: rgba(63, 204, 84, 0.12);--mantine-color-green-outline-hover: rgba(63, 204, 84, 0.05);--mantine-color-yellow-light: rgba(255, 169, 15, 0.1);--mantine-color-yellow-light-hover: rgba(255, 169, 15, 0.12);--mantine-color-yellow-outline-hover: rgba(255, 169, 15, 0.05);--app-color-surface: #f1f3f5;--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-5) 100%);}</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","author":"Дмитрий Дементий","name":"О тяжёлой судьбе глаголов в Королевстве Существительных","datePublished":"2020-11-10T08:38:28.682Z","headline":"В королевстве Джаваленд, где кремниевой рукой правит король Ява, людям запрещено думать и действовать так, как привыкли это делать мы с вами. В этом королевстве по приказу Явы самыми важными частями речи считаются существительные. Они — самые почитаемые граждане этого королевства. Они ходят по улицам с важным видом в красивых нарядах, которые стали красивыми благодаря прилагательным. Сами прилагательные живут не так хорошо, как существительные, но всё равно они благодарят небеса за то, что они не родились глаголами. Потому что у глаголов в этом королевстве незавидная судьба. ","image":"/vite/assets/blog_post-7eTyeLLt.webp","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":10}]}</script><div style="--container-size:var(--container-size-lg);margin-top:var(--mantine-spacing-xl);height:100%" class="m_7485cace mantine-Container-root" data-size="lg" data-strategy="block"><script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"position":1,"@type":"ListItem","item":{"@id":"/blog","name":"Блог Хекслета"}},{"position":2,"@type":"ListItem","item":{"@id":"/blog/categories/motivation","name":"Мотивация"}},{"position":3,"@type":"ListItem","item":{"@id":"/blog/posts/javaland","name":"О тяжёлой судьбе глаголов в Королевстве Существительных"}}]}</script><div style="margin-bottom:var(--mantine-spacing-xs)" class="m_8b3717df mantine-Breadcrumbs-root"><a style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:inherit" class="mantine-focus-auto m_849cf0da m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-size="sm" data-underline="hover" href="/"><div style="color:inherit" class="m_4451eb3a mantine-Center-root"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-home-link "><path d="M20.085 11.085l-8.085 -8.085l-9 9h2v7a2 2 0 0 0 2 2h4.5"></path><path d="M9 21v-6a2 2 0 0 1 2 -2h2a2 2 0 0 1 1.807 1.143"></path><path d="M20 21a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M20 16a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M15 19a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path><path d="M21 16l-5 3l5 2"></path></svg></div></a><div class="m_3b8f2208 mantine-Breadcrumbs-separator">/</div><a style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:inherit" class="mantine-focus-auto m_849cf0da m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-size="sm" data-underline="hover" href="/blog">Блог Хекслета</a><div class="m_3b8f2208 mantine-Breadcrumbs-separator">/</div><a style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:inherit" class="mantine-focus-auto m_849cf0da m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-size="sm" data-underline="hover" href="/blog/categories/motivation">Мотивация</a><div class="m_3b8f2208 mantine-Breadcrumbs-separator">/</div><p style="--text-fz:var(--mantine-font-size-sm);--text-lh:var(--mantine-line-height-sm);white-space:normal;color:var(--mantine-color-dimmed)" class="mantine-focus-auto m_f678d540 mantine-Breadcrumbs-breadcrumb m_b6d8b162 mantine-Text-root" data-size="sm">О тяжёлой судьбе глаголов в Королевстве Существительных</p></div><style data-mantine-styles="inline">.__m__-_R_eub_{margin-bottom:var(--mantine-spacing-xs);}@media(min-width: 36em){.__m__-_R_eub_{margin-bottom:var(--mantine-spacing-xs);}}</style><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root __m__-_R_eub_"><style data-mantine-styles="inline">.__m__-_R_deub_{width:100%;}@media(min-width: 36em){.__m__-_R_deub_{width:70%;}}@media(min-width: 75em){.__m__-_R_deub_{width:75%;}}</style><div class="__m__-_R_deub_"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><h1 style="--title-fw:var(--mantine-h1-font-weight);--title-lh:var(--mantine-h1-line-height);--title-fz:var(--mantine-h1-font-size)" class="m_8a5d1357 mantine-Title-root" data-order="1">О тяжёлой судьбе глаголов в Королевстве Существительных</h1></div></div></div><div style="position:absolute;top:calc(18.75rem * var(--mantine-scale))" class=""></div><style data-mantine-styles="inline">.__m__-_R_2iub_{--grid-gutter:var(--mantine-spacing-xl);}</style><div class="m_410352e9 mantine-Grid-root __m__-_R_2iub_"><div class="m_dee7bd2f mantine-Grid-inner"><style data-mantine-styles="inline">.__m__-_R_dmiub_{--col-flex-grow:auto;--col-flex-basis:100%;--col-max-width:100%;}@media(min-width: 48em){.__m__-_R_dmiub_{--col-flex-grow:auto;--col-flex-basis:83.33333333333334%;--col-max-width:83.33333333333334%;}}@media(min-width: 62em){.__m__-_R_dmiub_{--col-flex-grow:auto;--col-flex-basis:66.66666666666667%;--col-max-width:66.66666666666667%;}}</style><div class="m_96bdd299 mantine-Grid-col __m__-_R_dmiub_"><div style="--stack-gap:var(--mantine-spacing-md);--stack-align:stretch;--stack-justify:flex-start;margin-bottom:var(--mantine-spacing-xl)" class="m_6d731127 mantine-Stack-root"><div class=""><div style="--group-gap:var(--mantine-spacing-xs);--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-bottom:var(--mantine-spacing-xl)" class="m_4081bf90 mantine-Group-root"><button style="--badge-height:var(--badge-height-sm);--badge-padding-x:var(--badge-padding-x-sm);--badge-fz:var(--badge-fz-sm);--badge-bg:var(--mantine-color-default);--badge-color:var(--mantine-color-default-color);--badge-bd:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border);cursor:pointer;color:inherit" class="m_347db0ec mantine-Badge-root" data-variant="default" data-size="sm" type="button" aria-label="Java"><span class="m_5add502a mantine-Badge-label">Java</span></button></div><div style="--group-gap:calc(0.625rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-bottom:var(--mantine-spacing-sm);color:var(--mantine-color-gray-text)" class="m_4081bf90 mantine-Group-root"><div style="--group-gap:calc(0.1875rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap;margin-inline-end:var(--mantine-spacing-lg)" class="m_4081bf90 mantine-Group-root">10 ноября 2020 г.</div><div style="--group-gap:calc(0.1875rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-clock "><path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"></path><path d="M12 7v5l3 3"></path></svg></div>10 минут</div><div style="--group-gap:calc(0.1875rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-thumb-up "><path d="M7 11v8a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-7a1 1 0 0 1 1 -1h3a4 4 0 0 0 4 -4v-1a2 2 0 0 1 4 0v5h3a2 2 0 0 1 2 2l-1 5a2 3 0 0 1 -2 2h-7a3 3 0 0 1 -3 -3"></path></svg></div>10</div></div><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img style="--image-radius:var(--mantine-radius-md);--image-object-fit:cover;width:100%;height:100%" class="m_9e117634 mantine-Image-root" src="/vite/assets/blog_post-7eTyeLLt.webp" alt="О тяжёлой судьбе глаголов в Королевстве Существительных"/></div></div><div role="link" tabindex="0" style="cursor:pointer"><button style="display:block;width:100%" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Присоединяйтесь к нашему Telegram-сообществу"><div style="background-color:light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-6))" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:flex-start;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><div style="--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:auto;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-brand-telegram "><path d="M15 10l-4 4l6 6l4 -16l-18 7l4 2l2 6l3 -4"></path></svg></div>Присоединяйтесь к нашему Telegram-сообществу</div></div></button></div><div style="margin-bottom:var(--mantine-spacing-xl)" class="m_d08caa0 mantine-Typography-root"><p><em>Примечание — Это адаптированный перевод статьи <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html" rel="noopener noreferrer" target="_blank">Execution in the Kingdom of Nouns</a> by Steve Yegge. Мнение администрации Хекслета может не совпадать с мнением автора оригинала.</em></p>
<p>В тридевятом царстве, в тридесятом государстве жил-поживал король Ява, да заставлял он всех отказываться от глаголов.</p>
<p>Предупреждение: скоро сказка сказывается, да нет в ней счастливого конца. А ещё эта сказка не для обидчивых людей. Если вас легко задеть, лучше не читайте эту историю.</p>
<p>Прежде чем начать наш рассказ, давайте разберёмся с концептуальными вещами.</p>
<style data-mantine-styles="inline">.__m__-_R_9derddmiub_{--carousel-slide-gap:var(--mantine-spacing-xs);--carousel-slide-size:70%;}@media(min-width: 36em){.__m__-_R_9derddmiub_{--carousel-slide-gap:var(--mantine-spacing-xl);--carousel-slide-size:50%;}}</style><div style="--carousel-control-size:calc(2.5rem * var(--mantine-scale));--carousel-controls-offset:var(--mantine-spacing-sm);margin-bottom:var(--mantine-spacing-lg);padding-block:var(--mantine-spacing-sm);background:var(--app-color-surface)" class="m_17884d0f mantine-Carousel-root responsiveClassName" data-orientation="horizontal" data-include-gap-in-size="true"><div class="m_39bc3463 mantine-Carousel-controls" data-orientation="horizontal"><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="previous" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="next" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(-90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button></div><div class="m_a2dae653 mantine-Carousel-viewport" data-type="media"><div class="m_fcd81474 mantine-Carousel-container __m__-_R_9derddmiub_" data-orientation="horizontal"><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/java?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">10 месяцев</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">С нуля</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Java-разработчик</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите Java и фреймворк Spring Boot и REST API</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzczNSwicHVyIjoiYmxvYl9pZCJ9fQ==--883f3fd4e1b571538035b5680c8d4a9eb504b1f6/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Source%20code-amico.png" alt="Java-разработчик" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 6 792 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/java-sicp?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">1 месяц</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">СИКП на Java</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите фундаментальные принципы программирования на Java</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAxNiwicHVyIjoiYmxvYl9pZCJ9fQ==--eb66b9b5e26fafa32844ce0f4522c3ed84544040/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Hand%20coding-rafiki.png" alt="СИКП на Java" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/js-oop?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">2 месяца</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">ООП на Javascript</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите архитектуру и принципы чистого кода на JS</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAxOSwicHVyIjoiYmxvYl9pZCJ9fQ==--84efd2b6854b7000046e9ce06e6be85d38af5ab8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/JavaScript%20frameworks-cuate.png" alt="ООП на Javascript" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/python-oop?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">2 месяца</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">ООП на Python</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите архитектуру и чистый код на Python</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc0OSwicHVyIjoiYmxvYl9pZCJ9fQ==--846349326718432328cf5c0677091aca67f80af3/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Developer%20activity-amico%20(1).png" alt="ООП на Python" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/js-domain-driven-design?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">2 месяца</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">DDD на Javascript</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите ООП и DDD для создания масштабируемого кода</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NDAwNywicHVyIjoiYmxvYl9pZCJ9fQ==--f0b38f0e25ed59255acec6eaeaeec0a99aec453f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Binary%20code-rafiki.png" alt="DDD на Javascript" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses?promo_name=programs_list&promo_position=blog_post&promo_creative=catalog_card&promo_type=card"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size);margin-bottom:var(--mantine-spacing-md);font-size:var(--mantine-font-size-h3)" class="m_8a5d1357 mantine-Title-root" data-order="2" data-responsive="true">Каталог</h2><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Полный список доступных курсов по разным направлениям</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="/vite/assets/development-BVihs_d5.png" alt="Orientation"/></div></div></div></a></div></div></div></div></div>
<h2 id="heading-2-1">Содержание</h2>
<ul>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-2">Переполнение мусорного ведра</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-3">Сказание о Королевстве Существительных</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-4">Глаголы в соседних королевствах</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-5">Если копнуть глубже...</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-7">Счастливо ли живётся жителям Джаваленда?</a></li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="#heading-2-8">StateManager.getConsiderationSetter("Noun Oriented Thinking", State.HARMFUL).run()</a></li>
</ul>
<h2 id="heading-2-2">Переполнение мусорного ведра</h2>
<p>Все люди в Королевстве Существительных любят юзкейсы или сценарии использования. Давайте начнём рассказ с юзкейса — выноса мусора. Когда надо вынести мусор, мы говорим друг другу: «Вынеси мусор, ведро уже полное!»</p>
<p>Если вы — обычный русскоязычный человек, который чинит автомобили или строит дома, и вас попросят описать процесс выноса мусора, вы скажете или напишете примерно следующее:</p>
<ul>
<li><em>Достать</em> мусорный мешок из ведра</li>
<li><em>Отнести</em> мешок к мусоропроводу или к мусорным бакам на улице</li>
<li><em>Выбросить</em> мусор</li>
<li><em>Вернуться</em> в квартиру</li>
<li><em>Вымыть</em> руки</li>
<li>Снова <em>бахнуться</em> на диван</li>
<li><em>Продолжить играть</em> в «фифу» или что вы там делали</li>
</ul>
<p>А если вы — простой англоязычный человек, ваше описание с поправкой на бытовые особенности будет выглядеть примерно так:</p>
<ul>
<li><em>get</em> the garbage bag from under the sink</li>
<li><em>carry</em> it out to the garage</li>
<li><em>dump</em> it in the garbage can</li>
<li><em>walk</em> back inside</li>
<li><em>wash</em> your hands</li>
<li><em>plop</em> back down on the couch</li>
<li><em>resume</em> playing your video game</li>
</ul>
<p>Независимо от того, на каком языке вы разговариваете, ваше описание состоит из набора действий, которые нужно выполнить, чтобы вынести мусор. Наши жизни и наши мысли состоят из действий: мы живём, дышим, ходим, разговариваем, смеёмся, плачем, надеемся, боимся, едим и так далее. Что очень важно, мы сами выбираем, что делать и как действовать. Именно в этом проявляется свобода воли.</p>
<p>Конечно, в наших жизнях и мыслях есть место для существительных. Мы едим существительные, покупаем их, сидим на них, спим на них, ездим на них. Существительное может свалиться вам на голову, и после этого у вас на существительном выскочит большое существительное. Существительные — это вещи, а как мы можем прожить без вещей? Но они — просто вещи, ничего более. Вот стоит дом, а за домом стоит гора. Любой ребёнок может назвать сотни вещей. Но вещи становятся интересными только благодаря изменениям, которые <em>происходят</em> с ними.</p>
<p>Изменения требуют действий. А действия наполняют жизнь красками. Нас окружают существительные, но вся полнота жизни раскрывается благодаря глаголам. Конечно, кроме существительных и глаголов есть ещё прилагательные, местоимения, союзы и все остальные части речи. Все они играют свои важные роли, поэтому их нельзя игнорировать. Разве это не было бы странным, если бы мы вдруг решили больше не использовать глаголы? Но есть на земле место, где происходит именно это.</p>
<h2 id="heading-2-3">Сказание о Королевстве Существительных</h2>
<p>В Королевстве Джаваленд, где <del>железной</del> кремниевой рукой правит король Ява, людям запрещено думать и действовать так, как привыкли это делать мы с вами. В этом королевстве по приказу Явы самыми важными частями речи считаются существительные. Они — самые почитаемые граждане этого королевства. Они ходят по улицам с важным видом в красивых нарядах, которые стали красивыми благодаря прилагательным. Сами прилагательные живут не так хорошо, как существительные, но всё равно они благодарят небеса за то, что они не родились глаголами. Потому что у глаголов в этом королевстве незавидная судьба.</p>
<p>В Королевстве Джаваленд по указанию короля Явы глаголы принадлежат существительным. Но они не просто живут и радуются жизни, как домашние коты у людей. Глаголы в Джаваленде делают любую работу. По сути, они живут в королевстве на правах рабов или крепостных крестьян. Все жители Джаваленда привыкли к этому и даже не знают, что в других землях может быть по-другому.</p>
<p>За всю работу в Джаваленде отвечают глаголы. Но они бесправные, поэтому им нельзя даже просто свободно гулять. Глагол может появляться на людях только в том случае, если его сопровождает существительное, которому он принадлежит.</p>
<p>«Сопровождает» — это тоже глагол, он не может находиться на людях сам. Поэтому на сцену надо позвать существительное VerbEscorter («СопровождательГлаголов»), которое обеспечивает сопровождение. Но «позвать» и «обеспечивает» — тоже глаголы. Рядом с ними всегда будут существительные «Зватель» и «Обеспечитель», которые заставят свои глаголы выполнять «Вызывание» и «Обеспечение».</p>
<p>Король по указанию самого бога Солнца время от времени угрожал изгнать все глаголы из королевства Джаваленд.</p>
<p><em>Примечание — Здесь автор оригинала использует словосочетание Sun God. Это явный намёк на компанию Sun Microsystems, которая <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/blog/posts/yazyk-programmirovaniya-java-osobennosti-populyarnost-situatsiya-na-rynke-truda" rel="noopener noreferrer" target="_blank">разработала язык Java в 90-е годы</a>.</em></p>
<p>Если бы эти планы осуществились, жителям королевства понадобился бы как минимум один глагол чтобы выполнять действия. У короля Явы тонкое чувство юмора, поэтому он пообещал оставить один глагол — «выполнять».</p>
<p><em>Примечание — Это игра слов: английский глагол «to execute» переводится как «выполнять» или «казнить».</em></p>
<p>Глагол «выполнять» и его ближайшие родственники «запускать», «стартовать», «исполнять», «делать» (run, start, go и так далее) могут заменить любой другой глагол. Для этого они используют существительное Выполнитель (<code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">Executioner</code>) и вызов «выполнить» (<code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">execute()</code>). Например, нужно подождать (англ. <em>to wait</em>)? Появляется Ждун (<code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">Waiter</code>) с вызовом <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">execute()</code>: <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">Waiter.execute()</code>. Нужно почистить зубы? Появляется <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">ToothBrusher(MyTeeth).go()</code>. Нужно вынести мусор? В дело вступает <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">TrashDisposalPlanExecutor.doIt()</code>. Ни один глагол не может чувствовать себя в безопасности: всех в Джаваленде можно заменить на существительное-выполнителя.</p>
<p>Может показаться, что в самых патриотичных уголках Джаваленда существительные полностью изгнали глаголы. Но это не так: существительные просто лишили глаголы не только прав, но и имён. Они заставляют глаголы называться именем существительных: вместо <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">Waiter.execute()</code> надо использовать <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">Waiter.wait()</code>, а вместо <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">ToothBrusher(MyTeeth).go()</code> — <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">ToothBrusher(MyTeeth).brush()</code>. По сути, многочисленные палачи-вассалы короля Явы маскируются за именами своих существительных-сюзеренов.</p>
<h2 id="heading-2-4">Глаголы в соседних королевствах</h2>
<p>В соседних королевствах избавление от мусора — простое действие. Его можно описать почти так же, как мы описываем его на русском или английском языке. Как и в Джаваленде, данные здесь — это существительные, а функции — глаголы. Но, в отличие от Джаваленда, в соседних королевствах существительные и функции существуют рядом и действуют сообща на равных правах, если это нужно для общего дела.</p>
<p>Например, в соседних Силяндии, Джаваскриптбурге, Перлсберри или Рубиленде избавление от мусора можно представить в качестве серии действий, то есть глаголов или функций. Чтобы вынести мусор, нужно применить эти действия к нужным объектам в правильном порядке. Например, <em>взять</em> мусорное ведро, <em>отнести</em> его к мусоропроводу, <em>выбросить</em> мусор в трубу мусоропровода. Действия здесь можно выполнять без сопровождающих и надзирателей.</p>
<p>В соседних королевствах глаголы — самостоятельные действующие лица, поэтому здесь очень редко возникает потребность в существительных-обёртках. Здесь нет Ждунов (<code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">Waiter</code>) или чистильщиков зубов (<code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">ToothBrusher</code>). В этих королевставах можно просто просто использовать подхотящие глаголы: <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">wait()</code> чтобы подождать или <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">brushTeeth()</code> чтобы почистить зубы.</p>
<p>В соседних королевствах обычно есть специальные механизмы, которые позволяют при необходимости создать важное существительное. Если изобретатели в этих королевствах создают что-то инновационное, например, комбайн для обработки полей, умный дом или электрическую зубную щётку, они могут использовать класс, у которого есть имя, описание, состояние и инструкции по использованию инновационного объекта.</p>
<p>Важное отличие соседних королевств от Джаваленда в том, что глаголы в них могут жить независимо. Они не нуждаются в существительных, которые ими управляют. Например, глаголу <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">wait()</code> не нужен Ждун (<code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">Waiter</code>).</p>
<p>Но жители королевства Джаваленд презирают своих соседей. Так повелось издавна в Землях Программирования.</p>
<h2 id="heading-2-5">Если копнуть глубже...</h2>
<p>В другом конце мира есть малоизведанные земли, в которых глаголы — важные и высокопоставленные граждане. В этих землях есть функциональные королевства Оккамлия, <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/blog/posts/haskell-yazyk-pozvolyayuschiy-glubzhe-ponyat-programmirovanie-kak-on-ustroen-i-pochemu-ego-vybirayut-razrabotchiki" rel="noopener noreferrer" target="_blank">Хаскелляндия</a>, <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/blog/posts/clojure" rel="noopener noreferrer" target="_blank">Кложаленд</a> и другие. Жители этих королевств редко встречаются с жителями Джаваленда. Поскольку функциональные королевства находятся в малоизведанных землях, у их жителей бывает много свободного времени. Иногда жители функциональных королевств от скуки ругают друг друга и даже воюют друг с другом.</p>
<p>В функциональных королевствах глаголы и существительные считаются гражданами с равными правами. Однако существительные здесь обычно ничего не делают. Они ничего не запускают и не выполняют, поскольку всё это делают за них глаголы. В этих королевствах нет странных законов, которые требовали бы создавать существительные для сопровождения глаголов. Поэтому в функциональных землях всегда ровно столько существительных, сколько есть вокруг реальных вещей.</p>
<p>Из-за такого порядка вещей глаголы в функциональных королевствах всегда на виду. Эти глаголы, то есть функции, даже могут показаться самыми главными жителями функциональных королевств. В конце концов, королевства ведь называются функциональными, а не предметными или объектными.</p>
<p>За функциональными королевствами, на самом краю земли, стоит легендарный град Лямбда-Абсолютий. В этом граде существительных вообще нет, в нём есть только глаголы. Конечно, в Лямбда-Абсолютии есть вещи, но их названия происходят от глаголов. Даже числа, с помощью которых считают лямбды (это местная валюта), происходят от глаголов. Здесь <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">0</code> обозначается так: <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">lambda()</code>. А <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">1</code> — это <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">lambda(lambda())</code>. Легко догадаться, что <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">2</code> — <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">lambda(lambda(lambda()))</code> и так далее. Все существительные, глаголы и другие части речи в этом граде происходят от священного глагола <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">lambda</code>.</p>
<p>Откровенно говоря, большинство жителей Джаваленда не знает о существовании далёких королевств. Вы можете представить их культурный шок, если бы они встретились с жителями функциональных земель? Чтобы выразить свои чувства, им пришлось бы придумать новые существительные, например, «ксенофобия».</p>
<blockquote>
<h3 id="heading-3-6">Узнайте больше об операционных системах</h3>
<p>У нас есть <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/courses/operating_systems" rel="noopener noreferrer" target="_blank">курс по операционным системам</a>. Зарегистрированные пользователи могут пройти его бесплатно. Другие бесплатные курсы можно найти <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/courses/free" rel="noopener noreferrer" target="_blank">по ссылке</a>.</p>
</blockquote>
<h2 id="heading-2-7">Счастливо ли живётся жителям Джаваленда?</h2>
<p>Можно подумать, что жизнь в Джаваленде как минимум странная, а как максимум, жителям этой страны приходится решать задачи очень неэффективным способом. Вы можете оценить, как живётся джавалендерам, по детским стихам. Посмотрите, как дети в этой стране рассказывают известное стихотворение про гвоздь.</p>
<p><em>Примечание — Речь идёт о <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://easyspeak.ru/company/archive/mother-goose/46" rel="noopener noreferrer" target="_blank">стихотворении о незабитом гвозде</a>. На русском языке оно начинается так:</em></p>
<p><em>Из-за незабитого гвоздя потеряли подкову,</em></p>
<p><em>Из-за потерянной подковы потеряли лошадь,</em></p>
<p><em>Из-за потерянной лошади гонец не доставил послание,</em></p>
<p><em>Из-за недоставленного послания проиграли войну...</em></p>
<p><em>Автор представил его в виде псевдокода в характерном для Джаваленда стиле:</em></p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">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.</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>Как видите, в Джаваленде стихотворение сильно отличается от оригинала. Но жителям Джаваленда кажется, что в такой манере есть особый шарм.</p>
<p>Этот шарм, по мнению джавалендеров, заключается в том, что всем сразу видна <em>архитектура</em>. Король Ява сильно любит архитектуру, потому что она полностью состоит из существительных. Как мы помним, все существительные — это вещи, а в Джаваленде больше всего ценятся вещи. Архитектура состоит из вещей, которые можно увидеть и потрогать, которые состоят из камня и стекла и подпирают небосвод, которые громко звенят, если ударить по ним палкой. Король Ява очень любит громкий звон. Ему нравится пинать колёса и стучать по карете, когда он испытывает новый экипаж.</p>
<p>Одно из главных стремлений человека — построить убежище, которое надёжно защищает от любой стихии. В Джаваленде есть много вещей, которые помогают жителям почувствовать себя в безопасности. Люди смотрят на монументальные архитектурные сооружения и думают: «Это точно надёжный дизайн!»</p>
<p>Эти мысли подтверждаются, когда джавалендеры пытаются изменить структуру. Мощь архитектуры в такие моменты проявляется особенно сильно, и люди убеждаются, что никому не под силу разрушить здания.</p>
<p>В дополнение к надёжной архитектуре в Джаваленде всё упорядочено и разложено по полочкам. Вы всегда найдёте нужное существительное на его месте. И все истории развиваются по общему сценарию: объект является доминирующим типом выражения, в нём есть управляющий для каждой абстракции и метод <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">run()</code> для каждого управляющего. Даже если у джавалендера нет большого опыта в проектировании, он понимает, что сможет оформить любую идею в характерном для Джаваленда стиле. В этом королевстве есть особый способ вычисления с помощью существительных, который помогает выразить любые абстракции и выполнить любые вычисления. Всё, что для этого нужно — существительные, конструкторы для них, методы доступа для обхода графов и <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">execute()</code>, без которого никакие планы выполнить невозможно.</p>
<p>Жители Джаваленда не просто счастливы — они гордятся положением вещей!</p>
<h2 id="heading-2-8">StateManager.getConsiderationSetter("Noun Oriented Thinking", State.HARMFUL).run()</h2>
<p>Или, как говорят в других королевствах за пределами Джаваленда, мышление, построенное на существительных, вредно. Именно эту мысль выражает псевдокод из подзаголовка.</p>
<p>Объектно-ориентированное программирование ставит существительные во главу угла. Но почему вы должны ставить одну часть речи выше других? Почему одна концепция должна быть лучше других? Ведь объектно-ориентированное программирование не делает глаголы менее важными в нашей повседневной жизни и в нашем способе мышления. Как сказал программист <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://twitter.com/jacobgabrielson" rel="noopener noreferrer" target="_blank">Джейкоб Гэбриэльсон из Amazon Web Services</a>, отстаивать объектно-ориентированное программирование — это то же самое, что пропагандировать брюки-ориентированный стиль одежды.</p>
<p><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/blog/posts/sistemy-tipov-v-yazyke-kakie-byvayut-i-chem-otlichayutsya" rel="noopener noreferrer" target="_blank">Статическая типизация</a> в королевстве Джаваленд, как и в других королевствах, тоже несёт с собой ряд проблем. Но слишком сильная зацикленность на существительных в процессе мышления и проектирования беспокоит даже сильнее. Любая система типизации заставляет разработчиков подстраиваться под неё, но отказ от глаголов выглядит необъяснимо и нерационально.</p>
<p>В C++ такой проблемы нет, поскольку в этом языке можно определять автономные функции. Более того, в C++ есть чёткая абстракция для пространства имён. А Java эксплуатирует идею классов для представления пространства имён, пользовательских типов, механизмов синтаксического делегирования, области видимости и много другого.</p>
<p>Не поймите этот посыл неправильно, здесь не идёт речь о том, что только C++ — хороший язык. Просто, по мнению автора этого сказания, в этом языке гибкая система типов, как минимум, по сравнению с Java. C++ страдает из-за проблем, вызванных тем, что разумные предложения заставляют слушателей закрывать уши и отмахиваться от вас или даже пытаться вас ударить. Из-за таких проблем с помощью C++ не всегда просто выразить конкретную мысль. Но по лаконичности C++ превосходит Java, потому что в C++ можно пользоваться глаголами. А кто захочет говорить на языке, в котором нет глаголов?</p>
<p>Действительно, классы — единственный инструмент проектирования, который есть в Java. Поэтому вам приходится брать приходящие в голову идеи и превращать их в предметы или существительные, даже если эти идеи по сути являются действиями, процессами или другими сущностями, не относящимися к вещам.</p>
<p>Автор этой истории всё время возвращается к тому, что когда-то говорили ему люди из древней страны Perl: «Эй, брат, не всё в этом мире есть объект».</p>
<p>Странно, что Java остаётся единственным из мейнстримных объектно-ориентированных языков, который придерживается радикального ориентированного на существительные способа думать и действовать. Вы не найдёте <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">AbstractProxyMediator</code>, <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">NotificationStrategyFactory</code> или подобные им существительные в <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/blog/posts/programmirovanie-na-python-osobennosti-obucheniya-perspektivy-situatsiya-na-rynke-truda" rel="noopener noreferrer" target="_blank">Python</a> или <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/blog/posts/yazyk-programmirovaniya-ruby-osobennosti-perspektivy-rynok-truda" rel="noopener noreferrer" target="_blank">Ruby</a>. Почему они так широко применяются в Java? Можно не сомневаться, что это объясняется разным отношением к глаголам. Python, Ruby, <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/blog/posts/stoit-li-uchit-javascript-perspektivy-situatsiya-na-rynke-truda-mneniya-ekspertov" rel="noopener noreferrer" target="_blank">JavaScript</a>, Perl и, конечно же, все функциональные языки позволяют объявлять и передавать функции как самодостаточные сущности, не оборачивая их в классы.</p>
<p>Конечно, это проще делать в динамически типизированных языках. Здесь вам достаточно передать ссылку на функцию, полученную из её названия. А ответственность вызывающего кода — выполнить функцию с подходящими аргументами и правильно использовать полученное значение.</p>
<p>Но многие языки со статической типизацией тоже позволяют работать с функциями как с объектами первого класса. В их число входят C, C++, Haskell, ML. Языку достаточно поддерживать синтаксис для создания, передачи и вызова функциональных литералов с подходящей сигнатурой типов.</p>
<style data-mantine-styles="inline">.__m__-_R_47derddmiub_{--carousel-slide-gap:var(--mantine-spacing-xs);--carousel-slide-size:80%;}@media(min-width: 36em){.__m__-_R_47derddmiub_{--carousel-slide-gap:var(--mantine-spacing-xl);--carousel-slide-size:50%;}}</style><div style="--carousel-control-size:calc(2.5rem * var(--mantine-scale));--carousel-controls-offset:var(--mantine-spacing-sm);margin-bottom:var(--mantine-spacing-lg);padding-block:var(--mantine-spacing-sm);background:var(--app-color-surface)" class="m_17884d0f mantine-Carousel-root responsiveClassName" data-orientation="horizontal" data-include-gap-in-size="true"><div class="m_39bc3463 mantine-Carousel-controls" data-orientation="horizontal"><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="previous" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="next" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(-90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button></div><div class="m_a2dae653 mantine-Carousel-viewport" data-type="media"><div class="m_fcd81474 mantine-Carousel-container __m__-_R_47derddmiub_" data-orientation="horizontal"><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/filmoteka-dlya-programmistov-25-filmov-o-programmirovanii-tehnologiyah-i-iskusstvennom-intellekte"><div style="padding-top:0rem;height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="margin-bottom:var(--mantine-spacing-sm)" class="m_599a2148 mantine-Card-section" data-first-section="true"><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img class="m_9e117634 mantine-Image-root" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MTY5OSwicHVyIjoiYmxvYl9pZCJ9fQ==--ecd38e914c68debadef03c88a60804b37146e5b5/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX2FuZF9wYWQiOls3MDgsMzU0XSwic2F2ZXIiOnsicXVhbGl0eSI6ODV9fSwicHVyIjoidmFyaWF0aW9uIn19--324dc52aa55ebe818c2a887ebcb832b9ad1c0381/%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%D1%8B%20IT-01.png" loading="lazy" alt="50 лучших фильмов и сериалов о технологиях"/></div></div><p style="margin-bottom:var(--mantine-spacing-xs);font-size:var(--mantine-font-size-lg);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">50 лучших фильмов и сериалов о технологиях</p><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Сделали подборку фильмов о технологиях, программировании, искусственном интеллекте и роботах.</p><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-sm)" class="m_4081bf90 mantine-Group-root">30 декабря 2022 г.<p style="font-size:inherit" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/marketolog-heksleta-natalya-musina-8-knig-kotorye-pomogut-vam-v-zhizni-i-v-rabote"><div style="padding-top:0rem;height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="margin-bottom:var(--mantine-spacing-sm)" class="m_599a2148 mantine-Card-section" data-first-section="true"><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img class="m_9e117634 mantine-Image-root" src="/vite/assets/blog_post-7eTyeLLt.webp" loading="lazy" alt="8 книг, которые помогут вам в жизни и в работе: советует комьюнити-менеджер Хекслета Наталья Мусина"/></div></div><p style="margin-bottom:var(--mantine-spacing-xs);font-size:var(--mantine-font-size-lg);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">8 книг, которые помогут вам в жизни и в работе: советует комьюнити-менеджер Хекслета Наталья Мусина</p><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Комьюнити-менеджер Хекслета Наталья Мусина делится подборкой своих любимых книг, которые помогают...</p><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-sm)" class="m_4081bf90 mantine-Group-root">29 декабря 2022 г.<p style="font-size:inherit" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/how-to-read-books"><div style="padding-top:0rem;height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="margin-bottom:var(--mantine-spacing-sm)" class="m_599a2148 mantine-Card-section" data-first-section="true"><div style="--ar-ratio:2" class="m_71ac47fc mantine-AspectRatio-root"><img class="m_9e117634 mantine-Image-root" src="/vite/assets/blog_post-7eTyeLLt.webp" loading="lazy" alt="Как эффективно читать профессиональную литературу"/></div></div><p style="margin-bottom:var(--mantine-spacing-xs);font-size:var(--mantine-font-size-lg);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Как эффективно читать профессиональную литературу</p><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Cооснователь Хекслета Кирилл Мокевнин рассказывает, как эффективно читать профессиональную литера...</p><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-sm)" class="m_4081bf90 mantine-Group-root">14 декабря 2022 г.<p style="font-size:inherit" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></a></div></div></div></div></div>
<p>Нет никаких причин, по которым Java не могла бы добавить поддержку функций первого класса и наконец-то войти во взрослый мир, где люди используют глаголы. На самом деле, существует язык на платформе JVM, который называется <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="http://nice.sourceforge.net/" rel="noopener noreferrer" target="_blank">Nice</a>. Его синтаксис похож на Java, а кроме того Nice поддерживает выразительные инструменты для использования глаголов: автономные функции, которые Java заставляет оборачивать в Callbacks или Runnables или другие анонимные интерфейсы классов, на которые можно ссылаться.</p>
<p>Sun даже не пришлось бы нарушать свою конвенцию, согласно которой все функции должны принадлежать классам. Каждая анонимная функция может иметь неявный указатель <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">this</code>, который указывает на класс, в котором определена эта функция.</p>
<p>Неясно, почему Sun настаивает, чтобы Java оставалась в Королевстве Существительных. Автор этой истории сомневается, что дело в недооценке жителей Джаваленда. Sun добавили в язык дженерики, а это очень сложная концепция. То есть Sun не переживает о том, чтобы язык оставался простым. И это не значит, что всё плохо. Java — состоявшийся язык, и он давно готов к тому, чтобы у программистов появились инструменты, которые позволяют программировать так, как люди думают.</p>
<p>Если это произойдёт, жители Джаваленда смогут спокойно выносить мусор, а потом возвращаться домой, садиться на диван и дальше играть в «фифу».</p>
<blockquote>
<p>Начните изучать разработку в групповом формате. В группах можно пройти профессии <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/professions/frontend" rel="noopener noreferrer" target="_blank">«Фронтенд-программист»</a>, <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/professions/backend" rel="noopener noreferrer" target="_blank">«Node.js-программист»</a>, <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/professions/php" rel="noopener noreferrer" target="_blank">«PHP-программист»</a>, <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/professions/python" rel="noopener noreferrer" target="_blank">«Python-программист»</a> и <a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.hexlet.io/professions/layout-designer" rel="noopener noreferrer" target="_blank">«Верстальщик»</a>.</p>
</blockquote></div><div class=""><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap;margin-bottom:var(--mantine-spacing-lg)" class="m_4081bf90 mantine-Group-root"><div class="m_4451eb3a mantine-Center-root" data-inline="true"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:var(--mantine-spacing-xs);color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-user "><path d="M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0"></path><path d="M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2"></path></svg></div><p style="margin-inline-end:var(--mantine-spacing-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Дмитрий Дементий</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">5 лет назад</p></div><div style="align-items:center" class="m_8bffd616 mantine-Flex-root __m__-_R_5dirddmiub_"><a style="display:inline-flex" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/javaland/votes"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:var(--mantine-spacing-xs);color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-thumb-up "><path d="M7 11v8a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1v-7a1 1 0 0 1 1 -1h3a4 4 0 0 0 4 -4v-1a2 2 0 0 1 4 0v5h3a2 2 0 0 1 2 2l-1 5a2 3 0 0 1 -2 2h-7a3 3 0 0 1 -3 -3"></path></svg></div></a><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">10</p></div></div></div><div style="background-color:var(--mantine-color-indigo-light);border:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding:var(--mantine-spacing-xl)" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h4)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Читайте также:</p><ul style="margin-inline-start:var(--mantine-spacing-lg)" class="m_abbac491 mantine-List-root"><li style="margin-bottom:var(--mantine-spacing-sm)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a style="color:inherit" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/filmoteka-dlya-programmistov-25-filmov-o-programmirovanii-tehnologiyah-i-iskusstvennom-intellekte">50 лучших фильмов и сериалов о технологиях</a></span></div></li><li style="margin-bottom:var(--mantine-spacing-sm)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a style="color:inherit" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/marketolog-heksleta-natalya-musina-8-knig-kotorye-pomogut-vam-v-zhizni-i-v-rabote">8 книг, которые помогут вам в жизни и в работе: советует комьюнити-менеджер Хекслета Наталья Мусина</a></span></div></li><li style="margin-bottom:var(--mantine-spacing-sm)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><a style="color:inherit" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/blog/posts/how-to-read-books">Как эффективно читать профессиональную литературу</a></span></div></li></ul></div><div style="margin-block:var(--mantine-spacing-xl)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" role="separator"></div></div><div></div></div><style data-mantine-styles="inline">.__m__-_R_lmiub_{--col-flex-grow:auto;--col-flex-basis:100%;--col-max-width:100%;}@media(min-width: 48em){.__m__-_R_lmiub_{--col-flex-grow:auto;--col-flex-basis:16.666666666666668%;--col-max-width:16.666666666666668%;}}@media(min-width: 62em){.__m__-_R_lmiub_{--col-flex-grow:auto;--col-flex-basis:33.333333333333336%;--col-max-width:33.333333333333336%;}}</style><div class="m_96bdd299 mantine-Grid-col __m__-_R_lmiub_ mantine-visible-from-md"><div style="background-color:var(--mantine-color-indigo-light);border:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-bottom:var(--mantine-spacing-xl);padding:var(--mantine-spacing-xl);width:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><div style="margin-bottom:var(--mantine-spacing-md)" class="m_4451eb3a mantine-Center-root" data-inline="true"><p style="font-size:var(--mantine-font-size-h4)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Категории</p></div><ul class="m_abbac491 mantine-List-root"><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Мотивация">Мотивация</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Истории успеха">Истории успеха</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Дневник студента">Дневник студента</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Код">Код</button></span></div></li><li style="margin-bottom:var(--mantine-spacing-xs)" class="m_abb6bec2 mantine-List-item" data-with-icon="true"><div class="m_75cd9f71 mantine-List-itemWrapper"><span class="m_60f83e5b mantine-List-itemIcon"><div class="m_4451eb3a mantine-Center-root"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-chevron-compact-right "><path d="M11 4l3 8l-3 8"></path></svg></div></div></span><span class="mantine-List-itemLabel"><button style="color:inherit;text-decoration:underline" class="mantine-focus-auto m_87cf2631 mantine-UnstyledButton-root" type="button" aria-label="Карьера">Карьера</button></span></div></li></ul></div><div style="justify-content:end;margin-top:0rem;position:sticky;top:calc(5rem * var(--mantine-scale))" class="m_8bffd616 mantine-Flex-root __m__-_R_5dlmiub_"><div tabindex="0" style="cursor:pointer"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses_web_development?promo_name=program_category&promo_position=blog_post&promo_creative=card&promo_type=card"><div style="background-color:var(--mantine-color-default);border:calc(0.0625rem * var(--mantine-scale)) solid var(--mantine-color-default-border);padding-inline:var(--mantine-spacing-xl);padding-top:var(--mantine-spacing-xl);padding-bottom:var(--mantine-spacing-xs);width:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root"><div class="m_4451eb3a mantine-Center-root" data-inline="true"><p style="font-size:var(--mantine-font-size-h4)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Курсы по веб-разработке</p></div><img class="m_9e117634 mantine-Image-root" src="/vite/assets/development-BVihs_d5.png"/><p style="margin-bottom:var(--mantine-spacing-xs);text-align:right" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></a></div></div></div></div></div></div></div>
</main>
<footer class="bg-dark fw-light text-light px-3 py-5">
<div class="row small">
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 mb-3">Хекслет</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/about">О нас</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/testimonials">Отзывы</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://b2b.hexlet.io" role="button">Корпоративное обучение</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/blog">Блог</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/qna">Вопросы и ответы</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/glossary">Глоссарий</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://help.hexlet.io" data-target="_blank" role="button">Справка</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" target="_blank" rel="noopener noreferrer" href="/map">Карта сайта</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 fw-normal mb-3">Направления</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_devops">DevOps
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_data_analytics">Аналитика
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_backend_development">Бэкенд
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_programming">Программирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_testing">Тестирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_front_end_dev">Фронтенд
</a></li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Профессии</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/go">Go-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/java">Java-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python">Python-разработчик </a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/data-analytics">Аналитик данных</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/qa-engineer">Инженер по ручному тестированию</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php">РНР-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/frontend">Фронтенд-разработчик</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Навыки</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python-django-developer">Django</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/docker">Docker</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php-laravel-developer">Laravel</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/postman">Postman</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-react-developer">React</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-rest-api">REST API в Node.js</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/spring-boot">Spring Boot</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/typescript">Typescript</a>
</li>
</ul>
</div>
</div>
<hr>
<div class="row">
<div class="col-12 col-sm-4 col-md-2">
<div class="fs-4">
<ul class="list-unstyled d-flex">
<li class="me-3">
<a aria-label="Telegram" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://t.me/hexlet_ru"><span class="bi bi-telegram"></span>
</a></li>
<li>
<a aria-label="Youtube" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://www.youtube.com/user/HexletUniversity"><span class="bi bi-youtube"></span>
</a></li>
</ul>
</div>
<div class="mb-2 d-flex flex-column">
<a class="link-light text-decoration-none" rel="nofollow" href="mailto:support@hexlet.io">support@hexlet.io</a>
<a class="link-light text-decoration-none py-2" target="_blank" href="https://t.me/hexlet_help_bot">t.me/hexlet_help_bot</a>
</div>
<ul class="list-unstyled d-flex">
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://hexlet.io/locale/switch?new_locale=en" data-target="_self" role="button"><span class="my-auto">EN</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 opacity-100 external-link" rel="nofollow" data-href="https://ru.hexlet.io/locale/switch?new_locale=ru" data-target="_self" role="button"><span class="my-auto">RU</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://kz.hexlet.io/locale/switch?new_locale=kz" data-target="_self" role="button"><span class="my-auto">KZ</span>
</span></li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<ul class="list-unstyled fs-4">
<li class="mb-3">
<a class="link-light text-decoration-none" href="tel:8%20800%20100%2022%2047">8 800 100 22 47</a>
<span class="d-block opacity-50 small">бесплатно по РФ</span>
</li>
<li>
<a class="link-light text-decoration-none" href="tel:%2B7%20495%20085%2021%2062">+7 495 085 21 62</a>
<span class="d-block opacity-50 small">бесплатно по Москве</span>
</li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<div class="small mb-3">Образовательные услуги оказываются на основании Л035-01298-77/01989008 от 14.03.2025</div>
<ul class="list-unstyled small">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/legal">Правовая информация</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/offer">Оферта</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/license">Лицензия</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/contacts">Контакты</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-12 col-md-4 small">
<div class="mb-2">
<div>ООО «<a href="/" class="text-decoration-none link-light">Хекслет Рус</a>»</div>
<div>108813 г. Москва, вн.тер.г. поселение Московский,</div>
<div>г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3</div>
<div>ОГРН 1217300010476</div>
<div>ИНН 7325174845</div>
</div>
<hr>
<div>АНО ДПО «<a href="/" class="text-decoration-none link-light">Учебный центр «Хекслет</a>»</div>
<div>119331 г. Москва, вн. тер. г. муниципальный округ</div>
<div>Ломоносовский, пр-кт Вернадского, д. 29</div>
<div>ОГРН 1247700712390</div>
<div>ИНН 7736364948</div>
</div>
</div>
</footer>
<div id="root-assistant-offcanvas"></div>
<script src="/vite/assets/assistant-Bukl1lYy.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-BrRXra1y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/MarkdownBlock-DbyKWoR_.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/shiki-V011pkdv.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-XR8Qr8kR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dist-GCHh59xr.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useIsomorphicEffect-HJ6VK0D3.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-KSp6QbZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/classnames-l6ipYlLR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/debounce-jMQ_Cf4f.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v67327c56f0bb4ef8b305cae61679db8f1769101564043" integrity="sha512-rdcWY47ByXd76cbCFzznIcEaCN71jqkWBBqlwhF1SY7KubdLKZiEGeP7AyieKZlGP9hbY/MhGrwXzJC/HulNyg==" data-cf-beacon='{"version":"2024.11.0","token":"d11015b65d11429ea6b4a2ef37dd7e0b","server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>