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?
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.
This area is further divided into three parts.
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.
Self exploratory, like C++, C#, Java, Lua, Objective-C and 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.
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.
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.
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!