00:00:00.880
Okay, so our next speaker is Denitsa Belogusheva. She's the CEO and co-founder of a company with a really cool name, Tutu. I don't know about you, but I really like this name. She has over 16 years of experience in the software industry, managing people, teams, and projects. Today, she will speak about a long-term relationship with a client and the lessons she learned along the way. So, let's give it up for Denitsa!
00:00:47.039
Thank you! My name is Denitsa, and I'm very happy to be here. Today, I'd like to share some lessons I learned while working on one of our biggest projects. It's an e-commerce platform called Monolit, one of the largest e-commerce sites in Bulgaria. To give you an idea of the scale, it consists of less than 100,000 lines of code, and the platform itself serves around 50,000 orders per year. It also includes ERP components like manufacturing and inventory management.
00:01:13.520
Let me show you the project timeline. It all began in 2009, where we had the honor of having two local rockstar developers lay the foundations of the project and build its core engine. Later, our team grew, and we were delighted to welcome another talented local developer, known from previous Balkan Ruby editions and her work with Rails Girls Sofia. During this second stage, we focused on building features and fixing bugs. Naturally, we made plenty of mistakes and accumulated a lot of technical debt and legacy code. However, we learned from our failures, and today I believe we are in the evolving stage of the product.
00:01:54.479
Currently, we are directing our efforts toward developing each feature to bring greater value to the core business and empower users to solve their problems independently. We are grateful to work with another group of great local developers with whom we previously collaborated. Today, we have organized mission-driven teams to help us upgrade the application to the latest Ruby and Ruby on Rails versions.
00:02:56.000
Now, let me share a glimpse of the talk. We will explore what it's like to work on a long-term project for 16 years from three different perspectives. First, we'll examine the technical side, followed by how the team evolved and the challenges we faced. Finally, we'll discuss how to build a successful long-term partnership with stakeholders.
00:03:57.439
Let's dive into the technical part and the decisions we made. We always choose simplicity over complexity whenever possible. While you may think that meta-programming isn't simple, for us, it was a key decision that allowed us to build the core engine of the product. This engine empowers users to generate code themselves, leaving the complexity of the domain in the hands of those who know it best, ultimately saving us countless developer hours.
00:04:30.560
Over the years, we found that the Rails way wasn't always the best fit for us and added unnecessary complexity. Therefore, we turned to PostgreSQL to address most of our performance issues through set operations, which streamlined our code and improved performance. We also encountered domain-specific problems that lacked ready-to-use solutions. Together with our stakeholders, we decided to develop separate satellite projects to tackle these issues. This allowed us to maintain a simple monolith while learning that hardcoding logic or breaking best practices comes with hidden costs.
00:05:58.160
Now, let's talk about maintenance. I can't imagine a project this old running without tests. We integrated RSpec into the project literally on the fifth day, and since then, we've relied on our test suite more than ever. It has facilitated upgrades over the years. We have experienced many upgrades in these 16 years. The most challenging was the migration from Ruby 1.8 to 1.9, which took us several months. In contrast, our most recent upgrade of two Rails versions was completed in less than two months.
00:06:51.600
It's difficult to predict how long upgrades will take, but they are unavoidable. While you might view upgrades as externally driven changes, internal changes from stakeholders can be even more challenging. For example, we had a feature code called the redesign that took us seven months to complete. I wish we had released that feature in smaller, iterative chunks. Fortunately, we've managed to avoid the infamous "big rewrite"—at least for now.
00:07:47.920
We decided not to break the monolith into microservices because we didn't see the value it would bring. Therefore, it remains a monolith, though we do have plenty of legacy code. At times it feels burdensome, messy, and broken, which has led to both frustration and shame. However, I discovered a book about Kintsugi, the Japanese art of repairing broken pottery by gluing the pieces together and highlighting them with gold. The philosophy recognizes that breakage is not something to hide, but to honor, as it reflects history.
00:09:30.000
After reading this book, I changed my perspective on legacy code. Previously, I struggled to make confident decisions about it and often found it hard to seek help. With this new mindset towards legacy code, it became easier to let go of elements that no longer served us and invite others to assist us. In the same way that Kintsugi makes broken objects more beautiful, our project began moving forward with renewed purpose. Kintsugi is a slow, intentional process that cultivates beautiful qualities in those who practice it, and I believe that adopting a Kintsugi approach toward legacy code can cultivate these qualities in us, the developers.
00:10:25.600
Now, let's explore the qualities you can gain from working on a long-term project. The first is humility. Even the most humble developer may experience moments of overconfidence, but in the long term, they inevitably return to curiosity and groundedness, learning continuously. Reflecting on the history of the project makes you appreciate the effort that went into each line of code and witness the evolution of people over time. It's a beautiful process.
00:11:27.359
Long-term projects also teach accountability in a real way. When you realize a quote you wrote years ago is still running in production and you're tasked with fixing it after a few years, it prompts thoughtful consideration before rushing into decisions or cutting corners. Over such a long period, anything can happen—unexpected situations, security issues, or even global events like COVID. Overcoming these challenges builds resilience.
00:12:30.560
Lastly, you learn to adapt to changing requirements, priorities, and the dynamics of the people you work with, including stakeholders. A long-term project cannot survive by staying the same; it must grow, which is fueled by the growth of the people involved.
00:12:52.160
I came across a metaphor that describes a long-term team as a garden requiring time, care, and attention to flourish. Now, let’s discuss the challenges you may face in such a garden and what tools you can use to address them. One significant danger is unresolved conflicts within the team or with stakeholders that linger over time, akin to weeds suffocating the plants. Learning conflict management techniques and addressing issues with empathy can help maintain a healthy team in the long term.
00:14:03.880
Another likely occurrence in long-term projects is developer boredom. Therefore, it's crucial to create space for team participation in various activities—learning new skills, engaging in open source projects, or whatever piques their curiosity. As a bonus, this can bring fresh perspectives and a spark of creativity to your project.
00:15:39.920
Lastly, just like in a garden, there might be a poison that permeates the soil. When team members start blaming each other or feeling guilty, it's essential to recognize that mistakes will happen over time. An antidote to this poison is to foster a safe space where mistakes are perceived as growth opportunities rather than reasons for blame. Even the healthiest-looking plants can be stressed beneath the surface, just as people may hide their stress in long-term projects. Over time, the pressure of ongoing tasks and changing priorities can weigh heavily, leading to burnout.
00:16:51.760
Burnout is often difficult to detect early because signs are subtle—lower energy, difficulty focusing, and lack of motivation can be easily dismissed by team leads, colleagues, or even the affected individuals. It becomes a crisis when symptoms become too obvious, impacting not only the individual but also team morale, communication, and collaboration. We should not wait for burnout to escalate, so I began looking for ways to prevent it and help myself and others recover.
00:18:47.600
A few years ago, I noticed symptoms of burnout in myself. I began researching and implementing small steps that made a significant difference. I started letting go of obligations and guilt, allowing myself to choose with intention. This shift helped me regain quality and control over my time.
00:18:57.920
I also learned to stop sacrificing sleep and rest, knowing that I needed energy for recovery. Maintaining a gratitude journal helped me appreciate the good things even during tough times, providing a more balanced perspective. Regrettably, I noticed similar symptoms in some of my teammates, which concerned me. I've learned that as a team leader or colleague, you can’t fix everything.
00:19:38.560
However, it’s essential to engage in conversations about stress and burnout, raising awareness of these issues and creating a safe space for team members to express when they're not okay. Tools such as one-on-ones, regular check-ins, or stress management training can encourage open dialogues. We must be proactive because burnout won't resolve itself; it requires awareness and compassionate, thoughtful actions.
00:21:00.160
Finally, let's discuss working with stakeholders over such a long duration. Understanding their values, needs, and goals is crucial for ensuring project success. In the long term, working with stakeholders is not a one-time alignment; it’s an ongoing partnership. Here are three practices that have helped me maintain a strong partnership over the years.
00:21:49.520
First, proactively check in on expectations regarding timelines, features, and priorities to avoid misassumptions. I've seen bottlenecks arise not from a lack of resources but from a lack of clarity. If you clarify requirements, you can align everyone on the same page. Second, as your team grows, your stakeholders do too, and you need to adjust your approach based on their current needs, whether they require deeper collaboration or just figuring things out. Properly addressing their needs fosters trust.
00:23:12.160
I made a mistake by over-adapting to vocal minorities—individuals whose opinions are strong, but not necessarily aligned with overall organizational goals. I spent months solving issues for one department while critical areas of the project were neglected. Ensure every feature aligns with the clients' business goals and stick to key metrics guiding you in the right direction. Acknowledge vocal minorities' concerns but communicate transparently about the project's critical requirements and the direction it must head.
00:24:56.160
Lastly, always explain transparently how decisions are made. This way, you accommodate diverse perspectives while keeping the focus on core goals. If you can avoid personalizing discussions—even if objections feel confrontational—you can direct the objective focus back to what’s essential for the business.
00:25:39.320
To conclude, your survival kit for a long project is essential. When you feel lost, return to the core values of your team and project, as they'll guide you like a compass. Honest communication builds trust, making it easier to have tough conversations and find the best solutions. Lastly, remain humble—be open to learning and new perspectives to lead the project to success despite obstacles.