Azure Platform Engineering Principles
Stephen Tulp
December 3, 2024
7 minutes to read
Most companies who are developing a product share a common urgency to reduce their time-to-market. They strive to get developers up and running quickly, enable rapid code deployments, and minimise the time to value. As they grow, they typically introduce more governance to ensure quality, security, cost control through standardisation, and scale efficiency. However, governance processes generally begin as manual controls in the early days. Manual steps, whether through service desk requests, review meetings, or audits, introduce friction into the software delivery lifecycle. This friction slows down team velocity and increases frustration among developers and operations teams. Platform engineering combines several independent technologies and methodologies to produce a holistic development experience.
Some key Platform Engineering principles include:
- Think of Developers as your Primary Customer.
- Treat the Platform like a Product.
- Empower Developers with Self-Service.
- Automation and Infrastructure as Code.
Think of Developers as your Primary Customer
In Platform Engineering, recognising the importance of each customer is crucial. Every customer interaction provides valuable insights that can drive improvements and innovation. By understanding and addressing their unique needs and challenges, platform engineers can create more effective and user-friendly solutions. This customer-centric approach enhances satisfaction but also fosters loyalty and long-term success.
- Customer-Centric Approach: Treat users/developers as your primary customers and focus on their needs when developing capabilities that will make their life easier.
- Start Small: Before creating something new or buying a new product, see if you can improve existing tools and interfaces that are already in place.
- Empower Developers and Operators: Allow them to make decisions within established standards and implemented guardrails. This enables them to enhance business value while maintaining governance and security across the platform.
- Streamline Development Paths: Identify and optimise the best development paths to reduce developer cognitive load and encourage adherence to best practices.
- Meet Users Where They Are: Ensure users/developers are comfortable and efficient in their workflows and guide them on the journey rather than be seen as a blocker.
Treat the Platform like a Product
Adopting a product mindset in Platform Engineering involves treating the platform as a product that serves its users/developers, operations teams, and other stakeholders. Key aspects of a product mindset include:
- User-Centric Design: Understand the needs and pain points of the users/developers. Regularly gather feedback and use it to drive improvements.
- Iterative Development: Continuously improve the platform through iterative development and regular updates. This helps with addressing issues and adding new features.
- Quality and Reliability: Ensure the platform is robust, secure, and reliable. This approach builds trust and encourages adoption rather than resistance.
- Scalability: Design the platform to scale efficiently as the organisation grows. This includes both technical and process scalability as new people are onboarded.
- Metrics and KPIs: Define and track key performance indicators (KPIs) to measure the platforms success and identify these areas for improvement.
- Collaboration: Foster a culture of collaboration between platform engineers and other teams. This ensures that the platform meets the broader needs of the organisation.
Platform engineers can create more effective, user-friendly, and scalable solutions that drives the success for all when thinking of the platform like a product. A key part of this is knowing the difference between a Project, a Product and a Platform, I really like this article that explains each of them in detail Project,Product and Platform Mindset
Empower developers with self-service
Self-Service capabilities with governance and security guardrails built-in empowers development teams to make decisions within set parameters that have been endorsed by key stakeholders like security, operations, and architecture teams. It allows developers to work autonomously while ensuring the areas of security, compliance, and cost management are addressed by automation and policy. Whether you are using an Internal Development Platform (IdP) or other solutions that promote self-service, it needs to be frictionless and provide a good Developer Experience that facilitates collaboration between developers and the Platform team.
- Automated Provisioning: Leverage automated tools and scripts that allow developers to provision resources and development environments, without needing manual intervention.
- Self-Service Portals: Create user-friendly self-service portals where developers can access documentation, request resources, and manage their projects independently.
- Standardised Templates: Provide standardised templates and configurations for common tasks and environments. This ensures consistency and reduces the time developers spend on setup.
- Continuous Integration/Continuous Deployment (CI/CD): Use CI/CD pipelines to automate the process of integrating code changes and deploying them to production. This allows for faster and more reliable releases.
- Monitoring and Logging Tools: Provide developers with tools & capabilities to monitor and log their applications. This helps them troubleshoot issues and optimise performance without relying on other teams.
Alignment with these strategies enable platform engineering teams to create an environments where developers have the autonomy to innovate and deliver value more quickly and efficiently. The diagram below outlines and example of a developer self-service foundation:
Automation and Infrastructure as Code
Infrastructure should be automated and reproducible where possible. Infrastructure as Code (IaC) defines what the platform should look like and enable new resources to be created on-demand. Manual actions should be minimal to eliminate friction points in the development flow and ensure that what is deployed matches the source repository to maintain the desired state configuration of resources.
- Automated Testing: Integrate automated testing into CI/CD pipelines to catch issues early and ensure code quality, this ensures that testing is part of the process rather than an after thought.
- Declarative Configuration: Use declarative languages like YAML, Terraform or Bicep to define the infrastructure. This video from John Savill explains it well with an anology related to pizza Understanding Imperative vs Declarative
- Version Control: Store IaC in version control systems like Git. This allows you to track changes, collaborate with team members, and roll back to previous versions if needed.
- Environment Consistency: IaC helps to ensure that development, testing, and production environments are identical to help promote code through these environments, this is important to reduce the It works on my machine” problem.
Conclusion
We have covered some of the key Platform Engineering principles that help align both Platform Teams and Developers to achieve the same goal, if you want to go into some of these principles in further detail I recommend the following;
- Each Customer is Important
- Adopt a product mindset for your internal developer platform
- Design a developer self-service foundation
Tomorrow we embark on the Platform Engineering Journey and look at where to start.