суббота, 12 ноября 2011 г.

Korean Games Conference 2011

Во вторник удалось вырваться с работы на один день и посетить Корейскую конференцию разработчиков игр (KGC 2011). Как все-таки классно в Корее с транспортом, утром поехал в другой конец страны, послушал доклады, вечером уже приехал домой.

Скажу сразу, ожидал большего. Но это лучше, чем ничего – в ближайшее время посетить GDC вряд ли получится.

Главный спонсор конференции была копания Havok, так что повсюду висели плакаты и мониторы, демонстрирующие технологии ирландской компании, известная своим физическим движком, и с недавних пор (после покупки Trinigy) предоставляющая и игровой движок. Возле стенда Havok можно было испробовать симулятор бульдозера, разработанный с использованием Havok и Vision (движок от Trinigy) безымянной американской фирмой для Caterpillar.

Ниже опишу доклады, который я посетил за день и мои впечатления:

  • The future of AI in Dynamic Worlds (Ross O’Dwyer, Havok)

Было довольно интересно, даже не смотря на то, что половина демок просто напросто не запускалось. Понравилась технология динамического создания Navigation Mesh'а с учетом физических объектов на стороне сервера. Navigation Mesh можно просматривать и редактировать через редактор.

  • Building 60 minutes build in 1 minute (Hong Kee Gang)

Это был мой фейл. Название было довольно заманчиво, особенно если учесть что билд нашего продукта занимает примерно 60 минут J. Ожидал распараллеливание билда на нескольких физических машинах, всякие там Texture Baking фабрики и т.д. В итоге лекция оказалась о разнице компиляции проекта с precompiled header и без него, и почему желательно использовать forward declaration классов. Посидев 10 минут , ушел.

  • Gamebryo! What do you expect for the next? (Ben Mowery, Gamebase USA)

Изначально не планировал пойти на этот доклад, потому что он был в одно время с докладом о билде. Но, по выше упомянутым причинам, послушал его. Правда, ничем интересным о не блистал: докладчик был нудноватый, Gamebryo смотрелся уныло на фоне Havok+Vision, которую я лично считаю очень сильной, и того же Unity. Время покажет.

  • Dynamic Sky-Dome System (Igor Lobanchikov, Confetti Special Effect, Minsk)

Не посетить лекцию почти соотечественника было бы кощунством. Нифига не понятно, но технология выглядит красиво. После доклада удалось мило побеседовать с Игорем.

Как оказалось, Игорь даже работал в Киеве в GC World над S.T.A.L.K.E.R. и одно время хотел податься в Crytek Киев, но что-то не срослось, и он стал удаленно работать с Вольфгангом Энгелем.

«- Игорь, я слышал у вас в Белоруссии кризис.

- Нет, вы что, у нас полный пиздец.»

Рассказал, что стало тяжело жить. Но уезжать за границу желания нет.

  • Dynamic Global Illumination with a large number of Light Sources (Worfgang Engel, Confetti Special Effect)

Много слышал о Вольфганге, даже книжку его читал. Работа, легшая в основу доклада, была вдохновлена разработками Crytek'а на эту тему.

  • Rendering Tech of Warhammer 40,000: Space Marine (Daniel Barrero, Pope Kim, Relic Entertainment dba THQ, Canada)

Мега презентация. Рассказывалось о применениях техники deffered shading в проекте Warhammer 40 000: Space Marine. О deffered shading очень многое уже сказано различными игровыми компаниями. Но эти ребята довольно интересно рассказали о практической реализации этой техники. Понравился подход к решению задач, который ставил научность и реалистичность на второе место, «Главное, чтобы эффективно работало и художники были рады». Авторы представили много неаналитических решений (хаков), которые они применяли в различных ситуациях, чтобы преодолеть лимиты железа Xbox'а и PS3. Было весело.

«А вот тут видите, какие у нас тени классные? На самом деле, это – не тени, а просто текстура такая»

Понравился плагин для Photoshop, который позволял художникам заниматься коррекций цвета сцены. Художник делал скриншот в игре, применял различные фильтры на него в фотошопе, а потом нажимал «магическую кнопку». После чего цвета экспортировались из отфотошопенной картинки, и на их основе создавалась таблица для коррекции цвета.

Прослушав доклад, мой прошлый интерес к компьютерной графике, в особенно к техникам отрисовки сцены, вернулся. Думаю, на днях почитать что-то по теме.


Хочу также упомянуть о переводчиках, думаю, редко им дается переводить синхронно тексты с таким числом технических терминов. Нередко они просто не успевали за докладчиками и переводили, как попало. Но все же хорошо, что они были.

пятница, 14 октября 2011 г.

Структурное программирование

One of the most powerful mechanisms for
program structuring [...] is the block and
procedure concept. [...]
A procedure which is capable of giving rise to
block instances which survive its call will be
known as a class; and the instances will be
known as objects of that class. [...]
A call of a class generates a new object of that
class.

Ole-Johan Dahl and C A R Hoare
"Hierarchical Program Structures" in Structured Programming


А я думал, что "структурное программирование" - это goto.

Рекомендую посмотреть интересную презентацию "It Is Possible to Do Object-Oriented Programming in Java".

суббота, 8 октября 2011 г.

Что творится вокруг офиса

Давно в школе директриса рассказывала нам про Корею: "В Корее так все прилично - на улицах не целуются, девушки не надевают мини-юбки, высокие нравы,...". Тогда конечно, я не сильно в это верил, и пожив в Корее убедился, что это не совсем так. Но в марте этого года, когда я устроился на работу, заметил вещи, которые меня немного шокировали.

Местоположение нашего офиса очень интересное: вокруг нас расположено штук десять борделей. Конечно, они не называются "борделями", а там типа "массаж", "караоке" и даже "парикмахерская", но те, кто гулял возле офиса в вечернее время, сразу заметили бы реальное назначение этих мест. На карте обозначил примерные места заведений.


Самое интересное, что южнее находится огромная католическая церковь. Полез в гугл и узнал, что по корейскому законодательству на каждые 10 борделей в районе должна приходится одна церковь. Ну, чтобы постояльцам было удобнее замаливать грехи.

Так, после очередного тяжелого рабочего дня иду домой, а навстречу жрицы любви спешат на работу. Стоит также упомянуть, что клумбы и дорожка на автобусную остановку просто усыпана рекламными буклетами, на которых красотки в нижнем белье заманивают посетить выше упомянутые заведения.

Недавно рассказали интересный факт: во многих корейских компаниях принято, что босс должен периодически водить своих подчиненных по борделям. В нашей компании такого нет. Думаю, немецкой бухгалтерии было бы интересно увидеть в отчетах "Потрачено Эн баксов на шлюх".

Вообще, проституция в Корее уходит корнями далеко в историю. Из моих поверхностных знаний могу извлечь только немного фактов. Когда Япония оккупировала Корею, женское население массово превращались в секс рабынь. В награду за помощь Южной Корее в войне против Севера, Ассашайские солдатам привезли большое количество проституток в награду. (И тут во всем виновата Америка).

Можно почерпнуть много фактов из википедии. В статье вообще фигурируют фантастические числа: в 2007 году в стране было произведено 94 000 000 sex trade транзакций. Это, что получается, по 261 111-ой транзакции в день!?

Amazing Korea.

суббота, 29 января 2011 г.

Собеседование в Google Korea

26 января у меня было собеседование с гуглом. Этот пост стоило назвать "How I sucked on my interview with Google", но пожалуй воздержусь.

Собеседование было назначено на 3 часа и проходило по телефону, с написанием кода в Google Docs, длительность - 50 минут. В 2:50 я уже сидел за ноутбуком и ожидал звонка, предварительно сделав несколько десятком кругом по комнате, чтобы снять напряжение.

Примерно в три Brian (сотрудник гугла, который проводил собеседование) написал мне в Google Docs и мы начали.

Сначала были различные вопросы:
- Рассказать о каком-нибудь проекте, на котором я работал.
- Над чем мне нравится работать?
- Почему приехал в Корею?

Потом перешли к программистскими задачкам, точнее успели разобрать только одну (Epic FAIL).

Задачка была следующая:
- Есть отсортированный список слов неизвестного размера. Единственный доступ к этому списку осуществляется с помощью API функции getNthWord(). Написать функцию hasWord().

Я сразу сказал, что тут надо модифицировать бинарный поиск и начал думать как. Brian попросил меня произносить вслух свои рассуждения. В режиме диалога мы пришли к кое какой версии решение и я начал кодить.

Единственная мысль, которая лезла мне в голову и упорно блокировала вход другим, была "О Боже, у меня собеседование с гуглом".

Сначала, я пошел вообще не в тем дебри, и написал откровенную фигню.
Затем, после "Чувак, это чета не сильно похоже на бинарный поиск, где вообще range (low, high)?", я решил написать обычный бинарный поиск и двигаться уже от него.

После еще нескольких толчков в нужном направлении, я всё-таки закончил задачу, но Brian сказал, что на остальные задачи времени уже нет, так что мы с ним побеседовали о всяком.

Узнал от него следующее:
- в корейском гугле работает 5-6 иностранцев из Австралии, Швеции, Монголии, Южной Африки, Америки.
- компания международная, но всё равно культура - корейская.
- Brian (вроде из Австралии) работает в Корее 8 лет, в гугле 3 года, до этого работал в Daum (корейский гугл :)).

В общем, чувствовал себя после собеседования не очень хорошо, хотелось вилку в глаз засунуть. Думаю результат был бы лучше, решая я задачи в таких же условиях, как и ЕА. Пока, наверное, не суждено быть мне гуглером. Через 2 дня пришел отказ от гугла.

Могу дать пару советом, тем кто захочет подавать в гугл (советы неудачника :), но может кто поучится на моих ошибках):
- Готовясь к собеседованию найдите старый программистские задачки, не сильно сложные (например, модификации обхода дерева или бинарного поиска). Решайте их, проговаривая внятно и громко свои мысли в слух на английском. Также готовьтесь реагировать на комментарии и замечанию интервьювера.
- Забудьте, что проходите собеседование с гуглом, просто представьте, что помогаете решить задачу своему знакомому.

вторник, 25 января 2011 г.

Собеседование в Нексоне

Вчера было очередное собеседование, на этот раз в Нексоне (не слишком знаменитая (не в Корее) корейская фирма разработчик-палбишер игр). Это был второй тур отбора, первый тур состоял в решении 4 задачек дома за 3 дня. Как оказалось, правильно решил три, на отладку последней задачи времени не хватило.

Назначили собеседование мне на 11 часов, так что пришлось рано утром выезжать из Теджона в Сеул. Порадовало, что оплатили проезд.

Вход и комнаты для собеседования находятся в подвале многоэтажного офисного здания рядом с их столовой. Зайти вглубь и посмотреть не удалось, но из того что успел увидеть все понравилось. Все разноцветное, работники одеты в casual.

После того, как меня попросили заполнить бланк для выдачи проездных денег, меня провели в комнату, где меня ожидал интервьювер. Был он всего один, что довольно странно, по опыту собеседований интервьюверов обычно двое (bad cop & good cop).

После небольшого приветствия перешел к опросу. Как только начались технические вопросы, я попросился говорить на английском. Он сказал, что мол окей, только медленно говори. Если кратко, то собеседование прошло хорошо. Интервьювер знал свое дело, задавал неглупые вопросы, и заставлял меня рассуждать над задачками, чтобы оценить процесс мышления.

Первый делом, меня попросил описать один из проектов над которыми я работал.
Потом, спросил про то, что я ресерчил в университете. Я год занимался ресерчем на тему рисования линий "выташенных" из 3д модели. Попросил рассказать про существующие методы и сравнить их.

Попросил рассказать решение к одной задаче из "домашнего задания".
Решение сводилось к простому обходу графа.
Спросил, как делать depth-first search и breadth-first search. (Сказал что в одном стэк, а в другом очередь, но сначала напутал что где.)

Затем пошли обычные вопросы:
- Что такое виртуальный метод?
- Как реализован механизм виртуальных методов в С++? (Ответил ему сходу, так как на прошлом интервью, о котором я не писал, разбирали это минут 10 :)
- Рассказать time complexity для insert, delete, search для различных stl контейнеров (vector, list, map).
- Зачем нужна балансировка бинарного дерева?
- UDP vs TCP
- Что такое SYN flooding? (хорошо, что я про него читал когда-то:)
- Deadlock? (спросил бы он еще про deadlock prevention techniques :)
- Starvation?
- Описать calling convenction on x86. (точно не знал, но сказал что через стек передаются параметры и возвратное значение, но не сказал про адрес возврата в вызывающую функцию)
- Что такое buffer overrun? (тут порассуждал что на стеке должен быть адрес функции, который можно переписать. Когда я сказал code injection, он сказал, что нужные слова я знаю и поехали дальше :)
- Почему rand() имеет uniform distribution, а rand() % 100 nonuniform? (тут завис, ответ пришел только в метро на обратной дороге)
- Есть колода карт, как ее рандомно помешать? (придумал O^2 алгоритм с использованием массива флагов)
- Есть несколько методов размешивать карты, как сравнить какой из них лучше? (ответил, но не слишком хорошо, сравнивать соседние карты и смотреть их разницу. Лучше наверное был бы метод использовать какую-нить игры, и идентичных ботов, и смотреть чтобы боты "играли наравне".)

Дальше некоторые отвлеченные вопросы:
- Что по разработке игр читал\пробовал?
- Собираюсь ли я учить дальше корейский язык?
- Сложно ли мне будет работать в команде, где никто не знает английский? (oh yeah!)
- Может девушка у меня южно-кореянка (типа корейский будет мне улучшать)? (Сказал что женат на украинской кореянке).

В конце стандартное, через недельку свяжемся и сообщим результаты (может быть). На все собеседование ушло чуть больше часа.

В общем, я понял, что иностранцев у них мало или нету совсем. Так что им лучше, чтобы я общался с ними на только корейском языке. Я не сильно в восторге от такой перспективы. Буду надеяться, что попаду в дМаркированный списокругую фирму, а нексон про запас.

Интересно, что до конца собеседования он думал, что я - американец :).
Но я укыраина-сарамия :)

References:

суббота, 15 января 2011 г.

Собеседование в EA Korea

В настоящее время усиленно занимаюсь поиском работы. На неделе со мной связался hr (не из ЕА, а из левой фирмы) и предложил подать на позицию гейм-программера в EA Korea. Я решил попробовать, тем более я им напрямую писал, но безуспешно. В общем, написал согласие, и через 4 дня мне уже назначили собеседование в Сеуле.

К собеседованию не готовился, но до этого 3 дня решал задачи, которые прислали из Nexon Korea, как второй этап отбора (об этом позже). В общем, сидел до 3-х ночи 3 дня подряд и кодил на питоне и С++ :).

С небольшим опозданием, прибыл в Сеул, встретился в вышеопомянутым hrом и мы вместе пошли в офис EA. Как оказалось, у них два офиса в одном здании, один на этаж выше Oracle (ака империя зла), чтобы добраться до другого офиса, надо спуститься на первый этаж, а потом сесть в другой лифт (наверное, нагрузку балансируют).

Там встретили два корейцы средних лет, с моим распечатанным резюме и листками с задачками и провели меня в комнату для совещаний (там был большой телевизор и шкавчик, в котором лежали XBOX, PS3 и Wii + гора различных дисков). Еще hrу я сказал, что понимаю почти все на корейском, но говорить мне удобнее на английском. Интервьюверы говорили со мной на корейском, я на английском, с корейскими вставками.

После рассказа о себе на корейком (они меня попросили на корейском, чтобы оценить мой уровень), начали выдавать мне задания. Интервьюверы спрашивали если, что непонятно, а потом выходили. Так что решал я в комфортном одиночестве.

В общем заданий было 4, очень легкие, уровня первого курса ХИРЭ. Я долго не думал, и писал первоe пришедшее в голову решение. Все по программированию Си:

1. Написать реализацию int strcmp(char *s1, char *s2).
Ну эт легко и без вопросов.

2. Написать функцию bool isValidNumber(int n), где n - должен состоять из 9 цифр, и каждая цифра должна встречаться один раз.

Я решил не мудрить, перевел в строку, а потом проверил через int check_array[9], чтобы число встречалось только один раз. В итоге, они сказали, что тут надо математически вывести, а не через перевод в строку, и нашли overflow, так как я не делал декремент.

На вторую попытку вывел через деления, умножения, вычитание формулу для выведение цифры на каждой итерации. В итоге, забыл проверить один граничный случйы, но решение им понравилось. Потом один спросил, знаю ли я, что делает оператор %, я сказал: "Да, а точно, тут же можно легче через него все сделать".

3. Написать функцию bool isRotation(char *s1, char* s2). В общем функцию проверяет, что "CDAB" это rotation "ABCD".

Опять решив не мудрить, я написал функцию, которая находит первый символ в другой строке, а потом в forе смотрит одинаковы ли они. Индексацию по второй строке была круговая. Как оказалось, не учел случай типа ABCА и СААВ, хотя перед решением думал об этом.

После того, как я быстро исправил, мне намекнули, что можно легко решить с помощью strcat и strstr, и спросили как. Я ответил.

4. Чему равен y в следующем коде?
struct Foo
{
int x, y, z;
};

Foo foos[50];

Foo* p1 = &foos[6];
Foo* p2 = &foos[10];
int y = p2-p1;

Я сначала подумал, что подвох какой-то есть, но ничего не нашев, ответил "ну 4". Мне ответили "Правильно, а многие нам отвечают 48, почему?". Оправившись после удивления, я посчитал им возможный ход мыслей многих (sizeof(int)*3*4).

На этом тесты закончились, и начались другие вопросы:
- Во что я играю?
- Над какими играми я хочу работать?
- Над какими компонентами я хочу работать?
...

И, наконец, настала моя очередь задавать вопросы.
Q: Сколько у вас работает иностранцев?
A: Только 2-е, корейцы из Америки. Общаются с ними сказал аналогичным со мной образом (они - на английском, к ним - на корейском). Что меня немного удивило, так как корейцы из Америки обычно хорошо знают корейский.

Q: Над каким проектами работает ваша студия?
A: Battlefield Online, Fifa Online, Some baseball Online, Some racing Online, Some game for girls Online.

Q: Используете ли вы какие-либо сторонние движки, или все in-house?
A: Все in-house.

На этом собеседование закончилось. Сказали, что свяжутся через неделю, скажут результаты.


Конечно меня сильно удивил легкий уровень задач, меня на собеседовании в program-ace мучали в раз 10 сильнее. Неужели настолько кризис с разработчиками, и остается вопросом над чем работают новобранцы, на ANSI-C чтоли кодят.

Но вскоре мне предстоят еще интервью, где мне точно мозг взорвут.
Пожелайте мне удачи :)