Whether my decision was sound is to be determined (it certainly came with significant compromise). I have only been back in school for a month and I certainly cannot tell yet. However, there are some things about the state of the software industry that are beginning to make sense.
I should step back for a second and provide some context. When I graduated college I, like many, was scared. I had been a good student (especially in Computer Science courses) and had pushed myself more than most. However, I did not feel like I knew anything about what it took to be a programmer. I was aware there were good ones and bad ones, which only made me more nervous because I could not begin to imagine how I would distinguish between them. Which kind was I?
I got an answer my first week on the job. I was not a programmer at all. I was completely clueless about what it was we were doing in the deepest possible way. It wasn't a case of "I didn't know the language/framework/architecture". I would sit and code with people and I could not follow what we were doing or why we were doing it. I was profoundly lost.
Thankfully, through hard work I gradually got better until I became an actual asset to the team. It was an extremely emotional and satisfying journey. At the end of it, however, there was a question nagging me - why did I have to go through this? Did I not invest four years of my life studying how to perform at this job? I'm aware no one learns what they need to do their job at school, but how low are we setting the bar here? From a purely practical standpoint, there was a real case to be made that my undergraduate degree was useless.
So now, backed with whatever wisdom I attained working in the industry, I'm in an environment where I can try to get some clarification on this topic. I have no conclusions yet, just three interesting observations:
1. It is bizarre how little coding we do.
It has been a month and I have only needed to code about 20 simple lines of AMPL. That's considering I have 6 subjects. Yes, there are projects coming that will involve code. Yes, coding is not really what computer science is about. Still, it does provide some insight into the original question of why I was so lost.
2. There is a lack of stress on code quality.
Take the AMPL assignment mentioned earlier. AMPL is essentially a DSL for specifying mathematical models that can then be solved by a machine (in order to maximize or minimize some objective formulated in the model). To solve a model, the solver requires input data that it can use for simulations. For understandable reasons, if in the input data file you refer to a quantity by a certain name, the model needs to refer to it by the same name. Now, since the data is provided by the professor, they implicitly choose the names for the variables in your model. In this specific instance the model called for a set of materials a particular shipping company was willing to provide. In the data file that set was named M. Other quantities were also given single-letter names (not all of which made sense because the professor is Italian and had used the first letters of the Italian words). This was a problem for me after a while because I kept forgetting which letter stood for which quantity. I ended up just editing the data file with more descriptive names. The result was extraordinary - the whole model almost read like English. I'm posting it here, hoping that it would be clear what it is it does.
set Materials;
param Weight{Materials};
param Volume{Materials};
param Gain{Materials};
param MaxWeight;
param MaxVolume;
var included{Materials}, binary;
maximize TotalGain:
sum{material in Materials} Gain[material] * included[material];
subject to WeightConstraint:
sum{material in Materials} Weight[material] * included[material] <= MaxWeight;
subject to VolumeConstraint:
sum{material in Materials} Volume[material] * included[material] <= MaxVolume;
Even if you do not understand it, it looks like good code, doesn't it? It is interesting that we are not pushed to do this all the time when it is so simple.
3. There are courses where figuring out what to teach is nearly impossible.
Take my Software Engineering course. What practices are there that are accepted in the industry? I can only think of unit testing, and even there it's far from unanimous. The solution in both institutions I have attended has been to mention all the weird things that we are currently experimenting with and then teach some subset of relevant standards. This is clearly not a great start, but it gets worse considering most of the standards are bizarre and of dubious value (I'm looking at you, SRS).
Observing this I have no answers. Actually, it makes me wonder if CS education related at all to what you need in the industry. I think this is an interesting one to try and answer. Therefore, I've decided to run a small experiment - I will try to run my school projects the we would have done in my previous job. That means estimating based on velocity, delivering features incrementally (and reviewing with professors for feedback), TDD, build scripts, acceptance testing instead of documentation where possible, etc. I'm curious to see if that translates into better academic results. I will post here as things come up.




