New Programming

How often do you write a line of code that moves a byte into a specific register? How often do you reference a pointer or write a sorting algorithm? Heck, for some of you in the audience, how often do you actually compile code?

I am not here to argue that none of these are useful. In fact, I was recently given the opportunity to relearn C, and was more than happy to do so. Long live the address-manipulaters and the machine code compilers! But, contrary to CS programs around the country, “programming” is no longer limited to algorithms, processor architecture, or even objects. In fact, I would say that this new programming is so fundamentally different from the traditional view of the subject as to warrant a new label altogether.

“New Programming” is libraries. New Programming is experimental. New Programming is collaboration — between developers, between users, between software, and between machines. New Programming is connecting what has already been done. New Programming is knowing how to find the best tool, and not just how to write it.

It is undeniable that academia is dealing with one end of a rapidly growing subject and completely ignoring the other. From the point of view of a project requiring New Programming, the course catalogs for major CS programs look like a pointless exercise at best, and counter-productive at worst.

So what happens when employers, administrators, even professors and programmers themselves don’t know the difference? When a business needs a developer for a user login feature, the recent Course 6* graduate from MIT, who learned about RSA from Rivest** himself can look tempting. But while he’s sketching out the optimal database architecture, he might have spent the time better by researching content management systems with robust user management capabilities, and modifying the code from there as needed.

One argument for the lack of New Programming in schools is that it is “Googlable-as-needed” and constantly-changing, whereas “Old Programming” (for lack of a better term, not to imply that it’s outdated) is based on mathematics and engineering that must be taught in a rigorous way. Not only is the premise of this argument untrue, but if it were, subjects such as marketing, photography, and history might never be taught either!

The lack of degree programs with a focus on subjects like content management systems, scalability, apps, interface design, user-oriented design, or server-side/client-side scripting, means that many of the tens of thousands of CS graduates every year were not studying what they would ultimately be doing. Not only this but they may not even realize it after landing the job, imbued by the confidence of “computer science” written on their diploma.

A slightly different approach to programming education would, not only produce programmers better-suited to their field, but would ultimately produce better applications, better websites, better software, and a better quality of life for both the users and the programmers.

Modern developers often lean heavily towards one package or language, often based on what they read once, or what they’ve always used. Why not teach them the pros and cons of every major package? Why can’t they be fluent in PHP, Ruby, and ASP.NET? Why does Javascript have to be something you pick up over the weekend? An entire course could be taught on jQuery and its major extensions alone!

As the field grows, the need for differentiation and adaptation increases. Computer science degrees are becoming increasingly good at producing computer science professors, and others who stumble around in the dark for a few years, very slowly writing elegant code that has been written before, just as elegantly. Those who make it out of the dark often emerge with bad habits and a narrow understanding of their new field.

Although academia will eventually change, without a strong push this change will too slow to keep up with New Programming, or NEW New Programming, or the many additions, permutations, convolutions, and revolutions that are likely to happen to the field in the coming years. This push must come from industry, from academia, from the students, and even from the users. With a strong, continuous push, the advancement of computer science will increasingly continue to cause waves in every field in the world.***

*Electrical Engineering and Computer Science
**The “R” in RSA
***This metaphor involves a second-order differential equation. Um, yes, I am an engineer. Why do you ask?

  1. mortoray said:

    I’ve often looked at this topic and also wondered whether there are various classes of programming. One needn’t look further than an online freelancing site to see the huge gap between what is required, and what is perhaps taught in schools. I’m not entirely convinced it isn’t just a matter of specialization and degree of abilities.

    A good programmer, as you say, will need to know several languages. Perhaps they don’t have to be experts in all of them, but certainly a working knowledge of several. It is also helpful if those languages have different domains of relevance, as the programmer has a better all-round knowledge. Programmers who can work in only one language are almost universally bad programmers, whether that language is C, PHP, Java, or anything else.

    Good programmers also need to know how the computers work. This constant doesn’t change. If you are a writing a device driver you need to know some low-level details. If you are a writing a website you’ll need to know about networking and load-balancing. Though the details differ, the more you know about your computing environment the better programmer you’ll be. Those who spend their life strictly in an IDE or sticking to the rules of a single framework, fail to excel and end up as bad programmers.

    Fundamentally I don’t see that new programming is actually a lot different from old programming: it may involve a lot of different tools, but the mindset and methodology are quite similar.

  2. Kludgist said:

    “One needn’t look further than an online freelancing site to see the huge gap between what is required, and what is perhaps taught in schools.”

    Great quote 🙂 I’ve spent a lot of time, lately, poking around MIT OpenCourseWare — you can learn just about anything about device drivers, compilers, memory allocation…

    I still think modern programming is significantly more collaborative, with a broad knowledge of neatly packaged solutions being more important than how the neatly packaged solutions work or how to make them run better/faster/stronger. This is partly because of increased software complexity, and Moore’s law, but mostly because greater communication ability allows fewer programmers (say ones with in-depth knowledge of load balancing) to pump out pre-made solutions (Amazon Elastic Load Balancing) to more consumers who know how to implement it but not build it.

    I do agree that the mindset is much the same, but I do think the methodology is changing rapidly. I will concede though, that my lack of industry experience from the early 90’s may be working against me, and, like you said, this point may be better applied to education than anything 😉

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: