[EMAIL PROTECTED] wrote:
A *teacher* could give you correct software to study.  Instead of reading a lot
of verbage in your calculus class perhaps you could read 50% text and 50% high
level code that does derivatives and integrals symbolically.

Given current programming languages, I don't imagine this would be a win.

However, *if* you can write software there is *no doubt* you
understand something.

And I'll disagree with that.

I'm currently writing a Scheme interpreter while I learn
Scheme.  At some future date, if and when I finish it, there will be no doubt I
know EVERYTHING about the behavior of Scheme right?

No. That will only be true if (a) your Scheme interpreter is correct, and (b) it's written in terms of something (i.e., in a language) you understand everything about, and (c) you don't forget anything along the way.

I've written programs that rip open macromedia director data files and do calculations on the parts. That doesn't mean I understood macromedia director or its files. I learned just enough to figure out when each item got stuck on the screen or the speakers, which is what I needed to know for that particular project. Heck, I had source listings, and the thing was so evolved that it was incomprehensible.

I exchange data right now with other companies. I send them some XML, they don't decode things like ", then they echo it back to me with added fields, with incorrect quoting. I'm pretty sure they know virtually nothing about using XML for data exchange.

Ever gotten a crappy set of requirements(*) that didn't actually match what the customer(+) actually wanted? Ever get requirements where the customer didn't know what they wanted, and you programmed around for a while until you got what worked? Did the first versions prove you understood everything about the subject?

Did you ever introduce a bug into a complex program you were working on, because you forgot how some other part of the system was working? Did you, at the moment of introducing the bug, understand everything about the functionality there?

I've seen complex network protocols involving loss and reordering of messages with multiple concurrent streams of interaction, implemented by someone who had never heard of a state machine. The software showed a *glaring* lack of understanding.

Have you ever seen the software that drives a pipe organ? Does reading the software tell you how to play the pipe organ? Do you think if you got specs that told you how to drive the hardware interfaces given a sequence of bytes encoding particular notes, you would be able to write the software? Afterwards, would you be able to play the pipe organ?

Have you seen software that runs devices? Or factories? Could you read the software that runs an industrial robot and deduce from that what the robot is building, do you think?

Have you looked at the layout of silicon and metal that goes into making a CPU? Does that tell you everything you need to know about how the CPU works, how to program it, why it does what it does, and why the wires are spaced and routed like they are?

Could you implement AES (the encryption standard) from the specs? Having done that, could you describe what AES does and why? Does it give you a good insight into how to write another piece of encryption software, to the point where you would trust it with secrets?

**

Software encodes understanding without necessarily imparting it. To the extent that it encodes understanding without imparting it, reading the software gives you only the most primitive type of understanding, namely the understanding of the symbolic manipulations the software does. You might be able to understand it enough to refactor it, but that doesn't mean you could have created it.

That's why taking a large piece of code and changing all the variables and functions to have random names makes it much more incomprehensible. Formally identical, yet completely different from an understanding point of view. Unless you know what the author meant the variable to represent, the formal manipulations on it are meaningless(&). The only way to understand the software from *reading* it is to reconstruct the mental state of the author when *writing* it.

Sure, software is a lot more demanding. But unless the software is correct, complete, and written entirely by you, its completion doesn't mean you understand.

To the extent that you only implement a particular layer, you only understand that particular layer in terms of the layers above and below. Being able to put together a game in the Unreal editor doesn't mean you know anything about how computers work, how physics simulations work, how graphics cards work, how game AI works, how the hardware works, ... It just means you understand your particular level. I don't see that as any better understanding than you'd get by writing it on a piece of paper and handing it to someone else to draw.


(*) ... using the term loosely.
(+) ... using the term loosely.
(&) E.g., global variables aren't "bad". They're only bad if they
    mean different things at different times in their lifetimes,
    just like local variables. Most programmers don't have the
    discipline to ensure that, tho.

--
  Darren New / San Diego, CA, USA (PST)
    On what day did God create the body thetans?

--
[email protected]
http://www.kernel-panic.org/cgi-bin/mailman/listinfo/kplug-lpsg

Reply via email to