Wednesday, September 2, 2009

A Software Development School Idea

People who have talked to me (including late-night, heated discussions at Agile2009) know that I'm not a huge fan of the current training system, neither the computer science degree nor the way that new developers are brought into our industry. If you've been following me or spoken with me, then you've most likely heard how I prefer the mentor/apprenticeship model of training. I've had a lot of conversations with people along the way about apprenticeships, including some recorded ones. Ken Auer greatly impressed me with his sincerity and passion about the idea, and Jon Kern (video coming soon) also brought come concrete ideas to the forefront for me. These and others have convinced me that there could be a viable model for a hands-on, apprenticeship-style school for learning software development.

The basic structure would be a workshop doing custom software development for small businesses. The primary emphasis would be on the training of apprentices, much like a dental school. You know how you can go to a dental school and get your teeth cleaned for a less money than you would pay if you went to an experienced, graduated dentist. You are still going to get your teeth cleaned, although it might be a bit slower, perhaps a slightly lower quality (not always, though), but, in the end, you are going to have clean teeth.

I'd like to digress for a second to address the 'slightly lower quality' comment. I like JB Rainsberger's definition of quality: the marginal cost of adding features. This isn't about bugs or lack of functionality, this is more akin to the difference in quality between a Sam Adams Lager and a La Fin Du Monde; they are both good beers, but the La Fin Du Monde is a higher quality (in my opinion). Bugs are more like buying a beer and finding a mouse in it; unless you are Bob and Doug McKenzie, this is not a recipe for hilarity and success.

While the emphasis will be on hands-on development of real projects, there will also be a goal of making sure the apprentices learn the history of our industry, the names and contributions of those who have come before us. After all, it is hard to stand on the shoulders of giants, when you don't know who they are.

The main goal of the school would be have 2-year apprenticeship programs, where people can come and learn under the tutelage of experienced software developers while building real products for real clients. After they leave, companies that would hire them will know a certain something about their skills and experience. I emphasize that they will not leave as experts, more as developers with a solid understanding of certain development techniques.

There is more to the idea, and it is constantly evolving, as I meet and discuss this with more people, getting different perspectives and opinions. But, I wanted to put this up to share with everyone the thoughts, as well as perhaps get a bit of larger-scale discussion started.

I will be writing more about this as time goes on, but I wanted to get the ideas out there.


  1. Let me just say that I'd be the first one in line to enroll.

  2. This is something that I've been giving thought to as well. A concept that the Medical industry has is of "Teaching Hospitals". So while you are not yet an attending MD you are still working on real cases and being guided.

  3. There is definitely a need for changes to the software development educational model. Two quick points: 1. 50% of what I've learned about software development I learned from a mentor I spent only 4 months with, 45% I learned myself from building on what he taught me and 5% I learned via my CS degree. 2. Of my 10 favorite software development books, 0 were part of my computer science coursework.
    Thanks for bringing up this topic.

  4. Your example of Dental School implies that the students will still have had some education of theory (i.e. "computer science") and this new school would be learning the actual application?

    Or am i misunderstanding?

  5. Sounds excellent to me. I've certainly met a number of people over the years who would like to learn how to develop software but don't know how to go about doing it while supporting a family. I'm hopeful that you'll be able to come up with a business model that's sustainable long term. Can't wait to see how things progress with the idea.

  6. I taught myself everything I know about software development. I've been doing this for two years now (I was originally a sysadmin). The point is, I'm self-taught, have no CS degree, and I've been doing this less than two years.

    I met 7 guys working on their Masters in Computer Science and talked to them for hours about software development. They were amazed! They were so excited to talk to me. They didn't know the difference between dynamic and static languages. They didn't know anything about patterns or best practices. They knew the basics of OOP through C++ and Java. I was mortified.

    They have spent lots of money and 6 years in school and the only thing they had learned was that C++ is the best language because of "how performant it is". They don't even know what performant means!

    All of that being said, I think this idea is fantastic! I would love to have an easier way to get into an apprenticeship. I don't know anyone in my area (Fort Worth, TX) that would even consider something like this.

  7. I think Dave Astels tried to start something like this prior to joining Google. Not sure where he got with it, but I'd be interested in his perspective.

  8. Generally I agree and think this is a good idea. I also think some coursework intermixed with hands-on is worthwhile. Re: hospital residents - they still do 3-4 years of medical school before. While my CS courses are rarely of immediate applicability to my day-to-day work, they did make me aware of big picture concepts and foundational ideas that I think SW professionals should know. Four years is overkill but maybe equivalent of 2 semesters done over a 2-3 year working apprenticeship?

  9. Hey Corey,

    As someone who's had to mentor a lot of recent CS graduates on TDD, Refactoring, and Clean Code I have to agree.

    However, I don't think any of the people I've dealt with (myself included) regret doing their degrees. I don't think that the college/university experience is something that we can compete with.

    It seems like a 2-year program would still fit well within a university. I know that at my school, medicine required that you take two years of general classes, followed by enrollment in a medical program. Maybe a software school could adopt something similar in order to provide a more well-rounded education?

  10. Cory, this sounds like an excellent issue. But I don't want this discussion to devolve into a "traditional school sucks". Your Software Development School, aka Software Apprenticeship, is a great idea for teaching the Application of Software Engineering. However, I think there is still room for a school environment that teaches the *tools* you will use in the apprenticeship. These tools include: algorithms, data structures, computer architecture, etc.

    My college, RIT, had a great example of this (it was by no means perfect, but a good start). We had traditional classes, where we learned the tools. But then we had "co-ops", where the students went out and worked for 9 months at a time. By work, I mean were actual employees at actual companies working on actual products. This was an excellent component to my education, for many of the reasons you cite above. It wasn't a formal apprenticeship, but it was darn close.

    However, I would have failed miserably at my co-op had I not been trained in the low level tools like recursion, linked lists, or just what the heck happens when a CPU talks to RAM.

    In summary, +1 for the apprenticeship program! However, I'd prepare those apprentices beforehand with some low level instruction on the tools they will use.

    As a software professional now, I'd love to mentor and train an up and coming developer. But I don't want to be explaining what an array is.

    Cory, keep up the good work! Hope you make it out to Hawaii soon!

  11. Yeah, I really like the idea of moving away from the current practice of education in our field. It seems as if we have a huge disparity between what is taught in school and what we, as software developers, do on a day-to-day basis.

    It is not surprising. We didn't go to school to learn how to develop software. We went to school to learn Computer Science. The key word here is "Science". Theory, not practice. Not to say that theory is useless... just that it doesn't focus on many aspects of software development that matter in order to produce a good product.

    In academia, we have the concepts of PhD vs Doctorate. What tends to be the difference? PhDs tend to focus on theory where Doctors tend to focus on the practical aspects of the field.

    Music theorists (PhD) tend to study the way music works where Music performers (Doctorates) tend to study how to perform. Think about medical doctors vs medical PhDs. Think about lawyers (Doctorate).

    But here is the disconnect... there is no Doctorate in Software Development. You can get a PhD in Computer Science, which is really useful for certain aspects of the field, but not so much for developing product. Simply put, Computer Science does not prepare or qualify an individual to be a product-producing software developer.

    Why don't we have a Software Development Doctorate program? Why don't we have something like this "Software Development" school? It seems like a good idea to me.

  12. All degree programs prepare the student for the long haul at the expense of immediate industrial skills. The theory that one learns as a computer science undergraduate has a much longer shelf life than knowledge of any industrial language or practice. Universities are not trade schools.

  13. The reason why there are no software development doctoral programs is because a bachelors degree is almost overkill for software development. Graduate programs in software engineering are usually pursued by people who hold undergraduate degrees in something other than computer science or software engineering.

  14. Anonymous:

    Just to be clear, I am not trying to say that I think that "Computer Science" degrees are worthless. I am not passing any judgment on the worth of degree programs.

    I am just suggesting that we follow the patterns that many other fields do: create two paths. One for theoretical studies and one for practical studies. It would benefit everyone to have focus given towards the proper path.

    You say that "Universities are not trade schools". Agreed. But Universities also often prepare students for the type of work they expect to do when they get out. Lawyers, for instance, are trained more about how to practice law. Medical school is the same way. They are programs to prepare the individual for practicing the skills they learned in the University.

    We are all practitioners. Although I value my experiences for different reasons, my BS and MS in Computer Science did nothing to help me be a better practitioner.

  15. I'm highly disappointed with the education system in general.

    Some careers might prepare students better for the real world, with certifications such as Doctoral programs, but I still don't think we need 5-7 years to learn a career. Maybe it's the methods, resources or the teachers themselves, but something is fundamentally wrong...

    Using a mentor/apprenticeship model, sounds very cool, condensing knowledge and feedback allowing the student to learn much faster (whilst maintaining the mentor sharp and exposed to new findings by the apprentice)

    Great initiative!

    May I suggest videos (peepcode style) as an optional/compulsory course at your school? :) Never had any of those at my schools, but I think I've learned the fastest with this kind of visual learning.

    Oh also, good tools for making custom and rapidly available references to commands (cheatsheets), maybe through a personal wiki.

  16. I think there's a caveat, and that is the 10% of the useful knowledge I gained from a CS degree would have taken me years to learn on my own. Furthermore, the lack of that knowledge would bury someone who encountered a problem that required it in the real world.

  17. This post has reminded me about UK day release apprentice schemes, and whether we could develop one for software craftsmen?

  18. I've been thinking something along the same lines, just proposed some initial ideas. The basic concept is to work together, remote or not on pairing on a live app, something similar to mano a mano, though remote with them is not something they considered yet, so I had a hard time getting involved with that project. Still makes sense to contact them as they're the genesis of the idea and have more experience.

    My idea is to build on the basic foundation they've laid, as a non profit organization using open source friendly people to build that out. I'd like to take that concept and have a for lack of better terms (uber|meta) umbrella project for projects dedicated to various causes.

    Long comment, and I'm ending it shortly. Projects have mentors to bring people in, they're obviously part of the uber project and dedicated to helping people out both to learn Ruby, Rails, and get involved in helping people out as a remote team.

  19. Thanks, everyone, for the comments, ideas and suggestions. I'm going to be consolidating all of this into another blog post, so we can continue the conversation.

    I am really encouraged by the community involvement in these ideas, and especially by the constructive nature of everyone's commenting. Thanks!

  20. I taught community college computer science and web development for 7 years. In the summers I worked as a contractor to gain 'real-world' experience. This allowed me to teach what I learned over the summers in the classroom. Towards the last couple of years of teaching I worked at nights while I was teaching because I enjoyed it so much. To me I saw a lot of teachers take the easy road: picking canned curriculum that laid out non-useful material, have a work study student grade for them, etc. while they go home early. This was frustrating to watch. I usually picked industry books and used them for reference while I created custom curriculum every quarter because of technology changes. I did not picked canned textbooks. They drove me nuts being out of date and out of touch with software engineering. I kept a class blog where I would post my notes, source code from lecture, screencasts. Even the public could have access to my curriculum (and they did). I worked my tail off late into the afternoons and evenings every day to prepare the best and most up to date lecture I could give. I was also the lead instructor/advisor for the Software Development Program I taught in. We had an internship class setup at the end of the degree but it was not enough. Our intention was to get our students hooked up with a local business they could work with. A few of them worked out but most of them seemed to fall short of what I wanted out of it for my students. Many companies, where I'm from anyway, do not believe in agile practices or open source. I taught Java, PHP, Ruby, and Rails. It was tough to find a match. A lot of companies stick to what works and typically are using technologies that are not as new as what my students were learning. A lot of times I had to resort to creating my own projects for students to actually apply what they've learned to a pseudo-real project. For teachers in traditional environments it is hard not to get sucked into the status quo. I basically rebelled (my nature I guess) and did a few things to keep my degree kick-butt: use industry books (not textbooks), moonlight on the side and keep your skills fresh, create curriculum and make it public (blog, github, etc.), and create screencasts = students love to learn that way!!!. I've been out of teaching for almost 3 years now. I miss it at times especially investing into students lives and giving them a foundation to be continual learners and researchers. I am enjoying working full time doing Rails stuff. Some things I am doing to continue to help new developers is by investing my time into Rails Tutor and making my self available as a Rails Mentor both I think stemmed from the great collaborative work being done at RailsBridge I hope some of this helps. I like the idea of apprenticeships or whatever avenue works to invest into future developers. Cheers!

  21. I created a blog post where you can read my response: "Improving Traditional Software Development Education".

  22. Pretty much everything I learned about software engineering was from analysing the Mozilla and ATG codebases. It wasn't so much learning from people, as examining what they did and why. Some things were more obvious than others, but after a while you could tell the quality -- it was a question of "how much do I have to poke under the hood of the interface in order to do something useful?"

    Since then, I try to write all my code with the idea that you shouldn't have to poke under the hood... but if you do, here's how to do it.

  23. I've had a go at taking this further and seeing if I can map medical training ideas to software development. Came up with more questions than answers though, take a look here -

  24. Oops, just spotted typo in above URL, should be

  25. I couldn't agree more! In Sweden we have a two year vocational education and large amounts of time spent in companies. I've got an degree from one of the schools and i have to say i learned nothing during class if i were to compare it to the time working with real projects with real needs.

  26. Sounds really exciting so far! Seems like it will be interesting to see what this conversation develops into. Depending on how the idea is implemented, I would be interested in participating...

  27. When can I sign up ;-)


Please don't post anonymously; I won't use your name/url for anything insidious.
Comments by Anonymous are not guaranteed to make it through moderation.
Constructive comments are always appreciated.