Take the 2-minute tour ×
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.

Preface: I work mostly in Python, and Web Dev languages (HTML, CSS, Javascript and Jquery, PHP)

I'm proficient at coding but I want to get better. In larger more advanced projects my programming skills break down. The more code there is the more trouble I have fitting all the pieces together. I understand syntax well, and I can catch and correct errors fairly easier. But the more advanced it gets the more I struggle.

I believe I have a good understand of the basic and nuts and bolts of programming and I understand what's going on, but when it comes to larger projects, especially ones with heavy math involved my confidence flags and I start making mistakes. It's not that I can't do it, I'm just not used to doing it. Does anyone have any advice for someone who knows programming, but wants to get better? The only tutorials I can really find are beginner basic type stuff. Basically what I'm saying is I want to be confident when I'm tackling advanced projects, but I can't because I have little experience dealing with difficult situations.

share|improve this question

migrated from stackoverflow.com Jun 17 '11 at 2:17

This question came from our site for professional and enthusiast programmers.

5  
Are you familiar with concept of design patterns? Are you familiar with some common algorithms? –  Tadeck Jun 17 '11 at 2:10
1  
I would add to Tadeck's list getting used to Modular Programming and when possible OOP. Remember in any moment keep it simple and clean. –  Juan Sebastian Totero Jun 17 '11 at 2:15
1  
There are certainly some advices out there, but don't forget that most programmers or even all programmers have problems with large projects. You might get better at it but an advanced big project is always gonna be advanced and big. It's not like superstar pgrogrammmers see 5-million LOC project and think "aha, I get it" instantly, I don't believe that at all. You should strive to get better, but don't think that you aren't doing well enough just because big projects stun you, they are supposed to. –  Dyppl Jun 17 '11 at 6:50

12 Answers 12

Hang out on Stack Overflow. A lot. By answering lots of questions, you'll learn to see problems in other people's code very quickly, and you'll learn to work through problems very quickly. Additionally, you become aware of any and all bad practices you yourself might be guilty of as you see them corrected by others.

Your stated area of deficiency is in large projects, and you generally don't encounter those on SO (in their entirety). But the bits and pieces you can glean from all the snippets of code and from other programmers' methods of approaching problems can have a really positive influence on your own. You can come away with lots of ideas that can help you to assemble larger applications on your own.

Then, find an open source project you like and familiarize yourself with its codebase. Find another comparable project and make note of how each handles the same kinds of problems. When you feel familiar enough, try out your own skills at writing something like a plugin, where the integration architecture has already been defined for you. That gives you an opportunity to learn how a higher-level architecture or API functions without having to devise it yourself.

share|improve this answer

Some things I've found useful for my development as a programmer:

  • Read a lot of other code, and try to find well written sources. Read the source code of the languages, frameworks and libraries source code that you are using on your own projects.

  • Learn Haskell and/or Common Lisp to get a more wider perspective into approaching problems. Haskell has the benefits of often being purely functional and having the beautiful type system, and Common Lisp has the benefit of enabling you to think outside the language constrains in other languages too.

  • Think of a project that you have a deep passion into, and which really requires you to focus on the architecture of the whole project (prefereably by planning with paper and pencil), as well as how to most efficiently perform the model level calculations and optimizations that might not be visible outside the model. For me, this project has been coding an additive sound synthesis engine.

  • Learn about different programming paradigms. Not necessarily just design patterns.

share|improve this answer

It sounds like you're pretty much at the "learn by doing" stage...

Maybe just pick a project, something related to what you actually do at work, and go with it. Try re-implementing the basics of a library you use often, or something. Better yet, try contributing to one if it's still in active development.

share|improve this answer

Start learning different languages.

Perhaps jump into a functional language so you can start to think about how to solve problems from several different angles.

share|improve this answer
1  
Good advice but it helps if they are different types of languages. Going from Java to C# is not a major change, going from PHP to Erlang is a big change. You want a language that will make you think of different ways to attack a problem. –  Zachary K Jun 17 '11 at 12:26

Code a forum. Then code it again. Then code it again. Each time, from scratch. Then you have lots of experience making websites, and a great forum that you might be able to sell :)

share|improve this answer
    
Honestly, this is a great idea. I would do this if I was a better web developer :P. Could you make a forum using Javascript, PHP, a MySQL server, and HTML/CSS alone? –  Dynamic Jun 13 '12 at 15:37
    
@Dynamic: Of course! That's all most forum software is. In fact, you can do it with only PHP and HTML, if you're so inclined. (JavaScript and CSS are just niceties, and anything you can accomplish with a SQL server you could accomplish with flat files.) –  minitech Jun 13 '12 at 18:29
    
Thanks! Sorry, I'm kind of a new web developer. I have about 5 years experience in desktop programming and scripting. I'm a year younger then you, and you seem pretty smart, so I thought I'd ask you. :P –  Dynamic Jun 13 '12 at 18:32
    
There is a library that I tried to write the sixth time in my life. I got a lot of insight through the other versions. –  User Nov 10 at 14:59

Get as much information as you can, from different areas. Try going breadth-first instead of depth-first. Writing compilers, NoSQL, functional languages, declarative languages, hardcore optimization, writing 3D-engines, math problems, whatever.

You don't have to understand it thoroughly, after all you are a web-developer and nobody can refuse to hire you because you don't know Lua or can't program embedded devices. But reading about all this stuff is:

  • Fun
  • Good for your brain. Operators, function names, assembly instruction don't matter. The way people solve various IT problems does.

You won't use math as a programmer most of the time. Even if you are in fact building some math-heavy application, it's still doesn't affect writing code as much. But mathematics shape your brain so you can tackle other, non math-related problems, effectively. The same thing happens with this kind of knowledge. You might use some ideas that people from twitter used to solve performance and scalability issues while building javascript game or your own CMS. You just give the brain enough background data about people solving problems so it can come up with a solution when you have a problem of your own.

That's a little romanticized way to think about it all, but I assume that other stuff like "read books, read blogs, find someone to learn from" is pretty obvious.

share|improve this answer

Sounds like you're not an academic (CS anyway).. Nothing wrong with that, neither am I ;)

If you don't have one already, get a solid handle on basic engineering topics: design patterns, algorithms (at least those that apply to web development as learning algorithms is no trivial task without a CS background) and some math (linear algebra at least, which is invaluable when learning algorithm complexity analysis).

Learn color theory. Even if you're not a designer, learning this is invaluable to your own knowledge of how things should be put together.

I'd also maybe read through User Interface Design for Programmers (Joel Spolsky). It's old (2001) but I believe (I haven't read through it in a number of years) most of the concepts are still relevant. I read it near the beginning of my career as a programmer and to this day I still remember it as being one of the most fun reads I'd had on the topic.

Oh and.. As far as just learning new languages goes in helping your career, don't focus on it. New languages are generally just syntactic shifts and fairly trivial once you're a seasoned developer. Fundamental engineering principles are much more important to have a solid handle on.

Edit:

Also, get familiar with current W3C standards. Nothing beats that :)

share|improve this answer
    
Why do you suggest learning colour theory? To learn to balance different things to make out "white" or ...? I do know colour theory, and I have a hard time finding out how it should be so important. Maybe you meant coding theory? –  peterhil Jun 17 '11 at 6:05
    
@peterhil: No, I meant color theory. While not absolutely mandatory for a developer to know, I'd take a developer who understands the fundamentals of design over one who didn't any day. Color theory is logical and therefore should be easy for a developer to grasp. Just because you're a developer and not a designer doesn't mean that you shouldn't know anything about the other disciplines. IMHO, having a solid grasp of all disciplines (at least the basics) makes you a stronger developer. –  Demian Brecht Jun 17 '11 at 17:24

Two suggestions:

  1. Ask a better programmer to pair with you.
  2. Try test-first development. Switching to test-first development made a huge difference in the quality of my work.
share|improve this answer

Teach and write! Having to take what you know and package it so that you can explain it to others really sharpens your skills! Give a talk at a conference or user group, write articles or a blog. Or better yet, write a book if you think you have something interesting to say! I assure you publishers are always looking for new writers with ideas. (O'Reilly has a "Write for us" link on their web server, so do the folks over at the Pragmatic bookshelf).

share|improve this answer
    
Teaching is great advice - for me this has taken the form of tutoring and now working on making tutorials for web consumption. It forces a "get it right" kind of discipline that just tinkering around doesn't always do. –  kinakuta Jun 17 '11 at 8:29

PDCA (plan–do–check–act) would be one of a few strategies you could use to try to get better. ITIL V3 CSI - Continual Service Improvement would be a bit more formalized high level approach that you could take.

Explain how to fill out a CBT Thought Journal to stop automatic negative thoughts and combat depression and low self-esteem would be another approach you could consider if you are open to things like Cognitive Behavior Therapy.

There are also personal development blogs like Sources of Insight or Upgrade Reality that can also have tips and suggestions. Getting Results the Agile Way would be an on-line book that may be useful for another source if you want it.

Have you ever sat down and analyzed if the overload is just too much Math or if it is some branch of Math that you don't know well? Perhaps working on abstract problems would be useful though another idea is to consider looking into your personality with tests like those on MyPersonality.info that has a couple of free tests that may be useful. Learning Styles On-line also has a test for evaluating your learning style that may be useful here too.

share|improve this answer

I follow a good list of professional software engineers, tech bloggers, etc. on twitter and in the short amount of time I have been on twitter my breadth of knowledge has certainly widened and my depth of knowledge on certain topics has increased.

Some recommendations:

@rasmus
@codinghorror
@jeresig
@lordelph
@alexdickson
@dozba
@defunkt
@mithra62
@brandonaaron
@JamiesonBecker
@nicksdjohnson
@unclebobmartin
share|improve this answer

This is what has helped me the most:

1 Write tests with legal input to try to break all of the intermediate level

functions I have written, and not just for a program itself or for the top level functions only.

2 Write or enhance an API that gets used by multiple individuals

or groups. When they use interface that I provided they will check whether the documentation for the interface matches the behavior.

3 Make sure there is at least as much input/output documentation in

the code I am writing as there already is in the rest of the project, including information about what kinds of inputs are not valid.

share|improve this answer

Your Answer

 
discard

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