Programming Language Advice to My Daughter, Part 2: C++
Mastering the powerful language to extend possibilities.
In this “Programming Language Advice to My Daughter” series:
Part 1: Ruby
Part 2: C++
Part 3: Shell Script *
Part 4: Java
Part 5: Wrap-up and FAQ
In Part 1, my first choice of programming language to teach my daughter is Ruby, a dynamic language. Next, when it came to choosing a compiled language (to learn), my daughter guessed Java—understandably, since I had spent much of my programming career working on Java projects. However, my choice is C++.
When hearing "C++," many programmers—even experienced ones—feel a sense of unease due to concerns such as:
Its complexity
Manual memory allocation and deallocation
Crashes caused by incorrect use of pointers, in which case, it is hard to debug
Honestly, I shared those fears until I decided to redevelop the TestWise IDE using C++ back in 2018.
Great Benefits of C++
Fear blinds human beings.
1. C++ has always been in demand for decades.
According to the latest TIOBE Index for April 2025, C++ holds the second position. When combined with C, which ranks third, their overall presence comes very close to claiming the top spot.
2. C++ apps are fast, very fast.
C++ is a mature, memory-efficient and scalable language—every programmer knows that. Yet, many tend to overlook the impressive speed that C++ applications can deliver

For those who have tried TestWise, the one-second launch time is incredibly satisfying.
When compared to TestWise v4 (written in Ruby), which took over 30 seconds to start. The Java (prototype) version was not good either, as loading the Java VM also introduces noticeable delays.
3. C++ apps are across platforms, too.
Many developers choose Java or JavaScript for their platform independence. But C++ can be cross-platform as well — with a bit more setup, yes, but it’s much easier than most people think. I’m speaking from experience: both of my C++ applications, TestWise IDE and BuildWise Agent, have been successfully released and run reliably on macOS, Windows, and Linux.
Why C++ Matters?
For most of my career, my work revolved around web development—mainly building web apps using Java, JavaScript, PHP, and Ruby. Like many web developers, I found C++ intimidating and stayed away from it. When I started my first side project, TestWise IDE, C++ wasn’t even a consideration. I built the initial version using wxRuby, a Ruby binding for the wxWidgets GUI library.
However, when wxRuby was deprecated, I had no choice but to confront the challenge head-on and dive into C++. It took me years to build up the courage to rewrite TestWise from the ground up in C++. I’ll admit—I wasn’t very confident in the beginning. But the results were beyond what I imagined. The new TestWise (v6) is faster, more robust, and supports a wider range of test automation frameworks (like Appium and Selenium) and languages (including Ruby, Python, and JavaScript).
Looking back, if I had stayed within the comfort zone of web development, TestWise wouldn’t be what it is today—or might not even exist at all.

Some readers might wonder, 'Are you making C++ sound too easy?' The answer is—yes and no.
Personally, mastering E2E test automation has significantly enhanced my software design skills. I quickly became a 10X Java developer after practising E2E web automation with Watir (in Ruby language). It’s hard to explain exactly why, but the results (my apps) speak for themselves. Before I mastered E2E Test automation, I had never built a successful side software product. I firmly believe mastering E2E test automation is the #1 (& quickest) way to grow as a software engineer. Anyway, my significantly increased productivity in software development gave me the confidence to revisit and re-learn C++.
The key reason behind this is the evolution of the C++ language and its standard library.
C++ 11
C++ 11 is the standard of the C++ language, published in late 2011. The latest C++ standard is C++20 (after C++14 and C++17). In my opinion, it was C++ 11 that modernized the C++ by simplifying many frustrating facets of C++ usage. Here I just listed four.
Range-based for() and auto keyword
The old C++03 way:
std::list<Student>::iterator it;
for (it = data.begin(); it != data.end(); ++it){
std::cout << it->name;
}
C++ 11:
for (auto const& i : data) {
std::cout << i.name;
}
Introducing nullptr (new)
Previously, the constant 0 had the double role of constant integer and null pointer. C++11 corrects this by introducing a new keyword nullptr
. No need to use NULL
marco.
int* x = nullptr;
MyClass* obj = nullptr;
Initializer lists (new)
The old C++03 way:
std::vector<char> cpp03vector;
cpp03vector.push_back('A');
cpp03vector.push_back('B');
C++ 11:
char array1[] = {'A', 'B'};
Smart Pointers
Smart pointers are used to make sure that an object is deleted if it is no longer used (referenced).
The old C++03 way:
void my_func()
{
int* valuePtr = new int(5);
int x = 10;
// ...
if (x == 10)
return; // here we have a memory leak, valuePtr is not deleted
// ...
delete valuePtr;
}
C++ 11:
#include <memory>
void my_func()
{
std::unique_ptr<int> valuePtr(new int(5));
int x = 10;
// ...
if (x == 10)
return; // no memory leak anymore!
// ...
}
`std::unique_ptr`
is a form of smart pointers.
Related reading:
A Dream that I Had 20 Years Ago: “develop a cool C++ app” Has Been Finally Realised
Software Design Pattern By Example: Strategy, example in C++