Еще до нового года я согласился уехать из Крыма в Днепропетровск и с того момента началось мое самое затянутое трудоустройство на работу. Раскрывать что за компания я не стану, но коротко оговорюсь что проект десктопный на RCP и Swing.
содержание
Истоки
Началось все с того что еще за пару месяцев до нового года мне регулярно и назойливо названивал HR, но я был слишком занят частными проектами да и как раз собрал свою команду готовую участвовать в НЕ коммерческом «производстве» поэтому было не до рабовладельческих компаний. Но как говорится «упорство и труд все перетрут» — я плавно начал соглашаться но сказал что давно не ходил на собеседования, фриланс вполне хорошо кормит, в результате попросил 2 недели на подготовку. Так же в коротко рассказали как будут развиваться события в отношении собеседования, переезда в Днепропетровск и ответила на ряд моих вопросов.
Для получения работы в компании нужно:
- Пройти интервью с сайт менеджером
- Пройти интервью с проджект менеджером
- Пройти техническое интервью
- Решить 3 задачи на время которые вышлет кастомер
Через 2 недели мы созвонились и договорились о собеседовании с сайт менеджером.
1 |
(14 дней на подготовку) |
Собеседование с сайт менеджером
Через несколько дней позвонил мне Сергей (сайт менеджер) очень подробно рассказал о предстоящем проекте . На проекте уже работает свыше 100 человек и там очень много много графиков. После проверил мой разговорный английский и в общем по его словам все прошло хорошо. В общей сложности общение заняло около 60 минут.
После я вновь связался с HR и она назначила техническое интервирование еще примерно через неделю. Что касается PM’a общения с сайт менеджером было достаточно, хотя думаю просто у первого не было времени =)
Беседы с ПМмом не будет, так как она уже была. Скорее всего отправят твое резюме сразу на заказчика)
1 |
+7 дней готовим Swing & Concurrency |
Техническое интервирование
Прошла неделя и мне позвонил Юрий, на сколько я понял он тимлид но не с той команды куда меня должны были назначить. Ровно час мы играли с ним в игру «вопрос-ответ» ;). Обсуждались следующие темы:
- Области памяти JVM?
- Eden Space[Идэн спэйс] (heap) – в этой области выделятся память под все создаваемые из программы объекты. Большая часть объектов живет недолго (итераторы, временные объекты, используемые внутри методов и т.п.), и удаляются при выполнении сборок мусора это области памяти, не перемещаются в другие области памяти. Когда данная область заполняется (т.е. количество выделенной памяти в этой области превышает некоторый заданный процент), GC выполняет быструю (minor collection) сборку мусора. По сравнению с полной сборкой мусора она занимает мало времени, и затрагивает только эту область памяти — очищает от устаревших объектов Eden Space и перемещает выжившие объекты в следующую область.
- Survivor Space[Совайвор спэйс] (heap) – сюда перемещаются объекты из предыдущей, после того, как они пережили хотя бы одну сборку мусора. Время от времени долгоживущие объекты из этой области перемещаются в Tenured Space.
- Tenured[Тэнйод] (Old) Generation (heap) — Здесь скапливаются долгоживущие объекты (крупные высокоуровневые объекты, синглтоны, менеджеры ресурсов и проч.). Когда заполняется эта область, выполняется полная сборка мусора (full, major collection), которая обрабатывает все созданные JVM объекты.
- Permanent Generation (non-heap) – Здесь хранится метаинформация, используемая JVM (используемые классы, методы и т.п.). В частноси
- Code Cache (non-heap) — эта область используется JVM, когда включена JIT-компиляция, в ней кешируется скомпилированный платформенно — зависимый код.
- Как работает GC? — http://habrahabr.ru/post/112676/
- Что такое weakreference? — слабая ссылка
- Какие еще бывают ссылки? — strong, soft, weak, phantom
- BigCopy SmallCopy — глубокое / не губокое копирование
- Вычислительная сложность алгоритмов — зависимости объёма работы, выполняемой некоторым алгоритмом, от размера входных данных
- Exception cheked/ uncheked — Runtime exceptions и Error и их подклассы называют uncheked — проверять не обязательно. Но жестких правил нет
- Зачем spring оборачивает checked эксепшены в рантайм эксепшены
- Thread local — использование ThreadLocal имеет смысл, когда вам необходимо хранить экземпляры переменной для каждого потока.
- Что такое Pool Thread? Как он работает? — ответил чисто интуитивно
- Volotile — Определение переменной с ключевым словом volatile(«изменчивый») означает, что значение переменной будет изменяться несколькими потоками.
- Use case для Volotile(где используется)
- Rentrantlock vs synhronised
- event dispatcher
- invokelater()
- Паттерн Proxy(заместитель)
- Уровни изоляции транзакций
- Что такое Сплаин(алгоритм)
- Интерполяция, экстраполяция
- Как прервать код в блоке finally()? — System.exit(0)
Часть вопросов к сожалению я не запомнил, но было интересно. Как бы там ни было подобные собеседования дают отличную встряску серым будням и показывают проблемы которые стоит закрыть или подтянуть.
Вновь связавшись с HR она сообщила
Григорий парень способный и сообразительный, я ожидаю от него быстрого прогресса.
Ответы не всегда были полными и исчерпывающими, есть пробелы, но кандидат скорее понравился.
С учетом его сравнительно небольшого опыта программирования на Java уровень знаний достаточно хороший.
Понравилось умение «держать удар» на сложных вопросах, ход рассуждений..
Ну не поспоришь отвечал я не идеально ))) но запрос на меня ушел кастомеру за бугор, ждем ответа — это было честно говоря не выносимо… отправили все
Мучительное ожидание
Итак, запрос на меня ушел 24 декабря 2013 года =)
30-го декабря я поинтересовался как дела но результат оставался не изменчив, HR дала знать что у них отдых до 8-го но PM выйдет на работу 2-го так что если что свяжется со мной.
8 января — …без изменений
10 января — …без изменений
13 января — …без изменений
15 января — …без изменений
И вот 21 января пришел ответ..
Далее немного математики…
с 24.10 по 21.01 = 29 дней
29+7+14 = 50 дней.. поэтому я и сказал что это самое длинное мое трудоустройство…
Решить 3 задачи на время которые вышлет кастомер
Прислали тест на 110 минут 3 задачи.
1 задача в целом и стала решающим звеном. Вместо того что бы оставить самое сложно на потом упор был сделан именно в ее сторону. Увы 110 минут исчерпали себя быстрее 🙁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
public class Solution { int solution(boolean[][] A) { int N, M; N = A.length; if (N > 0) { M = A[0].length; } else return 0; if (M == 0) return 0; int x = 0; int y = 0; int L = 1; while (fit(A, x, y, L)) L++; List<Square> positions = new ArrayList<Square>(); positions.add(new Square(x, y, L)); int minL = 0; while (positions.size() > 0) { for (int i = positions.size()-1; i >= 0; i--) { Square pos = positions.get(i); if ((pos.x == (N - pos.L)) && (pos.y == (M - pos.L))) { // finished! if (minL < pos.L) { minL = pos.L; } positions.remove(i); continue; } boolean moveDown = canMoveDown(A, pos); boolean moveRight = canMoveRight(A, pos); if (moveDown) { Square newPoint = new Square(pos); newPoint.x++; positions.add(newPoint); } if (moveRight) { Square newPoint = new Square(pos); newPoint.y++; positions.add(newPoint); } if (moveDown || moveRight) { positions.remove(i); continue; } if (!moveDown && !moveRight) { pos.L--; if (pos.L ==0) { positions.remove(i); continue; } } } } return minL; } boolean fit(boolean[][] A, int x, int y, int L) { for (int i = x; i < x + L; i++) { for (int j = y; j < y + L; j++) { if ((i>=A.length) || (j>=A[i].length) || !A[i][j]) return false; } } return true; } boolean canMoveDown(boolean[][] A, Square pos) { return fit(A, pos.x + 1, pos.y, pos.L); } boolean canMoveRight(boolean[][] A, Square pos) { return fit(A, pos.x, pos.y + 1, pos.L); } public static void main(String[] args) { boolean[][] A = { {true, true, true, false}, {true, true, true, false}, {true, true, true, false}, {true, true, true, true}, {false, true, true, true}, {true, false, true, true} }; System.out.println(new Solution().solution(A)); boolean[][] B = { {true,true, false, false}, {true,false, false, false}, {false,true, false, true} }; System.out.println(new Solution().solution(B)); boolean[][] C = { {true} }; System.out.println(new Solution().solution(C)); boolean[][] D = { {true, false, true, false}, {true, false, true, false}, {true, false, true, false}, {true, false, true, true}, {true, true, true, true}, {false, true, true, true} }; System.out.println(new Solution().solution(D)); boolean[][] E = { {true, true, true, false}, {true, true, true, true}, {true, true, true, true}, {true, false, true, true}, {true, true, true, true}, {false, true, true, true} }; System.out.println(new Solution().solution(E)); } } class Square { int x; int y; int L; Square(int x, int y, int L) { this.x = x; this.y = y; this.L = L; } Square(Square pos) { x = pos.x; y = pos.y; L = pos.L; } } |
2 задача оказалась куда легче в перекуре была написана за пару минут
1 2 3 4 5 6 7 8 9 |
public int solution(int n) { long i = 1; int result = 0; while(n >= i){ i *= 5; result += n/i; } return result; } |
Ну и последняя.. честно все проще некуда.. нужно было всего лишь внимательно пересмотреть код и переставить скобку)))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public int solution(int[] s) { int max_sum = 0; int current_sum = 0; boolean positive = false; int n = s.length; for (int i = 0; i < n; ++i) { int item = s[i]; if (item < 0) { if (max_sum < current_sum) { max_sum = current_sum; current_sum = 0; } } else { positive = true; current_sum += item; } } if (current_sum > max_sum) { max_sum = current_sum; } if (positive) { return max_sum; } return -1; } |
Заключение
В общем как бы там ни было считаю что тесты я завалил, возможно кастомер еще и одумается, но я бы себя не взял)))) Так что можно смело продолжать заниматься своими проектами и не лезть в «большой бизнес» 😉
Что касается пунктуальности затянувшегося собеседования то это конечно же компании можно ставить огромный минус. Если бы не патриотические наклонности давно бы ушел как поступил мой коллега Евгений в Киев, да и предложения всегда есть.. все дело в не желании куда-то ехать 🙂 Тут можно поставить огромный плюс HR компании =)
Ну а я в ближайшее время планирую написание отдельной статьи по каждому вопросу оговоренному в интервью.
P.S. Вы не поверите, но мне пришел оффер о_0, собираюсь в Днепропетровск
Привет,
У меня была последняя задача. Я сломал глаза, но не смог найти баг. Написал десяток тестов, все работает как часы. Какой набор данных не работает?
Смотрю на картинку и код, что ты запостил и не могу найти разницу 🙂
Привет.
Вполне вероятно что на скрине я выложил не задачу, а самое решение. Постараюсь найти изначальную задачу и выложить.
Помню что там была кавычка из-за которой оно не обнуляло текущую сумму, если она не была больше прошлого максимума и соответственно следующий слайс считался не с «0» с а предидущей суммы. Но увы подлинник найти не смог
Дык точно! current_sum то же остается если нашелся отрицательный, но сумма меньше макс!