Development practices are just as important as the code itself
I always thought I was a good programmer. Changes to my code always consisted of making a change, hitting save, then compiling. And that's it. If a change was made that ruined everything, I could not rollback.
That was bad.
This is my journey.
|We've all been here.|
Version control opened doors for me. It allowed me to stop worrying about saving edits.
I could finally code without worry. I no longer had copies of copies of files in a folder just in case.
Branches for days and Git-flow as my train tracks.
Github is awesome for git. It is a effective platform for healthy and productive collaboration.
Commits can be diff'd in a simple interface, repositories can be forked and merged with ease, and it makes managing a project that much easier. Most of my projects are hosted on Github now.
Issues and milestones integrate very well with repositories.
I discovered waffle.io, a startup dedicated to created kanban-style boards for Github issues.
It was designed to work with Github issues and help visualize them in a progress board fashion.
This is perfect for large projects where keeping track of who is doing what is vital.
I've even heard of companies using github issues as their ticketing system for helpdesk.
Continous integration takes code that developers commit and builds it with the mainline.
This process can detect bugs and issues without user intervention. It prevents merging in broken code.
Once it is set up (and setup is extremely easy) it can be an integral part of development.
Travis-ci is a popular continuous integration tool that can seamlessly integrate with Github projects.
All pull-requests can be automatically tested against the mainline to test if it is safe to merge.
Virtualization is something I've always done. I'd make various virtual machines to do various tasks. I never thought about it in development until I realized that my friends ran windows and I ran linux. I'd say, "Well just run a virtual machine with apache, php, and mysql". It was always a hassle, and never really got anywhere. They would install different packages like nginx or an old version of php.
I then found out about Virtual Private Servers (VPS) and Digital Ocean. A VPS grants to ability to run a virtual server with popular operating systems and a public IP.
Their API allows for creating these VPS's with a few commands. It's very similar to Amazon AWS EC2 instances, but way less to learn.
They cost money though. But it does allow for a quick and easy way to bring up a public box to show code or develop on.
That's when I learned about Vagrant.
This awesome tool let's you deploy a virtual machine, install software, and run commands all with a config file and 'vagrant up'.
Developers can just clone your code and type 'vagrant up', and have a virtual machine complete with the exact software as everyone else working on the project. It is designed to be portable and reproducible.
Vagrant is awesome. It has plugins to deploy onto Amazon EC2 instances, Digital Ocean, and various other virtualization platforms.
It creates an operating system independent application, defeating the age old "Works on machine" argument.
Docker creates a quick and easy virtual environment utilizing linux containers. A file much like a vagrantfile is created that has all the specifications and commands for the VM to run on install.
It is very fast to build your application into a container. It even allows to diff entire containers for changes. These containers can be sent to other members of the team for testing and QA.
Docker is being used in production to deploy applications more and more now. With operating systems like CoreOS, creating a fleet of deployments is simple.
Having the same configurations across a distributed environment running your application would be a difficult job without tools like Puppet.
This tool audits each node, and enforces changes based on templates.
Going from development containers to production can utilize tools like Puppet to get the job done.
DevOps is more than just tools. It's also a mindset. Developers working with Sysadmins to create a environment that's conductive to creating the product. Everyone is on the same team, so why not use that to your advantage?
Companies like Etsy and Spotify have created processes and tools that are almost completely automated and will not push broken code to production. It makes going from development to production as painless as possible. New hires can push to production on their first day.
All these tools have way more features than I listed. I just gave an oversimplified overview of how they contribute to the process.
Github - Fimiwal is a project that I started that is utilizing each of these tools and strategies that I mentioned here. It only took a few extra steps to setup, and working on the project is extremely easy because of it. Less time is spent working on the environment, and more time is spent on the code.