Remove the indents in a sequence diagram in PlantUML

I like PlantUML for its super-simple syntax that allows me to create visualizations for complex operations or flows. Sometimes, a sequence diagram is needed to remove space between messages. And PlantUML supports it!

Just define !pragma teoz true, and the new Teoz engine processes a diagram. Add & to the start of a row to ignore the indent between messages.

@startuml
!pragma teoz true
actor Customer as C
participant "HTTP API" as API
database "Database" as DB

C -> API: Message
& API -> DB: Same message
@enduml

More about Teoz engine here: https://plantuml.com/teoz. It supports many more amazing functions to empower a sequence diagram.

Additionally, here is one more excellent website with PluntUML hacks: https://crashedmind.github.io/PlantUMLHitchhikersGuide/index.htmlAdditionally

Encourage developers to write documentation

Most developers don't like to write documentation. They find it boring. Especially if there is no documenting culture in a company. In the meantime, the same developers usually complain that there is no proper description of a company's services and architecture.

Raising the culture of documentation is a complex subject that requires a lot of effort and encompasses many aspects. However, I'd like to share an approach that can encourage developers to start documenting their development process.

Developers enjoy writing code, and one way to get them to start documenting is by showing them how they can use diagrams to explain how their code works. One tool that can help with this is PlantUML. PlantUML allows you to write code that will be displayed as a diagram.

Another similar tool is Mermaid. These are reliable formats that are typically supported by most version control and documentation systems such as Github, Gitlab, and Confluence. Below are some examples that are built by my teammates who hate writing documentation! I only renamed some titles.😃

However, it is most effective with new microservices or modules, as documenting legacy code, regardless of the method used, is neither enjoyable nor straightforward.

Mermaid

sequenceDiagram
    participant KF as Kafka
    
    box rgb(200, 100, 100) Internal domain
    participant ITM as SuperSerice1
    participant RDS as DataService
    end
    
    box rgb(100, 200, 100) Transaction domain 
    participant TRS as NDA_API
    end
    
    ITM->>KF: Consume XXX file event
    ITM->>RDS: Get XXX data by `no_id` and `hidden_id`
    RDS->>ITM: Return XXX data
    ITM->>TRS: Use `something_reference_id` or `something_link_id` from XXX data to get transaction data
    TRS->>ITM: Return something data
    ITM->>KF: Produce `DONE` event (for something_event table)
    ITM->>RDS: Mark the data as `PROCESSED`
    ITM->>KF: Produce the same event to different topic to update balance

Try to play with this example!

PluntUML

@startuml
() "Shared file storage" as FS
component Preprocessing as prep {
[preprocessor]
database DB as prepDB
[preprocessor] -- prepDB
}

[ETL] as ETL
package MainProcessing {
  [Data-service] as XXX
  component "MainProcessing services" as R {
    [...] as a1
    [...] as a2
    [...] as a3
  }
  database DB
}

package Something {
  [Data-service] as TRS
  database DB as TRDB
}


FS -- prep
prep -- ETL
XXX -- DB
R -- DB
ETL --> XXX: Load the data\nfrom files
ETL --> R: Kafka event\nthat a file\nis loaded
TRS -- TRDB
R -- TRS
@enduml

Try to play with this example!

Engineering manager interview questions

I think that elaborating on interview questions for the Engineering manager role is an interesting topic. Especially because I'm looking for a new job now, and I sometimes have an interview, and I note questions.

Let's go with the first set of questions I noted this morning!

Can you provide an example of where you've initiated and implemented an Engineering Process improvement that has helped your team(s)?

A team complained that they have a lot of meetings and they constantly don't have enough time to focus on their tasks. We checked the schedule of events for the team, and I noticed that all the meetings in the schedule are spread over a day. I implemented the rule "no meetings after lunch". I aligned with stakeholders, PM, PO that they should try to follow this rule. Finally, I got positive feedback that the team's performance increased.

Can you provide an example of how you've influenced a strategic decision that had a positive impact on those within and outside of your direct team?

The team I was on once implemented a new integration based on file processing. Unfortunately, we encountered an unexpected file structure in the production environment and couldn't revert back. This led to having to handle a half-million EUR flow daily. Initially, we had to manually fix the data in the files until we updated our software to accommodate the new file format. To alleviate the demotivation among the team, I proposed a solution of using weekly shifts with 2 team members, which proved to be very effective. This practice was later adopted across the department and now we have dynamic incident resolution teams in place.

Can you provide an example of a time when you've made or influenced an architectural decision that helped your team and the product(s) they support?

It is about the same integration I wrote above. Supporting a new file structure required a significant amount of effort and time. To address this, I proposed that the team create a preprocessor to automatically fix the files before they are processed by our system. While this wasn't a complete fix, it did reduce the time spent resolving incidents from 12 mandays per week to 5 mandays per week. Importantly, this architectural decision did not require system interruptions or regression testing time. This approach proved to be easy and efficient, and the preprocessing has since become an official part of the system, incorporating several short-term solutions.

When developing your people, what is the most important thing you do to support them?

In my opinion, trust and self-management are the most important things in a team. I coach people in my team who don't hesitate to act, follow internal processes, and are not afraid to make mistakes and learn from them. To implement this, I use one-on-one meetings, sometimes participate in retrospectives, and prepare presentations together with Agile coaches to teach teammates to resolve their impediments. I always clarify the processes to my teammates instead of being a middleman.

Behind the Mask of High Performance

I joined a mature team. This team had a teammate who looked like a highly motivated developer. Every task was done on time. He delivered a high-quality code. And... During a one-to-one, he mentioned that he feels demotivated and doesn't like the project.

It was a big surprise for me because he always said that everything was going well. To be honest, it was always very difficult to speak with him. Because he is a very close person and doesn't like any discussions. So... Possessing this knowledge, we discussed a lot about scrum event improvements in our team—how to reduce the number and duration of all the meetings we have.

We revisited his story together, and I noticed that he had been working on one really huge task for months despite it being split into multiple tasks. Moreover, after months of working on the story, he didn't understand the purpose and value of the whole team's backlog.

I touched on topics about the business value of the tasks and tasks sizing with the team. I noticed, that the team asked a lot of questions to the business in the past, and they were not answered. Every teammate works only on his item and doesn't care about others' tasks.

I encouraged the team to split the tasks into items that could be handled by other team members, fostering a shared responsibility. They were interested in spreading their knowledge and open to something new.

I discussed with the PO and PM to create a meeting with the team to explain the business purpose of the tasks that the team is working on. We created an improvement plan that includes short presentations to cover all aspects of their tasks from the business point of view.

As a result, I got positive feedback from developers and managers. Because during the sessions a lot of items were simplified and improvement.

Finally, I always ask business to explain the purpose of a project to a team before the team starts work on it.

RACI matrix for a team

Usually, a RACI matrix is a tool for project management. It helps to know who does what in a project. RACI stands for Responsible, Accountable, Consulted, Informed.


  • The R, is for the person or team that does the work. They do the task.
  • The A is for the boss. He is in charge. He makes sure the work is done right.
  • C is for people who are asked before a decision is made. Their opinion is important.
  • Finally, I is for people who need to know what happens after a decision is made.

Creating a RACI matrix for a team involves identifying the key roles within the team and the typical tasks or activities that occur during a sprint. Here’s a simplified example of how a RACI matrix might look for a scrum team by roles:

Tasks Product Owner Scrum Master Development Team
Sprint Planning A C R
Daily Stand-up I A R
Sprint Review A C R
Sprint Retrospective C A R
Backlog Refinement A C R
Writing User Stories R I C
Estimating Tasks C I R
Testing and Quality Assurance C I R
Deployment C I R

In a scrum team, the chart helps everyone know their job and what they need to do. It stops confusion and makes sure everyone knows what's going on.

There is a Scrum guide that describes all the responsibilities of a Scrum team. However, for a non-Scrum team, it is not always clear who is responsible for what. Therefore, we can create a RACI matrix for each person involved. For example, it is a different view, where we allow more people to be responsible for an action.

Task Responsible (R) Accountable (A) Consulted (C) Informed (I)
Product Backlog Management Elena (PO) John (SM), Team Team
- Prioritize user stories Elena (PO) Elena (PO) John (SM) Team
- Refine user stories Elena (PO), John (SM) Elena (PO) Team Team
Sprint Planning John (SM), Elena (PO) Team
- Identify sprint goals & backlog items John (SM), Elena (PO) John (SM) Team
- Estimate effort for backlog items Team John (SM) Elena (PO)
Development
- Develop backend logic (API) Peter, Kamil Peter John (SM), Elena (PO) Lisa, Karen
- Develop frontend UI Lisa Lisa John (SM), Elena (PO) Peter, Kamil, Karen
Testing
- Write automated tests Karen Karen John (SM), Peter, Kamil, Lisa
- Manual testing of functionalities Karen Karen John (SM), Elena (PO), Peter, Kamil, Lisa
Deployment John (SM) Team
- Deploy app to development environment John (SM) John (SM) Team
Daily Scrum John (SM) Team
- Facilitate daily stand-up meeting John (SM) John (SM) Team
Sprint Review John (SM), Elena (PO) Team
- Demo completed features Team (rotating) John (SM), Elena (PO) Team
- Gather feedback on delivered features John (SM), Elena (PO) John (SM), Elena (PO) Team
Sprint Retrospective John (SM) Team
- Identify areas for improvement Team John (SM) Elena (PO)

Identifying responsibilities is very useful for a non-Scrum team where the responsibilities of team members are not explicitly defined.

Moreover, a clear understanding of responsibilities in a team is essential during an organizational transformation. For example, when we resign from the scrum team, all responsibilities also change. This change is clearly visible within a matrix.

Task Responsible (R) Accountable (A) Consulted (C) Informed (I)
Product Backlog Management Elena (PO) Team Team
- Prioritize user stories Elena (PO) Elena (PO) Team Team
- Refine user stories Elena (PO), Team (rotating) Elena (PO) Team Team
Sprint Planning Elena (PO) Team
- Identify sprint goals & backlog items Elena (PO), Team Elena (PO)
- Estimate effort for backlog items Team Team (collective) Elena (PO)
Development
- Develop backend logic (API) Peter, Kamil Peter Elena (PO) Lisa, Karen
- Develop frontend UI Lisa Lisa Elena (PO) Peter, Kamil, Karen
Testing
- Write automated tests Karen Karen Team
- Manual testing of functionalities Karen Karen Elena (PO), Team
Deployment Team (rotating)
- Deploy app to development environment Team (rotating) Team (collective)
Daily Scrum Team (rotating facilitator)
- Facilitate daily stand-up meeting Team (rotating) Team (collective)
Sprint Review Elena (PO) Team
- Demo completed features Team (rotating) Elena (PO) Team
- Gather feedback on delivered features Elena (PO) Elena (PO) Team
Sprint Retrospective Team (rotating facilitator)
- Identify areas for improvement Team Team (collective) Elena (PO)