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 seem to remember that linked lists, recursion, pointers, and memory management are all good examples of stumbling blocks - places where the aspiring programmer typically ends up spending significant time trying to understand a concept before moving on and improving, and many end up giving up and not improving.

I'm looking for a complete/comprehensive list of these types of stumbling blocks, in rough estimated order of difficulty to learn, with the goal of making sure that an educational program for programmers is structured to properly guide students through them

Is this information available somewhere? Ideally, the difficulty to learn will be measured in some sort of objective manner (ie, % of students which consistently fail to learn the concept) What sources are most appropriate for obtaining this information?

share|improve this question

closed as too broad by MichaelT, gnat, Martijn Pieters, Bart van Ingen Schenau, GlenH7 Feb 24 at 14:40

There are either too many possible answers, or good answers would be too long for this format. Please add details to narrow the answer set or to isolate an issue that can be answered in a few paragraphs.If this question can be reworded to fit the rules in the help center, please edit the question.

1  
Questions that ask for lists, even complete/comprehensive lists, are not constructive and don't belong on this site. Do you have an actual issue that you are trying to solve? If there is something behind this question of importance to you, please edit this question to meet the guidelines in the site's FAQ. –  Walter Feb 1 '11 at 13:12
    
I'm not sure how to reword this question - would it be more appropriate to go up a meta level, and ask for a reference to this info (ie, where can I find a comprehensive list)? –  blueberryfields Feb 1 '11 at 14:59
2  
It is just generally considered [by some] to be an "undesirable" form of question for the StackExchange network. The meta level would be no place for this, it belongs here in content, but is apparently not "the right kind of question". –  Orbling Feb 1 '11 at 16:45
add comment

5 Answers 5

up vote 10 down vote accepted

My list would be:

  1. Pointers: the idea of a direction where the data is stored and the arithmetics on them are quite confusion at first.
  2. Linked lists: In my experience this is the first data structure with some logic operations different from arrays that a CS student learns. An introduction to data administration and representation makes them a little complex.
  3. Tree structures and Recursion: Here is where my mind had to take some time to think about things before i started typing. Recursion is a powerful concept that missused leads to big problems, and Trees are the best structures to learn to use it.
  4. Paradigm Shifts such us Object Oriented , Functional, Distributed , Logical, etc. This is where all your lines of code that where in a nice simple imperative way, turn into a mix where lots of concepts change the way you need to think your solutions. At least in my case, these made me re-think a lot of what i have done and see that is was not the only way as i thought.
  5. Concurrency and Parallelism: this is what i believe the most complex topic on computer programing i have faced. It changes absolutely everything in a way that the problem is not: "Why the heck it always gives me the wrong aswer!" but a more disturbing option: "Why the heck it always gives me a different result that is not what i expected!". The complexity about Concurrency is that now the solution is not only the result of an algorithm but also the way this algorithm is calculated on a certain hardware in a certain situation, so the possible results goes up and the capability to determine what is happening in a certain moment of execution decreases.

I should notice that the Data Management is a topic that not necesarilly is easier of harder that the ones i mentioned but rather it goes in parallel with them. To understand them you need to first know what a pointer is (so the key on a table then will seem natural) , understand that a database is not a magic box where you execute queries and create tables and then results come out but rather that there is some data structure (suchs as Hash , B Trees family data structures) that uses indexing and other techniques to be able to retrieve information that might be stored in memory or in a hard disk, and also is able to be access by multiple users at the same time.

Finally i thought might add: Dealing with clients which is an important point because at the end, you're programming something for someone. In my case I see this as the ultimate barrier a programmer should face. It comes naturally to some or very difficult to others, but this is a concept that is always changing and that will always surprise you. Being able to understand and see in advance what a client might need is a huge step towards learning how to program because if you can see this, your code will be able to adapt when the moment comes. I dont know if this is the HARDEST but at least is the most variable stumbling block.

share|improve this answer
    
What about reflection, and self modifying code? –  blueberryfields Feb 1 '11 at 15:00
    
@blueberryfields those are things that dont block you when learning how to program, but sure they are desirable attributes about a programmer. –  guiman Feb 1 '11 at 16:06
    
Are you not including them because they are infrequently used then? –  blueberryfields Feb 1 '11 at 16:11
    
No, i dont add them just because i think those are a result of a process that involve the ones i mentioned plus a lot of other that i probably dont know yet. Once you start to grasp the concepts involved in those points, each step implies a process of reflection and some times the need of self modifying code that was written previous to the aknowledge of that particular concept. Thats the way of enlightment trough programming i think is true. Its just my opinion and the way i choose it to be. Hope each one have its vision about it –  guiman Feb 1 '11 at 17:26
add comment

Having taught, been taught, and studied teaching, the big three are:

  1. Pointers.
  2. Pass by value vs pass by reference.
  3. Recursion.

Those are the 3 items that weed out 2/3rds of CS majors.

share|improve this answer
add comment
  1. Fear of breaking the computer
  2. Being scared that only having GCSE level (or equivalent) maths education will hinder you
  3. Thinking that you need to be as good as Jon Skeet to make learning worthwhile
  4. Not having the right tools
  5. Not knowing where to get answers to your questions
  6. Gathering requirements
  7. Designing good user experiences
share|improve this answer
    
+1 for "Not knowing where to get answers to your questions" –  DevSolo Feb 1 '11 at 15:26
add comment

Pointers and Memory Management was tough for me during my starting days.

share|improve this answer
    
+1 for pointers. While I understood the concept, implementing *'s and &'s in C kept me confused for a very long time. –  oosterwal Feb 1 '11 at 18:24
    
My fight is still on with Pointers –  Rachel Feb 1 '11 at 18:26
add comment

In addition to the answers by guiman and el fuser:

  • Regular Expressions. Some people never get them.
  • something relatively new: SQL (relational data) vs. NoSQL (key => value or other data structures)
  • Programming patterns (both ways: going abstract with a concrete problem to create a pattern, or to translate a pattern into a solution for a real problem)

But I don't think you will get a general list. Different people will get different topics with different speed or sometimes never. Some might break when talking about pointers, some other might break when talking about OO vs. functional vs. logic.

share|improve this answer
    
I really missed those, regular expressions could be the dark bader of programming. I still see them as the bad guy but i didnt have the opportunity to use them extensively –  guiman Feb 1 '11 at 12:30
add comment

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