The Purposes of Higher Education
Lots of people who want to learn about programming, or anything else, for that matter, enroll at a college. As I stated previously, I don't think that's the best idea right at the beginning for programmer -- not when you are trying to determine whether or not programming is for you. But what about when you've passed the first couple of stages, and have confidence that you can be a good programmer? Should you go to college then? And if so, how do you pick out a good college to attend?
These are tricky questions, and it's going to take more than one article to answer them. In this article I'm going to lay out my Grand Unified Theory of Higher Education, and afterwards I'll explain how this relates to programming education and your decision to go to college.
Higher education, by which I mean any educational experience intended for people who have graduated high school, has historically served three purposes: academics, training, and gatekeeping.
- Academics encompasses what was traditionally viewed as a "college education," the propagation of culture from one generation to the next, the liberal arts, the sciences and literature, the hallmark skills of the educated person, such as critical reading and clear writing.
- Training is preparation to enter a particular profession, learning the mental or physical skills expected by industry.
- Gatekeeping occurs when there is a hard requirement for a particular credential in a particular career. For example, a teaching certificate is required to teach in most K-12 classrooms.
The legal profession is a good example of how these purposes interact. If you desire to become a lawyer, the first step (after graduating high school) is to earn a bachelor's degree. You can effectively choose any bachelor's degree and major you want for this stage of your pre-professional journey; hence, your undergraduate degree can be focused entirely on academics. Once you complete your bachelor's degree, you will enroll in a law school, where you will receive training in the specific skills required to practice law. After you earn your law degree, before you can practice law you must pass your state's bar examination, which serves the gatekeeping function.
I believe the major underlying source of so much trouble in higher education is that we've muddled these purposes together. We've put all of the purposes under one roof, so to speak, and declared college education mandatory no what the career field. This results in colleges that try to do it all--academics, training, and gatekeeping--which means they don't serve any purpose as well as they should, and students who attend for one purpose are often in trouble when they encounter requirements from another purpose.
More on that later. For now, let's ask: how does all of this relate to our main topic, learning how to program?
When programming courses first arrived on campuses, they were part of what was then a new degree major called computer science. You may be surprised to learn that computer science is really about the science. That is, it serves the academic purpose, rather than the training purpose. Design guidelines for computer science curricula are handed down from the Association of Computing Machinery (ACM) and the Computer Society division of the IEEE. You can see their work at www.acm.org/education/curricula-recommendations. If you skim the contents of the computer science guidelines, you'll see how they've divided up the field, and what they consider "core" parts of any program and what could be left as an elective.
There you see the conflict between academics and training. Consider the knowledge area they currently call AL/BasicComputability (this style of naming looking like somebody was over-thinking the problem, but nevermind). Among the topics is "the halting problem," which states that a Turing machine (a theoretical simple computing device) cannot be designed to tell if another Turing machine will ever halt (as opposed to running indefinitely) when given a particular input. This statement has far-reaching implications in the area of theoretical computer science, understanding what computation can and cannot do. You wouldn't want to enter a graduate program in computer science without knowing what the halting problem was all about. However, in the practical world of programming, its use is close to zero. You can be a great programmer and go your whole life without hearing about the halting problem and be no worse because of it.
In contrast, look at one of the new topic areas, PF/SecureProgramming. One of the topics is avoiding array overflows. This is always a good idea, but it is emphasized here because array overflows can be manipulated by hackers to produce program actions unanticipated by the original programmer. That's good, practical advice, solid training for the developing programmer. But it's too narrow and too practical to fit in with the academic, "science" part of computer science.
Unfortunately, these attempts to serve all purposes in one place means no one is getting exactly what they want from college. Once you accept this, though, you can decide if college is right for you, and if so, which college is right for you, based on the degree to which you favor one purpose over the others. That's what I'll discuss next.