Perfectionism and Programmer's Block

Started by
14 comments, last by Giorgos Theocharis 9 years, 11 months ago

Hi there. I wanted to query the collective knowledge and experience of those who haunt these forums in an effort to find relief from something I can only describe as programmer's block.

I know what I want to make, but the knowledge about programming I've gained the past few years have only made it harder to get anything done without trying to do it 'right'. For some reason, doing it 'right' is taking precedent over getting it done. It becomes more of a chore, and less of a fun hobby.

Just getting into OpenGL 3+ has become a daunting task, trying to implement a highly versatile rendering system capable of everything I can't forsee.

That's just the issue though, the sense that I always code myself into a corner with projects, which has instilled a deep need to do everything as generalized, modular, and data-driven as possible. I feel I have taken certain programming tenets to extremes, yielding to nothing.

I have heard things such as YAGNI (you aren't gonna need it) and KISS (keep it simple stupid) and I'm still struggling. How do I surrender!? What should I focus on. I just want to switch off this awareness I have gained, or at least tone it down, to where I can actually knock stuff out and enjoy doing it.

Has anybody else struggled with knowing too much to be productive? I'm paralyzed!

Thanks

Advertisement

I know too much as well. But about optimization. I made a game and it ran rather poorly on an Android device. I now know what to do to make it run fast on an Android device. So every time I add a feature, I ask myself beforehand:

-How much performance will this take?

It doesn't make it any better that I'm trying to make one of the more demanding 2D games, one that is fast-paced with a lot of track.

But programming itself isn't what's weighing me down - it's design and optimization.

In your case, I might recommend trying to make anything. Making things will hopefully get you in the right groove.

I knew a guy with similar game making experience to me. We used the same tools, etc. But the one of us doing the most productive thing came down to who was "hot" at the time. "Hot" is a term I use for continually doing something and somehow, in some unexplainable way, doing something constantly can build your mind up for a time to do it even better.

It's not really that hard... just accept the following:
  • You don't know nearly as much as you think you do
  • Your analysis is not nearly as thorough as you think it is
  • You will fail to predict something important
These are always true, of everyone.

If you truly, genuinely accept these facts on a deep level, it will kill the compulsion to do things like over-plan and try to make things perfect. Nothing will ever be perfect.


Once you can get past the need to overthink things, it's just a matter of learning to focus on actual requirements as opposed to wishlist items and possibilities for the future.


Ultimately, there is one secret: everyone has to go through the "overplanning" phase. Period. You cannot shorten it or eliminate it, and you can only marginally mitigate its effects. It is vital to actually live through this phase so that you can accumulate enough experience to realize how silly it is, and move on. Until you have that experience, though, it isn't possible to move on.


Write code. Doesn't have to be complex or fancy or even do anything useful. Just write code, and iterate.


Good luck.

Wielder of the Sacred Wands
[Work - ArenaNet] [Epoch Language] [Scribblings]

My two cents: It sounds like you suffer from PPP - Procrastination - the Paralysis of Perfection.

Procrastination is often seen as laziness, or an unwillingness to participate. As you seem to know, from a psychological standpoint, the most common cause of procrastination is not laziness, but somewhat the opposite - the desire to complete a task but ONLY if it's "exactly correct."

ApochPiQ gets a thumbs-up from me for his advice. It's tough love. I would add that you have to learn to accept that perfection is a process, not a goal. You'll have to experiment to find out how you can teach yourself that definition. No-one can do it for you. For me, it works to consider each new project is a piece (not a whole) that I need to get closer to the "perfect" program. Part of that approach is to believe that perfection is avoiding mistakes; avoiding mistakes comes with experience; experience comes from making mistakes. As mentioned above, it's an iterative process. To achieve perfection, you must make mistakes.

Go! Get out there and make mistakes! smile.png

Please don't PM me with questions. Post them in the forums for everyone's benefit, and I can embarrass myself publicly.

You don't forget how to play when you grow old; you grow old when you forget how to play.

ApochPIQ is so right.

I am by no mean a great programmer, but when I look back at some of my older projects and the amount of time and lines of code to over engineer simple things I can't help but notice that it was sort of a waste that could have been done much faster and with no difference to the end user easily now that I know better. My usual pitfall was to start making a game and ending up with a half finished engine instead.

That's a behavior that kinda stopped by itself. Well, annoyance at my own inability to finish a project completely had probably something to do with it. And the realization that no matter the amount of perfection I try to put in my code now, a few years later it will look like crap to me anyway.

So I chose a set of features I know how to implement (more or less) correctly with a simple architecture without all the fancy bells and whistles. I am of course still unhappy with parts of my current code base (the way I handle multi threading make me cry for example), but it became gradually a much lesser concern than being feature complete and finishing the game itself.

(no idea if it's of any help, but that's my experience)

This is where a paper notebook or a sorted spreadsheet are awesome.

You don't need to do everything. If you see something you want to do, write it down or add it to the list. Prioritize the list regularly. Cut things near the bottom of the list, you'll probably never get to the low priority things anyway.

For game designs, at work I view every design as a checklist, and my designers and our teems have had that work pretty well.

Do a single item, cross it off. Do the next item, cross it off. It is just a task to get done, like folding a load of laundry, feeding the pets, or doing homework problem 17. No stress in any of those, right?

When doing an item, you don't need to stress out. Most programmers are lazy (rightly so) and will just implement the minimum to get it done. Do just enough to check the task off the list. Don't aim for perfection. Don't worry too much about bugs. Don't worry about missing features. Don't worry about optimizations. You can find the obvious bugs by spot checking when done, just like you would verify your answers on a math quiz by working backwards; run the program, try the edge cases you can think of, and call it good enough. Instead of worrying about optimal, just think about minimally adequate; choose a single pass rather than nested passes, base implementation choices on how it will be used, but don't worry about optimization since if it is a problem QA will point it out. Just implement the first thing on the list, verify it works in the program, test around it, submit, cross it off. Repeat every day. Don't worry about the list ever getting empty.

Whenever someone sends you a request, write it on the list so it doesn't get lost. Someone might complain if you put the work off for several days as a lower priority item, but it won't get lost in the daily shuffle. Whenever you think of something to do or an improvement that needs to be made, put it on the list. Found a bug? Goes on the list. Thought of a crazy awesome optimization? Goes on the list. Idea for another great game? Goes on the list.

The list is awesome. Keep it on a notepad and put dates they were added and completed, and it doubles as evidence for your annual or semi-annual performance review.

I recommend getting into a game jam to forcefully push you in the 'productive' mind set, its really a revealing experience: no time for over thinking, only for vomiting working code as fast as you can ( you do with what you got, your current experience level, instead of thinking in the best way possible you do in the best way you can). Its good to show yourself how much you can pull of.

The scary part is that that "method", at least in my experience, is faster for progressing than the "over thinking till you got the handsome solution". I find that you learn more by trying more in short times with lots of mistakes and redoing than spending too much time trying doing it perfect in the first try. Its really a mind set thing, generally in the over thinking mindset you go slow, stop, analyse, you dont give another step before be sure, etc..

In the "vomiting way", you make shit work, than you realise what makes it shit, clean it, still working, figure out some bugs, redo it..its more experience, faster. And its more rewarding cause you actually get something to toy with (cause its already working even when its shit)

Radioteeth, your condition has been know even before I started programming and I'm old ^_^

In DonaldKnuth's paper "StructuredProgrammingWithGoToStatements", he wrote: "Programmers waste enormous amounts of time thinking about, or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%."

http://c2.com/cgi/wiki?PrematureOptimization

http://en.wikiquote.org/wiki/Donald_Knuth

So, learn to not worry too much and care about your code architecture and data handling at the start of a project.

Modern profilers do a great job of showing the real bottlenecks later on.

Cheers /Carsten

I actually just signed up to throw in a 'me too' post, as when I read your post Shane I immediately thought, "Hmm, that sounds familiar." as I have that exact issue. I wouldn't say I know all the answers, but I know enough to identify red-flags and see good approaches. So I often spend a lot of time stuck in design-land not really making meaningful progress, or, I implement some pattern or another and then change my mind and refactor it, only to revert it later. Either way, the end result is not much progress. Ironically when I was starting out I made 3 game prototypes, they are fairly diabolical from a code perspective, but hey, there they are, running, working, finished.


Just getting into OpenGL 3+ has become a daunting task, trying to implement a highly versatile rendering system capable of everything I can't forsee.

Analysis paralysis hits everyone eventually. If you can't forsee the need, don't worry about accounting for it. Worry about what needs to be done, or as ApochPIQ said, focus on the actual requirements of the project. If at a later date you need something done differently, make a note in your code, and return to it in a later revision.

This topic is closed to new replies.

Advertisement