Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

I've been thinking about this a lot lately. Right now I work at a little web company, am almost done with school, and have written an iPhone app, but I'm not sure what else I need to focus my learning energies on. I've decided I want to do software programming, so I've been actively reading everything I can get my hands on that deals with Objective-C / C++ (Cocoa, OpenGL, etc). But those are not the things I'm talking about. I know I need to "master" a language or two. What I'm talking about are the other "things". Things such as learning and using source control, design patterns, etc.

What thing (or things, just one per response), would you say I should concurrently be focusing on? You can consider in your answer that I'm wanting to do the aforementioned career path, but you don't have to. I just want a nice list of things to research, and actually use in my career.

NOTE:

I asked this question on Stackoverflow, and after a few good answers, it got closed, and I was told i should move it here.

Here is the original: http://stackoverflow.com/questions/4452857/what-are-the-most-necessary-non-language-specific-things-a-programmer-needs-to-kn

One thing is, a lot of the answers were about people skills, which is fine, and I do agree, but I was looking more for programming specific kind of things, like, i don't know, learning Hexadecimal, or design patterns (maybe specific), etc.

share|improve this question
1  
How to focus on their job and not spend their day asking questions on SO. :) –  George Dec 15 '10 at 17:37
show 3 more comments

closed as not constructive by maple_shaft Mar 7 '12 at 13:32

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.

37 Answers

up vote 14 down vote accepted

Algorithm design techniques

At the most basic level, you should understand when a linear time operation is clearly inefficient, and the same goes with quadratic operations, and so on. At this level, you'd mostly be concerned about which data-structures to use (e.g. HashMaps versus Lists, et cetera...) and how to organize your loops.

At the next level, you'll be able to know how to conceptualize your problems in terms of existing solutions. For example, the "obvious" solution to a problem might take quadratic time, but you might be able to see how you can first sort the data (for example) and turn it into a search problem. Similarly, you might reduce a dependency solving problem to a topological sort.

At the more advanced level, you will be writing your own algorithms, using the techniques you've learned by studying algorithms. After divide-and-conquer, for example, you'll learn techniques like dynamic programming (and memoization), network flow (and other hill-climbing techniques), and greedy algorithms. Each will require different skills. For example, some algorithms are hard to implement, but fairly easy to prove correct; while other algorithms are easy to implement, but sometimes difficult to prove correct (such as with greedy algorithms). By the way, Google technical interviews are heavy on algorithm design, including dynamic programming.

Perhaps in regular application programming you won't feel like you're encountering the need very often, but it's just as likely that, once you learn these techniques, you'll realize how important they can be.

share|improve this answer
1  
Is it really necessary to understand advanced algorithms for application programming? Although I know my big Os, but there was never a time when I had to think about reducing complexity. Those were all obvious singe loop traversal (foreach as it is used in many languages). I guess, this is due to the kind of work I do. –  Shamim Hafiz Dec 16 '10 at 4:36
show 2 more comments

Personal skills.

You need to be able to communicate and interact with others, programmers and non-programmers alike.

share|improve this answer
show 3 more comments

How to communicate clearly. That may be in any number of ways-in person, by phone, via email, through the use of bug tracking and development tracking tools, when writing documentation, and quite a few other ways. In any of these, knowing how to be clear, precise, and concise will get you a long way.

Usually, projects don't fail because the team sucks at coding. They fail because the team sucks at communicating.

share|improve this answer
show 2 more comments

That you're not perfect, that you're prone to mistakes and that your way might not be the right way.

I can't even describe how I feel when I find a crusty old codebase littered with things like while (list ($key, $val) = each ($array[0]['pl_bimg_arr'])) { because the last programmer was too clever to use foreach.

Being self-critical is important.

share|improve this answer
1  
I cringe when I see that code, too! But that is because I don't like PHP. :-) –  David Murdoch Dec 16 '10 at 19:04
show 2 more comments

The ability to translate an abstract idea into a programmable design. It's a skill you need over and over again, and on many levels.

At the very top of the design a programmer must estimate what features can reasonably be implemented given the resource constraints, which is only possible by doing a rough implementation plan. Programmers who fail at this level are typically completely oblivious to their misjudgement, since they will almost always deem a feature or project harder to implement than it would be given a better plan.

On a lower level there is object and database structure planning, while that may seem to be a meta programming task it can't be done in a satisfactory manner without at least a sketchy plan for the code structure. An able programmer can make a working plan for the structure, a master programmer can make something which is simpler, faster and overall better. The difference lies in the mental method for sorting through different ideas, quickly sorting out flawed approaches and identifying improvable spots is crucial to the process. It takes a mix of intelligence and experience to master the process.

On the lowest level, the level where the code is actually written the problem is largely the same, except that a large amounts of tasks has already been solved and packed in libraries or taught as general patterns. It's worth gaining a deeper understanding of how these solutions work and knowing their alternatives, basically learn this well enough that you would be able to do without them. Not only does this enable a programmer to solve the odd low level problem that doesn't have a suitable library function, the understanding will also help when designing at the higher levels.

share|improve this answer
show 3 more comments

I'd say people and public speaking skills. Whether you have them already or not, it's going to save your career multiple times before you realize. There are some specific things you can actually do to improve them and practice, as well: from dating to joining a ToastMasters group.

share|improve this answer
show 3 more comments
  1. Be an expert with atleast one high level programming language (C/C++/Java/etc)
  2. Learn atleast one scripting language. (Python, Ruby, Perl etc)
  3. Stay sharp on your algorithms and data structures.
  4. Keep an updated resume.
  5. Solve problems regularly (Topcoder, Project Euler)
  6. Stay humble and keep learning.
  7. Get involved in open source projects.
  8. Give back to the community by participating in TopCoder, making whatever you can and want to open sourced.
share|improve this answer
show 1 more comment

Time management is an important skill. Not only being able to stay on task, but being able to estimate how long different jobs are going to take you and when you'll be able to work on them.

share|improve this answer
show 2 more comments

I think I would focus not on specific technologies...part of being a good+ developer is being able to pick up a new technology/tool quickly. Rather, I think I would concentrate on reading up on good development practices and methodologies. This can range from some exposure to design patterns all the way to good coding style. All of the tools that will allow you to integrate seamlessly into a team that has an existing process.

Some things that I've found myself drawn to in my efforts to improve myself are design patterns, source control protocol (bricking, merges, when to branch), database design, test first programming, etc. Once you have that, coupled with a developers natural inclination to learn and absorb emerging technologies, you are in good shape to build the foundations of a good career.

And yes, there are probably other things to add to the list or to remove depending upon who you are, but the general gist of it is not technologies--methodologies.

share|improve this answer
add comment

The number 1 thing you will need to know as a programmer is how to co-exist in a world full of abstractions, of personal issues, of competing requirements for both your time and skills, of whiners who want to destroy your credibility. I have come to understand that programming in a real world environment has very little to do with programming.

:)

Just a little food for thought.

share|improve this answer
add comment

Software Development Process and understanding development methodologies like Waterfall or Agile would be another set of material to learn that could be useful.

Don't forget to pay attention to what kinds of development you like and what kinds of career aspirations you have. Maybe you want to be a one man IT army or a one man software shop or maybe something else. Figuring that out would also be rather valuable, or at least that is my other guess.

share|improve this answer
add comment

Being and staying curious is IMHO the main point. If you're interested, you'll go forward :)

share|improve this answer
show 1 more comment

Data structures. A good knowledge of at least the performance characteristics of data structures is invaluable.

share|improve this answer
1  
I'd say if you are confident you could implement one given enough time and a small number of helpful hints then you have an understanding of them. Remember on top of lists, there's dynamic arrays, trees (binary trees, b+/-/*tree, red-black trees etc), hash tables, skiplists, bloom filters and more. –  dan_waterworth Dec 15 '10 at 17:36
show 3 more comments

Just things that are coming into my mind (other than what and others has said):-
Database designs
Parallel processing
Graphs and graphs algorithms
Object Oriented model
Making Coffee

share|improve this answer
4  
+1 for making coffee, don't that that for granted, making good coffee is a hard to achieve but very important skill. –  bjarkef Dec 16 '10 at 13:15
add comment

Learning how to merge code and other sorts of text like xml in source control.

The tools mostly get it right, but when they fail it's up to you to do it, and I've seen too many developers who don't know how.

I blame SourceSafe.

share|improve this answer
show 1 more comment

It's been said before, but communication. And if you think you're OK at that, try communication with people who aren't good at it, because you will encounter them.

I've found that empathy (not to be confused with sympathy!), that is, insight into the goals and motivations of the person (or group of persons) I'm interacting with, has helped me a lot. It makes living with your colleagues and your boss nicer, helps understand why they may not agree with you on certain things, and helps get them to agree with you - because you can argue how your benefit is also theirs, if you know what they want. This, of course, applies to much more than just the job. I think it's one of life's most valuable lessons.

Understand that nobody makes illogical decisions. Ever. This means that if somebody decides something that seems obviously stupid to you, there is always a valid (to them) and logical (to them) reason for that, which you might not be able to see from your point of view. They might not even know the reason themselves, but it's there, and you're much better off (and much more respectful) if you can acknowledge and accept that reason, and argue with it in mind, instead of trying to ignore it and arguing a point that won't ever convince them.

tl;dr: Read "Getting to Yes" by Fisher/Ury/Patton. The title sounds like some sort of cold-hearted "get what you want, don't care about the others", but it isn't. It's actually teaching you how to respect other people's motivations, which in turn makes you more successful in negotiating and communicating.

Oh, but the most important thing, IMHO: Be a good person. Be nice. Also to yourself.

share|improve this answer
show 2 more comments

Application Design

Most of the "programmers" I know are relatively tech savvy, meaning that they know that a pointer can be null, they understand the idea of reference / copy etc, and thus can in general implement a feature... and make a horrible mess of it.

Being tech-savvy and knowing a language inside out is great, but you need more, you need to see a bigger picture.

Design Patterns, Idioms, etc... help, but they are a mean not an end.

So what should you be looking after ? Maintainability!

In order to gain maintainability you need to cut down dependencies, to prevent changes to propagate throughout the application like ripples on water.

This means organizing the code and flow of the application at a meta level, which is pretty much language agnostic.

Unfortunately I know of no course that teaches it, it's usually won out of hands-on experience in refactoring; for those who care...

share|improve this answer
add comment

Boolean Logic and Number Theory

Every if-statement and loop-construct you will ever write will incorporate a combination of the two.

Both can be learned sufficiently by picking up a copy of a Discrete Mathematics textbook.

share|improve this answer
show 3 more comments

Solving Problems

share|improve this answer
1  
any problem you think worth solving , depends on what area you want to work on , or engineering puzzles , facebook has a good set of puzzles –  Saif al Harthi Dec 15 '10 at 17:22
show 3 more comments

Understand the difference between "knowing a language (or tool)" and "knowing how to program." The industry is filled with people who learned a language or a tool and have used it so long that they're considered senior-level programmers. But time spent using a specific tool doesn't mean one has mastered that craft.

Somewhat related to my point, another SO user shared a link recently that was interesting: http://norvig.com/21-days.html

share|improve this answer
add comment

Domain-specific languages is a concept worth knowing. In some contexts it can be extremely effective in making programs really flexible (just think about all those Quake-like games, and what it would take to actually write such from scracth).

share|improve this answer
add comment

Data structures.

If you're wondering whether you know enough about a particular structure; I'd say if you are confident you could implement one given enough time and a small number of helpful hints then you have a good understanding of it, but knowing at least the performance characteristics of data structures is invaluable.

To get you started there are lists, dynamic arrays, trees (binary trees, b+/-/*trees, red-black trees etc), hash tables, skiplists, bloom filters and more.

This isn't just useful for low-level languages where these structures are implemented or used in their rawest form, but also in high level languages. Once you know that language X's list implementation is a dynamic array, you'll know that putting new items in the middle should be avoided or maybe using a set is a better fit.

Programming is at it's heart, the manipulation of data. Knowing how to efficiently store your data makes the rest of your job a whole lot easier.

I don't know why the administrators can't just move questions and answers across sites.

share|improve this answer
1  
A hash function and aware of it's fundamentals. –  dan_waterworth Dec 16 '10 at 15:30
show 2 more comments

Business Rules

For examples: If you are going to work at a bank as developer, learn some basic economics.

share|improve this answer
add comment

Oh, and: Read Joel on Software. Either the blog or the book. This Joel guy not only writes fun, insightful anecdotes covering both the core and the meta of programming, he's also founded some well-regarded social web thingy I've forgotten the name of.

Stay curious!

share|improve this answer
show 3 more comments

I am in a very similar position, I am currently 3 months into a 12 month internship, then will return to University for my final year. From my personal view point, I have found studying design patterns over the past couple of months to have really benefited my level of coding. I'm not sure what you're education background is, but within my university they teach simple, and often, outdated OO principles. What I have got from studying design patterns are things like, favour composition over inheritance, try to code to interfaces rather than implementations, etc. It's all about writing maintainable, efficient code, which I now understand a lot more due to design patterns.

I would recommend the Head First Design Patterns book if you are interested. I did try and read the GoF book, but found it a little too abstract for my current level.

share|improve this answer
show 2 more comments

Here's a list of languages I suggest you play with: haXe, Haskell, Ruby, Scala, OCaml. They are listed in no particular order (except my favourite being the first).

Learning and understanding the concepts different languages promote is very helpful. What is a design pattern in some languages, is a mere language construct in others. When it's a feature, that nicely integrates in the language, you will get a much better understanding of it, and using it for modeling solution will become as natural as using a certain gramatical construct to express a thought in human language.

Then, you may want to investigate popular frameworks existent for those languages. Try to understand their how their design works, and then why it works the way it works. Put it into relation with the languages they use.

Software development is mostly about looking at a problem from the right angle and finding a good way to express the solution.

share|improve this answer
add comment

I've been chewing on this same question myself, and I recently came across this programmer competency matrix.

It's the best "roadmap to competency" that I've found. It lays out several dozen different skill areas and gives guidelines as to what you should be able to do at each level of proficiency. Most of the suggestions you've received in this thread show up in this roadmap at some point.

I used this guide to map out my year into "semesters" with specific focuses, with the goal of rounding out my skill set to the next level. Starting in January, for example, I'm planning to focus on advanced C# and shoring up the computer science deficits I have as a result of being self taught.

There is so much to learn that I find it hard to focus on something long enough to gain some depth. It's easy to get distracted by the next shiny thing you want to learn. :) Setting up blocks of time to focus on a few subjects helps. I can put that new subject on my list for next semester instead of buying a book on it now and reading 50 pages before I bounce to something else.

Good luck!

share|improve this answer
show 3 more comments

But programming is really more then list of languages and tools you know, it is really the personal skills and habits which separates the great programmers from the others. I recommend you read Ed Burns' Secrets of the Rock Star Programmers. It says, for example, a programmer must be aware of his ignorance. Knowing you are ignorant will always make you look for that new stuff you were missing and will constantly make you improve your programming skills.

share|improve this answer
add comment

Debugging techniques

There are many debugging techniques that are independent of language:

  • Reproducing a bug (or what to do if it can't be easily reproduced)
  • Using a divide and conquer approach to narrow down the location of a bug
  • Using breakpoints, stack traces, and other debugger tools
  • Putting assertions into code
share|improve this answer
add comment

Clear and concise communication. If you can speak and write well, it will take you very far. I would consider getting involved with something like Toastmasters if you want to improve you ability to speak in front of others.

share|improve this answer
1  
I do seem to have a bit of a problem with conveying what I'm saying to non programmers. I often get in a flustered rush and fill up the white board with jumbled pseudocode. I don't know why I feel so hurried. I feel like if I don't get the idea out on the board in 30 seconds, they'll space out or get bored or something. –  Josh Dec 15 '10 at 17:23
add comment

Not the answer you're looking for? Browse other questions tagged or ask your own question.