Tell me more ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

Hey all. As part of ongoing research that I am conducting, I would like to ask a crowd, that I feel is the most qualified, to answer a question.

What does the community feel are characteristics of a mature programmer?

I'm not asking the question because I'm looking to hire or anything of that nature. A colleague and I repeatedly hear a trend throughout universities and specifically computer science departments. The students generally ask questions of the form:

  • How can I become a mature programmer?
  • How can I become a world class programmer?
  • What steps should a new programmer take to become more skilled?

So, with that, we are conducting research to attempt to identify an optimized path that would allow an introductory programmer to advance to that of a skilled/mature programmer. Now, I understand that there are many "it depends" out there depending on what vertical industry one works in, but I feel we can determine many common characteristics irrespective of the industry. Any thing you can offer is greatly appreciated. Thanks.

share|improve this question
2  
A beard... ;-) and the ability to overcome 30 character limits. – user17210 Feb 14 '11 at 9:12
show 2 more comments

22 Answers

Humility

A mature programmer knows that he does not know everything. He realizes that our field continuously evolves, and that better ways of doing things are invented all the time. He is not afraid of saying "I don't know", and he is always ready to learn from anyone who might know something he does not. He does not put his own ego above the truth.

Oh, and by "he" I mean "he or she".

share|improve this answer
13  
+1 - with a small addition. "I don't know" is unprofessional. Better to say "that will require some research", "I'll find out" etc. Sure, its fine to say this to a fellow programmer and they'll probably respect you for it, but your boss not so much. – P.Brian.Mackey Feb 13 '11 at 2:10
16  
Or as Oscar Wilde said, "I am not young enough to know everything" – Gaurav Feb 13 '11 at 4:27
33  
"I don't know" is unprofessional.". I disagree. When you don't know you say so, and you make it known you will find out. Dancing around it with semantics doesn't fool anyone; Instead, your relationship with your boss and team should be such that you can speak honestly. I work in a group where I am the only developer. My teammates are expert networking engineers. When I don't know something about what they do I tell them and ask questions; They do the same with me when I discuss what needs to be done when developing something. – the Tin Man Feb 13 '11 at 5:44
5  
@P.Brian.Mackey: "that will require some research" is implied. I think there is nothing unprofessional about admitting that you do not know something. On the other hand, if you boss holds it against you, that, IMHO, is unprofessional. – Dima Feb 13 '11 at 15:12
2  
@Brian : hmmm... could not disagree more... Basically if one does not know it is preferable disperse a load of BS rather than telling it like it is. I personally loose a lot of confidence when I detect that someone is feeding me the "say anything but by all means never admit now knowing" speech. Do you assume ALL medical doctors know ALL there is to know about medicine ? If his knowledge has limits, do you immediately point fingers at his "unprofesionnalism", perhaps even his incompetence !? You reap what you sow, if you prefer BS fed back at you then that is exactly what you will get! – Newtopian Jul 25 '11 at 21:11
show 2 more comments

Understand Concepts instead of Implementations

One of the big benefits of being around the block and maturing as a programmer is understanding the concepts of why and how things work as opposed to just being able to make things work. Like understanding the principles of why and when to use patters vs just doing it because that's the way the other guys on the team started the project and I want it to look the same.

share|improve this answer
show 1 more comment

Empiricism

During the course of a programmer's career, the programmer is likely to run into strange project managers, new languages, new technologies and a whole host of changes being inflicted on him. Experience with real systems, customers and many different programming languages allow him to spot the recurring patterns, just like the football coach sees patterns in the movements of his players and is able to extract tactics out of them.

share|improve this answer
show 1 more comment

Open Mindedness

This is one of the most important things I believe that programmers (and pretty much everyone as well) should have. I really get annoyed by people who constrain themselves in a specific technology and shun everything aside simply because they're different (e.g. Apple VS Microsoft).

Just because you're fine making a living doing technology X doesn't mean you shouldn't try and learn technology Y. Being open to change is a mature trait everyone should have.

share|improve this answer

Structured thought

Being able to deduce what tools, algorithms, practices and methods are applicable for completing the problem at hand, based on real-world experience and knowledge of the software domain.

share|improve this answer
show 1 more comment

Mature programmers know that it's always a people problem. They know there's no best solution, but there are many satisfactory solutions. They know the cost of putting off 'til tomorrow. They have learned superstition and dogma, and broken through them. They know why they do what they do how they do it.

share|improve this answer
show 2 more comments

Patience

It is (almost always) more important to produce a high-quality product than to push it out the door somewhat faster. Take the time to test, fix, and test some more.

share|improve this answer
show 4 more comments

You're Always Learning

  • You're working in a .NET shop, but after work you're playing around with this cool Clojure project you read about on a blog during your lunch break.

  • When you accidentally fix a bug by changing some unrelated piece of code you don't move on until you understand why changing that unrelated piece of code fixed the bug.

  • When you hit a problem you can think of several approaches to solving it. This is because each approach is pulled from miscellaneous systems you've played with in the past (closures in javascript, actor-based concurrency in Erlang, code-as-data in Lisp, whatever).

share|improve this answer

I think your question is full of good intentions, but I think most contemporary university educations are missing the point most of the time, and as such, I find that your real question is in your text body, rather than in the title.

The point of education is to inspire people to live up to their potentials. This is not done by inventing an algorithm of the optimum path to take, but through faculty's hard work with pedagogy, willing the students to see the bigger picture.

When I teach students, I always try to enthuse the students with the topic by drawing parallels to previous experience, applications in parallel fields of knowledge, philosophy and epistemology.

I sorely missed the big picture during my time as an undergraduate. The teachers seemed distant, annoyed at having to teach and unwilling to step out of their respective comfort zones of their areas of specialism.

If you are looking to become a great university for undergraduate students, while you ought to be experts in what matters for this industry, also care about educating your teachers for teaching. That would be the main take-away from my answers, if anything -- to make your students enthusiastic about the world and helping their imaginations dream up how they can improve the world through their chosen field of study!


I know that answers should mostly be short and to the point, but this is a topic which I care greatly for. Let's see if I can distil some anti-patterns of teaching of my former uni:

  • Lecturers could not wait to get back to their research outside and away from the lecture.

This led to the lecturers being perceived as bored or simply not caring what people learnt. Some lecturers even acted in a hostile manner when any questions were being asked, because they felt it disrupted them.

Lecturers did not get rewarded for good teaching. Or at least not punished for bad teaching -- those who were excellent teachers would get rewarded, but there were no draw-backs of not giving a damn.

  • Lecturers knew nothing of the state-of-the-art.

Lecturers only knew their personal state of the art, so they only taught that. Potentially they were up to speed with other academia, but never up to speed about what the software industry was actually using.

  • Lecturers were too copy-left

I guess this comes a bit with the field of academia - the state finances it, so there's no point in making things commercial. Faculty feed their fat asses by means of students' loans and state sponsorship, without learning about the industry around them. They state that at some point their research turns into commercial software and as such they are contributing back some of the vast amount of money they get off the state, but in reality they are free to choose pretty much anything that catches their interest without regards for who is paying, nor who is gaining utility from it -- note that utility is not only in monetary terms, but defined in a softer sense. The point of universities is to optimize what amounts to Pareto-efficiency/Kaldo-Higgs efficiency of the society, not to become departmental fiefdoms.

Many times, a commercial entity had already a superior solution to what was being discussed, or at least a real-world implementation of it. One example where this was the case was during discussions of proving software correct, when Microsoft had had a working operating system based on the same principles of axiomatic proofs (Singularity), being discussed, for two years, in the public, at the time of discussion, but the lecturers knew nothing of it, nor cared to learn about it. If I mentioned it to them, they shrugged and didn't care. One of the lecturers were so immature and self-absorbed that the whole class of 100 students sat in complete silence while he ranted for an hour, then left, without asking any questions.

Not to mention the obvious hatred towards anything not unix/copyleft or free. No pragmatism there (best tool for the job like in ALT.Net/Software Craftsmanship manifesto, etc), but rather elitism.

  • Lecturers and post-grads somehow thing of UGs as inferior

In Sweden during gymnasium (in other words: sixth form college), perhaps because it was a good gymnasium, researchers got invited to discuss their findings from a layman's perspective. For example, one researcher discussed the problems of accurately simulating protein folding saying how the actual folding process could be likened to a funnel where a solution placed tangential to the surface would always progress inwards/downwards.

While this wasn't a very rigorous description of the process, it made me interested in the subject of computation.

In England where I did my UG years, on the other hand, one often got scowled at by researchers for trying to understand what they were doing, either with the sentiment of "you are too young and not far enough into the education to even entertain a hope of grasping the simplest of principles of my work" or plainly "go away, you are annoying me".

share|improve this answer
show 4 more comments

Gray hair (what's left of it), wrinkles, and the ability to tell stories about the good old days of punch cards. That's a mature programmer! (Don't get me started on punch cards! Or IBM JCL! I could go on for hours....)

share|improve this answer
show 3 more comments

Mature programmers...

  1. Know that they don't know everything; many programmers think they know it all.

  2. Are able to smoothly adapt to changing circumstances.

share|improve this answer

A mature programmer probably gets annoyed at my "old jokes" that I throw at him occasionally.

A veteran programmer is one who agrees with me when I say the same jokes.

Joking aside, mature programmers are constantly aware of the dynamics of the team in which they work, probably more so than the project manager herself.

And apart from wooly statements like that, I say that becoming involved in the community, helping others out at the same time as learning constantly yourself will help you on your way to becoming a world-class programmer as a new starter.

share|improve this answer
show 1 more comment

Hygiene -- one of the most important characteristics in some environments (Asia, in my experience). Believe it or not - try working with programmers who skip basic human practices.. Even in the U.S., programmers are not particularly known as "good people" to be around!

share|improve this answer
show 2 more comments

Creativity

Writing code is an act of creativity. It isn't science and it isn't engineering, although programmers are happy to apply science and engineering to the creative process, when possible.

share|improve this answer

To paraphrase some chess advice I once heard: find the best move, then find a better one.

The problem with school is that you only have to submit one correct answer, whereas most software can be written in dozens of different ways, each with their pros and cons.

Have students submit any working solution for the first assignment, then have them redo it but with specific architectural restraints for the second assignment. For example, if a student's functions are really long, impose a line limit per function for that student's second assignment. If a student's object design is poor, impose a specific set of classes that must be used for that student's second assignment. If a student does a lot of reinventing the wheel, mandate the use of a certain library.

Have them compare and contrast the two. Improvements like these are what master programmers pick up over many years of trial and error, of reading other people's code, and having peers review their code. You want to instill the idea that a minimal working solution is not always the best one, and provide some heuristics to help move in the right direction.

share|improve this answer

Well-directed pragmatism

Mature programmers understand which rules and guidelines to follow and when.

share|improve this answer
show 1 more comment

Self-confidence

This goes hand in hand with humility which also is a very important trait, but a very good characteristic in mature programmers are self-confidence, or rather not having to prove that you're the best and know best

It's a very common programmer trait that they want to impress upon the world how good they are: they're the dogs bollocks and that's that. While this might seem like self-confidence it is in fact more a symptom of a feeling a insecure (to various degrees) and using false bravado as a self-defense mechanism

Programmers with true self-confidence need not win every argument, they need not always get their way. They're open for alternative solutions and don't feel threatened by other programmers or team members. They don't react defensively when someone suggests an improvement or refactor their code.

They pick the battles that matter and don't react emotionally to irrationality. Only when you're so good that you don't feel you have to prove it any longer will you arrive at true maturity :)

share|improve this answer
  • He understands the problem before solving it.

  • He finds right sets of abstraction.

  • When implementing a logic he thinks in terms of problem , not in terms of class/variables/data and their transformation.

  • He follows best practices.

  • He improves the quality of code constantly.

  • He uses right sets of tools available.

  • He Keeps himself up to date with ever-changing technology.

share|improve this answer
3  
... including: How to use bullet list. – user unknown Feb 13 '11 at 9:25

The first thing that comes to mind is the mature programmer understands that the business domain is important and that she can never meet the requirements until she understands it.

The second thing that comes to mind is the mature programmer delivers products reliably. They may not be perfect but they meet the user's needs.

The third thing that comes to mind is that they use new tools when they solve a problem the old tool didn't - not just because they are new and hot or they wanted to learn it.

The fourth thing that comes to mind is that he understands there are things he won't particularly want to do and he just does them rather than thinking the world revolves around his wants:

  • filling in timesheets
  • working the same hours as the rest of the staff
  • talking to non-programmers
  • dealing with the questions of less experienced people
  • filling out required forms for HR
  • doing the less sexy programming tasks as well as the interesting ones

and on and on.

share|improve this answer

Thoughtfulness.

Think before acting. Whether you are designing, coding, testing, speaking, ..., it is best to think about things before acting. That is, it is worth your while to try to have some measure of understanding before you go ahead and do.

Think while acting. Now that you have (hopefully) a better understanding of what you are going to do, it is time to do it. If you are not thinking about what you are doing (and how it fits into the larger picture), you can still screw the pooch.

Think after acting. You've done your bit. Did you do it well? What have you learned. How can you do it better next time. Evaluate yourself. Evaluate your task/project.

share|improve this answer

Experience

Maturity in programming can only come from having been exposed to a wide variety of problems, technologies, and techniques. It usually takes many years to gain enough experience to be considered mature, not something that can be done during an undergrad curriculum.

However, if you could find a way to get students to expand their skills in disparate subjects and programming languages, the experience and maturity will come on their own.

share|improve this answer

Sharing

Mature developers knows that sharing has many benefits, as in

  • increase the overall quality of the code if the good stuff is shared around.
  • allows the tighter working team to be evolved.
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.