Learning and Disciplines in Computer Science

No one argues that education and learning has important role in being outstanding. In this post I’ll try to explain from my point of view what are different learning areas in Computer Science.

Basic Computer Science

This area constructs basic thinking and problem solving skills for computer science student. Examples of this area include: Data Structures, Algorithms, File Structures, Operating Systems, Compiler Theory, Computer Security, Networking and others. Most topics in this area can be scientifically measured for example, you can know that this algorithm is efficient or not from complexity analysis theory.

This area is very important to be learnt while you are undergraduate. For example, you can’t go to your manager at work and say “Hey my manager, I want to learn what data structure is about”. How shame that you’ve not learnt anything about multithreading concepts or basic security topics, so what were you doing in your undergraduate life?

Software Engineering

Simply, you can’t be a software engineer without knowledge in this area. Software engineering is about the art of software construction and design this includes, Object Oriented Theory, Design Patterns, Code Refactoring, Software Architecting, UML, Writing Software Requirements, Framework Design, Software Testing, Software Development Processes and others. Some topics here are important to cover in your undergraduate studies (as Object Oriented) while others can be after graduation (as Framework Design).

From it’s nature of being art, there’s no specific or fixed metric that takes a design of a software and gives you guaranteed judgment. You need to have the talent and experience of how to design software to judge on your designs.

Technology

This area is further divided into three parts.

Internals

Internals are about having knowledge of Assembly Language, Windows APIs, POSIX APIs, Windows Sockets, Windows Memory Architecture, Windows Threading, Windows Thread Synchronization, Compiler Internals (Virtual Table, Virtual Pointer, Automatic Generated Code), Inter-Process Communication and others. This is about learning what’s underneath to have solid understanding of what’s happening in your development environment.

Programming Languages

Self exploratory, like C++, C#, Java, Lua, Objective-C and others.

Others

Android SDK, SQL Server, iOS, Code Revision (VSS, SVN, TFS), ASP.NET, ADO.NET, LINQ, WCF, WF, XNA, COM, COM+, Visual Studio and others.

Advanced Computer Science

Being involved in the theory of a specific computer science as, Algorithms, Artificial Intelligence, Cloud Computing, Programming Language Design, Compilers Theory. This area requires lot of dedication and basic science like probability, mathematics.

Domain Knowledge

When you are working on a specific software you’ll need to learn about your area domain knowledge. For example if your are working in games you’ll need to learn about Game Programming techniques.

Miscellaneous

Debugging, Writing Bug-Free Code, Writing Clean Code, Dealing with Legacy Code, Understanding Existing Code and others are good to have skills as Software Engineer.

Engineering Experience

The most important part in the learning process is about actual engineering experience you’ve. You are expected to come from the university with a base level of knowledge, but it takes years of actual development work to become a great software engineer. You have to start small, by fixing lots of bugs and doing small features, and work your way up over several releases. You can attend classes and read books all day long but you will never become a great engineer without years of experience*

Disciplines in Computer Science

One of common questions from undergraduates is “What are differences between Programmer and Developer?”. I see that you can divide Computer Science titles based on combination from this area. For example (this is just for explanation purpose not an ISO standard)

Programmer = Technology (Others) + Domain Knowledge

Software Engineer = Basic Computer Science + Software Engineering + Technology (Others) + Domain Knowledge

Academic Researcher = Basic Computer Science + Advanced Computer Science

Computer Scientist = Basic Computer Science + Advanced Computer Science + Software Engineering

* This section was a suggestion by Jason Allor and I see it’s very critical. Thanks Jason!

6 thoughts on “Learning and Disciplines in Computer Science

  1. Gr8 topic here (Y)(Y)
    I’m really wondering when and how can someone like me do a lot of that : ))
    ALLAH be with us! it’s not the easy task to be special … to be different … to be a real Muslim

  2. ِamazing,
    Thanks a lot.

    could you recommend a book in each of those fields ?
    Design Pattern, Data Structure, Algorithms, OS, Software Engineering ?

    Thanks in Advance

Leave a Reply

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

WordPress.com Logo

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

Google+ photo

You are commenting using your Google+ 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 )

Connecting to %s