Fundamental Qualities of Good Programmers
hackerschool.com
hackerschool.com
Programming languages are "just" tools for expressing ideas. Ideas that a computer can then run. A programming language really is a language and it ultimately affects what you can easily say, how you say it and even how you think about problems. Put another way: semantics are important.
Of course, if you only know one language well and you believe it's just a way to direct your computer, you won't realize this.
> This is not to say that all programming languages are equivalent, that they are equally good at all tasks, or that it isn't worth learning more than one programming language. Just that all good programmers have a deep understanding of at least one language.
You are right that knowing several languages expand ones abilities to express computation as it brings new abstractions on the table.
This also does a lot to cut down on cargo cult programming [1] which in my experience is much more prevalent than I would like. Having a solid understanding of the environment you're working with makes it much harder to blindly follow the examples of others, because it's much easier to determine whether or not all/part/any of their example applies to your situation.
"One day, they'll figure out a way to build machines which will implement what you're thinking. Even then they will near clear thinkers to run them."
Almost everything listed there on this list is a skill. They are not qualities and perhaps aren't even fundamental.
Curiousity, tenacity, perseverance, patience, imagination. Add in some courage to show others unfinished work and the humility to take help/criticism.
Those are qualities I have seen in good programmers.
These are not innate qualities really. But they are qualities which escape quantification.
But reading a lot of code and debugging ... those are skills & need to be built. And then built upon.
I agree that curiosity, tenacity, perseverance, patience, and imagination are all qualities that good programmers have, but when thinking about how I can improve, I find the question "How can I be more curious?" less helpful than "How can I be more systematic when I'm debugging?"
Sure, the knowledge is out there and you can acquire it over time, but without having internalized that knowledge and given time for strong intuition to develop, you're not going to be nearly as effective.
He stated why would I waste brain cells on something that is alphabetically sorted in a book?
I agree you need to know things like how malloc() works, how a function (lets say c) is allocated on the stack into frames, etc....
Just wanted to throw that out there. I love not knowing everything, but that has come after many years of learning what I don't need to memorize/internalize.
Breadth of knowledge beats being an expert in a single language hands down every time. If you are not familiar with other programming languages and concepts then you will not be a good programmer in your own language. Each language only exposes certain concepts. Using other concepts in other languages lets you bring those patterns into your chosen language—albeit with greater difficultly. Without that knowledge you are more likely to just fumble through it rather than building something cleaner.
Also relevant is the Sapir-Wharf hypothesis (http://en.wikipedia.org/wiki/Linguistic_relativity). Language ultimately determines what you think.
Finding bad code is easy. Finding people who are irremediably bad programmers is not that easy. The most you will find is people who are still learning, or have some specific bad habit.
I tutor people 1 on 1 now, besides working, and it's incredibly better. Never in this scenario have I met anybody who's never had those 'aha' moments.
What? I can go get you a few hundred right now if you want. It is trivially easy to find tons of bad programmers.
>The most you will find is people who are still learning
I wish. Mostly I find people who should be still learning, but don't want to. People who have an incredibly superficial knowledge of one set of technologies (lets say php+mysql) and think they are set. The kind of depth of knowledge you would expect from someone with 6 months of experience, even though they've actually been doing it for 5+ years.
I have seen those. They were slower than me but were smarter than me.
"Having a large code radius"
It's not about the number of lines of code, it's about flatness of hierarchies. It's easy to deal with thousands of components but it's hard to deal with factories of factories of factories.
I recommend (re)reading "Great Hackers" by pg and (re)watching "Hammock Driven Development" by Rich Hickey.