Ask HN: How many "self-taught" programmers and how did you do it?
1) How did you learn to code? Totally self taught from books and RTFM // Self taught plus MOOCs or comparable resources // Some classes in college but no CS degree, remainder self-taught // Self taught plus a developer bootcamp or some non-degree related formal education // CS degree and personal efforts
2) When did you start learning (perhaps informative because of the recent rise of MOOCs)?
3) At what point (if yet) did you start working as a programmer professionally relative to your initial efforts?
I had been wondering about this for a bit and the discussion here (https://news.ycombinator.com/item?id=6467914) motivated me to finally post it.
Administrative note: I'm below 200karma so I can't make this a poll, if an admin wants to throw some polling categories in here that'd be cool too.
Edit: added quotes to the self-taught in the title since I realized that with the advent of StackOverflow and various other social learning tools that there are very few who can truly claim not to have learned at someone else's digital knee at some point or benefitted from the currently robust community that exists online now.
127 comments
[ 5.3 ms ] story [ 107 ms ] thread2) Five or six. My mother owned a ZX spectrum - this would be around '93 '94 - and she had a bunch of old magazines that had programs in them, so I started typing them in. I'd also done some programming on a BBC before this - but that was with my mother's urging so not really a self-taught thing.
3) I was 16 when I sold my first program to a shop I did some volunteer work at. It was a simple thing that just did ranked correlation coefficients to arbitrary sets of data so that they could keep track of what their KPIs were telling them.
More substantially, I did it after uni. Graduated with a philosophy degree, which was the subject I found least objectionable, and found myself largely unemployable in any other line of work.
Moocs can be a better introduction to programming than mere books, but I haven't seen any evidence on how successful MOOCs are at teaching programming.
1,2) Me and a cousin started out making games in Macromedia Flash when i was little kid, Probably when i was 8 or 9. At first it was only copy pasted code and/or keyframing stuff. After i Studied BASIC in 9th grade, got a little more confident and started playing around with ActionScript more. By the 11th grade I was making pretty cool stuff programatically in Flash 5 (or i think was MX by then) I made a lot of game physics and game AI and stuff. In freshmen year in college, i got introduced to C and later C++ and just took off from there, learning mostly by doing, making harder programs etc. Competed in a lot of national level Programming Competitions and won.
3) Recently graduated with a CS major and working at a big software solutions firm, working on enterprise level software for insurance companies.
Btw, i think people should really take up CS in college. While you can learn programming and a ton of languages on your own, there is a lot of timeless theoretical stuff that is best learned in class. Oh and also Software Engineering stuff like "Object Oriented Analysis and Design" or "Requirements Engineering" or "Design Patterns". That stuff comes in handy a lot!
I think it is as self-taught as, say, carpentry, or playing an instrument.
That is to say, it is certainly possible to be excellent at what you do by putting in the hours, and you don't need anyone to achieve that, but it is wrong to think that only you can teach yourself. Learning from others can definitely accelerate your development.
Of course, the reality of learning is very complex. It's always about engagement. For a teaching situation to function, there has to be a genuine engagement between the teacher and the student.
In cases where students are, for whatever reason, very highly motivated, the "lecture" style of teaching might work. A sign of a functioning lecture would be that students ask relevant questions. This has not been the case in most of my university experience, where students mostly take notes of whatever is written on the blackboard, drink coffee, and ask things like "is this going to be on the exam?"
It's interesting to think about the prospect of teaching carpentry through books, lectures, and online courses. Maybe it's possible. But I think simply having access to an environment of practice and active people to ask for help is the biggest factor. Hands-on help with an actual task at hand plus lots of individual experimentation.
2) 2002
3) 2009, although if I didn't do three years of university it would have been sooner.
EDIT:
[0] I think university is also good for life experience, and I still think it holds true that most companies (even non super-mega-corp) prefer people to have degrees.
I did study a uni CS and EE for a couple of years, but left because my school was way behind what was happening in the real world at the time. I was consulting in the IT world, and thought at the time that the CS stuff was hopelessly outdated. I realised years later that I should have stuck with it because now I know that some of the theory is universal and timeless and would have stopped me from reinventing wheels a lot.
I've mainly learned by doing, solving problems using technology. I learned in the beginning from books and usenet, then gopher was my friend and eventually of course the web. I still find a good book is the main foundation I use for learning, supported by things such as forums and MOOCs (I've yet to find a MOOC I agree with, mainly because I am personally not a big fan of video learning - I still like books the most)
I've worked on and off in the IT world for 25+ years, currently I am an English teacher, I do IT projects on the side and I'm about to tackle e-learning head on with a new start-up. I would have trouble finding a job because I have no formal degree (people toss my CV/resume) and I am late to the world of github so nowhere to point people to see my work as most of the problems I have solved are internal problems businesses have. So most of my work comes through word of mouth recommendations, and I only take projects nowadays that have an new, interesting angle for me - point in case I am learning NoSQL and Graphing DBs to create a recommendation system for a network of insurance brokers. (I think the problem could actually be solved trivially with Postgres and judicial use of statistical analysis, so I am creating 2 solutions in parallel to see which one will perform better at scale as well as more accurate). I've never done rec systems before, but I'm a big fan of AI and ML, so this seems like an interesting problem to research and look into, as well as having the opportunity to be a little profitable.
1. Self taught from internet resources and experiments. I still remember stuffing my 128MB flash drive with HTML pages so that I can read them at home. Originally got into programming to cheat in some games. Started with making trainers/ memory editing and bot for MMOs.
2. 3rd year of middle school. Around 2005, I think. Accessed the internet for the first time.
3. Not yet. but I have been trying to learn more about the topic ever since I realize whats possible with it, and my decision to learn more seriously about programming led me to taking CS degree in college.
When the BASIC started to feel too slow and limited I switched to C. I never really learned the language "formally", my original code was filled with GOTOs and local variables (I was coming from BASIC after all). Then with practice it gradually improved. I still fondly remember the "wow" moment when I understood the point of function-local (stack allocated, but back then I didn't know what the stack was...) vars.
Now I write low level C code for embedded systems for a living.
Learning to code was very difficult in those days.
1. There were no free compilers outside of academia.
2. Compilers cost hundreds of dollars
3. Programming books cost $50 each
I used to buy $5 shareware disks that claimed to have compilers and tutorials on them and they never had exactly what was advertised.
In the end I managed to buy a second-hand slightly out-of-date compiler (Turbo-C?). I still seemed to spend any spare cash I had on books.
I was lucky enough to be leant a good C book by a family friend (whoops... Still have it almost 30 years later!!).
But I agree with your overall point that it was much harder to self teach back then. On the flip side however is that now there is so much choice that getting started can be a challenge as there are so many routes to choose!
I, too, learnt assembly mostly because there were a few good free assemblers available.
Pre-planned courses never appealed to me at all, maybe because of some slight ADD tendencies. They try to titrate knowledge in a steady, regulated, and pedagogic way. That just bores the shit out me. The only thing that even remotely excites me is diving into doing things that are too difficult for me, failing, beating my head against my desk, asking real people for help (not supervisors or TA's), making tiny exhilarating steps of progress.
I'm generally very skeptical about all kinds of teaching, upbringing, and so on. Like when parents and educators try to ensure that their kids turn out good by adhering to various "time-honored" methods and curricula, and fail to realize that they're just locking their kids up for decades, ineffectively preaching at them while they wait for the break so they can talk about whatever they're actually, genuinely, vitally interested in.
Maybe I'm just weird, but to me joining a MOOC seems like tying oneself up in chains to learn how to walk. There does seem to be people who actually find sustainable motivation in that sort of thing, but the statistics seem to say they're not as many as those who only think they will.
By all means dabble around with some courses to get your feet wet, but don't expect to become a good programmer by following other peoples' curricula!
2. Read my first programming book when I was 15, on ASP of all things but I had been learning HTML on my own prior to that, following tutorials online. My school also offered a short course on Turbo Pascal.
3. Got my first job as a Flash programmer when I was 18 and I'm soon turning 27, employed as a Full Stack Developer (don't hate) without having a CS degree. I do have a bachelors degree in Media but it's essentially worthless and has nothing to do with my work.
I started programming when I was studying for a PhD (in mathematics) around 2006-07. I was 23 at the time. That was mainly in Matlab and Fortran. My code from those 3-4 years is, frankly, pretty horrifying.
When I got my first job in industry (quant at an investment bank in 2010) I had to learn Java, and a language called Q[0], which is a very fast array-processing language with a functional feel and a built-in query language for the KDB database. I also picked up a little bit of R, mainly because I was building a lot of statistical models and it was far easier than doing it in Java.
That piqued my interest in functional programming, and I subsequently learnt Haskell using the book Learn You A Haskell[1]. I picked up Python around the same time when I was trying to write a web scraper, and finding it painful in any of the languages that I currently knew. For that I used Learn Python The Hard Way[2].
When I started a new job in 2011 I started writing Matlab again, causing me to finally learn it properly. Around that time I decided to try and learn a low-level language, so I picked C, mainly because there was an interesting edX course [3] that I wanted to try (the Harvard course CS50).
I'm at a weird in-between stage now. I can write comfortably in half a dozen languages, but there's a whole swathe of programming that is completely alien to me (web design, networking, and any kind of formal software architecture). I've written a lot of heavily numerical and mathematical code, but never written a CRUD app or a web page. I still don't know Javascript.
[0] http://en.wikipedia.org/wiki/Q_(programming_language_from_Kx...
[1] http://learnyouahaskell.com/
[2] http://learnpythonthehardway.org/
[3] https://www.edx.org/
Nearly all of my learning happened on the job, as a result of taking on projects involving technologies that I had no clue about when I started and mostly mastered by the time I finished. Pretty much what is now called a "full stack" developer as a result.
I believe the best way to teach yourself is to solve your own problem or build something you're truly passionate about. You can either do something new or improve something you currently use. This is how I taught myself to code in PHP, although now I can also write applications in Python.
2. See 1, more or less. I'd say I -really- started to learn when I built my own website in high school that started bringing in money and still does today. It was a full web application to start and I just kept rebuilding it from scratch as I learned new stuff (object-oriented programming, design patterns, etc).
3. I wouldn't really call myself a professional. I went into bioengineering and medicine, but I still program every day because it runs our current world and will for the foreseeable future. I market myself as a software engineer, but I only accept jobs I find interesting or that pay 6-7 figure salaries.
I was happy playing games for a few weeks and then it broke. It took one month to fix, so meanwhile I was left with the BASIC manual it came with. I read it to withstand the cravings and when I got the computer back I was already more interested in coding than playing games.
So I taught myself Basic. Later in school I was taught Comal 80, some variation of Cobol taught in Danish schools. I learned Pascal later, also in School. When Internet came to Denmark in 1995 I taught myself PHP v1+2+3, and later Javascript, and started my own little business creating websites, based on a selfmade CMS. PHP + javascript has served me well for 18 years, but I think its time to move on to something like Go - so thats what I am planning now.
Instead of playing any of the bundled 12(?) games we had to wait for shops to open to get the drive swapped, and instead I read the thoroughly comprehensive manuals. Initially playing in BASIC, then later hand-assembling via the opcode table at the back of the book.
1) How did you learn to code? Totally self taught from books and RTFM // Self taught plus MOOCs or comparable resources // Some classes in college but no CS degree, remainder self-taught // Self taught plus a developer bootcamp or some non-degree related formal education // CS degree and personal efforts
Unfortunately I never worked in any company so had to learn all the coding by myself and I strongly feels, if you want to be a good developer, you should work in a company and on real world applications with people who knows more than you which speeds up the learning. Though I am working full time on my own marketing product, if given a change, I would love to work part time in any company for free. There are few things which you can never learn from books and tutorial videos
2) When did you start learning (perhaps informative because of the recent rise of MOOCs)?
I do have a computer science degree from a reputed engineering college but I learnt nothing there, though I do have exposure towards programming for 10 years, I only started building real world apps in last 12 months.
3) At what point (if yet) did you start working as a programmer professionally relative to your initial efforts?
last 12 months, I am learning and writing code in parallel.
1) books, and working on personal projects to "scratch an itch"; progets grew larger, at some time I started doing it professionally
2) ages ago :)
3) I started as a sysadmin since that's what I self-learned from, programming came later maybe 3-4 years
Reading other replies, I totally forgot to mention I first started programming in Basic on a TI-99 with a tape recorder for storage. :D
I still learn and read a lot, I have always one course going (most recently on Coursera).
For me the most important thing is not having a rule book. If you believe deeply that you need a CS degree or to follow a popular route into the industry then I believe that you will fail to learn as everything will seem to be an obstacle that you are not privileged enough to overcome.
Without a rule book, and with the belief that anything is possible... and if you can break down your problems into logical things you can describe... then you can teach yourself how to solve the problem.
My first step was a simple one, I had a manual mailing list which was names and addresses on bits of paper that I photocopied onto Avery label sheets. This was in 1993 and when the mailing list exceeded 2,000 I knew a computer could do this easier then I could. I purchased an IBM 386 and had no internet access (or knowledge that it existed) and could only learn from books as I also knew no programmers.
I purchased a book called Programming Perl, and just set to it. I think it took about 2 weeks to get the full mailing list application built, with flat-file datastore, printing, etc all complete and working. Looking back, everything was horrible about the implementation, it was ugly, inefficient, virtually unmaintainable... but it worked.
By 1996 I had started selling merchandise to the mailing list and written stock management, VAT accounting and reconciliation, the paper mailing list, an email marketing list, a shopping cart web-site, a community area on the web-site. This was effectively a shift from hobby programmer into a professional programmer and the start of a career in computing.
If I had been told those things were hard, or belonging to the problem domain of highly educated programmers, then perhaps I wouldn't have tried.
Believing in advance that anything was possible gave me the motivation to persevere, an obstacle would clearly be overcome if I could just stand back and think clearly about it.
After that... just carry on solving problems. Every time you have a new problem you gain fresh experience. Over time, that adds up.
I built a bunch of personal websites, and sold my first professional website (static HTML) to a local estate agent when I was 15, back in 2000. I charged £300 - around $500 at the time. I worked for them for a couple of years, updating properties etc.
I studied Law at university, but worked on websites for my college, the student paper and various sports teams. I started my first startup when I was 19 - I wrote a lot of bad PHP and inline MySQL queries whenever I needed data in what we now call "views". There was no test suite, no version control and I often made changes straight into production, because I couldn't get a LAMP environment running consistently on my PC. This repeatedly took the site down for hours at a time. This was back in 2004. The bad old days.
I took a break from coding to join a management consultancy for almost 3 years, although I ended up automating a lot of my work in Visual Basic (through Excel), and went on to teach the Excel course to colleagues.
I started my second company at the start of 2011, during an enforced 3-month period of "gardening leave" between two jobs. I decided that I wanted to learn how to code properly, so I bought "Agile Web Development with Rails", published by Pragmatic Programmers, and worked through it in about 3 or 4 days, non-stop. This was an epiphany - web development all started to make sense, and we launched the first version of our site about 2 weeks later. I knew enough Ruby to be dangerous, but probably not enough to get a job as a professional programmer.
As my co-founder was teaching himself HTML & CSS at the time, we didn't really have expertise in-house, so I spent a lot of time on the #rubyonrails channel on freenode - a wonderful place to get help on anything Rails related. Stack Overflow was also very useful.
By March or April of 2011, we'd been accepted onto Y Combinator and hired our first (extremely capable) engineer, who had a CS degree. This spurred me on to become more technically capable, so I just started devouring programming books. I've mostly steered away from the classics (Gang of Four just didn't make sense from a Ruby point-of-view), but there are often more practical, up-to-date equivalents in the language of your choice. "Design Patterns in Ruby" and "Eloquent Ruby", both by Russ Olsen, stand out for me.
Ruby Koans, and then implementing a bunch of common sorting algorithms have kept me keen to keep learning the more theoretical side of stuff. I've had a little more time on my hands recently, so I've divided into open-source software - I'm currently trying to help out with Resque 2.0 (pull request coming soon, I promise!).
I've recently played around with Clojure and Go, but I'm struggling to get into them without a practical project to spur me on.
I'd say I'm now competent enough to have a good shot at getting most Ruby-based development jobs out there, if that was a path I wanted to take. And it only took 14 years!
It started with a book named "Basic para niños" (BASIC for Kids,) which as you may guess, taught me some BASIC when I was 8 years old. Then a few years later I learnt some basic Pascal (I don't remember where from, it may have been a class in my school, when I was around 11 or 12.) Then I taught me some assembler from a book (around 15) and Visual Basic (and Visual Basic for Applications) around that time, too. I didn't learn anything new until 17 when I started with Lisp and a little later, Python. Then in my university I was taught C (which I complemented by reading TFM, i.e. the K&R book.) After that I've learnt on my own many more languages, up to a certain fluency. The list of things I can at least write a "hello world" (actually if I have learnt it I can write something larger once I get back into the language structure, because every language I learn is for "something") includes Basic, Pascal (well, actually I don't remember much about Pascal,) C, Lisp (that's Common Lisp mainly, and quite a lot of Emacs Lisp... I can write Scheme, but somehow I never got really into the deeper parts of it that make it "Scheme",) Prolog, Forth, Go, Javascript (that's for the browser and for node.js,) Awk, Bash (heh,) Java (ugh,), octave/Matlab, R, PHP and probably 1 or 2 more I'm forgetting right now. I'm currently writing quite a lot of Go, trying to find some use for J to learn it (it's fg crazy!)
2) When did you start learning (perhaps informative because of the recent rise of MOOCs)?
When I was 7-8, that's (whoah) 23 years ago, in 1990-91, before I even had a computer at home.
3) At what point (if yet) did you start working as a programmer professionally relative to your initial efforts?
I'm not sure when the correct timing is. When I was working as a researcher I wrote quite a lot of code as part of my work, and now even if I write a lot of code for work, my main work is not being a programmer. It took a long time, of course, because I started early and didn't start to do real work until right after college.