On December 16th, the first Sendcloud meetup took place. We noticed we have a lot of knowledge and experience internally, that we would like to share with a broader audience. At the same time we want to learn from others in our industry. As such, we started this meetup series, and in this blog I'll try and summarize what happened.
In API First: increasing quality while reducing costs, Alejandro Lopez Ariza, QA Automation Engineer and Postman Supernova, states that APIs are the nexus of modern software projects.
As an industry we've been shifting steps left in the software development cycle that originally were treated as an afterthought. We tackle things like testing early, and continuously, because we know that the costs associated with fixing a bug that's already in production are exponentially higher than finding it during the design phase.
The traditional way of implementing new features posed several problems. Functional requirements influenced by UI constraints, or a lacking multi-device strategy, just to name a few.
When we instead treat our APIs as first class citizens, and prioritize their development, we:
- Remove dependencies between teams
- Increase productivity
- Reduce costs
- Increase quality
- Provide a better developer experience
- Improve the maintainability of our APIs
Alejandro recommends using tools like Swagger or Postman to automatically create documentation (but to treat it as a starting point), and to use API mocking to unblock development and reduce dependency on third parties.
In Carrier SDK: Sendcloud's Story of Switching to Services, Evgeny Sharypin, Software Development Manager at Sendcloud, shares how the company transitioned from a monolith to a services system.
In early 2020, Sendcloud expected a huge growth in our user base. We knew that our architecture wouldn't stand the challenge. The solution? The Carrier SDK: a collection of APIs and packages. Today there are more than 25 carrier integrations built using this SDK, and by mid 2022, we plan to move all of our existing integrations to be operating within this distributed fleet of services. By 2025 we expect the amount of integrations to be in the hundreds.
The Carrier Blueprint is a reusable Python package that serves as a base for all our carrier services and enables us and our integrators to develop new integrations rapidly, while keeping the services’ codebase lean, flexible and easy to maintain.
The 'vertical siloing' of our services (carriers) was one of the crucial prerequisites for this project to succeed, as it allowed us to design an HTTP API that would replace the existing Python API, without redefining or refactoring the interface much.
The second aspect of carrier integration that played in our favour was that by keeping the state inside our monolith, our services are almost completely stateless. Stateless services don’t compete for shared resources and are easy to scale.
A selection of Evgeny's great parting advice:
- Define milestones upfront, but avoid analysis paralysis
- Make a disposable prototype first, and actually dispose of it afterwards
- When building a service ecosystem for integrators, provide a template that allows them to focus on the business logic
- Use known paradigms, such as 12-factor app
- Think about observability early on