Pull to refresh

Ошибки новичка в сфере разработки игр

Reading time 15 min
Views 98K

Оригинал изображения

Полгода назад я рассказывал про свой опыт работы фрилансером на oDesk. После этого я решил оставить разработку Android приложений на заказ и заняться своей давней мечтой — созданием игр. Мы с друзьями объединились, и работа закипела…

Для начала хочу рассказать о текущем состоянии проекта:
Время от разработки до публикации: 2 месяца
Время нахождения в магазинах приложений: 3 месяца
Загрузки iOS: > 15000 (93 % русскоязычные пользователи)
Загрузки Android: > 35000 (63 % русскоязычные пользователи)

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

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

Идея и механика игры
Чужая идея
Важность: Средняя


Первая ошибка была допущена еще до начала разработки. Не имея идеи оригинальной игры, было решено подсмотреть концепцию у уже существующей игры, но еще не представленной на мобильных устройствах.
Мне в голову пришла игра Euclid: The Game, про которую я узнал благодаря посту на хабре(http://habrahabr.ru/post/228005/) полгода назад. Тогда я провел несколько увлекательных часов, вспоминая правила школьной геометрии.


Задание из игры Euclid: The Game

Взяв за основу идею игры, не хотелось просто копировать ее, поэтому мы углубились в домашние библиотеки и нашли несколько советских книг по занимательной математике. На основе информации из них было сделано 30 первых уровней…
Ближе к релизу я решил сравнить уровни Euclid: The Game и нашей игры. И, к моему большому удивлению и разочарованию, уровни совпадали примерно на 70%. Совесть внутри меня заговорила, и было решено связаться с автором оригинальной игры и спросить его мнение.
Я предложил сотрудничество и безвозмездную помощь (добавить новые уровни в его игру, перевести ее на русский и украинский) в благодарность за вдохновение.
Автор был не против выпуска данной мобильной игры, но полностью отказался от сотрудничества и даже от моей благодарности.
На мой взгляд, кооперация с web приложением очень схожей тематики дала бы большой толчок в развитии.

Интерфейс
Важность: Большая



Интерфейс GeoGebra

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

Обучение в игре
Важность: Критическая



GameAnalytics: Воронка погружения пользователя в игру на основе 4 первых уровней

Как видно на скриншоте, из 8288 пользователей, которые зашли в игру за месяц, только 3310 прошли первый уровень(39,94%). Это очень низкий результат, если учесть, что первый уровень очень простой и необходим только для обучения пользователя работе с инструментами. Потеря пользователей на последующих уровнях существенно ниже (5-10% от аудитории прошлого уровня).

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

Для продвижения игры было создано видео, которое содержало аналогичную помощь пользователю в освоении игры, но в анимированном формате. Нарисованная рука передвигалась по интерфейсу и последовательно выполняла необходимые действия. На мой взгляд, трейлер хорошо обучает процессу игры, но, к сожалению, количество людей, которые просматривают видео при установке игры, невелико ( Android: 30% от общей аудитории).

На мой взгляд, это главная ошибка в игровом процесса. Для будущих проектов я выделил для себя несколько обязательных пунктов при создания обучения:
малое количество текста. Среднестатистический геймер на мобильных устройствах не хочет читать длинные тексты. Также, если тексты не локализованы, то порог вхождения для пользователей без перевода на родной язык становится намного выше.
анимация действий, которые необходимо сделать пользователю (свайп, нажатие);
поэтапное обучение. Рассказывать только то, что необходимо игроку в данный момент, не нагружать пользователя информацией.

В последнем обновлении мы полностью переработали обучение.



Жанр и сложность игры.
Важность: Средняя


По статистике, жанр puzzle очень популярен на мобильных платформах.


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

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


Game Analytics. Процент возврата игроков.

На следующий день после установки возвращается всего лишь 10% пользователей, а через неделю — только 1%. Аналитики успешных компаний говорят, что у удачных игр данные показатели равны 50% и 20% соответственно.

Отсутствие мотивации к игре.
Важность: Критическая


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



Но, как показала статистика, этого недостаточно для того, чтобы заинтересовать пользователя более чем на неделю. Я считаю, что это очень хорошо работало раньше, например, большинство игроков в первую игру из серии Angry Birds старались пройти все уровни на 3 звезды, и это работало. Но рынок мобильных игр очень быстро меняется. Проанализировав приложения, которые сейчас находятся на вершинах рейтинга, я выделил следующие пункты:
Соревнование игрока со знакомыми ему людьми (хороший пример Subway Surfers, где игрок видит рекорд друга, который предстоит улучшить).
Рейтинги. Соревнования между незнакомыми людьми сейчас очень популярны среди клонов Flappy Bird. Зачастую эти игры очень хардкорны, и люди стремятся вписать свое имя в таблицу рекордов
Награды и достижения. На мой взгляд, данная техника стала очень популярной после применения в Fruit Ninja, и теперь ее не использует разве что ленивый.
Возможность проиграть. Если игроку постоянно доступна возможность играть, а игра не наказывает его за проигрыши, то игрок очень быстро насыщается. Типичный пример — энергия. Она нужна не только чтобы заработать денежку на красную икру для разработчиков, но и для повышения интереса к игре со стороны пользователя.
Потеря игровых ценностей при забрасывание игры. От жесткого “Другие пользователи уничтожат вашу деревню, если вы не будете ремонтировать ее” до более мягкого “Если вы не соберете урожай морковки раз в день, то вы ее потеряете”.

Технические ошибки
Работа с бета-версией Unity.
Важность: Средняя


В момент старта разработки приложения версия Unity 4.6 с новой системой UI была только в бета-версии. Однако так как я только начинал изучать Unity, я решил использовать новую систему UI вместо популярного плагина NGUI. В итоге я пару месяцев проработал в IDE, которая несколько раз в час закрывалась с сообщением об ошибке(OS X) и частично не сохраняла результат. Это существенно подпортило мне нервы и увеличило время разработки.

Но в итоге я хорошо изучил new UI и после выхода release версии Unity 4.6 вылеты прекратились.

Проблемы с размером элементов и текста.
Важность: Средняя


В Unity 4.6 новая система UI поддерживает указание размеров элементов не только в пикселях, но и в процентном соотношении к размеру родительского элемента. Это очень удобно, если вы хотите, чтобы все элементы изменяли размер пропорционально размеру экрана. Таким образом, я один раз создал разметку интерфейса и использовал ее как для планшетов, так и для телефонов.

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


Мой скрипт FontSizeHelper и стандартный скрипт Text

Но это доставило неудобства. При определенных обстоятельствах(размер экрана и локализация) некоторые тексты вылезали за размеры компонента и выглядели очень некрасиво. Приходилось изучать каждый элемент интерфейса после изменения текстов.

Update:
В комментариях подсказывают, что в Unity 3D есть стандартные решения этой проблемы, А именно Automatic Layout Groups. Ссылка на видеообзор — https://www.youtube.com/watch?v=DAdW_K44Dao

Доверие к системе отслеживания ошибок — Crittercism.
Важность: большая


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

Но в этот раз меня ожидало несколько сюрпризов:
отлов ошибок в iOS версии работает не всегда. После релиза я был очень рад увидеть малое количество ошибок в своей статистике, но это не соответствовало реальности. Через неделю после релиза я проверял новую функциональность и наткнулся на ошибку, которая приводила к вылету приложения, а Crittercism не отправлял информацию о ней. Особенно сильно это проявляется при нетипичных ошибках(не NullPointer или DivisionByZero).
сложность отслеживания OutOfMemory. Crittercism умеет показывать StackTrace даже C# кода, но для OOM ошибки это не так. При OOM на Android он отображает уникальный dump памяти в качестве stack trace, который лично мне ничего не говорил. Но, проанализировав несколько подобных ошибок, я обратил внимание на часто совпадающие параметры MemoryUsage(Android устройства имеют различный максимальный размер памяти для выполнения приложений, поэтому было несколько повторяющихся значений) и определил, что данная ошибка сигнализирует о нехватке памяти, вскоре ее нашел и устранил.


Crittercism. StackTrace ошибки OutOfMemory


Crittercism. Информация об устройстве на момент ошибки.

Добавление новых привилегий при обновлении
Важность: Средняя

Данная ошибка относится только к Android версии. Изначально я планировал реализовать push сообщения пользователю, но из-за нехватки времени было решено реализовать данный функционал в обновлениях. К сожалению, я не установил необходимые разрешения(доступ к push сервису Google) в начальной версии, и мне пришлось сделать это при обновлении. В итоге процент обновляемости на версию с увеличенными привилегиями упал в несколько раз.
Причина проста: когда выпускается обновление без увеличения привилегий, у большинства пользователей игра обновляется в фоновом режиме, но если разработчик запросил больше привилегий, пользователю необходимо вручную обновить приложение через Google Play.

Магазины приложений:
Добавление локализаций описания игры в App Store
Важность: Малая


Для релиза iOS версии у нас было несколько переводов для описания игры, но когда я начал изучать интерфейс ITunes, меня ждал неприятный сюрприз.
Мне было доступно только 9 языков локализаций для игры, при этом список языков был очень странный: присутствовали Датский и Финский, но отсутствовал Китайский и Русский.
Несколько месяцев назад ITunes обновил интерфейс, и никаких статей по поводу нового интерфейса я не нашел. Пролистав документацию для разработчиков от Apple, я нашел информацию о том, что ITunes анализирует загруженные исполняемые файлы и может менять web интерфейс разработчика в зависимости от внутренностей этого файла. Обвиняя Unity и плагин для локализаций, я начал изучать интерфейс XCode и искать, как добавить поддержку языков в проект. На это я потратил несколько дней, но результата не достиг.
Я решил написать в поддержку Apple, через пару дней меня перенаправили на технический отдел, а еще через пару дней технический отдел сказал, что я использую Unity и это мои проблемы.
После этого я создал подробный вопрос на stackoverflow и сразу же получил ответ.

Ошибка оказалась очень стыдной:


Оказывается, список содержит внутри себя прокрутку, с помощью которой можно выбрать остальные языки.
Я уже 2 года пользуюсь OS X и привык, что полоса прокрутки по умолчанию скрыта и показывается только когда начинаешь прокручивать страницу или документ, но в данном месте было не очевидно, что внутри присутствует прокрутка.

Негативные отзывы
Важность: Средняя



Оригинал
Отзыв из просторов интернета.

Конечно, таким образом мы не отвечали на отзывы, но иногда очень хотелось.
Большинство негативных отзывов конструктивны и полезны. Но существует и другие.


Отзывы из Google Play


Отзывы из App Store

Как показала практика, на них все же стоит отвечать. Примерно 20% отзывов с 1 меняются на более высокие после вежливого и внятного ответа.

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

Отзывы про локализацию: После того, как мы получили комментарий об украинском языке, игра была переведена на него на хорошем уровне, но также мы решили добавить еще 10 локализаций, использую Google Translate. После этого иностранные пользователи начали жаловаться и требовать вернуть английский вместо кривого перевода, и автоматические переводы были удалены. Прироста закачек от добавления переводов замечено не было.

Рамка телефона на скриншотах в App Store.
Важность: Малая


Перед отправкой приложения в App Store я пролистал несколько приложений и увидел, что некоторые из них используют рамку телефона на скриншотах. На мой взгляд, такие скриншоты выглядят привлекательнее, поэтому я решил использовать их в своей игре.
Хотя я и предполагал, что использования рамок запрещено, я отправил приложение на проверку в Apple. В первой версии не нашли никаких проблем, игра вышла в App Store.
Но через месяц было выпущено обновление, и на этот раз оно было заблокировано из-за рамок устройств на скриншотах, пришлось переделать все скриншоты.



Название приложения
Важность: Критическая

К сожалению, я не могу привести реальные названия приложения, чтобы не попасть в “Я пиарюсь”, поэтому буду использовать вымышленные названия, которые, тем не менее, показывают эволюцию названия игры.

Первоначально игра вышла под названием “Задачи по геометрии”. Я считаю данное название неудачным по двум причинам:
слова “задачи” и “геометрии” очень редко ищут в магазинах приложений (можно проследить с помощью App Annie).
название является общеупотребляемой фразой, и очень сложно отслеживать упоминания об игре в интернете (например, Google выдаст по данному названию очень много страниц, не связанных с игрой).

После это название было изменено на “Задачки на логику”. Его также очень сложно отследить, но запрос “Задачки на логику” очень популярен в магазинах, и полное соответствие подняло нашу игру сразу в первую пятерку по данному поисковому запросу. Также игра попала в “Похожие” для некоторых популярных игр, которые содержат в названии слова “”задачки” и “логику”.

После этого мы пробовали изменить название на “Задачки на логику и математику”, но результат оказался неэффективным: мы опустились в результатах по запросу из предыдущего абзаца и не поднялись по запросам о математике. Необходимо полное соответствие поисковому запросу.

Однако данная тактика подходит только для маленьких проектов. Прирост загрузок не настолько огромен, чтобы жертвовать уникальностью названия. Для второй игры мы выбрали уникальное название, которое легко отследить, но содержащее одно слово, которое часто ищут пользователи( например, “Runner”).

Продвижение

График загрузок Android версии.


График загрузок iOS версии.

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

База данных для продвижения.
Важность: большая.


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



Данный документ очень похож на открытый для всех Google Doc — Паблишеры. Отзывы.
docs.google.com/spreadsheet/ccc?key=0As1joqDAfz6UdHhhQ3lMZ0oyZXZRRGFQZXdHTGZEYnc&usp=drive_web#gid=0

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

Название сообществ об игре.
Важность: Малая


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

Малое количество кросс-промо с другими играми.
Важность: средняя


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

Нет акцента в первый день
Важность: Средняя


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

Не было информации об игре до ее выпуска
Важность: Большая


Рассказывать про свой проект нужно еще до начала написания первой строчки.
Публикация трейлеров, анимаций, скриншотов, ведение блога и участие в акциях наподобие #ScreenshotSaturday позволит собрать пользователей до начала игры и создать ажиотаж.
Публикация на форумах разработчиков и любителей инди игр дает очень важную обратную связь до релиза. Это особенно важно, когда количество тестеров игры небольшое.

Реклама на форумах головоломок.
Важность: Малая


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

Объединение популярных сайтов про iOS и Android
Важность: Малая


Несколько популярных русскоязычных сайтов, специализирующихся на тематике iOS и Android, сотрудничают и активно делятся информацией между собой. Это привело к тому, что некоторые из них просят 16000 рублей(4 месяца назад) за публикацию обзора, аргументируя это тем, что других альтернатив в русскоязычном сегменте нет. Доводы того, что данная цена существенно выше, чем у аналогичных иностранных сайтов со схожей статистикой посещений, никак не повлияли на мнение собеседника. Это, конечно, их право, но в следующий раз я планирую не тратить время на них.

Большинство администраторов адекватные и вежливо объяснили причину отказа бесплатной публикации наших dev story. Но некоторые начинали нас откровенно оскорблять и унижать при личной переписке, когда узнавали, что мы отправили запрос на публикацию в другой сайт из их объединения(мы подготовили несколько уникальных вариантов dev story и не отправляли один текст на разные сайты).

Ничегонеделание при росте
Важность: Большая


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

Надежда на “фичеринг”
Важность: средняя


Сейчас мы понимаем, что игра не могла быть выделена Google или Apple из-за своей специфики и реализации. Но мы сами убили любые шансы.
Необходимо соответствовать требованиям. Например, в первых версиях игры на Android физическая кнопка “Back” ничего не делала. В то время как в привалах Google данная функциональность упоминается как очень желательная. В App Store ваше приложение могут пропустить с рамками устройств в скриншотах, но при более пристальном исследовании на “фичеринг” данная оплошность может стать критичной для приложения.
Также, на наш взгляд, магазины никогда не зафичерят приложение, которое не выгодно им. Поэтому бесплатные приложения без встроенных покупок, например, ориентированные на рекламу, имеют очень маленькие шансы.

Уменьшение рейтинга с началом популярности
Важность: средняя.
На данный момент игра имеет рейтинг 3.8 в Play Store. Активное снижение рейтинга пришлось на пик популярности. Наше предположение таково: игра стала популярнее, основные пользователи игры изменились с любителей сложных пазлов, нашедших игру после тщательного поиска, на среднестатистических мобильных геймеров, случайно попавших на страницу с игрой, которым она показалась сложной.


Google Play. Статистика оценок.

Монетизация

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

Баннерная реклама в прошлом
Важность: Большая


Идея с баннерной рекламой оказалась провальной. Игроков совсем не интересовал маленький баннер, а оплата за клик оказалась очень низкой. Мы перепробовали 3 биржи, но результаты были примерно одинаковыми.



AdMob. Cтатистика показов баннерной рекламы.

Сравнение рекламных бирж
Важность: Cредняя


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



* Статистика для Vungle приблизительная и в большей степени основывается на данных нашей аналитики, нежели на данных биржи рекламы.
* Прочерки в графе IR означают, что данные биржи платят за клик на рекламу, а не за установку приложения.
* Прочерки в графе Android означают, что мне не удалось интегрировать данную биржу в Unity и использовать ее на данной платформе. Поддержка Revmob и Leadbolt признала наличие ошибок в SDK, уже пару месяцев они оперативно исправляют проблему.

Так как для меня всего 4 месяца назад обозначения из таблицы были совершенно непонятны, я приведу краткое описание:
eCPM (effective cost per thousand impressions) — среднее количество денег от 1000 показов;
IR (install rate) — средний процент пользователей, которые установили приложения после показа рекламы;
CTR (click-through rate) — средний процент пользователей, которые кликнули на рекламу после показа;
Fill Rate — процент доступной рекламы. Вычисляется следующим образом: (количество показов рекламы) / (количество запросов на показ рекламы). Дело в том, что у биржи не всегда есть в наличии реклама(зависит от языка, платформы и местоположения пользователя), которую вы хотите показать пользователю в своем приложении.

Для себя мы выбрали полноэкранную рекламу от Chartboost для русскоязычных пользователей, а видео-рекламу от Vungle для всех остальных. Сейчас мы также тестируем видео рекламу от Chartboost и возможно полностью перейдем на данную биржу. Так же у Chartboost SDK для Unity одно из самых лучших, с его помощью можно даже отслеживать кликнул ли пользователь на рекламу или посмотрел видео, что позволяет мотивировать пользователя больше взаимодействовать с рекламой.

Доход от рекламы в разных странах.
Важность: Большая


Основная аудитория приложения (более 70%) — русскоязычные пользователи.


Google Analytics. География пользователей приложения.

Однако доход от рекламы в странах СНГ в сравнении, например, с США + Австралия примерно одинаков. Таким образом, разница в количестве пользователей между СНГ и США + Австралия в 25 раз больше(СНГ — 75%, США + Австралия — 3%), а количество генерируемой прибыли примерно одинаково.


Google Analytics. География заработков приложения на рекламной бирже AdMob.

Платная версия не вовремя
Важность: Средняя


Мы выпустили платную версию на пике своих загрузок, но было бы эффективнее сделать это раньше, когда рост только начинался. Но, несмотря на это, игра попала в некоторые рейтинги(всего 50 загрузок за первую неделю по 2-3$) и начала приносить органичный трафик уже из рейтинга Play Store(2-3 установки в день), в то время как в бесплатной версии начался спад.


AppAnnie. Самый высокий рейтинг платной версии приложения в Play Store

P.S. Половина абзацев из данной статьи уже не соответсует тематике habrhabr. Но разделять уже написанную статью на две я не вижу смысла. Хочется узнать мнение сообщества, стоит ли публиковать статьи подобного формата в будущем именно на Хабре?
Прошу в комментариях отписываться только по теме.
Only registered users can participate in poll. Log in, please.
Куда в будущем стоит публиковать статьи подобного формата?
3.83% Разделить на две. Одну на хабр, вторую на мегамозг. 24
86.44% Не разделять. Писать дальше на хабрахабр. 542
6.7% Не разделять. Перейти на мегамозг. 42
3.03% Не публиковать. Подобные статьи не интересны сообществу. 19
627 users voted. 158 users abstained.
Tags:
Hubs:
+45
Comments 22
Comments Comments 22

Articles