Статьи

Системная контекстная диаграмма как код

Как я сказал в разделе «Разрешение конфликта между архитектурой программного обеспечения и кодом» , в этом году я сфокусировался на модели архитектуры программного обеспечения в виде кода. В разделе « Простые наброски для построения диаграмм архитектуры вашего программного обеспечения» я показал примерную диаграмму «Контекст системы» для своего веб- сайта techtribes.je .

techtribes.je Системная контекстная диаграмма

Это простая диаграмма, которая показывает techtribes.je в середине, в окружении ключевых типов пользователей и системных зависимостей. Это ваш типичный вид «большой картинки». Эта диаграмма была создана с использованием OmniGraffle (например, Microsoft Visio для Mac OS X), и это именно так — статическая диаграмма, которую необходимо обновлять вручную. Напротив, не было бы замечательно, если бы эта диаграмма основывалась на модели, которую мы могли бы лучше контролировать версия, сотрудничать и визуализировать? Если вы не уверены, что я имею в виду под «моделью», взгляните на Модели, эскизы и все, что между ними .

Это в основном то, что является целью Structurizr . Это способ описать модель архитектуры программного обеспечения как код, а затем визуализировать его простым способом. Java-библиотека Structurizr доступна на GitHub, и вы можете загрузить готовый двоичный файл . В качестве предупреждения, это очень большая работа, и не удивляйтесь, если что-то изменится! Вот некоторый Java-код для воссоздания диаграммы системного контекста techtribes.je.

package com.structurizr.example.client;

import com.structurizr.Workspace;
import com.structurizr.api.StructurizrClient;
import com.structurizr.model.Location;
import com.structurizr.model.Model;
import com.structurizr.model.Person;
import com.structurizr.model.SoftwareSystem;
import com.structurizr.view.SystemContextView;
import com.structurizr.view.ViewSet;

public class TechTribes {

    public static void main(String[] args) throws Exception {
        // create a model and the software system we want to describe
        Workspace workspace = new Workspace("techtribes.je", "This is a model of the system context for the techtribes.je system, the code for which can be found at https://github.com/techtribesje/techtribesje");
        Model model = workspace.getModel();

        SoftwareSystem techTribes = model.addSoftwareSystem(Location.Internal, "techtribes.je", "techtribes.je is the only way to keep up to date with the IT, tech and digital sector in Jersey and Guernsey, Channel Islands");

        // create the various types of people (roles) that use the software system
        Person anonymousUser = model.addPerson(Location.External, "Anonymous User", "Anybody on the web.");
        anonymousUser.uses(techTribes, "View people, tribes (businesses, communities and interest groups), content, events, jobs, etc from the local tech, digital and IT sector.");

        Person authenticatedUser = model.addPerson(Location.External, "Aggregated User", "A user or business with content that is aggregated into the website.");
        authenticatedUser.uses(techTribes, "Manage user profile and tribe membership.");

        Person adminUser = model.addPerson(Location.External, "Administration User", "A system administration user.");
        adminUser.uses(techTribes, "Add people, add tribes and manage tribe membership.");

        // create the various software systems that techtribes.je has a dependency on
        SoftwareSystem twitter = model.addSoftwareSystem(Location.External, "Twitter", "twitter.com");
        techTribes.uses(twitter, "Gets profile information and tweets from.");

        SoftwareSystem gitHub = model.addSoftwareSystem(Location.External, "GitHub", "github.com");
        techTribes.uses(gitHub, "Gets information about public code repositories from.");

        SoftwareSystem blogs = model.addSoftwareSystem(Location.External, "Blogs", "RSS and Atom feeds");
        techTribes.uses(blogs, "Gets content using RSS and Atom feeds from.");

        // now create the system context view based upon the model
        ViewSet viewSet = workspace.getViews();
        SystemContextView contextView = viewSet.createContextView(techTribes);
        contextView.addAllSoftwareSystems();
        contextView.addAllPeople();

        // and upload the model to structurizr.com
        StructurizrClient structurizrClient = new StructurizrClient("https://api.structurizr.com", "key", "secret");
        workspace.setId(1234); // this would be your workspace ID
        structurizrClient.putWorkspace(workspace);
    }

}

Выполнение этого кода создает этот JSON , который вы можете затем скопировать и вставить на страницу try it Structurizr. Результат (если вы перемещаете коробки) выглядит примерно так.

techtribes.je Системная контекстная диаграмма

Don’t worry, there will eventually be an API for uploading software architecture models and the diagrams will get some styling, but it proves the concept. What we have then is an API that implements the various levels in my C4 software architecture model, with a simple browser-based rendering tool. Hopefully that’s a nice simple introduction of how to represent a software architecture model as code, and gives you a flavour for the sort of direction I’m taking it. Having the software architecture as code provides some interesting opportunities that you don’t get with static diagrams from Visio, etc and the ability to keep the models up to date automatically by scanning the codebase is what I find particularly exciting. If you have any thoughts on this, please do drop me a note.