“Am I in the wrong major?”
Yes.
You (and some others) may not like what I’m about to say, but you asked for it, so here goes…
In all the years I’ve been in technology, it has typically taken me about 28 seconds to determine if another person was “fluent” more than one or two levels below the surface.
Those that were were almost always programmers, engineers, or technicians at one time or another. Everyone else was at best managers and business people, or at worst, administrators or posers.
I know some might disagree with me, but a Computer Science major who doesn’t want to code is like a dental student who doesn’t want to look into anyone’s mouth.
To get good in technology, and I mean really good, you must get under the hood, deeply and often. The best and most logical way to do this is by programming. And you will have to do this intensely and for long hours, so “you have to love it”.
The single biggest difference I’ve seen between great programmers and everyone else is a pure love for what they do. Intelligence matters, work habits matter, ability to work with other people matters, but make no mistake about it, there is no substitute for passion.
Great technologists love what they do so much, they can’t wait to get back to it. They have to check on their work after dinner. They have to review their notes at bed time. They are often the first in the office in the morning and just as often the last to leave. They read and learn voraciously and can’t wait to apply their skills to new problems. They’re so busy doing what they love, they don’t even think of it as “working 9 to 5”.
By your own description, you do not sound like this. So do yourself (and the rest of us) a favor and find something you love and major in that. If, on the other hand, it’s too late or it doesn’t make sense to switch majors, then go ahead and finish your CS major, but please find a direction to follow that puts you in work you love. Be forewarned, though. Unless you’re a programmer first, you probably won’t make a very good sales engineer or project manager. You may want to consider sales or even (dare I say) proceeding on to business school for your MBA.
Wow! You have had what seems like an ideal first three years after college and all you see are negatives.
Have you learned anything in that time? From what you’ve described, I would think plenty.
The last 3 years was a process you had to go through to get to where you eventually want to be. A very efficient process that not too many others ever get a chance for.
Every time I had a tough gig, instead of focusing of the jerk I worked for, all I thought about was what I was learning and how I could leverage that into my own future. That kind of thinking has always worked well for me.
You now have the background, experience, and skill of an accomplished 35 year old in a 25 year old body.
Congratulations!
Now stop worrying about the past, take a short break, and put those hard earned assets between your ears to work for what you really want. This time next year, I hope to hear from you, “How I turned 3 years of sweat into a lifetime of fulfillment.”
I’m not going to try to motivate you, because only you can motivate yourself. I’m just going to share my perspective that might shed some light on your issue.
I had the same problem in college until a fraternity brother who had graduated 2 years before told me something I had never thought of. He said, “You may never have a better opportunity to explore and learn new things. Once you settle down with a career and family, all your time will be spoken for. So try everything! How will you know who you are and what you’re interested in unless you experiment?”
Some of the best advice I ever got, and since I was a sophomore at the time, I tried as much as I could for the next 2 1/2 years. I still majored in math and became a computer programmer, but I did a lot of stuff that I simply don’t have time for today. And I miss a lot of it. Back then, I thought humanities was boring, but what I would give for a few days off to curl up with a good book.
Sometimes you can learn a lot about something you are interested in by doing something totally different. Reading literature might help you write code. Music may help you with math. Working at the mall or living in a fraternity house could help you learn how to run a business.
At this point in your life, you still don’t know (for sure) what you’ll love and be good at for the rest of your life. So keep doing those things that “seem” like they’re boring and uninteresting. Many of them will be a waste of time, but there will certainly be a few pearls in there, too. Don’t miss the opportunity of discovering
them because you just want to stay in your comfort zone. Now is the best time to leave that comport zone and discover the other stuff. Eventually, you’ll be glad you did.
“the job happens to be my all-time favorite”
What are you crazy?!?
I’ve had many jobs and I’ve liked few of them. If you have a job you love, why would you want to leave?
You don’t even have any plans. I’d understand this a little better if you had a project you’re dying to work on full time, but that’s not the case.
Why don’t you just keep your job and find a side project. If that side project gets big, go part time. If it gets so big, you’re “burning” to work on it full-time, then quit, but not before.
Good jobs are hard to come by and jobs you love are almost impossible to come by. Also, don’t discount all the data you get from your job to feed your startup plans. Lots of people would love to do a startup, but don’t know what to work on. People with jobs don’t have that problem as much. The job can be the source of lots of great ideas for things people actually need right now.
I’m the last person to discourage anyone from doing their thing, but job vs. startup is not a binary decision.
You can do both, at least for a while.
Keep that all-time favorite job for now. You can always leave later once something else has wings.
“I want to code the site using PHP and a bit of Javascript, but my skills with these are not exactly up to the job yet.”
You must understand that you need to learn 2 separate things and you need to learn them well.
For javascript on the client you need nothing other than the browser you already have and the Rhino book:
http://www.amazon.com/JavaScript-Definitive-Guide-David-Flan…
Learn what’s in this book! Go through all the exercises and tutorials. Build something. You can augment the book with tutorials you find on-line. Then you can View Source on any web page and understand what they did (and what they did wrong).
On the server you will have to find any common LAMP stack and load in onto your machine. The execises and tutorials for php, MySQL, and apache should be enough, although you can find more almost anywhere. Build something! Now that you already know javascript, you can include that in the pages you build as required.
Only after you have a solid understanding of the basics of these 2 technologies should you consider a framework. This can be tricky. If you adopt a framework too soon, you may run into a problem for which you don’t understand enough about what’s going on under the hood because you never learned it. If you adopt a framework too late, you’ll be hand coding everything and will never get done.
Most importantly: you can only learn any of this by doing. Time consuming doing. Books and resources any necessary but hardly sufficient.
Do not fall into the trap of only learning at the surface and expecting to find someone else to do the coding. This does not work for a small software start-up. You must dig deep and learn well.
“I took a step back and immediately saw absolutely no redeeming value of what I had just done, and this made me feel incredibly sad.”
I would rephrase that as, “…absolutely no redeeming value “at this time”…”
You have just planted seeds. Of course you can see no “redeeming value” right now. If you just planted seeds in your garden out back, you wouldn’t see any results there either, “today”.
But just as the seeds in your garden will deliver results in a few months (provided you care for them), the seeds you just planted in your little “hairbrained” project, will also reap dividends. You just don’t know when or what.
Sometime in the future when you least expect it, the lightbulb will go on and you’ll figure out a cool solution to some other problem. What you don’t know now (and probably won’t even realize then) was that what you did today stirred a few neurons to enable that light bulb to go on in the future.
As hackers, “everything” we do is either planting seeds or reaping harvest. If you didn’t see a harvest today, that’s because you were planting seeds. Just keep on working and trust the process; that’s how we all get better at what we do.
I wrote a code generation system that put together nice tight little apps, with UI, database interface, batch processing, and a report generator. It came in really handy for the simple apps everyone seems to need every once in a while.
My partner and I sold a few simple apps and then he found an opportunity in a large company for a much more sophisticated app. He quoted based upon the already demonstrated performance of me and my “little tool”.
Unfortunately, every single unusual thing we ran into was not “generatable” by the tool. So I had a choice, hand code or upgrade the tool to generate it.
My choice was my “best failure story”. I chose to add funtionality to the tool to generate code needed for an open project already well behind schedule. I didn’t stand a chance. Even hard coding everything probably would not have saved the gig.
Lessons learned:
- Code generators must have hooks for custom code.
- Don’t commit to using a code generator until after you have the customer’s requirements and know that the generator can already handle them.
- Don’t build your tools on the job site unless you’re really good and know that you can finish on time.
- Don’t let a few early and easy successes let you get a big head. It’s never as good as it seems. (It’s also rarely as bad as it seems.)
- Have complete, open, and honest communication with your partner(s). You don’t have to know every single thing each is doing, but you better be on the same wavelength.
- Put everything dealing with external parties (customers) in writing. Commit to nothing until everyone agrees.
- If there’s only 2 of you, you both better be hackers. There’s just too much technical work for one to be overwhelmed and the other to be “waiting”.
We are constantly hearing advice like “Scratch your own itch,” “Find problems close to you,” and “Code what you know,” which is all good advice for finding a startup idea.
What then, do you do if you’re not exposed to much?
When I spent time talking to people in Silicon Valley last year, I noticed something I never expected: lots of people have very little exposure to “real world” problems.
People come up with “me too” startups because that’s all they know.
Sure it’s easy and cheap to start a business, and if you’re smart and can hack, all the more reason. But what about the giant issue hardly anyone mentions: real world experience.
I’ve been doing programming work in real businesses for years and “still” get excellent startup ideas from my customers almost every day. In the past week alone, I’ve been challenged with problems I’ve never seen before that are really affecting these people. Just a couple of quick recent examples:
- One customer is preparing blanket purchase orders for new models, but since the SKUs change every season, their ERP system is of little help.
- Another is setting up a new warehouse, but their app won’t allow bulk updates so they have to hire clerks just to enter 10,000 new bin locations.
- Another has a call center whose response time has doubled with an upgrade to their app. Now they want the new release’s functionality with the old release’s interface.
And this is just one week! People will pay big bucks for technical solutions to these real world business problems.
My advice to a young hacker with lots of skill but not much experience (outside of college apps): you may want to consider getting a job for a year or two. I know, everyone wants to start the next , and get rich now and no one wants to sit in Megacorp’s cube farm. And a startup, even a failed one, may be a better education.
On the other hand, you will acquire dozens of great startup ideas (and contacts) and avoid the “me too” trap. Something to think about.
“I lack the fundamentals of Computer Science, the things every programmer should know: Algo’s, Data Structures, Operating Systems an understanding of compilers and being profficient with linux.”
Relax. That’s true for 99% of all programmers.
“Eventually I plan on going back to a real University and getting a CS degree”
Absolutely not necessary. You will probably learn more building anything than learning it in school.
“I’m starting to think I may have a learning dissability”
Maybe you do, maybe you don’t. Just because the rest of the world is quick to diagnose everything doesn’t mean you have to.
“I have come to accept that I’m really not smart. I’m slow, forgetful, concepts never seem to stick”
Your performance shortcomings could be for many reasons. Being “really not smart” is the least likely of any of them. They are much more likely caused by other things like uninteresting work, poor environment, personal issues, nasty people, or even health issues. Whether you’re “smart” or not, thinking that your aren’t is pretty much a guarantee for failure. Please don’t do that.
“I have started going through the basic Algo’s and Data structures again with a basic Java book about algorithms”
Sorry to say, but you’re doing it the hardest way you can. You don’t need a book; you need a project. I have achieved much, but have always had difficulty learning from books and theory. It’s hard! You need to find work where the things you need to learn will be required. Funny how quickly and easily you’ll find a way to learn them when you actually need them. I’m not sure how you should go about finding such work, but I know you’ll figure that out.
“I just don’t want to be a cargo cult programmer anymore.”
Good. That makes you normal.
“And finally trying to memorise all those linux commands I ALWAYS forget.”
Then use less commands. I have never used more that 10% of what was available in “any” technology and I always got the job done.
“I have to force myself”
This is the most important thing you have said. Have you ever actually enjoyed building stuff? Have you ever gotten really jazzed about the project you were working on? Have you ever lept up out of your seat and danced when you got something working?
If you answered “yes” to any of these questions, then you really do have the passion to be a programmer. Stop selling yourself short.
If you answered “yes” to none of these questions, then there’s no sense for you to continue wasting your time searching for the passion. If you haven’t experienced any by now, then you probably never will. No one should have to “force themself” to love what they’re doing. Find something else.
You are not burnt out and I have proof. This discussion. A truly burnt out person would not have even bothered. (Kinda like claiming you’re over your ex-girlfriend but still wonder what she’s doing all day long). The fact that you asked is not an admission of giving up; it is a cry for help. You still really want this.
I go through what you are experiencing all the time. There are days when I can’t stay awake at my terminal. Sometimes I hit a road block and wonder how I’ll ever get by. I usually step away for a time, but here is my real secret…
Pick one little thing that needs to get done, no matter how small or unimportant it may seem. If I’m really down, I pick some mundane task like refactoring 25 lines of code, manually updating 50 records, or even changing some naming conventions. But not something big like solving a client-server architecture problem. Hell, that’s the reason I’m already down. One other thing - the task must be in the heart of your project; cleaning off your desk or reading a journal don’t count. Then do the task. Completely. You’ll feel a little better, I promise. The next day, do it again, maybe with a slightly bigger task. And again. And again. Who knows, you may be feeling a lot better before you know it.
I have no idea if my advice can help save your project, but I do know you still want to. Use others for support. You are not alone.