As a general purpose programmer, what should you learn first and what should you learn later on?

Here are some skills I wonder about...

  • SQL
  • Regular Expressions
  • Multi-threading / Concurrency
  • Functional Programming
  • Graphics
  • The mastery of your mother programming language's syntax/semantics/featureset
  • The mastery of your base class framework libraries
  • Version Control System
  • Unit Testing
  • XML
  • Do you know other important ones? Please specify them...

On which skills should I focus first?

  • 1
    I think that every programmer will list these things in a different order. It depends on what you are most interested in. I voted to close.
    – Jonas
    Commented Sep 26, 2010 at 10:48
  • For Windows developers, you eventually need to master the Windows API. I also think it is important to learn to work with custom data structures mangaged manually on the heap. You should also learn to design, read, and write binary files (at least simple ones like Windows 3 bitmaps). And, if you work with native programming, you should become familiar with assembly. Commented Sep 26, 2010 at 13:56
  • At the very top of the list should be the ability to learn new programming languages in a few hours. You should be in a position to use whatever language is required for some task, not to have to bend the task to fit the limitations of a particular language or framework.
    – Alexios
    Commented Mar 5, 2012 at 9:07

9 Answers 9


SQL -- learn immediately. Don't worry about DBA stuff, but master queries, table and view creation, some optimization, joins, etc.

Regular Expressions -- Handy but almost never critical. Any time I need a RegEx I just google around for it and test until I find a good one.

Multi-threading / Concurrency -- Useful to some but difficult to learn. Learn them when you're working on things that require them.

Functional Programming -- Not generally useful on a professional level. Fun to know, and many FP concepts are making their way into mainstream languages.

Graphics -- Awesome if you have fun with them or work in an industry that uses them.

The mastery of your mother programming language's syntax/semantics/featureset -- #1 thing

The mastery of your base class framework libraries -- #2 thing

Version Control System -- #3 thing (know at least one proficiently)

Unit Testing -- High useful to know and be able to talk about. Most shops will talk about unit testing, only some will actually do it, but very good to know.

XML -- Can learn as you go generally. Not worth independent study.

My additions:

SOAP/JSON: If you do any web or service development, these are huge. Even my desktop development is starting to rely heavily on these two for integration. Great to know for many vocations.

TCP/IP: You should know how a socket works, how to open one, the difference between TCP and UDP. You should be able to send an E-mail address via Telnet or using a simple socket-based environment. Understanding the protocol that underlies so many others is very helpful sometimes.

Your IDE: You will likely spend a ridiculous number of hours in your IDE, and every single one of them has features which can save you lots and lots of time and aggravation. It's worth getting a book just to learn the hidden tricks of your IDE du jour.

  • 4
    Instead of buying a book and studying how to use an IDE, you could just use VIM. Curse IDE's and software the assumes you will be using one.
    – Josh K
    Commented Sep 26, 2010 at 2:02
  • 3
    Because VIM is so easy and intuitive to use to it's highest potential out of the box with no training and lessons... If you want to use VIM instead of an IDE, cool, but learn VIM then to the level I described learning an IDE.
    – Pax Noctis
    Commented Sep 26, 2010 at 17:44
  • 1
    I don't think you could say VIM is the most efficient out of the box. I've seen people who use VIM for years still don't understand it.
    – Josh K
    Commented Sep 26, 2010 at 19:36
  • 2
    I'm pretty sure that was sarcasm. Commented Oct 15, 2010 at 11:28
  • @Thomas Upvoting Josh K for "ironic justice".
    – Mark C
    Commented Nov 26, 2010 at 2:11

In my experience, programmers who are "trying to be good programmers" by learning things like they would learn basic math are never as good as those who program with a purpose.

Just learn what you need to do to accomplish an idea you have; learning any of the points you listed is useless if you're not going to use it.

  • I agree to a point. There is foundational logic that helps no-matter what the developer intends to build. I see few to none of those things in the list the OP provided though. Commented Oct 15, 2010 at 20:17

As an independent contractor I consider the number one skill I have and need is communication. It is absolutely necessary for programmers to understand their clients needs. You can be a guru in SQL, c#, etc but if you don't deliver what client the requires then you are sunk.

  1. Basic love of problem / puzzle solving. Without this you won't be much good.
  2. Ability to break a complex problem down into parts
  3. Flow charts, should be able to show you the flow for solving the problem.

That's it. Master that and what language or system you use to solve the problem becomes simply a lesson in learning how it breaks the problem down. There are not "right ways" to master programming skills, there isn't some sort of "golden rule" that will teach you everything in the right order.


In this modern world of ours most of the stuff that once was required (and will still be smacked as the only true knowledge by the old ones) is not required so much today. You don't need to know how the hardware work to still be an excellent programmer.

In my own opinion the only things you need to know in these modern days of ours are:

  • OO programming.

  • Unit testing.

  • Basic Big O notations (when should you use an ArrayList and when should you use an LinkedList?).

  • Communication. Communication is always needed. Either with the consumer, client or your programmer pals.

  • Refactoring/Removing smelly code.

Anything else will follow up afterward with practice and experience.

Except Unit testing of the things you mention I would only consider SQL, Concurrency and Version Control System to be useful more than maybe a few times in your career. The rest are just general stuff which can be useful at times though aren't needed.

  • It's funny, but I've never needed to use big O notation. I learned it in school many, many years ago, but I can't remember a time where I've actually had to use it (or had anyone else that I worked with that would have understood it, LOL). Don't know if that is good or bad, heh.
    – jmq
    Commented Feb 18, 2011 at 7:51

I don't mean this to be the trite answer it is, but I always wish I could find a programmer who could truly just know both Perl and SQL. I figure with those two knowledge bases, one could nearly grasp anything.

(Edit) Fair enough: perl (IMHO) encapsulates nearly the whole of programming in terms of understanding streams, records, regexp, data transformation, (de)references, both low- and high-level data structures, arrays and associative arrays (hashes). Understanding the language nearly conveys some level of mastery in programming. I know a lot of .NET, PHP and even Java hacks, rare to see a hack that writes Perl.

Add SQL to it (really understanding it, not just simple selects) and I wager that someone who understands these minus fitting the "perl profile" (someone who may have at times their own ill-placed say at things) would be able to quickly and with respectable mastery solve any programming need in the majority of environments.

  • +1 for adding details. :-) Commented Sep 26, 2010 at 20:43

I guess you've already got your answer by now. I would like to add some more things.

First read some non programming books to develop your interest in programming.

Some good books are

  • Code complete

  • The pragmatic programmer

After that think on which field you wanna go. I mean which kinda work you would like to do? Whether you want to be a game developer, a system programmer, a web developer etc.

After that learn some basics of mathematics, learn about data structures and algorithms. Then select a language on which you want to implement those algorithms. You can select C/C++/Java etc according on your interest. Learn the syntax of the language and learn how to implement those algorithms that you've designed.

Some knowledge about Functional programming is also a must have skill. Here's a great article on FP. Click here to see.


I don't think you need to "mastery" all those areas. Just learn some basic concepts and the other stuff [database systems, version controls] will come when you need it...


You have forgotten a lot of important stuff, that really distinguishes the advanced programmer from the novice. (Notice that I have only worked with native Windows development, and has a preference for low-level stuff.)

First, if you work on the Windows platform, you need eventually to master the Windows API, even if you are a Delphi developer, say (and hence can do a lot of things in the VCL alone). You need to learn to work with HWNDs, HBITMAPs, HMENUs and all other kinds of kernel objects.

Also, one very important thing: you need to be able to design and implement custom data structures and algorithms. Every decent programmer should be able to write a syntax-highlighting text editor in a week or so, from scratch. To go even further, I think that a professional programmer really should know how to allocate and use raw memory on the heap manually, in order to store data in some custom structure.

Also, you should be able to understand and design binary file formats. You should be able to write decoders and encoders for simple binary file formats, such as Windows version 3 bitmaps, at least.

Further, if you are working with native development, a good understanding of assembly is a sure sign of maturity as a programmer.

  • I was surprised how your answer put such and emphasis on "low level" coding skills. I was even more shocked when I viewed your use page and saw your age. Just saying.
    – Tim Murphy
    Commented Oct 17, 2010 at 3:51