Our IT consulting service is designed to improve your application and make it stable, reliable, performant and secure. Having dozens of projects under the belt, we’ve developed a structured approach to assessment of web applications.
We see your project from a different perspective, with fresh eyes and without first-hand knowledge of reasons for the decisions that have been made. This allows us to remain more objective in the analysis we perform.
Recently we got to know noxt! engineering GmbH - a company, specializing in appraisals for windparks. To do an appraisal they have to perform complicated simulations, for example to determine acoustic impact of turbines on the surroundings, and visualize the results.
They have an in-house team of developers, working on a Django application to manage the company’s windpark projects. Information about the windparks is stored there, simulations are requested, their results are saved and visualized all in one place.
Even the best development teams benefit from a fresh perspective. noxt! engineering, wanted to ensure their Django-based platform was built on a solid architectural foundation. Rather than waiting for problems to arise, they took a proactive approach and brought us in to provide expert feedback on their architecture, best practices, and development workflows.
Let’s go into detail for a couple of topics we tackled for them as part of our consulting service. Our goal was to strengthen the overall structure, maintainability, and flexibility of the project, ensuring that development remains efficient, even as the codebase, team, and system complexity grow.
Sometimes applications get in the state of tight coupling between logic and database data, resulting in a specific database dump being essential to spawn a new (for example development or staging) system.
Usually such dumps are made from the production database. Production data, especially user or business sensitive data, has to be handled with care and not live off in numerous dumps and running systems.
Ideally the application would not be dependent on particular data present in the database to run. This is what we call production database data independence.
To solve the problem we first analyze the data stored in the database to understand what kind of data it is. Usually there are three categories:
For data that can be randomly generated we suggest writing factories, for example with factory_boy, which can be used to generate data for development as well as for tests. We wrote several factories to get the process started.
For general knowledge data that cannot be generated, we find ways of importing it, for example geo data of Germany can be automatically pulled from the sources like https://basemap.de/.
Testing, both backend and frontend, is what gives you confidence in the implementation, and also reduces development time when extending or refactoring it.
We went through the application and together with the internal development team chose one of the most business critical parts. We wrote different types of tests, unit and integration tests, but also those for different parts of the application: Django models, Django views, API views, utility functions.
We configured the pytest testing framework, extended it with plugins like pytest-mock, pytest-django, wrote factories to create test data, and provided the test examples. This made up a complete testing environment for the internal team to continue to increase test coverage on their own.
Testing can be thorough only if the code is written in a way that allows testing. This is called code testability. There are several indicators of the testable code that we went through:
When working on CI we pay extra attention to dependency management to ensure that the package versions are the same in all environments. In the current project the simulations are being performed by the package developed by a different development team of the client. We streamlined the build process by switching from direct simulation code pulling to installing it as a wheel.
We tuned the ruff linter configuration, and added Django specific checks, like for example ensuring that no database migration has accidentally been forgotten.
We configured continuous deployment to the staging system when CI passes for merges on main.
Christoph Lehmann, CTO noxt! engineering GmbH:
“Djangsters quickly understood our challenges and offered fitting solutions. Communication was easy, honest, and to the point. Their practical advice didn’t just solve immediate problems but made our platform more stable, flexible, and ready for the future.”