I don't like the way UML is abused because the idea of a conforming
rigidly to a standard notation is in direct conflict with the need to
express higher level concepts, and because it's an ungood compromise
(the "U" is the unification of Booch notation and two others whose names
escape me right now). Also, the tool support is still very poor, or
alternatively, tools (e.g. Rational Rose licenses) are not exactly
cheap. But, some UML-like illustrations, and UML generated from code,
can sometimes be nice.
Yes. It's important not to loose sight of the goal, which is
the design, or the documentation of the design, and not using
such and such a tool. On the whole, I find UML a good basis,
although I'm quite flexible with regards to how it is used; if
parts of the design can better be expressed using other means,
so be it.
And you're right about tool support. (IMHO, IBM would be wise
to follow the example of Unix, and make the Rational product
line available free, or almost free, to schools. All of the
students coming out knowing Rational Rose, and the companies
which hire them would have to cough up for the licenses.)
Depends what you mean by design. There are many levels and shades of
purity of design. And design does absolutely not need to be only
annotated graphics created via an UML-based tool (limiting oneself that
way would be like donning a straightjacket before starting the job).
Design does mean knowing what the code should do before you
start writing it. In large projects, it means knowing what each
class you write does in the context of the project. And in my
experience, you don't "know" anything until it's down in
writing. UML works well for this. I don't know, off hand, of
any viable alternatives. And I've never really felt it to be
much of a straight jacket.
I think Andrei would disagree, since presumably he chose the title... ;-)
Maybe. But at the most, it's very low level design. My
impression, however, is that it is more about how to write code
which can be used to do anything, without knowing what it might
be used for. Useful for authors of very low level libraries
(who obviously want their code to be used in the widest variety
of applications), but not the sort of thing to get involved in
if you're being paid to produce a working application.
There are many levels of design. "Design" by itself means the whole
thing. And does not imply a phase in a waterfall methodology.
What's the waterfall methodology? I've only seen the expression
used as a red herring for people trying to justify a lack of
engineering. (See
http://www.idinews.com/waterfall.html. For
that matter, you might want to check out the entire site:
http://www.idinews.com/. It's one of the best sites I know of
for C++/Java based software engineering.)
Design is a continuous process. It starts before you start
coding---you can't code until a certain amount of design can be
done. The usual model I've seen is a spiral: design, code,
test, then start over, refining the design. But all code is
designed before it is written.