views:

580

answers:

12

Background: I'm 27, have an A.S. degree in Information Technology Management (it was basically a network admin program with some web design and a database class). I've had several jobs in a few years, all of which have been as a sole programmer/IT Guy and maintaining existing code (among other things), without writing anything new. I'm largely self-taught, having been tasked with building an online knowledgebase while working as helpdesk/network admin my first job out of college and picking up VB.NET, then C# as a result. I've never worked on a team, except once in a while when the company I worked for sent programming work to India to save money and I've had to coordinate with the programmer(s) there every so often. Even then, it wasn't collaboration it was just discussions through email or Skype.

Now the problem I face is, to be brutally honest with myself, that I think I'm a hack who can't cut it. I know a smattering of .NET, but I just can't seem to wrap my head around doing things. I've tried to learn Ruby on Rails, and I get caught up in how to explain what I want. I can hack together things that kinda sorta work, but I want to be a real developer. I feel like Pinocchio, basically: I tell myself that I'm a real programmer, but I'm not. Now I have a job at a startup where I'm sort of an analyst, but still have to do coding once in a while; I had thought that being an analyst was the best career move for me since I think I'm a horrible coder (but I know enough to speak "tech") but I have no formal training in being an analyst at all, because I've only been a maintenance programmer and there was no analysis done whatsoever due to ignorant management, nonexistent requirements, zero budget and a "We need this yesterday" deadline. I launched an application for it using Ruby on Rails, but I don't feel as though I learned anything while doing it. My boss keeps telling me his grand ideas and how he wants me to help him create specs for it, but I feel like we're both just putting up a facade since I'm not confident in my ability to come up with specs for anything, and I don't have the time or opportunity to learn how to do it right. In my spare time I've been trying to launch a web-based application that I feel has market potential, but my lack of self esteem and the feeling that I'm not a good enough programmer to write anything keeps me from doing anything with it beyond a few trivial classes; I'll start to think of what the application needs, and before I know it I'm spiraling into complexity and asking myself "How the hell am I going to be able to write this? I don't know how to program X/Y/Z!"

So on to the actual question, if you can call it that: How do I go about improving myself so I'm not stuck in the mindset that I'm a lousy programmer and that I can't write anything beyond basic tutorial-level apps? Every time I try I get totally sidetracked by thinking of how complex it is or how "x" doesn't make sense to me, and after that I just abandon the project as a failure and think even less of my abilities. Most of my time is spent worrying about how I'm going to solve problem X, or trying to decide which platform I want to use because sometimes X seems easier, and then when I run into a problem with X I change my mind and look at using platform Y. I sometimes look for junior level programming jobs in a "real" development environment (e.g. a team of programmers, specs, best practices) but A) I'm deathly afraid of leaving what amounts to a cushy job where I'm friendly with my boss in the event something doesn't work out, B) I'm deathly afraid of not being "good enough" and getting fired, and C) I don't even think my meager programming skills and small education are enough for a junior programmer position.

And it's not like I don't try to improve myself: My bookshelf is filled with programming books on using Language X or Framework Y, as well as more generic books on software development. Firefox has bookmarks to dozens of sites with tutorials and screencasts. My iTunes has podcasts that discuss software best practices. I spend hours working through tutorials, but I feel like I'm not learning anything and just copying from a textbook; the minute I try to apply what I've just done to another application (even one similar) I either choke and can't figure out what I need to do, or I find that I have to go back to the tutorial and copy/paste the code before tweaking it, and then I still feel like I'm just cargo-culting.

I really wonder if this field is for me, but I haven't done anything except IT/programming.

+12  A: 

The best thing to do, IMHO, is stop cargo-culting. When you are working through a tutorial, don't be content with getting past step X, stop and think about how you got there, why the code works as it does. Poke it, prod it, mutate it. See what works, what doesn't but make sure you understand the WHY of it all.

It's like math. If you learn it all by memorization, you don't understand why math works. As such, higher order math like calculus seems like black magic. My son is in 4th grade and I am amazed at the number of word problems being assigned. It's a great thing because you can't do a word problem without understanding the principles involved. Life is a big word problem ;)

True insight and understanding comes from understanding why things work. Once you know why, you will be able to apply your knowledge effectively.

Jeff Paquette
One more thing... as you learn a new bit of tech, apply it right away, even if it's in a toy application. Then use it again in a couple of weeks. You'll have forgotten just enough that you will have to reason out what to do.
Jeff Paquette
Funnily enough I'm also horrible at math ;-) Part of why I didn't get (and never will get) a CompSci degree.
Wayne M
Wayne: There's nothing wrong with a computer science degree, but that is by no means a guarantee of being a good developer. One of the most ingenious Java programmers I ever met was a lawyer by trade.
Tenner
Wayne, you're probably just *under the assumption* that you're horrible at math... I was a college math tutor for 3 years at school and I can say this: _everybody_ is capable of math (at least up to sophomore-level differential equations). The point I'm trying to make is that it's not the math that's important, it's the problem solving abilities that are important. Learning how to approach a situation from multiple angles and to not get frustrated when the first 5 directions don't work out immediately is key to coding. I'd suggest looking learning problem solving techniques over sw langs.
JasonWyatt
+6  A: 

It sounds like you need a dose of MIT OpencourseWare. Following the video lectures in unison with the textbook - all free and online - will most likely reinvigorate your self-improvement whilst for the first time giving you some sound programming principles to build upon.

I wish you the best of luck; it's all going to be ok :-)

deau
+1 - these are a truly great free resource I discovered about a year ago ... covering a broad collection of subject matters.
Paul
+4  A: 

I've found that more people than not feel they're hacks. As people, but ESPECIALLY as engineers, we have a tendency to underrepresent the work we do and be overly impressed by the work others do. (Just look at the d*ck-swinging competitions that can sometimes emerge between rival programmers, or some of the flame wars on SO. The goal of the participants is to show how much they know at the expense of others.)

I'm sure there will be valid advice that others here will give you as relating to your predicament. But before you start considering a career change, realize that a bunch of us think we too are hacks. But we're all doing the job, day in and day out, and probably really not doing it that badly.

Tenner
A: 

Go back to school and get a Bachelor's in Comp Sci. You will be able to cruise through the coding and really have a good take-away from the software engineering/algorithms/languages courses. Those are the knowledge areas you're lacking right now

And, yes, you're a hack. You need to graduate yourself from 'language/platform' questions to algorithmic/architectural questions. Spend the time and learn good C++(sorry, it's the best language to learn when really learning deep computer programming). Become a software engineer, not a programmer.

Both the degree and the self-learning are more or less required to be a good software engineer*. The degree gets you into the mental next level of thought process; the self-learning gets you a deep knowledge.

A degree also is a good way to get into a better job and be able to move into more interesting careers.

In total, it's about 3-4 years of work to move to where you need to be. That's OK. It's worth it. Nothing worth doing is easy or fast.

* Yes, there are exceptions. But the take-away is that they are exceptions.

Paul Nathan
Problem is the required math courses would kill me. I can't even pass College Algebra, let alone Calculus/Physics.
Wayne M
What did Obama say - "Yes, we can"? Math is not intrinsically hard, but you have to have a good foundation to start on. For certain, if you can program, you have the capacity to do math. You can do it. :)
Paul Nathan
Wayne: You're going to have to be able to pass college algebra.
Dave Markle
+2  A: 

Start contributing to an existing project. You can find a good open-source project and start fixing mundane bugs, and that will give you a team, specs, best practices, and a chance to feel like you've done something -- all without having to leave your cushy job.

Once you've worked on someone else's major project for a while you might have a better feel for building your own stuff. You'll also have good contacts and an excellent resume entry, if indeed this is the right career for you.

Ben Dunlap
EXCELLENT RECOMMENDATION!
tomjedrz
A: 

One of the key differences between a “hack” and a professional programmer is whether or not you’ve ever written something that someone else could use to make their life better in some way. It might make their job easier it might make their life more fun, whatever. The point is that you’ve identified a need, come up with an idea, thought it through, written it, showed it to other people, had it tested by someone else, gotten through the criticism, and delivered something that someone else could use.

Even if there is no money involved, if you can produce something that someone else can find useful, you’ve done something. It won’t be perfect, but it will be useful, and by extension you’ll be useful.

Doug Boone
+10  A: 

You say, "My bookshelf is filled with programming books on using Language X or Framework Y, as well as more generic books on software development. Firefox has bookmarks to dozens of sites with tutorials and screencasts. My iTunes has podcasts that discuss software best practices."

And to some extent this is your problem. You have exposed yourself to excellent developers with great communication skills talking about their ideals, and you are measuring yourself against them. What you may not have exposed yourself to is the other end of the scale.

Most "professional" programmers are not the ones who write books or read tutorials or try to live by the best practices. Most "professional" programmers program by superstition, and copy and paste from codeproject.com. An astonishing number of "professional" programmers are unaware of, or actively hostile to, basic hygiene like source control, controlled build environments and automated unit tests. In short, to two decimal places, 100% of programmers are hacks. [Actual number of decimal places may vary. No warranties express or implied.]

So when you grade yourself on a scale, choose a realistic one. You're trying to grade yourself on a Kent Beck - Donald Knuth scale. Instead, grade yourself on a The Daily WTF - Code Complete scale. You may find you're a better developer than you give yourself credit for.

To be clear, I'm not offering an excuse for complacency. I'm just pointing out that you may well be underestimating the quality of your work.

itowlson
Now he's also exposed himself to everyone on Stackoverflow! Seriously though, by even using Stackoverflow he may not be comparing himself to more average/realistic programmers (the % of great programmers here is way more then "in the wild").
Ash
A: 

Experience is the best teacher. Books are great and offer a lot, but often times you need to attack the problem yourself to really understand it. Get involved in the community for which you are a part of, ask questions and glean information from those who have done it before. Start a project of your own that interests you. I guarantee that even if you start working on creating yet another blog engine you will, in the process, realize some of the complexities of it and it will be a good exercise for you to solve those problems. On a side note, too many programmers are in the quick and dirty mindset, too often influenced by their managers that are pressing for 'now' results instead of quality results, which usually just means you end up spending more time fixing problems in the near future. Realize that programming is a craft and that as a programmer you are a craftsman, and your code speaks volumes about you as such. Take the time to research and understand problems to best solve it. I believe if you do, you will be much happier with yourself and for the people that matter they will see that you are doing things right.

agentile
A: 

I have two recommendations. Both are centered on the idea that confidence and self esteem are earned through action and accomplishment.

First, I second Ben Dunlap's recommendation - get yourself involved in a vibrant open source project. This will give you exposure to good code as well as bad code, and let you actually get things done. There are a ton of them out there .. including this ?-).

Second, figure out something real to do yourself, and build and deploy it on the web. For instance, you could build an app on the Google App Engine. Start with an interesting "tutorial" app and then grow it to something requiring more advanced work. Over a year or so, you should be able to build a good app (and your confidence).

tomjedrz
+3  A: 

I feel similar at times, and the biggest thing that helps me is actually sitting down and writing something that works as intended. Start small with something that's more or less at your technical limit, and hammer out a project that does what you want. Don't go thinking "i'll build the next Twitter or maybe the next Visual Studio", just pick a (small) project you are interested in (perhaps it's physics? Then grab XNA, Farseer Physics from codeplex and make just some simple demo thing to learn about). If you can only do "tutorial" apps then that's OK. The biggest thing you can do aside from picking a project in your reach is not worrying about the whole thing at once, just build it one class at a time.

RCIX
+3  A: 

There are more than a few other questions that have a similar feel to them that may be of help:

Another thought would be to check out local user groups for some technologies to help cement your foundation in using them.

JB King
A: 

I have struggled with this as well. The only thing that works for me is to force myself to work through the fear.

Break a large problem down into tiny, manageable ones. If you are particularly blocked on a given day, find a 100% worked-through tutorial on something small that interests you and do that first.

Small successes build confidence.

And make sure that you force yourself to spend the majority of your time actually WRITING CODE, not just reading about it (at least when you first start out). Reading is great, but can be used as another way to avoid the risk of failure.

It's simple psychology--our egos are boosted when we succeed and deflated a bit when we fail. So we tend to choose activities that we are pretty sure we will succeed at. We are ALL successful readers, but that doesn't always mean we learn to apply what we read. You have to force yourself to maintain a good balance.

geeketteSpeaks