Saturday, November 20, 2004

Need Hardware courses in Computer Science programs

I find it rather surprising that a program like Computer Science in Universities does not provide any adequate knowledge of computer hardware. It is surprising because Computer Science, as a field, encompasses computer hardware and a significant portion of the written software directly communicates and interfaces with various hardware components.

There are some Computer Architecture courses offered to Computer Science students, but these courses deal with hardware design and provide a low level overview of how hardware works. This, however, leaves a big gap between that level and the software level; therefore things like the variety of hardware, how to interface with it and how to retrieve valuable information from it are left uncovered.

I think it would be very valuable to have a few courses that teach the Hardware Interaction level of Computer Science. Because such courses are not available at the moment, perhaps with the exception of the Realtime systems course, whose purpose is different anyways, a lot of the time Computer Science graduates are unprepared in the workplace to perform related tasks such as: interfacing with SCSI drives and over serial ports, for example, to get GPS data or to monitor hardware, write device drivers, and also gathering CPU information to allow for various optimizations in the code.

I think this knowledge is very valuable and can potentially lead to better software programming and consequently better code, since by knowing how things work at a lower level, you will be able to optimize for better performance of your code.

8 Comments:

Blogger Ilyia Kaushansky said...

1) There is already a required CS251 that students need to take. Additionally, there is an optional CS450. I think these two courses offer enough material for CS students to abstract away hardware, and not worry about it too much.

2) Very few CS students actually ever need to work with hardware, even during their professional careers. In fact, there is a tendency to separate software from hardware as much as possible, and you can see this with languages such as Java and C#, which are gaining tremendous popularity.

3:31 PM  
Blogger Alex Pilchin said...

RE 1) Well actually I was refering to those courses when I was talking about courses relating to Hardware design, however these courses, IMO, don't introduce or explain anything regarding interfacing with hardware and comunitcating with it to retrieve valuable information.


RE 2) Although I agree that such problems are not often found with Java or .Net jobs and there is certaintly the tendency to move away from hardware interaction with the use of these languages, such tasks are common enough in a C/C++ positions. In fact out of the 4 C/C++ positions I've had so far, I worked on a hardware interfacing task on 3 of them and had to learn everything from scratch.

I think these tasks are common enought that they should be covered in University, espcecially since right now we have more and more devices appearing in the market and all of them need to comunicate with each other and know of the operational status of one another, etc.

12:42 PM  
Blogger Ilyia Kaushansky said...

What kind of interfacing are you talking about ?? You were probably interfacing with a defice driver, which essentially is nothing but an API. And you can't really teach an API at university, since well - there are way too many of them(APIs), and most are very different.

8:36 PM  
Blogger Ilyia Kaushansky said...

I should clarify this.. Device Driver is much more than an API (obviously), but you interface with it using an API, and in 99% of the cases don't really care how the device driver actually works.

8:39 PM  
Blogger Alex Pilchin said...

Well as I've mentioned in some of the examples I've listed before, there are several standards for these and covering some of those standards as part of such a course or even giving assignment tasks relating to these (as done in a Computer Networks course) would be quite valuable.

For example regarding the System Information: Both Intel and AMD support a call to 'cpuid' on the chip, which contains a lot of valuable information about the cpu; which you can later use for optimization in the code (eg. you can know if a system has Hyperthreading, its clock frequency, etc).

SCSI interface standard is followed by almost all hardware vendors and allows you to find out information like disk failures, power levels, temperature levels, etc.

I am pretty sure that a company like Google with a highly distributed system (with a lot of connected hardware) has used this in their implementation of the file system in order to monitor and detect failures in their hardware.

The hardware course I propose would go over the variety of hardware devices in existance and go over various standards and protocols that are used to access that hardware, in a way that a Networks course covers ways of communicating through a network.

The great thing about Hardware companies is that they are a lot more organized in terms of following standards than Software companies.

2:11 PM  
Blogger Alex Pilchin said...

Well Ilya, your last comment applied to Computer Networking would imply that all you need to know is Winsock and/or Unix Sockets (ie the API for an application communicating over a network) in order to do Computer Networking.

However, obviously, knowing how Computer Networks work and what happens below the API layer helps the programmer write better and more efficient code by optimize things at the lower layer.

For example in Storage Area Networks(SANs) sending data for storage through soooo many layers in the network at the two ends is extremely time consuming and a company, like Hitachi, that can develop a way to bypass a lot of this extra processing can perform storage/access operations so much faster and hence would have a big advantage over their competitors: who may be using TCP to communicate with the storage devices over a network.

The same applies to hardware: knowing how it works and what happens when you interface with it, helps you write better software that works more efficiently with it.

2:30 PM  
Blogger John Cormie said...

Take real-time. In that course, you can write as much low-level code for your RTOS as you care to. At least, you'll need to write a device driver for the serial port and the clock.

2:14 PM  
Blogger Alex Pilchin said...

I've considered it on several occasions, but couldn't find a partner: in fact at one point had to withdraw from the course because of that. All my friends who were planning to take it, had already taken it by then.

Its also not offered this winter term.

3:07 PM  

Post a Comment

<< Home