Have you ever looked at the manual that came with your stove or refrigerator and noticed the diagram of the part at the back of the book? You see all the components and where they fit together, it’s all a bit of a mess at first glance but then after you stare at it a while you start to understand it more. Then by the time you get to the bottom of the page you forget what was at the top? That’s about how I feel when I’m working with C++. Given enough time I can get my way through but oh boy, is it ever a doozy.

My first experience with C++ that wasn’t a simple hello world app was in the WinCollect agent that I work on today. It is a Windows event forwarding application which runs on all supported versions of Windows and uses the .NET framework and standard library. I have mostly worked in the code base to enhance the testability of code and review for business logic implementations.

I am a much more proficient C++ developer than when I began on the WinCollect team but I often still need to have a cplusplus reference open when I am reviewing code. I have a good understanding of the standard library and the patterns that it provides. I have grown into a believer that the best code uses easy to understand abstractions that are built around complier optimizations to deliver performant code as opposed to trying to take advantage of lower level c memory manipulation. In my experience having low level c code mixed in with a C++ code base is a recipe for a maintenance disaster.

I have also gained a deeper appreciation for software architecture diagrams working with C++ then I previously had working with Java. When deviating away from familiar MVC Java EE designs into multicomponent C++ applications it is paramount to understand what you are building and how it fits into other components without the help of a thousand stack overflow posts from people doing essentially the same thing.

I think the area that I have gained the most experience in is debugging and troubleshooting C++ code. I often take the lead on triaging issues as they are reported from customers or found in my testing. This has included working with live debuggers, working with memory minidumps to capture execution status in customers environments. I get great joy from being able to succinctly narrow down a problem to an exact line of code and determine the potential fixes to avoid the issue. I have been able to do this countless times including for critical customer issues which required quick resolution times.

Although it can be a complex beast, C++ is a tool I can work confidently in and contribute to. I am not the most talented at building and architecting C++, but I am skilled enough to identify and fix problems in existing code bases, refactor code for maintainability and testability, maintain and create build pipelines, and benchmark performance to identify issues introduced by code changes.