tags:

views:

843

answers:

20

Lately I feel like learning new ideas about programming has become form of procrastination. It's easier for me to learn a new framework, language, paradigm, field, algorithm, etc, than to sit down and stay dedicated to finishing a large project. It's very easy to justify the time spent learning because it feels productive -- and it potentially is. Every time I learn something new, my horizons expand just a bit and I become a more capable programmer.

Now I'm at a stage where I know a ton but I can't stop learning. When I try to start a project I get so caught up learning new things that I often never start! Even worse, I sometimes get half-way through a project, then discover a much better way to approach the project, and start from scratch again.

Learning is only productive if you do something with the knowledge, and at this rate, I'm going to die as the most knowledgeable programmer in the world with nothing to show for it. I hate having the skills but lacking the dedication. I want to become a person who says, "I have done that", rather than, "I can do that".

My question is, how do you convince yourself to bite the bullet and just work on something, even when you realize that there's things you don't know? How do you manage the balance between gaining knowledge and producing results?

+5  A: 

Good programmers get off their butts.

Matt Bridges
thank you for that link. Really nice!
bastianneu
+16  A: 

Getting paid for actually producing something can be quite an incentive.

anon
As can not getting paid for not producing anything...
John Pirie
I don't believe the effect of this solution lasts too much. You'll soon want to be paid more and more. I don't believe this is the right answer. At least for me.
Ionuț G. Stan
Well OK - how about not getting paid for not producing something? That can be quite an incentive too, assuming you want to eat.
anon
Often you don't actually need to produce results in order to get paid. In fact, office politics are often much more effective than work. I find that removing the mental connection between pay and work makes me much more effective. I guess that only applies because I love programming though.
Jørgen Fogh
+1  A: 

Hi Kai, I often struggle between gaining knowledge and finishing existing projects. My justificiation is that the knowledge gained will also help me in the long run.

I seperate two by type of project. If it for a client, they expect a result and usually in a given timeframe, so I need to be more astute when comes to doing work that needs to be complete. If it is a personal project or for my own site, I take that time to learn different methods to improve for the next client project.

Programming and development should be an ongoing learning process, but if there is obligations tied to the project then those need to be satisfied first.

Hope this helps, Jason

JasonBartholme
+7  A: 

My advice...realize that you will never learn it all or even close. More knowledge can be gained by creating solutions than reading books.

Cody C
This sort of wisdom you have to realize on your own for it to really take effect.
windfinder
A: 

There is so much to learn when you're involved in a large enough and/or challenging enough project. If you can convince yourself that you have plenty to learn from going through such a project, that can help motivate you to do so.

Also, it'll help you to delve in learning things about the field other than technologies. For example, coding styles, design patterns/design decisions, even version control and possibly how to take metrics. These are all worthwhile things I believe, and you should definitely attempt a project for at the very least perhaps learning about these concepts.

AlbertoPL
+2  A: 

Spend some time (and this DOES take time) breaking down the work you have to into discreet tasks and set yourself deadlines for each. After you complete each part reward yourself with a bit of learning time.

Chris Simpson
+3  A: 

Try to devote a specific time of the day to learning new things.

When you find the new/interesting things to learn whilst you are doing your tasks, mark it in a to-do/to-learn list (e.g. google notebook). Making a 'to do' does sound naive/old-fashioned, but is more effective than one would believe. The list is an invaluable aid to mark off/prioritize learning things when you finally get to your 'learning time'

Much better than trying to remember all the things encountered in a day's work/going depth first learning things.

psquare
+4  A: 

My question is, how do you convince yourself to bite the bullet and just work on something, even when you realize that there's things you don't know?

Get a job doing it. If you don't finish, you don't get paid.

samoz
+1  A: 

I totally agree with you. I think this is very common.

For me it is all about inertia. It takes me a good hour or two before I really get focused on a project. If I force myself to focus for that first hour it suddenly becomes easier to just keep working on it.

It is kinda like getting up in the morning...you never feel like it, it never really gets easier...you just discipline your self to get moving when it is time.

William Edmondson
+1  A: 

This happens to me all the time. Lately my solution has become this: There have been times where I finished a project(seems rare these days) and I've been able to postmortem the whole project and really learn from the path I took with proper perspective. So even though I may realize a better way halfway through, switching before I finish it seems to reduce the effect of the 'lesson' I learn from the first path. Somehow it doesn't sink as well.

So it seems to me that there are things that can only be learned after actually finishing a project, so if possible, I make myself finish it with the path I originally chose, even if it's not the best one.

The trick is to then make sure you go over things for at least a few minutes and reiterate the pros and cons of your choices. This whole thing takes more discipline than I usually have.

LoveMeSomeCode
+3  A: 

I suggest picking the hardest problem and solving that first. This is sometimes called a point solution. It's the easiest way to reduce risk at the beginning of a project.

...rinse and repeat.

Scott Whitlock
+1  A: 

+1 for getting paid.

If everything else fails, get yourself engaged in a project you reeeally like. If nothing is out there, make it up. Make it up in such a way that you have a working area where you can actually apply things you have learned during your learning paroxysms :)

Make it so that it's easy to start off. BTW, Rails is brilliant in this regard, cause it takes quite a short amount of time to get something up and running.

neutrino
A: 

Nowadays, by the time you learn everything, everything you learn has become irrelevant. Therefore, by dedicating all of your time to learning, you will enter an endless non-productive cycle. Just remember that what you're learning probably won't do you any good by the time you learn it and get bac k to work :).

CodeFusionMobile
+6  A: 

Turn off RSS feeds. Don't open Twitter. Stick the Cult of Done manifesto next to your monitor.

Oskar Austegard
A: 

Learn as much as you need to complete a task at hand, than learn some more about it.

Start a small project, personal or work related, and learn as you go/develope. If you dont know how to solve a problem or have trouble finding a better way of solving a problem, post on stackoverflow.com, you will get an answer in a matter of minutes so you dont have to wait to long before getting back to your project. You will soon feel your new knowledge shape around your current knowledge and you will probably be more satisfied, because you are developing and learning at the same time.

The last thing you want is to get into an "infinite learning loop" and realize that the time you were spending learning could be spent on learning and developing.

Secko
A: 

I feel your pain! I've been developing an application for the last 2 years and have started rewriting it 3 times due to new development technology being released.

Geoff Davis
A: 

I'm going to die as the most knowledgeable programmer in the world

Only if you're Jon Skeet...

Milner
+4  A: 

It is much easier to stall on a "big project" than on a series of smaller tasks. Before you do anything else, carve out dedicated blocks of time to work. Move distractions out of the way - check e-mail 2 or 3 set times during the day, turn of IM clients, etc.

Next, break down the problem. Have no tasks bigger than 1-2 hour chunks...with very definable milestones. Use boolean style milestones for each task - working or not working, done or not done (avoid the 90% complete, or "almost working" or anything wishy-washy in terms of completion criteria for a task). This should be a written list of tasks - on sticky notes, or a white board, or a notebook, or a wiki, or in notepad...the key is to have a written list of tasks. Make sure that you cross tasks off the list as you complete them.

If you need more motivation than that, establish a reward for completion of a task. This can be everything from "going to lunch" or "going home at the end of the day" to "get to play WoW for an hour when this is done."

There seems to be a split in thinking about making commitments as a way to motivate yourself to complete a task. Some say that announcing what you are doing will encourage completion to avoid not meeting those expectations. Others claim that keeping something that you are excited about secret is difficult, and will motivate you to finish so you can reveal your accomplishment. I am split. I find that clear deadlines and expectations help at work, and keeping things under wraps helps for personal projects.

semiuseless
When faced with developers who are "easily distracted" when not on the critical path, I hand out copies of "Time Management for System Administrators". This book deals with techniques and ideas to manage time and interruptions while still making progress on both firedrills and long(er) term projects. http://www.amazon.com/Management-System-Administrators-Thomas-Limoncelli/dp/0596007833
semiuseless
+1  A: 

I was searching for an effective way to write a to-do list and stumbled upon a blog post that seems to hit the spot for me on this issue. It's not directly related to programming but it's not hard to see that programming can be either running on a treadmill or running toward a goal -- and that subtle difference is everything.

The gentleman explained the differences between extraordinary people and those who are not so extraordinary. One major distinction lay in their to-do list. Your to-do list is where you place your focus. Whatever you focus on expands. Extraordinary people focus on results. Those who are not, focus on activities. Sometimes, when we focus on activities, we think we will get the same results but that is often not the case. Sometimes, our to do list serve to keep us busy and stagnant, must like a person in on a treadmill. Your are still running, but are you getting anywhere?

Kai
A: 

I'd question how well are you really learning something if you don't ever finish anything. If you are merely reading about things and seeing trivial demos, then you may not be really learning in my view. If I watch someone cook something, can I do just as well without practice and doing it? In the case of a lot of dishes, I think not as there are subtle points to learn or change to make a recipe better, even if we are talking about things as simple as Kraft Dinner which can have variations for those who go outside of what is in the directions like adding various meat products or condiments.

If you aren't testing that you really do know your stuff, you are fooling yourself if you think you truly know what you think you know as there is a difference between knowledge, comprehension and application where each represents a different level of learning something. Knowledge is merely regurgitating what was said, e.g. who, what, where or when. Comprehension is one level up, e.g. why or how. Application though is taking thoughts and using that for some purpose, e.g. actually doing something.

JB King