views:

544

answers:

14

It's been one and a half years since I graduated from university with a degree in computer science and engineering. I joined a company which does maintenance of a large enterprise software system. First I thought with time I'll become a very good programmer. But now I'm beginning to realize that things are not exactly that way.

What I need is some advice/tips/ideas on becoming a competent programmer when you don't have a lot of chances on the job to design or code from scratch.

+11  A: 

I found that on the job experience is ok at helping you to improve, but much of that has to do with the passion and abilities of those around you. I've worked with a lot of developers, but all seemed to take it as a 9-5 job, and lacked one important thing - continuous improvement.

I've found the best way to stay on top of things and improve is to pro-actively read blogs, not just read them when google says they have the answer to my question. Also podcasts are a good way to stay informed about things that are relevant and happening on whatever technology stack you are working with.

Books help too, but I think it helps to use blogs, podcasts and twitter to see what the current trends are, and then you can get more information from books. Get involved in community, check for user groups or code camps to build a network. You want to find like minded people who are also interesting in continuous improvement, and you may or may not find that at your 9-5 job.

Have a pet project. You don't have to release it, but it gives you a place to try out new ideas, or new technologies in an environment where there isn't money, or your job, or someone else's riding on the success of the project.

Look at open source projects. Dig into the code of a project or two to get an idea how other people are solving problems. There are a lot of smart people putting out a lot of great code, take advantage of it.

NerdFury
Sometimes before an interview, a company will ask you to send a code sample. A pet project kills two birds with one stone.
MedicineMan
Amen on the pet project. A little python language quiz program I wrote for myself helped me land my current job.
BigBeagle
+5  A: 

You've got to take it upon yourself. Find an interesting Open Source project to contribute to or strike out on your own and start developing software in your spare time that interests you. There is a saying that formal education will make you a living, self-education will make you a fortune.

Dave
While a good answer on paper, in practice it would be nearly impossible to contribute anything but the most minor of issues with an open source program. Many open source projects are lead by extremely brilliant programmers that take advantage of the most advanced techniques and patterns in software development
Chris Marisic
@Chris: You wish.
sbi
There are plenty of open source projects out there led by people like me who know jack about programming and are always looking for help.
mrdenny
@Chris: Assuming this was true, we all have to start somewhere. Even contributing to 'minor' issues helps hone your skills. Surrounding yourself by people more skilled than you is a good way to improve yourself.
Dave
+14  A: 

Always learn. If you are ahead at work, learn more. There is always something new. If you're a c# programmer, learn LINQ with lambdas. If you're a c++ programmer, learn boost. The more you learn, the more you expand your horizons and discover what is possible.

I've been in my position for a year, and I'm much better than when I started. If you look back over what you've done, you may discover that you've grown more than you think. For instance, I don't feel like I know more than I did when I was in my early 20s, but when I examine what I now know and the skills I now have, I can see how much I've changed.

Steve
+5  A: 

In your situation (not writing new code from scratch at your job) probably the best thing you can do is start a hobby programming project. Pick a problem that's interesting to you and solve it.

At work you can write unit tests and refactor existing code as you fix bugs and add new features.

I'd also recommend reading at least one of

No book will give you the same skills you'll learn by writing code yourself, but these three give a lot of good advice, and will expose you to a lot of the knowledge that comes with the collective experience of the authors. There's a lot in these books that I wish I'd known earlier in my career.

Finally, check out the Programmer Competency Matrix. Probably not many of us score high in all categories, so it's a good place to look to find ideas for areas where you might improve.

Bill the Lizard
+8  A: 

First you have do code on your own. You will never advance in a 8 - 5 job. It has be to part of your life, and you have to be willing to spend free time doing it.

  • Particpate in an open source project. Get exposure to different coding and styles.
  • Read some development books, there are too many list already on Stackoverflow to list.
  • Create your own project, for yourself or your family. Do something interesting to you.
David Basarab
Agreed, you have to live it and love it!
Gary Willoughby
+2  A: 

I'm in the same boat as with you. I figure I might never be able to climb out of that boat but I'm going to keep trying. Of course, that is what some people say is a good (or on their way to be a good) developer is.

My strategy includes:

  • Blogging on Programming
  • Podcasts
  • Read others articles from Blogs, News magazines, etc.
  • Follow and learn about an open source project such as Firefox. I don't mean to contribute, just follow and understand it.
  • Contribute to an open source app (small or otherwise)
  • Write a few open source apps and publish them. This could be a month long project that you "finish" and simply release.
  • Read Books on Software Engineering -- not languages. Learning C# and learning details of design patterns and class theory are very different levels of material.
  • Try your very best to answer questions in detail on SO
Frank V
+2  A: 

There are three main components to success:

  1. Technical skills
  2. Conceptual skills
  3. People skills

By technical skills I mean knowing how to effectively use the latest language features, how to use a wide variety of tools (profilers, advanced debugging, etc) and similar. Keep up on the latest technology by finding a project you can apply them on, whether an open source contribution, personal/hobby project, or commercial project on the side (but make sure your main job doesn't suffer).

Conceptual skills are what will let you start to move up to positions of greater responsibility (and pay). Understand design patterns, architectural questions, and the conceptual underpinnings behind the types of code you write (if it's business code, understand the business concepts etc.)

People skills are what will cause other people to think you're a great programmer. If you learn to listen effectively to non-programmers, understand their needs, and code what they really need, people will come to think of you as a valued problem solver. People skills generally come with practice. Seek opportunities to work directly with customers (internal or external) and try to understand what they really need.

Eric J.
+2  A: 

The standard answers, I believe, are "start a side project" and "get involved in an existing open source project". Those are good ideas, and certainly, they offer lots of ways to learn things. Reading blogs, sure, thats good too. But I don't think they really help you become more competent, at least not in the way that I think you mean.

I think your (anyones) best chance to improve in programming is to find a mentor. Find someone with more experience than you, someone committed to good practices and design, and work with them on a complex, challenging project. Pair program if at all possible. I find that you can't learn the things you are doing wrong, usually, until someone can point out to why its wrong and what your better options are and why.

Of course, its not like you can usually do this. Side projects or open source projects are easier to obtain and get involved in; they are the low hanging fruit of self improvement. I think using those things to get you into the work environment that provides the team work and mentoring support is the best thing they can do for you; otherwise you are just practicing what you already know.

Mikeb
+7  A: 

Pair program with someone who is a competent programmer.

szielenski
+1  A: 

This is one of the down sides to working for a big company. When I first graduated years ago, I was lucky enough to join a small software company of 15 staff members. This small team environment gave me the opportunity to learn everything about team building, Agile development and more importantly, the development process.

If you work in a big company, you're more likely to be supporting already running apps and less time to work on a real project. My advice like that of @Dave is to spend time on open source project that you find interesting. This should help improve your development skills.

Helen Neely
Disagree. For example, if you get a job with a large Military contractor like Lockheed Martin, most likely you will be working on a development contract for some big new system. I worked for them for 10 years, and never once had to maintain an old program until I left and started working for a smaller company (with actual old customers to support and upgrade).
T.E.D.
+1  A: 

Acquiring good coding knowledge is the "hand-craft", so you may want to improve this. But does it make you a real good programmer? - Knowing all the deep burried secrets and writing something in one line where others need a whole page - learning a new language every week - is that it?

For me the real art of programming is to find the right level of abstraction to a given problem, a code that solves the current demand but is abstract enough to solve some more demands that you don't even think of today.

For me a real good programmer sees the bigger picture (the processes that trigger demand for code work), seeks and finds synergies and dependencies and uses them to advantage.

For me a real good programmer spends a lot of time with the users.

Does that sound?

MikeD
+1  A: 

I think its an artificial "gap". I've known people who were very good developers straight out of school. I've know people with decades in the industry who couldn't code their way out of a paper bag.

In a way, I think a lot of it revolves around what kind of person you are. Loving to figure out exactly what's going on helps. Loving to fix problems helps. Enjoying learning new things helps. Being a creative person helps. Being a royal screw-up even helps (our mistakes are how we learn).

T.E.D.
+1  A: 

First thing to become a competent program is to program a lot. So, if you aren't getting the chance to design & code from scratch at work, you need to program on your own time.

Come up with a personal project and work on it. The important thing is that it needs to engage your interest (or you'll never finish it). Then, when you're finished, do another one.

You want to start out with a small project that can be completed in, say, a week; each new project can be larger and more ambitious. This will not only gain you experience with programming specifically, but in other important things like estimating how long it will take to accomplish something...

comingstorm
A: 

What makes one a competent programmer? In a way I am asking for a definition for a few reasons:

  1. There isn't a simple definition. Unlike concepts such as the numbers zero and one, competency can vary dramatically depending on what is required and what someone has and has developed.

  2. The Dr. Phil law of "You have to name it before you can claim it." comes to mind if you want something specific you have to be able to identify it.

Another point is that programming isn't always all about the code. The process for creating code can be its own adventure and fun to learn various ways companies produce software.

JB King

related questions