The main goal of the course is to provide a structured general view of programming languages and techniques, both from theoretical and pragmatics point of view. The languages are studied via so called cross-cutting concerns (e.g. syntax, semantics), but also classified according to different paradigms and concepts. The course begins with an introduction of the evolution of languages and programming up until modern day of cloud computing, followed by a more focused study of the languages and advanced programming concepts. A set of general languages features (e.g. syntax, control flow, names, binding, state) are demonstrated with imperative programming languages. The topics of inheritance (also multiple and non-class based), generics, and advanced object abstractions are covered in the field of object oriented programming. The latter part of the course focuses on declarative techniques, multi-stage programming (e.g. aspect oriented and meta), concurrency, parallelism, domain specific and visual languages in the cloud and web. Among covered declarative topics are the background theory and basic abstractions of functional programming, powerful type systems (Haskell), data-flow oriented techniques (e.g. reactive)