The aim of the course is that the student acquires the fundamental principles of programming, algorithmic structures and software development techniques, acquires programming skills in a high-level programming language environment, is able to combine the various algorithmic structures and instructions of a programming language, acquirs the ability of composing programs which solve specific problems not only in the field of his/her scientific field but, more generally, scientific or other problems of practical interest, is able to process by programs big volumes of data, ceases being restricted by the dedicated capabilities of existing software packages and will be able to develop software for the solution of special problems, acquires a broader analytic and synthetic way of thinking and of skills for the solution of a problem (not necessarily of a problem that requires a computer program) by splitting it into simpler problems that achieve intermediate targets.