Issue 80: Why Perfect Architectures Are a Myth & What to Do Instead Featuring Mikhail Rogachev, Senior Software Engineer - Status

Author :
Nishant Singh
December 15, 2024

"The one principle that connects aerospace and web3 development is..."

In this edition of Coffee with Calyptus, we sit down with Mikhail Rogachev, a senior software engineer at Status with over a decade of experience in backend and distributed systems. Discover how early experiences, mistakes, and adaptability shaped his philosophy of building resilient, scalable, and mission-critical systems.

Looking back over your 10+ years in backend and distributed systems, what early experiences were most pivotal in shaping your approach to development?

My early experiences as a C++ programmer during the era of large monolithic object-oriented programming (OOP) solutions played a crucial role in shaping my approach to development. At the time, I heavily focused on maintaining and reusing code, applying principles like SOLID, GRASP, and Martin Fowler's design patterns. These foundational lessons taught me the importance of creating well-structured, maintainable software.

As the industry shifted toward microservice and event-driven architectures, combined with the rise of cloud infrastructure, I encountered new challenges. These required me to adapt the principles I had learned to systems that demanded greater scalability and distribution. This shift underscored the need for flexibility in system design and introduced me to the importance of decoupling services, implementing efficient communication patterns, and building resilient systems. Concepts like Conway's Law became particularly relevant, as I observed how team structures directly influenced the resulting architecture. By establishing domain-based guilds alongside technical teams, we were able to develop modular components capable of both vertical and horizontal scaling. This ability to adapt my architectural approaches to meet evolving requirements remains a cornerstone of my development philosophy.

You've worked with mission-critical and highly reliable systems. What’s the biggest lesson you’ve learned about handling high-stakes situations, and how has that influenced your work?

Prior to my work in Web3, I gained experience in the aerospace industry, where reliability and precision were non-negotiable due to the high stakes involved. Strict reliability standards and hardware constraints often required innovative problem-solving. For instance, in one of our C++ projects, we were unable to use dynamic memory allocation. Despite this limitation, we leveraged static polymorphism and classes to achieve a high degree of code reuse. Static checks in templates helped catch the majority of issues at compile time, while comprehensive tests handled the rest.

This experience taught me the value of prioritizing safety and rigor in the development process. When I transitioned to working with Rust, I saw these principles reflected and evolved. Rust’s emphasis on strict type checks, static typing, and memory safety makes it an excellent choice for developing mission-critical systems. The discipline instilled by my aerospace experience influences my work today, ensuring that reliability and safety are always at the forefront.

Rust and Go have become your go-to languages. What led you to specialize in these, and how has working with them changed your approach to backend development?

My specialization in Rust and Go came from recognizing that while the choice of language is important, effective practices—like asynchronous programming and designing scalable systems—transcend specific technologies. Rust and Go became natural choices because they are widely used in the blockchain field, where I currently focus. Many of the clients for popular blockchains are written in these languages, making them essential for the work I do.

Both Rust and Go offer robust ecosystems with active communities and strong infrastructure. This support allows me to spend more time solving complex problems rather than struggling with the tools themselves. Additionally, Rust’s safety guarantees and Go’s simplicity and concurrency model have reinforced my approach to building efficient, scalable, and maintainable backend systems. These languages have streamlined my work, encouraging a focus on solving real-world problems with clarity and precision.

What’s one mistake or misconception you had early in your career about building reliable systems, and how did you eventually overcome it?

Early in my career, I mistakenly believed that creating the perfect architecture at the start of a project was the key to success. This mindset led to a significant misstep on one project, where we spent six months developing a Spring-like framework for C++ before addressing the actual business needs. This focus on building infrastructure delayed progress and ultimately hindered the project’s success.

Over time, I learned that architecture should evolve in tandem with the project. Starting with a minimal, functional solution and iterating as requirements emerge ensures that development remains focused on delivering value. This iterative approach prevents premature optimization and allows the architecture to grow organically in response to real-world needs. Today, I apply this lesson by prioritizing flexibility and simplicity in the early stages of development, ensuring that systems remain adaptable and relevant as they scale.

For developers looking to grow in backend development or break into blockchain, what advice would you give to help them stand out and keep pace with industry demands?

For those aiming to excel in blockchain, I recommend actively participating in open-source projects, particularly on platforms like GitHub. Contributing to these projects not only increases visibility within the community but also provides an opportunity to refine your skills and learn from others. Engaging with open-source initiatives allows you to build a network of connections while staying aligned with current industry practices.

Additionally, working on personal projects can be invaluable. Building a project from start to finish offers practical experience and a deep understanding of system design, implementation, and problem-solving. Staying curious and continually learning about emerging technologies and patterns is crucial for keeping pace with the fast-evolving blockchain and backend development fields. By combining hands-on experience with community involvement, developers can position themselves for success in this dynamic industry.

Solidity Challenge 🕵️‍♂️

What is the max number of members an enum can contain?

calyptuscareers_Solidity_Challenge_65bb6b0d

Jobs 💼

We have over 200 roles on our platform from companies like Aave, Aragon, Balancer, Gnosis, etc. Check out a select few below:

Fullstack Engineer - hybrid, London, fulltime - $75-130k
Senior Smart Contract Engineer - remote, US/EU, fulltime - $200-300k
Social Media & Community Associate - remote, NA/SA, fulltime -  $80-110k
CEO/Founder - remote, Europe, Middle East or Asia, fulltime - $200-300k

Solidity Challenge Answer ✅

Answer: enum definitions cannot contain more than 256 members.This makes it safe to assume that the underlying type in the ABI is always uint8.