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!

Starting at Microsoft

Starting in C#:

The key with C# is not about knowing its syntax rather; it’s about mastering the Framework.

CLR via C# is strongly recommended to read.

Working as a developer:

One of important roles for you as a developer is to know how to develop Framework. You can read Framework Design Guidelines as a reference for this point.

Besides that, you need to read Refactoring: Improving the Design of Existing Code which will increase you knowledge with the development in existing Framework.

As a developer you need to do the following:

  1. Write clean code.
  2. Understand .Net Framework.
  3. Master design patterns.
  4. Master unit testing.
  5. Plan and communicate well.

The more your code introduces bugs, the more your manager loves you!

Unit Testing:

One of the common tools in unit testing in .Net is nunit.

Why Unit Test:

  • Let you know if your code works fine with previous code or not. (some developers fixes a bug but introduces 2 new bugs in another location)
  • Reduce number of bugs in your code.
  • You’ve more confidence when changing your code.
  • Helps you refactoring your code.

Advanced .Net Debugging is useful to understand debugging and how to fix bugs.

Writing Solid Code helps you to avoid bugs.

How to Master C++

From several days, I’ve posted a question on C++ Professionals Group on LinkedIn asking this question. Below the summary of people posts:

– General Tips for mastering in general:
* Practice is important as reading "Arne De Herdt"
* Ability to understand others code. "John Phillips" & "Jason Felice"
* It’s about software design not understanding syntax and semantic! "Ricardo Machado" & "John Phillips" & "Jason Felice"
* Understanding source code of developed compilers and making your own compiler. "kumar sundaram"
* Involve yourself in Boost ( http://www.boost.org ) "John Phillips"
* Understanding multiple programming paradigms will will give you good ideas for better design in all of them "John Phillips"
* Understand algorithms and their implementation. "John Phillips"
* Understand software design at scales larger than algorithms. "John Phillips"
* Understand how to work effectively over time. "John Phillips"
* Becoming involved in an Open Source project is a good way to do improve your cognition for others code. "Jason Felice"

– Recommended Books:
* Thinking in C++: http://www.planetpdf.com/developer/article.asp?ContentID=6634 "Tiago Correia"
* Art of Computer Programming Series – Donald E. Knuth "Tiago Correia"
* C++ Templates: The Complete Guide – David Vandervoode and Nicolai Josuttis "Ricardo Machado"
* Effective C++ – Scott Meyers "Ricardo Machado"
* Modern C++ Design: Generic Programming and Design Patterns Applied – Andrei Alexandrescu "Ricardo Machado"
* Design Patterns – Gamma, Helm, Johnson and Vlissides "Ricardo Machado"
* The C++ Programming Language (Third Edition and Special Edition) – Bjarne Stroustrup "Nabil Shams"
* C++ Primer – Stanley Lippman and Josee Lajoie "Zohar Efrati"
* More Effective C++ – Scott Meyers "Thomas J. Mueller"
* Effective STL – Scott Meyers "Thomas J. Mueller"
* Exceptional C++ – Herb Sutter "Thomas J. Mueller"
* More Exceptional C++ – Herb Sutter "Vladimir Ivin"
* C++ for Real Programmers – Jeff Alger plus the other two "Vladimir Ivin"
* Standard Template Library – Nicolai M. Josuttis "John Phillips"
* Template Metaprogramming – Abrahams and Gurtovy "John Phillips"
* Generative Programming book – Eiseneker and Krysznewski "John Phillips"
* POSA Series "John Phillips"
* Code Complete – Steve McConnell "John Phillips"
* Introduction to Algorithms – Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein "John Phillips"
* The Pragmatic Programmer – Andrew Hunt and David Thomas "Jason Felice"
* C++ In-Depth "Rob Meijer"

– You can view authors of these tips at links below
Arne De Herdt
Tiago Correia
John Phillips
Ricardo Machado
kumar sundaram
Nabil Shams
Zohar Efrati
Thomas J. Mueller
Vladimir Ivin
Rob Meijer
Jason Felice