JavaRush /Java блог /Истории успеха /В начале был JavaRush
Марат Каджаев
20 уровень
Санкт-Петербург

В начале был JavaRush

Статья из группы Истории успеха
Мой первый испытательный срок закончился еще 3 года назад, но время на написание статьи появилось только сейчас. В университете я провел 1 год на разных факультетах: первый семестр я учился на менеджера, во втором семестре перевелся на программную инженерию. Надеялся, что меня будут учить программировать, но ошибся, поэтому забрал документы и решил самостоятельно все осваивать. Единственное, за что я благодарен педагогу — за то, что тот посоветовал начать с книги Стивена Прата "Язык программирования С". Действительно хорошая книга с большим количеством практических задач. На книгу ушло примерно 2 месяца после чего я наткнулся на JR в группах у друга и понеслось. Сначала я планировал стать Android разработчиком, но в процессе обучения backend мне показался более интересным. На обучение, кстати, ушло 3 месяца, за которые я дошел до 20 уровня, после чего решил попробовать трудоустроиться. Первым делом я переехал в другой город, т.к. в моем не было вакансий младшего Java разработчика. Нашел компанию, откликнулся, получил тестовое задание, на выполнение которого дали неделю. Надо было написать несложное веб-приложение с использованием Hibernate, Servlet\JSP и MySQL. Из всех этих слов я знал только, что MySQL это база данных. Сперва сильно расстроился, даже решил поискать пока вакансии в каком-нибудь KFC, но потом все-таки решил попробовать выполнить ТЗ — в KFC всегда успею устроиться. Всю неделю в режиме нон-стоп делал тестовое и успел. Отправил решение, но оно было "некрасивым", поэтому переделывал его еще 4 раза. Последнее решение оказалось верным, но выяснилось, что разработчиков уже набрали и следующий набор будет через 3 месяца. Штош, ладно. Следующие 3 месяца я учил html, css, js, sql и php. Что тут делает PHP? Мне нужен был серверный язык, который бы отвечал на запросы и все такое — сервлеты и jsp мне показались слишком сложными на тот момент. По итогу получилось полноценное веб-приложение и ужасным, но интерфейсом, код которого я выложил на github для портфолио. Как раз к этому времени прошло 3 месяца и мне написали из той же компании и позвали на собеседование дав еще одно несложное тестовое задание на знание SQL, с которым справился за несколько часов. Человек, с которым я общался насчет работы намекнул, что будут спрашивать про алгоритмы и структуры данных — эту тему я еще не успел освоить, но до собеседования было 15 дней, хули нам — гонщикам. Мне помогла книга Роберта Лафоре "Структуры данных и алгоритмы в Java". Прочесть и понять её всю за две недели я не успел, но все равно узнал много нового. И вот наступил день собеседования, я приехал в назначенное время, меня встретили 2 мужика и начался собес. Сказать, что я волновался ничего не сказать, у меня даже голос дрожал. Спрашивали обо всем кроме алгоритмов и структур данных. Спрашивали про Spring, DI, IoC, Hibernate, о том как устроена JVM, как работает GC — я не ответил ни на один из этих вопросов. Справился только с вопросами о Java Core (коллекции, исключения, ооп и т.п.). Уже на собеседовании я понял, что провалил его, но все равно было обидно не получить никакого фидбека. Зато я выявил пробелы в знаниях и принялся усердно их закрывать. Работу я нашел спустя месяц после провалившегося собеседования. Кстати, на вакансию я наткнулся в обсуждениях JavaRush. Сперва было собеседование по скайпу с рекрутером (примерно 2 часа длилось). Спрашивали про Java Core, GC (теперь я знал как он работает), БД, структуры данных. Потом собеседующий попросил расшарить экран и написать калькулятор. Я от счастья чуть не вскрикнул, потому что писал калькулятор буквально за неделю до этого. Уверенный в себе я приступил к задаче, но то ли от волнения, то ли еще почему я забыл часть алгоритма. Экран расшарен — лезть в гугл страшно. Благо был мобильник, который спас мою жопу. На следующий день позвали на очное собеседование и еще через пару дней я получил оффер.
В начале был JavaRush - 1
Работа была не официальной, я был в роли подмастерья у индивидуального предпринимателя. Писали мы сервис для создания мероприятий, продажи билетов и все такое. Помню свой первый рабочий день — ИП минут 15 объяснял, что нужно сделать. — Ну как, все ясно? — спросил ИП — Ммм, не совсем, можно еще разок? — дико волнуясь попросил я. ИП объяснил все еще раз. — Теперь ясно? — Теперь да. На самом деле я не понял НИ-ЧЕР-ТА. Но попросить объяснить снова побоялся — думаю все, кто трудоустроился поймут меня. Суть задачи была в том, чтобы переписать с thymeleaf на AngularJS. К своему счастью, я нашел часть готового кода и по примеру сделал также. Как оно работало я тогда не понял, но с таской справился. Потом пошли задачи связанные непосредственно с backend частью. Только после практического опыта со Spring`ом я начал понимать, что было написано в книге "Spring для профессионалов". Проработал я там 8 месяцев после чего переехал в другой город, где довольно быстро официально трудоустроился, отработал 2 года попутно сменив плашку с "Junior" на "Middle". Сейчас я столкнулся с тем, что работа превратилась в рутину и не доставляет ни капли удовольствия. Поэтому в данный момент я взял перерыв, а чтобы за время перерыва не атрофировались пальцы решил попробовать другую сферу — геймдев. А именно мобильный геймдев, для начала Android, т.к. знаю джаву. Об это сейчас и расскажу в подробностях. О нас В короткие сроки собралась небольшая команда из 4х человек (включая меня): разработчики 2шт, геймдизайнер 1шт, звукарь 1шт. Т.к. опыта в сфере геймдева ни у кого в команде не было и время моего отдыха ограничено решили реализовать несложный проект, который точно доведем до конца. Таки довели! Изначально дедлайн был 15 ноября, но, как известно, закончить проект в изначально установленный срок — грех. Поэтому мы его закончили двумя неделями позже. По тех. стеку это: Java 8 и libGDX.

О разработке

Началом разработки можно назвать 17 октября. В общей сложности мы потратили 45 дней, за которые:
  1. научились работать с libGDX;
  2. написали код;
  3. нарисовали графику;
  4. сделали музыку;
У тех, кто уже видел игру может возникнуть вопрос — почему так долго, игра же простая? Да, это правда и если быть совсем точным, то на саму разработку (написание кода) ушло от силы недели полторы. Остальное время можно поделить между:
  1. освоением движка;
  2. рисованием картинок, а потом их перерисовки;
  3. написание музыки;
  4. поиском звуков на https://freesound.org;
  5. чтением кучи статей о том, как продвигать игры
Плюс были моменты "простоя" по разным причинам — у кого-то экзамен, у кого-то пересдача и т.п. На "простой" можно смело отдать полторы недели, а то и больше. Ещё часть времени ушла на "дебаты": идеи о том, что добавить в игру приходили чуть ли не каждый день, поэтому были споры о том, что "это будет лишним", "это не впишется" и т.п. Таким образом мы отказались от многих идей, например добавить бегающих тараканов, которых можно давить и получать за это доп. очки: В начале был JavaRush - 2Вообще, одна из самых сложных вещей, на мой взгляд, это определиться заранее с тем, что будет в игре и придерживаться этого плана не пытаясь добавить "ещё одну" фичу. Вот таким образом и набрались эти 45 дней. Прототип игры был готов спустя полторы недели. В этот период графики у нас толком еще не было, поэтому что-то мы взяли из открытого доступа (например фоновый лист бумаги мы одолжили у Doodle Jump), что-то сами накидали в паинте. В начале был JavaRush - 3Игра технически очень простая — нам даже не нужно было использовать box2d (физ.движок), обработать коллизии и вычислить гипотенузу можно и самостоятельно. Из самых интересных моментов выделю следующие.
  1. Изначально в игре все элементы генерировались рандомно. Т.е. у нас есть провайдеры чёрных дыр, ножниц, сюрикенов, стержней, сердец — суем их в массив, и потом берем рандомный провайдер и получаем элемент с рандомными координатами. Довольно быстро стало ясно, что этот подход "очень не очень", то же самое нам сказали знакомые, которые принимали участие в тестировании и посоветовали использовать шаблоны. Наверняка для тех, кто занимается геймдевом это является очевидным решением, но т.к. мы в этой сфере новички для нас это был очень дельный совет.

    Таким образом появилось несколько шаблонов: долина ножниц; диагональные стержни — на высокой скорости довольно прикольно их собирать (вжух-вжух-вжух пальчиком); и ещё один шаблон, не знаю как его назвать — назову так, как называется класс в коде: StraightForwardPattern.

    В начале был JavaRush - 4

    С шаблонами стало приятнее, но слишком предсказуемо, что ли. Поэтому ещё одним шаблоном стал тот самый рандом. Т.е. теперь у нас есть "статичные" шаблоны и один рандомный. (тут мем про идеальный баланс).

  2. Основной проблемой, с которой мы столкнулись была вот в чем. LibGDX в бесконечном цикле вызывает метод render(float delta), в котором собственно и происходит вся отрисовка элементов. Линия карандаша у нас рисуется следующим образом: мы берем координаты пальца и помещаем туда текстуру. Так вот, если мы вели пальцем по экрану очень быстро, то образовывались "дыры" потому что мы попадали в те милисекунды, когда метод render(delta) уже отработал и ещё не вызвался снова. Проблему решили довольно просто — запоминаем последнюю координату, в которой отрисовали текстуру, получаем следующую и если расстояние между ними больше X и палец при этом не отпускался — заполняем этот промежуток. Сначала думали, что этот вариант может не сработать — линии будут угловатыми, но опасения были напрасны — всё работает как надо.

    Собственно, об игре

    Игровой процесс не претендует на уникальность, но вполне неплох и способен затянуть. Вы управляете карандашом, буквально рисуете на бумаге уклоняясь от препятствий — ножниц, сюрикенов, чёрных дыр. При этом стержень карандаша кончается и надо подбирать маленькие карандашики. На случай, когда стержень подходит к концу, а карандашей всё нет можно подобрать осколок зеркала. Он даст эффект на несколько секунд — вместо траты стержень будет восстанавливаться, но при этом управление становится зеркальным — ведёте влево, а карандаш рисует вправо. Ещё можно подобрать сердечко, которое позволит разок столкнуться с препятствием и остаться в живых. Чем дольше вести не отрывая палец от экрана тем выше будет комбо, которое увеличивает скорость набора очков. Плюс постепенно увеличивается скорость игры. Разве что корованы грабить нельзя. В начале был JavaRush - 5Изначально игру мы планировали назвать Karan Dash (карандаш, ахах, поняли да?), но позже передумали и остановились на Pencil Dash. Мотивацией стало то, что эта изящная (ящетаю) игра слов будет понятна только русскоязычной аудитории. Игру мы выпустили пару дней назад и сейчас занимаемся продвижением. В этом опыта тоже ни у кого в команде нет, все знания о продвижении мы почерпнули из разных статей. Опубликовали информацию об игре на разных сайтах\форумах бесплатно. Из платных же каналов — заказали рекламу на 4пда, у одного блогера, несколько постов в пабликах ВК и AdMob. К слову данный пост тоже является частью продвижения, поэтому с разрешения администрации оставляю здесь ссылку на игру. Страница игры в Google Play: щёлк Также оставлю ссылку на нашу группу ВК, там можно оставить отзывы\пожелания и не пропустить обновление щёлк Буду благодарен, если установите (а вдруг понравится?), а за отзыв с рейтингом обещаю поставить свечку за ваше здоровье! Задавайте вопросы, если есть — отвечу. В начале был JavaRush - 6

Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Ярослав Уровень 40 Master
3 декабря 2018
Интересный рассказ, понравилось читать. Как считаете, вернетесь обратно к бэкэнду или останетесь в геймдеве?
Данил Суетин Уровень 35
3 декабря 2018
Геймплей бессмысленный какой-то. И все враги одинаковые, только и уворачиваться