In programming most of the variance in ability is explained by intelligence and not effort. You can take, for example, some non-CS student, teach them programming by saying "look, here's how you do it", and if they're the right student, they'll instantly be better than 90% of CS students. (And if they're not, they won't be. Oh well.) A lot of nerdlingtons who "know" programming and argue about Java going into their freshman year end up doing poorly.
So I would recommend taking it easy. It makes sense to do what you're interested in, and much of that is not night programming, then so be it.
Doesn't this go against the 10,000 hours thing? Sure, taking someone who is smarter and has more experience than other students and putting them in front of a computer will yield these results. However, someone who is solely smarter and does not normally program will not likely produce good code. Expertise is much more about practice than raw ability. Most of the really good programmers out there are really good because they're both smart and well versed, not just smart.
Have you ever worked with someone who is more than one standard deviation smarter than you are? I highly recommend the experience. I have watched people go from novice to better than I am in just a few years, and I have rather a lot more than 10,000 hours in my field. Hell, I have at least that much in my sub-specialization.
Mentoring people, especially if you can mentor people who end up learning faster than you did, who end up becoming better than you are is extremely rewarding, I think, and humbling.
I mean, experience is important, but intelligence can act as a multiplier on experience. It's like anything else; Everyone, if they start lifting weights, will get stronger. But, some people will get stronger faster, even if they lift the same weight the same number of times.
I absolutely agree with you. This wasn't my point though. My point was that Person A's 10,000 hours is worth more than Person B's intelligence advantage, not that Person B will not overcome Person A.
You only learn from encountering situations in which learning is necessary. I think the smarter person encounters these learning experiences more quickly, but people don't instantly become great at something.
The "10,000 hours thing" isn't a law, or a rule. It's an anecdote. Interpreting it as a fatwa against a personal life, or interests outside of a lab, would be a bad move.
I doubt they'll "instantly" be better than 90% of CS students, but if they're interested, they'll ultimately put in more time by themselves to learn how to program.
I remember that I was learning to program just as I was entering high school. I fell in love with programming instantly, but it does not mean I didn't spend hours upon hours debugging my first few programs to see what went wrong. But I didn't have anyone to guide me, so all my programs were imperative styled, not OOP. After taking my first computer science course in high school, my classmates thought of me as a programming genius (which I am not) since I was able to write programs faster than anybody else in my class. It's a lot easier to understand OOP when you've been programming for 1-2 years rather than 2-3 months.
That's why I'd say that a lot of programming ability is effort, not intelligence. Except for non-C family programmers, I've never met anyone who didn't have the "4-hour-debugging-session-only-to-find-it-was-a-missing-semicolin" experience when they were beginning programming.
"After taking my first computer science course in high school, my classmates thought of me as a programming genius (which I am not) since I was able to write programs faster than anybody else in my class. It's a lot easier to understand OOP when you've been programming for 1-2 years rather than 2-3 months."
---
I think this happens with most classes. I had to take an introductory MS Office class as part of my degree. I aced every test without effort, and was the go-to guy for help when even the teacher was stumped.
It wasn't that I was some kind of genius, it was that I had been working with various interfaces and software from the moment I could reach a keyboard.
Nitpicking here, but I'm quite sure OOP and imperative programming are orthogonal concepts. Clojure is a mostly functional OO language, while Java is a mostly imperative OO language.
Yes. On the other hand, 'procedural' can be seen as opposed to OO: the notion that the organization of programs is as a collection of procedures (and (incidentally?) data structures), as in C, as opposed to a collection of object types.
So I would recommend taking it easy. It makes sense to do what you're interested in, and much of that is not night programming, then so be it.