



I’ve seen a lot of questions recently by programmers on Slashdot, Reddit and Stack Overflow basically asking:

I’m writing code, but I’m not very good. What can I do to change that?

For people in that position who already have a bachelors degree (but not necessarily in software engineering or CS), I’d suggest a little known educational gem. The ALM in IT degree focused on software engineering from Harvard’s Extension School is an excellent program that will often meet the needs of people who find themselves in the position above. It offers a good education and it one of the least expensive ways to get a master’s degree for someone interested in software engineering. In this article I want to describe the program, my experience and go through class by class and discuss what I found useful.

I completed a master’s degree (ALM in IT) from Harvard with a concentration in software engineering last year. Most of my classes were taken online. I’ve written about what it was like getting an online degree, but I wanted to write up something a bit more focused on programmers who are looking at possibly getting a master’s degree and would be interested hearing about Harvard’s online master’s degree programs.

ALM in IT Degree with the Software Engineering Concentration

The ALM in IT degree is a master’s of arts degree. It isn’t a master’s of science like you’d get if you went to the engineering school. The required courses (see below) were similar to what I’ve seen in many master’s of science degree plan sheets at state schools. If you want to be a computer scientist, this isn’t the best degree for you. If you want to be a better software engineer, it is ideal because it allows you to choose a good balance of practical classes in current technologies (Java, XML, distributed computing, etc.) with the more theoretical classes (algorithms, theory of computation, etc.).

This balance keeps the program accessible to people who don’t have a heavy computer science or math background. If you are writing programs, but don’t feel like you are doing “software engineering” you probably have sufficient background to be successful with some hard work and perhaps an extra course in discrete mathematics.

Admission to Harvard’s Extension School

Admission to the Harvard Extension school is simple and very different from the normal competitive college admissions process. You take three classes toward the degree and then apply for admission. As far as I’m aware, the successful completion of the three courses with B or better is the main criteria for admission. There isn’t a panel of people looking over your application and rejecting this person because they didn’t have enough extra-curricular activities. You must be proficient in English, have a bachelor’s degree and enough of a background in what you are wanting to study to have a reasonable chance of success. It appears that your ability to pass three courses with a B is probably going to demonstrate most of those skills.

This is an interesting approach because it is very much based on your ability to actually do the course work. The Extension School can do this because their online classes allow them to scale to a much larger number of students than what you’d experience in the other Harvard schools.

Online Master’s Degree / Residency Requirement

To be clear, Harvard doesn’t offer any degrees that are completely done online. Even the degrees where the majority of the classes can be taken online have a residency requirement. For the ALM in IT program, I had to be on campus for one semester. Fortunately the summer 8 week semester counts toward the requirement so that is what I did. It is a lot easier to work out an 8 week leave of absence or telecommute arrangement with your employer than it is to try to take off for an entire semester.

The Master’s Degree Classes

My degree plan required 10 four hour courses. Below are the classes I took for the ALM in IT degree. I’ve tried to list them in roughly the order I took the classes from start to finish. Some of my choices were influenced by what was available and also the need to take a certain number of classes from Harvard instructors as opposed to the classes taught by adjunct faculty.

After I started the program, they made a change so one of the three courses you complete for admission must be an algorithms or computational theory course. This is a good thing because you don’t want to get clear to the end of your program only to discover you can’t pass one of the more theoretical classes.

Java for Distributed Computing CSCI E-160

This was was a bunch of firsts for me. It was the first class I had taken on Java, the first class I had taken online, the first class I took at the Harvard Extension School and my first graduate programming class. While most classes that introduce you to Java focus on just learning the language, this class assumes that you can pick the language up without too much effort so after a short introduction to the JDK, classspaths and syntax, it gets into distributed computing using RMI.

The class was fascinating and I was impressed with how much material we covered in such a short period of time. The teacher was very interesting even if he did tend to occasionally veer off on rabbit trails. (We had one optional lecture on jazz music.)

If you are wanting to learn Java, I’d highly recommend this online course because it focuses on actually doing stuff with the language instead of beating people over the head with the syntax. If you have no programming background, it probably isn’t the best place for you to start.

Distributed/Enterprise Computing CSCI E-162

When I signed up for this course I still wasn’t sure if I was going to actually pursue the degree. I wanted to get a but more exposure to Java so learning about Java EE seemed like a good next step. The class was well worth my time and I learned a lot, but a lot of what I took away from it was that I’m not that interested in doing pure Java EE programming–particularly Java EE the way it was done when I took this class.

The class was actually focused on distributed computing and Java just happened to be the programming language that was being used to illustrate those concepts. So there was a lot of discussion about the the theory of how distributed computing works followed by the actual application of implementing those things in Java EE.

Even if you don’t plan on doing any type of distributed development, this class is well worth the investment of your time because any Java programmer is going to run into aspects of EE regardless of what they are working on. This class provides a good foundation.

Design Patterns and Java CSCI E-247

This class covered design patterns and software design. It used Java and required quite a bit of work with UML diagrams. Looking over my notes, it looks like most of the programming projects involved working with directed acyclic graphs–what you use to create a project management flow chart. The code included things like writing Iterators to navigate the graph and Exceptions if you tried to create some type of illegal cycle.

The idea was to work through a set of assignments where each on built on the previous. If you used what you were learning in the class it was easy to do each assignment because your code was decoupled and easy to modify. If you didn’t make good use of design patterns you ended up having to tear out large sections of your code and redo it. It was a good experience because it modeled real life, but in a setting where you could carefully observe and learn from the consequence of each design decision.

Communication Protocols CSCI E-131B

I took this class because I had been doing quite a bit of work in networking. In retrospect, I think I’ve used less of what I learned from this class than some of the others. Of course, I also went into this class with a great deal of prior experience and training, so it is hard to separate my current knowledge into what came from the class and what came from other experience. In reality, I think the class clarified a lot of information that I kind of knew from my network training, but it really made me think through the process of exactly what is happening on the network.

For example, a typical homework assignment showed a network design with several hosts on either side of a router and asked you to provide a detailed list of exactly how a message was sent from a host on one side of the router to the host on the other side. The correct answer included details about how the application passes data down the stack, the host sends and ARP request, gets a response from the router, enters the MAC address in the ARP table, etc.

The class was interesting, but not as hands-on as the programming classes. My prior experience in networking made the class seem less memorable, but at the same time I have solved some incredibly complex networking problems that drew heavily on the information I learned in this class.

Adv Topics in Data Networking CSCI E-132

Like 131B, I took this online class because I was doing a lot of work in networking at the time. It felt like a continuation of E-131B, but with a different teacher and more of a “survey” course style. One thing I took away from this course is how difficult open book tests can be. I remember the professor saying something about his grading tried to take into account how long your answer was. The more you wrote, the less they assumed you knew the correct answer so they tried to give more points for correct short answers than “cover all the bases” answers.

Discrete Math MATH S-104

Before taking this class, I was trying to make it through Theory of Computation by sheer effort. I eventually dropped Theory of Computation, took Discrete Math and then went back and passed Theory of Computation. Discrete Math didn’t count toward my degree, but it was well worth the effort for someone without a lot of math background.

I took this class during the summer semester when I was on campus.

Web Development Using XML CSCI S-L

This class was very interesting because it was taught by someone who works on the Harvard websites and turns the data in the Oracle database into the static HTML listing every course with links to the prerequisites, etc. My final project in this class was a system that would take an xml file listing book ISBN numbers and my review, download the associated information from Amazon and created a combined XML document. This XML document was then processed using XSL to create a HTML website with an index, category and individual pages. It also used FOP to create a PDF using the same data file.

Interestingly when I applied for my first job where I was going to be programming 100% of the time, this project was what they seemed to be most interested in hearing about. Their product didn’t really do anything with web-services or XML, so I’m not really sure what was impressive about it.

The class had a lot of interesting projects including using XML to generate SVG flags for various nations. We also used some of the Harvard course listings to produce PDFs with hyper linked indexes and Apache Forest and Cocoon to create dynamic pages defined in XML.

The class was a lot of work, and I took it during the summer session so the timeframe was very compressed, but it was very rewarding and the knowledge has been very useful.

Theory of Computation CSCI E-207

For me this was the hardest course out of the entire program. As I mentioned above, I originally started this class and dropped it. I was about 1/3rd of the way through and earning a B, but I felt my foundation was weak and I wanted to take Discrete Mathematics to help shore things up.

If you have a great deal of training in math this class might not be very difficult, but I was coming from a strong background in music composition–which wasn’t particularly useful in this context.

This class was the last time it was taught by Dr. Lewis. From what I understand he was the same teacher who taught the course when Bill Gates took it years ago.

While the class was difficult, it probably stretched my mind more than just about anything else. It was my first introduction to finite state machines, turing machines, Big O, etc. Beyond just computing topics, it changed how I approach business problems in both terms of the process and what is sustainable over the long term. The class was well worth the investment of my time.

The challenge of the class wasn’t so much understanding the concepts, but being able to prove something was right or wrong. Here are some questions from the mid-term. Telling whether the statements were true or false was easy. Proving them was a bit more of a challenge:

P ({n ∈ : n ≤ 2002}) is uncountable. (Recall that P (A) is the power set of A.)

{w : w is a regular expression for {an bm : n + m ≤ 2002}} is a finite language.

I think they have changed the degree plan sheet to require that you take this class or an algorithms class before you can apply for the degree. This is probably a good idea, although if this had been the first class I took, I probably would have assumed that the rest of the courses would be too hard for me to complete.

Practical Perl CSCI E-13

This class was taught by a programmer who worked at Yahoo. It had a very interesting grading process. To submit your code, you had to run some tests on it. If the tests passed, you were guaranteed at least a C. If the tests didn’t pass, you couldn’t even submit your code. With a large class, this kept the teachers from dealing with a great number of submissions that might not even run.

I learned a lot about Perl, but it wasn’t a particularly difficult class. That was good because I took it at the same time I was taking Theory of Computation. As far as usefulness, I haven’t done much with Perl. Still it has been nice to know what I’m looking at when faced with Perl code.

Unix Systems Programming CSCI E-215

This course was challenging, but very much worth it. Most of the exercises were in the form of reproducing basic Unix commands. There were two projects that really stood out in my mind. One was creating a simple web server. The second was creating a curses based pong game.

Software Engineering Thesis ITSE E-499

Probably the biggest problem I ran into was getting a thesis advisor. The process literally took years. In fact, by the time I was first assigned a thesis advisor, my original thesis proposal was irrelevant so I did another proposal and started over again. The thesis consists of a non-trivial piece of software along with a document explaining the problem, design, and implementation.

Personally I didn’t think the thesis was too difficult. The hardest part is staying disciplined to get it done. You layout a plan along with dates and milestones, but it is a different type of work than dealing with class assignments.

My project was a social news/link voting site similar to the concept behind Reddit or Digg. The interesting part was the algorithms that controlled the ranking. The algorithms were designed as plugins that could be loaded or unloaded at run time and different weight could be assigned to each one. Instead of a global rank, each person visiting the site would get a customized front page based on what they were likely to see as good content. Another key part of the project was the way it tried to identify users without requiring cookies or having them log in. It created a unique identifier based on their ip address, browser headers and other pieces of information. It also retrieved links from RSS feeds instead of relying on end users to submit links.

The basic idea of the project was to create software that would let you run a useful social news site with a much smaller number of users that what you’d need to successfully pull of something like Reddit or Digg.

The programming project definitely wasn’t the hardest programming I’ve ever done, but it did cover a lot of ground when it comes to demonstrating a mastery of the software engineering process. The project used unit tests as well as Selenium tests and the builds were triggered by a continuous integration server that would turn on a green lava lamp when the tests were running correctly and a red lamp when they were failing. Cobertura was used to make sure the tests were actually covering the code and I used an issue tracking system to keep track of the bugs and features that needed added. I used Subversion for source management, Maven for the build and Mylyn for what I’d call “context management”.

The prose part of document consisted of the following sections:

Introduction Overview of Link Rank Application Architecture Framework and Libraries Development Process and Tools Users Guide Summary and Conclusions

That was followed by the appendix which was mostly the code listing. All in all the thesis document was 190 pages–about half appendix code and half text.

For many people writing the thesis is extremely difficult. In fact it isn’t uncommon for people to get all their coursework done only to get stalled on the thesis. I think I had an easier time because I spend a lot of time writing.

Real Degree?

A lot of people wonder if it is really a degree from Harvard. Yes it is. You get a Harvard diploma (in Latin) just like everyone else. They did start adding a phrase that basically means “in extension” to the diploma after I started the program.

There are some people who complain that the Extension graduates aren’t really Harvard graduates. Their objections usually fall into one of two categories. The first is that Extension students don’t have to go through the same competitive selection process. The second is that they don’t have the social experience that traditional students get.

Obviously there is truth to both of these objections. The application for admission is merit based which means if you can do the work, you can get admitted. It isn’t like there are 100,000 people competing for 15,000 spots. Personally I like the objective based approach where your admission is based on your proven ability to successfully handle the coursework. However, if a good part of your identity is wrapped up in the idea that “I’m special because I was admitted into a school that turns down lots of other people” you might not like the Extension School’s approach.

As to as whether or not it is a real “Harvard experience,” there are obviously interactions and networking that you don’t get like you would on campus. The residency requirement helps some, but it is much more limited. I wouldn’t recommend getting a bachelor’s degree online because the college experience is so important to kids fresh out of high school. However, if you are like me and going back for a second master’s degree, you’ve probably already acquired most of your social skills and your focus is more on the class content than the other experiences.

If you see the Extension School as a way to “sneak into Harvard” and get around the stringent admission process at other schools, you are probably going to be disappointed. If you are concerned about whether or not people will know you took your classes online, you probably aren’t going to be a good fit for the program. If you are the type of person who would sell yourself in an interview as someone who was able to complete a difficult online distance program while holding down a full-time job, the Extension School degrees are likely to be a very good fit.

Cost of the ALM in IT Degree

So how much does it cost to get the ALM in IT degree with a concentration in software engineering? The program consists of 10 4 hour courses if you do a thesis. (I think there is a newer 11 course program that forgoes the thesis as well). The classes cost $400 to $500 per credit hour so you are looking just under $20,ooo in tuition. By the time you add in lodging and travel for the residency requirement, books, etc. you are likely looking at $22,500 to $30,000.

All in all this is a pretty good deal. It is in line with the cost of graduate programs at many state schools. By way of comparison, Columbia has some similar programs, but their cost is is over $1,300 per credit hour, plus an additional $375 per course. So a four hour course from Harvard Extension school would cost $1,600 to $2,000. A three hour course from Columbia would cost over $4,275. (Columbia’s program requires 10 3 hour courses, so a 3 credit hour course from Columbia Video Network represents the same percentage of the total degree plan as a 4 hour course from Harvard’s Extension School.)

Graduate tuition at KU for out of state students is $691 per credit hour. Residents are only charged $295. The closest degree I could find at KU would require at least 30 credit hours. So tuition would be about $9,000 or $20,000 depending on whether or not you were a resident of Kansas.

The total cost of a degree from Harvard is more than going to a state school where you are a resident, but very comparable or better than the other options. However, the real cost of getting a masters degree is your time. If you have to quit your job to go back to school, that will likely be a greater expense than the tuition you pay. Unless you live right next to a university an have a very flexible work schedule, the Extension School programs are going to be far cheaper than your other options once you account for your time away from work.

In addition, many employers have some type of tuition reimbursement program that can help pay for some of the cost–but it doesn’t help you if you have to quit your job in order to go back to school.

Job Prospects with the ALM in IT Master’s Degree

I only applied for a single job after beginning work on this degree, so I don’t have a lot of experience seeing how it perceived in the job market. The job was my first full time programming position. Many of the classes had interesting final projects and this is what the interviewers asked me the most questions about. Some of the projects I remember discussing:

Writing a simple webserver in C.

Writing a curses based version of the game Pong.

Java distributed computing projects.

XML and webservices projects with Amazon’s data.

The programmers who were in on the interview seemed impressed. I think there were two reasons for this. First, I had taken a number of the projects and expanded the after the class was complete. For example, I had taken the project for the Amazon Web Services and expanded it quite a bit on my own to create a system for keeping track of the books I read. Second, the breadth of experience was great enough that I had experience with certain technologies doing things that the programmers weren’t exactly sure how to do themselves.

The interview went well and I got the job.

My next career move was to start my own company, so I really don’t know the true career impact of the degree on a career working for someone else. However in dealing with clients there is one experience that kind of stuck out. I was working on a project that went much better than the client had expected. They commented, “I guess that is what we get when we contract with someone who went to Harvard.” This surprised me because I had never said anything about my education. However, people talk and the name “Harvard” sticks in people’s memory. It turned out that this client had talked to a friend of mine and said they had contracted with me. My friend said something like, “Oh yeah. Mark is really smart. He even went to Harvard.”

A lot of what it takes to be successful in consulting is getting your name to be the first one that pops into people’s mind when they are looking for someone who can solve their problems. Having the Harvard name attached to you as a consultant isn’t a bad thing.

Conclusion

The ALM in IT program isn’t for everyone, but it can be an ideal fit for a working software engineering professional that wants to further develop their skills. It is relatively low cost and offers a reasonably flexible way of getting a degree while maintaining a full time job.