I’m going to go out on a limb and say that the programmer who goes home every day and works on her latest open source/bleeding edge pet project is often a far WORSE programmer than the guy whose extra-technical life is extremely rich and varied. The simple fact of the matter is that writing great software is only partially about writing great code. At least as important (and often more so than the code) are abilities such as these (which can NOT be practiced by writing code):
–problem solving skills (in the business domain): can you easily analyze and understand the issues involved in breaking wildly disparate, real-world, utterly non-technical scenarios down into their component parts? If not, you’re a crappy programmer . . . no matter how great/deep your knowledge of code, patterns, tools, etc.
–human psychology: do you understand what motivates users (including yourself) and how general human psychology informs the solution to your domain problems and the needs of your software (User Interaction, Features, what have you). This is also vital to being a positively contributing member to a well-oiled and smoothly-running team. Practice coding all you want, if you don’t have a full life outside of what you do in front of your computer, you’re a crappy programmer
–creativity: it is widely argued whether this can be practiced/learned or not, but exercising one’s creative abilities is crucial to the creation of quality software. If you are a one-dimensional person, whose only creative outlet is technology, I assert that you’re probably a crappy programmer.
The bottom line is that the greatest programmers have a broad and deep pool of non-technical experience and interests, and that one-dimensional, 16-hour-per-day Hackoids are more likely to create unimaginative solutions than those who realize that the technical part of their experience and knowledge is only a part of the picture, no matter how important that part may be.
As one of Kenneth’s detractors, I acknowledge what you put forth. We thrive on diversity. Solving one kind of problems really well does not make us good problem solvers. Creativity, must be exercised. I agree. I believe it is always at work no matter what we do ( of course some are more creative than others).
However, the talk about understanding others and my own motivations …I don’t know. We leave that one alone. To say you understand your own motivations is the same as saying you can chew on your own teeth.
I see the need for diverse stimuli. I don’t think anyone reproached Kenneth for liking/wanting to spend time with his family. I don’t think anyone was really promoting the idea of 16-hours of coding per day either. I understood the blog to be promoting the idea of recognizing ones limits/weak points and pushing to become better by working on those week points (not 16-hours a day, just working continuously). While, Kenneth was emitting the attitude of a factory worker who is drained not necessarily energized by his work. And you said “Go Kenneth!” as though he is a better problem solver, as though he has a better understanding of human psychology, as though he actually does have more than one creative outlet. He maybe all those things, but his attitude is not that of a curious programmer that is all.
i haven’t got the impression somebody was saying that one has only to code, in my case i (maybe wrongly) tried to say that a person who does not find the act of coding pleasing will not be as good.
it just seems logical to me that when someone enjoys doing something, he does it even in his free time …
a guy who codes 9-to-5, then goes home and doesn’t wanna hear/think about coding at all until 9am tomorrow does not get any better. IMO he will deteriorate as he cleanly cannot enjoy even his work, so he will in the end succeed in putting something together (as a seasoned, proffesional developer …), but without the joy, without truly wanting to do his best it will miss at least the spark of brilliance which could have made it shine.
in the worst-case scenario it will miss the second look he couldn’t have been bothered to give it, because he was so burned out. yeah, it comes from time to time, but when the joy is gone, the effort one has to invest to dish out “good code” is bigger, meaning he is burnt out sooner meaning less joy …
so at least the programmer who goes home to play with his pet project/whatever has his zenith still in front of him.
maybe you shouldn’t pay so much attention to the hours and look at it like this: if what you do doesn’t interest you as much that you’d be willing invest some time when you don’t have to, then you are clearly at disadvantage compared to the guy who does.
yeah, you are mr. big pro dev, your uberknowledge is to be feared, and you may even learn a few things during your insert timeslice a day.
but given enough time, a low starting, rapidly growing function will outgrow the high starting slowly growing.
take in account the fact that some facts change pretty quickly in IT, and hey, is the first guy still learning something, or just “loosing it” more slowly ?
or in yet another entirely different way:
are you saying your wife enjoys sex so much she reserves it one hour a week a doesn’t want to talk about it outside of the pre-set window ?
“List all your relevant skills, then note the ones that will still be needed in 100 years.”
Well, obviously, at the top of that list is going to be the skill of knowing what will be needed in 100 years. But I can’t see how it’s at all relevant. Exactly how long is that bloke planning on living, let alone working?
And I also think using kata (which is both the singular and plural form, BTW) as a metaphor is not quite what you’re getting at. In most systems, performing a kata means doing the same thing every time with limited opportunity for learning something new. There are multiple interpretations of given movements, but a strictly limited (small) number of them. And that’s not at all what you’re suggesting doing.
As it happens, the original applications of kata movements have been pretty much lost in many martial arts, most notably karate. What almost everyone is taught is actually rubbish, when looked at from a practical standpoint. So from that point of view it’s an even worse metaphor
ComputerWorld: Do you have any advice for up-and-coming programmers?
Bjarne Strostroup: Know the foundations of computer science: algorithms, machine architectures, data structures, etc. Don’t just blindly copy techniques from application to application. Know what you are doing, that it works, and why it works. Don’t think you know what the industry will be in five years time or what you’ll be doing then, so gather a portfolio of general and useful skills. Try to write better, more principled code. Work to make “programming” more of a professional activity and less of a low-level “hacking” activity (programming is also a craft, but not just a craft). Learn from the classics in the field and the better advanced textbooks; don’t be satisfied with the easily digested “how to” guides and online documentation - it’s shallow.
As always, with these questions, it’s really all a matter of choice between specialisation and balance.
You should go practice your kata when you’re young and hopeful, and you believe your efforts will be recognized. Perhaps that will lead you nowhere, but if it’s a game to you, then by all means, grow. Maybe you’ll make it work for yourself, if that’s what you really want out of life.
To achieve the most, it’s important to find a stimulating environment. A place where you can share ideas, build great stuff, experiment even. This is a rare find. As most professional working spaces are mind-numbing substandard shops, you rapidly meet a divide: 40h+/week, you spend delivering code; the rest of the time, you’re on your own. This makes for a rather taxing, unsatisfying, profession! Since writing a compiler will only get you further away from friends, family, art, mindfulness, exercise, finances and etc., you may find more sanity and balance in other pursuits.
What you’re able and willing to grow into is tightly linked to your way of life. Since the question here is about cultivating your abilities beyond mere job requirements, I think it’s vital to consider the freedom factor. Nobody should be expected to spend much of his free time compensating for a mediocre job. I see people placing a lot of expectations on themselves and others. It’s so easy to feel like a noob and guilt for more, but that’s unhealthy.
We should accept our failings and enjoy our hobbies to grow our own ways. And perhaps we should all leave our shitty jobs. As that other guy said above, 8h a day is a lot work to put into a single thing.
Currently, the gold standard in software comes from Apple, not Microsoft. It pains me somewhat to even write that out loud (because I earn my keep on the Microsoft platform but that may change).
Apple’s software+hardware dudes apparently can change a hardware platform (from PowerPC to Intel) without a hitch, produce software with a high degree of polish and with an intimate (close?) releationship with underlying hardware (which also happens to be the absolute top notch) - and package it up so that they are flying off the shelves. Just imagine if Microsoft had to “switch” to a non-intel hardware platform or, gasp, to a different set of APIs. On the other side of the fence, we have this disaster called Vista (disaster primarily because of incompatible hardware setups it runs on), overheating xboxes, clunky Windows Mobile devices (with a task manager as an “option” for users to “get things done”), memory-guzzling applications, … the list goes on - and all that was built on top of “best practices.” Not surprisingly, it takes more than a mechanical bullet list of items, GOF book and an SDK to get it right. And ship it soon :), like today.
As it happens, my long-held view is that a software developer must be close to OS, hardware, programming language and the Big Picture.
Fluency in several OSes is just as important as fluency in several programming languages, otherwise who would not know who is stealing from whom and where the best ideas are. As long as things ship (and sell), it does not really matter. What matters is that software works and does not frustrate users.
I agree with you about Apple products being superior. And, yes, Vista was/is a disaster. I reinstalled XP pro after two weeks of trying Vista. I have not missed it. I also agree with you that one must be fluent in different programming languages and different OS(s). I guess it is this very mix many tools and many ways of approaching one’s work that one begins to build a bigger a picture.
However, it always matters as to who buys the software. Apple, dominating 10% of the market, sells to its consumer cult (of a certain socio-economic background among other attributes).
Despite all of this, I see that of which you speak.
As usual great post Jeff! Thanks.
Was just pondering what was needed for me at this stage since I’ve already ‘learnt’ the language… guess, this is what I was looking for.
Excellent. First time I’ve commented on your blog, I think, though I’ve been reading every post for the past few months.
As a student entering college at the University of Chicago next month to study physics (and maybe minor in CS), this post is extremely interesting, and not least because this is partly how I was already trying to think of my education. Glad to be validated by a programmer I respect.
After reading this article and Steve Yegge’s, I now understand why I do poorly on some things, including programming, and better on others.
When I care about an activity, I naturally look for and implement better methods of practice and to integrate ideas from other genres. For example, my martial arts plateaued until I studying other forms of movement and started thinking about and improving how I practiced.
On the other end of the spectrum, I never figured out how to learn in college. As a high school student my study habits were sufficient to get straight A’s and top scores on AP exams and SATs. Then I went to a top science and engineering university where they were no longer sufficient. It never occurred to me to analyze my study habits (i.e. my practice). Now I realize it may have been because I didn’t really care about the subjects and simply didn’t want to bother.
Programming, unfortunately, falls into the latter category. I do it for money. If I practiced outside of work and improved, I could take get more done at work and take on potential lucrative projects, like implementing ideas I have for startups. Instead, I spend my time on other activities that I care about more and keep me in good physical shape, but may never get to the point where they can become a profession.
As someone who has done martial arts for many years I think the analogy with kata is a poor one. Kata is about repeating the same rigidly codified physical movements again and again and again. I don’t see how that relates usefully to learning new programming skills.