Unfamiliar with the term ‘technology stack’? This bit of tech jargon simply refers to the combination of programming languages and software used to develop a piece of software. Getting the right mix of these underlying development tools is essential.
As software specialists and experienced experts in our field, we have selected a tech stack that contains the best in breed enterprise level tech. These are all ‘here to stay’ tried and tested technologies that have been very carefully selected to give us the flexibility to create any software platform required. So what exactly is in our tech stack?
The Xamarin platform is an open-source collection of tools and libraries for building iOS and Android apps using .NET. User interfaces are constructed using declarative XAML syntax, with business logic written in the same C# language that powers our backend Cloud services.
Xamarin is a mature platform, acquired by Microsoft in 2016, that allows for UI and business logic to be defined once and shared across platforms. Xamarin.Forms includes a variety of standard XAML UI templates, while Xamarin.Android and Xamarin.iOS still allows for specific customization when needed. Furthermore, it is possible to invoke mobile-native languages such as Java and Swift, which maximizes compatibility with other third-party libraries. Apps written in Xamarin offer near-native performance, as the C# source code is compiled to native assembly for each platform.
NET Core is a cross-platform application framework that can be run on Linux, Mac and Windows on-premises servers or in the cloud. It’s actually a full re-write of Microsoft's earlier .NET Framework, with an emphasis on performance, testability and compatibility.
Web APIs, libraries and desktop applications can all be developed using the C# language. This modern, object-oriented language is still being actively developed and improved by Microsoft and the open-source community, with version 8 having just been released in 2019.
SQL Server is a highly secure, enterprise-grade relational database management system. It’s dependable as it’s remained one of the most popular data persistence options for decades. A relational database maintains data accuracy using atomic transactions, which ensures that each data change is reliably processed. Plus, the fairly recent addition of JSON support to SQL Server allows for a hybrid relational and document-based approach. So, you get the best of both worlds.
Azure is Microsoft's global cloud platform. We fully embrace Azure and our software development team uses this to provision virtual machines, network infrastructure, SQL Server databases and Kubernetes clusters.
Because our server and client-side software are written to support containerisation using Docker, they can be deployed to Kubernetes. Kubernetes has now become the industry standard in container orchestration. It provides global resiliency and scalability for applications and is also offered as a managed service within Azure.
As a project’s code base evolves over time and requirements change, having a strong foundation of unit tests becomes increasingly important. Unit tests are fast, repeatable tests that check that individual components behave the way we expect them to in isolation. By running unit tests automatically while writing code in Visual Studio, and as part of our continuous integration pipelines in Azure, we can ensure that we quickly identify bugs early and avoid regressions. We make use of the popular xUnit testing framework, in addition to using the Moq library for generating mock components.
In addition to low-level unit tests that focus on small components, we battle test our software using automated integration tests. This ensures that the application as a whole is behaving as intended. At AVAMAE we find Postman suite gives us an organized and effective way of testing our Cloud APIs.
Tests are bundled into collections that represent the desired requests and responses we need to be confident that everything is running smoothly. These integration test collections can then be configured to run as part of our continuous integration pipelines every time we release new software versions. Even after release, we write our software from the ground up to ensure that we can continue to periodically run our integration tests as a health check, and clean up any test data created as a result.