What's the fastest way to tell if I'm cut out for, and should pursue programming?
I know a tiny bit of Java, and I can do FizzBuzz, basic recursion, logic exercises, etc. Can anyone suggest a few problems with max completion times for each that will let me know for sure?
Thanks!
> How can I tell if I have programming aptitude?
I have a friend who's a painter. She's a visual artist with a fair deal of success; she can actually live out of her art (and by that I mean she actually sells her paintings for a living, she doesn't just design logos to buy her a little time for her real occupation on Friday evenings).
We were gathered at her house for a gig and waiting for the guitarist to show up (as usual), and while we were each rehearsing various bits and pieces, she sat on an armchair across from me and casually picked up a piece she had almost finished, and began applying some finishing touches. I'd never seen her painting before, so after I picked up my jaw from the floor, I passingly remarked that I'm a little envious on anyone who has a talent for drawing.
(Background: my depth perception is basically shit because of a limp eye. The only reasonable drawings I ever made where in Geometry classes).
Her reply was along the lines of dude, look, the ones who have a talent for this are the likes of Picasso and el Greco. Everyone else, even those of us who paint a lot better than anyone else you can find on the street, just practiced a lot.
She then proceeded to show me a couple of things she had drawn when she was a kid, long before she decided she wanted to do that for a living. Surely enough, they looked much like any other kid's drawings. They were a little less "hurried", as she obviously loved doing it and spent more time on a drawing, but were otherwise indistinguishable from other childrens' drawings. Even later ones, from around the time when she had decided she really liked this, weren't exactly breathtaking.
tl;dr: You have the "programmer aptitude" if:
a) You're a frickin' genius who can talk to computers as if they were kindred spirits, but then I guess you wouldn't be asking this if you were, or b) You like programming enough that you can do a lot of it, and can tolerate spending that time looking at your programs with a critical eye and seeing where you failed and what you can improve.
The pitfall in b) is that it will consistently make you feel like a failure, but hey, that's life man.
Among the artists I know, some have taught drawing at art schools. They've all said drawing and art talent are altogether separate matters. Drawing is about reproducing measurements, a skill anyone able to hold a pencil can learn. Geometry class might be a good start.
> ... the ones whojust practiced a lot. have a talent for this are the likes of Picasso ... Everyone else ... just practiced a lot.
Actually even the geniuses had to practice. For example, Van Gogh started painting when he was ~23, and the first couple of years he was quite bad at drawing. With practice he improved, and went on to produce 900 paintings in his short lifetime. Manet, the first French impressionist, was so bad starting off he had to cut out the good portions of paintings and sell those separately.
Your a. and b. programmers aren't really distinct, many of the geniuses of the field speak about dismal "failures" from which they learned. It probably requires genius to see the truly important mistakes and how to do things better.
It's the same thing for almost everything you decide to do, if you take the needed amount of time to practice something every single day, eventually you will get really good at it.
That's why I was asking for a problem. I need one that will tell me if I have the right brain wiring/mind. "If you can't do this without outside help in X minutes, you should quit learning to program." Not incredibly easy like FizzBuzz, but not incredibly difficult. Somewhere in the middle.
I think there is a mindset issue at play here. Instead of thinking "Wow, that person is such an elite hacker, I wish I had been born with that talent." think of it as "Wow, it was amazing how they came up with that solution. I want to learn how they did it so I can do the same.".
Stated different, ask people their process. If they came up with a solution that was much better than yours, ask them how they came about it. It may look like they've magically came up with a solution, but they do have a mental process that brought them to it. Find out what it is, internalize it and make it your own.
As your knowledge increases, you'll gradually run into fewer problems that you can't solve in pseudo-code, but you're not SUPPOSED to be able to solve any problem in code when you start.
The mere fact that you even have a few ideas to try is testament to your aptitude.
Keep on trucking, you'll get there.
If so, you will be good at programming. If not, you most likely won't.
Even if you were somehow very good at programming but you hatted it, would you choose it as a job? I'd drop it immediately, don't waste your precious time on it.
This leaves one other option: If you loved it more than any other job but you sucked at it, what would you do? I'd say: Do yourself a favor and find a job where you do what you love. If you prove my advice to be bad, you'd be the first human who made it through childhood without the ability to get better by practice, so don't worry. (And certainly don't think you have be on the Linus/RMS level to do meaningful things.)
(The options for sucking and hating and for loving and excelling are obvious ;))
Not everyone has that choice, as making a living and doing what you love are sometimes mutually exclusive. Casey Neistat washed dishes before he got into making viral videos. Einstein worked as a patent clerk. Dreamtheater's Mike Mangini worked in IT to pay the bills before finding a way to make a living doing what he loved.
TL;DR: find a way to pay the bills to make time to do what really matters to you
I've seen plenty of people in the past (less so in the recent past) that did the job, weren't well-suited or it, didn't particularly like it, but they did it anyway. Why? Money. The kind of money that has you ordering stuff on Amazon and never once asking yourself if you have the money for it. You quit balancing your checkbook years ago. That kind of money. Not bathing in $100 bills kind of money, but enough coming in every year that you don't sweat small financial details. You don't do that on the median US income of $50K/year.
You claim if you hated it, you'd "drop it immediately". I don't know you, so maybe you would. But before you commit to that answer, recall that your annual pay might very well get cut in half or more. No more BMW leases for you. Now, maybe that's fine for you (and admittedly, if I could be a professional musician but only making half what I make, I'd take it in a heartbeat; don't need a BMW that badly).
But I knew plenty of folks in 80s (back when programming was the "hot new thing") that got into it because it paid well. They hated the job (probably because they weren't very good at it), but when the kids come and the spouse has become accustomed to a certain lifestyle, it's hard to give it up.
Once you start being serious about it there might be bad days or weeks as in any other profession.
Quality comes only from quantity. And quantity can only happen if your efforts result in bruises you can tolerate.
I'm interested in the practical aspects of programming, like being able to create something that produces value out of nothing. That's something I can get excited about. I'm not stupid; with enough thought I can solve a lot of Codingbat-esque problems. But it feels like high school math class.
The act of trying to build something that works is an incredible learning experience, and will teach you a lot about whether or not programming is something you should pursue.
What I actually love is scripting / automating repetitive tasks... Still programming, but somewhat different in satisfaction (for me anyway)
With that said, there are many coding sites out there where you can compete against others. TopCoder and HackerRank are two that come to mind off the top of my head.
You don't necessarily need to enjoy programming. But if you're also not particularly interested in the results of programming, or the ways that you might get better results, it's probably not for you.
I don't know of any particularly good tests for aptitude, I suspect general intelligence is probably more predictive than anything else.
My advice would be: don't compare yourself to external measures or compare your skill with other people. Focus on and enjoy the process of learning (because there's always more to learn).
Do you like solving problems? How stoked are you when you figure out the cause of your bug? Would you pursue it even if it wasn't lucrative?
Project Euler has some good puzzles, they are somewhat math related but cover a lot of interesting concepts and can be fun to work through.
I wouldn't pursue it if it wasn't lucrative; that'd be irrational. But I'm not interested in money alone. I also want time, and the ability to create things that generate some sort of business value. Does an investment banker like what they do on a day-to-day basis? Plugging stuff into Excel? No, that's mind-numbing. But they get their satisfaction from seeing a deal that they participated in featured on WSJ.
I also want a hard skill. Being an "idea guy," doesn't cut it.
http://codeup.com/can-a-simple-algebra-test-predict-programm...
Previous hn discussion: https://news.ycombinator.com/item?id=8741868
If you haven't given up in a month, you're cut out for it. Persistence and a willingness to constantly learn are more important than your ability to do mental gymnastics.
There are problem sets out there with time limits. You might even get some if you interview for jobs. But if they give a time limit of 2 hours and you solve it in 1, does that show aptitude? Maybe the average is 10 minutes! But then aptitude is more than just lines of code per hour, especially as the problems being solved become open ended and more complex. Maybe you too got the initial thing mostly working in ~10 minutes but spent the other 50 testing it and uncovering edge cases that would break your peers' quick solutions. So if you have a distribution of results you need to take them with a grain of salt, especially since experience can dominate aptitude so often. (http://ridiculousfish.com/blog/posts/old-age-and-treachery.h...) I don't care what your IQ is or how fast you can type, if you start writing a parser from scratch to solve some problem that is trivially solved with regular expressions, the regex user will beat you.
So if you're going to compare yourself to others, you need to try factoring out things like experience by comparing yourself to those with similar levels of experience. Programming competition prep at school is a great way to do it, since presumably you've all had about the same classes, are around the same age, and with many trial problems you can determine who is consistently doing well (aptitude) and who might have had good/bad runs simply due to having or not having a piece of knowledge. Another thing to try is a friendly 'competition' like Ludum Dare a few times. Your goal is to make the best game you can make in 48 hours. http://ludumdare.com/compo/ When it's done, you can compare with your peers, especially ones that look to have a similar level of experience and made similar decisions as you (language, libs, etc.).
I would be very surprised if people on the level of Carmack or Torvalds or Woz or Knuth or the many others I know of, famous or not, were under 2 standard deviations above average. It's absurd to think they're under one, which is just 'slightly above average'.
IQ is based on statistics, which is based on probability, and probability is good for finding paths with a positive mathematical expectation. Furthermore, would you really want to work in a field where nearly everyone were substantially brighter than you? I doubt it would be good for one's emotional health.
Just for giggles, here is a (somewhat dated) chart of IQ to profession: http://www.iqcomparisonsite.com/occupations.aspx
My problem with this idea is that if you have no idea if the thing on the left (when assigning) takes on the value of the thing on the right, or vice versa, it seems reasonable to answer different questions with different assumptions to cut your losses.
I'm not sure if timed problems are a good way to assess yourself. Being able to solve programming problems quickly comes from (1) experience from having solved lots of problems before and (2) experience with your languages and environments. If you have a lot of aptitude but little experience, you may not be able to solve problems quickly.
"What's the fastest way to tell if I'm cut out for, and should pursue programming?"
I don't know if there's a fast way that can give you a meaningful answer. I'd suggest spending some time (at least several months) learning more about programming, working on some problems you're interested in, and seeing whether you become a better programmer over time.
I know I am a good programmer because when I finally solve the problem it feels good! My brain just releases all these bliss feelings and I go "oh my God, I nailed it!"
That feeling only comes once every several hundred hours of programming. I am routinely faced with technical problems to solve that are completely overwhelming, and that means I have to slog through confusion for weeks on end. If I didn't have that desire to get to the end goal I would probably give up.
I think you should look for what has given you that feeling in the past. If it's building something that works, lining up all the numbers (to 5 decimal places), or cracking a tough problem programming might be very fulfilling to you.
Get going with it. Find an open source project that interests you and contribute. There are a few things that are bad about github but as a platform it really allows you to find issues in software you're interested in, fix it and then submit that fix.
If you work for someone that's ideally the situation you're in, you're working on a software problem that interests you implementing new features or fixing bugs and submitting them.
HTH
To op: for me i find sheer stubborness is how i code. Im not sure if that makes me a good programmer (i have only released one piece of software, took me 4 months to get to where i am, and a long way to go).
I started out loving the results: in my softwares case, the computer understanding what i said and doing that action, then i began to really enjoy how i did it: i just finished expanding it internally to be able to listen to multiple things and perform those actions at the same time.
For me, once i figured out what i wanted todo, not just exercises, that really drove me. I think ive learnt more in the last 4 months, than the previous 8 years of tinkering.
I know your not asking how to code, but this is what is convincing me that i should be programming. Alas i an English teacher, but it pays the bills, and lets me program after work.
To cut through the noise, here's a suggestion: pick up a copy of "The Little Schemer", perhaps you'll find it at a library, or possibly on-line. It's a very easy and fun book to get into. Start answering the questions, if you're still at it past page 60 or so, you just might be a programmer. Get all the way through the book, then you definitely have the interest and ability.
As a bonus, if you do pursue programming you will have learned some very useful things, and if you decide to do something else, you saved yourself a fair bit of anguish.
Do you like putting things together and taking them apart?
Are you disciplined enough to organize lots of tiny little things into something big over a long period of time without getting bored and giving up?
Can you see the forest and the leaves all at the same time?
If you answered yes to all of this, then you have what it takes. I say this to anyone else that answered yes, I don't care if you know 0 programming, but if you can do the above, you have what it takes to become a very good programmer. Programming is about putting little things together, organizing them, and at the same time seeing the big picture (forest) while seeing the small pictures (leaf on a tree). It's not magic or difficult.
If you like it, and are ready to put in the effort - just keep learning and you will become a good programmer.
There's no magical mysterious "talent", there's just intelligence, work ethics, and skill.
Math-heavy but interesting
2. Clojure koans (http://www.4clojure.com/)
Here you're good if your solutions are close to the best solution - which is often short and readable (= elegant?)
There are probably similar koans for other languages and I'd also strongly recommend a functional language (because it frees yourself from the shackles of imperative and OO thinking, but YMMV)
There's plenty of different types of software development too; some require a stronger programming ability than others. If you enjoy solving problems, and making life easier for other people, then it's something you'll get to eventually with enough persistence.
I think how "good" you are at something is a very subjective thing... That said, have you tried programming competitions and projects like HackerRank, TopCoder, the ACM-ICPC, and Google's Code Jam?
PS: if money is not your main motivation, I'd worry more about finding interesting questions/problems that you enjoy solving rather than questioning your aptitude for it.
I think pg has a quote online somewhere to the weight of "if you're spending time thinking about whether you're smart enough, you're most likely smart enough."
I have this theory where people who do these things are good programmers, since they will check their commit a lot of times until it is perfect to push. But maybe this is more about mastery than having an aptitude for it. :)
You might have OCD.
Neurosis don't have much to do with mastery of programming IMO.
It's a bit like zen... "If I work very hard and diligent how long will it take for me to find Zen." The Master thought about this, then replied, "Ten years." The student then said, "But what if I work very, very hard and really apply myself to learn fast -- How long then ?" Replied the Master, "Well, twenty years." "But, if I really, really work at it. How long then ?" asked the student. "Thirty years," replied the Master. "But, I do not understand," said the disappointed student. "At each time that I say I will work harder, you say it will take me longer. Why do you say that ?" Replied the Master," When you have one eye on the goal, you only have one eye on the path."
If you understand it, you're fine.
Otherwise, go back to the beginning.
Loops are pretty easy to understand...
If it takes you years to grasp all those things like the majority of us, then that's fine too.
From what I hear in MIT they give you the complete scheme language at the first lecture.
He asked about aptitude.
I'm fine with C now though.