Pull to refresh
4K+
54

Пользователь

2
Rating
61
Subscribers
Send message

У нас в первую очередь инструмент моделирования (ArchiMate, C4, EPC, VAD, UML, бизнес‑модели, ИТ инфраструктура, концептуальные модели и так далее). Модели редактируются в таком виде:

Чтобы перейти в основной редактор можно нажать эту кнопку:

Модели хранятся в репозитории с управлением доступом, валидацией моделей. У меня ощущение, что yEd на много проще, это скорее редактор диаграмм, чем инструмент моделирования. Хотя у них есть и разные методы анализа моделей, типа поиска критического пути, то есть yEd — не просто рисовалка картинок как draw.io.

В общем если проводить градацию между рисовалками картинок и полнофункциональными инструментами моделирования, то я думаю что yEd где‑то посередине между draw.io и нашим Architeezy. У нас можно редактировать модели не только в виде диаграмм, но и в виде таблиц или кода. Могут быть межмодельные связи. У объектов и связей могут быть атрибуты, которые можно использовать для генерации документов или анализа моделей. Есть редактор документов как в Notion. Есть совместная работа над моделями как в Miro.

Целевая аудитория — это пока архитекторы, аналитики, разработчики.

В статье описано по сути просто дополнение для анализа моделей. Например, я описал ИТ‑архитектуру предприятия, она у меня раскидана по множеству небольших связанных диаграмм, но мне нужно увидеть всю картину в целом, например, проследить связи между целями компании и серверами. Для этого я могу выгрзуить модель в виде такого графа, а использовать его в качестве редактора было бы не очень удобно.

Сейчас для визуализации графов используется Cytoscape.js. Я рассматривал использование yEd в качестве движка или чтобы можно было выгрузить модель и просматривать в их редакторе. Но у них просто запредельная стоимость лицензии.

gemma4:31b-it-q4_K_M с ограничением контекста 64к токенов помещается в 24Гб на nvidia 4090. И вроде даже что-то осмысленное делает в Claude Code хотя и медленно. Но ощущение, что подписка на Claude пока ещё выгоднее

Я мигрировал конфиг с помощью:

npx @oxlint/migrate --type-aware

И даже вручную не правил

В итоге я перевел проект с eslint на oxlint, с prettier на oxfmt. Многих правил действительно нет, но скорость для меня видимо важнее. Ради интереса замерил. Это монорепозиторий с библиотекой и приложением:

Раньше - 92.5 секунды:

  • lib eslint - 23 секунды

  • lib vite build - 2.5 секунды

  • app eslint - 8 секунд

  • app vite build - 59 секунд

Сейчас - 10.5 секунд:

  • lib oxlint - 4 секунды

  • lib vite build - 0.5 секунды

  • app oxlint - 1 секунда

  • app vite build - 5 секунд

Попробовал и скорость просто космическая, неужели наконец будет нормальная сборка фронтенда. В этом стеке ещё есть oxlint, который должен быть сильно быстрее eslint

Да, поместить всю историю чатов или корпоративную базу знаний в контекст конечно не получится. Но можно вызывать правильные тулы, чтобы они добавляли в контекст максимально релевантную информацию. Можно писать системные промпты или инструкции для LLM с выжимкой самых важных вещей. Можно декомпозировать сложные задачи. Точно так же как это делают и люди: используют инструменты для быстрого поиска информации, пишут инструкции для себя и других, декомпозируют задачи

Я не спорю с большинством тезисов. По моему опыту иногда ИИ сильно упрощает работу, а иногда капец тупит и от него не добиться написания нормального однострочного скрипта

Вот когда ИИ начнет занимать объем футбольного мяча, и потреблять 150-200 ватт

Mac Studio M3 Ultra потребляет 9-270 ватт. Там 512 Гб объединенной памяти и можно запускать достаточно большие LLM. Можно объединять несколько штук в кластер

пока мы будем пользоваться расшаренным ИИ в дата-центре, который никак не обучается от взаимодействия с внешним миром (потому что этап обучения у него отдельный, и до продакшена)

LLM могут использовать долговременную память из истории чатов, из внешних баз знаний

Время от времени молоток превращается в кирпич, потому что ему нужно установить обновления. А когда телеметрия или ещё какие‑то службы разогревают молоток, то на нём можно вскипятить воду или использовать для обогрева помещения в холодное время суток. Плюс молоток тщательно собирает информацию о вас, поэтому показывает максимально полезную и персонализированную рекламу! И конечно не стоит забывать, что таким молотком не сможет пользоваться абы кто, для начала необходимо получить облачную учётную запись

Разве не достаточно обеспечить уникальность id в рамках одной схемы \ файла?

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

Меня смущает сама идея. У нас в первую очередь инструмент моделирования. Модель — это центральная сущность. Модель в нашем инструменте — это граф в математическом смысле этого слова с типизированными узлами, связями и с атрибутами. Этот граф можно представить в виде такого JSON или XML, я надеюсь что мы когда‑нибудь уже добавим выгрузку моделей в RDF, OWL.

У моделей могут быть разные формы представления, они вторичны — диаграмма, дерево, таблица, код.

Вот, например, разные формы представления C4 модели:

Слева её древовидное представление. По центру диаграмма. Справа форма свойств.

Вот, табличное представление этой же модели:

У нас всё строится поверх моделей (JSONов с данными грубо говоря). А в draw.io центральная сущность — это диаграмма, её конечно можно дополнить какими‑то атрибутами, но для меня это выглядит сложно и костыльно — как попытка превратить рисовалку диаграмм в инструмент моделирования.

Словом, у нас основной акцент на репозитории моделей, с управлением доступом, с версионированием, с возможностью использовать метамодели. И поверх него уже добавлены редакторы диаграмм, таблиц, кода. А выстраивать всё это вокруг draw.io для меня выглядит сложно.

Лучше semantic Enterprise Architect

Мы в полушаге от этого. Эта C4 модель выше в JSON выглядит так:

C4 модель в JSON формате
{
  "json": { "version": "1.0", "encoding": "utf-8" },
  "ns": { "c4": "https://architeezy.com/metamodel/c4/dev/c4" },
  "content": [
    {
      "id": "0198d188-8e42-7484-ac18-fec9bb876d48",
      "eClass": "c4:SystemLandscape",
      "data": {
        "name": "Architecture",
        "items": [
          {
            "id": "0198d188-b250-726f-91b8-7e6a7475f19f",
            "eClass": "c4:SoftwareSystem",
            "data": {
              "name": "Architeezy",
              "description": "A modeling tool",
              "items": [
                {
                  "id": "0198d1a8-ffbe-73f3-b33d-1bbac1a9e338",
                  "eClass": "c4:Container",
                  "data": {
                    "name": "Web UI",
                    "items": [
                      {
                        "id": "0198dcb2-f6ef-7eec-96a0-e6acc91c2372",
                        "eClass": "c4:Component",
                        "data": { "name": "Starting Page" }
                      },
                      {
                        "id": "0198dcb5-29b0-75ab-af98-052032832df8",
                        "eClass": "c4:Component",
                        "data": { "name": "User Settings" }
                      },
                      {
                        "id": "0198dcb5-ce06-7c54-9493-1568e50a2533",
                        "eClass": "c4:ComponentGroup",
                        "data": {
                          "name": "Modeling Workbench",
                          "items": [
                            {
                              "id": "0198dcb3-9f0c-723b-9f74-f998925b7214",
                              "eClass": "c4:Component",
                              "data": { "name": "Model Explorer" }
                            },
                            {
                              "id": "0198dcb6-ae07-7cb9-860b-bbafac42e8f0",
                              "eClass": "c4:Component",
                              "data": { "name": "Diagram Editor" }
                            },
                            {
                              "id": "0198dcb7-00d9-7422-b924-be8f757c3a71",
                              "eClass": "c4:Component",
                              "data": { "name": "Table Editor" }
                            },
                            {
                              "id": "0198dcb7-2a9d-7eb2-89a2-f827c6d9c8e6",
                              "eClass": "c4:Component",
                              "data": { "name": "Textual Editor" }
                            },
                            {
                              "id": "0198dcb7-6c0a-7a14-a09a-4883bb5c5f8b",
                              "eClass": "c4:Component",
                              "data": { "name": "Properties Form" }
                            },
                            {
                              "id": "0198e163-ebe1-70bc-bc18-a2f8cca05c63",
                              "eClass": "c4:Component",
                              "data": { "name": "Access Management" }
                            },
                            {
                              "id": "0198e164-9a72-7c9c-b987-fe6417e45345",
                              "eClass": "c4:Component",
                              "data": { "name": "Image Editor" }
                            },
                            {
                              "id": "0198e164-dc93-78c6-b587-2d2e8ebac508",
                              "eClass": "c4:Component",
                              "data": { "name": "Project Settings" }
                            }
                          ]
                        }
                      }
                    ]
                  }
                },
                {
                  "id": "0198d1aa-3f9e-76f6-a9bd-fa7db76e3c83",
                  "eClass": "c4:Container",
                  "data": {
                    "name": "API Server",
                    "description": "Provides API for Web UI",
                    "items": [
                      {
                        "id": "0198d1b2-9b4a-7066-94c0-7ef908f4a355",
                        "eClass": "c4:Component",
                        "data": { "name": "REST API" }
                      },
                      {
                        "id": "0198d1b2-cb17-76fc-bbb3-0d2691c8f6d3",
                        "eClass": "c4:Component",
                        "data": { "name": "Data Access Layer" }
                      },
                      {
                        "id": "0198d1b3-7929-7308-9ca4-e4286357c7fc",
                        "eClass": "c4:Component",
                        "data": { "name": "GraphQL API" }
                      },
                      {
                        "id": "0198dcbf-ec05-7c20-85b7-1aa598e8c58a",
                        "eClass": "c4:ComponentGroup",
                        "data": {
                          "name": "Model Editor",
                          "items": [
                            {
                              "id": "0198d1b4-1b8b-79e3-b71d-90462cf07c67",
                              "eClass": "c4:Component",
                              "data": { "name": "Editing Context" }
                            },
                            {
                              "id": "0198dcca-bc33-793a-a100-0cd3693f4400",
                              "eClass": "c4:Component",
                              "data": { "name": "Diagram Event Processor" }
                            },
                            {
                              "id": "0198dccb-2fbc-78c2-b61d-bd64d192af3a",
                              "eClass": "c4:Component",
                              "data": { "name": "Table Event Processor" }
                            },
                            {
                              "id": "0198dccb-7eaf-7b1c-8e8d-f9dd5edc8015",
                              "eClass": "c4:Component",
                              "data": { "name": "Text Event Processor" }
                            }
                          ]
                        }
                      }
                    ],
                    "relationships": [
                      {
                        "id": "0198dcac-676a-7b48-a672-1ecd1e66bca9",
                        "eClass": "c4:Relationship",
                        "data": {
                          "source": "0198d1a8-ffbe-73f3-b33d-1bbac1a9e338",
                          "target": "0198d1b2-9b4a-7066-94c0-7ef908f4a355"
                        }
                      },
                      {
                        "id": "0198dcac-7c01-738f-8762-aef37fa4cac2",
                        "eClass": "c4:Relationship",
                        "data": {
                          "source": "0198d1a8-ffbe-73f3-b33d-1bbac1a9e338",
                          "target": "0198d1b3-7929-7308-9ca4-e4286357c7fc"
                        }
                      },
                      {
                        "id": "0198dcae-a32d-7637-bc55-6bf204734106",
                        "eClass": "c4:Relationship",
                        "data": {
                          "source": "0198d1b2-9b4a-7066-94c0-7ef908f4a355",
                          "target": "0198d1b2-cb17-76fc-bbb3-0d2691c8f6d3"
                        }
                      },
                      {
                        "id": "0198dcae-b38f-7545-b1c9-d64cd3d6e0a9",
                        "eClass": "c4:Relationship",
                        "data": {
                          "source": "0198d1b3-7929-7308-9ca4-e4286357c7fc",
                          "target": "0198d1b4-1b8b-79e3-b71d-90462cf07c67"
                        }
                      },
                      {
                        "id": "0198dcae-d00d-7b57-a2fa-fb7bc4a9742b",
                        "eClass": "c4:Relationship",
                        "data": {
                          "source": "0198d1b4-1b8b-79e3-b71d-90462cf07c67",
                          "target": "0198d1b2-cb17-76fc-bbb3-0d2691c8f6d3"
                        }
                      },
                      {
                        "id": "0198dcae-e5a1-7265-882e-8bf151505368",
                        "eClass": "c4:Relationship",
                        "data": {
                          "source": "0198d1b2-cb17-76fc-bbb3-0d2691c8f6d3",
                          "target": "0198d1aa-6cac-72f4-a3a1-8588513bfab7"
                        }
                      },
                      {
                        "id": "0198dccb-bb01-7c2e-9160-390220d57ba0",
                        "eClass": "c4:Relationship",
                        "data": {
                          "source": "0198d1b4-1b8b-79e3-b71d-90462cf07c67",
                          "target": "0198dcca-bc33-793a-a100-0cd3693f4400"
                        }
                      },
                      {
                        "id": "0198dccb-c6ad-788e-a65b-8e16680b0f01",
                        "eClass": "c4:Relationship",
                        "data": {
                          "source": "0198d1b4-1b8b-79e3-b71d-90462cf07c67",
                          "target": "0198dccb-2fbc-78c2-b61d-bd64d192af3a"
                        }
                      },
                      {
                        "id": "0198dccb-d353-7729-bac2-b3ff1f335761",
                        "eClass": "c4:Relationship",
                        "data": {
                          "source": "0198d1b4-1b8b-79e3-b71d-90462cf07c67",
                          "target": "0198dccb-7eaf-7b1c-8e8d-f9dd5edc8015"
                        }
                      }
                    ]
                  }
                },
                {
                  "id": "0198d1aa-6cac-72f4-a3a1-8588513bfab7",
                  "eClass": "c4:Container",
                  "data": { "name": "Database", "kind": "Database" }
                }
              ],
              "relationships": [
                {
                  "id": "0198d1ac-c984-79b5-af09-0bfbffda3d6d",
                  "eClass": "c4:Relationship",
                  "data": {
                    "name": "Sends API requests",
                    "source": "0198d1a8-ffbe-73f3-b33d-1bbac1a9e338",
                    "target": "0198d1aa-3f9e-76f6-a9bd-fa7db76e3c83"
                  }
                },
                {
                  "id": "0198d1ad-002c-78d7-937e-cdb3251c818d",
                  "eClass": "c4:Relationship",
                  "data": {
                    "name": "Stores data",
                    "source": "0198d1aa-3f9e-76f6-a9bd-fa7db76e3c83",
                    "target": "0198d1aa-6cac-72f4-a3a1-8588513bfab7"
                  }
                },
                {
                  "id": "0198d81b-52ab-7a33-a75e-586b73dcef3c",
                  "eClass": "c4:Relationship",
                  "data": {
                    "name": "Authenticates",
                    "source": "0198d1aa-3f9e-76f6-a9bd-fa7db76e3c83",
                    "target": "0198d18c-0ce0-7cc5-8708-8bc3c1c7a5dd"
                  }
                },
                {
                  "id": "0198d81b-b9b5-7a59-a003-7a358de68b77",
                  "eClass": "c4:Relationship",
                  "data": {
                    "name": "Provides models",
                    "source": "0198d18e-06b0-7f23-b58c-5d999fcffc3e",
                    "target": "0198d1aa-3f9e-76f6-a9bd-fa7db76e3c83"
                  }
                },
                {
                  "id": "0198d81d-d2ac-7b7e-92e0-25c27d7ebdf3",
                  "eClass": "c4:Relationship",
                  "data": {
                    "name": "Consumes models",
                    "source": "0198d18e-3406-74b9-85fe-d6f2abf13ed8",
                    "target": "0198d1aa-3f9e-76f6-a9bd-fa7db76e3c83"
                  }
                }
              ]
            }
          },
          {
            "id": "0198d189-cda2-7c83-9670-095acf170be1",
            "eClass": "c4:Person",
            "data": { "name": "Metamodel Developer" }
          },
          {
            "id": "0198d188-f01b-7ac5-9837-0079eb7b441f",
            "eClass": "c4:Person",
            "data": { "name": "Model Developer" }
          },
          {
            "id": "0198d18a-cbc1-7926-ad36-f694e8bc2b06",
            "eClass": "c4:Person",
            "data": { "name": "Business User" }
          },
          {
            "id": "0198d18c-0ce0-7cc5-8708-8bc3c1c7a5dd",
            "eClass": "c4:SoftwareSystem",
            "data": {
              "name": "Identity and Access Management System",
              "existing": true
            }
          },
          {
            "id": "0198d18e-06b0-7f23-b58c-5d999fcffc3e",
            "eClass": "c4:SoftwareSystem",
            "data": { "name": "Model Provider", "existing": true }
          },
          {
            "id": "0198d18e-3406-74b9-85fe-d6f2abf13ed8",
            "eClass": "c4:SoftwareSystem",
            "data": { "name": "Model Consumer", "existing": true }
          }
        ],
        "relationships": [
          {
            "id": "0198d18e-fe82-78eb-ad48-646e6242a675",
            "eClass": "c4:Relationship",
            "data": {
              "name": "Authenticates users",
              "source": "0198d188-b250-726f-91b8-7e6a7475f19f",
              "target": "0198d18c-0ce0-7cc5-8708-8bc3c1c7a5dd"
            }
          },
          {
            "id": "0198d18f-4e98-73a6-9aed-19023ebadb77",
            "eClass": "c4:Relationship",
            "data": {
              "name": "Develops models",
              "source": "0198d188-f01b-7ac5-9837-0079eb7b441f",
              "target": "0198d188-b250-726f-91b8-7e6a7475f19f"
            }
          },
          {
            "id": "0198d18f-9e2e-7adf-b845-268d4fd9581b",
            "eClass": "c4:Relationship",
            "data": {
              "name": "Develops modeling rules",
              "source": "0198d189-cda2-7c83-9670-095acf170be1",
              "target": "0198d188-b250-726f-91b8-7e6a7475f19f"
            }
          },
          {
            "id": "0198d18f-aff3-75ca-9b1a-5109f3526e4b",
            "eClass": "c4:Relationship",
            "data": {
              "name": "Uses models",
              "source": "0198d18a-cbc1-7926-ad36-f694e8bc2b06",
              "target": "0198d188-b250-726f-91b8-7e6a7475f19f"
            }
          },
          {
            "id": "0198d191-ed73-7a2a-9e7d-4d45acb79b72",
            "eClass": "c4:Relationship",
            "data": {
              "name": "Provides models",
              "source": "0198d18e-06b0-7f23-b58c-5d999fcffc3e",
              "target": "0198d188-b250-726f-91b8-7e6a7475f19f"
            }
          },
          {
            "id": "0198d81e-1aa4-77cd-90a0-664caafd88b0",
            "eClass": "c4:Relationship",
            "data": {
              "name": "Consumes models",
              "source": "0198d18e-3406-74b9-85fe-d6f2abf13ed8",
              "target": "0198d188-b250-726f-91b8-7e6a7475f19f"
            }
          }
        ]
      }
    }
  ]
}

А в XML так:

C4 модель в XMI формате
<?xml version="1.0" encoding="UTF-8"?>
<c4:SystemLandscape xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c4="https://architeezy.com/metamodel/c4/dev/c4" xmi:id="_AZjRiI5CdISsGP7Ju4dtSA" name="Architecture">
  <items xsi:type="c4:SoftwareSystem" xmi:id="_AZjRiLJQcm-RuH5qdHXxnw" name="Architeezy" description="A modeling tool">
    <items xsi:type="c4:Container" xmi:id="_AZjRqP--c_OzPRu6wanjOA" name="Web UI">
      <items xsi:type="c4:Component" xmi:id="_AZjcsvbvfuyWoOasyRwjcg" name="Starting Page"/>
      <items xsi:type="c4:Component" xmi:id="_AZjctSmwdauvmAUgMoMt-A" name="User Settings"/>
      <items xsi:type="c4:ComponentGroup" xmi:id="_AZjctc4GfFSUkxVo5QolMw" name="Modeling Workbench">
        <items xsi:type="c4:Component" xmi:id="_AZjcs58McjufdPmYkltyFA" name="Model Explorer"/>
        <items xsi:type="c4:Component" xmi:id="_AZjctq4HfLmGC7uvrELo8A" name="Diagram Editor"/>
        <items xsi:type="c4:Component" xmi:id="_AZjctwDZdCK5JL6PdXw6cQ" name="Table Editor"/>
        <items xsi:type="c4:Component" xmi:id="_AZjctyqdfrKJovgnxtnI5g" name="Textual Editor"/>
        <items xsi:type="c4:Component" xmi:id="_AZjct2wKehSgmkiDu1xfiw" name="Properties Form"/>
        <items xsi:type="c4:Component" xmi:id="_AZjhY-vhcLy8GKL4zKBcYw" name="Access Management"/>
        <items xsi:type="c4:Component" xmi:id="_AZjhZJpyfJy5h_5kF-RTRQ" name="Image Editor"/>
        <items xsi:type="c4:Component" xmi:id="_AZjhZNyTeMa1hy0ujrrFCA" name="Project Settings"/>
      </items>
    </items>
    <items xsi:type="c4:Container" xmi:id="_AZjRqj-edvapvfp9t248gw" name="API Server" description="Provides API for Web UI">
      <items xsi:type="c4:Component" xmi:id="_AZjRsptKcGaUwH75CPSjVQ" name="REST API"/>
      <items xsi:type="c4:Component" xmi:id="_AZjRsssXdvy7sw0mkcj20w" name="Data Access Layer"/>
      <items xsi:type="c4:Component" xmi:id="_AZjRs3kpcwicpOQoY1fH_A" name="GraphQL API"/>
      <items xsi:type="c4:ComponentGroup" xmi:id="_AZjcv-wFfCCFtxqlmOjFig" name="Model Editor">
        <items xsi:type="c4:Component" xmi:id="_AZjRtBuLeeO3HZBGLPB8Zw" name="Editing Context"/>
        <items xsi:type="c4:Component" xmi:id="_AZjcyrwzeTqhAAzTaT9EAA" name="Diagram Event Processor"/>
        <items xsi:type="c4:Component" xmi:id="_AZjcyy-8eMK2Hb1k0ZKvOg" name="Table Event Processor"/>
        <items xsi:type="c4:Component" xmi:id="_AZjcy36vexyOjfndXtyAFQ" name="Text Event Processor"/>
      </items>
      <relationships xmi:id="_AZjcrGdqe0imch7NHma8qQ" source="_AZjRqP--c_OzPRu6wanjOA" target="_AZjRsptKcGaUwH75CPSjVQ"/>
      <relationships xmi:id="_AZjcrHwBc4-HYq7zf6TKwg" source="_AZjRqP--c_OzPRu6wanjOA" target="_AZjRs3kpcwicpOQoY1fH_A"/>
      <relationships xmi:id="_AZjcrqMtdje8VWvyBHNBBg" source="_AZjRsptKcGaUwH75CPSjVQ" target="_AZjRsssXdvy7sw0mkcj20w"/>
      <relationships xmi:id="_AZjcrrOPdUWxydZM09bgqQ" source="_AZjRs3kpcwicpOQoY1fH_A" target="_AZjRtBuLeeO3HZBGLPB8Zw"/>
      <relationships xmi:id="_AZjcrtANe1ei-vt7xKl0Kw" source="_AZjRtBuLeeO3HZBGLPB8Zw" target="_AZjRsssXdvy7sw0mkcj20w"/>
      <relationships xmi:id="_AZjcruWhcmWILovxUVBTaA" source="_AZjRsssXdvy7sw0mkcj20w" target="_AZjRqmyscvSjoYWIUTv6tw"/>
      <relationships xmi:id="_AZjcy7sBfC6RYDkCINV7oA" source="_AZjRtBuLeeO3HZBGLPB8Zw" target="_AZjcyrwzeTqhAAzTaT9EAA"/>
      <relationships xmi:id="_AZjcy8ateI6mW44WaAsPAQ" source="_AZjRtBuLeeO3HZBGLPB8Zw" target="_AZjcyy-8eMK2Hb1k0ZKvOg"/>
      <relationships xmi:id="_AZjcy9NTdym6wrP_HzNXYQ" source="_AZjRtBuLeeO3HZBGLPB8Zw" target="_AZjcy36vexyOjfndXtyAFQ"/>
    </items>
    <items xsi:type="c4:Container" xmi:id="_AZjRqmyscvSjoYWIUTv6tw" name="Database" kind="Database"/>
    <relationships xmi:id="_AZjRrMmEebWvCQv7_9o9bQ" name="Sends API requests" source="_AZjRqP--c_OzPRu6wanjOA" target="_AZjRqj-edvapvfp9t248gw"/>
    <relationships xmi:id="_AZjRrQAseNeTfs2zJRyBjQ" name="Stores data" source="_AZjRqj-edvapvfp9t248gw" target="_AZjRqmyscvSjoYWIUTv6tw"/>
    <relationships xmi:id="_AZjYG1KrejOnXlhrc9zvPA" name="Authenticates" source="_AZjRqj-edvapvfp9t248gw" target="_AZjRjAzgfMWHCIvDwcel3Q"/>
    <relationships xmi:id="_AZjYG7m1elmgA3o1jeaLdw" name="Provides models" source="_AZjRjgawfyO1jF2Zn8_8Pg" target="_AZjRqj-edvapvfp9t248gw"/>
    <relationships xmi:id="_AZjYHdKse36S4CXCfX698w" name="Consumes models" source="_AZjRjjQGdLmF_tbyq_E-2A" target="_AZjRqj-edvapvfp9t248gw"/>
  </items>
  <items xsi:type="c4:Person" xmi:id="_AZjRic2ifIOWcAlazxcL4Q" name="Metamodel Developer"/>
  <items xsi:type="c4:Person" xmi:id="_AZjRiPAbesWYNwB563tEHw" name="Model Developer"/>
  <items xsi:type="c4:Person" xmi:id="_AZjRisvBeSatNvaU6LwrBg" name="Business User"/>
  <items xsi:type="c4:SoftwareSystem" xmi:id="_AZjRjAzgfMWHCIvDwcel3Q" name="Identity and Access Management System" existing="true"/>
  <items xsi:type="c4:SoftwareSystem" xmi:id="_AZjRjgawfyO1jF2Zn8_8Pg" name="Model Provider" existing="true"/>
  <items xsi:type="c4:SoftwareSystem" xmi:id="_AZjRjjQGdLmF_tbyq_E-2A" name="Model Consumer" existing="true"/>
  <relationships xmi:id="_AZjRjv6CeOutSGRuYkKmdQ" name="Authenticates users" source="_AZjRiLJQcm-RuH5qdHXxnw" target="_AZjRjAzgfMWHCIvDwcel3Q"/>
  <relationships xmi:id="_AZjRj06Yc6aa7RkCPrrbdw" name="Develops models" source="_AZjRiPAbesWYNwB563tEHw" target="_AZjRiLJQcm-RuH5qdHXxnw"/>
  <relationships xmi:id="_AZjRj54uet-4RSaNT9lYGw" name="Develops modeling rules" source="_AZjRic2ifIOWcAlazxcL4Q" target="_AZjRiLJQcm-RuH5qdHXxnw"/>
  <relationships xmi:id="_AZjRj6_zdcqbGlEJ81JuSw" name="Uses models" source="_AZjRisvBeSatNvaU6LwrBg" target="_AZjRiLJQcm-RuH5qdHXxnw"/>
  <relationships xmi:id="_AZjRke1zeiqefU1FrLebcg" name="Provides models" source="_AZjRjgawfyO1jF2Zn8_8Pg" target="_AZjRiLJQcm-RuH5qdHXxnw"/>
  <relationships xmi:id="_AZjYHhqkd82QoGZMqv2IsA" name="Consumes models" source="_AZjRjjQGdLmF_tbyq_E-2A" target="_AZjRiLJQcm-RuH5qdHXxnw"/>
</c4:SystemLandscape>

Преобразовал JSON в Turtle с помощью Gemini (не факт что правильно, но в целом похоже):

C4 модель в Turtle формате
@prefix c4: <https://architeezy.com/metamodel/c4/dev/c4#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix : <https://architeezy.com/dev/architeezy/dev/architecture#> .

#################################################################
# Root: System Landscape
#################################################################

:0198d188-8e42-7484-ac18-fec9bb876d48 a c4:SystemLandscape ;
    c4:name "Architecture" ;
    # Маппинг массива "items"
    c4:items 
        :0198d188-b250-726f-91b8-7e6a7475f19f , # Architeezy
        :0198d189-cda2-7c83-9670-095acf170be1 , # Metamodel Dev
        :0198d188-f01b-7ac5-9837-0079eb7b441f , # Model Dev
        :0198d18a-cbc1-7926-ad36-f694e8bc2b06 , # Business User
        :0198d18c-0ce0-7cc5-8708-8bc3c1c7a5dd , # IAM System
        :0198d18e-06b0-7f23-b58c-5d999fcffc3e , # Model Provider
        :0198d18e-3406-74b9-85fe-d6f2abf13ed8 ; # Model Consumer
    # Маппинг массива "relationships" (связи, определенные на этом уровне)
    c4:relationships
        :0198d18e-fe82-78eb-ad48-646e6242a675 ,
        :0198d18f-4e98-73a6-9aed-19023ebadb77 ,
        :0198d18f-9e2e-7adf-b845-268d4fd9581b ,
        :0198d18f-aff3-75ca-9b1a-5109f3526e4b ,
        :0198d191-ed73-7a2a-9e7d-4d45acb79b72 ,
        :0198d81e-1aa4-77cd-90a0-664caafd88b0 .

#################################################################
# Level 1: Software Systems & People
#################################################################

:0198d188-b250-726f-91b8-7e6a7475f19f a c4:SoftwareSystem ;
    c4:name "Architeezy" ;
    c4:description "A modeling tool" ;
    c4:items 
        :0198d1a8-ffbe-73f3-b33d-1bbac1a9e338 , # Web UI
        :0198d1aa-3f9e-76f6-a9bd-fa7db76e3c83 , # API Server
        :0198d1aa-6cac-72f4-a3a1-8588513bfab7 ; # Database
    c4:relationships
        :0198d1ac-c984-79b5-af09-0bfbffda3d6d ,
        :0198d1ad-002c-78d7-937e-cdb3251c818d ,
        :0198d81b-52ab-7a33-a75e-586b73dcef3c ,
        :0198d81b-b9b5-7a59-a003-7a358de68b77 ,
        :0198d81d-d2ac-7b7e-92e0-25c27d7ebdf3 .

# External Systems
:0198d18c-0ce0-7cc5-8708-8bc3c1c7a5dd a c4:SoftwareSystem ;
    c4:name "Identity and Access Management System" ;
    c4:existing true .

:0198d18e-06b0-7f23-b58c-5d999fcffc3e a c4:SoftwareSystem ;
    c4:name "Model Provider" ;
    c4:existing true .

:0198d18e-3406-74b9-85fe-d6f2abf13ed8 a c4:SoftwareSystem ;
    c4:name "Model Consumer" ;
    c4:existing true .

# People
:0198d189-cda2-7c83-9670-095acf170be1 a c4:Person ; c4:name "Metamodel Developer" .
:0198d188-f01b-7ac5-9837-0079eb7b441f a c4:Person ; c4:name "Model Developer" .
:0198d18a-cbc1-7926-ad36-f694e8bc2b06 a c4:Person ; c4:name "Business User" .

#################################################################
# Level 2: Containers
#################################################################

# Web UI
:0198d1a8-ffbe-73f3-b33d-1bbac1a9e338 a c4:Container ;
    c4:name "Web UI" ;
    c4:items 
        :0198dcb2-f6ef-7eec-96a0-e6acc91c2372 ,
        :0198dcb5-29b0-75ab-af98-052032832df8 ,
        :0198dcb5-ce06-7c54-9493-1568e50a2533 .

# API Server
:0198d1aa-3f9e-76f6-a9bd-fa7db76e3c83 a c4:Container ;
    c4:name "API Server" ;
    c4:description "Provides API for Web UI" ;
    c4:items
        :0198d1b2-9b4a-7066-94c0-7ef908f4a355 ,
        :0198d1b2-cb17-76fc-bbb3-0d2691c8f6d3 ,
        :0198d1b3-7929-7308-9ca4-e4286357c7fc ,
        :0198dcbf-ec05-7c20-85b7-1aa598e8c58a ;
    c4:relationships
        :0198dcac-676a-7b48-a672-1ecd1e66bca9 ,
        :0198dcac-7c01-738f-8762-aef37fa4cac2 ,
        :0198dcae-a32d-7637-bc55-6bf204734106 ,
        :0198dcae-b38f-7545-b1c9-d64cd3d6e0a9 ,
        :0198dcae-d00d-7b57-a2fa-fb7bc4a9742b ,
        :0198dcae-e5a1-7265-882e-8bf151505368 ,
        :0198dccb-bb01-7c2e-9160-390220d57ba0 ,
        :0198dccb-c6ad-788e-a65b-8e16680b0f01 ,
        :0198dccb-d353-7729-bac2-b3ff1f335761 .

# Database
:0198d1aa-6cac-72f4-a3a1-8588513bfab7 a c4:Container ;
    c4:name "Database" ;
    c4:kind "Database" .

#################################################################
# Level 3: Components & Groups
#################################################################

# Components of Web UI
:0198dcb2-f6ef-7eec-96a0-e6acc91c2372 a c4:Component ; c4:name "Starting Page" .
:0198dcb5-29b0-75ab-af98-052032832df8 a c4:Component ; c4:name "User Settings" .

# Group: Modeling Workbench
:0198dcb5-ce06-7c54-9493-1568e50a2533 a c4:ComponentGroup ;
    c4:name "Modeling Workbench" ;
    c4:items
        :0198dcb3-9f0c-723b-9f74-f998925b7214 ,
        :0198dcb6-ae07-7cb9-860b-bbafac42e8f0 ,
        :0198dcb7-00d9-7422-b924-be8f757c3a71 ,
        :0198dcb7-2a9d-7eb2-89a2-f827c6d9c8e6 ,
        :0198dcb7-6c0a-7a14-a09a-4883bb5c5f8b ,
        :0198e163-ebe1-70bc-bc18-a2f8cca05c63 ,
        :0198e164-9a72-7c9c-b987-fe6417e45345 ,
        :0198e164-dc93-78c6-b587-2d2e8ebac508 .

    # Items inside Workbench
    :0198dcb3-9f0c-723b-9f74-f998925b7214 a c4:Component ; c4:name "Model Explorer" .
    :0198dcb6-ae07-7cb9-860b-bbafac42e8f0 a c4:Component ; c4:name "Diagram Editor" .
    :0198dcb7-00d9-7422-b924-be8f757c3a71 a c4:Component ; c4:name "Table Editor" .
    :0198dcb7-2a9d-7eb2-89a2-f827c6d9c8e6 a c4:Component ; c4:name "Textual Editor" .
    :0198dcb7-6c0a-7a14-a09a-4883bb5c5f8b a c4:Component ; c4:name "Properties Form" .
    :0198e163-ebe1-70bc-bc18-a2f8cca05c63 a c4:Component ; c4:name "Access Management" .
    :0198e164-9a72-7c9c-b987-fe6417e45345 a c4:Component ; c4:name "Image Editor" .
    :0198e164-dc93-78c6-b587-2d2e8ebac508 a c4:Component ; c4:name "Project Settings" .

# Components of API Server
:0198d1b2-9b4a-7066-94c0-7ef908f4a355 a c4:Component ; c4:name "REST API" .
:0198d1b2-cb17-76fc-bbb3-0d2691c8f6d3 a c4:Component ; c4:name "Data Access Layer" .
:0198d1b3-7929-7308-9ca4-e4286357c7fc a c4:Component ; c4:name "GraphQL API" .

# Group: Model Editor
:0198dcbf-ec05-7c20-85b7-1aa598e8c58a a c4:ComponentGroup ;
    c4:name "Model Editor" ;
    c4:items
        :0198d1b4-1b8b-79e3-b71d-90462cf07c67 ,
        :0198dcca-bc33-793a-a100-0cd3693f4400 ,
        :0198dccb-2fbc-78c2-b61d-bd64d192af3a ,
        :0198dccb-7eaf-7b1c-8e8d-f9dd5edc8015 .

    # Items inside Model Editor
    :0198d1b4-1b8b-79e3-b71d-90462cf07c67 a c4:Component ; c4:name "Editing Context" .
    :0198dcca-bc33-793a-a100-0cd3693f4400 a c4:Component ; c4:name "Diagram Event Processor" .
    :0198dccb-2fbc-78c2-b61d-bd64d192af3a a c4:Component ; c4:name "Table Event Processor" .
    :0198dccb-7eaf-7b1c-8e8d-f9dd5edc8015 a c4:Component ; c4:name "Text Event Processor" .

#################################################################
# Relationships
#################################################################
# Примечание: В JSON связи определены как объекты с ID, source и target.

# Relationships defined in System Landscape
:0198d18e-fe82-78eb-ad48-646e6242a675 a c4:Relationship ;
    c4:name "Authenticates users" ;
    c4:source :0198d188-b250-726f-91b8-7e6a7475f19f ;
    c4:target :0198d18c-0ce0-7cc5-8708-8bc3c1c7a5dd .

:0198d18f-4e98-73a6-9aed-19023ebadb77 a c4:Relationship ;
    c4:name "Develops models" ;
    c4:source :0198d188-f01b-7ac5-9837-0079eb7b441f ;
    c4:target :0198d188-b250-726f-91b8-7e6a7475f19f .

:0198d18f-9e2e-7adf-b845-268d4fd9581b a c4:Relationship ;
    c4:name "Develops modeling rules" ;
    c4:source :0198d189-cda2-7c83-9670-095acf170be1 ;
    c4:target :0198d188-b250-726f-91b8-7e6a7475f19f .

:0198d18f-aff3-75ca-9b1a-5109f3526e4b a c4:Relationship ;
    c4:name "Uses models" ;
    c4:source :0198d18a-cbc1-7926-ad36-f694e8bc2b06 ;
    c4:target :0198d188-b250-726f-91b8-7e6a7475f19f .

:0198d191-ed73-7a2a-9e7d-4d45acb79b72 a c4:Relationship ;
    c4:name "Provides models" ;
    c4:source :0198d18e-06b0-7f23-b58c-5d999fcffc3e ;
    c4:target :0198d188-b250-726f-91b8-7e6a7475f19f .

:0198d81e-1aa4-77cd-90a0-664caafd88b0 a c4:Relationship ;
    c4:name "Consumes models" ;
    c4:source :0198d18e-3406-74b9-85fe-d6f2abf13ed8 ;
    c4:target :0198d188-b250-726f-91b8-7e6a7475f19f .

# Relationships defined in "Architeezy" Software System
:0198d1ac-c984-79b5-af09-0bfbffda3d6d a c4:Relationship ;
    c4:name "Sends API requests" ;
    c4:source :0198d1a8-ffbe-73f3-b33d-1bbac1a9e338 ;
    c4:target :0198d1aa-3f9e-76f6-a9bd-fa7db76e3c83 .

:0198d1ad-002c-78d7-937e-cdb3251c818d a c4:Relationship ;
    c4:name "Stores data" ;
    c4:source :0198d1aa-3f9e-76f6-a9bd-fa7db76e3c83 ;
    c4:target :0198d1aa-6cac-72f4-a3a1-8588513bfab7 .

:0198d81b-52ab-7a33-a75e-586b73dcef3c a c4:Relationship ;
    c4:name "Authenticates" ;
    c4:source :0198d1aa-3f9e-76f6-a9bd-fa7db76e3c83 ;
    c4:target :0198d18c-0ce0-7cc5-8708-8bc3c1c7a5dd .

:0198d81b-b9b5-7a59-a003-7a358de68b77 a c4:Relationship ;
    c4:name "Provides models" ;
    c4:source :0198d18e-06b0-7f23-b58c-5d999fcffc3e ;
    c4:target :0198d1aa-3f9e-76f6-a9bd-fa7db76e3c83 .

:0198d81d-d2ac-7b7e-92e0-25c27d7ebdf3 a c4:Relationship ;
    c4:name "Consumes models" ;
    c4:source :0198d18e-3406-74b9-85fe-d6f2abf13ed8 ;
    c4:target :0198d1aa-3f9e-76f6-a9bd-fa7db76e3c83 .

# Relationships defined in "API Server" Container
:0198dcac-676a-7b48-a672-1ecd1e66bca9 a c4:Relationship ;
    c4:source :0198d1a8-ffbe-73f3-b33d-1bbac1a9e338 ;
    c4:target :0198d1b2-9b4a-7066-94c0-7ef908f4a355 .

:0198dcac-7c01-738f-8762-aef37fa4cac2 a c4:Relationship ;
    c4:source :0198d1a8-ffbe-73f3-b33d-1bbac1a9e338 ;
    c4:target :0198d1b3-7929-7308-9ca4-e4286357c7fc .

:0198dcae-a32d-7637-bc55-6bf204734106 a c4:Relationship ;
    c4:source :0198d1b2-9b4a-7066-94c0-7ef908f4a355 ;
    c4:target :0198d1b2-cb17-76fc-bbb3-0d2691c8f6d3 .

:0198dcae-b38f-7545-b1c9-d64cd3d6e0a9 a c4:Relationship ;
    c4:source :0198d1b3-7929-7308-9ca4-e4286357c7fc ;
    c4:target :0198d1b4-1b8b-79e3-b71d-90462cf07c67 .

:0198dcae-d00d-7b57-a2fa-fb7bc4a9742b a c4:Relationship ;
    c4:source :0198d1b4-1b8b-79e3-b71d-90462cf07c67 ;
    c4:target :0198d1b2-cb17-76fc-bbb3-0d2691c8f6d3 .

:0198dcae-e5a1-7265-882e-8bf151505368 a c4:Relationship ;
    c4:source :0198d1b2-cb17-76fc-bbb3-0d2691c8f6d3 ;
    c4:target :0198d1aa-6cac-72f4-a3a1-8588513bfab7 .

:0198dccb-bb01-7c2e-9160-390220d57ba0 a c4:Relationship ;
    c4:source :0198d1b4-1b8b-79e3-b71d-90462cf07c67 ;
    c4:target :0198dcca-bc33-793a-a100-0cd3693f4400 .

:0198dccb-c6ad-788e-a65b-8e16680b0f01 a c4:Relationship ;
    c4:source :0198d1b4-1b8b-79e3-b71d-90462cf07c67 ;
    c4:target :0198dccb-2fbc-78c2-b61d-bd64d192af3a .

:0198dccb-d353-7729-bac2-b3ff1f335761 a c4:Relationship ;
    c4:source :0198d1b4-1b8b-79e3-b71d-90462cf07c67 ;
    c4:target :0198dccb-7eaf-7b1c-8e8d-f9dd5edc8015 .

У нас каждая модель как‑раз и отражает семантику. Нужно просто добавить ещё RDF, OWL, Turtle, ... форматы дополнительно к JSON и XMI. Внутри это всё равно семантический граф, не так принципиально в каком формате он выгружается или загружается.

Не видел, спасибо. Похоже на Structurizr с приятным интерфейсом, API, ИИ. У нас тоже есть C4 модели, но пока без текстового редактора (он планируется) и диаграммы не такие красивые. Ещё IcePanel заморочились с дизайном диаграмм. Я думаю, нам нужно тоже что-то посимпатичнее нарисовать

Drawio как и visio поддерживает "Данные объекта". Кроме того, visio штатно интегрируется с excel, т.е. получаем связанный репозитарий

В draw.io можно выгрузить диаграмму в XML, но это в чистом виде картинка, здесь все атрибуты графические:

<?xml version="1.0" encoding="UTF-8"?>
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 YaBrowser/25.10.0.0 Safari/537.36" version="29.2.9">
  <diagram name="Страница-1" id="tC3aLH-C8GooZcKl54ri">
    <mxGraphModel dx="998" dy="616" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />
        <mxCell id="Glv_qTqAQhiy5d9yEPJv-3" edge="1" parent="1" source="Glv_qTqAQhiy5d9yEPJv-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" target="Glv_qTqAQhiy5d9yEPJv-2">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="Glv_qTqAQhiy5d9yEPJv-1" parent="1" style="outlineConnect=0;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;shape=mxgraph.aws3.elasticsearch_service;fillColor=#F58534;gradientColor=none;" value="" vertex="1">
          <mxGeometry height="81" width="67.5" x="180" y="180" as="geometry" />
        </mxCell>
        <mxCell id="Glv_qTqAQhiy5d9yEPJv-2" parent="1" style="outlineConnect=0;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;shape=mxgraph.aws3.machine_learning;fillColor=#2E73B8;gradientColor=none;" value="" vertex="1">
          <mxGeometry height="93" width="76.5" x="390" y="210" as="geometry" />
        </mxCell>
      </root>
    </mxGraphModel>
  </diagram>
</mxfile>

Нельзя переиспользовать объекты: я не могу добавить объект в репозиторий один раз и потом использовать его на разных диаграммах. Например, добавить подсеть один раз, указать для неё CIDR и потом на всех диаграммах на неё ссылаться. Чтобы при изменении CIDR он обновился везде. Чтобы на форме свойств для этой подсети я видел список диаграмм где она используется, видел все её связи на всех диаграммах. В draw.io этого нет, это просто набор не связанных картинок.

Смотрю на форму свойств в draw.io, здесь тоже все атрибуты визуальные, нет ни одного семантического:

Причём даже к диаграмме есть вопросы, например, я не могу подвинуть надпись «Тест», чтобы она не накладывалась на стрелочку.

Как оно должно в моём понимании выглядеть:

Слева древовидный навигатор по модели, все объекты упорядочены по папкам, я могу переиспользовать их на разных диаграммах.

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

Как рисовалка картинок draw.io наверное норм, хотя и то есть вопросы. Но что потом делать с этими картинками? По ним потом не сгенерить документ, конфиг, их сложно анализировать. Или я просто не смог найти «Данные объекта» в draw.io.

Варианты подключения подобного репозитария к Drawio не попадались?

Нет, на мой взгляд draw.io сложно превратить из рисовалки в моделер. Мы как‑раз и пытаемся сделать инструмент, который по функциональности как Enterprise Architect, а по простоте как draw.io.

Свою нужно придумать МетаМодель / нотацию (можно на основе ArchiMate Next Specification) и онтологию: логичную, непротиворечивую и строго формализованную

Это достаточно трудоёмкая задача. Я это и попробовал сделать в статье. Казалось бы что метамодель получилась тривиальная, и если так, то это отлично. Если она выглядит простой, значит наверное правильная. Но мне пришлось основательно подумать над некоторыми вещами. А чтобы хорошо продумать отношения между объектами мне уже времени не хватило. Хотя я заряжен разными темами типа мереологии или BORO :) Но в этом можно на долго застрять. В принципе, эта метамодель должна легко перекладываться в онтологию.

Отечественные "ежи-ужи" моделирования ИТ-инфраструктуры "живут" в форме 072.

Спасибо за наводку! Отечественные стандарты нужно тоже учесть... Я подсматривал в разные источники, например, как в Netbox описывается ИТ‑инфраструктура, но конечно это очень поверхностно.

На мой взгляд это клёвая идея. Я что‑то подобное делал для Enterprise Integration Patterns. Ещё генерил EPC‑модели, затем преобразовывал их в машины состояний UML.

Языковые модели — отличная штука например для валидации моделей. Могут быть правила типа «названия функций должны содержать глагол в неопределенной форме (создать задачу), а не отглагольные существительные (создание задачи)». Реализовывать это в коде запаришься, а для языковых моделей — это тривиальная задача найти и исправить такие ошибки.

Таких сложно формализуемых правил может быть множество, например «названия объектов в модели должны быть коротким и ёмкими, не больше 7 слов» или «названия объектов в процессе не должны содержать лишние технические детали».

Ещё можно использовать ИИ для автолейаута моделей по нетривиальным правилам «размести фигуры по ходу исполнения процесса сверху вниз, исполнители функций должны быть справа, а ресурсы слева». В статьях по ссылкам выше я как‑раз вполне успешно использовал такие промпты. Хотя с этим языковые модели справляются уже немного хуже.

Возможно кому-нибудь пригодится, я прикручивал Langium к Monaco Editor (это редактор из VS Code только в браузере). В теории всё должно быть просто, но мне очень не хватало минималистичных примеров, поэтому запилил свои (исходники).

Мы используем его для редактирования моделей: раз, два. Поэтому нам был нужен не только редактор, но и принтер из AST обратно в код

Зависит от софта, который вы используете. Мне, например, нужен только браузер, IDE (VS Code, Eclipse, ...), DBeaver, Docker, офис, месенджеры, удобная командная строка с ssh‑клиентом, curl, jq и т.д., иногда какой‑нибудь специфический софт типа Wireshark. И ещё для меня важно отсутствие рекламы, телеметрии, непонятных сервисов сжирающих 100% CPU, вирусов и антивирусов. Важен приятный и настраиваемый интерфейс, раньше Gnome, но сейчас больше нравится KDE — для меня он реально на порядок эстетически приятнее чем интерфейс Windows. Простые конфиги, например, чтобы добавить cron‑задачу, которая по rsync делает бэкапы. И я готов заплатить за все эти удобства или помучиться с активацией, но даже это не требуется

Для меня переход на Windows — это страшный сон. Я не топлю за Linux против Windows. Просто хочу показать, что есть другой взгляд. Люди могут использовать Linux не потому что они повернуты на идее open source, хотят выделиться пусть даже ценой страданий, а потому что им это тупо удобнее. Как и macOS для кого‑то удобнее или Windows

...и всю оставшуюся жизнь знать, как это сделать ещё раз...

Я напишу очень стрёмную вещь, но у меня подобных знаний в избытке. Например, недавно была проблема со сборкой фронтенда в докере. Локально всё отлично собирается, а когда приложение деплоится на сервер через докер, то сборка в 10 раз дольше и памяти съедается в 3 раза больше. Я полдня потратил на то, чтобы в этом разобраться. Очевидные причины, что сервер слабее локальной машины, что докер не видит, что на сервере не так много RAM, съедает всю память, процессы уходят в swap, ещё ИИ мне подкинул идею, что в alpine образах используется системная библиотека, которая не очень эффективно работает с памятью и переход на debian образ улучшит ситуацию.

Короче проблема оказалась в том, что сборка запускалась через bun, который локально видел у меня установленный node.js и реально запускал сборку через него, а в докер-образе node.js нет и сборка запускается через сам bun, который сжирает кучу памяти и тормозит. И как только мы устанавливаем в докере node.js всё начинает прекрасно работать.

Зачем мне эти #@#!!###$$% знания на всю оставшуюся жизнь? Зачем я потратил полдня своей жизни на их приобретение? Я могу рассказать таких историй ещё сотни не только про прекрасную сборку фронтенда, но и про какие-нибудь безумные исключения или багофичи в Hibernate и т.д. Мне не нужны все эти мусорные знания!

... а потом вероятные партнёры ИИ отключают — и вот Вы уже ни на что не способны и никому не нужны.

Разбираться почему фронтенд стал собираться в 10 раз дольше или прикручивать Keycloak к JupyterHub - это не моя основная работа. Это препятствие, которое сжирает моё время и мешает заниматься основными задачами. Мне нафиг не нужны эти навыки

Вы упускаете ещё такой момент: человек — он, сцуко, биологически так устроен (впрочем, как и чуть менее, чем все организьмы на этом шарике), что у него чем не пользуешься — то вскоре атрофируется. Поэтому нет, спасибо, я не буду пользоваться костылём дла мозга.

Когда синьор скидывает на джуна часть задач, он тупее от этого не становится. Скорее наоборот, у него появляется время для других более сложных задач.

Естественно пока я генерил код в примере с Keycloak и JupyterHub я разобрался в этом и я в состоянии это сделать без ИИ, тем более что я переписал этот код по-человечески почти полностью.

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

Но у меня хватает задач, на которых можно развивать все эти навыки. Я просто не хочу тратить своё время на бессмысленные задачи. Хотя в целом я согласен, если бы современный ИИ появился 10 лет назад, то почти наверняка я был бы гораздо тупее сейчас :)

Я согласен с этим. Но я думаю, что есть две крайности: 1) вообще ни для чего не использовать ИИ 2) использовать ИИ для всего, например, поручить ИИ агенту продать квартиру и на все деньги торговать акциями. Это конечно очень скучная и банальная позиция, но используемые инструменты должны быть соразмерны рискам. Для таких критичных задач не то что на ИИ, но и на людей нельзя полагаться независимо от их квалификации, для этого и есть ревью кода, тестировщики.

Например, мне недавно нужно было прикрутить JupyterHub к одному проекту, чтобы при этом было SSO через Keycloak, чтобы API запросы из JupyerHub отправлялись не через внешнюю сеть, а в докере и чтобы в запросах token JupyterHub преобразовывался в JWT-токен. Я мог бы неделю читать документацию и потом сделать это вручную. А с ИИ потратил два дня и результатом я максимально доволен. Естественно весь сгенеренный код я не сразу деплоил в прод, а понадобились десятки итераций и ручные правки прежде чем он стал нормальным. Мне это сэкономило время. А если люди деплоят сгенеренный код не глядя в прод, то там проблема явно не только с ИИ

При этом ИИ почему-то очень токсичная тема, это 100% гарантия получить минус на хабре :) Если бы в дополнение к минусу я получил комментарий хотя бы из нескольких слов, то мне было бы проще понять в чём я не прав. Хотя минусы - это ещё более токсичная тема! Теперь я ещё и за этот комментарий получу минус. Всё тлен...

ИИ в режиме агента, а не просто чата на мой взгляд отличная штука. Недавно спорили в комментариях на сколько (бес)полезен ИИ для поиска проблем с производительностью. В итоге я написал примитивный bash‑скрипт, который запускает команды top, uptime, df, iostat и другие. Скормил результат ИИ и он выдал вполне осмысленное описание состояния сервера.

Конечно можно и самому зайти на сервер по SSH, выполнить команду top и другие, самому интерпретировать результат. ИИ для этого не обязателен, но если он сам в режиме агента это делает, то это просто быстрее и удобнее. Если можно сэкономить 5 минут своего времени, то почему бы и нет

Я понял, что Gemini не прошла собеседование :) И я видимо тоже не пройду если буду рисовать такие модели :)

На мой взгляд, для всех этих уточняющих вопросов есть человек, который задумается о требованиях, стратегии и остальном. При этом ему совершенно не обязательно тратить своё время на рутину.

Не знаю как другие люди, но я часто отмечаю, что обычно работаю в двух режимах: 1) когда делаю что‑то сам (пишу код, статьи, что‑то моделирую) и 2) когда оцениваю то, что сделано другими (провожу ревью кода, оцениваю модели). И лично для меня это две совершенно не пересекающиеся вещи. Очень сложно потратить день или неделю на реализацию какой‑нибудь фичи или на построение модели, а потом сразу переключиться в режим ревьювера, посмотреть на критически на результат и решить, что нужно всё переделать.

Я думаю, что ИИ как‑раз и упрощает переключение между этими двумя режимами. Можно полминуты потратить на генерацию модели, чтобы затем критически посмотреть на неё и написать какие важные требования не учтены

Кажется теперь я понял почему в LINQ‑запросах from пишется в начале, а не в середине! Согласен, это действительно выглядит удобнее. Может в SQL изначально сделали другой порядок, чтобы было ближе к фразам на английском языке

1
23 ...

Information

Rating
1,705-th
Works in
Registered
Activity