[ProgClub list] Learning C++
John Elliot
jj5 at progclub.org
Mon Oct 10 23:35:03 AEDT 2011
Here's a quote from Bjarne Stroustrup in The C++ Programming Language
about learning C++. Makes me feel like I should be learning C++. (That's
a long road...) :P -- JE
The most important thing to do when learning C++ is to focus on concepts
and not get lost in language-technical details. The purpose of learning
a programming language is to become a better programmer; that is, to
become more effective at designing and implementing new systems and at
maintaining the old ones. For this, an appreciation of programming and
design techniques is far more important than understanding of details;
that understanding comes with time and practice.
C++ supports a variety of programming styles. All are based on strong
static type checking, and most aim at achieving a high level of
abstraction and direct representation of the programmer's ideas. Each
style can achieve its aims effectively while maintaining run-time and
space efficiency. A programmer coming from a different language (say C,
Fortran, Smalltalk, Lisp, ML, Ada, Eiffel, Pascal, or Modula-2) should
realize that to gain the benefits of C++, they must spend time learning
and internalizing programming styles and techniques suitable to C++. The
same applies to programmers used to an earlier and less expressive
version of C++.
Thoughtlessly applying techniques effective in one language to another
typically leads to awkward, poorly performing, and hard-to-maintain
code. Such code is also most frustrating to write because every line of
code and every compiler error message reminds the programmer that the
language used differs from "the old language." You can write in the
style of Fortran, C, Smalltalk, etc., in any language, but doing so is
neither pleasant nor economical in a language with a different
philosophy. Every language can be a fertile source of ideas of how to
write C++ programs. However, ideas must be transformed into something
that fits with the general structure and type system of C++ in order to
be effective in the different context. Over the basic type system of a
language, only Pyrrhic victories are possible.
C++ supports a gradual approach to learning. How you approach learning a
new programming language depends on what you already know and what you
aim to learn. There is no one approach that suits everyone. My
assumption is that you are learning C++ to become a better programmer
and designer. That is, I assume that your purpose in learning C++ is not
simply to learn a new syntax for doing things the way you used to, but
to learn new and better ways of building systems. This has to be done
gradually because acquiring any significant new skill takes time and
requires practice. Consider how long it would take to learn a new
natural language well or to learn to play a new musical instrument well.
Becoming a better system designer is easier and faster, but not as much
easier and faster as most people would like it to be.
It follows that you will be using C++ -- often for building real systems
-- before understanding every language feature and technique. By
supporting several programming paradigms (Chapter 2), C++ supports
productive programming at several levels of expertise. Each new style of
programming adds another tool to your toolbox, but each is effective on
its own and each adds to your effectiveness as a programmer. C++ is
organized so that you can learn its concepts in a roughly linear order
and gain practical benefits along the way. This is important because it
allows you to gain benefits roughly in proportion to the effort expended.
In the continuing debate on whether one needs to learn C before C++, I
am firmly convinced that it is best to go directly to C++. C++ is safer,
more expressive, and reduces the need to focus on low-level techniques.
It is easier for you to learn the trickier parts of C that are needed to
compensate for its lack of higher-level facilities after you have been
exposed to the common subset of C and C++ and to some of the
higher-level techniques supported directly in C++. Appendix B is a guide
for programmers going from C++ to C, say, to deal with legacy code.
Several independently developed and distributed implementations of C++
exist. A wealth of tools, libraries, and software development
environments are also available. A mass of textbooks, manuals, journals,
newsletters, electronic bulletin boards, mailing lists, conferences, and
courses are available to inform you about the latest developments in
C++, its use, tools, libraries, implementations, etc. If you plan to use
C++ seriously, I strongly suggest that you gain access to such sources.
Each has its own emphasis and bias, so use at least two.
More information about the list
mailing list