Общие:
- Почему Scala? Как ты пришёл(а) в этот язык, что нравится, что нет?
- Какими инструментами пользуешься для разработки? ОС, Редактор кода, ...
Type system:
-
Чем отличается var, val и def?
-
В чём преимущества иммутабельности?
-
Что такое Referential transparency? И как его добиться?
-
TODO scala.collections
-
case class vs abstract class vs trait = case class - параметры конструктора public val, определяет apply, unapply, toString, hashCode, equals = abstract class - может иметь параметры в конструкторе, совместим с Java = trait - может утилизировать множественное наследование, совместим с Java если не содержит реализаций
[- trait vs abstract class] = The first difference is that a class can only extend one other class, but an unlimited number of traits. = While traits only support type parameters, abstract classes can have constructor parameters. = Also, abstract classes are interoperable with Java, while traits are only interoperable with Java if they do not contain any implementation.
-
apply vs unapply? Когда что используется? = companion.apply - constructor = class.apply - function syntax = companion.unapply -- extractor, object -> constructor args
-
Как работает for в Scala под капотом? = Мапит аргументы в вызовы map/fMap/filter/withFilter
-
Во что развернётся этот for-comrehension:
for {
b <- books
a <- b.authors
if a startsWith "Martin"
} yield b.title
= books.flatMap(b => b.authors.withFilter(a => a startsWith "Martin").map(_ => b.title))
-
Для чего используются имплиситы? = as params = as converters (typeclasses)
-
Где и в каком порядке компилятор ищет определения для implicit параметров?
- First look in current scope = Implicits defined in current scope = Explicit imports = wildcard imports = Same scope in other files
- Now look at associated types in = Companion objects of a type = Implicit scope of an argument's type (2.9.1) = Implicit scope of type arguments (2.8.0) = Outer objects for nested types = Other dimensions
-
Что такое context bound? В чём отличае от implicit аргументов? = Синтаксический сахар, отличается тем что в случае cb нужно явно резолвить значение через
implicitly[X]
-
Могут ли implicit-ы быть stateful? = нет, они вычисляются только один раз
-
Context bounds =
A <: B
- A subt B,A :> B
- visa versa, = TODO -
Что такое Co/contra variance? = Определяет отношения типовых парамтеров, i.e. является ли
C[T']
подклассомC[T]
= Covarianr - нижняя граница, определяет типы выше (+) = Contravariant - верхняя граница, определяет типы ниже (-)
[- Что такое High Order Functions?] = Функции принимающие другие функции
Архитектура:
- В каких ситуациях испоьзуешь Option/Either/Try/Validated? Почему? Например:
- Поиск объекта в БД?
- Вызов throwable метода у сторонней библиотеки?
- Обращение к стороннему сервису через сеть?
- Валидация пользовательского ввода?
[- Способы достижения слабой связанности?]
- Альтернативы наследованию? = typeclasses = Композиция = Functions
[- Что такое полиморфизм?]
-
Как разруливаешь зависимости на уровне модулей приложения? Как реализуешь DI другими словами? Почему? = Manual = Factory = Implicits = Reader monad = Cake pattern = Macwire/Dagger/...
-
Future vs Actors? Когда что используешь? Почему?
- Как передать значение в Future через Promise
- ...
-
Что такое typeclass? Для чего использовал(а)? Почему? = можно реализовать класс для недоступного типа или просто без наследования и не вмешиваясь в реализацию самого класса = можно определить экземпляр составного типа, если есть экземпляры для базовых типов. Например, для Option[T] или для A / B. = можно объявить операции, работающие с нулевым количеством экземпляров данного типа. В частности, метод empty: T, или метод parse: String => T; ~= Реализация ad-hoc полиморфизма для Scala (помимо обычной перегрузки), нужны для декомпозиции на уровне поведенческих особенностей
FP:
-
Что такое Functor/Appliocative Functor/Monad? = Functor - map = Applicative - pure + ap = Monad - pure + flatMap
-
Какие из этих типов применяешь в повседневной разработке?
- Validated? = Обработка ошибок
- Reader? = Внедрение зависимостей
- State? = Внедрение зависимостей с перекрёстными параметрами
- Option/Future/Either/Try
JVM:
- Какие настройки GC будешь тюнить в первую очердь для LowLatency приложения? = Уменьшить stop-the-world, TODO
- Для batch-евой обработки данных? Почему? = Увеличить throughput, e.g. ParrallelGC
- Java Memory Model? = TODO
- Алгоритмы:
- Написать бинарный поиск
- Входной массив отсортирован
- Написать сортировку пузырьком
- LRU cache TODO
- Написать бинарный поиск
= Bubble
def bubble_sort*(a):
a_len = len(a)
for outI in range(a_len):
for inI in range(a_len - outI - 1):
if a[inI] > a[inI + 1]:
a[inI], a[inI + 1] = a[inI + 1], a[inI]
return a
def bubbleSort[T <% Ordered[T]](inputList: List[T]): List[T] = {
def sort(source: List[T], result: List[T]) = {
if (source.isEmpty) result
else bubble(source, Nil, result)
}
def bubble(source: List[T], tempList: List[T], result: List[T]): List[T] = source match {
case h1 :: h2 :: t =>
if (h1 > h2) bubble(h1 :: t, h2 :: tempList, result)
else bubble(h2 :: t, h1 :: tempList, result)
case h1 :: t => sort(tempList, h1 :: result)
}
sort(inputList, Nil)
}