As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance.
If this question can be reworded to fit the rules in the help center, please edit the question.

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.
–
JonasSep 26 '10 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.
–
Andreas RejbrandSep 26 '10 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.
–
AlexiosMar 5 '12 at 9:07

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.

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 KSep 26 '10 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 NoctisSep 26 '10 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 KSep 26 '10 at 19:36

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.
–
Steve EversOct 15 '10 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.

Basic love of problem / puzzle solving. Without this you won't be much good.

Ability to break a complex problem down into parts

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.

+1 for providing an answer for the "current world".
–
Tim MurphyOct 17 '10 at 3:47

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.
–
jmqFeb 18 '11 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.

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.

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.