Important Skills Self-taught Programmers Might Need

Hello there. Thank you for stopping by. Many people today are self-taught programmers in the software industry and that is quite commendable. Some however,  still view the idea of a college education rewarding in the computer science field in particular while some don’t agree. The fact is, going to college doesn’t guarantee you the skills you need to succeed just as being self-taught doesn’t.

self taught programmers skills Important Skills Self taught Programmers Might Need

 Top 5 Skills You Should Have

I will go right to the point here. If you feel this list is too short, please add more ideas using the comments section. Thank you in advance.

  1. Programming Languages – You are probably thinking, what? On a serious note, there are thousands of programming languages out there. Reading a ton of “programming languages for dummies” might not help very much. Often people get caught up in a bubble trying to learn how to program in a given language and missing the important details like: lexing, parsing, optimization, type safety, scope, type systems among others. If you are interested in finding more information, Udacity offers a course on Programming Languages – highly recommended.
  2. Algorithms and Data Structures – Concepts like Sorting, Recursive Algorithms, Language Structures and Compilers, Dynamic Information Structures among others are very important. Understanding Data Structures helps in designing efficient Algorithms. Examples of Data Structures include: Arrays, records, hash or map, union, tagged union, sets, object among others. For a great course on the same, please try University of New South Wales’ course which is totally free.
  3. Systems Architecture – Many self-taught programmers forget(mostly because they don’t realize how important it is) to focus on systems architecture. The fact is, knowing the parts of a computer and how they work together(interactions) is highly important to say the least. Think of the physics of implementation behind the system. If you feel rusty on this topic, please use your favorite search engine to find some great resources online.
  4. Operating Systems – Understanding the kernel and how it abstracts the hardware into useful services. POSIX – knowing how it relates to the Standard Libraries of a given language like Java or Python (your favorite language for that matter). Hardware functions like IO and memory allocation depends on the operating system to act as an intermediary between the programs and the computer hardware. There are thousands of resources on this online.
  5. Compilers – One interesting thing about compilers is that you can actually write code without knowing much about them. That doesn’t mean you shouldn’t learn how compilers really work. Writing your own compiler is probably the best way to go if you are truly interested in knowing what goes on behind the scenes. Again, there are unlimited resources out there. Just do a simple search online.

You can read my other very popular article on software training comparison Lynda vs Pluralsight

I know for sure that I could be wrong and that is why I always like to state clearly that these are my personal opinions. In fact, someone else might argue that self-taught programmers are better than those who spent 4 to 5 years in school learning the craft.

Either way, this topic is subject to an endless debate. The list could have been longer or even shorter. Communication is equally important a skill. No matter how skilled you are, being unable to communicate clearly puts you at a disadvantage.

One guy once said this:

Universities teach the science, self-taught programmers learn the art

Whether he is right or wrong is up to your judgement really. I believe that there is nothing that cannot be learned. Just having the enthusiasm to crack open a book and learn something totally new and sometimes scary is all it takes to do something.

Thanks for stopping by. If you have any ideas that you would like to add to this post, please let me know through the comments and I will be more than happy to share. If you liked my post, please share it using the buttons below. See you soon.

147 thoughts on “Important Skills Self-taught Programmers Might Need

  1. A formal curriculum covers most of the basics you need where self taught tends to discover those fundamentals by running into them head-first.
    Great list, I don’t think I have anything bullet points to add.
    I tend to just apply the same abstract mental model that I apply to the system as I do to code as to any other part. A swap file is just like a Pooled Database Connection, a kernal is just a Mediator Pattern type of thing. A compilier is just doing an extreme foldLeft from text to bytes…
    Then I do a LOT of reading ;)

  2. Very good paper…
    For the add:
    – Understand the big difference between semantic and syntax !
    – Ego ! let your ego away when you need to solve a problem.
    – Before search… and after ask.

    Tchuss from switzerland !

    • Hi there pirateboxge!

      Just a quick note about your first point. Literally a few hours ago I came across a great explanation in a paper by Strachey – “Fundamental concepts in programming languages” of the difference between the two:

      “(…) think of the semantics as being what we want to say and the syntax as how we have to say it.”

  3. I was going to suggest you add “time management”, “making money” and “innovation” to your list, but as an open source developer I’ve only managed the third item, and even that’s a matter of debate.
    The (open source) software industry can become as entrenched and centimental as any fashion industry – don’t assume that because something is common practice, it’s the best way.

  4. Heavens forbid , use vb.net and vba and don’t concern myself to much with many of the above issues. Must not be a programmer ?

    • I wouldn’t go as far as to say you’re not a programmer. It’s just that the tools you used to teach yourself programming obfuscate a lot of stuff which might have made you a great programmer.

      I’m not fully in agreement with the article. You need not have done a university course to have learned those concepts. To the contrary, I’ve found that learning those concepts on your own means you understand them instead of knowing what they’re called: E.g. ask a UV graduate to list the aspects of object orientation, and they can say it like a rhyme (like school children used to learn multiplication tables). But ask them to explain something like poly-morphism, and you get a blank stare from most.

      I’ve originally taught myself how to program. Only then did a CS degree and “learned” those concepts officially. But even after my degree, I still find that I learn much more than varsity every did for me, by simply doing it myself, failing, finding out why and how to fix it.

      Where your route is not a good way, is when you stick to one language / group of languages. DotNet is a culprit in many new “programmers” not understanding the concepts behind what they’re doing. Most of those concepts are hidden behind libraries. So instead of knowing what’s going on in order to actually choose the best way (optimize and/or simplify) they tend to just use the tools already implemented – more often than not choosing one over another through ease of use and or familiarity. E.g. rather than leaning what the difference between a list / array / linked list / double linked list / etc. are (benefits vs possible problems), they tend to use one which they’re familiar with in all scenarios.

      In your case I’m sure you used a lot of dynamic arrays in VBA. Do you know how inefficient it is if those arrays grow / shrink every now and then? On the other hand a Linked List in DotNet is not the most efficient if you’re going to reference random items in that list.

      I’d advise anyone wanting to learn programming by themselves to at least learn it through 2 widely divergent languages so they can pick up the various concepts much more easily. E.g. learn something like C (or even Asembly if you really want to know what’s going on), or if you hate C’s syntax (as I do) by all means go for something in the same line (say Pascal). Actually I’d say you’d get more out of Pascal for it’s wider concepts (especially OO), only C’s got more bare-metal ideas of memory management and weak lexical typing (not by much though). But also look at more high level languages (my favourite is Lisp, but F# / Python / etc. is also quite good for this, even VB can teach you some stuff), from these you should get OO, functional, strong and dynamic typing.

      The point the article is trying to make regarding languages is not that you should become fluent in a great many. One or two is more than sufficient to accomplish nearly any task. But what more languages bring to the table is teaching you the concepts behind programming. A “true” programmer would be comfortable trying his hand at a new language which he’s only now seen for the first time – taking no more than a week to get it to a point where he can at least get something worth while working (preferably within a day or two).

      Once you’ve got the concepts licked, any new language only requires a decent searchable documentation to get you up and running. So you can find the wording, punctuation, syntax and order to make that language do what you want it to.

      The issue with only learning one language is that many languages focus on only a portion of concepts. E.g. trying to program in Java without any knowledge of object orientation is going to be like wading through a bog. Or running through an array using an index variable in a functional language (like F#) is just plain silly in comparison to mapping a function onto each item in a list.

      • Great reply, Irne. I fall into your category although I didn’t have the money for the CS degree. I learned 8086 Assembler first, then C (which is my favorite) and then web langs such as Perl (which I also love), a little Javascript. But I only worked in the field for a short time so I wasn’t able to move on to C++, .NET etc.

  5. I already was a self taught programmer when I went to university and I can honestly say that I didn’t learn anything new. It all depends on how you teach yourself. By using the same material used in universities I believe one can definitely become equally equipped. But self study isn’t for everyone.

  6. Nice article

    I guess things are a little more bizarre around here though, as I’m self-taught and know these things (because I chose to learn about them in my own time rather than when I ran into them), but many people around here who went to university and have degrees know very little about this stuff.

    Personally, my biggest issue with most programmers I deal with (we work mostly in C#) is that they don’t have an appreciation of memory and just assume that because the language is garbage collected that they don’t have to think about it. But these are a mixture of experienced and novice, educated and self-taught.

    Certainly from my own experience I would probably expand the title from “self-taught” to “novice”.

    All great points though :)

    • I’d say: “While you learn.” I’ve been at it for 25 years and still I’m learning. What I’ve noticed is my later programs become less verbose yet more readable and efficient. Looking back at old code I wrote, I’m actually ashamed of it – thinking: “What a novice I was 10 years ago!”

  7. Completely agree with your list of skills with one exception: Compiler!
    Why on earth a software developer should know how to write a complier? Unless you are on the cutting edge of code optimization or really need to write one because you have been told to? In my almost 20 years in IT, I never had to write my own compiler to understand what it function is. Add one skill which every developer should have and which is more important: Critical thinking.
    Otherwise you’ll end in a miserable life as code monkey programming compilers:-)

    • I’m with you on this. The great majority of programmers will never look at the compiler in any earnest, never mind making their own.

      But ;) … it would help to know what the compiler is doing. E.g. is it performing tail call optimization? If so I can use recursion without worrying too much. Or is it optimizing switch/case statements better than nested ifs for non-ordinal comparisons?

  8. I’m a self-taught programmer, and whilst I use the skills I’ve picked up for work, it’s by no means the main part of my job. But it’s probably the part I like best (along with designing and managing databases).

    I’ve often thought “I wonder what a formally-educated, professional programmer would make of my code.” I feel like, after years of learning and several completed projects, that my code is actually quite good, but there are times when I’m acutely aware that I don’t fully understand the fundamentals that underpin what I’m doing. I know HOW to make it work, but I don’t always know WHY it works.

  9. Those skills are important up to a point.
    Most devs won’t write a parsers or compilers, won’t develop any new algorithms for sorting, and most will be just users of ready made libraries or frameworks in one way or another in their professional life.
    Most CS devs usually lack a lot of domain knowledge from the start and focus too much on the internals of a language or CS aspects that are irrelevant for solving a problem.
    I do remember lots of pointless discussions about type sizes that went on and on, and just lead to artificial constrains on the system that prevented us from solving the real problem quickly.
    Knowing all those things is important if you can use it effectively and within the context of the problems we need to solve.

  10. What about Relational Databases – table relationships, indexing, stored procedures .. The difference between Multi-process and Multi-threaded programming, Basic security as it applies to development (preventing sql injection, get vs. post, etc).

    There isn’t a substitute for formal education. There are some very smart people without comp-sci related degrees, but they haven’t been exposed to a lot of the concepts that a formal education provides.

    I think software development as well as other positions in IT should require a license to practice. Dr’s, Lawyers, EE’s, CPA’s and even Certified Personal Trainers are required to prove a level of competency before being allowed to practice. In IT we have access to all kinds of private and corporate data. The ability of poor development to expose it publically should require a level of tested competence.

    Anyone who is a decent developer has seen horror stories when called to review legacy code. Companies have spent thousands and sometimes hundreds of thousands of dollars on code that either doesn’t scale, doesn’t check errors, or is simply duct-taped together by armatures.

    • If you jump head-first into SQL development eventually you will want to use dynamic SQL because it’ s very handy. The knowledge of SQL-injection comes after the first wtf moment. Self fought, ever remembered..

    • The problem with your statement is SD isn’t as wide reaching as the jobs of Dr’s, lawyers, CPA’s are. I write you a program, it either works or it doesn’t. If it doesn’t, I don’t get paid. However, a doctor, or lawyer, or CPA failing to do their work properly has more than just monetary implications. The failure to properly do something in these fields can have seriously life altering effects for the client, software development, doesn’t. If a company wants to instill their own quality control, by all means, stop hiring people that aren’t certified. But a federal mandate? WTF are you smoking? If you don’t like maintaining other people’s code, software development is not the career for you. Just like a mechanic fixing a car, it comes with the territory.

    • “There isn’t a substitute for formal education.”

      There is nothing a comp sci professor will teach you in a bachelors comp sci program that you cannot learn from a book on your own. Books == replacement for formal education. It’s funny, you talk about maintaing legacy code but when have you ever heard of a university teaching something useful like dealing with legacy code? It’s not part of the curriculum. You’re simply wrong on this matter. Programming can be self taught. Have you read Knuth’s The Art of Computer Programming? Have you read about compilers in the dragon book? I have and it wasn’t in a university setting.

  11. Seriously, what a snobish rant! I was coding when most of these “college educated” people were in diapers. What I don’t know? I wrote structured and well designed code long before terms like OOP became a biz word. My apps were turned inside out and reduced in size to one-third the size of “normal” code. I wrote my own bullet proof source code generator because everything else generated too much waste/complex code. I did go back to college, but I only learned 4 thing the entire time I was there – most of which, college was a complete waste of time and money. But the difference may be simply stated “I was born a programmer”, it’s in the way I think.

    • Could that be called: anal? lol. With you, bro. Old school all the way. ;) There is no substitute for small, fast, efficient code. If I could I’d write everything in Assembler. NOT!

  12. I think there are far more “self-taught” programmers out there then we “professional programmers” realize. Because of the technology demands of modern business, I think a lot of non-programmer types find themselves in a position where they have to solve programming problems.

    For example, I have a friend who is a librarian, but their IT guy quit and suddenly he is the one having to update the website. So he’s emailing me, and I’m sending him links to tutorials. And his primary purpose is to just get enough information to get by. He didn’t even really know where to start asking questions.

    I think the 5 points you mentioned largely define the core foundation of software programming. The college education granted us the benefit of a bottom-up, incremental learning approach, whereas I think most self-taught programmers come at it from the top-down approach of learning what they need to know for the task at hand.

    Great post :)

    • That isn’t necessarily true. If a person truly loves the craft, they will learn it down to each individual bit, as I did. If they are just making a ‘career change’ you you are probably right. I wish that ONLY those who truly love to program and have a desire to do it right would write them as I am seriously sick of software that I (for whatever reason) have to use in my day to day life that is slow and kludgy simply because the developer was too lazy.

  13. very interested article indeed.

    i cant say that i agree or disagree, i am kind of both and self learned and teached at the same time.

    the only part i would “chalange” is about compilers, etc. sure and knowing how it ticks you know how to make your work better, when every kilobyte may count, but if you are a self trained programmer, that for x, z reasons didnt afford to study in a university with other peoples money getting drunk for 3-4 years, and you teached your self from passion and need….

    well that means that you dont have the time to spend in learning stuff that may not come inhandy in your everyday work, because the time spend there you may need it to spend it to make some money to live you and your family!

    defently we have to keep our self in a constant “learning curve” but your mind ca not be relaxed and free to learn all those “behind the scene things” when you have to finish the stupid erp to get the money for this month!

    thats why we programmers are sleeping maybe even less than the barmen! we try to combine everyday work, and at the same time constand R&D!

    thats hard! and thats why been a “paid” student is something young kids should apreciate, because it offers you freedome to learn your self MANY things in those years!

    and no, you dont have to just study 4 years!

    thats also why i like older people going back to universities and sucking everybit on information thay can get, and they trully apreciate this chance that they are been given!

    i am sure all of us if we go back few years and “study” again even in highschool, but with todays expereances, we would have been more “wise” and less wast. sure we must leave our age, but must of the students, over do it with bs.

  14. I have found that all programmers need these skills, and that colleges do not always provide them all either. When I see some of the codes constructed, or the claims that some authors make, mostly university ones as they get the publishing, not the self taught ones, the claims are often in error on some points.

    I am self taught, and by the way, computers, programming, and the entire environment would not exist without the self taught. The course books, the knowledge that the professors claim all come from the pioneers who are by definition self taught.

    Put on your thinking cap.

    Explore new lands, develop your own self taught skills and let the next generation stand on your shoulders.

  15. I’m not sure what your list has to do with self-taught programmers. As a mechanical engineer that became a programmer I’m largely self-taught although I do have class time for languages from COBOL to Advanced Java.
    It seems to me your list applies to all programmers.
    The list is good though and I agree with all of it.

  16. I’d add that understanding the problem is more important than understanding the solution.

    Might sound like nonsense, but after 30+ years in software development I’ve come to the conclusion that the difference between the good and the great boils down to just that. What one needs most is a throrough understanding of what your code is meant to achieve (in the real world) and how it will be used.

    Anything else you can just pick up along the way.

    • Couldn’t agree more! I find that it’s even more important to know the industry in which the program is supposed to be used. More often than not simply flinging “professional programmers” at something produces irrelevant programs unless they also have some experience of what’s actually needed from the user’s standpoint.

      This you never get from a university degree in CS. Unless it is to write something like a lecture scheduling system. Can’t remember how many of the CS exercises were based on what a lecturer would use in their daily tasks. But I can’t fault the curriculums for that, it’s what the lecturers know. And that’s exactly my point: If you’re going to write something which a structural engineer is going to use, then a programmer who’s only written financial apps for a bank is of near irrelevance.

  17. Having been a self taught programmer (from the 1970s). I have to say that your assertions may not be correct. I believe that any programmer worth their salt would study all these things in detail.

    Donald Knuth’s “The Art of Computer Programming”, Aho and Ullman’s Principles of Compiler Design, and many other important books are read, understood, and referred to, whether in an academic context or not.

    I personally have found that self taught programmers typically have a passion for programming that is absent in so many people who entered computer science because they heard they could make a decent wage.

    Just wanted to present the opposing viewpoint.

  18. Your title “Skills that self-taught computer programmers lack” is not only offensive, but just plain ignorant.

    Clearly you know nothing about coding, and are merely a tool for college tuition. College teaches theory, and nothing more. I have been coding for over 24 years with 10 coding languages and 5 db languages under my belt and am self taught.

    Next time, think about your title before you post.

  19. Being a self-taught professional programmer for 30+ years, I got all the stuff you mentioned…Some are more important than others.
    The main thing I would add is ‘Process’. A professional programmer has to be aware of what his development/programming/operational process is- and try to improve it on a regular basis. Knowing what a ‘waterfall’ is and what ‘agile’ really means should make you reflect on what you are doing to see if the latest, sexiest development process can help you.

  20. Are you trying to justify to yourself all them money you spent on school ;-)

    On a serious note. I am mostly a self taught programmer. But I learned everyone of these things on my own. Later I went back to school and earned my degree. I can’t speak for all schools but the public university I attended did a very poor job of teaching most of these (with a few outstanding exceptions.) Further most people I have worked with over the years do not get these things some have graduated with advanced degrees from well know public and private universities.
    The people who yearn to excel will learn these things whether they go to university or are self taught.

  21. Well, my experience is rather the opposite. It seems that “studied” programmers know squat about all this anymore.
    All you get these days is:
    -Operating system? We are using web browsers now, we don’t need to know anything about no stinking operating system!
    – Algorithms? We got an object for that. Or if that doesn’t solve the problem, we use a different framework…
    – system architecture? I already told you, we are using web browsers and the cloud….
    – Compiler? That’s so old school…

    seriously, what you describe is rather what seems to be breed at today’s universities/colleges…

    B, old school and proud of it ;-)

    • Agreed. Having a degree doesn’t mean understanding the areas mentioned in the blog post. I’ve met very many CS degreed grads that just don’t know about compilers, OSes, etc. MIssing the very knowledge that would make them MUCH more competitive in the market.

      I’m self taught, but chased all the areas mentioned in the blog post because I knew the foundation would assist me in my career.

      After 30 years, a 6 year stint as an architect at Oracle, and continued technical work at an architect level, I can tell you that for me it was fundamental in getting to my current career level.

      At the time I studied up on this stuff, it was in my spare time (in my late 20s), and a huge time sacrifice… but I’m SOOO glad I did it.

  22. I think you need to distinguish between a self taught developer that makes one off programs to do a specific task and one that is self taught developer that competes with professional developers. Sort of like a professional cabinet maker versus a hobby woodworker. I am a self-taught developer of the first kind and can say that although I’ve heard of the concepts you mention, I seriously doubt having some of those skills will improve my product. Deep knowledge of compilers and kernels are things that many applications just don’t need. There are times when these things are important, but they are in arena’s where self taught developers probably shouldn’t be competing.
    I have written several small simple applications that primarily take information from text files and repackage the information for use by other applications. These work fine and have been adopted as tools in our organization. They are not the type of things that a professional developer would want to waste their time with.
    Clearly, one of the “skills” I feel that I have is to know when I am in over my head. To continue the woodworking analogy, building a shed is one thing, building a house is a whole other story.

  23. There are two sides to this as well. I’m partially self taught and partially went to school for computer science. I’ve taken some programming courses, system analysis and design, interface design, and computer architechture. I agree that self taught people do sometimes miss out on some of your bullet points as I would have missed out on most of them had I not watched MIT’s courses via iTunes Universatiy, haha. Because I’m mostly self-taught the flip side is that I’m always questioning whether I’m doing things the best way. I’m affraid that many people who have a degree assume that they’re doing things correctly because that’s what they were taught in school. However, between having experience in school and listening to many panels of teachers online (such as those from Intel) I know that many universaties have missed some programming skills that I have come to find very useful.

    Two of the glarringly good skills to have that are rarely taught in school are Parallel Programming and Test Driven Development.

    Both of these skills change the way you write code and while TDD may be debateable, parallel programming is not. It’s the reason why CPUs have been stuck at 4 cores for the last 7 years. It’s not because we are technically limitted to four cores, but because programmers aren’t being taught parallel programming skills in school, and thus, even if we went to 8, 16, 32+ cores the cores would rarely be used because the programs written don’t take advantage of them. And because it isn’t important to the school to teach their students these skills, I’m affraid that the mentality becomes “it must not be important”.

    Of course, I may be wrong, this is just my observation.

  24. Well then. I take it that you want to Universitarian Educational Institutionairy Brainwashing Facility?
    I take it you built yourself a fridge before you tried using one? That you know how to build cars (you even built one, just so you knew how to drive one!)

    There’s a problem with your “need to know”. Knowing something takes time. Time is scarce and becomes scarcer every day. The heat is on to build that site TODAY, or someone else will be where you wanted to be. We live in a world where it is no longer necessary for a programmer to understand how something works. That’s important, because those who insist they need to know everything will put themselves at a disadvantage. While they study intricacies, their competitors and colleagues have got the same job DONE and SHIPPED and they don’t know why it works, but they know THAT is works.
    Understanding your stuff puts you at an advantage, but spending time and effort on it is dangerous. It is important to weigh the value of every page you read and every test project you create. There’s a time pressure which prevents these forays from being a good idea.
    Also note that in school you’re taught (today, anyway) that code reuse is important. When you compile using a compile some other Joe Shmo wrote, one you have no clue about how it works, then you’re just reusing code. Note that reusing your own code doesn’t mean you understand that code. You wrote it 2 years ago with the explicit purpose of you never having to think about it again. It works, and that’s all we need to know. Knowing less makes room for knowing what we need to know now. Less clutter=more precision, less general/global understanding=less weight, more focus.

    So not being educated may put you at a huge advantage. Maybe you’re more likely to grab a script from the web rather than write one, with the result that it’s 10x faster. The fact that it’s usually also buggier is irrelevant. It matters not how good a job you do, it matters only if someone cares about it. If your customer doesn’t notice fix X then fix X was a waste of time, effort and ultimately money. Lean=king, and it requires a kind of taking advantage of the situation. Cutting corners is smart and helps you win the race.

    Educationless hacks (not hackers), script kiddies, etc, you should know, make lots of cash these days. Time pressure and human shortages allow them to NOT waste 10 years in a stuffy classroom and go directly to making 100k+.

    In other words, the stuff you say is not true, or useful. Saying we need to know how to parse stuff is bogus nonsense with no use. No one cares. You don’t know how your car works and you’re fine with it. Lots of engineers have no clue how their car works. It’s not their field and they just don’t need to know, so knowing it would be clutter, dead weight. No one cares how a computer works. The power is that you can buy one at the Walmart and just plug it in and turn it on. Having to build one was cute 30 years ago, but it isn’t anymore. Building your own PC makes you slow. Understanding it has a similar effect. Don’t be a Dino as they grow extinct.

    • Life is about choices. The post on this blog is about sacrificing some of your own precious time for skills which improve:

      your productivity
      how you are perceived by other programmers and managment
      the scale of issues you can solve.

      From your post, I’m guessing you are young.. so its easy to not see the forest for the trees. But the areas suggested in the blog post are nice to haves for a script kiddie, but absolutely required if you want to get past individual programmer and be a fundamental contributor on a large team (or operate as an architect). At that level, those skills are table-stakes. You don’t have em? You don’t get a seat at the table.

      Your choices are your own.. but understand that those choices have a serious effect on the future, one way or the other.

      • You are one of the many guys that give me a reason to learn more and explore further. Thanks for the encouraging words Richard. I read other mean comments and I smile at myself thinking, am I that wrong? At least some people agree that these, despite not being the best parts, do matter. Thanks and see you soon.

      • Well, I’m not sure how young 35 is in this profession. I am also a Chief Software Architect, so I should know a thing or 2. I had some IT schooling, yes, and maybe database normalization was helpful, but very little of the stuffy stuff makes it into the real world.

        I of course know that knowing your stuff makes for a better programmer. I know my stuff.

        Sacrificing time to learn how to make a compiler seems to me to be a complete waste of time (especially considering the very low payoff and the very high time investment).

        It’d be better to spend the free time on making some iPhone games and making some cash on the side, while learning AND having fun (which I think is very important especially when you’re doing this on your own time/dime).

        In short, over the years, I’ve found that agility has a lot to do with a willingness to connect to others and use their resources (resource pooling, so to say). Building everything in-house may keep control in-house, but also makes for a slow business. Understanding something too deep these days may also be somewhat wasted, since tomorrow we’ll be moving on the next thing.

        I’m working on my own software as well, and since it has taken me several years to build it, the web has now matured to where I can run it in the browser. That is very cool, but required me to redo a lot of my code. The point here is that shifting goals make spending time on any one thing a bad idea. Agility is the big money maker these days. Anyone can build a website. It’s more important that you’re there first, rather than be the best (which doesn’t mean it’s okay to suck).

        On a sidenote, I strongly believe that excellence is rewarded and personal excellence should be a goal for anyone in any area. I didn’t get to where I am by sitting on my hands, but it certainly wasn’t because I had such a great education either.

        Anyway, understanding the kernel is boring. It is vital you understand how memory mapped files work, but only on a functional level, not implementation. No one cares how MS made Windows or Linus mad Linux. It’s not relevant and a distraction. Unless you want to be an OS developer, of course.

        • I agree to a point. It depends on what you’re after. You definitely don’t need to be able to build your own compiler in order to write an HTML5 app now do you?

          But knowing what the JIT compiler is going to do to your code, might just alter some of your algorithms so it’s more efficient and/or robust, or even cause you to go down a route which is less cumbersome and/or time wasting. You need not know how it does it, just that it does that!

          On the other hand, some of the concepts of programming itself is a very good to have, up to near impossible to be without. I’d say you need to at least understand the principles behind stuff like the major data structures – at least so you can choose which suits your scenario best. Just so you can choose from a library by making an informed decision instead of simply rolling a dice.

          Same as the car analogy: You don’t need to know that pressing the brake pedal pumps hydraulic fluid to the calipers which pushes the pads onto the disc which retards the wheel from turning, all you need to know is that pressing the brake slows the car. But not knowing that means you can’t stop the car – since you’re just sitting there speeding into the back of the truck, not knowing what to do.

          I’m also in agreement that you should not waste your time at studying for 10 years before earning a salary. Very few can or want to do such. In any case I find learning as you go actually teaches you more than going through reams of artificial exercises.

          But from you OP, the point where you go to far is to say you can simply disregard all of it. It sounds like you’re advocating “just winging it”. And from your 2nd post you’re showing that you’ve not done so yourself: “I had some It schooling” Are you sure you never use anything you might have picked up from that? Not even just that you know what to call some stuff in order to look it up?

          I started working while still in secondary school. Which is also when I started programming for myself. Only after working several years did I do a CS degree part time for 5 years, while also working in order to pay for it myself (no bursaries or sponging of others, or even loans). And yes, my degree does not count as much as my experience does when it comes to finding higher paying jobs.

          I did it for myself, because I’ve got a passion for it. If I only used programming for financial benefit I’d say the degree is useless in the extreme. But I found that I learned some stuff quicker than trying to figure out those things on my own. I might have learned it through self study, if I ever came across a scenario where I needed it – but the degree opened me up to things I didn’t think of before. So it caused me to want to learn of those on my own and thus also pointed me at other concepts not even in the degree’s curriculum. Which means I’ve increased the level of my passion through less work/time in the end.

          Do I use all of it every day? Definitely no! Does it help me in my job? Sometimes. Does it help me in my “hobby” (which is also programming) … all the time! Because my hobby is to push the limits of what I can achieve, my job is to grind through something which sells.

          If it wasn’t for the fact that I love programming, my job would have caused me to go for a different industry long ago! Money only gives you so much. A job only focusing on what sells is extremely boring to me.

      • After reading several responses to this article, this one I agree with the most. Especially how awareness of the skills listed are directly proportional to the scale of the problems one can solve in many different environments – not just the software one learned on.

        Knowledge of programming languages, data structures, operating systems and bindings allows for more tools in the toolbox.

  25. Excellent post.. I am self-taught (first job in 1983) and didn’t have a CS degree, so I got all the books for the areas you discuss above and in 5 years time of self-study at night taught myself what I needed to know. I realized that without that foundation I’d always be short.. and I figured it out by getting a CS course listing from the university near me.. really simple to tell what needed to be know..

    To this day, most real messes I’ve seen in programming have been related to a lack of knowledge in one of the areas you mention, which is just empircal proof that supports what you think. So keep fighting the good fight and stick by this.. it completely correct!

    • Richard is 100% correct. I am also self taught. I started programming professionally (that is for money) in 1993.
      Though there is a lot to be said about people who are self taught. There is a lot of things people coming out of college are lacking. The number one thing is the ability to asses their value. I keep meeting programmers who are doing 2 or 3 peoples jobs for pennies on the dollar and they are scared to find new employment to increase their paycheck as they increase their knowledge.
      I change Jobs every 2 years with the exception of a 5 year bid I did with A GIS Software Developement Firm called ESRI which took me to a whole other level as a developer and as a person.
      But regardless, I’ve never been one to put my life in the hands of any corporations promises and a 3% increase each year doesn’t match my passion for learning new programming design patterns.
      So my advise to college grads is to get your money and work hard, don’t live to suck off the corporate tities.

  26. @Francois – Go away, TROLL!!!
    @Elisha – Think about this. I am self-taught, but I taught myself languages and whatnot many years ago when the pickings were slim. Now most of the “new” stuff is built using the stuff I learned all those years ago. Does that not give me an edge? I used to tell people that I could rewrite Windows from scratch, and the whole thing would fit on a floppy disk and run 100X faster than the current versions do. Of course that’s an exaggeration, but you get where I’m going with this I hope.

    • I totally understand your view on this and appreciate the decency in your comment. Some comments here just shock the hell out of me. As if I was doing this to bash others. I am just trying to help those who are starting out.

      • Oh those are great points you make. Whether you learn them yourself or you get formally educated, you’re gonna struggle if you don’t have at least those few things. Or at the least, you’ll be oblivious to what your programs are “actually” doing underneath it all.

  27. I was coding in my job before universities taught CS as a discipline, so I don’t feel too inadequate in not having a CS degree. in scientific research, coding was just a tool to get the job done. the software we used on our VAXen and Suns was usually driven by an api or a scripting language and everybody used LaTeX to create their documents and gle to draw their graphs.

    I’ve met some expert programmers with CS backgrounds and some without, and I’ve also met some clueless ones from each category. I think it’s a mistake to over formalize the skill set required to be an effective programmer, because very diverse skills can be useful or crucial in different domains.

    your list is filled with knowledge that often preoccupies CS students but is seldom required for routine programming tasks. all the same, I agree, it’s important to know this stuff, because it underlies everything we do. even when data structures are selected from a library, there needs to be some understanding of why one and not the other.

    but I’d dispute that self taught programmers typically lack this knowledge or that college educated ones always have it at their fingertips. there’s an element of snobbery among CS graduates that fails to recognize the very rigorous environments in which many ‘self taught’ coders have developed their skills, or the sheer volume of information that can be assimilated over a 20 year career compared with a 2 or 3 year degree.

    • Awesome! Exactly correct from my own experience too! It’s much less to do with formal training or not, and much more about the person themselves.

      Some people just shouldn’t be programmers, no matter how they learned to be such. If they don’t have a passion for it, they’ll always just stay mediocre at best. No degree or self-study will change the fact that such a person simply does not care.

  28. One other point contradicting the basic premise of this article: most of the new college CS graduates I come across, even up to the masters level, don’t know diddly about most of the things on your list. Ask them about compilation techniques, or compiler optimization strategies, and you’ll get a blank stare. Systems architecture — what’s that? Most don’t have a clue, beyond parallel vs serial processing. Putting together a system beyond a basic PC or server is beyond them, and they are almost totally ignorant of characteristics of different bus structures or system topologies. So while I agree that understanding these things is important to making a good programmer/software engineer vs. “a coder”, a college education in CS usually won’t give it to you. You’ve got to learn it on your own, anyway.

    • I’ve seen that more and more recently myself! Especially all these courses focusing on things like DotNet.

      It’s as if the new crop are taught how to use specific tools in a step for step basis. I.e. press this button then that light turns on. Not how do you go about figuring out a solution after understanding the problem, then choosing the best alternative because you know what they’re about. It’s always, this is how it’s done since this is what I’ve been parroted in class.

  29. Some other things that should be taught but seldom are;
    1) quality assurance
    2) metrics
    3) Configuration Management
    4) All forms of verification (Inspection, test, demonstration, analysis)
    5) basic project planning and scheduling (at least tell them what “critical path” means)

    • Point 5 always sticks in my craw! How few graduates these days have even seen a Gantt chart. Let alone understanding how to read it. Forget about how to set one up.

      In my CS degree that was actually part of my 1st year’s comp. lit. course: Project Planning! I suppose these days the universities see a “programmer” as just a code input device. A manager should project plan and give them orders like a bunch of cadets in the army being told: Don’t think, just do as you’re told when you’re told!

      The though behind this is probably that once they get to the point where they need to plan, they’ll go do a MBA to learn project planning.

      While some companies do work that way, it’s highly unlikely that all graduates will go to such organizations. And if such graduate thinks he can wing it on his own, he’s in for some nasty surprises!

  30. I think you’re making the wrong distinction here – and you even prove that with the article itself. You’re saying self-taught programmers don’t have these skills, but you proceed to explain how to learn these skills on your own.

    You’ve also inadvertently insulted a whole class of people who don’t deserve it. In my experience, self-taught programmers know the things they know much better than formally educated programmers. To be clear, I’m saying self-taught programmers are often better at their jobs that formally educated programmers. There’s a reason for that, and I think that’s the division you’re searching for with this article.

    People who learn programming on their own, and learn it well enough to get a job doing it, have PASSION. Sometimes you find that passion in formally educated people, but you almost always see it in the self-taught group. People with this passion for programming are going to learn those things you said, and learn it well – people without passion are always going to struggle with those deeper concepts, because they just don’t care. So, it’s not the self-taught programmers who lack these skills and I think you’ve made the wrong distinction there. It’s the people who lack passion, who tend not to have these skills.

    My second point is this – those skills are not really that important. You probably think they are important because you’ve been taught that they are important, or the skills have benefited you personally in some way. The things you list are things I wish more programmers could understand, but the fact is, many programmers do a very nice job without knowing any of that stuff. If a programmer can do a good job, then by definition, they have the skills they need.

    • I agree with you on most of these points. I was however trying to say that being a self-taught programmer, it is tempting to let those concepts slide off the grid. I didn’t mean that you cannot learn them. It is more like not following a curriculum hence missing out on certain things. I think anyone can learn anything and that is why I say you can do it through easily available resources.

      Thanks for your informative comment!

    • I totally agree with you.

      Except it’s not important you build a compiler. It IS important that you CAN build a compiler, of course. You should be able to build anything, after all. And when you do build a compiler, THEN (and only then) will it be time to read up on what others are doing with them. And this is with ALL programming. See how others are doing it, take the best from that and then improve it. Learn daily about everything, not 1 week about “compilers”. And may I point out that it is VERY, VERY rare for anyone to know how a computer works? Like, what’s a transistor? I know chips have ‘em. But how do they work? And how are they connected? So, yeah, you don’t have to know what an electron is, or that a computer even uses them. We use bits, bytes, mnemonics, C++, bash scripts. That’s the level we operate at, and that’s the level we need to know.

    • I am curious to know what type of programming job you have. I would like to hear more about why you think the skills are not important.

  31. Myself being a self taught developer since the mid 90s. I actually find MOST developers that are college trained have difficulties grasping concepts outside the norm. Theory discussions are limited; even debates regarding the latest trends are limited. I so often see college trained developers just sit and brute force code without thinking about the architectural/design aspect or attempt to develop a reusable engine instead of coding one off solutions.

    Oh don’t get me started on actual OLAP designs — try getting a college developer to think like a data architect is almost impossible.

    In my humball opinion; I would prefer a self taught developer with 10+ years experience over anyone with a masters degree. The ability for someone to pick up a book and master a topic is priceless.

    College isn’t preparing the market well enough!

  32. Seems like a bit of a pointless generalisation, people are different and have different abilities and skills, I don’t believe the learning process has a great deal to do with how complete your knowledge is of the aspects listed here, you either want to learn and have passion about these things, or you don’t. A university education is as likely to produce a poor programmer as much as self taught. I come from the same stand point as Greg. I have 20+ years experience now but ‘when I was a lad’, there were no courses in the sorts of programming I had taught myself in high school. I’m very jealous of the opportuties out there now, but have seen some awful programmers with so called degrees, this is I expect the same in any industry.

  33. Even though I have a bit of college under my belt some of this stuff we have not gone over yet, but now that I know what I can do to improve the skills that I learned and what I might be missing(either because I have not been taught or I am just rusty on the subject). Thanks for that great article.

  34. Well then, Elisha Chirchir, I can see a trend developing in the comments. You only reply to those who agree with you.
    And yet the ones who don’t make some good points. As in “the world doesn’t’ start or end with you”.

    • I reply to most comments. I am still reading all the comments and responding accordingly. I respect everybody’s opinions and that is why I still approve them no matter how tough to take they are. Some comments are, well, you can read them. I have read most of them really but I don’t like negative arguments as much. I still appreciate it.

  35. I’m a self taught programmer, but I read tons of books and analyzing code. I would have to say that where most programmers are lacking is in the realm of OOP concepts and design pattern. Many don’t understand how to make reusable code.

  36. I strongly disagree.

    I’m self taught and go into those topics pretty much every day.

    Believe it or not – there are tons of self taught people out there who code in ASM everyday.

    Your article title is quite offending!

    School or not though, as with most skilled trades your past works should speak louder about your skills than any piece of paper.

  37. I’m self-taught, and I learned all these things, and have written any number of compilers. This isn’t about formal learning vs. autodidacticism: it’s about having the intelligence to know that there’s always more to learn my (35 years of) experience as a programmer have shown me primarily that formally-educated orogrammers tend to be inflexible products of their teachers’ mindsets (which are out of date by definition) whereas self-educated programmers tend to be far more open to new ideas, methodologies, etc. and are thus the type I always end up hiring: not through prejuduce but because they seem to be the only ones who can comprehend what I’m talking about. Ultimately, it’s about intelligence, and you can neither teach nor learn that.

  38. There was a recent Dilbert cartoon that I think summed up the difference between self-taught and college educated. They hired a Ph.D. because he had a Ph.D. and not because of anything else. Dilbert walked him over to the elevator and the Ph.D. stared blankly at the elevator button and said, “I have to tell you, I’m stumped.”

  39. I’m also self-taught, and I know a few languages so far. I’ve often felt that I was missing some of the science that college teaches, but that’s what the Internet is good for. Any technology out there has some kind of white paper, documentation, and some times even a tutorial. (Most technology anyway)… I try to read about the same things they teach in school, hoping one day I can make a career out of this thing I love to do. Some people are born singers, or dancers, and I think some people are just born problem-solvers and coders. There are people out there with quality degrees that will never truly understand, or care about programming. They can’t operate outside of the strict set of rules and tools that their courses gave them. I feel both pity and jealousy when it comes to people like that. (I know at least one personally) …All I can do right now is just keep learning and progressing.

  40. For: #1: The hunter that hunts two preys at the same time catches none. Is more important to learn to code well on one language well than to lean to badly code on many languages. After leaning one language well, you might want to lean another, but not before.

    As of universities. All they do is to give you a map on a way in which you will lean X things. They even provide you a tour guide (teacher). Is nice to have the tour guide, but to really see a city you need to go on your own. A university might teach you how to read and write, but only you can make yourself a writer.

    If the purpose is education. Then all they need to do is to post on line the curriculum (full, not only class titles) along with a list to books to buy (which usually end up giving you the information anyway). That way people can decide if they need the tour guide or not.

    But the purpose of an university is not to educate. The purpose is as means for a human resources department to determine if a given candidate has a set of skills to do its job, without the human resources employee knowing anything about the job itself.

    An interchange of money for accreditation. Nothing more. Thats what a university is.

    • Multiple languages at one: Hunting two prey at the same time. Now that actually shows me what people think when they’re told to learn more than one language. Perhaps it’s because we (as in us who tell others to learn more than one) don’t realize that it gets understood as having to learn concurrently.

      That’s definitely NOT a good idea. Most people won’t even be able to do so at all. But to take your analogy to try and explain what’s actually meant:

      “The hunter who only knows how to hunt one single prey type will go hungry when he can’t find that particular prey.”

      Definitely learn from one language at a time! But don’t stop there.

  41. I am a self taught programmer too and was running a program (a mix of c,unix, java, Mysql etc) last night. I spent couple of hours finding why it was crashing (because of nonASCII symbols in text). It is suppose to read an abstract which has stuff like AIMS: I realized it is comfortable with text: AIMS: Diabetic.. but crashes if it is AIMS: Diabetic..Please note one inadvertent extra space in a million pages can crash your program ! How many things can be taught in a class room?

  42. The university education can quite present an organized approach to the body of knowledge that is required. It gets one exposed to this knowledge. However, the productive deployment depends on the individual’s extra quest. This means your highlighted points are very relevant.

  43. I am self-taught too, but maybe surprisingly, it is my impression that, compared to myself, some computer science graduates ostensibly *lack* some of the skills you mention (most notably 1, 3, and 5).

    Though actually it is not such a problem to be inexperienced, as long as you keep an eye on your own limitations and not get deceived by some kind of “holy thinking”. Once you stop learning, you could well become a tyrant. And that is much worse.

  44. Are you talking people that didn’t go to college for this or people went to college and taught themselves other languages?

  45. I was very impressed by this article, and translate it into Japanese. Can I make it public on the Internet? I want also Japanese self-taught programmers to read this article because there are many important things in this article.

    Thanks!

  46. I’d say you’re getting a few negative (to say the least) comments because you’re trying to show what your experience from formal training has introduced in your knowledge base. Some others have different experiences.

    Not all degrees / courses are the same quality / comprehensiveness. Also not all self taught programmers fail to grasp the more intricate concepts.

    There are 2 reasons I’d advise some formal training:
    (1) For aspiring programmers it should quickly point the way to the concepts they need to learn for themselves.
    (2) For already accomplished programmers, it should more quickly get them to understand the advanced nuances behind a specific language or paradigm.

    I.e. to me formal training “should” be a means to save time on the learning process. To become productive more quickly, if you will.

    Unfortunately society doesn’t see it that way. People are hired (to a large extent, though not always) on the letters they’re allowed to affix to their name. So degrees are a means for HR to quickly assess capabilities rather than doing some research and/or testing. It still doesn’t mean that those “programmers” are any good though. Or even that they “know it all”. It just means that they’ve gone through some years of lectures and were able to pass some exams. What those lectures and exams actually taught them is an entirely different matter.

    On the other side: self taught programmers fall somewhere between 2 extremes. Those who’ve become professional programmers through self learning and have since become gurus at their trade (you can see the pioneers of programming as these types). While all the way down the scale you get the guy who “programs” formulas into a spreadsheet. Most fall somewhere in between those extremes.

    The spreadsheet aficionado probably doesn’t even think of himself as a programmer (as most other programmers would also not), though he’s still inputting “source code” in order to tell the computer what to do with inputs and how to present results. Should he also need to know stuff like compilers and systems? Perhaps some knowledge of type structures might be useful, if only to understand why rounding errors occur and how to get around them.

    Since the later ’90s we’ve had a large batch of VBA’ers since that particular language had a unique “niche” where it was available to all and reasonably non-cryptic to allow many who’d not consider programming otherwise to get some benefit from this without formal education. Unfortunately it also caused some truly horrendous programs due to this same fact. But even those who cut their teeth on VBA are not to be dismissed, IF they had the passion to think further and evolve their knowledge and capabilities.

    Also, I’ve seen some guys sticking with C for decades because they’re SOOOOO good at it. But disregarding any other idea from anywhere else on principle. To me that’s simply not on either. Sure garbage collection’s not perfect, sure functional programming isn’t “necessary”, etc. etc. etc. But why do you “have” to limit yourself?

    The point I think you should be making with this article is to try and list some concepts which aspiring passionate programmers should try to learn. List them in order of relevance, e.g. data structures & algorithms being one of the ideas every programmer should at least know about, all the way through OOP, FP, types, scoping, memory management, etc. If they want to learn it themselves or through a formal course is up to the individual’s preference.

    Some of these concepts might be more useful for some than for others. It depends on the situation. E.g. a gaming programmer might be much more interested in the systems architecture on a GPU than someone writing addon’s for Excel. So it’s not even a linear list, rather more like a tree structure, or more correctly a neural net since lots of concepts might overlap into other branches’ interests.

    I’d see such an article as an awesome resource for any programmer. No matter at what level of the totem pole they’re placed. Even the guru might find seeing a basic concept listed as a good reminder of something he’s forgotten. And definitely the aspiring programmer can see what other concepts there are which he’d like to check up on next.

  47. Computability Theory (or realizing that you can’t compute whether any particular algorithm will finish)
    Formal systems (provably correct code)

  48. This is a great article – In my case – with no University training; after 5+ years in the software industry learning on the job and self learning I’ve managed to get a “Software Engineer” title but ALL of the things you mention in this article have been (and remain) barriers to further progress for me.
    These are all things that I’m STILL playing catchup on. If I had learned all these basics at University I’d be much further ahead by now.

  49. Some observations…

    1) There are born programmers and programmer wannabe’s. You aren’t what you wannabe. If you are a born, true programmer, you will learn what has to be learned and do that with passion — in school, at work, at home, in the train and perhaps in your sleep. So formal schooling is not a prerequisite to becoming a good programmer. Formally educated programmers, if they are true born programmers, will have respect for fellow true programmers, regardless of schooling, because he knows his fellow programmers know something he doesn’t know, but worth knowing about.

    2) The problem with being ignorant is when we don’t know that what we are. Well, this article, insulting though the title might be for non-schooled programmers, gives us a list of what the author thinks are important for programmers to know. You may or may not agree with the list, but with it, you can get a hint on what you don’t know and might want to look into. If you discover you don’t know much about something, and don’t care to dig deeper into it, that’s fine… at least you know what you don’t know, and don’t care to know. So even formally educated programmers who may not know something in the list will benefit from the list if he reads it from a proper perspective. If you think you know everything in the list… well read on…below.

    3) The computer world, programming included, is much too broad a subject that there can never be a know-all person. We need to share ideas and knowledge, and no matter how much we learn, there are still a lot more to be learned… those we know we don’t know, and those we don’t even know exist, and those concepts, devices and tools that are yet to be born.

    4) I have yet to meet a programmer who can program without resorting to further study, research and even review of previously learned concepts in order to proceed with a project at hand. If you believe you can program without further studies, you are doomed as a programmer or perhaps due for retirement.

  50. Well, it’s good to see that the title “Skills that self-taught computer programmers lack” has changed. The new title makes the article much more acceptable reading although it still targets “self-taught” as opposed to the “formally educated” programmers. There really should be no difference between these “types” if they are serious, born programmers. IMHO, the title could very simply be “Some important programming skills that need professional consideration.”

  51. I tend to find formally educated software people tend to make everything ten times more complicated than it needs to be and lack the business values to make the distinction between what is good for the software and what is good for the business. They tend to over-normalise and make code so utterly impenetrable that it takes much loinger to pick apart in times of crisis, all for saving a few kilobytes.

  52. A better title for this article would be: “CS graduate complains”. An experienced, well read, self-taught programmer with a degree in a field relevant to the application trumps a CS graduate every time.

  53. The skills you have listed are basically the 3rd & 4th year of my computer science degree.

    That’s the challenge with your post and likely the reason for the big flaming war. You have basically said that “self-taught” programmers tend to lack the type of skills taught in multi-year degree programs. The converse is probably also true: people in multi-year degree programs tend to lack experience with tools regularly used in shipping production code.

    Oh look, that’s your next post.

    I am not saying you are “wrong”, but your premise is disingenuous and a little obvious. Clearly, given enough time, people can learn the things they haven’t learned, so it really just becomes an issue of ordering.

    There are of course arguments for both sides and it’s clear that both self-taught and “university-taught” programmers are missing important tools even a couple of years into their professional careers.

    • I agree with you on this argument – both sides of the coin lack or need certain skills that college and self-taught programmers currently don’t have. Anything, bottom line, can be learned by anyone. Thanks for your input.

  54. I usually don’t comment on these, However …… I’m not so sure about the premise.

    After all, Bill Gates did pretty well for himself. (insert laughter here)

    • I saw a talk by bill gates, one of the first things he said was not to follow in his footsteps. He said go to school, don’t drop out. Technology is changing so fast, going to school and learning the fundamentals is very important.

      • Funny, this is the exact reasoning why everyone I work with tells me *not* to go back to school to get my degree. They all have Masters degrees and say that college is a waste of time and money. Technology is changing so fast that colleges can’t keep the curriculum relevant. I don’t see your point. XD

  55. While some points of the article have truth to them, it is always a two sided coin.. (BTW, I am self-taught, so a little biased).

    – You can be given a lot of useful information and concepts can be known quickly that might not otherwise be learned, but that information is spoon feed to the student which places them at risk of never looking “outside that box”. With self learned there is no box and that chaotic trial and error approach will provide more understanding in the end (isn’t the saying that “you learn more from your mistakes than successes”). The algorithms factor is probably the largest deficiency with being self-taught.

    – Someone that is self-taught is probably more “programmer inclined” since those that aren’t are more likely to give up (essentially weeding out the bad [skilled] apples early on, including the ones that are simply “good at taking tests” that might muddle their way through formal training).

    – I suppose the “Systems Architecture” could be deficient with some self-taughts.. but I [over that past 15 years or so] have instinctively always come from the “big picture” view. I have also seen many formally trained developers only do the minimal and ignore how it fits (or could be affected by) the overall architecture. The result often being very tightly coupled and fragile code.

    – The OS perspective is similar the Architecture issue, but more in favor of the self-taught. If everything had to be learned from the ground up, then wouldn’t a self-taught have to deal more with the OS to figure how how things work? In formal training, OS design could be a required course to get their degree, but that doesn’t guarantee they did anything but the minimum in that class (and then shortly after, forgot everything learned).

    – For some (formally or self taught) compilers can just be a magic box that takes their code and creates what is needed and they don’t care what/how it does it (especially in higher level languages). But, at least for the “old timer” programmers, if you were self-taught you might not have had access to a real compiler (or disassembler) when first learning and had to resort to hand coding your programs. Now a days with a free compiler and tools for nearly every programing language, this might not hold as true. Such spoiled programmer wannabe’s these days. ;)

    Of course with a significant amount of the software development being treated as “cookie cutter” lately, many of the listed skill sets would go underutilized. I mean you wouldn’t want to hurt their brains by making them actually think to do their jobs (sarcasm implied). Not that there aren’t legitimate scenarios where this is sane.. like JSP taglibs that don’t force a web designer to program, or force a programmer to do web layout, if those things are out of their skill strengths. As long as the ones writing the code and architecture behind the taglibs know what they are doing.

    I guess it all really depends on the guiding force behind why each is programming.. Is it for the money (be it just a “job” to earn a living, or expecting that 6-digit salary).. Is it because it is useful (but not a [long] carrier goal).. Do they have a hacker mentality (and are driven by the possibilities of software/technology). Each of those elements have a major impact on what kind of programmer each will be, regardless of being self or formally taught.

  56. If time could fly back, I won’t choose the Bachelor and Master study of Computer Science.

    I’d rather choose a training institution to acquire some professional courses which is much much cheaper than college education.

  57. As a self-taught programmer of over 25 years my approach has been to learn what I needed to know for the task at hand – but I agree with everyone else who has mentioned the important prerequisite – passion.
    The passion for programming has brought me through numerous languages and over many platforms. Some of the things mentioned in the article and comments are still black arts to me. They’ll probably remain that way until I have need of them.
    I think regardless of your approach to the industry, whether formal or self-taught, success can only be measured by the attainment or otherwise of your own goals.

  58. Good article, although I’m not sure it relates to all aspects of programming ie web and SQL development. My former supervisor said he couldn’t hire any computer science students for an ASP.NET position because none of the applicants knew how to write simple SQL queries and could only define what “SQL” meant.

    We also need to think in terms of context – why do we want to be better programmers and developers? Better jobs, happier lives. I can see some value to having these five skills, but the only question I’ve been asked in an interview that was even close was a question about scope in the context of jQuery functions.

    I completely agree with your point about communication skills. I’ve honestly been offered a position using a technology with which I have zero skills simply because I “wow’d” them with my comm ability, and being self taught they knew I’d be able to figure it out.

  59. This article is assumptious and pretentious. I spent 8 years teaching my self software development and learned every concept you listed before I got my first development job at 22. The fact is, people who teach themselves software development are more likely to be passionate about their craft than the average developer that comes out of a University. We hired a developer with a prestigious 4 year Comp Sci degree, and a lot of prior development experience earlier this year…. he lasted 4 months and was terrible at every concept you listed.

    I just don’t understand why you would assume A) that self taught programmers don’t read software development books on advanced topics (because… we do.) B) that every comp sci curriculum in the world covers the topics you list and C) that all comp sci students pay attention in their classes.

    You should scrap the article and just write it as a list of concepts every software developer should know because, again, I’ve ran into comp sci grads that don’t understand these concepts. Don’t assume you’re more educated by having a degree.

      • It’s your work, do what you want with it. It’ll drive traffic to your site; it’s just not the type of traffic you want. I don’t know why you think this sort of article would be good to attach your name to when you work in a field where so many leading roles are held by self taught developers. I hope your next applied positon isn’t looked over by a self taught CTO.

        You can say you’re not looking down on self taught developers but the fact is you wrote this article singling them out to tell them what they “don’t know.”

  60. I read many of the comments here and could find that the previous title was “Skills that self-taught computer programmers lack.” It is not true that every self-taught programmer lacks fundamentals. I am a self-taught one, who first learned VB6, but seeing the abstraction it involved, learned C, C++, and MASM as well as HLA (high level assembly) later in an effort to understand the system architecture. Now, I write my code in .NET, but I am always worried about my objects and am keen to dispose them of when unused, rather than depending on the GC. I agree that many new programmers are not worried about this aspect at all because they have never starved on memory while they were brought up. People who have starved knows the importance of food. Dot Net has brought all the luxury to programmers. People directly entering the flamboyant world of Dot Net are easy to be misled. They are just concerned about their destination but not the way they take to reach there. Concepts like entity framework, code first are some of the most misleading luxuries to new programmers, I would say.

  61. I’m a self taught Software Developer. I’ve worked with uni trained Developers with comp sci degrees who could not write a single line of code without either:

    A) Asking me to email them the code to type in, thereby designing the algorithm for them.

    Or

    B) Googling for a solution to cooy and paste, getting it wrong as they didnn’t realise they’d have to modify that code first, and then asking me to email them some code.

    I’ve worked with 3 people like this all with degrees. It made me thankful I did not go to uni.

  62. I am hooked on the idea of becoming a self taught programmer. I began taking MIT’s intro course and found the homework to be enjoyable even.

    My big concern is how to market myself. Do you network your way in, internships, volunteer work?

    How much time do you think would be required before entering the job market?

    • The best thing to do is to work on real projects from the get-go. That means once you understand the syntax of a given programming language, you should find or create projects that you can show others if asked about it.

      The question of time is really difficult to answer here but I would say if you find a company or a startup who wouldn’t mind having you as an entry level or intern, go for it. Don’t wait too long. Having real-world experience is much more important and that is what you should focus on!

      Volunteering is pretty good – unless you have bills to pay and you cannot afford to work for free for someone else.

      Good luck and always keep learning new things!

    • It’s not about time; everyone learns at different a different pace. You’re ready when you feel you’re ready. You’ll never be fully ready because what you really need more than anything is experience.

      My suggestion is program for a few years on your own and figure out where you want to enter into the programming field (smartphone apps, websites, backend apis, video games, etc.) Create something open source (this got me my first job) in the area you want to focus. Finally, when you feel ready, start applying. Find a startup and/or a recruiter. Make sure your open source project(s) are on your resume. You’re probably going to have to be ok with taking a crap salary at first but the experience will be well worth it. ^^

  63. hey…I am computer sc. graduate.and currently we are making our own tools for writting programs(actually for devloper)..so i need all these concepts back..i need to create whole bunch of graph data structure for devloper’s code and need to apply LALR(N) on that so my graduate study on subjects like compiler,data structure helps me a lot in my daily job..and it is really very profile job..

  64. I am a self taught programmer and I know good sources for Algorithms and Data Structures but not for System Architecture, Operating Systems and Compilers. Can someone suggest the best books/sources for these?

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">