Male C. Pig a.k.a. Svinopolist (piggymouse) wrote,
Male C. Pig a.k.a. Svinopolist
piggymouse

More on Junior Developers

Жежешечка остаётся местом для длинных бессвязных текстов, так что уж не обессудьте, я про Майнкрафт опять. Я в выходные успел осветить основные моменты на одной умирающей платформе*, сейчас дополню подробностями.

Из моих объяснений по поводу моддинга Майнкрафта (а также из прекрасного текста от sagitta) становится очевидным, что ставить готовые чужие моды на instance Майнкрафта в общем куда тяжелее и мучительнее, чем залезть по локоть в исходники и начать править игру изнутри самому. Чем Евгений Дмитриевич со времени написания мной прошлого поста на эту тему успешно и занимается.

Дело, как понятно, осложняется полным отсутствием вменяемой документации. Готовые рецепты на форумах в основном представляют из себя диффы, написанные человеческим языком разного уровня грамотности. Пишет, само собой, старшая школота (русскоязычная кстати пишет по-русски куда хуже, чем англоязычная по-английски). Кое-где в коде игры заметны комментарии, но они весьма аскетичны. Дополнительную сложность привносит неполнота деобфускации — довольно часто в коде попадаются методы с именами типа func_753734_a0c, которые творцы MCP не успели домапить после выхода новой версии. Даже у методов с деобфусцированными именами параметры часто называются par1…parN. Впрочем, для самостоятельного выполнения не слишком сложных модификаций имеющейся в коде информации в общем достаточно.

Особенно приятно — и мне даже больше, чем Женьке — что значительная часть кода представляет из себя реальную доменную модель, весьма интуитивно понятную. К примеру, класс EntityPig наследует классу EntityAnimal и по коду примерно понятно, в чём состоит свинство. Чтобы быть конкретным, перечислю, что свинья в Майнкрафте умеет:

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

Всё это в общем легко прочитывается внутри класса EntityPig. Конструктор навешивает на животное стандартные жизненные задачи с именами типа EntityAILookIdle или EntityAIFollowParent, а часть поведения определяется в методах типа spawnBabyAnimal. Для меня, который основную часть своей (давно впрочем завершившейся) программистской карьеры проводил среди пресловутых "22 абстрактных фабрик, 75 билдеров, 30 декораторов, etc.", такая доменная модель конечно является очень освежающим опытом.

Таким образом, свои виды животных и свои режимы поведения довольно легко породить, основываясь на уже существующих. Чем Евгений Дмитриевич и занимался. Например, днём в субботу он поставил себе задачу вывести одомашненного паука. В Майнкрафте есть пауки, но они опасны и агрессивны, особенно по ночам, когда силы зла властвуют безраздельно. Пауки звездец какие страшные и у них зловещим красным светом светятся глаза. Однако они дают полезную паутину, из которой можно прясти нитки и делать всякие ништяки. Жека придумал сделать неагрессивного домашнего паука, который будет пастись и оставлять за собой аккуратные мотки паутины. После некоторой рефлексии над рецептами создания животных, Жека осознал разницу между уровнями model и view, а затем определил общий подход к решению задачи:

  • В модели сделать EntityDomesticSpider, отвечающий за поведение и жизненный цикл, по мотивам EntityPig, реализовав части, касающиеся паутины, в виде задачи EntityAILayWeb (про вынесение кладки паутины в AI я подсказал).
  • В представлении дословно переиспользовать классы RenderSpider и ModelSpider, отвечающие за непосредственную отрисовку и геометрическую структуру тварюги соответственно.

Первая попытка, после некоторых жекиных мучений, дала немедленный и полностью отвечавший ожиданиям результат. После применения spawn egg на поле образовались жуткие красноглазые пауки, которые паслись и мирно хрюкали. Когда Жека взял в руку сноп пшеницы, пауки, стоявшие вблизи, повернулись к нему и, громко хрюкая, пошли за ним. Жека немножко поводил пауков за собой, после чего мы уже собрались вернуться в Eclipse, чтобы заниматься паутиной, но вдруг увидели вдали, как два паука воспылали страстью друг к другу и слились в любовном экстазе (Майнкрафт целомудренно отрисовывает это в виде животных, стоящих вплотную друг к другу, и поднимающегося над ними потока ярких красных сердечек). Через какое-то время после того, как пауки разошлись, у одного из них внезапно родился — поросёнок!

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

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

Несмотря на в общем довольно приличную сообразительность Жеки, я остался не полностью доволен его программистскими способностями. Что мне не понравилось и на что я пытался давать конструктивный feedback:

  • Ребёнок хронически не понимает и не подхватывает чужие naming conventions. Проявляется это в том, что он создаваемые им классы часто называет как попало (EntityDomesticSpider исходно назывался без слова entity и т.п.).
  • При том, что принцип KISS он в общем соблюдает (в основном от лени и невежества конечно), принцип DRY он в упражнениях с Майнкрафтом как-то подрастерял. Раньше, когда он писал полностью свои хрени на питоне, он старался выфакторизовывать повторяющиеся куски, но в случае волосатой чужой кодобазы он видимо немножко теряется и цель "сделать, чтобы хоть как-то работало" перевешивает вкус к хорошему микродизайну. На выходе получается классический индийский copy-paste based code, даже весело.
  • Концепцию наследования он понимает, но применять как-то не может или не хочет (хотя в общем в конкретной задаче наследование должно было бы повлечь за собой некоторый рефакторинг базового класса, что заметно затруднило бы последующую дистрибуцию мода одноклассникам, на которую Жека в принципе рассчитывает).
  • Артефакты статической типизации в рамках весьма непростой иерархии классов он не понимает вообще. Баг, в который он упёрся в самом начале попыток срастить внешний вид паука с сущностью свиньи, заключался в downcast'е от класса EntityBase к EntitySpider внутри класса RenderSpider. Жека этот downcast забыл поправить, после чего ловил в рантайме исключение, смысл которого ему был непонятен (renderer само собой он успел сассоциировать с entities типа домашнего паука).

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

В заключение замечу, что по результатам общения с данным конкретным учеником шестого класса я окончательно перестал понимать, с какого хiя некоторые профессиональные участники индустрии получают за свою работу деньги. Я не имею при этом в виду сотрудников компании D-t, как и наших непосредственных контрагентов, но некоторые виденные мной и Юлией Игоревной фрилансеры в общем ушли не слишком далеко от уровня Евгения Дмитриевича. И это не столько Евгению Дмитриевичу в похвалу.


* — Выпишу из френдфидика то, что в текст поста не попало:

Также сегодня подслушал, как мой сын пересказывал однокласснику по телефону анекдот про "public static final Борщ борщ = new Борщ();". Главное, чтобы он это одноклассницам не начал рассказывать.

Tags: kids, lytdybr, profession, software
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 37 comments