Skip to content

Instantly share code, notes, and snippets.

@kell18
Last active February 16, 2018 14:30
Show Gist options
  • Save kell18/26f42aff859a60951cec7b0fc470cf8c to your computer and use it in GitHub Desktop.
Save kell18/26f42aff859a60951cec7b0fc470cf8c to your computer and use it in GitHub Desktop.

QuestionsOnInterview

Вопросы по Scala Middle+

Общие:

  • Почему 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 параметров?

    1. First look in current scope = Implicits defined in current scope = Explicit imports = wildcard imports = Same scope in other files
    2. 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)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment