Software engineering in the work environment has none of the rigor of an “engineering”
This is not an auspicious beginning.
One possible problem is the professors are usually not industry types.
This is the same problem across engineering. In the USA, there’s the notion of a “professional engineer” which is the licensed practitioner. Most professional engineers do not have a PhD. Most engineering PhDs (and nearly all engineering faculty) are not professional engineers.
The list of topics he wants to see taught is very much biased towards building big web services. Many of those topics would be irrelevant for an embedded software engineer. Many of the topics an embedded software engineer needs are irrelevant to someone building a big web service.
Some folks at MIT did some work based on surveying practicing engineers on what they were really using (Study on the careers of MIT Mechanical Engineering undergraduate alumni by Wang (PDF) and the CDIO syllabus). (CDIO = Conceive, Design, Implement, Operate; you will also see DBOM = Design, Build, Operate, Maintain especially in utilities). One of the biggest things that these point out which DeHaan omits is working on projects in groups and interpersonal skills.
I found every single math course useless except for discrete math
There’s a kernel of something correct here. The intro sequence of mathematics in engineering schools is designed to work with classical mechanics. Discrete math is part of the equivalent for computer science. I would like to see every engineer take a good course in probability and statistics, including experimental design. And the two big mathematical gaps I often see that make software engineers struggle are order theory and control of discrete systems.
I have to disagree with the author, by what I understood via skimming the article.
In my opinion, computer science programs (which, from now on, I will call “university”) should teach students the tools to deeply understand what is built today, and prepare them to “push the boundaries of the knowledge” on their field, tomorrow (i.e., when they graduate).
Universities are not vocational schools, so they do not have the duty to prepare “good, well-trained employees that will be productive in a blink of an eye”.
I also disagree with the session “what not to teach”:
What Not To Teach
[…]
In terms of required courses? Math. I found every single math course useless except for discrete math […]
Computer science isn’t about Math.
Mathematics is, generally speaking, about modelling abstract knowledge, highlighting its patterns and predicting outcomes based on inputs.
That is precisely what programmers, in the industry, have to do day-by-day.
In my experience, the poorest programmers I worked with also lacked (applied) mathematical insight, even though they were savvy communicators or “technologists”.
⁂
I like to test this theory changing “computer science” by any other program of an university: medicine, civil engineering, law.
Should a physician know how to communicate with the ward’s staff? Of course.
Should be taught at the medicine school as a subject? I am not sure.
Should anatomy not be taught as a subject? I don’t think so!
⁂
Good-to-have in the day-by-day of the profession is not a must-have in the university: “the market” has, also, the duty to train their professionals in the skill they find useful! (Physicians have residence for a reason, huh? Lawyers and civil engineers also are supervised in their first years for some reason.)
Unfortunately, utilitarian extremists are not able to see it, and it is easy to see why: many of the benefits of the choices in the university are holistic, long-term and “fill many gaps” that an individual may not experience in his professional life. (The power of big numbers…)
⁂
What I do think is necessary is a better professionalisation of the “programming professions”; and as part of it, a reform in the education is necessary: not every cook must be a chef, and I think that not every programmer has to have a computer science degree.
OK, that was quite a messy train of thought. I hope that at least someone can make something useful from the words above.
Yes, that’s why in an ideal world basically everyone who gets a CS degree today (minus an extremely small number of people who love math) would do an apprenticeship instead. The university is a guild where weirdos who like to spend all day reading and writing support their habit by spending ~10 hours a week teaching people and recruiting the next generation of weirdos. If you want to learn to paint like Vermeer, you gotta work in his workshop. If you want to read about how Vermeer was a master of light, his role in perpetuating Dutch bourgeoisie values, etc. you go to university. For some reason, we have CS departments where people who want to learn how to program like Brian Kernighan instead learn from people like Scott Aaronson. It doesn’t make sense. I love reading Aaronson’s writing, but it’s not what I went to school to learn how to do.
I came into software with a physics degree and I don’t regret that choice… in part because it did much of what a good CS degree does: instilled an ability to look at problems with a bunch of unknown unknowns, break them down into fundamentals, and systematically understand and solve them. A focus on pragmatics in the first job I had closed the actual gaps on that front very quickly, and the things I have actually spent the last decade working on are all: CS fundamentals. And I deeply wish my linear algebra course hadn’t been a complete train wreck (of the sort where I dropped it after getting back multiple incorrectly graded assignments). Math and CS fundamentals are things I use indirectly but actually all the time, even though my job role of front end web developer infrastructure might seem far removed from it.
Net, I sympathize with much of what the author feels, but could not disagree more strongly with the actual recommendations.
First off, I get a fair bit of amusement out of how the Orange Site reacts to these kinds of posts, something about people writing “the author doesn’t have a clue, lol. here’s my 2 cents worth of opinion” is just hilarious. So props for creating yet another one of those.
To give a bit of a background about the author, Michael DeHaan is the author and founder of Ansible. According to his LinkedIn, he has been in the industry since 2001, and teaching CS in some form at North Carolina State University (his alma mater) for the past 5 years.
The points he wants to see more stressed in CS education are mostly about how to design better things and communicate those designs and the ideas embedded within them more effectively. He does not state how to achieve those better designs, just that fewer people today possess the required skills. And he thinks there’s too much math in computer science.
If you only skim the headings then this seems completely reasonable and a good idea ™. But I found myself saying “well, it depends” many times. Like sure, not denormalizing your tables is good design, but if I can reduce my code by a factor of 3 because of it, then why not do it? Or: writing code for other people to read is obviously a good thing, but how do you teach that in the context of a 7-15 week course, where the source is put on the backup drive afterwards, to be forgotten 2 weeks after the last submission?
All in all, this is more of a rant than a source of educational wisdom, but if it gets people thinking and talking about improving CS, it’s a win in my book.
I share the author’s desire for CS departments to get off the fence. On the one side is theory and lots of math. On the other is learning mainstream languages, tools, and evolving industry practices for popular fields in the software industry. Neither side is inherently right, but they strike me as somewhat incompatible in how they should be taught and staffed.
When I studied CS in the early 2000s, my department exhibited a similar ambivalence and inconstancy about catering to industry needs described in this article. Looking at it from the faculty’s perspective, I can understand. Catering was useful only insofar as it made the department appear current and relevant from the outside. But it did not fundamentally align with what most of the faculty was interested in. The resulting instruction was therefore something of a wash. On the one hand, the department head bought into the Java hype; hired a decent instructor for their burgeoning intro algorithms class; and added a software engineering methodology class to the curriculum. On the other, the rollout of Java across the curriculum was spotty (many professors stuck with C); none of the full time faculty wanted to teach the software methodology class, so it was taught by a disinterested adjunct from a textbook deeply and unapologetically steeped in waterfall; and code structure and version control in all classes was an afterthought if it was thought of at all.
Many professors were openly wistful of the days when CS was just a specialty in the math department and resented being lumped in with the School of Engineering to which they did not feel they belonged. A few professors expressed the opposite sentiment and treated the major like it was a trade school degree. Their focus on keeping up with industry on the instruction side, however, was no guarantee of grants on the research side, which what the department needed from its tenure track members. In hindsight, it seemed like just about every other department I encountered at my college had a clearer idea of what it was there for than mine. Maybe the grass is just greener, but if I’d known my department had such mixed feelings, I might have picked a different major and learned how to write software on my own time. I’ve had bosses and colleagues who are excellent software engineers who majored in everything from biology to music.
I’m curious if there are any Germans here. I’ve heard that there is less stigma and class distinction associated with trade schools that focus on practical skills there than in countries like the US. My information comes from my memory of a German language textbook that was already dated when I studied it, so please forgive my naïveté. Is that still true? Does that apply to software engineering? If so, are software trade schools effective?
I’m curious if there are any Germans here. I’ve heard that there is less stigma and class distinction associated with trade schools that focus on practical skills there than in countries like the US.
Hiya, German here. We have a three-tiered tertiary education system, in order of increasing academic reputation:
apprenticeships, where you have alternating phases of practical on-the-job learning and vocational school education,
universities of applied science (“Fachhochschulen”), which have less strict entry requirements than general universities, and focus more on the practical aspects, often having people with actual work experience as lecturers (who might not have a higher university degree),
and universities, which have the classical Bachelor -> Master -> PhD -> tenure track pipeline.
Back when I was studying informatics – what CS is called in Germany – and entered the job market as a working student, it was indeed general knowledge that 90% of the people whose only experience was doing a Bachelor at a university could not code properly. The practical skills were assumed to be inversely proportional to the academic level of education. But, and this is a big but, while people from an apprenticeship background most assuredly have much more experience in the day to day work of programmers, leadership positions still are mostly given to people with the “right” degree.
The advantage people from a more practical background have exists for maybe the first 3 years of a career. After that people from a university background will be preferred by hiring managers. And for some reason it matters what kind of degree you have for the level of compensation you can demand.
I read this in detail and I liked it quite a lot. Especially “how to test and what not to test”, it’s all about reality and not obsessively tweaking a test coverage percentage figure upwards.
I did feel a bit sceptical when I got to this part early on:
Software engineering classes can try to teach the project management and maintenance of a large application, but it is going to be a simulation no matter what happens. So my theory is maybe they shouldn’t try. Instead teach how to program so that maintenance isn’t a concern.
‘cos that’s clearly extremely difficult, largely down to lots of experience and exactly the core of the problem, and plenty of people seem to think that their method or approach is a silver bullet. But he went on to discuss a really solid range of contexts and the associated approaches that he’s learned to favour over time (and experience) and clearly recognises this is obviously just as complex as it seems so there won’t be any silver bullet - and that a whole range of munitions made out of a variety of elements and alloys will be required.
It’s a tough subject with no simple answers, but after a single read-through this does seem wide-ranging and joined-up enough at least to start to address it, by emphasising what he sees as the key (core?) areas that would help to improve skills and outcomes in the real world.
What the author describes here is what some programs are calling “Software Engineering” such as this one https://catalog.uwf.edu/graduate/computerscience/#specialization_computer_sciencetext. Yes, it is a specialization for the MS program but I liked how practical and accessible the program is. I for one would like to see more programs like those. I do wish I had taken more computer sciency courses, but I am glad that I was able to learn what I learned in that program, as I did not have a CS BS (which is a requirement for most CS masters). It was also very affordable as a Florida resident.
This is not an auspicious beginning.
This is the same problem across engineering. In the USA, there’s the notion of a “professional engineer” which is the licensed practitioner. Most professional engineers do not have a PhD. Most engineering PhDs (and nearly all engineering faculty) are not professional engineers.
The list of topics he wants to see taught is very much biased towards building big web services. Many of those topics would be irrelevant for an embedded software engineer. Many of the topics an embedded software engineer needs are irrelevant to someone building a big web service.
Some folks at MIT did some work based on surveying practicing engineers on what they were really using (Study on the careers of MIT Mechanical Engineering undergraduate alumni by Wang (PDF) and the CDIO syllabus). (CDIO = Conceive, Design, Implement, Operate; you will also see DBOM = Design, Build, Operate, Maintain especially in utilities). One of the biggest things that these point out which DeHaan omits is working on projects in groups and interpersonal skills.
There’s a kernel of something correct here. The intro sequence of mathematics in engineering schools is designed to work with classical mechanics. Discrete math is part of the equivalent for computer science. I would like to see every engineer take a good course in probability and statistics, including experimental design. And the two big mathematical gaps I often see that make software engineers struggle are order theory and control of discrete systems.
I have to disagree with the author, by what I understood via skimming the article.
In my opinion, computer science programs (which, from now on, I will call “university”) should teach students the tools to deeply understand what is built today, and prepare them to “push the boundaries of the knowledge” on their field, tomorrow (i.e., when they graduate).
Universities are not vocational schools, so they do not have the duty to prepare “good, well-trained employees that will be productive in a blink of an eye”.
I also disagree with the session “what not to teach”:
Mathematics is, generally speaking, about modelling abstract knowledge, highlighting its patterns and predicting outcomes based on inputs.
That is precisely what programmers, in the industry, have to do day-by-day.
In my experience, the poorest programmers I worked with also lacked (applied) mathematical insight, even though they were savvy communicators or “technologists”.
⁂
I like to test this theory changing “computer science” by any other program of an university: medicine, civil engineering, law.
Should a physician know how to communicate with the ward’s staff? Of course.
Should be taught at the medicine school as a subject? I am not sure.
Should anatomy not be taught as a subject? I don’t think so!
⁂
Good-to-have in the day-by-day of the profession is not a must-have in the university: “the market” has, also, the duty to train their professionals in the skill they find useful! (Physicians have residence for a reason, huh? Lawyers and civil engineers also are supervised in their first years for some reason.)
Unfortunately, utilitarian extremists are not able to see it, and it is easy to see why: many of the benefits of the choices in the university are holistic, long-term and “fill many gaps” that an individual may not experience in his professional life. (The power of big numbers…)
⁂
What I do think is necessary is a better professionalisation of the “programming professions”; and as part of it, a reform in the education is necessary: not every cook must be a chef, and I think that not every programmer has to have a computer science degree.
OK, that was quite a messy train of thought. I hope that at least someone can make something useful from the words above.
Yes, that’s why in an ideal world basically everyone who gets a CS degree today (minus an extremely small number of people who love math) would do an apprenticeship instead. The university is a guild where weirdos who like to spend all day reading and writing support their habit by spending ~10 hours a week teaching people and recruiting the next generation of weirdos. If you want to learn to paint like Vermeer, you gotta work in his workshop. If you want to read about how Vermeer was a master of light, his role in perpetuating Dutch bourgeoisie values, etc. you go to university. For some reason, we have CS departments where people who want to learn how to program like Brian Kernighan instead learn from people like Scott Aaronson. It doesn’t make sense. I love reading Aaronson’s writing, but it’s not what I went to school to learn how to do.
I came into software with a physics degree and I don’t regret that choice… in part because it did much of what a good CS degree does: instilled an ability to look at problems with a bunch of unknown unknowns, break them down into fundamentals, and systematically understand and solve them. A focus on pragmatics in the first job I had closed the actual gaps on that front very quickly, and the things I have actually spent the last decade working on are all: CS fundamentals. And I deeply wish my linear algebra course hadn’t been a complete train wreck (of the sort where I dropped it after getting back multiple incorrectly graded assignments). Math and CS fundamentals are things I use indirectly but actually all the time, even though my job role of front end web developer infrastructure might seem far removed from it.
Net, I sympathize with much of what the author feels, but could not disagree more strongly with the actual recommendations.
First off, I get a fair bit of amusement out of how the Orange Site reacts to these kinds of posts, something about people writing “the author doesn’t have a clue, lol. here’s my 2 cents worth of opinion” is just hilarious. So props for creating yet another one of those.
To give a bit of a background about the author, Michael DeHaan is the author and founder of Ansible. According to his LinkedIn, he has been in the industry since 2001, and teaching CS in some form at North Carolina State University (his alma mater) for the past 5 years.
The points he wants to see more stressed in CS education are mostly about how to design better things and communicate those designs and the ideas embedded within them more effectively. He does not state how to achieve those better designs, just that fewer people today possess the required skills. And he thinks there’s too much math in computer science.
If you only skim the headings then this seems completely reasonable and a good idea ™. But I found myself saying “well, it depends” many times. Like sure, not denormalizing your tables is good design, but if I can reduce my code by a factor of 3 because of it, then why not do it? Or: writing code for other people to read is obviously a good thing, but how do you teach that in the context of a 7-15 week course, where the source is put on the backup drive afterwards, to be forgotten 2 weeks after the last submission?
All in all, this is more of a rant than a source of educational wisdom, but if it gets people thinking and talking about improving CS, it’s a win in my book.
I share the author’s desire for CS departments to get off the fence. On the one side is theory and lots of math. On the other is learning mainstream languages, tools, and evolving industry practices for popular fields in the software industry. Neither side is inherently right, but they strike me as somewhat incompatible in how they should be taught and staffed.
When I studied CS in the early 2000s, my department exhibited a similar ambivalence and inconstancy about catering to industry needs described in this article. Looking at it from the faculty’s perspective, I can understand. Catering was useful only insofar as it made the department appear current and relevant from the outside. But it did not fundamentally align with what most of the faculty was interested in. The resulting instruction was therefore something of a wash. On the one hand, the department head bought into the Java hype; hired a decent instructor for their burgeoning intro algorithms class; and added a software engineering methodology class to the curriculum. On the other, the rollout of Java across the curriculum was spotty (many professors stuck with C); none of the full time faculty wanted to teach the software methodology class, so it was taught by a disinterested adjunct from a textbook deeply and unapologetically steeped in waterfall; and code structure and version control in all classes was an afterthought if it was thought of at all.
Many professors were openly wistful of the days when CS was just a specialty in the math department and resented being lumped in with the School of Engineering to which they did not feel they belonged. A few professors expressed the opposite sentiment and treated the major like it was a trade school degree. Their focus on keeping up with industry on the instruction side, however, was no guarantee of grants on the research side, which what the department needed from its tenure track members. In hindsight, it seemed like just about every other department I encountered at my college had a clearer idea of what it was there for than mine. Maybe the grass is just greener, but if I’d known my department had such mixed feelings, I might have picked a different major and learned how to write software on my own time. I’ve had bosses and colleagues who are excellent software engineers who majored in everything from biology to music.
I’m curious if there are any Germans here. I’ve heard that there is less stigma and class distinction associated with trade schools that focus on practical skills there than in countries like the US. My information comes from my memory of a German language textbook that was already dated when I studied it, so please forgive my naïveté. Is that still true? Does that apply to software engineering? If so, are software trade schools effective?
Hiya, German here. We have a three-tiered tertiary education system, in order of increasing academic reputation:
Back when I was studying informatics – what CS is called in Germany – and entered the job market as a working student, it was indeed general knowledge that 90% of the people whose only experience was doing a Bachelor at a university could not code properly. The practical skills were assumed to be inversely proportional to the academic level of education. But, and this is a big but, while people from an apprenticeship background most assuredly have much more experience in the day to day work of programmers, leadership positions still are mostly given to people with the “right” degree.
The advantage people from a more practical background have exists for maybe the first 3 years of a career. After that people from a university background will be preferred by hiring managers. And for some reason it matters what kind of degree you have for the level of compensation you can demand.
Very interesting. So not perfect, but perhaps an improvement over what we have. Thank you!
I read this in detail and I liked it quite a lot. Especially “how to test and what not to test”, it’s all about reality and not obsessively tweaking a test coverage percentage figure upwards.
I did feel a bit sceptical when I got to this part early on:
‘cos that’s clearly extremely difficult, largely down to lots of experience and exactly the core of the problem, and plenty of people seem to think that their method or approach is a silver bullet. But he went on to discuss a really solid range of contexts and the associated approaches that he’s learned to favour over time (and experience) and clearly recognises this is obviously just as complex as it seems so there won’t be any silver bullet - and that a whole range of munitions made out of a variety of elements and alloys will be required.
It’s a tough subject with no simple answers, but after a single read-through this does seem wide-ranging and joined-up enough at least to start to address it, by emphasising what he sees as the key (core?) areas that would help to improve skills and outcomes in the real world.
A good read, thanks for posting.
What the author describes here is what some programs are calling “Software Engineering” such as this one https://catalog.uwf.edu/graduate/computerscience/#specialization_computer_sciencetext. Yes, it is a specialization for the MS program but I liked how practical and accessible the program is. I for one would like to see more programs like those. I do wish I had taken more computer sciency courses, but I am glad that I was able to learn what I learned in that program, as I did not have a CS BS (which is a requirement for most CS masters). It was also very affordable as a Florida resident.