3 ms·
"I just upvoted your old post. :-)" Thank you! "many who see the code would get confused" I honestly don't think we should dispel confusion by dumbing things
by dxbydt 15y ago
"I just upvoted your old post. :-)"
Thank you!
"many who see the code would get confused"
I honestly don't think we should dispel confusion by dumbing things down to the point where all discrete math is squeezed out of the CS curriculum and all you have left is lame switch-cases and explicit enumeration so there is zero confusion but also zero insight into the problem. Some of the candidates we interview these days are a symptom of this very problem. Lemme give you 2 examples ( actual interviews questions we asked candidates ).
1. write a function that returns the sum of the first one thousand odd numbers.
Expected Answer:
function foo() {
return 1000*1000;
}
The candidate's answer :
function foo() {
sum = 0;
count = 0;
i=0;
while(true) {
i++;
if (i%2==1) {
count++;
sum += i;
}
if( count == 1000 ) {
return sum;
}
}
}
Now, the candidate is a LAMP expert and can do magic with linux sys-admin tools, but really, this is such an incredibly lame solution. Yes, its "correct" and very clear and nobody will get confused looking at his solution. But what's more clear is that this person has never had a single course in discrete math. Sum of n odd numbers is n^2 is taught on day 1, its so fundamental and basic and even if you forget the actual result, it takes just 5 minutes to derive it from first principles ( just write the sum forwards to backwards, then write it again backwards to forwards, then add the two expressions, hey voila there you go! ). When we show him the expected solution, he is genuinely surprised and says we've pulled a fast one on him. "Its a trick question! ". He says he's never been taught anything like this in the classroom. That's just sad.
2. Find all the integer triples that form right triangles whose smallest side is less than a million.
Candidate's answer :
for i from 1 to 1000000 {
for j from 1 to 1000000 {
for k from 1 to 2000000 {
if i*i + j*j == k*k then print i,j,k;
}
}
}
Again, this is the "correct" solution and its eminently readable, but it is supremely inefficient and super-lame. Its like the candidate has never given any thought to the actual problem, and is just throwing loops and conditionals at it. I will refrain from giving the expected solution here, but any student of discrete math can generate pythagorean triplets in a much more efficient manner than the lame solution given above.
A little dose of Knuth's Concrete Math goes a very long way.
- alttag 15y agoIt doesn't seem to me that the candidate's response for #2 is "correct" (as you say). The most simple refutation being a 5:12:13 primitive triangle scaled 199,999x (such that the smallest side is less than, but not equal to, a million). Result: 999995:2399988:2599987, which would not be uncovered by the above solution as both j and k exceed the upper bound of the loop. As a more general critique of your test: which method is the best use of programmer time? The functions you request return static results, thus the performance hit should be one-time and cached. If so, why do you care? Finally, yes, I agree that we as a general population are not well-prepared enough in math. Still, I think you're putting too much weight on it. (I've had university CS graduates—supposedly—deliver 100+ lines of nested ifs that mathematically resolved to no-op, so I feel your pain. I'm just not sure that you're approaching this in the best way.)
- overcyn 15y ago"Find all the integer triples that form right triangles whose smallest side is less than a million." Is this the kind of stuff that you work with on a daily basis? If it is, then sure ask away. But if you're just looking for a programmer, why are you asking discrete math questions?
- dagw 15y agoWhy focus on stuff that is done on a daily basis? Most places I've worked, the stuff done on a daily basis is relatively simple and could be done by most reasonably competent programmers. The hard stuff that is done once every month or two on the other hand is the stuff that really ends up mattering and the thing I'd want to optimize for if hiring.