Product teams
Deliver localized versions of your product faster by automating tedious localization steps.
Localization teams
Streamline your workflows and simplify collaboration with efficient localization management.
Developers teams
Add Transifex to your CI/CD pipeline to continuously deploy new translations.
Marketing teams
Quickly launch multilingual websites to accelerate international growth and conversions.
Translators
Deliver more accurate translations faster, leveraging advanced linguistic tools.
Software localization
Keep software continuously localized and in sync using automated CI/CD workflows.
Website localization
Automate and scale website localization to attract and convert international visitors.
Mobile App localization
Rapidly translate and launch apps globally, ensuring high-quality user experiences across markets.
Get a Personalized Demo Today
Precise, on-brand translations at scale. Language AI delivers context-rich content faster.
Get a personalized demo today
Request a personalized demo to learn how to integrate Transifex into your CI/CD
Product teams
Deliver localized versions of your product faster by automating tedious localization steps.
Localization teams
Streamline your workflows and simplify collaboration with efficient localization management.
Developers teams
Add Transifex to your CI/CD pipeline to continuously deploy new translations.
Marketing teams
Quickly launch multilingual websites to accelerate international growth and conversions.
Translators
Deliver more accurate translations faster, leveraging advanced linguistic tools.
Software localization
Keep software continuously localized and in sync using automated CI/CD workflows.
Website localization
Automate and scale website localization to attract and convert international visitors.
Mobile App localization
Rapidly translate and launch apps globally, ensuring high-quality user experiences across markets.
Get a Personalized Demo Today
Precise, on-brand translations at scale. Language AI delivers context-rich content faster.
Get a personalized demo today
Request a personalized demo to learn how to integrate Transifex into your CI/CD
Agility is all about trust, making prompt decisions, and acting fast in the scope of self-organizing teams. What happens though when this flow is jeopardized by technical limitations, bureaucracy, and a cumbersome deployment process of new features?
Transifex was originally built on top of a big, fat Django application, a monolith as it is commonly said, with all developers planning and contributing to the same Git repository regardless of the team or feature they were working on.
When a company scales and teams grow, the monolith pattern stops working and useless waste is introduced in the delivery of new features. This waste was surfacing more and more in Transifex through the following observations:
Our company had a dedicated DevOps team that owned the infrastructure. All feature teams were relying on the DevOps team to manage and troubleshoot deployments, creating an impediment for releasing new features at a fast pace.
Moreover, the DevOps team was already swamped with SysOps tasks, striving to keep the platform healthy, scale it, and make it work reliably for our customers overall. This put so much pressure on the team that they could not manage the load of tasks effectively and their time was being spent more on firefighting and support and less on innovation and evolution.
This put sprints at risk and company goals at stake.
At some point, we started decoupling a few features away from the monolith using new separate services. This made things much better and paved the road for the future.
These services were satellite components around the monolith, such as a new notification system, API, and Transifex Live services, where teams could develop, deploy, and maintain independently from one another.
However, even those satellite services were suffering from some important pathogens. They were coupled with the monolith application through the database or task queue system. Sometimes a change in the database schema could affect 2 or 3 components, leading to what we call a “distributed monolith”.
The distributed monolith pattern is bad, really bad, because it makes service maintenance even worse, as core changes to one service can trigger changes to other services as well. In other words, the spaghetti code problem is deferred to a spaghetti infrastructure problem.
In late 2018 we decided it was time to do something about it. Following trends in the space we decided to start investing in a microservices architecture with the following goals for our engineering teams:
In order to achieve those goals we groomed an “Engineering Vision” and aligned our company around it to make it happen. The outcome of this vision was a new architecture that we would follow for the development of new services while migrating/refactoring existing functionality away from the monolith.
Regarding microservices, we decided NOT to go too “micro” as hundreds of microservices in our stack could create huge maintenance overhead for our small engineering team. On the contrary, we split microservices based on the domain of functionality by following some design rules:
Our engineering vision would never be fulfilled unless we made microservices development a breeze to deploy. Thus we made the decision to invest in building our infrastructure from scratch in Kubernetes.
To make this happen, we decided to invest in managed services in AWS and we started a big project so that the new infrastructure would be provisioned entirely through Terraform, using the Infrastructure As Code design pattern. This way, everything would be code. Provisioning a new database would be as easy as opening a pull-request to a Terraform Git repository.
Investing in managed services, and more specifically AWS, allowed our DevOps team to focus on building a platform for our development teams to work on, instead of being the bottleneck for deployment and troubleshooting. That platform included all the tools to deploy, monitor, and scale our apps. Investing in managed services gave us peace of mind.
Another important pillar of our engineering vision was automation. Repetitive and manual tasks should be as automated as possible, removing any time wasted from our teams.
We invested heavily in Jenkins as a CI tool and created pipelines for all of our services – running tests and/or deploying releases to production or even running database migrations through the system.
An important component of the automation process was the Kubernetes orchestration through Helm. Helm removed the complexity of Kubernetes and heavily simplified the deployment of web services, workers, and cron-jobs, through reusable and maintainable code.
The above work took a little more than a year to complete and the outcome was outstanding for the productivity of our teams. In retrospect, this is how it affected the agility of our teams:
All in all, teams are now fully self-organized and the platform is promoting rapid development and deployment of increments, with automation in place to help, allowing teams to focus on producing customer value.
Having all these components in place, our DevOps team is now putting their strength towards making the new platform even better with more exciting stuff on the way. For us, it was a perilous and cumbersome journey but eventually, it all paid off.