Isaac
Lifelong Learner
- Local time
- Yesterday, 23:30
- Joined
- Mar 14, 2017
- Messages
- 9,911
Inspired from @NauticalGent 's excellent article links from here, I read an article which I felt had a LOT of really good advice in it. Some challenged me, some was relatable, some was just funny.
I'm starting this somewhat random-seeming post with a few smaller quotes, and then, if you have more time and feel like reading it, a longer one.
I'm starting this somewhat random-seeming post with a few smaller quotes, and then, if you have more time and feel like reading it, a longer one.
The technology churn from Microsoft is impossible to match in the real world. As Joel Spolsky said, there's 2 camps at Microsoft - the "Raymond Chen camp" (which wants to maintain backward compatibility at just about all costs) and the "MSDN Magazine camp", which "wants to keep churning out huge pieces of technology that no one can keep up with. Inside the halls of Microsoft, the MSDN Magazine camp has won."
"We’re programmers. Programmers are, in their hearts, architects, and
the first thing they want to do when they get to a site is to bulldoze
the place flat and build something grand. We’re not excited by
incremental renovation: tinkering, improving, planting flower beds.
There’s a subtle reason that programmers always want to throw away
the code and start over. The reason is that they think the old code is a
mess. And here is the interesting observation: they are probably wrong. The reason that they think the old code is a mess is because of a cardinal, fundamental law of programming:
It’s harder to read code than to write it.
This is why code reuse is so hard. This is why everybody on your team
has a different function they like to use for splitting strings into
arrays of strings. They write their own function because it’s easier and
more fun than figuring out how the old function works.
These problems can be solved, one at a time, by carefully moving code,
refactoring, changing interfaces. They can be done by one programmer
working carefully and checking in his changes all at once, so that
nobody else is disrupted
In any shop I know, it's "do more with less" and no one has time to get around to all the legacy constructs, I can promise that. The technology churn from Microsoft is impossible to match in the real world. As Joel Spolsky said, there's 2 camps at Microsoft - the "Raymond Chen camp" (which wants to maintain backward compatibility at just about all costs) and the "MSDN Magazine camp", which "wants to keep churning out huge pieces of technology that no one can keep up with. Inside the halls of Microsoft, the MSDN Magazine camp has won."
I'm not black and white on the "don't fix it if it ain't broke" rule, but am in most circumstances.
From a Joel Spolsky interview:
"We’re programmers. Programmers are, in their hearts, architects, and
the first thing they want to do when they get to a site is to bulldoze
the place flat and build something grand. We’re not excited by
incremental renovation: tinkering, improving, planting flower beds.
There’s a subtle reason that programmers always want to throw away
the code and start over. The reason is that they think the old code is a
mess. And here is the interesting observation: they are probably wrong. The reason that they think the old code is a mess is because of a cardinal, fundamental law of programming:
It’s harder to read code than to write it.
This is why code reuse is so hard. This is why everybody on your team
has a different function they like to use for splitting strings into
arrays of strings. They write their own function because it’s easier and
more fun than figuring out how the old function works.
As
a corollary of this axiom, you can ask almost any programmer today
about the code they are working on. “It’s a big hairy mess,” they will
tell you. “I’d like nothing better than to throw it out and start over.”
Why is it a mess?
“Well,” they say, “look at this function. It is two pages long! None
of this stuff belongs in there! I don’t know what half of these API
calls are for.”
Before Borland’s new spreadsheet for Windows shipped, Philippe Kahn,
the colorful founder of Borland, was quoted a lot in the press bragging
about how Quattro Pro would be much better than Microsoft Excel, because
it was written from scratch. All new source code! As if source code rusted.
The idea that new code is better than old is patently absurd. Old code has been used. It has been tested. Lots of bugs have been found, and they’ve been fixed.
There’s nothing wrong with it. It doesn’t acquire bugs just by sitting
around on your hard drive. Au contraire, baby! Is software supposed to
be like an old Dodge Dart, that rusts just sitting in the garage? Is
software like a teddy bear that’s kind of gross if it’s not made out of all new material?
Back to that two page function. Yes, I know, it’s just a
simple function to display a window, but it has grown little hairs and
stuff on it and nobody knows why. Well, I’ll tell you why: those are bug
fixes. One of them fixes that bug that Nancy had when she tried to
install the thing on a computer that didn’t have Internet Explorer.
Another one fixes that bug that occurs in low memory conditions. Another
one fixes that bug that occurred when the file is on a floppy disk and
the user yanks out the disk in the middle. That LoadLibrary call is ugly
but it makes the code work on old versions of Windows 95.
Each of these bugs took weeks of real-world usage before they were
found. The programmer might have spent a couple of days reproducing the
bug in the lab and fixing it. If it’s like a lot of bugs, the fix might
be one line of code, or it might even be a couple of characters, but a
lot of work and time went into those two characters.
When you throw away code and start from scratch, you are throwing
away all that knowledge. All those collected bug fixes. Years of
programming work.
You are throwing away your market leadership. You are giving a gift
of two or three years to your competitors, and believe me, that is a long time in software years.
You are putting yourself in an extremely dangerous position where you
will be shipping an old version of the code for several years,
completely unable to make any strategic changes or react to new features
that the market demands, because you don’t have shippable code. You
might as well just close for business for the duration.
You are wasting an outlandish amount of money writing code that already exists.
Is there an alternative? The consensus seems to be that the old Netscape code base was really bad.
Well, it might have been bad, but, you know what? It worked pretty darn
well on an awful lot of real world computer systems.
When programmers say that their code is a holy mess (as they always do), there are three kinds of things that are wrong with it.
First, there are architectural problems. The code is not factored
correctly. The networking code is popping up its own dialog boxes from
the middle of nowhere; this should have been handled in the UI code.
These problems can be solved, one at a time, by carefully moving code,
refactoring, changing interfaces. They can be done by one programmer
working carefully and checking in his changes all at once, so that
nobody else is disrupted. Even fairly major architectural changes can be
done without throwing away the code. On the Juno project we
spent several months rearchitecting at one point: just moving things
around, cleaning them up, creating base classes that made sense, and
creating sharp interfaces between the modules. But we did it carefully,
with our existing code base, and we didn’t introduce new bugs or throw
away working code.
A second reason programmers think that their code is a mess is that
it is inefficient. The rendering code in Netscape was rumored to be
slow. But this only affects a small part of the project, which you can
optimize or even rewrite. You don’t have to rewrite the whole thing.
When optimizing for speed, 1% of the work gets you 99% of the bang.
Third, the code may be doggone ugly. One project I worked on actually
had a data type called a FuckedString. Another project had started out
using the convention of starting member variables with an underscore,
but later switched to the more standard “m_”. So half the functions
started with “_” and half with “m_”, which looked ugly. Frankly, this is
the kind of thing you solve in five minutes with a macro in Emacs, not
by starting from scratch.
It’s important to remember that when you start from scratch there is absolutely no reason
to believe that you are going to do a better job than you did the first
time. First of all, you probably don’t even have the same programming
team that worked on version one, so you don’t actually have “more
experience”. You’re just going to make most of the old mistakes again,
and introduce some new problems that weren’t in the original version."