Updated 1/18: The project is live. See the Calavera Project on Github.
As some of you may know I have a night job as an adjunct for the University of St. Thomas in St. Paul, MN. The class is Software Engineering and Information Systems 660 (SEIS 660), IT Infrastructure. I was recruited after the department chair attended a presentation of mine at the SEI Saturn conference held in Minneapolis in 2013.
The first session of the course ran Spring 2014. I used my book, an ITIL text, The Phoenix Project, and Don Reinertsen's Principles of Product Development Flow. The course was reasonably well received but one recurring theme was a desire for a practical component.
The student body is mostly international, very diverse, and many have no industry experience. There is a surprisingly high female percentage. Some are using the program to change careers, while others are coming directly in from undergraduate programs. Discussions such as "An Incident may become a Problem" can seem very abstract, let alone something like a Service Lifecycle.
Providing a practical component (a lab if you will) to the class is not simple. "IT infrastructure" is a very broad topic and there are limits to what can be achieved in one semester. I have discussed with my students the various kinds of industry training available, but a class like this can't delve very far into the internals of Linux administration, SAN, middleware, etc. That stuff is best suited for commercial training (e.g. 40 hours learning basic and advanced EMC storage array management).
There is also a need to keep a strong "management" component to the course - not hands on system management, but higher order "business" matters of resources, skills, budgets, portfolios, performance, and so on - the "business of IT."
As a hands on component, I started to think not in terms of individual infrastructure components, but rather asked myself: could I simulate an IT organization?
I started thinking about DevOps and realized that it would be relatively easy to set up a complete DevOps pipeline as a series of virtual machines (or Docker containers). The actual product - the delivered software functionality - need not do more than say "Hello World" (say as a Java servlet-generated, Apache Tomcat-delivered web page). The students have solid coverage of software development in other classes. This class needs to ready them for real world industrial environments.
In thinking about the simplest thing that could possibly work, a three-node system seemed a good starting point:
- Developer workstation
- Mainline development environment
- Production environment
You will notice the absence of a "test" environment. That is because unit tests are run against mainline dev and we will defer system testing to a future iteration. As a "simplest thing that can possibly work" I propose that this is sufficient. Thoughts?
What I call a "control plane" is also necessary:
- Source control
- Build management
- Deployment engine
- Configuration management (e.g. Puppet)
I considered whether a package repository was necessary for the most stripped down implementation and opted to defer it to future iterations. However, source control, build and deploy automation and some form of infrastructure as code capability are essential. We are leaning to Puppet for server config, Git and Hudson/Jenkins for build management, and are still considering if we need separate deployment automation. Thoughts?
Green: managed computing environments
Yellow: control plane
This is just the first iteration. I have some crazy dreams for where this simulation could go, including a reference implementation of higher order systems and interfaces such as those suggested by my book , ITIL, COBIT, and IT4IT, and even potentially using it for dynamic modeling, e.g. Monte Carlo analysis ala Troy Magennis. The idea is that we can understand IT frameworks better by "keeping it real" with a foundation in a real (if simulated) IT operating environment. For example, we could set up a shared resource such as a database and demonstrate the need for change control through having one team break another's product.
Finally I am seriously considering starting an open source community of some kind, as I would think that "DevOps in a box" might be relevant to many people involved with training and education in the IT space. We could do a lot with a collaborative community. Anyone interested? Is anyone already doing this? I did some Googling and reviewed a number of other academic programs but did not see anything quite like this.
Very interested in corresponding on this. I have made a commitment to this journey and am very excited by the potential here.