Posts

The Architect’s Edge: Mastering the Assessment Process in Consulting Architecture

Image
In the field of consulting architecture, the assessment process is a critical step for evaluating and improving a client’s system architecture. This process closely resembles the discovery phase but expands to include a broader group of stakeholders and technical experts to conduct a thorough evaluation. Below, we outline the key stages and components of an effective assessment. Preparation: Setting the Stage The assessment begins with meticulous preparation. This involves creating a comprehensive agenda to ensure all necessary topics are covered during the process. Key activities include: Gathering Requirements : Similar to the discovery phase, architects collect requirements through workshops, such as the Quality Attributes Workshop , to understand the system’s needs. Reviewing Existing Architecture : Architects examine the current architecture, accessing critical resources like source code, cloud monitoring, logging systems, security protocols, and performance tests. Stakeholder E...

The Architect’s Edge: Mastering the Architectural Design Process

Image
Architectural design is a critical process in software engineering and system architecture, ensuring that systems meet business goals and perform effectively. This article provides an overview of the architectural design process, breaking it down into three core phases: Requirements Gathering , Design , and Analysis and Testing . These steps form the foundation of most architectural methodologies, based on extensive research and practical experience. Phase 1: Requirements Gathering Requirements are the cornerstone of architectural design. They provide the foundation for all subsequent decisions and ensure that the system aligns with business objectives. Skipping or poorly defining requirements often leads to designs that fail to address critical needs, resulting in questions like, “What problem does this design solve?” or “How does it meet the business goals?” Key Aspects of Requirements Gathering Business Goals : Understand the client’s business case and objectives. These goals shape ...

The Architect’s Edge: How Requirements Drive System Success

Image
Software architecture is a disciplined approach to designing systems that meet both business and technical objectives. At its core, the process begins with a critical first step: gathering requirements. This article explores the role of requirements in software architecture, why they matter to architects, and how they are categorized to drive effective system design. The Three Steps of Architectural Design The architectural design process can be distilled into three fundamental steps: Requirements Gathering : Identifying and documenting what the system must achieve. Design : Creating the blueprint for the system based on gathered requirements. Analysis and Testing : Evaluating the design to ensure it meets the defined goals. Requirements gathering is the foundation upon which the entire architectural process rests. Without a clear understanding of requirements, the resulting design risks being misaligned with business needs or technically infeasible. Why Requirements Matter to Architec...

You are senior software engineer... What's next?

Image
     Reaching the level of a senior software engineer is a significant milestone in your career. You’ve honed your technical skills, delivered complex projects, mentored junior developers, and become a key contributor to your team’s success. But what comes next?      For me, this question has been a constant source of reflection. After reaching this level, I started to wonder: should I double down on my technical expertise, transition into leadership, or explore entrepreneurial opportunities? Each path offers unique challenges and rewards, and choosing the right one depends on personal aspirations, values, and long-term vision. 1. Become a Principal or Staff Engineer      For those who want to stay deeply technical while increasing their impact, the path of a principal engineer or staff engineer might be the best option. These roles typically involve: Architecting large-scale systems and making high-level technical decisions. Mentoring sen...

Why I Decided to Open Source?

Image
       It all started with a simple realization: some of the best things in my coding journey came from the open-source community. As a budding developer, I often found myself scouring GitHub, marveling at the vast array of projects and the generosity of people who shared their work with the world. It was through this open exchange of ideas and code that I learned, grew, and became the developer I am today. A Sense of Belonging      I remember the first time I contributed to an open-source project. I was nervous, unsure if my code would be good enough, but I went for it anyway. To my surprise, my contribution was welcomed warmly. The feeling of being part of something bigger than myself was exhilarating. This sense of belonging and collaboration was a key reason I decided to open source my projects. I wanted to recreate that welcoming environment for others, providing a platform where they could contribute, learn, and feel valued. The Joy of Learning a...

How to conduct code reviews?

Image
     Based on my experience, having a solid code review plan can make a huge difference in the quality of the software we develop. Over time, I've learned that focusing on different aspects at different stages can really streamline the process and catch potential issues early. Let me break down the approach I use, which has proven to be pretty effective.     API Semantics: The Foundation      I always start with the API Semantics, the foundation of our code review plan. Here, it's all about the big picture—making sure the API is minimal yet sufficient, without any unnecessary duplication. We want it to be intuitive and easy to use, sticking to the principle of least surprise. It’s also crucial to check the cleanliness of the API and ensure any new dependencies come with acceptable licenses. By focusing on these aspects first, we can build a solid base for the rest of the code.   Implementation Semantics: Ensuring Correctness and Efficiency ...

My experience of using Github Copilot

Image
 It's been a while since I posted anything here. Let's change that! :) The first topic I want to cover is my experience using GitHub Copilot. Let's get started. What is Github Copilot? GitHub Copilot is an AI-powered tool designed to assist developers by providing hints, recommendations, bug fixes, and code writing based on context and guidance. The first version, available to everyone, was released in October 2021. GitHub markets Copilot not just as a "code completion tool" but as an "AI pair programmer." This is a smart move, as it sounds intriguing and generates interest. How to use Github Copilot? Use simple and clear language so that Copilot can better understand your comments and intentions.  Context is crucial for effective interaction with Copilot. Well-structured and readable code, meaningful names for files, classes, methods, and comments all contribute to better results. The more you use Copilot, the better it understands you and the more rele...

IMAP protocol summary

Image
IMAP - internet message access protocol. Versions : IMAP1 (Interim Mail Access Protocol) - 1986. IMAP2 (Interactive Mail Access Protocol) - 1988. IMAP3 - 1991. IMAP4 - 1994, last updates - 2003. IMAP is used to read emails that came to the user's mailbox. Emails are stored on server :  Clients connect to the server and download emails only after a user request.  The server can perform complex operations with emails. Advantages : Several clients can work at the same time. All clients see the same mailbox status. Disadvantages :  Protocol is more complex in comparison to POP3. Server space for the mailbox is usually limited. IMAP is an application layer protocol and uses the TCP transport layer protocol. Port 143. IMAP allows you to use multiple mailboxes or folders: Folders are stored on server. Folders can form a hierarchy. Emails can be moved from one folder to another. Flag : It's an email "label". Emails can have one or multiple flags. System flags: \Seen \Answe...

POP3 protocol summary

Image
POP - post office protocol. Versions: POP1 - 1984 POP2 - 1985 POP3 - 1988 Updated version of POP3 with additional authentication mechanisms and extensions - 1996 POP3 communication schema The approach "download and delete": The message storage on the server is a temporary storage for messages. All messages must be transferred to the mail client. After uploading to the client, the messages are deleted from the server. Advantages: Simple protocol. Letters are available when there is no network connection. Disadvantages: Only 1 client. Single mail storage (no folders, filters, flags, etc.). POP3 is an application layer protocol (port 110), it uses TCP transport protocol. Session states: Authorization - the client introduces himself and confirms that he is who he says he is. Transaction - the client downloads the mail and marks the downloaded message for deletion. Update - the server deletes the marked message and closes the connection. POP3 works in text mode, interacting in a ...

SMTP protocol summary

Image
SMTP - simple mail transfer protocol. Created in 1982 with further modernization in 2008 (ESMTP). A protocol is used for mail transmission and can work with any transport protocol (TCP, UDP). General mail exchange idea Ports : 25 - mail transmission between servers (mail transfer agent) 587 - mail transmission from client On practice port 25 is used.   Email format :   Envelope (SMTP commands)           Header (RFC 2822)         Body (RFC 2822) SMTP works in text format (request - response interaction). Commands : SMTP responses:   Letter headers: Extended SMTP (ESMTP) commands: EHLO - extended HELO STARTTLS - to use encryption SIZE - max allowed letter size DSN - letter delivery confirmation Security and spam: SMTP does not contain data protection mechanisms. The contents of MAIL FROM and FROM are not controlled in any way Data is transmitted over the network in open form (except using STARTTLS) Spam defe...

System design tips on how to make capacity estimation

Image
Estimation is an important skill in system design interviews because it allows you to demonstrate your ability to reason about the complexity and feasibility of a given problem. It is worth noting that estimation is an inexact science and that it is normal for estimates to be off by some margin. It is more important to show that you have a clear understanding of the problem and can provide a thoughtful and well-reasoned estimate than to provide a perfectly accurate one. Here are a few examples of the types of estimation questions you might encounter in a system design interview: How many users can a system support? For example, you might be asked to estimate the number of users that a social media platform can support, based on the number of servers, storage, and bandwidth available. How much data can a system store or process? For example, you might be asked to estimate the amount of data that a data warehouse can store, based on the size of the data, the number of serv...

Cheat sheet on how to choose database

Image
The effectiveness and scalability of your design depends greatly on the choice of database. It is possible to use multiple databases within a single system for different purposes.   DB cheet sheet (you can click on image to expand it) Caching solutions such as Redis and Memcached are key-value storage systems that can be used to improve the performance of a system by temporarily storing frequently accessed data in memory.   For storing large files such as images and videos, it is often useful to use a file storage service such as S3 or Google Cloud Storage . These are known as blob storage systems and can be used in conjunction with a content delivery network (CDN) to improve the performance and reliability of file access. To support full text search you could to use Elastic search or Solar . To support monitoring system InfluxDB or Prometheus may be good options to consider. For analytics on extremely large datasets and where transactions are not a requirement,...

10 tips when you decide to use kafka

Image
Overall, Kafka is a powerful and flexible tool that is well-suited for handling large volumes of data in real-time. Here are ten best practices when you decide to use it: To ensure high availability and handle high load, it is important to set up a cluster of servers when using Kafka, as it is designed to scale horizontally across multiple machines. Use a message retention period: Kafka allows you to specify a message retention period, which determines how long messages are kept before they are deleted. It is important to set this value appropriately to ensure that you have enough data for processing, but not so much that you run out of storage space. Use message compression: Kafka supports message compression to reduce the amount of data that needs to be transferred and stored. This can be particularly useful when sending large messages or when dealing with high volumes of data. By setting a key on each message, you can specify which partition the message should be written to in Ka...

How to design notifications service system

Image
This post is a personal cheat sheet on how to design notifications service system. Usually it’s embedded system. Questions to ask: What types of notifications are we allowed to send? Should it be plugable (it’s easy to add new type of notification)? Should we build system as SaaS product or this system is only for internal usage? Do we need to implement notifications prioritization (multiple notifications are sent at the same time)? What’s expected system load? Functional requirements: Send notifications To be plugable (easy to add new type of notifications) To provide saas service (you also should be able to rate limit, user should not be able to get more than 5 promotional notifications per day) To prioritize notifications (process high priority messages first, for example password notifications) Non-functional requirements: High availability High load Design overview: Actually in case if system is small and expects low load all services can be wrapped into one monolith. But it’s not...