スカラの高度なインタビューの質問と回答
この投稿を読む前に、「Scala Basic」と「Scala Intermediate」のインタビューの質問と回答を読んで、Scala言語の基礎知識を得てください。
スカラに関する高度な面接質問
この投稿では、Scalaの高度なコンセプトとリアルタイムプロジェクトに関連するいくつかの高度なScala面接の質問について議論します。なお、このリストがすでに非常に大きくなっているため、残りの質問と回答については別の投稿で配信する予定です。その投稿は「Scala中級および上級面接の質問と回答」として参照してください。また、シニアまたは経験豊富なScala/Java開発者に役立つScala/Javaの並行性と並列性に関する面接の質問と回答についても議論します。
スカラの上級インタビューの質問集
このセクションでは、すべてのScala中級インタビューの質問をリストアップし、次のセクションでは詳細に議論します。
-
- What is the current latest version of Scala?What is the major change or update in Scala 2.12?
-
- What is Option in Scala? What are Some and None? What is Option/Some/None Design Pattern in Scala?
-
- What is Either in Scala? What are Left and Right in Scala? Explain Either/Left/Right Design Pattern in Scala?
-
- What is the equivalent construct of Scala’s Option in Java SE 8? What is the use of Option in Scala?
-
- What are the Advantages of Functional Programming (FP) or Advantages of Pure Functions?
-
- What are the Popular Scala-Based Frameworks to develop RESTful Web Services or REST API?
-
- What is the best Framework to generate REST API documentation for Scala-based applications?
-
- Like Hibernate for Java-based applications, What are the Popular ORM Frameworks available to use in Play/Scala based applications?
-
- What is the best tool to develop Play/Scala applications to persist data in MongoDB NoSQL data store?
-
- Popular clients who are using Play and Scala to develop their applications?
-
- What is the best language to use with Play framework: Scala or Java?
-
- How Scala supports both Highly Scalable and Highly Performance applications?
-
- What are the available Build Tools to develop Play and Scala based Applications?
-
- What is SBT? What is the best Build Tool to develop Play and Scala Applications?
-
- What are the available Unit Testing, Functional Testing and/or BDD Frameworks for Play and Scala Based applications?
-
- What is the best Code-coverage tool available for Play and Scala based applications?
-
- What is the best Scala style checker tool available for Play and Scala based applications?
-
- Which IDEs support Play and Scala-Based Applications Development and how?
-
- What is the default Unit and Functional Testing Framework for Play? What is the default Build Tool for Play? What is the Default Template Engine for Play? What is the built-in Web Server available in Play Framework?
-
- Why Scala is better than Java? What are the advantages of Scala over Java (Java 8)? Compare to Java What are the major advantages or benefits of Scala?
-
- What is an Anonymous Function In Scala? What is a Function Literal in Scala? What are the advantages of a Anonymous Function/Function Literal in Scala?
-
- What is an Higher-Order Function (HOF)?
-
- What are the differences between Case class and Normal Class?
-
- What are the advantages of Play/Scala stack to develop web applications?
-
- What is call-by-name? Does Scala and Java support call-by-name? What is the difference between call-by-value and call-by-name function parameters?
-
- What are the Java’s OOP constructs not supported by Scala? What are the Scala’s OOP constructs not supported by Java? What are the new OOPs constructs introduced by Scala, but not supported by Java?
-
- What are the popular MVC frameworks for Scala Language to develop Web Applications?
-
- What are major differences between Java-Based and Scala-Based Maven Project’s structure?
-
- What is Extractor in Scala? What is the difference between Constructor and Extractor in Scala? What is the use of Extractor in Scala?
-
- What is the use of ‘???’ in Scala-based Applications?
-
- Explain the main difference between List and Stream in Scala Collection API? How do we prove that difference? When do we choose Stream?
-
- What is the difference between :: and #:: in Scala? What is the difference between ::: and #::: in Scala?
- If I want to become a Fullstack Scala Developer, which technology stack I should learn?
スカラの高度な面接の質問と回答
このセクションでは、上記のリストから1つずつ質問を取り上げ、必要に応じて適切な例を用いて詳しく説明します。もし、これらの概念を例を交えて詳しく理解したい場合は、Scala チュートリアルセクションで過去の投稿をご覧ください。
What is the current latest version of Scala? What is the major change or update in Scala 2.12?
現在の最新バージョンのScalaは何ですか?Scala 2.12の主な変更や更新は何ですか?
現在のScalaの安定版は2.11.7です。それはJava SE 7をサポートしています。
Scala 2.12バージョンの主な変更や更新点は、Java SE 8以降のバージョンのみをサポートすることです。
Scala 2.12は、2.11.xシリーズとバイナリ互換性がありません。それはまだマイルストーンビルドのみです。
ScalaにおけるOptionとは何ですか?SomeとNoneとは何ですか?ScalaにおけるOption/Some/Noneのデザインパターンとは何ですか?
Scalaでは、Optionは存在するか存在しないかのオプション値を表すために使用されます。Optionは抽象クラスです。Optionには、SomeとNoneという2つのサブクラスがあります。これらの3つのクラス(Option、Some、None)は、scala.Optionというように、すべて「scala」パッケージに定義されています。Optionは、Scalaにおける境界付きコレクションであり、要素が0個または1個含まれています。Optionが0個の要素を含んでいる場合、それはNoneです。Optionが1つの要素を含んでいる場合、それはSomeです。Someは存在する値を表すために使用され、Noneは存在しない値を表すために使用されます。例:
def get(val index: Int): Option[String]
このメソッドはListからのものと仮定しましょう。このメソッドはOption[String]という戻り値の型を持っています。Listに要素が含まれている場合、このgetメソッドはそのインデックス位置にある”Some[String]” という要素を返します。それ以外の場合は、”None”(つまり要素が存在しない)を返します。Someはケースクラスであり、Noneはオブジェクトです。両者ともケースクラス/オブジェクトであるため、パターンマッチングで非常にうまく使用できます。これら3つの定義の組み合わせは、ScalaにおけるOption/Some/Noneデザインパターンとして知られています。
ScalaでのEitherとは何ですか?ScalaでのLeftとRightは何ですか?ScalaでのEither/Left/Rightデザインパターンを説明してください。
Scalaでは、Eitherは抽象クラスです。これは2つの可能な型のうちの1つの値を表すために使用されます。Either[A,B]という2つの型パラメータを取ります。そして、正確に2つのサブタイプ、LeftとRightがあります。もしEither[A,B]がAのインスタンスを表す場合、それはLeftであることを意味します。もしBのインスタンスを表す場合、それはRightであることを意味します。これはScalaにおけるEither/Left/Rightデザインパターンとして知られています。
Java SE 8におけるScalaのOptionに相当する構造物は何ですか?ScalaにおけるOptionの利用目的は何ですか?
ScalaのOptionは、Java SE 8のOptionalと似ています。Java SE 8は、既存の値の存在または非存在を表すために新しいユーティリティクラスOptionalを導入しました。Optionalはjava.utilパッケージで利用可能です。ScalaのOptionとJava SE 8のOptionalの両方は、オプションの値を表すために使用されます。両方とも、不要なnullチェックやNullPointerExceptionを避けるために使用されます。
関数型プログラミング(FP)の利点または純粋関数の利点は何ですか?
関数型プログラミング(FP)または純粋な関数の利点は以下の通りです。
- More Modular
- Easier to understand Or Easier reason about
- Easier to test
- Less prone to bugs
- Easier to reuse
- Easier to Parallelism and generalize
RESTful WebサービスまたはREST APIを開発するための人気のあるScalaベースのフレームワークは何ですか?
RESTful Webサービスを開発するためのScalaベースのフレームワークはたくさんあります。最も人気のあるフレームワークは次の通りです。
- Play Framework
In Play, we call REST API URLs as routes. We place all routes at once place in Play framework. It is a stateless web framework to develop REST API easily.- Scalatra Framework
It is very simple and easy Scala-based web framework to develop REST API- Spray Framework
It is very concise and built on top of Akka framework so it’s better to develop REST API using Actor Model.- Lift Framework
It allows routing using Pattern Matching concept.
スカラベースのアプリケーションのREST APIドキュメンテーションを生成するための最適なフレームワークは何ですか? (Sukara bēsu no apurikēshon no REST API dokyumentēshon o seisei suru tame no saiteki na furēmāku wa nanidesu ka?)
Swagggerは、この目的において最も優れたツールです。ScalaベースのアプリケーションのREST APIドキュメンテーションを生成するための非常にシンプルでオープンソースのツールです。
- If we use Play with Scala to develop your REST API, then use play-swagger module for REST API documentation.
- If we use Spray with Scala to develop your REST API, then use spray-swagger module for REST API documentation.
Play/Scalaベースのアプリケーションで使用できる人気のあるORMフレームワークは、Javaベースのアプリケーション向けに提供されているHibernateのようなものはありますか?
Play/Scalaベースのアプリケーションには、JPAやHibernate、ToplinkなどのJavaベースのORMフレームワークと同様に、多くのORMフレームワークが利用できます。Play/Scalaベースのアプリケーションで人気のあるORMフレームワークは以下の通りです。
- Slick
- Anorm
- SORM(Scala ORM)
- Squeryl
MongoDB NoSQL データストアにデータを永続化するための最適なPlay/Scalaアプリケーション開発ツールは何ですか?
ReactiveMongoは、MongoDBのNoSQLデータストアにデータを永続化するためのPlay/Scalaアプリケーションを開発する際に最適なScalaドライバです。完全な非同期および非ブロッキングなI/O操作をサポートしています。
PlayとScalaを使用してアプリケーションを開発している人気のあるクライアントはいますか?
数千のお客様が本番環境でPlayとScalaを使用しています。以下には、積極的にPlayとScalaを利用しているより人気のあるお客様のリストがあります。
- The Guardian
- Ocado
- LuchidChart
- GOV.UK
Playフレームワークで使用するのに最適な言語は、ScalaとJavaのどちらですか?
Play 2は完全にScalaで書かれています。JavaをPlayフレームワークと一緒に使用する場合、Javaは完全なFP機能をサポートしていないため、多くの問題に直面する必要があります。Scalaは、高いスケーラビリティ、優れたパフォーマンスと並行性/並列性、低レイテンシのアプリケーションを開発するためにPlayフレームワークと組み合わせる最良のオプションです。
- Play 2 is completely written in Scala.
- It supports full FP features.
- It is more expression language than Java.
- It supports Akka Actor model very easily
- It supports some new OOP feature like Traits.
- Play’s built-in templates are developed in Scala
Scalaはどのようにして、高いスケーラビリティと高いパフォーマンスのアプリケーションの両方をサポートしていますか?
Scalaはマルチパラダイムプログラミング(OOPとFPの両方)をサポートしており、Actor Concurrency Modelを使用しているため、非常にスケーラブルでハイパフォーマンスなアプリケーションを非常に簡単に開発することができます。
PlayとScalaベースのアプリケーションを開発するための利用可能なビルドツールは何ですか?
以下の3つは、PlayとScalaアプリケーションを開発するために最も人気のあるビルドツールです。
- SBT
- Maven
- Gradle
SBTとは何ですか?PlayやScalaアプリケーションを開発するための最適なビルドツールは何ですか?
SBTはScala Build Toolの略です。これはScalaベースのアプリケーションを開発するためのシンプルなビルドツールです。多くの人々がPlayやScalaアプリケーションのためにSBTビルドツールを使用しています。例えば、IntelliJ IDEA Scalaプラグインはデフォルトでこの目的のためにSBTをビルドツールとして使用しています。
PlayとScalaベースのアプリケーションには、利用可能なユニットテスト、機能テスト、およびBDDフレームワークはありますか?
以下は、Play/Scalaベースのアプリケーションに最も人気のあるユニットテスト、機能テスト、およびBDDフレームワークです。
- Spec2
- ScalaTest
- ScalaCheck
- Mokito
PlayとScalaベースのアプリケーションには、最も優れたコードカバレッジツールは何ですか?
SCoverageは、PlayとScalaベースのアプリケーション用のコードカバレッジツールです。SCoverageはScalaコードカバレッジツールの略です。以下のビルドツールをサポートするために、3つの独立したプラグインがあります。
- SBT
- Maven
- Gradle
PlayやScalaベースのアプリケーションにおいて、最適なScalaスタイルチェッカーツールは何ですか?
Javaベースのアプリケーションに対するCheckstyleのように、ScalastyleはPlayとScalaベースのアプリケーションに対して最も優れたScalaスタイルチェッカーツールです。ScalastyleはScalaのソースコードを観察し、潜在的な問題を示します。以下のビルドツールをサポートするために、3つの独立したプラグインがあります。
- SBT
- Maven
- Gradle
以下の2つのIDEをサポートするための2つの別々のプラグインがあります。
- IntelliJ IDEA
- Eclipse IDE
PlayとScalaベースのアプリケーション開発をサポートするIDEはどれであり、その方法はどのようなものですか?
以下の2つの人気のあるIDEは、PlayとScalaベースのアプリケーション開発をサポートしています。
- IntelliJ IDEA
- Eclipse IDE
Scalaプラグインを使用してサポートしています。Eclipse IDEには、PlayとScalaベースのアプリケーション開発をサポートするScala IDE for Eclipseがあります。IntelliJ IDEAには、「Scala Plugin for IntelliJ IDEA」というプラグインがあり、「Scala、SBT、Play 2 Framework」ベースのアプリケーションをサポートしています。Playのデフォルトのユニットテストおよび機能テストフレームワークはSpec2です。Spec2フレームワークを使用すると、Play/Scalaベースのアプリケーションのテストが非常に簡単になります。Playのデフォルトのビルドツールは何ですか?Playのデフォルトのテンプレートエンジンは何ですか?Play Frameworkで使用できるデフォルトのウェブサーバーは何ですか?Playのデフォルトの組み込みテンプレートは「Twirl」です。これはScalaで開発されました。これらのテンプレートを使用することで、Play/Scalaベースのアプリケーションを非常に簡単に開発することができます。Play Frameworkのデフォルトの組み込みウェブサーバーはNetty Serverです。
なぜScalaはJavaよりも優れているのですか?ScalaのJava(Java 8)に対する利点は何ですか?Javaと比較して、Scalaの主な利点やメリットは何ですか?
Scalaは以下の追加機能をサポートしているため、Java 8よりも優れています。
- Full FP Features
- More Expression Language
- Pattern Matching
- Better support for Akka Actor Model
- Automatic resolution for Inheritance Diamond Problem with Traits
- Asynchronous and Non-blocking IO programming using Akka Framework
- Fully Reactive Streaming API
Scalaにおける匿名関数とは何ですか?Scalaにおける関数リテラルとは何ですか?匿名関数/関数リテラルのメリットは何ですか?
無名関数は関数でもありますが、関数名を持っていません。これは関数リテラルとしても知られています。Scalaにおける無名関数/関数リテラルの利点は以下のとおりです。
- We can assign a Function Literal to variable
- We can pass a Function Literal to another function/method
- We can return a Function Literal as another function/method result/return value.
高階関数(HOF)とは何ですか?
高階関数(HOF)も関数ですが、次のいずれかまたは両方を実行する関数です。
- Take other functions as arguments
- Return functions as their results
ケースクラスと通常クラスの違いは何ですか?
ケースクラスもクラスの一種ですが、通常のクラスと比較すると、以下の追加機能や利点があります。
- By default, Case-class constructor parameters are ‘val’. We don’t need to declare parameters with ‘val’.
- By default, Case-class constructor parameters become class fields.
- These methods are added automatically: toString, equals, hashCode, copy. apply and unapply.
- It automatically gets Companion object.
- No need to use ‘new’ keyword to create instance of Case Class.
- Easy to use in Pattern Matching.
これらの機能は、通常のクラスでは不可能ですが、コンパイル時にScalaコンパイラによって追加されます。
Play/Scalaスタックを使用してウェブアプリケーションを開発する利点は何ですか?
以下は、Webアプリケーションを開発するためのPlay/Scalaスタックの主な利点です。
- Open Source
Play is an Open-source free-software framework to develop web applications.- Better Productivity
Play framework’s Auto-reload feature improves Developer Productivity. No need to build, deploy and test our changes. Just do our changes and refresh the page to see our changes.- Stateless and Easy to Develop REST API
Play is HTTP based stateless model to serve web requests so it is very easy to develop REST API or RESTful Web Services.- Better Error-Handling
If we develop our web application using Play framework,it informs all errors in the browser in very useful format. It shows error message, the file location, line number where error occurred, highlighting the code-snippet to understand the error very easily.- High Performance and Better Scalability With Reactive
Play framework is developed by following Reactive design patterns and it is built on top of Netty sever to utilize Non-blocking IO Feature. Because of this feature, we can develop very highly Scalable and performance applications very easily.- Easy to Extend
Play is very flexible framework and supports developing plug-ins very easy to extend it’s features and functionality.- Highly Concurrency and Better Parallelism
As both Scala and Play supports Functional Programming, it is very easy to develop Highly Concurrency and Better Parallelism applications very easily because FP supports Immutability, Pure Functions (Functions without side-effects), Pattern Matching, Actor Model etc.- Better Reusability, Easy to Test and More Modular
As both Scala and Play supports Functional Programming, we can develop more modular and reusable applications. It is also very easy to test more modular applications.
JavaではサポートされないScalaのOOP構造は何ですか?JavaではサポートされないScalaのOOP構造は何ですか?Scalaで導入された新しいOOP構造で、Javaではサポートされていないものは何ですか?
ScalaではサポートされていないJavaのOOP構造
- There is no interface concept in Scala
- There is no Enum concept in Scala
JavaではサポートされていないScalaのOOPの構造:
- Scala Traits
- Solving Inheritance Diamond Problem automatically.
コール・バイ・ネームとは何ですか?ScalaとJavaはコール・バイ・ネームをサポートしていますか?コール・バイ・バリューとコール・バイ・ネームの関数パラメータの違いは何ですか?
コールバイネームは、メソッド/関数のパラメーターを必要な時またはアクセスする時にのみ評価します。使用しない場合は評価しません。Scalaはコールバイバリューとコールバイネームの両方の関数パラメーターをサポートしています。しかし、Javaはコールバイバリューのみをサポートしており、コールバイネームには対応していません。コールバイバリューとコールバイネームの違い:これら2つの主な違いは以下のように説明されます:
- In Call-by-name, the function parameters are evaluated only whenever they are needed but not when the function is called.
- In Call-by-value, the function parameters are evaluated when the function is called.
- In Call-by-value, the parameters are evaluated before executing function and they are evaluated only once irrespective of how many times we used them in that function.
- In Call-by-name, the parameters are evaluated whenever we access them and they are evaluated each time we use them in that function.
- Scala Syntax Differences
Call-by-value:
def myFunction(a: Int, b: Int) { }
ここではaとbはmyFunctionへのcall-by-valueパラメータです。call-by-name:
def myFunction(a: Int, b: => Int) { }
ここでは、a は値渡しのパラメータであり、b は名前渡しのパラメータとして myFunction に渡されます。
Scala言語でWebアプリケーションを開発するための人気のあるMVCフレームワークは何ですか?
Scala言語でウェブアプリケーションを開発するために利用可能な最も人気のあるMVCフレームワークは以下の通りです。
- Play Framework
- Scalatra Framework
- Spray Framework
- Lift Framework
JavaベースとScalaベースのMavenプロジェクトの構造の主な違いは何ですか?
Scalaにおける「Extractor」とは何ですか? 「Constructor」と「Extractor」の違いは何ですか? Scalaにおける「Extractor」の使用目的は何ですか?
JavaやScalaだけでなく、ほぼすべてのオブジェクト指向プログラミング言語において、コンストラクタはオブジェクトまたはクラスのインスタンスを作成(または組み立てる)するために使用されます。コンストラクタは、パラメータ(またはコンポーネント)を使用してオブジェクトを作成します。一方、エクストラクタはこれとは真逆の動作をします。Scalaでは、エクストラクタを用いてオブジェクトをそのパラメータ(またはコンポーネント)に分解(または分解)します。Scalaでは、applyメソッドがコンストラクタとして使用されます。内部的には、エクストラクタはオブジェクトをその部分(またはパラメータ)に分解するためにunapplyメソッドを使用します。Scalaでは、エクストラクタは主にパターンマッチングの概念で使用されます。パターンマッチングの概念については、後で議論します。
Scalaベースのアプリケーションにおける「???」の用途は何ですか?
この「???」は、Scalaの演算子やメソッドではありません。これは「進行中」であることを示すために使用されるマークであり、開発者がそのメソッドの実装を提供する必要があります。このメソッドはscala.PreDefクラスで以下のように定義されています。
def ??? : Nothing = throw new NotImplementedError
そのメソッドを実装せずに実行すると、以下のように「NotImplementedError」エラーが発生します。
scala> def add(a:Int, b:Int) : Int = ???
add: (a: Int, b: Int)Int
scala> add(10,20)
scala.NotImplementedError: an implementation is missing
ScalaコレクションAPIのListとStreamの主な違いを説明してください。その違いをどのように証明しますか?いつStreamを選択するのでしょうか?
ScalaのCollection APIでは、ListとStreamの両方があり、ほぼ同様に機能します。両方とも不変のコレクションです。ただし、ScalaのCollection APIにおいて、ListとStreamの間には1つの主な違いがあります:それはListの要素が熱心に評価され、Streamの要素が遅延して評価されるということです。つまり、アクセスするときに評価されます。
scala> var list1 = List(1,2,3,4)
list1: List[Int] = List(1, 2, 3, 4)
ここでは、Listオブジェクトの作成時に全ての要素が評価されることが観察されます。しかし、同じ操作をStreamに対して行うと、全ての要素を見ることはできません。最初に評価された要素のみが見え、残りの要素は以下に示すように遅延評価されます。
scala> var s1 = Stream(1,2,3,4)
s1: scala.collection.immutable.Stream[Int] = Stream(1, ?)
要素にアクセスするときにのみLazy collectionを評価したい場合、Streamを使用する方が適しています。
Scalaにおいて、::と#::の違いは何ですか?また、Scalaにおいて、:::と#:::の違いは何ですか?
Scala Collection APIにおいては、
- :: and ::: are methods available in List class.
- #:: and #::: are methods available in Stream class
- In List class, :: method is used to append an element to the beginning of the list.
scala> var list1 = List(1,2,3,4)
list1: List[Int] = List(1, 2, 3, 4)
scala> list1 = 0 :: list1
list1: List[Int] = List(0, 1, 2, 3, 4)
- In List class, ::: method is used to concatenate the elements of a given list in front of this list.
scala> var list1 = List(3,4,5)
list1: List[Int] = List(3, 4, 5)
scala> val list2 = List(1,2) ::: list1
list2: List[Int] = List(1, 2, 0, 1, 2, 3, 4)
- In Stream class, #:: method is used to append a given element at beginning of the stream. Only this newly added element is evaluated and followed by lazily evaluated stream elements.
scala> var s1 = Stream(1,2,3,4)
s1: scala.collection.immutable.Stream[Int] = Stream(1, ?)
scala> s1 = 0 #:: s1
s1: scala.collection.immutable.Stream[Int] = Stream(0, ?)
- In Stream class, #::: method is used to concatenate a given stream at beginning of the stream. Only this newly added element is evaluated and followed by lazily evaluated stream elements.
scala> var s1 = Stream(1,2,3,4)
s1: scala.collection.immutable.Stream[Int] = Stream(1, ?)
scala> val s2 = Stream(-1,0) #::: s1
s2: scala.collection.immutable.Stream[Int] = Stream(-1, ?)
- :: method works as a cons operator for List class and #:: method words as a cons operator for Stream class. Here ‘cons’ stands for construct.
- ::: method works as a concatenation operator for List class and #::: method words as a concatenation operator for Stream class.
フルスタックのScala開発者になりたい場合、どの技術スタックを学べば良いですか?
フルスタックのScala開発者になりたい場合、以下のテクノロジースタックを学ぶべきです。
- Scala 2.11.7
- Play 2.4.6 Framework
- Akka 2.3 Framework
- One Build Tool: SBT/Maven
- One JS Framework: CoffeeScript/JavaScript
- One IDE: IntelliJ IDEA 15/ Eclipse IDE 4.x
- One TDD & BDD Framework: ScalaTest,Spec2,ScalaCheck,Mockito
- Micro Services with Play and Scala
- SCoverage
- Scalastyle
- Functional Programming Design Patterns
- Machine Learning with Scala
注意:Scalaでは、エクストラクタはエクストラクタデザインパターンに従います。それを詳しく学びたい場合は、私のScalaチュートリアルを参照してください(ほとんどの投稿はこのパターンに従っています:Scala xxxx詳解、ここでxxxxはエクストラクタのような概念です)。これで「Scalaの高度な面接の質問と回答」については以上です。今後の投稿でさらにScalaの面接の質問と回答について議論します。私の投稿が気に入ったり、問題や提案がある場合は、コメントを投稿してください。