Wednesday, November 04, 2009
These are the programmers I'm scared of …
One thing at a time. Let's first write it out longhand:
def square_indexes(square_number) result = [] first_row = square_number / 3 first_column = (square_number % 3) * 3 first_row.upto(first_row+2) do | row | first_column.upto(first_column+2) do | col | cell_number = row * 9 + col result.push(cell_number) end end result endThat's a lot of code, and I'm afraid it won't work. And it doesn't:
1) Failure: test_square_four(TC_MyTest) [./sudokutest.rb:31]: <[39, 40, 41, 48, 49, 50, 57, 59, 59]> expected but was <[12, 13, 14, 21, 22, 23, 30, 31, 32]>.We see that it has started in row 1, not row 4 as it should have, but that it is taking the right corresponding cells after that incorrect start. So the row_number init is wrong.
Now, this might have been a good time to just throw the code away and start over, which is a pretty good trick. If I had felt the need to debug, I'd have tried to start over instead, since that method was pretty weird. But I see exactly what the bug is—I think—so I'll just fix it. If it doesn't work, I'll start over.
This is the type of programmer I was talking about yesterday—not only is he unsure about 14 lines (and makes it out to sound like it's thousands of lines) of a dynamic programming langauge (Ruby in this case), but he's not even clear he understands the bug in the code.
Also, the “crutch” this programmer uses is “unit testing,” which to me (because the culture is totally alien to my way of thinking), translates to “let us write a ton of code to catch bugs that in a statically typed language, the compiler would catch.”
Update a few minutes later …
I don't know if that programmer really thinks that way, is just playing a “I don't know what I'm doing” type of programmer for the sake of demonstration, or it's a serious case of “the culture is totally alien to my way of thinking” but I'm finding his presentation of his programming methodology extremely annoying.
I choose to say “we'll need” here to emphasize that implementing those methods in yesterday's spike was a violation of YAGNI, the rule that says not to implement things just because you need them.
I don't think YAGNI doesn't mean “not to implement things just because you need them.” But I could be wrong, as I think Ron Jeffires (who's writing these annoying articles) coined the term. And even if he is right, he's giving excuses for not following his own advice.
Alien cultures indeed.
And comments like:
… I have to figure out which row number a cell is in, which column, and which square. Each of those is a bunch of integer divides and modular arithmetic, which I have a good chance of getting wrong …
…
Maybe it means I've thought too much about this, or that I'm following my anticipation too much.
…
Here we go. Hold on, that was a lot of code, ten or so lines … [But he's written about a bazillion lines of code implementing test cases, but I guess those don't count. —Editor]
Isn't helping my confidence with his coding skills any. Is it any wonder I
consider dynamic programming afficiandos as sloppy thinkers? And the bit about getting divides
and modular arithmetic wrong? That's just … wrong! You are not
a programmer if you don't understand modular arithmatic alien to my way
of thinking.
Okay, I think I'll stop reading this now.