I am a software engineer that's had positions programming in VBA (though I dare not consider that 'real' experience, as it was trial and error!), Perl w/ CGI, C#, and ASP.NET. The latter two are post-undergraduate, with my entrance into the 'real world'. I'm 2 years out of college, and have had 5 years of experience (total) across the languages I've mentioned. However, when it comes to my resume, I can only put 2 years down for C#, and less than a year down for ASP.NET.

I feel like I know C#, but I still have to spend time going 'What does this method do?', whereas some of the more senior level engineers can immediately say, "Oh, Method X does this, without ever having looked at that method before." So I know empirically that there's a gulf there, but I'm not exactly sure how to bridge it. I've started programming in Project Euler, and I picked up a book on design patterns, but I still feel like I spend each day treading water, instead of moving forward.

That isn't to say that I don't feel like I've made progress, it just means that as far as I come each day, I still see the mountain top way off in the distance.

My question is this: How did you overcome this plateau? How long did it take you? What methods can you suggest to assist me in this?

I've read through Code Complete, The Mythical Man Month, and CLR via C#, 2nd edition -- my question is: What do I do now?

Edit: I just found this question on projects for an intermediate level programmer. I think it adds to the discussion (though it does not supplant my question). As such, I'm adding it to the question as a "For More Information".

30 accepted

congratulations! from your description, you are an intermediate developer.

this phase will last about 3-8 years, depending on your willingness to learn above and beyond the problem of the moment

to speed the process, read, surf, blog, go to user group meetings, find a mentor, do independent research, code side-projects, and bury yourself in new technologies. This may shave a year or two off the time.

Or you could have a life outside of programming ;-)

seriously, stay current and introspect, but turn the #%$@ thing off every now and then

Addendum: when you go outside, remember to wear pants.


One of the best ways up the mountain is to write something for yourself because you want to. The best programmers have wonderful answers to the question 'what's the most interesting program you've written in your spare time.' If you're not writing any code in your spare time, you don't love your craft enough to get better at it.


What you're doing now is great, but if you want to incredibly speed up your progress you can do two additional things:

1) "Teach" - A simple way to do this is to start a blog, and attempt to contribute something useful on a regular (weekly perhaps) basis. Aim to about things you have recently learned, or that you do not know yet. That means you'll force yourself to research, understand and re-expain.

BTW, You can very easily sign up for a SingingEels account to which you get a free blog on an existing development community.

2) Write lots of mini-programs - By this, I mean about 1 per week. You can use this in junction with the above... or just for fun. What I did as a young developer was just randomly pick (i'm not kidding) a namespace in the .NET framework. In that, pick a class that you've never seen/used before, and make a small program that uses it.


Try to

Read MORE books Pick up those big titles from Amazon and read them. For example, author of Code Complete had wrote a great book on software enginieering - Rapid Software Development, buy one and read it.

Learn a different programming language A scripting language like python/ruby is worth to study. Or maybe a functional programming language:) This may change your mind of programming. You may know that some of the GOF patterns are not necessary for those kind of languages.

Join a community People can exchange their thought by listening from others and giving presentations.


I've been programming since I was 8... I'll be 33 on Christmas Eve. I still see the mountain off in the distance. No matter how far you come, there's always more to learn.

Get the paradigms under your belt and figure out how the language you're currently coding in implements those paradigms. Programming is a lifetime experience that always has more to learn. That's the joy of it, no matter how proficient you are, there's always more.

One way I find to learn new things I wouldn't normally learn is spend time on here and other programming forums like Bytes and Experts Exchange where people ask questions. If you can answer the question, go right ahead, if you can't, then try and figure out how to complete the task yourself, not only will the OP appreciate your effort and assistance, but you'll learn something new too.

I find that I learn more by helping other people find answers to things I don't know yet than I ever would by just programming my every day stuff which I do day in and day out.


You must go through larval stage.

Though I now program in VB.NET on Windows, I went through larval stage on Linux x86 with assembly as my primary language.

For a time, you must devote yourself to the craft until you master it. What are called instincts of a master programmer are really learned behaviors. It is a shared culture. Programmers must think like one another, and like the machine.

Sheep become like shepards and shepards like sheep, but neither are very long in the world. With [trees and] Ents it's quicker and closer, and they walk down the ages together. -- Tolkien

Know and understand. The greatest skills are not those bound to a specific language, but can be applied to almost any language. Know the concepts, look for them in both problems and languages, be ready to invent new things when necessary.

This is the path to greatness.


Intermediate programming status implies that you're moving out of the code monkey "type faster" mentality and into the realm of wanting to build real systems as a career. This is a major professional change and, frankly, it's not really about technical skills. Working at the intermediate (aka "developer") level requires a significantly advanced set of people skills.

Here are some symptoms you could think about:

  1. Do you get into edit wars online? If so, you might be showing that you like to argue about details inside your comfort zone more than you like to try to understand the other person's point of view.
  2. Do you think of languages as truly different things? C# and Java both bring their own platforms and resources to the table but both are effective models of computability. Can you learn a new language and platform fast enough to get paid to do work?
  3. Do you still think of software tasks as typing? If you're given a task at work, why? What is this code going to be used for? What system will it be a part of? That information can dramatically change your proposed solution.
  4. Have you left the know-it-all phase of your life behind? Are you listening to the rest of the team or are you just trying to think of the next thing to say?
  5. Have you realized that "pulling an all-nighter" to produce a buggy last-minute solution isn't impressive anymore? After the first eight hours, you can easily imagine that the rest of the time was just used in typing bugs.

The best summary that I can come up with is that the intermediate programmer (or "developer") has learned to be more productive in eight working hours so they can go the hell home and have a life outside of work.

Bonus points awarded if you manage to find a spouse and reproduce....


how about getting involved in other ongoing open source project, so that at least your work will be worth while to someone and you can learn and interact with other more advanced developers doing real world work.

so that at least you're not limited in what you want to learn or what type of project that you want to do. and it's already a free tool that you're using, you can be proud that you actually help to make it better.

and it's shows up well with your resume too. :)

so if that still leave you with some free time, why not keep a blog documenting down your learning, experiences and what not. who knows, you could be the next joel on software or coding horror :p


Find smart programmers and learn from them. Imitate them. Notice things they do differently than you do.

Does your company do code reviews? That's one of the best ways to learn. You might be amazed at the suggestions more advanced programmers make and the things they thing about while coding.


Read "The Pragmatic Programmer: From Journeyman to Master" and follow its instructions...