I’m trying to read some interesting articles from the field lately and I stumbled upon blog post What every computer science major should know by Matt Might, associate professor from University of Utah. He summarized requirements that proper CS graduate should comply. While reading this article I automatically started to compare his view with study programmes at my home university FIT BUT, and realized how much this school gave me in those five (at the time incomplete) years. You can check it by yourself in study programme overview (BSc. and Msc.) or read my little summary.
Portfolio versus resume
FIT is known for overwhelming number of projects each semester. This gave us great outlook of all technologies and forced us to get our hands dirty with code used in various branch of IT.
Technical communication
Here Matt Might describes that we should be able to communicate well in non-IT environment and give a lot presentations of our projects. This is one of the criticized part of our study: we simply had not enough of oral presentation of our study. But we had to present our project in several courses so it is not so lost case.
On the other hand we had great course Typography and publishing about LaTeX and we were prodded into creating our reports and thesis in LaTeX.
An engineering core
We should have common language with another engineers. This was accomplished with several courses at another faculty namely Discrete Mathematics, Numerical Methods and Probability, and Mathematical Analysis. We learned a little of Matlab and Maple also.
The UNIX philosophy
UNIX philosophy, mostly in Linux, is encouraged for whole study. Students just have to learn some basics in course Operating Systems. Namely we were developing simple regex strace colorer and implementation of Sleeping barber problem using linux locks.
System administration
We had no course in system administration and I think it would be redundant in our curriculum. Almost everybody worked during their study and these are things you will learn when you need them (and forget them when not). But we did some network stuff in corresponding courses.
Programming languages
We had to try a lot programming languages. First semester (and few more in other courses) was dedicated to C in Introduction to Programming Systems and we discovered Assembler in Assembly Languages. We also had few hardware classes where we learned how to code VHDL. We learned to script in Perl and Python in Principles of Programming Languages. We attended lectures of Fundamentals of Artifical Inteligence where we tried Prolog and Lisp. I participated in optional course of writing web pages in HTML, CSS and JavaScript and we all had to program Information System in PHP. We could choose between C++ and Java one semestr and program GUI server/client application. In Msc. we have more theory than technologies and languages so we are currently learning Haskell and Prolog again in Functional and Logic Programming. It’s quite a list when I write it down.
Discrete mathematics
This part is mainly about formal logic and proof. We all had courses Mathematical Structures in Computer Science and Logic for former and mainly Theoretical Computer Science for latter. Also in Theoretical Computer Science we broadened our knowledge about formal languages and automata which we first got in Formal Languages and Compilers. Of course we went through proofs also in other courses like Graph Algorithms and Petri Nets.
Data structures and algorithms
We had special lectures for Algorithms, where we went through all basic structures and algorithms that operates on them. As I already mentioned we passed separated course for graphs algorithms.
Theory
Besides Theoretical Computer Science we also had course that dealt only with computational Complexity, where we learned fundamentals of complexity classes, undecidability and polynomial reductions.
Architecture
We had complex introduction to computer hardware too. From Circuit Theory, Computer Hardware, Design of Computer Systems, VHDL seminar to Microprocessors and Embedded Systems. I can clearly say that we discussed computer from bellowe transistor up to processors design.
Operating Systems
As I already mentioned we passed course especially for Operating System linux where we learned about schedulers, memory paging, kerne and context switching.
Networking
We passed course Computer Communications and Networks where our projects focused on TCP/IP communications, e.g. programming of reliable communication . Second course dealing with networks was Network Applications and Network Administration where we learned plenty protocols of all network levels, from DNS to VoIP.
Security
We had interesting courser Information System Security, that introduced to us basics of cryptography, security bureaucracy and pointed out few places where to be careful from web developing to smart cards.
Cryptography
Every important aspect of cryptography was discussed in Information System Security, but for deeper understanding was possible to attend special course Cryptography.
Software testing
We were encouraged to create our own tests whole study. But I would appreciate putting more emphasis to this discipline. At least few hours of basic of tests kind, few use cases would be nice. Or I like idea that students would be evaluated by quality of tests also.
User experience design
UX is another strong point of FIT BUT, we attended course devoted just to UX called User Interface Programming. Project was by evaluated by level of creativity and we also had to defend our ideas by oral presentation.
Visualization
Unfortunately I don’t know about single lecture where we were taught how to visualize our data. I would definitely welcome it because only after you visualize your data you are able to see shapes and trends that are hard to recognize from pages of numbers.
Parallelism
Parallelism is important part of CS and is getting even more important with mutlticore architectures. Course that is devoted to this subject is suprisingly called Parallel and Distributed Algorithms. We went through benefits and limitations of algorithm in distributed environment.
Software engineering
FIT is known for its team projects. Nearly in every semestr we cooperate on some project in team from 2 to 5 people. We also had helpful course in first semestr called Introduction to Software Engineering where we learned development stages, UML and methods of software development.
Graphics and simulation
A bit surprising to have these two branches of computing in one header beside because we had one course devoted to each subject: Computer Graphics Principles and Modelling and Simulation.
Robotics
“Yay, it’s moving!” Nor this was omited from our curriculum. Course Robotics was interesting insight into this engineering discipline.
Artifical intelligence & Machine learning
To make computer make smarter decisions was always my dream. I am glad I could attend previously described course Fundamentals of Artifical Intelligence and, in master degree curiculum, Soft computing that was focused on neuron net, optimizaton metaheuristics and fuzzy logic.
Databases
We had great course held by our dean Database Systems where we went through theory of relational algebra and we also created and normalized database for nontrivial information system (mine was for blood transfusion station).
Evaluation
When I see all that I went through in those five years I really have to remember earlier me with practically no useful knowledge after my high school. I learned a lot (A LOT, it was not always easy) but when I compare it with Matt Might’s list of requirements on proper computer science graduate, I am glad that it was also qualite studying not only focused on quantity.