Austin Story: Making Software Easier to Change, Remove, and Evolve
Dec 10, 2024
auto_awesome
Austin Story, Senior Engineering Director at Doximity, dives into the art of creating maintainable software. He discusses critical traits like testability and simplicity, along with the principle of YAGNI that ensures only necessary features are built. Austin shares insights on migrating to a federated GraphQL architecture from a monolith, addressing both benefits and challenges. He emphasizes the importance of collaboration between data and application teams, using tools like Kafka, to enhance workflow efficiency. Tune in for a masterclass on software evolution!
Maintaining clear business value and functionality in software allows for quicker iterations and better alignment with customer needs.
Migrating to a federated GraphQL architecture empowers independent team management of microservices, enhancing flexibility and response to user demands.
Fostering a culture of accountability and ownership among team members is crucial for effective software development and impactful contributions.
Deep dives
Characteristics of Well-Maintained Software
Well-maintained software typically exhibits clear business value and functionality, allowing teams to iterate quickly and meet customer needs. From a technical standpoint, it is characterized by modular design principles that make features easy to add or remove. The application of solid principles ensures that components are isolated, which prevents complications when changes are necessary. This approach allows developers to work efficiently without leaving behind potential pitfalls that could affect other parts of the system.
Migrating to a Federated GraphQL Architecture
Migrating from a monolithic GraphQL server to a federated architecture presents significant challenges and advantages. The federated model allows different teams to manage and extend their microservices independently, ultimately simplifying the process of adding new fields or features. This structure reduces the complexity often experienced with REST APIs, which can lead to unintentional breaking changes for clients. By focusing on a GraphQL router that directs requests to various microservices, developers can achieve greater flexibility and efficiency in responding to user needs.
Improving Team Collaboration Between Data and Development
Effective collaboration between data teams and application developers is critical yet challenging due to their differing environments and workflows. A data update tool utilizing Kafka serves as a boundary layer that enables data teams to send commands to Rails applications efficiently. This integration allows application developers to consume necessary updates without getting bogged down in the complexities of data processing. By establishing contracts and using a shared method for communicating changes, teams can maintain synchronization and improve overall productivity.
Fostering Ownership and Accountability
Creating a culture of ownership and accountability among team members is essential for effective software development. Leadership plays a significant role in modeling this behavior by demonstrating commitments to shared goals and providing mentorship to new developers. Structuring the development process with clear goals and measurable outcomes encourages team members to take pride in their contributions and outcomes. When developers feel supported and empowered to communicate openly, they are more likely to take initiative and deliver meaningful results.
Navigating Technical Debt and Feature Upgrades
Addressing technical debt and ensuring timely feature upgrades require a structured approach and clear communication within the organization. Allocating dedicated time for developers to focus on refactoring and addressing technical challenges is vital for long-term efficiency. By establishing this framework, teams can work towards improving system architecture while still delivering value. Advocating for the need to address these issues is essential; demonstrating potential time savings in future development can help secure buy-in from stakeholders who may resist change.
Austin Story, Senior Engineering Director at Doximity, joins Robby to explore the intricacies of building maintainable systems, fostering team accountability, and enabling faster iteration without sacrificing quality. Austin shares how his team approached migrating from a monolithic GraphQL architecture to a federated model, why simplicity matters for long-term success, and how guiding principles like YAGNI influence his decision-making.
Doximity is a leading digital platform for medical professionals, and their technology blog offers deep dives into the systems and tools that power their innovative solutions.
Key Topics Discussed
[00:00:41] What is maintainable software? Austin highlights key traits, including testability, simplicity, and ease of removal.
[00:02:09] Designing for removability: Why it's important and how it enables iterative progress.
[00:03:05] YAGNI (You Aren’t Gonna Need It): How this principle shapes Austin's approach to feature development.
[00:04:13] Migrating to GraphQL Federation: Benefits of breaking up a monolithic GraphQL server and the challenges faced during the transition.
[00:05:56] GraphQL vs. REST: How GraphQL aids developer productivity while maintaining backward compatibility.
[00:10:53] Collaboration between data and application teams: Using tools like Kafka to bridge gaps and improve workflow.
[00:17:00] Upgrading Ruby on Rails applications: Balancing autonomy with central guidance for seamless updates.
[00:27:55] Fostering ownership on teams: The cultural practices that empower engineers to take initiative and drive results.
[00:34:29] Prioritizing work effectively: How Austin's team uses quarterly planning and measurable "goalposts" to align efforts with impact.
[00:40:00] Avoiding bike-shedding: Keeping meetings and reviews focused on meaningful progress.
Key Takeaways
Simplicity Wins: Maintainable software is easier to adapt, remove, and iterate on when it's kept simple.
Iterate and Refine: Use principles like YAGNI to avoid over-engineering and ensure systems are built to evolve.
Collaboration Drives Success: Bridging communication between specialized teams can unlock untapped potential.
Focus on Outcomes: Define clear goals and track measurable results to ensure projects align with business needs.
Turn hours of debugging into just minutes! AppSignal is a performance monitoring and error-tracking tool designed for Ruby, Elixir, Python, Node.js, Javascript, and other frameworks.
It offers six powerful features with one simple interface, providing developers with real-time insights into the performance and health of web applications.
Keep your coding cool and error-free, one line at a time!
Use the code maintainable to get a 10% discount for your first year. Check them out!