Observations on software design in C++