Gamedev
Андрей Верещагин
12 088

«На слюнях и молитве»: как исходный код VVVVVV показал обратную сторону разработки игр Материал редакции

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

В закладки
Аудио

11 января инди-разработчик Терри Кэвена выложил исходный код своей первой игры — платформера VVVVVV, которому исполнилось 10 лет. По словам автора, на код интересно посмотреть в ретроспективе, изучить ошибки.

В частности, Кэвена считает своей худшей привычкой объявление временных переменных вроде «j», «i» и «k» членами каждого класса, чтобы не приходилось объявлять их внутри функций. Это привело к тому, например, что отлавливать баги стало невероятно сложно.

Когда я делал игру, я не понимал, как работают статические классы или когда их стоит использовать. Думаю, я где-то прочитал, что статические классы и глобальные переменные плохо работают во Flash, поэтому и пытался не использовать их вовсе. Результат? Каждая функция в игре обходит следующие аргументы: «Graphics& dwgfx, Game& game, mapclass& map, entityclass& obj, UtilityClass& help».

Терри Кэвена
инди-разработчик

Кэвена признаёт, что код VVVVVV — это «кошмар, даже по стандартам разработчиков-самоучек». Однако несмотря на предупреждения автора, в соцсетях стали обсуждать, насколько плохо он написан.

The video game "VVVVVV" went #OpenSource today and someone discovered a several-hundred-case switch statement in the code. #programming

Beautiful. Disgusting.

Source: https://github.com/TerryCavanagh/VVVVVV/blob/master/desktop_version/src/Game.cpp#L622 https://t.co/jLznUpyBE7
Исходный код видеоигры VVVVVV стал открытым сегодня, а кто-то обнаружил в нём оператор switch с несколькими сотнями кейсов. Прекрасно. Отвратительно.
@randal_olson It's not the worst state machine implementation ever, I'm a little bit amazed by its elegant simplicity. Honestly I kinda wish I was smart enough to take shortcuts like this. Also quite glad that I'm not the one debugging it.
Это не худшая имплементация конечных автоматов. Я немного поражён её элегантной простотой. Честно признаться, мне бы хотелось быть таким же умным, чтобы вот так вот всё сокращать. И я рад, что не занимаюсь дебаггингом этого кода.
Когда всё, что у тебя есть — это молоток...

Действительно, в коде платформера 4099 кейсов. Они определяют, в каком состоянии находится игра. Как правило их группируют отдельно: в одном месте кат-сцены, в другом — меню, в третьем — геймплейные механики и так далее. Однако в коде VVVVVV все состояния «свалены в кучу».

Polygon обратился к автору мобильных Pocket-Run Pool и Really Bad Chess Заку Кейджу с тем, чтобы он попытался объяснить, чем руководствовался Кэвена, когда писал этот код.

Он позволяет увидеть то, что Терри, возможно, не знал, когда начинал писать игру: сколько в ней будет кат-сцен, как будет работать главное меню и сколько может быть непонятных потенциальных конечных состояний у странных режимов [...] Вместо того, чтобы оглянуться назад и заняться организацией, Терри решил что-то вроде этого: «Эй, я просто буду добавлять состояния в этот оператор на случай, если они мне пригодятся». Это на 100% нормально и необходимо для того, чтобы выпустить игру.

Зак Кейдж
разработчик

Сам Терри Кэвена признаёт, что ближе к концу разработки монолитный конечный автомат «вышел из под контроля». В то же время, по его словам, благодаря этой системе в VVVVVV есть баг, позволяющий пройти игру всего за 50,2 секунды.

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

There’s a word for games where the code is barely hanging together, with stupid layout, utterly unscaleable fixes and workarounds on top of workarounds.

“Shipped”
Есть слово, которым называют игры, код которых едва держится вместе: с глупой структурой, немасштабируемыми фиксами и костылями над костылями. «Выпущенная».
@mikeBithell Almost every single game I've worked on has shipped at the exact moment that the bits of spit and prayer holding the whole edifice together are on the *brink* of collapse.
Почти каждая игра, над которой я работал, выходила в тот самый момент, когда её части, которые держались на слюнях и молитве, готовы были развалиться.
@mikeBithell Anyone that says their code base is complete clean and tidy with perfect style and no oddities at all is an outright liar. In the deepest recesses of even the best code there is something you will find that will haunt your nightmares.
Любой, кто говорит, что его код чист, превосходно написан и без странностей — откровенный лжец. В потаённых уголках даже лучшего кода вы найдёте то, что станет вашим ночным кошмаром.
@mikeBithell I was discussing this so many times this week, as long it functions well, doesn't break performance, will the player ever really know or care? 😂
Я обсуждал это много раз на неделе. Пока код работает и не ломается, узнает ли об этом игрок и будет ли ему вообще дело?

Что же до самого кода и разработчика, то VVVVVV за первый день на GitHub получила 20 патчей, над которыми работали 10 человек. Терри Кэвена, в свою очередь, воспринял обсуждение своего кода с юмором.

Every screenshot I see posted of terrible things in the VVVVVV source code only makes me more powerful
С каждым скриншотом ужасных вещей в коде VVVVVV я становлюсь лишь сильнее.
{ "author_name": "Андрей Верещагин", "author_type": "editor", "tags": ["\u043e\u043f\u044b\u0442"], "comments": 137, "likes": 169, "favorites": 146, "is_advertisement": false, "subsite_label": "gamedev", "id": 93334, "is_wide": false, "is_ugc": false, "date": "Wed, 15 Jan 2020 17:11:55 +0300", "is_special": false }
0
{ "id": 93334, "author_id": 22254, "diff_limit": 1000, "urls": {"diff":"\/comments\/93334\/get","add":"\/comments\/93334\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/93334"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64954, "last_count_and_date": null }
137 комментариев
Популярные
По порядку
Написать комментарий...
18

Кот очень мудрые вещи говорит, вот без шуток.

Ответить
2

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

Ответить
0

просрал сроки

Это был твой первый?

Ответить
1

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

Ответить
0

прихожу к положительному результату

Решаешь положить болт на проблему?

Ответить
101
Ответить
12

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

Ответить
42

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

Ответить
47

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

Ответить
7

И работа над каждой следующей игрой начинается с мыслями "Ну уж сейчас-то, после всех набитых шишек, я ТОЧНО всё сделаю как надо". И всё повторяется заново.

Ответить
1

Ну, если ты делал сайдскроллер, а потом решил заебашить новую RTS, то да.

 
Прототипирование, разработка, анализ, повторить. Да, согласен, дольше, но с каждой итерацией будет заметен прогресс.

Ответить
1

There can be only one.

Или прогресс, или рефакторинг. :)

Ответить
5

Как в песне:

100 багов было на продакшене,
5 пофиксили,
150 багов на продакшене.

Ответить
18

Все бест практики крупных разработчиков разбиваются, когда к тебе прибегает менджемент с криками "Хуле так долго/требования поменялись/И т.д." и ты с горящей жопой настраиваешь костыли.

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

Ответить
28

Эти практики и появились, чтобы требования бизнеса не убивали разработку. Паттерны, рефакторинг — это всё не на пустом месте возникло, эти рекомендации люди собирали по 20-30 лет, чтобы новые разработчики не вставали на те же грабли.

Ответить
11

Сегодня у тебя быстрая разработка, а через год проект закрыт из-за срыва сроков новых фич.

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

Ответить
1

 через год проект закрыт из-за срыва сроков новых фич

Потому что игры именно так работают...

Ответить
0

Игры-сервисы, DLC для игр?

Ответить
1

Сервисы не игры, а длц как-нибудь обойдутся.

Ответить
6

Всё упирается в то, сколько ты с этим проектом будешь жить.

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

Ответить
14

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

Ответить
9

Я знаю, на DTF этот пример особенно актуален.

Галенкин написал SteamSpy за две недели.
Код был написан на PHP в самом ужасном спагетти-стиле.
Теперь Галенкин руководит EGS, а SteamSpy приносит ему по 500 $ в день.

Ответить
2

А в селедуещем году его выберут президентом Соединенных Штатов Америки

Ответить
0

Кстати да, я помню как на старте в подкасте Сергей говорил, что ему стыдно показывать код )

Тот случай, когда все ссут, а ты взял и свой говнокод скомпилил - и понеслось.

Ответить
2

зануда мод он

PHP это интерпретируемый, а не компилируемый язык.

Ответить
1

Особенно если учесть тот факт, что индюки обычно плохие программисты.

Ответить
4

Мне кажется, на самом деле, инди-игры никогда не делают хорошие программисты.

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

Ответить
0

Где угодно будут костыли )

Нам достался проект от других разработчиков, там на соплях, матах и честном слове всё работает )

Ответить
0

Комментарии-то хоть были?

Ответить
0

На самом деле, чем дольше я работаю, тем больше убеждаюсь, что они ничем не помогают.

1. Или они нахер банальны (типа над функцией getProductCount написать "gets the count of products")...

2. ...или они полностью нивелируются сложностью самой задачи (я и без комментариев понимаю, что этот охеренно сложный и охеренно кривой алгоритм разбивает одну запись в базе на сорок восемь или пятьдесят четыре новых, в зависимости от неочевидных входных данных, взаимодействующих с текущим состоянием системы — я не понимаю, на хрена это надо было делать и как это теперь изменить, чтоб ничего не упало), которую ты и в комментарии не опишешь, потому что там и в оригинале был спек на сорок листов с кучей "...кроме случая, когда пользователь делает всё это из положения Б (см. стр. 17, п. 2), и в такой ситуации нужно...".

Ответить
0

Я вот себе кучу комментариев оставляю типа:

//тут баг, исправь
//тут можно оптимизировать
//это сделано так, потому что иначе то-то и сё-то
Вроде пока помогает вспомнить. На других программистах ещё не пробовал.

Ответить
0

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

Ответить
0

Это все идёт как todo. А так doxygen все тебе сделает иерархично и понятно. Если непонятно значит с кодом что-то не так. 

Ответить
0

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

Ответить
0

Все так.

Там юнит-тест не спасет, там интеграционный покрывает, но так и работает.
Я к тому, что коммент не спасает :)

Ответить
42

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

Ответить
16

Токсичность в IT сообществе явление вполне обычное. Это было вполне ожидаемо.

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

Ответить
3

Ох уж да, чсв-токсиков пруд пруди. Один раз работал в кампании, где был тимлид, который над джунами глумится в открытую(дико отвратительный тип). А в другом случае мне на собесе, когда я не смог ответить на совершенно тупой вопрос(а тупой он потому что потерял свою актуальность лет эдак на 15), чувак начал рассказывать что я хипстер и нихуя не знаю, а знаю лишь последние фишки, а если мне придется работать с легаси кодом, то я сделать нихуя не смогу. Я послушал это 30 секунд и сбросил трубку.

Ответить
35

Знавал я одного чувака, который в одном скрипте настрочил 500 с хером булевых переменных по типу:

bool isDoorClosed, bool isDoorOpen ну и так далее.

Как знать, может он сейчас делает ту самую игру, которую вы так ждете ( ͡° ͜ʖ ͡°)

Ответить
20

boolevard of broken dreams

Ответить
0

ганс оф булщит?

Ответить
0

Не, то было какое-то мобильное поделие, уже и не вспомню, какое

Ответить
0

Знавал я одного чувака, который в одном скрипте настрочил 500 с хером булевых переменных по типу:

bool isDoorClosed, bool isDoorOpen ну и так далее.

А как это правильнее написать в процедурном стиле, без использования объектов?

Ответить
0

дело не только в стиле  - например если isDoorClosed = true , то isDoorOpen по любому равно false, и наоборот, по этому вторая переменная тут не нужна

Ответить
0

Это мелочи )) Как раз тут не все так очевидно, дверь может быть приоткрыта.

Ответить
0

тогда надо int хотя бы завести вместо этого. А что по вашему не мелочи, что это не в самой двери храниться?

Ответить
1

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

Ответить
2

несогласен, на читаемость и количество запоминания влияет

потом вспоминай че клозет а что опен и где

Ответить
1

на читаемость и количество запоминания влияет

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

То есть по хорошему это должен быть объект дверь, наследуемый от чего-нибудь, типа элементов стен, или активных элементов, имеющий свойство isOpen.

Ответить
0

да по хорошему так, и сложно я имею ввиду излишне сложно

Ответить
0

А типа рандомные int в рандомных местах, как вы предложили, это не сложно?

Ответить
0

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

Ответить
1

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

Ответить
0

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

Ответить
0

функциональном стиле

Все игры написаны в функциональном стиле. Ведь фукнциональный стиль - это ООП. Лол ))

написать большую игру

Зачем писать всю игру в процедурном стиле? От того что я плагин для какого-то фремворка накатаю в процедурном стиле, сам фреймворк же не станет написанным в процедурном стиле.

Вы по моему говорите о том, в чем не разбираетесь.

Ответить
2

Ведь фукнциональный стиль - это ООП. Лол ))

Так так так, поподробней с этого места, пожалуйста

Ответить
2

Мне вот тоже стало интересно. Оставлю коммент, чтобы не забыть вернуться и прочитать ответ

Ответить
2

Видимо он знает только ооп и процедурку)

Ответить
0

Намекаешь на Капитана Прайса?

Ответить
0

Если игра называется Antichamber, то он таки ее уже сделал.

Ответить
22

2.5k$ в месяц на патреоне.

Ответить
18

Напомню о великом видео

Ответить
2

else if

else if  
else if 
else if 
else if 
else if 
else if 
else if 
else if 
else if 
else if       

Готово

Ответить
1

Где мои 2500 долларов, ах да я не умею давать пустых обещаний и отодвигать сроки.

Ответить
0

Имитировал того испанца?

Ответить
1

За доведение хорошего продукта до рынка это не так уж и много.

Ответить
6

хорошего продукта

Yandere Simulator

Choose one :^)

Ответить
0

2.5k$ в месяц

Зарплата одного программиста в СНГ.

Ответить
0

В СНГ - или конкретно в Москве\Питере?

Ответить
0

В СНГ. Вы можете на удаленке хоть из подзалупинска работать.

С уровнем "Сам запустил проект" уж точно.

Ответить
0

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

Ответить
1

Доёбка уровня, в России не нужны ядерные физики, потому что я в своем подъебенено не могу найти работу. Если у тебя технологическое образование, то и ехать получать зарплату надо в технологические центры. За ту работу, в комплексе, что делает разработчик игры, получать две с половиной штуки баксов - не проблема.

На 2,5 в москве можно устроится джуном при условии нормального образования и опыта смежной работы (Сисадминства/тестирование etc).

Ответить
0

Как-то сильно дохрена уточнений получается :)

Ответить
0

В смысле? Если чел запустил свой проект, то он тянет минимум на мидла или тимлида, просто по тому, что он понимает, что надо делать работу, а не оптимизировать код.

Ну, в не слишком наукоемкие отрасли, типа фронта.

Ответить
0

Обля... это получше будет интового свича на тыщу кейсов.

Ответить
0

Зато все понятно! :)

Ответить
0

Кто это?

Ответить
0

Бля, а объясните мне, как это нужно делать?

У меня странное подозрение, что это очень плохой пример, и очевидные майнд мапы надо так же очевидно реализовывать с помощью условных операторов.

Ответить
0

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

Ответить
0

Это мелочи, сравнения со строками все равно где-то будут.

Ответить
0

все IF'ы последнего уровня вложенности можно заменить на ассоциативный массив и брать по индексу оттуда соответствующий первый аргумент, а остальные 2 не меняются

Ответить
0

А, ну конкретно здесь можно да, обойтись массивом. А если операций пара разных на каждый кейс, то как делать?

Я понимаю, почему автор так сделал, это же игра, и если понадобится добавить к какому-то действию еще что-то, это можно будет сделать (Там ниже видно, за анимешной картинкой, что при 'Trespassing' меняются два аргумента, а еще ниже при каком-то варианте, он еще чему-то true назначает)

Пока эта картинка выглядит как доёбка на ровном месте. Проблемы будут только при переводе, потому что он сразу текст использовал, а не placeholder.

Ответить
0

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

Ответить
0

избавления от вот этих вот лишних строк

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

Ответить
0

Alex: Закончил разработку первой соперницы за 4 года(1 из 10, продуктивность Алекса поражает) при поддержке от tinybuild.

Internet: Невозможно, невероятно. Очень хотим увидеть число строк кода на релизе, узреть мастерство оптимизации(Минимум 1500 строк кода на каждого персонажа,хехе).

Ответить
13

Ну я не был удивлён. Терри в тот момент был новичком в программировании, и он создавал игры просто тупо для прикола. Но потом люди заинтересовались и всё заверте-е-е-елось!

Ответить
6

Всем бы такие плахие игры делать, зато в твиттер пердеть горазды :) 

Ответить
14

кто вообще говорит что это плохая игра лол?

Ответить
7

Этот код не настолько плох, на самом деле. Есть, например, вот такое, с сайта геймдев.ру: https://gist.github.com/ForNeVeR/9001938

Ответить
1

Кстати, вот здесь автор рассказывает о разработке сего шедевра:

https://nooby-games.ru/%D1%89%D0%B8-%D1%81%D0%B8%D0%BC%D1%83%D0%BB%D1%8F%D1%82%D0%BE%D1%80-%D0%B6%D0%B5%D1%81%D1%82%D0%BE%D0%BA%D0%BE%D1%81%D1%82%D0%B8/

Ответить
1

Рекомендую еще оригинальный тред на геймдеве почитать (http://www.gamedev.ru/projects/forum/?id=160897), там тоже довольно интересно

Ответить
1

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

Ответить
0

Вот он какой, Эмгыр вар Эмрейс от Нетфликса

Ответить
1

 идеального кода попросту не существует

По мне так написание кода как написание литературного произведения. Кто-то пишет как Толстой, кто-то как чувак простой

Ответить
22

Кто-то пишет как Толстой

Учитывая тяжеловесный, топчущийся на месте и довольно путаный стиль самого Толстого…

Ответить
2

Толстой - эт Страуструп в литературе.

Ответить
2

Звучит как SOLID

Ответить
7

Говоря о сомнительном коде, вы, надеюсь, видели, как Окарину или Vice City на спидранах дико ломают? Что там за хтоничные вещи написаны, которые приводят к таким результатам, остается только догадываться.

Ответить
5

Как начинающий прогер часто задаю гуглу и стаковерфлоу тупые вопросы, типа - что "правильнее" или эффективнее - if-else или case-switch? И вы знаете, хотя выстроенная автором игры вариация с сотней или тысячами переборов не ахти, это ни разу не является плохим по эффективности кодом - современные компиляторы давно научились при работе это оптимизировать. Да, на том же стаке люди не поленились и написали простенький бенч, который показал, что при большом количестве вариантов один из них предпочтительнее, но разница в доли секунд при сотнях тысячах итераций или около того.

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

Ответить
6

Так по идее код с кучей if или большим switch как раз и должен быть быстрым.

Проблема в том, что с ним сложно работать. Паттерны нужны чтобы красиво разделить код на независимые части, но всё это стоит ресурсов.

Как пример, если вам надо вывести на экран числа от 1 до 1000, то самым правильным кодом будет написать цикл for с переменной и выводом внутри, но самым быстрым вариантом будет код на тысячу строк, где в каждой строке выводятся числа 1, потом 2 и так далее.

Ответить
0

Мерзко хихикаю, завидев последнюю фразу.

Ответить
3

Ну он хоть классы использовал, а не дублировал код)

Ответить
3

На слюнях и молитве - девиз всех игр на Беседки на их многострадальном движке T_T

Ответить
3

Кодеры выпендриваются. Ничего нового ¯\_(ツ)_/¯

Ответить
3

Поэтому опенсурс надо выпускать лет через 10 после выхода игры, когда это уже не повредит репутации, а станет такой себе шуточкой "не ждали?"

Ответить
2

Иногда меня спрашивают "чего я не хочу попытаться устроиться в геймдев?"...

Ответить
2

А те, кто там работал, помалкивают :))

Ответить
0

И ты им отвечаешь, что ты перфекционист?

Ответить
1

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

Про качество кода вспоминаю, но не говорю)

Ответить
2

Терри Каван

Его зовут «Кавана» (а точнее — «Кэвена», с ударением на первый слог). 

Ответить
0

Просто Каван звучит почти как Кавил.

Ответить
0

Почти как «кавун» (арбуз на украинском).

Ответить
1

Тут еще показателен пример Джонатана Блоу и игры Braid.

Сначала он выпустил игру, заработал на ней миллионы и поспособствовал волне появления инди-игр.

А несколько лет спустя в свободное время зарефакторил код - http://number-none.com/blow/blog/

Чего и всем желаю.

Ответить
2

Но зачем?

Ответить
2

Зачем выпускать популярные игры и зарабатывать миллионы или зачем в свободное время рефакторить код, повышая свои навыки и качество игры, в которую еще многим предстоит сыграть?

Ответить
0

Кому предстоит сыграть - им по барабану какой там у игры код.

Он же занят своим игровым языком программирования - на него бы и переписал. Видимо, через оптимизация искал идеи для языка.

Ответить
0

Примерно так же работает ВЕСЬ интернет.

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

Это скорее нудно, а вот абстракции еще надо попытаться понять.

Ответить
2

Примерно так же работает ВЕСЬ интернет.

Не так же. То, что в интернете, нужно поддерживать.

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

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

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

Ответить
0

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

Ответить
0

Исправьте заголовок пожалуйста. Серия 4000 ещё не была анонсирована. То что вы пишете это серия 4000U, а у мобильных процов серия идут быстрее. Настоящие 4000 будут анонсированы эдак годика через пол.

Ответить
3

Вам прямо и налево.

Ответить
1

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

Ответить
1
Every screenshot I see posted of terrible things in the VVVVVV source code only makes me more powerful
Ответить
1

Да, код этой игры местами и правда очень забавный! :)

Я нашел в нем довольно много примечательных ошибок и тоже написал об этом статью.
Если интересно, предлагаю почитать:

Ответить
0

 Действительно, в коде платформера 4099 кейсов.

Если идут без пропусков - 4100, начинается с нуля.

Ответить
1

Они идут с пропусками и в самом большом switch их 307 (не считая вложенных switch'ей).

Ответить
0

> Действительно, в коде платформера 4099 кейсов

Нет там 4099 кейсов. Последний кейс с таким числом, но если присмотреться, то можно увидеть, например, что после 336 идет 1000

Ответить
0

Боюсь представить, что там в D/D, учитывая, сколько десятков глюков было не релизе :O

Ответить
0

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

Ответить
0

Да, код этой игры местами и правда очень забавный! :)

Я нашел в нем довольно много примечательных ошибок и тоже написал об этом статью.
Если интересно, предлагаю почитать:

Ответить
0

Над названием игры он тоже не особо заморачивался.

Ответить
0

Вообще-то игра названа по первым буквам имён основных персонажей :)

Ответить

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "Article Branding", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cfovz", "p2": "glug" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Баннер в ленте на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "chvjx", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } }, { "id": 20, "label": "Кнопка в сайдбаре", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "chfbl", "p2": "gnwc" } } } ]