Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

TechTrain 2019 - (Не)адекватное техническое интервью

A rant about technical interviews

  • Inicia sesión para ver los comentarios

  • Sé el primero en recomendar esto

TechTrain 2019 - (Не)адекватное техническое интервью

  1. 1. (Не)адекватное техническое интервью @antonarhipov
  2. 2. https://twitter.com/mxcl/status/608682016205344768 “Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck off.” Max Howell @mxcl
  3. 3. Приходит к нам, значит, Ерлангист. А мы ему кусок кода на С++, "где-то тут критический баг, поправь. Два часа тебе на изучение JVM". https://www.facebook.com/aleksey.shipilev/posts/10154469128968049?pnref=story
  4. 4. https://www.facebook.com/aleksey.shipilev/posts/10154469128968049?pnref=story Приходит к нам, значит, Ерлангист. А мы ему кусок кода на С++, "где-то тут критический баг, поправь. Два часа тебе на изучение JVM". На самом деле, у нас в проектах ramp-up даже крутейших инженеров занимает от 3 месяцев. [….] Никто в своём уме не будет думать, что чувак сможет правильно что-то починить, если он не знает кодобазы, прошлого опыта, и проч.
  5. 5. https://www.facebook.com/aleksey.shipilev/posts/10154469128968049?pnref=story Приходит к нам, значит, Ерлангист. А мы ему кусок кода на С++, "где-то тут критический баг, поправь. Два часа тебе на изучение JVM". На самом деле, у нас в проектах ramp-up даже крутейших инженеров занимает от 3 месяцев. [….] Никто в своём уме не будет думать, что чувак сможет правильно что-то починить, если он не знает кодобазы, прошлого опыта, и проч.
  6. 6. Кого собеседуем? И зачем?
  7. 7. 5 минутСвоё мнение о кандидате вы составляете за первые 5 минут общения. Остальное время вы используете лишь для того, чтобы убедиться, или разубедиться, в своём мнении.
  8. 8. Какие вопросы бывают?
  9. 9. Какие вопросы бывают? Алгоритмические задачки
  10. 10. Какие вопросы бывают? Алгоритмические задачки Вопросы на знание ЯП ( Java )
  11. 11. Какие вопросы бывают? Алгоритмические задачки Вопросы на знание ЯП ( Java ) Вопросы на знание стандартной библиотеки ( JDK )
  12. 12. Какие вопросы бывают? Алгоритмические задачки Вопросы на знание ЯП ( Java ) Вопросы на знание стандартной библиотеки ( JDK ) Вопросы на знание фреймворков ( Spring )
  13. 13. Какие вопросы бывают? Алгоритмические задачки Вопросы на знание ЯП ( Java ) Вопросы на знание стандартной библиотеки ( JDK ) Вопросы на знание фреймворков ( Spring )
  14. 14. Какие вопросы бывают?
  15. 15. Какие вопросы бывают? Вопросы о дизайне ( как бы ты сделал… )
  16. 16. Какие вопросы бывают? Вопросы о дизайне ( как бы ты сделал… ) Общие вопросы по программированию
  17. 17. Какие вопросы бывают? Вопросы о дизайне ( как бы ты сделал… ) Общие вопросы по программированию Вопросы о предыдущем опыте
  18. 18. This slide is intentionally left blank
  19. 19. Инверсия бинарного дерева
  20. 20. Инверсия бинарного дерева 4 72 9631
  21. 21. 4 72 9631 4 27 1369 Инверсия бинарного дерева
  22. 22. leetcode.com
  23. 23. public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } }
  24. 24. public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public class Solution { public TreeNode invertTree(TreeNode root) { if(root == null){ return root; } TreeNode node = new TreeNode(root.val); node.left = invertTree(root.right); node.right = invertTree(root.left); return node; } }
  25. 25. public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public class Solution { public TreeNode invertTree(TreeNode root) { if(root == null){ return root; } TreeNode node = new TreeNode(root.val); node.left = invertTree(root.right); node.right = invertTree(root.left); return node; } }
  26. 26. public class Solution { public TreeNode invertTree(TreeNode root) { if (root == null) { return null; } final Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while(!queue.isEmpty()) { final TreeNode node = queue.poll(); final TreeNode left = node.left; node.left = node.right; node.right = left; if(node.left != null) { queue.offer(node.left); } if(node.right != null) { queue.offer(node.right); } } return root; } }
  27. 27. Напишите функцию для реверса строки
  28. 28. Найдите общего предка для двух вершин в бинарном дереве Напишите функцию для реверса строки
  29. 29. Найдите общего предка для двух вершин в бинарном дереве Напишите функцию для реверса строки Реализуйте BFS и DFS для обхода дерева, дайте оценку времени исполнения и потребления памяти …
  30. 30. Найдите общего предка для двух вершин в бинарном дереве Напишите функцию для реверса строки Реализуйте BFS и DFS для обхода дерева, дайте оценку времени исполнения и потребления памяти … Что мы пытаемся понять задавая такие вопросы?
  31. 31. Create a function that takes a string as a parameter. This function will return an integer calculated with the number of occurrence of characters in String used as parameter: Magic number:
  32. 32. Create a function that takes a string as a parameter. This function will return an integer calculated with the number of occurrence of characters in String used as parameter: Magic number: result = number of 'a' * number of 'p' or 'r' or 't' or 'f' + number of 'e' * number of 'n' or 'm' - number of ' ' * number of 'a' + number of 'n' or 'm'
  33. 33. Create a function that takes a string as a parameter. This function will return an integer calculated with the number of occurrence of characters in String used as parameter: Magic number: magicNumber("i love java"); // returns -4 result = number of 'a' * number of 'p' or 'r' or 't' or 'f' + number of 'e' * number of 'n' or 'm' - number of ' ' * number of 'a' + number of 'n' or 'm'
  34. 34. result = number of 'a' * number of 'p' or 'r' or 't' or 'f' + number of 'e' * number of 'n' or 'm' - number of ' ' * number of 'a' + number of 'n' or 'm' Что такое “number of”? Как это считать??
  35. 35. А так и задумано!
  36. 36. Сначала подумай
  37. 37. Сначала подумай Подумай ещё!
  38. 38. Сначала подумай Подумай ещё! Спроси!
  39. 39. Сначала подумай Подумай ещё! Спроси! Переспроси! Может быть уже не надо делать
  40. 40. “Найдите самую релевантную комбинацию для поиска из трёх слов.”
  41. 41. “Найдите самую релевантную комбинацию для поиска из трёх слов.”
  42. 42. 2 4 17 44 71 119 554 661 669 771 818 6 8 19 21 25 41 52 59 111 255 414 7 9 33 37 39 55 57 99 101 241 340 “Найдите самую релевантную комбинацию для поиска из трёх слов.”
  43. 43. 2 4 17 44 71 119 554 661 669 771 818 6 8 19 21 25 41 52 59 111 255 414 7 9 33 37 39 55 57 99 101 241 340 “Найдите самую релевантную комбинацию для поиска из трёх слов.”
  44. 44. 2 4 17 44 71 119 554 661 669 771 818 6 8 19 21 25 41 52 59 111 255 414 7 9 33 37 39 55 57 99 101 241 340 “Найдите самую релевантную комбинацию для поиска из трёх слов.”
  45. 45. 2 4 17 44 71 119 554 661 669 771 818 6 8 19 21 25 41 52 59 111 255 414 7 9 33 37 39 55 57 99 101 241 340 “Найдите самую релевантную комбинацию для поиска из трёх слов.”
  46. 46. 2 4 17 44 71 119 554 661 669 771 818 6 8 19 21 25 41 52 59 111 255 414 7 9 33 37 39 55 57 99 101 241 340 “Найдите самую релевантную комбинацию для поиска из трёх слов.”
  47. 47. 2 4 17 44 71 119 554 661 669 771 818 6 8 19 21 25 41 52 59 111 255 414 7 9 33 37 39 55 57 99 101 241 340 “Найдите самую релевантную комбинацию для поиска из трёх слов.”
  48. 48. 2 4 17 44 71 119 554 661 669 771 818 6 8 19 21 25 41 52 59 111 255 414 7 9 33 37 39 55 57 99 101 241 340 “Найдите самую релевантную комбинацию для поиска из трёх слов.”
  49. 49. 2 4 17 44 71 119 554 661 669 771 818 6 8 19 21 25 41 52 59 111 255 414 7 9 33 37 39 55 57 99 101 241 340 “Найдите самую релевантную комбинацию для поиска из трёх слов.”
  50. 50. 2 4 17 44 71 119 554 661 669 771 818 6 8 19 21 25 41 52 59 111 255 414 7 9 33 37 39 55 57 99 101 241 340 “Найдите самую релевантную комбинацию для поиска из трёх слов.”
  51. 51. 2 4 17 44 71 119 554 661 669 771 818 6 8 19 21 25 41 52 59 111 255 414 7 9 33 37 39 55 57 99 101 241 340 “Найдите самую релевантную комбинацию для поиска из трёх слов.”
  52. 52. 2 4 17 44 71 119 554 661 669 771 818 6 8 19 21 25 41 52 59 111 255 414 7 9 33 37 39 55 57 99 101 241 340 “Найдите самую релевантную комбинацию для поиска из трёх слов.”
  53. 53. 2 4 17 44 71 119 554 661 669 771 818 6 8 19 21 25 41 52 59 111 255 414 7 9 33 37 39 55 57 99 101 241 340 Вопрос: когда поиск остановится? “Найдите самую релевантную комбинацию для поиска из трёх слов.”
  54. 54. 2 4 17 44 71 119 554 661 669 771 818 6 8 19 21 25 41 52 59 111 255 414 7 9 33 37 39 55 57 99 101 241 340 “Найдите самую релевантную комбинацию для поиска из трёх слов.” Вопрос: когда поиск остановится? Кто должен спросить этот вопрос?
  55. 55. ¯_(ツ)_/¯
  56. 56. https://youtu.be/XKu_SEDAykw
  57. 57. FizzBuzzWrite a program that prints the numbers from 1 to 100. But for multiples of three print "Fizz" instead of the number and for the multiples of five print "Buzz". For numbers which are multiples of both three and five print "FizzBuzz".
  58. 58. Вопросы на знание ЯП (Java edition) Классика жанра
  59. 59. System.out.println(10/3);
  60. 60. equals() и hashCode()
  61. 61. В чём разница между абстрактным классом и интерфейсом?
  62. 62. Параметры методов в Java передаются по значению или по ссылке?
  63. 63. class Foo { void boo() { class Bar {} Bar b = new Bar(); System.out.println(b); } }
  64. 64. class Foo { void boo() { class Bar {} Bar b = new Bar(); System.out.println(b); } } Компилируется ли это код?
  65. 65. class Foo { void boo() { class Bar {} Bar b = new Bar(); System.out.println(b); } } Компилируется ли это код? Зачем писать такой код?
  66. 66. class Foo { void boo() { class Bar {} Bar b = new Bar(); System.out.println(b); } } Компилируется ли это код? Зачем писать такой код? Во что компилируется такой код?
  67. 67. http://arhipov.blogspot.com.ee/2015/11/finalfinallyfinalize.html final finally finalize
  68. 68. public static int foo() { try { return 0; } finally { return 42; } } finally
  69. 69. public static int foo() { try { throw new RuntimeException(); } finally { return 42; } } finally
  70. 70. public static void main(String[] args) { try { throw new NullPointerException("NPE 1"); } catch (NullPointerException e) { throw new NullPointerException("NPE 2"); } finally { return; } } finally
  71. 71. Singleton - instance - Singleton + getInstance(): Singleton 0..1
  72. 72. public class Singleton { private static Singleton INSTANCE = null; private Singleton() {} public static Singleton getInstance() { if(INSTANCE == null) { INSTANCE = new Singleton(); } return instance; } }
  73. 73. public class Singleton { private static Singleton INSTANCE = null; private Singleton() {} public static Singleton getInstance() { if(INSTANCE == null) { INSTANCE = new Singleton(); } return instance; } }
  74. 74. public class Singleton { private static Singleton INSTANCE = null; private Singleton() {} public static Singleton getInstance() { if(INSTANCE == null) { INSTANCE = new Singleton(); } return instance; } }
  75. 75. public class Singleton { private static Singleton INSTANCE = null; private Singleton() {} public static Singleton getInstance() { if(INSTANCE == null) { INSTANCE = new Singleton(); } return instance; } }
  76. 76. public class Singleton { private static Singleton INSTANCE = null; private Singleton() {} public static Singleton getInstance() { if(INSTANCE == null) { INSTANCE = new Singleton(); } return INSTANCE; } }
  77. 77. public class Singleton { private static Singleton INSTANCE = null; private Singleton() {} public static Singleton getInstance() { if(INSTANCE == null) { synchronized(Singleton.class){ INSTANCE = new Singleton(); } } return INSTANCE; } }
  78. 78. public class Singleton { private static volatile Singleton INSTANCE = null; private Singleton() {} public static Singleton getInstance() { if(INSTANCE == null) { synchronized(Singleton.class){ INSTANCE = new Singleton(); } } return INSTANCE; } }
  79. 79. public class Singleton { private static volatile Singleton INSTANCE = null; private Singleton() {} public static Singleton getInstance() { if(INSTANCE == null) { synchronized(Singleton.class){ INSTANCE = new Singleton(); } } return INSTANCE; } }
  80. 80. public class Singleton { private static volatile Singleton INSTANCE = null; private Singleton() {} public static Singleton getInstance() { if(INSTANCE == null) { synchronized(Singleton.class){ INSTANCE = new Singleton(); } } return INSTANCE; } }
  81. 81. Горец…
  82. 82. Горец… …и…
  83. 83. Горец… …и… …ещё один горец
  84. 84. Горец… …и… …ещё один горец Помните о разных загрузчиках, когда используете синглтоны!
  85. 85. Как сериализовать синглтон?
  86. 86. Зачем?!
  87. 87. public enum Singleton { INSTANCE }
  88. 88. This slide is intentionally left blank
  89. 89. “What would you add to Java? “
  90. 90. “What would you add to Java? “ “How would you implement it?”
  91. 91. Вопросы о JDK
  92. 92. Что такое WeakReference?
  93. 93. Как получить результат вызова хранимой процедуры (БД)?
  94. 94. Как получить результат вызова хранимой процедуры (БД)? String proc = "{call proc(?,?)}"; stmt = con.prepareCall(proc); stmt.setInt(1, 10); stmt.registerOutParameter(2, Types.VARCHAR); stmt.executeUpdate(); String result = stmt.getString(2);
  95. 95. Как получить результат вызова хранимой процедуры (БД)? String proc = "{call proc(?,?)}"; stmt = con.prepareCall(proc); stmt.setInt(1, 10); stmt.registerOutParameter(2, Types.VARCHAR); stmt.executeUpdate(); String result = stmt.getString(2);
  96. 96. Puzzlers
  97. 97. Map<String, String> m1 = stringsMap(); // {a=aaaaa, b=bbbbb} Map<String, String> m2 = numbersMap(); // {a=11111, b=22222} m2.replaceAll(m1::put); System.out.println(m1); System.out.println(m2); Java 8 Puzzlers: The Strange, the Bizarre, and the Wonderful
  98. 98. 1) Мапы поменяются местами 2) Обе мапы будут иметь содержание как в м2 3) Обе мапы будут иметь содержание как в м1 4) Этот код не компилируется! Map<String, String> m1 = stringsMap(); // {a=aaaaa, b=bbbbb} Map<String, String> m2 = numbersMap(); // {a=11111, b=22222} m2.replaceAll(m1::put); System.out.println(m1); System.out.println(m2); Java 8 Puzzlers: The Strange, the Bizarre, and the Wonderful
  99. 99. Map<String, String> m1 = stringsMap(); // {a=aaaaa, b=bbbbb} Map<String, String> m2 = numbersMap(); // {a=11111, b=22222} m2.replaceAll(m1::put); System.out.println(m1); // {a=11111, b=22222} System.out.println(m2); // {a=aaaaa, b=bbbbb} Java 8 Puzzlers: The Strange, the Bizarre, and the Wonderful 1) Мапы поменяются местами 2) Обе мапы будут иметь содержание как в м2 3) Обе мапы будут иметь содержание как в м1 4) Этот код не компилируется!
  100. 100. Вопросы о дизайне (System design questions)
  101. 101. Как реализовать сокращатель ссылок?
  102. 102. А теперь всё вместе!
  103. 103. Никакие результаты интервью, тестовых заданий, энциклопедические знания не показывают,
  104. 104. Никакие результаты интервью, тестовых заданий, энциклопедические знания не показывают, КАК ЭТОТ ЧЕЛОВЕК БУДЕТ РАБОТАТЬ

×