How I Would Design a Programming Degree
May 28, 2012 § Leave a comment
Yesterday, I attended ECPI Columbia’s Spring Advisory Board meeting. I was involved in the panel discussion regarding their IT degrees, and I viewed it as an opportunity to explain what I consider lacking in developer education. ECPI is regularly involved in community activities by providing facilities to user groups and code camps, so it was my pleasure to contribute in making their curriculum more valuable to both current and future programmers seeking degrees.
The Developer Degree
There was only one programming degree up for discussion: Bachelor’s in Database Programming. Of course, that meant it had many database courses with minimal impact to the modern software developer; unless you’re coding to a database without any form of data access abstraction. Due to the nature of this degree, I skipped over the database courses and focused my feedback on implementing agile practices where appropriate. For example, in the coding project classes, I think it’s better for the students as a whole to work in an Agile/Scrum manner. I’m not sure how exactly they implement the courses at this time, but if they’re doing waterfall, or they’re avoiding teams, then it’s not as valuable. I know I will have a reader prepared to criticize me for suggesting a practice where the whole team sinks or swims, but that’s the way it is in the real world: either the project is released or it isn’t.
I also recommended eliminating the four object-oriented courses in favor of courses focused on progressive programming paradigms. The criticism in turn was that students should learn different programming languages they can put on their resumes. I suppose that is useful to some degree, but without work experience in the language, it will not help much. The issue I have is that covering Java, Visual Basic, and C# is like learning different dialects of English: their structure is extremely similar, so it’s a stretch to say you really know another language. I don’t program in Java, but I can begin writing class libraries with little difficulty. The primary differences are in the frameworks used, and that’s not even the case with VB and C#.
If I’m hiring a developer fresh out of school for a project utilizing an object-oriented language, I want to know that the candidate understands object-oriented concepts and design. There are many other things I would like in a junior developer, but the language isn’t much of a barrier if the concepts are understood. Of course, my criterion for language experience is different when confronted with a more seasoned developer.
How I Would Do It
My experience on this advisory board made me start considering how I would design a degree program that would properly prepare a student to enter the business world as a developer. So, I’m going to list the courses I would require for a software developer degree (not database programmer) in a serialized course setting. If you’re reading this blog and don’t know what serialized means, I’ll assume you’re having one of those ill-caffeinated moments. In the context of a degree program, serialized is where only one class is taken at a time, typically in a very short cycle.
Note: ECPI’s program is required to carry certain courses by their accreditation program, and this is in no way like their course. This is simply me rattling off ideas, and actually implementing my approach would require much refinement.
|Professional Conduct||You may not be a decent human being, but you should at least learn to act like one.|
|Professional Communication||You don’t need to have the prose of Faulkner. You don’t even need to know who this Faulkner fellow is. In fact, I suggest you avoid his writing style. On the other hand, your emails and reports should not read like a teenager’s text message.|
|Critical Thinking||You’re never going to make it as a software developer if you can’t analyze concepts with appropriate reasoning. You should also be able to identify when you’re wrong, because guess what: you’re not always right.|
|Logic||Some developers manage to lack a basic understanding of logic. This is the source of some of the stupidest bugs known to mankind.|
|Imperative Programming||With a firm basis in logic, imperative languages will come easily. Don’t be scared by the name, it’s basically conditions and statements, kind of like, “if I study all night, then I will be sleepy.”|
|Unit Testing||Testing your code by running the program will either become tedious or neglected. Automate those tests, and write them up front in the future.|
|Object-oriented Programming||Imperative programming is good and all, but what is this ‘I’ thing and how can it get the adjective ‘sleepy’ by the verb ‘study’?|
|Declarative Programming||No one wants to hear you yap about how you missed class from staying up all night studying. We certainly don’t want to hear about what you were studying. Just tell us you missed class.|
|Refactoring||Your code is ugly, clean it up.|
|Optimizing||You’ve learned how to write your code so any decent developer can maintain it. Now it’s time to make it ugly again. Don’t worry, you already know how to hide your well-optimized, hideous implementations.|
|Object-oriented Design Patterns||So, you came up with an intriguing solution to a problem. Someone else came up with it before you; stop wasting your time “inventing” new things.|
|Relational Data||One day, your boss will ask you for a report. The next day, you will be asked for another, completely different view of the same data. Learning how to store and retrieve relational data will prevent the need of becoming an Excel expert.|
|Object-relational Mapping||Enough data queries and your code will once again become an unreadable mess. Use the techniques of ORM to store and retrieve state.|
|Human-readable Data||Store, transmit, and read data in formats computers, humans, and possibly other biological life-forms can read. Bonus: user interfaces can be specified in a similar manner.|
|User Interface Design||You may not be an artist, but that’s no excuse for creating unusable user interfaces. You should be severely punished for even considering that Nyan Cat’s rainbow elimination can be used as a menu.|
|Tools of the Trade||A dog swallowing your USB drive containing your classwork is sad, but it’s no excuse for not turning it in. Developers have many tools at their disposal to ensure their work is never lost, their software always builds, and their tasks are always known. Sounds horrible, I know, but they also have tools to prevent rote memorization and typing.|
|Requirements and Specifications||If you thought coding was tough, try translating what some people consider English to a logical construct.|
|Organizing||Do you want to be a basement dweller? I thought not. Team work is essential in creating complex, functional software. Knowing the techniques that work for creating continuously deliverable software goes much further than hacking it alone.|
|Develop Software||Now that everyone understands how to organize, how to write specifications, and how to code, it’s time to put those skills to the test. The entire class will form a development team and create software for the project owner (your instructor).|
That’s nearly enough credit hours to fill an associate’s degree. There are several options to pad it out, but I think I would go with a targeted math class focusing on operators, their properties, and functions as it would be a nice and useful extension to the class on logic. Discrete math would be valuable as well, particularly since it refers to certain data structures a developer may need to implement, and it contains concepts that are extremely valuable for more advanced programming topics (e.g. combinatorics).
On the Glaring Omission
Notice I didn’t include classes in algorithms and data structures. Generally, if it’s an algorithm deemed worthy enough to be taught from a textbook, it’s either an extremely rare, highly-optimized solution or it has been implemented directly in the default frameworks of common production languages. Useful data structures are almost always implemented in default frameworks (with the exception of the tuple, probably due to its impracticality without language support). Practical knowledge on algorithms is obtained from Imperative Programming, and the most useful data structures are covered by Object-oriented Programming. Let me explain: what better way to introduce linked lists than with the concept of the containment form of composition? Then, you can show the already implemented linked list in .NET: LinkedList<T> (what a surprise!). Afterwards, be sure to explain how almost everyone uses the array-backed List<T> instead. You can take this further in the Declarative Programming class to show that many modern C# developers have taken up immutable manipulation of sequences using LINQ.
I’m not saying that a class on algorithms and data structure is useless; just a waste of time if your goal is to be effective immediately out of school. If I see someone writing their own bubble sort on a project in C#, I would want to know why they’re wasting their time. When I took a position as a junior developer on a Delphi project, the senior developer reviewing my code asked me why I was reading data into an array and sorting it in just that manner. He then introduced me to TStringList, and I never looked back. I recall that I defended myself by stating my manipulations were faster. They probably were, but I wasted far more time and made my code much less readable. The real reason: I transitioned from Pascal to Delphi and was unaware of classes that already implemented the functionality I was used to creating myself. If you’re going to write production code, it’s better to learn the higher-level constructs and implementations available and then learn the lower-level way of doing things for clarification, understanding, and future flexibility.
What is infinitely more useful for the modern application developers is knowledge of design patterns. Consider this: design patterns are “recurring solutions to common problems in software design.” Replace “design patterns” with “algorithms and data structures,” and you see that they fit the exact same definition. The difference is that most named design patterns are still informal, having yet to be implemented in abstract form (formalized) or made part of the language (invisible). Note that patterns that have become formalized or invisible are no longer considered design patterns. Since developers still need to implement design patterns themselves, time is better spent on learning them instead of reinventing them.
I didn’t address this particular subject at the board meeting, but I probably should have; perhaps another year.
Other Classes of Note
Critical Thinking and Logic should really be taught in elementary school through high school. The number of people who can’t properly evaluate propositions or do not analyze their own viewpoints is absolutely staggering. Depending on “common sense” over rational thought is what leads people to make reason errors like the Gambler’s Fallacy. Since the subject material in these classes is essential for rational thought, you better believe they’re essential for software development.
I left out all math classes. There are parts of math that are essential for software developers; algebra is one of them. However, it’s really pieces of standard math and algebra that are important, and it would be nice to have a class focused on those specific parts. When I was in high school, I was told I would need to learn calculus to make it as a programmer. I did learn calculus, and I find it fascinating (including how it was invented by both Newton and Leibniz). However, for the vast majority of development jobs, it is completely unnecessary. Boolean logic carries the day, but it’s also necessary to understand standard operators, the various properties of operators, and functions (a calculation template).
I had no better name for Tools of the Trade, but it is essential to understand common tools used in software development. Of course, the concepts are important as well, so it would be a good idea to include continuous integration and such.
I feel that half a dozen classes on SQL is unnecessary, but you should learn about Relational Data. In the process, you learn relational algebra and tuple relational calculus (not differential or integral calculus). By learning how to manipulate relational data, you learn set logic. I added the Object-relational Mapping course because it’s much more practical than writing large queries. Let your DBAs specialize in that; you specialize in software development. Besides, many startups are using non-relational document databases such as RavenDB.
Human-readable Data is a necessity if you’re writing integrated systems. Guess what, your dynamic website is rendered on a client that calls a server which returns data. You will also most likely integrate both external and internal services in applications you develop, so you need to know JSON and XML. I don’t think these are particularly hard to grasp, so I clumped other markups in here as well for describing user interfaces (HTML, XAML). Markup for UI is human-readable data after all, but you could design entire courses around those technologies. It’s also important to teach style sheets and resources, so I would definitely split it up. The UI portion doesn’t fall under User Interface Design as that is specific to usability. Considering how many developers create awful interfaces, I wish every programming degree program included this sort of class.
Requirements and Specifications should cover things like how to gather requirements and write Gherkin style specs so tests can be designed and the code written without the ambiguity that plagues most shops.
I see Organizing as an Agile/Scrum course.
I clumped functional programming under Declarative Programming. This is accurate, but it doesn’t do functional programming justice. I didn’t put generic programming anywhere despite its heavy usage nowadays, but I think it would fit in Declarative Programming. I know it’s not technically part of the declarative programming paradigm, but it does seem to have a relationship with a sub-paradigm to declarative programming: constraint programming. It would probably be best to add a separate course for generic programming, aspect-oriented programming, and other useful paradigms.
The courses I laid out are of my own imagining, and it’s really meant to demonstrate the kind of skills I would like developers to have when they leave the university behind to find a job. Unless programming outside of class for sheer passion, fresh graduates seem to grasp little more than an imperative style of coding. They eventually seem to either go the way of the business analyst or gain the practical knowledge necessary to become awesome developers. This tells me that 1) more people should be pursuing business analyst degrees, which could be corrected by offering 2 and 4-year business analyst degrees, and 2) Developer/software engineering (not CompSci) degrees should focus on topics more relevant to modern developers.
How would you craft a developer degree?
(Source : http://www.kodefuguru.com)