I grew up with Unix (RIP, dmr.) for a long time. Originally, my idea of computing is playing with Unix. In fact, I still say that Linux taught me more about practical aspects of programming than any of my courses.
Two years back, I became involved in a large project where I was closely working with Infra and ops teams. It was a very valuable experience where I could see the impact of each architectural and programming decision we take. I knew all that before, of course, but that project made it much more vivid.
Since then, I have been spearheading a movement in my organization about nextgen application platform which brings the operational and infrastructure view to development. Virtualization, of course, is the key technology that can deliver the synergy.
The big revelation for me is how much of infrastructure knowledge is required to engineer a proper system. We think machines as an abstraction, where we put the code in and they run magically. We ignore the true costs of deploying and running the code. In fact, the wall between the development and operations is the one causing lot of application instability or inflexibility.
Incidentally, if you look at most modern computer companies (like Google, Amazon, Facebook), they embrace this philosophy of erasing the boundaries. The devops people straddle the multiple universes – see the picture below:
What is fascinating to me is this: How the trends become part of collective consciousness. One day the word doesn’t exist and then it seems to be part of every conversation. I think devops is one becoming one such word.
To be concrete, what is devops? Well, there is no one single definition. The goal, though, is clear: to align development and operations so that they can support business agility. How does devops do it? Through a a set of practices addressing the following issues:
- Last mile problems in development: Deployment, testing, configurations, roll outs, integration …
- Non-functional problems in applications: HA, DR, performance, caching…
- Operational aspects of applications: Log file management, log correlation, upgrades, roll backs …
I may be missing some, but by and large, this is the main focus.
What are the tools that support it? Well, as it is a nascent field, there are lot of tools that are being built to support devops. I can only list out a few:
- Configuration management: Puppet/Chef – so that we can automate most of the configurations, including those of applications. Extensible and declarative. It is instructive that these tools came out of people that worked at cloud companies like Amazon.
- Source code control systems: Git and Github seems to be the way most of these systems are developed.
- Monitoring tools: Hyperic etc.
Looks like I can’t enumerate these ones as they keep growing. Just Google and follow the list.
Meanwhile, this is what I can suggest for any developer/sysadmin who wants to become good at devops thing:
- Learn a modern scripting language, or even two: Python and Ruby are the popular ones.
- Learn the existing tools: Start with Git. Use Puppet and so on. Play with a hypervisor.
- Learn standard datacenter components: Learn about storage (Standard SAN). Learn about network.
- Learn some standard deployment architectures: Say,using varnish, HA-Proxy, and caching. Or, site-to-site replication. Or, database backups.
- Learn some web servers: I would suggest in-depth understanding of one web server, say apache, would help a great deal.
- Learn about VMs: Not merely VMware based VM’s, but JVM as well. Understand a little basics on how to monitor, manage, and optimize.
I am also new at devops – but most of the skills that are needed for devops is what an average Unix programmer used to learn in 90’s. It is just old wine in new bottle. Still vintage!