While tooling cannot solve your developer maturity problems, maybe some tools can! Docker, a containerization tool frequently mentioned in the DevOps tool world is a case in point. This great tool brings the IT Server concept of Containerization to developers – bridging the gap between development and operations.
So, how can this tool bring maturity to a developer’s skill set?
In my practice, we preach the idea of “software craftsmanship.” Craftsmanship refers to raising the bar of professionalism, practicing software development, and leading others in the craft of software development (see the software craftsmanship manifesto). First, test-driven development must be part of a professional developer’s toolkit. Also, our senior coders understand and practice the SOLID object-oriented programming principles when writing code. We teach or reinforce these concepts and practices to all new AgileThought coders by leading by example. They see how to operate inside of team using best practices on a daily basis. It is great to have other team members reminding coders (junior, senior or otherwise) to use good coding practices.
A toolset like Docker can help keep developer disciplined by isolating development in a server environment. I describe Docker as creating a sliver of an Operating System for developers. This sliver will run as a server, even locally. Docker creates an OS container where my application can be deployed. Once I test that application in my container and confirm it is ready to move to a different server, we move the container information to a new server. In other words, when I say it runs on my machine (inside of my container), I am verifying it works on an actual server to which it is deployed!
To be clear, a container is a small core of an operating system that contains only the OS services needed for the application to run. If I need to run a web server that writes files to the server, I create a container that has web server and I/O services. I may not need or want any messaging or scheduling software. What I do not specify, does not get created.
Docker files require that everything needed on the server to run your application be specified in the container setup. To test your application, you need a developer workflow where the developer compiles, tests and runs the application. The beauty of the workflow that looks like this is in the requirement of deploying your container. By deploying a container in a development workflow, the developer is essentially running tests on the server they specify, even though the server is a local instance that spins up only when needed. If done correctly, this means there is no “works on my machine” syndrome.
This type of workflow requires developers to exercise discipline around isolation. When writing an application and specifying the OS requirements, thought must be given to the design. The quick feedback loops allow for emergent design using coding rather than architecture diagrams. All of this happens using source code repos, continuous integration and other practices.
Using a containerization tool like Docker enables developers to achieve a mature practice of developing in isolation. It assists with disciplines like continuous integration and helps discipline your development staff. In the end, it is a toolset that aids teams in good software engineering disciplines. Your organization continues to need to encourage these good engineering practices.