Why CS students *must* learn C++ as their main programming language

Photo from pexels.com

Disclaimer: this post is sort of a motivating post for students. Professional programmers may find it uninteresting or painful (especially if you code in C# or Java or JavaScript).

Disclaimer 2: Scroll down to see some semi-interesting C++ questions asked in interviews.

C++ is the hardest language for students to master, mostly because they have to think much. Really much. We don’t claim that C# is easy, or Java is easy, but in comparison, yep, they are easy. Many other popular languages provide some cool “features” allowing developers to concentrate on their actual problem, instead of worrying about language-specific quirks (agree, C++ has so many of them). In Java/C# you have automatic memory management, e.g. “don’t think about the memory at all”. In JavaScript you also have freedom of using var, no int’s, no double’s, no floats and char pointers at all. “Just store the value somewhere and somehow”. The levels of abstraction allowed programmers to solve their problems faster than before and simultaneously, those levels of abstraction allowed programmers to “know less, do more, don’t worry, make money”. For sure, you don’t need to worry about memory management, or types or whatever else packed in a fancy title “performance”. It’s just you and the problem you are trying to solve. Language is just a tool. It must help you, not hurt you and your little feelings. And your job title (senior, right?).

What would become a programming student who will study, for example, JavaScript as their first and only language? Definitely not a programmer. Yep, just an advanced user, or you might say a “StackOverflow copy-paster”. Why so? Let me introduce you Alice, she’s a lawyer, she‘s good with computers, she can install software, setup a network connection, she’s able to distinguish WiFi from Mobile Data, but she doesn’t know programming. She is aware of different operating systems for desktop and mobile. She even uses two operating systems, an OS X installed on her MacBook and a Windows, installed on her office desktop. She kind of knows even that Mac applications couldn’t be installed on Windows. She uses some hard to master software for her job, some lawyer-specific soft, with many menu items, buttons and dialogs. To master this software she took classes for “SupaLoya2012-Ultimate”, she learned difficult queries to request court cases, she learned the protocol of using the SupaLoya2012-Ultimate, e.g. the order of buttons and menu items to click to get desired results. She definitely is not a programmer, you can call her someone who knows how to work on a computer better than many others and she knows some hard and specific software, its protocols, queries and stuff.

And then comes Bob. Bob loves computers, he watched too many movies about hackers, programmers, startupers and hackers again. Did I mention hackers? He is good with computers like Alice, although Bob doesn’t know SupaLoya2012-Ultimate, he does know JavaScript, mm, sort of, he took classes, he learned much, he skipped Promises, but is able to make some AJAX requests. So he is able to write some “code”, which, in turn could be used in “production”. Actually, Bob is not a programmer, but he claims the opposite to his mom. Yeah, Bob’s mom doesn’t know that Bob is not aware of memory addressing, virtual machines, just in time compilation or “is-a”/”has-a” relationship. Yep, Bob uses i++ instead of ++i everywhere. Meh, what’s the difference. Anyway, does Bob differ from Alice? You can teach Alice the “protocols” of JavaScript, the “difficult queries” to “request” something and she would probably end up like Bob, i.e. calling herself a programmer. She wouldn’t, she is humble enough.

So, why is it a MUST for students to learn C++ as their first programming language (and learn it really well). Because, by learning C++, students have to:

  • worry about memory management;
  • know the difference between compiler, linker and loader;
  • find out that compilers make some optimizations (compilers code better than you);
  • learn meta-programming;
  • distinguish compile time from run-time;
  • really understand low-level implementation of polymorphism (such as virtual tables and virtual table pointers, or dynamic type identification);
  • pointer arithmetics, which could be a good base for understanding node-based data structures (f.i., linked lists, trees or graphs);
  • find out that compiler generates platform-specific code, and discover that there are many other platforms, instead of Windows on x86;
  • find out that there are ELFs and PEs and other executable file formats, each of which has a bunch of sections you should at least partially be familiar with;
  • find out that the size of data types is something you have to worry about (sometimes);
  • implement some function pointers to understand the under the hoods of callbacks;
  • dive deeper into generic programming;
  • use and understand iterators, implement containers supporting various categories of iterators;
  • … the list goes on and on and on..

These are some “knowledge” that are a MUST for any CS student, at least for any CS student who is willing to become a good programmer. Mastering C++ guarantees required experience to master almost any other programming language. Why C++? Easy to answer to this one. Tell me what:

  1. you want to be a world-class developer working on really interesting stuff..
  2. ..or you just want to make some money while coding routine tasks with some CurrentlyPopularJSFramework?

If your answer is “ye-yeah, i want to be a rock-star developer”, then C++ is your choice. If you are the guy who claims “oh, come on, language is just a tool, I know React, I can do a lot of stuff, I make money, man!” Sure you are right, no one tells you shouldn’t use other tools, no one tells you shouldn’t solve problems with a tool created just for that particular problem. Finally, no one says you should code some website’s front-end with C++. It’s your choice, but remember this, JavaScript runs on engine written in C/C++ (f.i. Google V8), .NET Framework CLR is written in C++, even MS Windows is written in C/C++. Java JVM is written in C++, MongoDB, Redis, web-browsers, Linux, MySQL, (I’m listing random software/tools), Adobe Photoshop, Illustrator, Nginx, OS X is written in a mix of language, but a few important parts are C++, many Google internal/external products (including Google Search), Microsoft Visual Studio, even C# compiler itself is written in C++. (you can find more by googling).

Quoting Kurt Guntheroth (from the book "Optimized C++")

At the dawn of the 21 st century, C++ was under assault. Fans of C pointed to C++ programs whose performance was inferior to supposedly equivalent code written in C. Famous corporations with big marketing budgets touted proprietary object-oriented languages, claiming C++ was too hard to use, and that their tools were the future. Universities settled on Java for teaching because it came with a free toolchain. As a result of all this buzz, big companies made big-money bets on coding websites and operating systems in Java or C# or PHP. C++ seemed to be on the wane. It was an
uncomfortable time for anyone who believed C++ was a powerful, useful tool.
Then a funny thing happened. Processor cores stopped getting faster, but workloads kept growing. Those same companies began hiring C++ programmers to solve their scaling issues. The cost of rewriting code from scratch in C++ became less than the cost of the electricity going into their data centers. All of a sudden, C++ was popular again.

So, do you want to make some noise? Then learn C++!


Here are some interesting/regular/just-for-fun C++ questions you should answer as a CS student (helpful for a C++ interview preparation).

# Write a template function my_alloc() taking the type as a template parameter and allocating memory using malloc() :

template <typename T>
T* my_alloc()
{
// your code goes here
}

# What is the output the following code:

int i = 4;
int j = i++;
int k = ++j;
std::cout << i << j << k << std::endl;

# What is the output:

int arr[] = {1, 2, 3, 4};
int* p = arr;
int* k = p;
std::cout << (*(k + 2) + 1[p] + *(0 + arr)) << std::endl;

# What will be printed:

int n = 5;
void *p = &n;
int *pi = static_cast<int*>(p);
++*pi;
std::cout << *pi << std::endl;

# Here is some struct

struct Mruct {
char c1;
int x;
char c2;
int y;
char c3;
int z;
char c4;
int k;
};

what is the sizeof(Mruct) and how to reorder data-members to decrease the sizeof(Mruct) ?

# What is the output of the this program (see questions in the comments):

#include <iostream>
class A {
int m;
public:
void sayHi() { std::cout << “Hi” << std::endl; }
};
class B : private A {
private:
void useHi() { sayHi(); }
public:
B() { useHi(); }
};
int main() {
B obj; // Questions 1: What will be printed on the screen
obj.sayHi(); // Question 2: What will be printed on the screen
return 0;
}

# What is the output of this program:

#include <iostream>
#define SQUARE(x) (x * x)
int main() {
int a = SQUARE(2);
int b = SQUARE(a++);
int c = SQUARE(a + b);
std::cout << a << " " << b << " " << c << std::endl;
return 0;
}

# Bring an example of Argument-Dependant Lookup

# What is Empty Base Optimization

# In the following code:

class A {};
class B : public A {};

sizeof(B) is equal 1, why?

# In the following code:

class A {};
class B : public A {
char ch;
};

sizeof(B) is equal to 1, why?

# In the following code

class A {};
class B : public A {
A m;
};

sizeof(B) equals 2, why?

# Why and when you override private virtual functions?

Have more questions like this? Post in comments.