views:

1165

answers:

21

Hi,

Its always said that more you program, the better you become. Sounds good and true. But I was wondering if there is a proven route to becoming a better programmer.

Something like:

  • Learn a
  • Learn b
  • Learn c > 'Now you are good to burn the engines'
  • Try stuff around based on your learning.

The answer might be similar to a CS course roadmap, but I want to hear from successful programmers who might want to pitch in with something notable.

Thanks

+1  A: 

For me, there has to be a reason to learn something new... that is, unless I have a project in mind or some problem I need to solve, there's no hope. If that prerequisite is met, then I usually try to get "Hello, world" working, and after that the sky's the limit. So much of development these days is just learning new APIs. Occasionally there's some kind of paradigm shift that blows your mind, but that's not as common as people like to think, IMHO.

Carl Norum
+1 for learning whatever it is you need to learn in order to accomplish some concrete goal/project.
ChrisW
+3  A: 

Practice, practice, practice.

Once you're over the basic hump of being able to program, you can also read useful books (i.e. Code Complete, Effective Java or equivalents, etc.) for ideas on how to improve your code.

jprete
+1 books for learning as well as practice, because otherwise you have nothing new to practice.
ChrisW
+10  A: 

My main piece of advice would be: don't be afraid to rewrite your own code. Look at stuff you wrote even a month ago and you will see flaws and want to rewrite stuff.

Make sure that you understand some fundamentals: collections, equality, hashcodes etc. These are useful across pretty much all modern languages.

Depending on the language you use - use lint and metric tools and run them over your code. Not all their suggestions will be applicable but learning which are important and which are not is important. E.g FindBugs, PMD etc for Java.

Above all refine and keep refining your work. Don't treat your work as abandonware!

Fortyrunner
+1 for: Above all refine and keep refining your work. Don't treat your work as abandonware!
Fábio Antunes
This is so freaking true, you 3 months from now looking at your code 3 months back sees at least 1 code smell lol :)
non sequitor
A month! I'm looking back at some old horrible PHP and thinking, what was I thinking when I did that!I'm still learning, but I've found that learning and using a very opinionated platform such as ruby on rails (and ruby is very nice as a language), has helped a lot. Also, don't be afraid to read and ask others for help.
CodeJoust
+5  A: 
  1. Learn your 1st programming language a new programming paradigm or a
  2. find a mentor you can learn from
  3. Apply what you've learnt in a real world project
  4. Learn from your mistakes and successes and goto step one

The trick is knowing what to learn first:

  • Programming languages - this is the place to start bcause you cannot write software without knowing at least one of these. After you've mastered one language try learning another.
  • Programming paradigm - i.e. object oriented, dynamic/functional programming etc. Try to learn a new one with each new language.
  • Design concepts - S.O.L.I.D, design patterns as well as architectural concepts.
  • People skills - learn to communicate your ideas.
  • Team leadership - learn how to sweep others and how to become a team or technological lead.

After that the sky is the limit.

Dror Helper
-1, goto's are evil
No @opc - people that abuse SO ranking system are evil.
Dror Helper
+2  A: 

I would look at improving roughly in this order, in iterations with each building on the previous one:

  • Programming concepts. Understand things like memory management, pointers, stacks, variable scope, etc.
  • Languages. Work on mastering several modern languages.
  • Design concepts. Learn about design patterns. Practice using them.
  • Communication. Often-overlooked. You can only become a highly valued Software Engineer if you can communicate effectively with non-tech people. Learn to listen and understand the needs that people are expressing, translate that into a set of requirements and a technical design, but then explain what you understood (and designed) back to them, in terms they can understand, for validation before you code. This is not an easy one to master, but it is essential.
  • Architectural concepts. Learn to understand the big picture of large, complex systems.
Eric J.
+19  A: 

It's not true that practice makes perfect.

It's perfect practice that makes perfect.

If all you do is keep repeating the same bad practices again and again, all you'll do is make it possible to create bad code faster.

By all means keep coding. But at the same time be critical of everything you do. Always have a jaundiced eye that looks for ways to do things better. Read widely to get new ideas. Talk to others about how they do things. Look at other people's code, good and bad.

There's no "sure" way to learn anything that I know of. If there was, anyone could master this.

duffymo
+1 for the perfect practice bit. It's so common for people to just develop bad habits by not trying to gain perspective on what they're doing... in any context, not only programming of course (not that they're anything wrong with just wanting to get the job done and go back home after 8 hours' work, but that's not the most rewarding way).
Arthur Reutenauer
+1. And never stop learning. "Stop learning, start dying" - Ebenezar [Jim Butcher]
TrueWill
+2  A: 

Learning a programming language is in many ways similar to learning a spoken language. The only way to get good at it is to do it as often as possible. In other works

Practice, practice, read and then practice more

JaredPar
+2  A: 

First and foremost write code. Write as much as you can. Tackle hard problems. If you want to be a really good programmer you need to get into the guts of what you are doing. Spend a lot of time in debuggers looking at how things work. If you want to be a good programmer who really understands what is going on you need to get down to the metal and write highly async code, learn about how processors work and why SSE is so awesome. Understand threading primitives and be able to write them as well as describe what is actually happening in the processor. I could keep going here but you get the idea.

Second find someone who knows a lot more than you and learn. This relationship will work better if you are already deeply immersed in writing lots of code.

Third, spend some time in a large high quality open source code base. I learned a ton from the Quake I and Quake II code. Helped me be a better programmer.

Fourth take on hard problems. Push your limits. Build things that you thought were impossible. Right now I am writing a specialized compiler. I have learned so much just working on this for the last couple of months.

Steve
+2  A: 

Take time to learn about all sorts of coding techniques, tools and programming wisdom. This I have found to be crucial to my development. It's to easy to just code away and feel productive. What about what could be if you just had some more knowledge / weaponry under your belt to bang out that next widget.

Knowledge/know how is our real currency. The more we know the more we can make a better decision about how something should be done and do it faster.

For example, learn about:

•Development Practices, Software Design, Estimation, Methodologies Business Analysis Database Design (there are a lot of great books out there and online resources)

•Read Code - Open Source Projects are a good place for this. Read Programming blogs

•Try to participate on Open Source Projects.

•Look for programming user groups in your town and/or someone who can mentor you.

And yes, as mentioned practice. Don't just read, do and watch how you will improve. :)

klabranche
Yes! Reading programming blogs helps a lot
yelinna
A: 

The very belief in the roadmap's existence blocks the road to perfection.

Michael Krelin - hacker
sometimes one doesn't know where to start from, what are the stepping stones. I believe a more structered approach to learning things certainly have an edge.
Manav Sharma
Manav, you sure don't have to agree with me.
Michael Krelin - hacker
When a master can discard external structure, the structures are really in the master. Those who are novices must seek guidance from outside themselves.
Paul Nathan
+1  A: 

Find a program that intrigues you, one that solves a problem, or one that would simplify many of your tasks. Try to write something similar. You'll get up to speed very quickly and have fun doing it at the same time.

monksy
+2  A: 

You can try learning one thing really well and then expanding out to programming areas that are associated with the things that you have learnt, so that you can offer complete solutions to customers.

At the same time, devote part of your time to explore things outside your comfort zone.

Krish
+1  A: 

One you have learned something, try to learn something a little harder. Read and practice a lot about things that seem confusing at first time (lambda functins, threading, array manipulation, etc). It will take its time, but once you have practiced enough, what seemed confusing at first, will be familiar and easy.

yelinna
+1  A: 

Sure, strictly speaking, the more you practice programming, the better you become at solving those sorts of problems. But is that what you really want?

Programming is a human activity more than a technological one, at its heart. It's easy to improve your computer skills, not so hard to improve your interpersonal skills.

Read "Journey of the Software Professional" by Hohmann. One of the concepts the concepts Hohmann describes is the "cognitive library," which includes both programming skills and non-programming skills. Expand your cognitive library, and your programming skill will improve too.

Read a lot of non-programming books too, and observe the world around you. Creating useful metaphors is an essential skill for the successful programmer. Why do restaurants do things how they do? What trade-offs is the garbage department making when they pick up the garbage every few days instead of every day? How does scaling affect how a grocery store does business? Be an inquisitive human to be a better programmer.

David M
+13  A: 

All questions are rhetorical and meant to stimulate thought.

Technical parts:

  • Design Patterns - There are probably some specific to a domain but generally these are useful ways of starting parts of an application. Do you know MVC or MVP?
  • Basic algorithm starting points - Divide and conquer, dynamic programming, recursion, creating special data types like a heap, being greedy, etc.
  • Problem solving skills - How easily can you jump in and find where a bug is? Can you think of multiple solutions to the problem?
  • Abstract modelling - How well can you picture things in your head in terms of code or classes when someone is describing a problem?
  • High level versus low level - How well do you understand when one wants something high or low? This is just something I'd toss out there as these terms get through around a lot, like a high level view of something or a low level language.

Process parts:

  • Agile - Do you know Scrum, XP, and other new approaches to managing software projects? How about principles like YAGNI, DRY and KISS? Or principles like SOLID? Ideas like Broken Windows?
  • Developer Environment - How well do you know the IDE you use? Source Control? Continuous Integration? Do you know the bottle necks on your machine in terms of being productive?
  • xDD - Do you know of TDD, BDD, and other developments driven from a paradigm?
  • Refactoring - Do you go back over your old code and make it better or do you tend to write once and then abandon your code?

Soft skills:

  • Emotional Intelligence - Can be useful for presentations and working with others mostly.
  • Passions/Motivation - Do you know what gets your juices flowing and just kick butt in terms of being productive? Do you know what you would like to do for many many years?
JB King
Thank you, that's all I can say.
pestaa
+2  A: 

In addition to the rest of the great advice already given here, don't be afraid to read about coding and good practice, but also take everything with a grain of salt and see what works best for you. A lot of advice is opinion.

Good sites to read: -thedailywtf.com -joelonsoftware.com -codinghorror.com -blogs.msdn.com/oldnewthing

A great place to get practice is programming competition websites. Those will help you learn how to write good algorithms, not necessarily maintainable code, but they're still a good place to start for learning. The one I used to use (back when I had time) was: http://uva.onlinejudge.org/

Learn more than one language. One at a time, definitely, but ultimately you should be fluent in a couple. This will give you a better perspective I think, and help you to become an expert at programming, rather than being an expert at a certain language.

Learn the ins and outs of computers at all levels, hardware, os, etc. Ideally you should be able to build your own system, install multiple operating systems on it, and diagnose just about every problem that can arise. I know many programmers who are not "computer tech people" and their failure to understand what is happening at every level becomes a major hindrance in diagnosing and fixing unusual bugs or performance issues.

Jay Paroline
+1  A: 

As well as looking at 'last weeks code', talk to users of your work after delivery - be one yourself if possible.

Its not my bag, but some of the best coders I know have spent time supporting applications. The experience improved their product I'm sure.

martin clayton
+2  A: 

eat breath dream the programming language your using (no seriously, it helps)

Matt S.
+2  A: 

There are two kinds of learning - 1. Informal (like how you learned how to function in society- through interaction with peers and family) 2. Formal (like your high school training- through planned instruction)

If you want an entry-level programming job, formal training via an undergrad Computer Science/Engineering degree is the way to go. However, if you want to become a rock-star developer, it is best done by informal training- make unintentional mistakes and have senior developers curse at you, learn a design pattern because an app you are updating uses it, almost cry because a bad developer wrote a huge messy program lacking documentation and best practices and now you have to do several updates to it ASAP; thing of these nature.

It is hard for anyone to give you a list of all you need to know. It varies per area (e.g. a web developer vs. to a desktop developer) and it varies per company (e.g. Microsoft that sells software vs. General Motors that mainly just use it in their cars.) Informal traiing and being engaged in trying to learn to do your job better and get promoted is your best bet in my opinion.

To prove my point, everyone here has great answers but they all differ. Ask a rock-star developer how he learned something or when, why; they may not know- things just happen.

Phil
+2  A: 
  • Practice, individually and collectively

  • Keep an open mind, always learn new things, don't limit yourself to what's familiar. Not solely from a tech perspective, ui design, people skills, ... Don't be afraid of what's new

  • Peer review, talk to people about your code, let people talk to you about their code, everyone has a unique way of looking at a problem and you will learn a great deal from peers

  • Love coding. If you love what you're doing, putting in alot of time seems effortless. Every coder needs the drive!

Yannick M.
+2  A: 

One small addition to these good answers. When I work on someone else's code, usually I pick up something new. If you have the opportunity to work with someone else that is of equal or greater skill, noticing their programming style can teach you tons.

For example, in C++ & Javascript I no longer use if() statements without braces. The reason is that it's just too easy to mistakenly put:

while (true) {
    if (a > b)
        print a
        print b
}

This is an obvious typo, but very easy to introduce, especially if you're editing existing code. I just call it defensive programming in my mind, but little tricks like this are valuable at making you better.

So, find a peer or mentor, and work on their code.

Rocketmonkeys