Computer programming courses are gateway courses with low passing grades, which may result in student attrition and transfers out of engineering and computer science degrees. Barriers to success include a good understanding of programming concepts and the ability to apply those concepts to write viable computer programs. In this paper, we analyze the determinants of the transition from concepts to skills in computer programming courses using factor and cluster analysis. The purpose of this study is to answer the following questions related to computer programming teaching and learning: 1) Which are the correlations and interdependencies in student understanding of different computer programming concepts?; 2) Which are the cognitive challenges that students find when learning programming concepts?; 3) How the understanding of different programming concepts relate to practical skills in computer programming; 4) What determines a successful transition from understanding the concepts to the ability to write viable computer programs? After several computer programming concept assessments in this first Java Programming course, we grouped the students’ performance into seven different categories: assignment operators, repetition structures, selection structures, program design using methods, arrays, classes and Java syntax. Factor analysis identified two factors (components) grouping the interdependencies and correlations between programming concept categories. The first component correlated with the repetition and selection categories, and could be referred to as the “algorithmic” component. The second component correlated with the methods, arrays and assignment categories, and could be referred as the “structural” component. Student performance in conceptual categories related to the “algorithmic” factor was significantly better than in conceptual categories related to the “structural” factor. Cluster analysis showed that student performance in the “structural” conceptual component is predictive of the student’s ability to solve practical computer programming problems. We conclude that a strong emphasis in the structural components of computer programming (i.e. program design using methods, use of the assignment operator, and use of data structures like arrays) is necessary for a successful transition from concepts to skills in computer programming courses.