Topics


Blogs


Forums


Samples


Media


Labs


Resources

 




DevCentral > Weblogs > Lori MacVittie - Two Different Socks
 A queue is a (a) line (b) a pony tail (c) a data structure
posted on Monday, July 14, 2008 8:31 AM

Neil McAllister @ InfoWorld has a great blog post on The Web development skills crisis. He postulates at that "The most agile developers, however, are those who approach programming with a firm grounding in computer science."

Amen, brother. Say it again, only this time loud enough my son hears you.

The basic premise of Neil's post revolves around the frenetic rate at which programming technology is changing. It isn't just languages, though that is certainly part of the mix, it's also the increasing number of libraries and frameworks from which web developers can choose to develop web applications.

In order to switch from Python to Java to C to JavaScript, and do so almost seamlessly, requires, as Neil points out, a firm grounding in computer science. The kind of firm grounding that comes from an accredited computer science degree program at an established university. Or does it?

If you know young adults studying computer science in college today, you may find it disheartening that even a four year degree at an accredited, reputable university no longer ensures a "firm grounding in computer science." The continued transformation of computer science degrees into web programming degrees replete with CSS and JavaScript courses have become the norm, and traditional theoretical classes like compiler and language theory have gone the route of the dodo bird. The same college where I earned my undergraduate degree no longer offers Compiler Theory or Theory of Programming Languages, or even a Graphics course. It now offers "software design" classes in which students are taught Visual Basic, CSS, and JavaScript. They're taught the concrete implementation of programming, not the abstract theories behind it. Students aren't being taught computer science, they're being taught rote programming and not computer science.

That's increasingly disturbing, as it is these theoretical classes in which students build a strong foundational understanding of languages and computer science that can be used to become the agile developer required in today's quickly changing web development environment. If you graduated with a degree in computer science but don't know the difference between a hash table, a stack, and a linked list, then your degree program has failed you.

If you just "import" a queue, or a linked list, or a vector, and you don't understand the implementation of these basic data types you might be choosing one that will not only affect the performance of your application, but put limitations on further development down the road.

The best programmers, agile programmers, are the ones that understand not only the language but the basic constructs of all programming languages because they are, in essence, the same. They understand the theory and data structures and algorithms and it is that which enables them to move between languages and environments with alacrity.

And you network administrators out there - don't think you're off the hook so easily. If you don't know the difference between a queue and a weighted-queue and the advantages and disadvantages of each, then you don't really understand what you're doing when you click that checkbox on a firewall or traffic management device that implements queuing as a method of quality of service. Many of the techniques used to implement network-oriented tasks are based solidly in computer science algorithms, like basic routing and load-balancing that form the basis of application acceleration solutions and good old fashioned routers. That means that you, too, could benefit from a firm foundation in computer science. After all, the software that makes those network devices work in the first place is just that - software. In the end, it's all code and it all boils down to the same thing: data structures, control structures, and compilers.

Knowing why something performs the way it does gives you an edge; it gives you insight into why things go wrong and why things go right when you're configuring a device or writing an application or architecting a solution.

It may be cliché, but it's true: knowing is half the battle.

The other half is realizing that you need to know in the first place.

 



Follow me on Twitter View Lori's profile on SlideShare AddThis Feed Button Bookmark and Share



 
      

Feedback


7/14/2008 9:56 AM
Gravatar "Knowing is half the battle". Go Joe!

#Colin
Colin

7/14/2008 1:59 PM
Gravatar Problem with that poll is that those who don't have a degree aren't qualified to answer because they don't know what they're missing. It's like asking a cave man if life is better in a house. Of course he'd say "nope". Okay, it's not that extreme, but that's a good comparison, makes you think. ;-)

I know some people who've been very successful as developers without a degree, but they're still holding themselves back - they could be better, though some don't acknowledge that fact.

Don.
Don MacVittie

7/14/2008 9:19 PM
Gravatar Do you need a computer science degree? It looks like you want to see the answer: yes. I agree that you need a firm grounding in computer science. However, you just said that your own undergraduate institution now hands out computer science degrees without providing their students a firm grounding in computer science. In addition, one does not need a degree to have studied and understood true computer science concepts.
Pat

7/15/2008 4:01 AM
Gravatar @Pat

True, you can learn the concepts without a degree program. Now the big question is, how do you prove you know them? A degree is a hiring filter for most organizations. If you don't have one, how do you get past that first filter to prove you have that knowledge?

And of course one has to question whether one can know what concepts they need to know if there isn't someone to point them out. How many youngsters are out there seeking out information on compiler theory or traditional algorithms unless there's someone to point them out or tell them they need to know them?

I think we have to address the problem in colleges and reinforce the importance of a firm foundation rather than rely on people to seek out information they don't even know they need.
Lori MacVittie

7/16/2008 4:53 AM
Gravatar What would you consider the foundational principles of computer science? In reading yours (and Dons) columns, it's obvious you both are voracious readers, so I'm wondering how much of your experience came from formal education versus your own drive to improve your expertise.
Jason Rahm

7/16/2008 5:02 AM
Gravatar @Jason

That's an excellent point. There's a lot of knowledge out there that can't be learned in an academic setting because technology has outstripped education. Most of our experience comes, and has come for many years, from drive and experimentation. I think that's true of most folks these days. But I also think that without that firm grounding, the understanding that comes from the education, that it would be infinitely more difficult to gain that knowledge.

It's the application of education that makes it valuable, not necessarily the specifics of the education.
Lori MacVittie

7/18/2008 2:05 PM
Gravatar I graduated from Harvey Mudd in 1980 with a B.S. in Physics. But I had a concentration in numerical methods so I had to be a pretty good programmer. I also took some classes in computer science, but my recollection is that a lot of the data structure stuff in the class could not be done in FORTRAN. Consequently, my code was inelegant by modern standards, but it worked.

My son just graduated with a B.S. in computer science and pre-law, and he and I have spent long hours with him bringing me up to speed on what I've missed. One of the things that he points out is that the use of libraries and predefined data types such as lists and vectors means that you don't *need* to know how these things work. It is a different level of abstraction.

This is an important feature of modern programming environments - different levels of abstraction. When I was an undergraduate, we called it "top down programming". In modern terms, we would call a high level of abstraction to low levels of abstraction. This is not limited to CS and programming - most managers want to deal with things at a high level of abstraction.

I don't know how to implement a hash. But I know enough about data structures to know when I need one, and then perl does it for me (I used to code in Java (and before that, C, and before that, Pascal, and before that, FORTRAN), but perl is better for sysadmins and network engineers).


Jeff Silverman
Jeff Silverman

7/18/2008 2:31 PM
Gravatar Ah, but do you know that hash tables are much less likely to have 1st level collisions, when the number of hash buckets is a prime number? Built in C/C++/Java libraries allow you to "make a hash", but they don't necessarily provide guidance on things like optimizations. Thus, in an interest in conserving memory, one might be tempted to allocate the minimum/round number size to the hash table that results in less memory consumed (than the next prime number up or 2^n+1 number up where n is sufficiently large) but half the performance.

The above is what I would consider to be part of a firm grounding in computer science. In actuality, it is really part of a firm grounding in math.
Pat

7/25/2008 1:33 PM
Gravatar @Pat

With these high levels of abstraction, it's no wonder there are are a great deal of low-level security problems.
Comrade Smack

7/25/2008 3:24 PM
Gravatar @Comrade Smack

Which high level abstractions are those? Pat's comments are hardly an abstraction, so I have to wonder what you might have been addressing?

Lori
Lori MacVittie

7/29/2008 8:43 AM
Gravatar Errr... redirect @Pat to @Jeff. Hah.

My snarky comment was mostly to say that I'm frightened when people admit to not needing to know how things work.

Nothing to see here.

*whistle and walk away*
ComradeSmack
 Leave Feedback
Title  
Name  
Email
Url
Comments   
Please add 6 and 1 and type the answer here: