Ask HN: How can I tell if I have programming aptitude?
aptitude: a natural ability to do something.
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! Here's a little story that I tell to anyone who asks me this question. It's how I got it answered for me a long time ago. > 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. > ...I'm a little envious on anyone who has a talent for drawing. 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. The point I was trying to make is that there is no widespread innate aptitude that makes you magically produce amazing programs when you touch a keyboard for the first time, and anyone who does not have that innate aptitude is bound to write shitty web apps for the rest of his life. You look at people doing something that they're very good at and it seems easy, it looks almost like they have an instinct for it. It seems like they're born with it, but most of them aren't. It seems that a lot of "talent" can be attributed to somewhat random preferences, especially in childhood. You described your friend's childhood drawings as "a little less "hurried", as she obviously loved doing it and spent more time on a drawing", and I think this is the key. She liked drawing as a kid, which made her draw more than her peers, she got better at it and because people generally like doing things the more the better they're at them, a positive feedback loop started. It also suggests a practical approach to get good at something: sit down, practice, and ignore the discomfort you'll be feeling at the beginning. Many people considered talented simply didn't have that initial discomfort, so they drifted into a skill early, whereas for non-talented it is a barrier to entry. I've seen the opposite end of the spectrum, too, though, which is why I don't think talent is only a lot of practice, I just think that you can be very good at something without being one of those "really talented" people. I have another acquaintance who's a musician (an actual musician, unlike me -- I'm just a programmer who likes playing the drums). The guy obviously had a lot of practice, especially as he graduated a famous music academy so he had to play the violin a lot. That being said, he started taking violin lessons when he was 6, but by that time he could play it pretty well. Having realized that he can't remember the songs he was inventing, he even developed his own rudimentary notation system (when he was about four), with horizontal lines whose length indicated direction and a combination of dots and relative heights to indicate pitch relative to the first note of the song, so that he only had to remember where to start from. His violin technique was also remarkably good. When he started giving violin lessons himself, he struggled with understanding the first gripes of beginners a lot more than he'd expected. For instance, he never realized it takes so long to learn how to properly angle the bow when playing the second and third string of the violin (they're at almost equal height with respect to the base of the resonance box, so most beginners will unintentionally stroke both at the same time). Not only did he not remember having that problem, he literally never really imagined that someone could have that problem. He's one of those people who does have an innate talent; there are a lot of techniques that he never learned, nor really "discovered" through an iterative process, he just figured out it would sound good if he did <something>, and it did. His brain was wired in a manner that's favourable to playing the violin and to music in general. Needless to say, he still had to practice a lot -- he had to learn "proper" notation, he's constantly refining his rhythm and coordination, he had to learn how to play in an orchestra, and it's not like he could play any piece, no matter how difficult, from the very beginning. But there were things which his mind and his body could do without being taught, or which, at least, they discovered a lot more quickly than others did. They weren't enough to make him an orchestra-level musician from the moment he set his tiny three year-old hand on a violin, but they are certainly enough to set him apart from a lot of musicians of his age and experience. People that excel in something are far less than the ones we perceive as such. Most of these 'talented' people have only above average skills, a big dosis of charisma, ability of selling and a bit of luck. That is definitely it. I've been playing guitar for years and when some friends tell me how I was born to play because I'm talented, I tell them it's not like this. It actually makes me feel bad. It diminishes all the time that I spent practicing to get better, trying to learn new things, listening and improving my playing. 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. I see a lot of people that can do things much better, and faster than me. It's intimidating. There are also some problems that I can't even solve in pseudo code. I literally just can't come up with an algorithm that would work. I get a few ideas, and then quickly realize that they're all terrible. Yet I'm sure that there are people that can look at the same problem and come up with 5 different solutions in 30 seconds. I can do a lot of problems, but I think it's just because they're easy. Every time I stumble upon one I can't do without looking stuff up, it ruins my whole day. I begin to get really frustrated and wonder if I just don't have the right type of mind to be a programmer. 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 see a lot of people that can do things much better, and faster than me. It's intimidating. 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. It feels like cheating though. Once you ask someone for help, the problem is dead. You haven't solved it yourself, and now even if you do solve it, it won't count. Someone told you how to do it. Your interviewer isn't going to help you with technical questions. You're looking at this the wrong way. It doesn't work this way for any profession. Do you think that doctors are created by taking a sick person, sticking them in front of an untrained 'doctor-want-to-be', and seeing if they somehow miraculously manage to correctly diagnose and treat an ailment they've never heard of? No. They train. They study symptoms, and causes, and treatments. They learn about how symptom X is caused by disease Y, and is usually treated by medicine Z. But medicine Z doesn't work in all cases, it's only 75% effective. So you might need to try medicine Z2 instead. etc. And they they do this, over and over and over, adding in new knowledge of symptoms, treatments, effectiveness, etc. They do this on paper, and they do this in a controlled, supervised environments until they can demonstrate enough mastery to be able to demonstrate that they know enough of this body of knowledge of problems and solutions to be trusted to apply it on their own. Programming is no different. Answers don't magically spring, unbidden, from some secret programming organ in your brain - you need to learn the established patterns for solving different types of problems. Then, you need to apply them to different situations. Right now, you're frustrated because you don't have a very big 'bag of tricks' yet. You've only learned a couple of 'solution patterns'. You said that some problems are easy - right? Well, they're easy because you've already added those to your 'bag of tricks'. You've learned the patterns that solve those particular problems. The ones that are hard? That's because you haven't learned those patterns yet. Once you do, they'll be easy too. So, looking up solutions for how to solve these 'hard' problems isn't cheating - it's learning. You're learning new solutions. As time goes by, your library of problem->solutions will get bigger and bigger, allowing you to solve more types of problems. So, don't think of it 'ZOMG - I'm so dumb! I can't magically come up with the solution to this type of problem that I haven't encountered before!' Instead, think of it as 'Hmm. That's interesting. Here's a new category of problem that I haven't solved before. The existing solutions that I have in my toolkit aren't solving it, so let's go learn a new solution pattern. Then I can add it to my toolkit for future problems.' That makes sense. I do want to make sure I'm not just memorizing strategies though. I want to be able to figure things out independently, with my own logical thought. I'll continue learning. Getting problems right and watching those tests light up green on Codingbat is a very nice feeling. I do get genuinely upset and frustrated when I can't figure out a problem, though. I'm not sure whether that means I hate coding or like it deep down. Memorizing can take you pretty far. Mastering and extending a body of knowledge doesn't have to come from independently postulating a few principles and working things out from there (though that can be very fun and satisfying). Focus first on imitation, memorization, then figure out how to apply it. After you can apply it, figure out how to adapt it in certain circumstances. You might even evolve and extend the knowledge, especially as you integrate other things. One hack I'd suggest for fulfilling the craving of doing things "from scratch" when you're frustrated at a particular problem is to go back to one you already solved, but pick some class or method or set of methods of Java's library you used and make your own version. New problem! Data structures can be the most common. Used a java.util.Stack object? Write your own Stack class. Instead of `int Integer.parseInt(String);`, write your own. Try a hash map when you're a little more experienced. Pretty much everyone with the hunger writes their own string class eventually (usually in C++). Or try to solve the whole problem again in a language that gives you less, like C. It's good practice for college and tech interviews too. Too boring? Waste of time? Good, you'll appreciate it's there next time so that you don't have to keep reinventing the wheel and can just use it as you go about inventing some new thing made of wheels. The only danger is if your appetite is totally consumed, you'll swing the other way always searching and waiting for the right set of already-built dependencies you just have to glue together, and even then you could just hope for a framework that does that, your tolerance for exerting any programming effort for 'boring' stuff will go away, and everything will be 'boring'. That's not a great state to be in if you have aspirations of building rather than simply using. Codingbat looks cool, hadn't heard of it before. You might also try Project Euler, another programming/math-problem solving site where "the problems range in difficulty and for many the experience is inductive chain learning. That is, by solving one problem it will expose you to a new concept that allows you to undertake a previously inaccessible problem. So the determined participant will slowly but surely work his/her way through every problem." I don't think that's related to liking or hating coding. I get the same feeling, but I get it about plenty of other things. I love coding, but I don't love it on a daily basis while I'm working, and I certainly don't love getting stuck on a problem I can't solve. I do love the moment I get it working, though. Asking for the solution, and asking about the process they've used to solve a problem is not the same. Learn the process so you can solve similar problems in the future. I wouldn't consider it cheating or "not counting", they've had to learn how to solve those types of problems somewhere. the problem isnt' dead because the solution and what you do with it in the future. Teaching a (wo/man) to fish. There's always going to be future problems and ways that synthesizing what you know from others IS the way we get better. Also you're being selfish. Not asking means you're not able to give another an opportunity to enjoy helping you and taking that with them as an accomplishment for the day. Get out of your head on this one. You're able to help people who can't do something right? Why deny the joy or accomplishment to somebody else? There's no shame in reaching out to others when problem solving, that's part of (and should be part of!) the problem solving process. In my experience, Interviewers love when you ask intelligent questions. This response basically proves (to me) that you have an aptitude for coding. 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. Do you enjoy programming? If so, you will be good at programming. If not, you most likely won't. Exactly, this is THE question! 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 ;)) "Even if you were somehow very good at programming but you hated it, would you choose it as a job? I'd drop it immediately, don't waste your precious time on it." 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 For some it's even worse; for me, "doing what I love" is not "programming", but "programming as long as it isn't my job". Weird and not 100% capturing the complexity (I increasingly believe I may have an attention deficit disorder on top of diagnosed depression I'm dealing with), but in my case it's: I program for money, often hating it, because I'm relatively competent at it, and then I program for fun because I love it. I would consider getting a job that doesn't trigger my mental weak spots but the value proposition for most things not related to software is pretty bad these days. TL;DR: It may be worth programming even if you don't like it, because it pays well. Also, life sometimes deals shitty cards. The one thing people don't tell you about "do the thing you love" for a job is that the people who make decisions and decide which projects to work on usually won't be you, unless what you love to do is be a manager or business owner, which I really don't (I can be project leader, but I don't want to stop programming entirely). So yeah, I've worked for several companies where I've absolutely loathed the project, but that's what I was assigned to do, so I have to program for it, even though it bores me to tears. Even when I was making games for a living, I sometimes ended up working on games that I knew were awful, but I wasn't in a position where I could switch to something else easily (I live in the Midwest, where gamedev jobs are scarce anyway, which is one reason why I got out of that industry anyway). What do I want to work on? Whatever game or app concept I came up with that excites me at the moment. Who's going to pay me good money to do that? No one. So instead I'm currently working in an enterprise environment to help pay down my school loans while working on my own stuff with what little energy I have after work hours. I program for money, often hating it, because I'm relatively competent at it, and then I program for fun because I love it I'm in the same boat! I increasingly believe I may have an attention deficit disorder on top of diagnosed depression I'm dealing with Have you tried exercising, getting enough sleep, eating healthier, doing more "outside" or social activities and/or testing out nootropics like citicoline/noopept? All of these have helped me greatly! BTW, highly recommend checking out The Healthy Programmer book: https://pragprog.com/book/jkthp/the-healthy-programmer life sometimes deals shitty cards Virtual manly hug mate! > Have you tried exercising, getting enough sleep, eating healthier, doing more "outside" or social activities and/or testing out nootropics like citicoline/noopept? Oh, the usual stuff ;). Tried all of these at various points; haven't noticed much difference, but I think I might not have tried enough. Going item-by-item: - Exercising: probably not enough; the amounts I did didn't really affect much (except weight), but I'm going to try again, at a gym this time. - I have problems going to sleeping due to depression and anxiety (I constantly feel I haven't done enough yet, so I can't go to sleep yet), combined with being generally a night person (after day spent with people I really appreciate the late hours without any face-to-face distractions). But when I finally fall asleep, no force on Earth or in Heaven can wake me before I get my 7-8 hours. Which annoys my employers. - I try, but I just don't like green food :(. Cutting out sugar from diet did wonders to my weight and dental health, but didn't improve mood issues. - I'm a very social person, people call bullshit on me when they hear me describing myself as an introvert (I usually send them this classic then: [0]). I frequent various events, both as an attendee and speaker, help run a local Hackerspace and have uncanny ability to serve as a translator between technical and untechnical people. - Piractem & noopept - little to no noticeable effects. Nicotine (pure, in gums, I'm not a smoker) - helps stay up a little longer and improves my alcohol tolerance. Adrafinil - does wonders when I need to skip a night's sleep or feel the stress-induced tiredness during the day. I didn't try anything else. > BTW, highly recommend checking out The Healthy Programmer book Thanks, I'll check it out! I highly respect the Pragmatic Bookshelf for Pragmatic Programmer and Pragmatic Thinking and Learning. The book you linked is one hell of an expense, but if it could help, then I guess it may be worth it. > Virtual manly hug mate! * hug * #HNTherapy [0] - http://imgur.com/76HUN I read a trick about writing everything down you need to get done so you don't get that feeling at night your going to forget to do something in the morning. helps sometimes. It works. The feeling I have is more of a "I've done so little today and there's still so much to do, I can't go to sleep yet". Perhaps when you have finished you education and are choosing a job, but certainly not for picking your education. The job market may be radically different by the time you enter it. did Einstein hate being a patent clerk? "He spoke of the patent office as «a worldly cloister where he hatched his most beautiful ideas»" source: https://www.ige.ch/en/about-us/einstein/einstein-at-the-pate... Take that as you will. 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. 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. And just rememeber: Just as long as you have once enjoyed it you are good. Once you start being serious about it there might be bad days or weeks as in any other profession. Right on. Enjoying it helps you accomplish the many hours that will bring you way beyond a natural. There is a lot of evidence that mastery is through practice --- not natural ability. Seconded. Quality comes only from quantity. And quantity can only happen if your efforts result in bruises you can tolerate. Thankfully most people no longer have to deal with 'segfault' related bruises! :-) Oh they do, it's usually called "Null Pointer Exception" or "X is unbound"/"not an Y" these days, depending on one's particular taste for typing flavours :). On the other hand, it is harder to make your monitor explode while trying out fancy graphics effects... It's hard to say. Would I rather watch a TV show than solve a brain teaser? Yes. But I can replace "solve a brain teaser," with just about anything there. I'm not lazy, I can work, but I'd be lying if I said I enjoy work MORE than leisure. 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. If the puzzle questions seem like high school math, I second the idea of building something. Try to get a website set up if that interests you. If not, try building a command line tool to help you with something you do regularly. 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. I enjoy programming, but not the slow / invisible result like any enterprise application, where you'll only see modules / sub-modules updated & no visible change... What I actually love is scripting / automating repetitive tasks... Still programming, but somewhat different in satisfaction (for me anyway) Yes, you must definitely enjoy it. When it becomes a chore or you don't look forward to working on something you're probably not one with "programming aptitude". That said, I have met people that could pick it up quickly and then stopped because it wasn't their thing. I don't think there is a test that is going to tell you that you should "pursue programming". It comes down to whether you enjoy programming or not, and if you can see yourself personally doing it as a career. I have seen people who are excellent coders and analytical thinkers, yet have no interest in programming as a career. They are much happier in project management and other roles. On the flip side, I have seen people that have a strong desire to be programmers, yet have little "aptitude" (as you define it above). However, they have found niches where they excel at programming by working hard and overcoming their own obstacles. 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. Lots of people have said that you need to like programming. 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. You will almost certainly feel like you're not cut out for programming when you start. Failing is a necessary part of the process, which will make you feel inadequate. 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). I think aptitude is overrated compared to overall drive / obsession. You should pursue programming if it's something you want to pursue. 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. Project Euler does have a lot of good puzzles, but as parent comment says, they're more math related. If you don't like them (FWIW I never managed to get into them) you shouldn't necessarily think that programming isn't for you, as it can also be about building neat software that people use. As others have said here, you should try to get a feel for if you enjoy programming and what sorts of things you enjoy programming, because there is a lot you can do with it. If you don't like the math side, try building a simple app or web page and see if that interests you I'm definitely not obsessed with programming. I can force myself to practice regularly, though. All it takes is discipline. 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. Algebra. http://codeup.com/can-a-simple-algebra-test-predict-programm... Previous hn discussion:
https://news.ycombinator.com/item?id=8741868 Go build a simple web app. Right now. Pick a programming language out of a hat, set up a database, wire up a few buttons, add some logic, and shove it all up in some cloud. 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. Web apps are boring. Build tetris. The quickest way: get your IQ tested. If you're north of 115 and have the desire for programming, you'll be fine, though your 130+ peers will probably do better. If south, but you still have desire, you can still produce value, maybe even become a very rich person or internet-famous, but you're unlikely to be a top tier programming god. If you don't have the desire in either case, what are you going to do instead? Consider doing that, but note programming is a pretty good gig even if you're just ok at it or don't like it that much. 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 don't believe an IQ would be a worthwhile investment for anyone trying to decide if a career path is for them. I'm sure many of the "top tier programming gods" you're thinking of are of slightly above average intelligence and just have exceptional communication skills. Why not? The military has successfully done aptitude testing for decades, it's a quick way to see whether further investment in a direction is worthwhile. (Edited to add this, similarly if you have a budding interest in basketball but you're not going to get tall, you should probably not shoot for the NBA. Keep dabbling if you like it, but have realistic expectations, statistically you won't be another Webb, who was still 5'7". It's irresponsible for people to say keep pushing hard and as long as you're having fun you'll eventually get to the NBA.) Official tests are best but there are a few ok online ones that can at least quickly set approximate expectations. If the OP has already done ACT/SAT tests, it's even quicker to fetch the highly correlated IQ value. 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'. IIRC, the military uses aptitude tests as a negative filter -- the ASVAB will be able to determine if you are obviously unsuited for a given profession, but it's not designed to single out exceptional individuals. I and a few others who took it with me got perfect scores, but that doesn't mean we'd be equally suited to any career path. Unless the OP is asking if he has the mental capacity to be a minimally competent programmer, his raw IQ score won't tell him much. Consider this scenario (merely hypothetical): Say you want to be a physicist for a living. Then say you find a reputable study showing that the average pre-physics-education IQ for a financially successful physicist is 140, with a standard deviation of 8. In this case, granted the information were accurate, would it be financially responsible for you to invest your education time and money into pursuing physics if your IQ were only 110? 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 Let's say instead that you want to enter the field of physics. With an IQ of 110, you might be able to excel as a lab manager, an analyst, a lecturer, or any number of prestigious careers other than "physicist," which, to be fair, isn't actually a job title anyway. If you were to instead aim for a career as a programmer, which includes subfields like "CSS specialist" and "engineer who writes firmware for jet engines," you'd quickly find that there is room both for people of extraordinary as well as below average intelligence. Programming is not a genius-level activity, though some subsets of it are. The chart you linked to shows that someone working in computer occupations will usually have an IQ between 90 and ~120, which seems pretty close to average. I agree with most of what you've said here. A generic occupation such as "physicist" or "programmer" allows for a broad array of possibilities, many of which don't require more than ~100 in IQ. For example, making Excel spreadsheets to convert test grades into a final grade is quite easy, despite technically being "programming". A huge contrast is found when comparing that with writing a 3D or physics engine. The difference in IQ requirement could be 85 versus 125. My hypothetical scenario were better with a more specific occupation, having a higher requirement, but I didn't find any better data than that on the link I posted. An important factor to consider with all this is the rate with which a particular person could learn or carry out such a job's activities. There is a reason why retarded people (IQ < 70) are called "slow", and that's because they learn at a much slower rate compared to persons of 100 IQ. If you tried hard enough, you could probably get a person of 70 IQ to remember some physics equations, but (a) it would take a really long time, (b) they would not truly comprehend the nature or derivations of the equations, and (c) they would probably be very poor at recognising when to apply a given equation, let along actually applying it. The point is, they would be completely unable to compete in the job market. And this phenomenon is by no means exclusive to "retards". There are many concepts for which a person of average intelligence would seem retarded at trying to understand, and this could probably apply to persons at any level of intelligence. A final note is that job requirements, both in terms of education and intelligence, are always changing. Due to advances in technology, some jobs are far easier than they used to be, while others have become much more intellectually demanding. Programming, for example, is much easier than it used to be -- as a result of new IDEs, new programming languages, and more system resources. On the other hand, I imagine being an auto mechanic requires more brains now than in the past. Generally speaking, the easier the task or job is (intellectually), the more likely it is to be replaced by automation and or robotics. I read a study a while ago that addressed this exact problem - a CS professor gave an intro class a test on CS. The students who had a consistent view of how a computer works (no matter if it was wrong or not) turned into programmers. Everyone else failed. There was essentially no movement between the groups. That study was retracted by the author, who now deeply regrets it. See here: http://retractionwatch.com/2014/07/18/the-camel-doesnt-have-.... Here's Jeff Atwood on this: http://blog.codinghorror.com/separating-programming-sheep-fr... 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. Interesting. Link to the study please? I just found it: http://www.eis.mdx.ac.uk/research/PhDArea/saeed/paper1.pdf This study is biased toward students who already knew CS before taking the class, which is a substantial number. If someone can explain how this methodology makes sense, I'll start to buy the argument. People used to say women were less likely to have a "natural ability" at CS, despite the huge amounts of seminal CS work that women did in the 50s, 60s, and 70s. That changed when the Apple II came out, and it was marketed at boys. Boys practiced CS before college and basically drowned out the true newbies in their 101 classes. After schools realized this, they offered pre-101 catchup classes, and that has totally eliminated the gap that we saw before. I've still never seen anything to indicate that aptitude to program (as a job, not as a researcher or theorist) exists. The study was retracted by the author. He has said that he was wrong and that the paper was wrong. "Can anyone suggest a few problems with max completion times for each that will let me know for sure?" 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. Something to look for: what gives you that feeling of total bliss? 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. Exactly this. Whenever an interview asks about why I choose this career, I jump straight to talking about that feeling of success when something works after working at it for hours, days, etc. Forget trying to work out if you have any 'natural' ability (though since programming is a man made invention you can work out if you have any natural ability in the field by testing your problem solving abilities). 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 Well a lot of these answers helped me feel better thanks guys. 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. I agree with all the comments saying there's no short cut to finding out if you have "aptitude" for programming (or anything else). The only way to know is to try it, assessing its suitability is very much an internal matter, really a judgement call. 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 puzzles? 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. Just ignore this question and don't worry about it. 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. There's not really a way of measuring it but I used some different proxies such as 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) I think it's probably something that's hard to assess like that. I've been learning to program on-and-off for about 2 years. It's only through sheer bloody-minded persistence that it is starting to see the pieces fall into place. 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. "Can anyone suggest a few problems with max completion times for each that will let me know for sure?" 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. Aptitude is very overrated. I think if you're curious enough to wonder if you're good enough / have natural "aptitude", you more than likely have enough "aptitude" to go with it and can pursue programming. 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." There are a lot of sites out there that offer programming challenges you can try, but actually developing software and programming are two different things. If you can do all of what you said, then it doesn't matter how well you can solve a programming puzzle. You've got what it takes and what you need is time developing real software and mentors to help you grow. Do you check the stove 3,4 times when leaving the house?
Are you sometimes anxious, that you didn't properly shut the door after haveng left the house? 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. :) > Do you check the stove 3,4 times when leaving the house? Are you sometimes anxious, that you didn't properly shut the door after haveng left the house? You might have OCD. On the other hand, if you're too much of a perfectionist, you might never get larger tasks done because of obsession to detail. Neurosis don't have much to do with mastery of programming IMO. I don't care much about things in the house, but I do check my commit a couple of times before pushing it in. You're asking on HN. That tells me that you have the interest. The question becomes if you're willing to do the work. Are you willing to put in daily practice to learn coding? Even when the "passion" is gone? If so, you're cut out to be a programmer. Aptitude does not apply. Among psychologists studying the development of expertise, it is considered well established that outside of some rare and obvious cases, there is no such thing as aptitude. Skill is just a function of practice. It all depends on your willingness to put in the time. As an architect (houses) and an hobbyist programmer I see a lot of similarities between these activities: they are theoretically creative work but normally is not your creative aptitude that will land you a job. There are far less creative roles than boring ones.. Pretty good reading on this topic - https://terrytao.wordpress.com/career-advice/does-one-have-t... Do you think it is fun? If yes, you have it. If no, you don't. I had never heard of FizzBuzz before this exact moment. What a weird "test"... Liked computer science in college because most of the grade was code not tests. If you believe you have it, you'll be much likely to have it. programming like anything takes practice. You also have to enjoy problem solving. That's my short take on it. The longer you can exceed the max completion time the more aptitude you have for programming. 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 can grasp pointers, recursion, asynchronous programming/callbacks in less than a week (as a concepts, not apply-able skills) you have it. Pro tip: In order to understand recursion, you have to either just know it or know someone who understands it. Understanding recursion: If you understand it, you're fine. Otherwise, go back to the beginning. Not at all. This is just basic mathematical induction in reverse. I think we learned it in 7th or 8th grade. I think he was making a meta-joke about recursion. Not really, if you understand loops you understand recursion. Loops are pretty easy to understand... Recursion is Mathematical Induction, written as a program. If you can grasp all those things in less than a week, than congratulations: you're a once-in-a-lifetime genius. If it takes you years to grasp all those things like the majority of us, then that's fine too. I have also been in class with 20-other once in a lifetime geniuses, and probably a total of 120 in my high school. And there was a whole chain of schools that specialized in math in the country. One per county. From what I hear in MIT they give you the complete scheme language at the first lecture. He asked about aptitude. It took me several years to grasp pointers after having fed on BASIC since I was 7 :/ I'm fine with C now though.