Home » GeekSpeak » Computer Science Education

Computer Science Education

As a Computer Science grad student (nearly done .. honestly), and someone that’s been in the industry for about 20 years, I have more then a few thoughts on Computer Science programs.  Generally there are a few types of Computer degrees one can get from a university:

1- Computer Engineering; the electrical engineering aspect of computers, the development of hardware components.

2- Computer Science; the study of algorythms and computer theory

3- Software Engineering; the project management of large size software projects

4- Information Systems; the managerial aspects of an IT department.

My feelings are that there are HUGE gaps between the available degree programs and what is actually needed in the industry.  I’ll start by saying that I think the above programs are necessary, but I feel that there should be a few additional programs offered by most universities:

1- Systems Engineering;  Here is a teriffic description of Systems Engineering: http://www.sie.arizona.edu/sysengr/whatis/whatis.html.  As implemented in IT, think of the thousands of computer systems that large corporations have and  how they interact with one another.  For example, a problem pops up: “My application is slow, can you help me”?

What operating system is the application running on?  Does the server have enough capacity (ram/cpu/disk space) to run the application?  Is the server tuned (optimized) for the application?  Does the application go slow because you’re writing to disk?  Are you using a database?  Is your SQL optimized?  Where is the database and where is the application server (is one in NY and the other in Asia?  This causes stuff to go slow)?  What kind of disk storage are you using?  Is there a bottleneck writing to disk?  Does the operating system have the latest patches?  What does the network connection look like; are you at network capacity?  Is the network card throwing errors or dropping packets?  Is the network card configured to run at full or half duplex?  Is the database server at capacity?  Is the webserver program (apache) configured correctly?  Is the software written correctly?  Are there memory leaks?  Does the server have to many open files?  Is the software written correctly?  What data structures are you using?  Is it a multi-threaded or multi-process application?  Is it logging to much?  .. etc. etc..

That’s just one application.  Think of all the interactions that occur between internal systems.  You log in on a server in Asia, it authenticates your username and password in NY. You have data that has to be used in both the US and London, mounting the data across the Atlantic Ocean is slow, it has to be replicated; what are the best ways to do it?  You have a sattelite network in the Mid-West, what is the best way to scale down an application so that it doesn’t send THAT much data to space, and then back down again (built in latancy).  How can we send out this software patch to 3,000 Linux computers?  Here’s an example of what happened when one team didn’t use proper Systems Engineering techniques at the beginning of the project (read here).

These are things that aren’t necessarly taught in school, but the tools and basic principals, as well as expert knowledge in Operating Systems can be taught.

2- Software Development; the art of programming.  Software Engineering doesn’t cut it.  The Software Engineering courses are based on integrating and managing large software initiatives.  I personally think Software Engineering should be strictly a graduate degree, Software Development should be an undergraduate degree.  There should be a few semesters of functional programming followed by a few semesters of Object Oriented Programming.  There are some articles that discuss students missing out on functional programming, and their skills suffering as a result (http://www.stsc.hill.af.mil/crosstalk/2008/01/0801dewarschonberg.html).  I agree with this.  I’ve often come across software in which the developer will do something trivial like open a file.  The software never checks to see if the file even exists, or if the user has permissions to open the file.  Functional Development techniques teach better algorithm development.  As someone who sees his share of software, I get tired of correcting junior programmers for doing things like this:

int i = 0; int j = 100;

while(  i < (j*j)){

do something.

i++;

}

where j*j has to get calculated every time it goes through the loop.  Instead of something like:

int i=0; int j = 100;

int n = j*j ;

while (i < n){

do something.

i++;

}

Simple mistakes like this kill me, yet I see them all the time from people that graduate with Software Engineering and Computer Science degrees.   Neither of these degree programs really teach software development.  It’s kind of a gap in the education.  One teaches theory, the other teaches the project management.  Though programming is done for both degrees, it isn’t the focus of either of them.

3- Network Engineering; Building, supporting maintaining large scale networks. The guys that do this should be versed in LAN, MAN and WAN Networking, router protocols, and network protocols (BGP, multicast, tcp/ip, appletalk, broadcast, VPN, IPv4, IPv6).  They should be able to read network traces and troubleshoot network hardware including routers, switches, CSU’s, ethernet cards and VPN Devices.  They should be very familliar with WiFi Networks, infiniband, RNA networks, VoIP, telecom switches, satellite networks, telephone lines, cisco IOS  and frame relay networks.  Network Engineers should be familliar working with telecom companies to troubleshoot line outtages and International Telecom Routes. This is just the tip of the iceberg.  While most universities have a course or two that focus on networks, they are very high level and don’t prepare students for working in this field.

Network and Systems Engineering are two fields that people just sort of fall into, and get better at over time.  Universities don’t prepare graduates for these career paths.

Computer Science Vs. Software Development:

computer_science_major.PNG

Leave a Reply