About this nanodegree


Scala has positioned itself as the de facto language for Data Engineering. Several of the major big data frameworks and toolkits for batch processing and streaming analytics are implemented in this language. Furthermore, Scala provides a highly expressive and strong type system on top of the JVM which facilitates the development and maintenance of complex software applications. This includes but is not limited to distributed computing, highly resilient web applications, streaming technologies, and real time machine learning serving APIs.

In this nanodegree, you will learn the basics of Scala programming as well as the most common best practices. You will get familiar with functional programming principles and understand the trade-offs between traditional object-oriented and functional paradigms. A successful completion of this nanodegree will enable you to pursue more advanced topics in the big data practice and general software development with Scala.

Who should apply


Consider the following prospectus profiles:

  • Beginners with basic programming skills and willing to learn Scala.
    • Object oriented programming notions are a nice to have.
    • Experience with at least one typed language (e.g., Java).
  • IT professionals interested in software and/or data engineering with Scala.
    • Understands basic programming concepts.
    • Previous coding experience is required.
  • Developers willing to increase their current skill set.
    • Has experience developing with several programming language including dynamic and strongly typed.
    • Has a good notion of design patterns and software best practices.
  • Scala and Java programmers with object-oriented background and willing to learn functional programming.
    • Has a solid understanding of the JVM.
    • Understands OO design patterns.
    • Is aware of the paradigm shift that implies FP.

Requirements


Prospectus students must:

  • Have their own hardware with the following minimum specs:
    • At least 4GB of RAM. See the system requirements for IntelliJ here.
    • Be able to dedicate at least 1 hour of individual learning for each module (homework, readings, etc).

What you will learn


This nanodegree aims to create proficient Scala developers. For doing so, we layout the foundational concepts that every Scala programmer should master.

Syllabus


Module 1: Introduction

This module presents the history and context of the Scala programming language and its ecosystem. It illustrates the how and why Scala became one of the most popular language for big data and distributed computation. Moreover, the basic setup for the nanodegree will be presented.

  • History and context
  • Getting started

Module 2: Essentials

This module presents the essential concepts of the Scala programming language. This implies an understanding of the Java Virtual Machine (JVM), the Scala type system, expressions and values.

  • Understanding of the JVM
  • Basics of Scala interoperability
  • Scala expressions, types and values
  • Evaluation strategies
  • Scaladoc
  • Documenting your work

Module 3: Objects and classes

Scala combines object-oriented and functional programming. In this module the basic concepts of OOP in Scala are presented.

  • Classes
  • Objects
  • Companion Object design pattern
  • Subtyping (or dynamic) polymorphism.
  • OOP patterns

Module 4: Functions

Function types, composition, currying, and generics are some of the most used features of the Scala programming language. This module presents these concepts.

  • Function types
  • Composition
  • Currying
  • Generics and parametric polymorphism
  • Functions and Dependency Injection.

Module 5: Traits for data modelling

Scala provides powerful abstractions for data modelling. We can represent arbitrary domain entities in the type system by using abstract data types.

  • Traits
  • Abstract/Algebraic Data Types (ADTs)
  • Recursive Data Structures
  • Invariance, covariance and contravariance

Module 6: Sequencing computation

A common practice of Scala developers relies on sequencing computation. In this module we introduce several use cases illustrating the how and why doing this.

  • fold
  • map and flatMap
  • Functional programming constructs in action

Module 7: Idiomatic Scala

This module relies on the previous knowledge to present the idiomatic way of using Scala.

  • Collections
  • For-comprehension
  • Pattern matching
  • Common design patterns

Module 8: Type classes

In this module, the concepts of implicits and type-class pattern are introduced. In particular, the type-class pattern is highly popular among advanced Scala developers. Type classes are a powerful language feature.

  • Implicits
  • The typeclass pattern (ad-hoc polymorphism)
  • Typeclass instances and interfaces

Module 9: Functional programming

This module formalizes some of the concepts seen in the previous modules into FP theory. Moreover, the cats and scalaz libraries are used to demonstrate a practical use of the FP theory.

  • Monoids and Semigroups
  • Functors
  • Monads
  • Monad transformers
  • Algebraic effects
  • Functional Data Structures and programming patterns

In the final module we present the popular Scala frameworks and toolkits. You are encouraged to pick the tools that best suits your career path.

  • Web Development
  • Batch processing
  • Real time processing with streams
  • Utilities
  • Testing: ScalaTest, ScalaCheck (property-based testing)
  • Selected topics on SBT and useful plugins
  • Targeting other platforms: ScalaJs and Scala Native.