The Language We Learn- The Way We Think
Friday, July 24th, 2009From time to time I read that the language we speak to some extent controls the way we think. Someone more versed in such things may be able to describe how this is true with natural languages, but I have found this to be especially true with computer languages. A recent chunk of code I came across while working on a program at my place illustrates this point.
The point of the routine is to add a particular quantity to a total a number of times defined by a variable field.
Now, to most modern programmers, this is a trivial task. A classic DO loop will do the trick quite nicely. But this code was not written in a modern language. It was written in RPGII, which didn’t haveĀ DO and END opcodes to use.
But first, we will render how the code, as it appeared in the program, could have been coded using DO:
(The field names have been changed. The number of times the quantity would be added is NOTMES; the quantity to be added is TOTQTY; the quantity TOTQTY is to be added to is GDTOT.)
C IF *IN03=*ON AND *IN49=*OFF
C DO NOTMES
C TOTQTY ADD GDTOT GDTOT
C ENDDO
C ENDIF
Now, you read above that it was written in RPGII. Here is how it could have been rendered in RPGII:
C N03
COR 49 GOTO EIF001
C Z-ADD 0 X
C LUP001 TAG
C X ADD 1 X
C* 25 SET ON IF X<=NOTMES
C X COMP NOTMES 2525 <=
C 25 TOTQTY ADD GDTOT GDTOT
C 25 GOTO LUP001
C EIF001 TAG
But this is not even nearly how the code was written.
In early RPG, apparently programmers were apparently taught to use an indicator to test for every possible condition- a different one for every condition. And, apparently, the concept of a loop did not occur to this programmer. The value of NOTMES could be as high as 5, so, by George, we must test for every value from 1 to 5, and deal with them accordingly. When I dug into the code and got to comprehend what it was doing. I was absolutely stunned. What follows is the code as translated into RPGIV, so the number of lines would be slightly more than in the original code; but the old code looked just as bad:
C TOTQTY ADD GDTOT GDTOT
C N49NOTMES COMP 2 75
C N49NOTMES COMP 3 76
C N49NOTMES COMP 4 20
C N49NOTMES COMP 5 05
C* IN RPGII, NEXT CALC WOULD TAKE 4 LINES
C 03
CANN49
CAN 05
COR 03
CANN49
CAN 20
COR 03
CANN49
CAN 76
COR 03
CANN49
CAN 75TOTQTY ADD GDTOT GDTOT
C* IN RPGII, NEXT CALC WOULD TAKE 3 LINES
C 03
CANN49
CAN 05
COR 03
CANN49
CAN 20
COR 03
CANN49
CAN 76TOTQTY ADD GDTOT GDTOT
C* IN RPGII, NEXT CALC WOULD TAKE 2 LINES
C 03
CANN49
CAN 20
COR 03
CANN49
CAN 05TOTQTY ADD GDTOT GDTOT
C 03
CANN49
CAN 05TOTQTY ADD GDTOT GDTOT
I’m sorry, but I’m afraid but I don’t have any profound insights as to how that monstrosity could have been avoided; but in a weird way it gets the job done. There is a certain strange creativity about it. The logic is:
1. Add the quantity once.
2. If it needs to be added 2,3,4, or 5 times, add it again.
3. If it needs to be added 3,4, or 5 times, add it again.
4. If it needs to be added 4 or 5 times, do it again.
5. If it needs to be added 5 times, add it again.
The most basic Computer Literacy class in middle school today would teach the better way, but such classes weren’t around then. And for those who learned that early, it’s probably the way they did it for the next thirty years.
Oh, my.