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

Структура игры в Twine
Структура игры в Twine

Почему текстовый квест?

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

Для меня эталоном качественных, нелинейных и захватывающих текстовых квестов являются квесты из Космических Рейнджеров. От ролевые фентези игр до экономических симуляторов горнолыжных курортов, каждый с приятной долей юмора. Помню как на прохождение квеста "Мастер Иикэ-Бааны" у меня уходили добрые 2 часа. Зато, как правило, я получал достойное вознаграждение за такие квесты. Чем сложнее и длиннее квест - тем больше награда.

Ностальгия по Космическим рейнджерам
Ностальгия по Космическим рейнджерам

Пару лет назад я сделал текстовый квест - симулятор поиска работы в IT. Не помню как пришла в голову идея, но безусловно, я, вдохновленной ностальгией по космическим рейнджерам, хотел сделать его интересным и реиграбельным. Главная цель - синтезировать различные активности, которые доступны начинающему специалисту в поиске работы в IT в игровой форме. Таким образом потенциальный кандидат тренируется и лучше понимает процесс найма. Спустя 2 года я добавил несколько языков программирования, Chat-GPT и повысил возможные зарплаты.

Движок Twine и язык Harlowe

Разработку начал на движке Twine — это платформа для создания интерактивных текстовых игр и историй без необходимости программировать на сложных языках. Игры в Twine состоят из отдельных узлов или «пассажей», которые представляют собой текстовые блоки, связываемые гиперссылками. Игрок взаимодействует с историей, переходя между этими узлами, делая выборы, которые влияют на развитие сюжета. Каждый узел может содержать текст, изображения, аудио и элементы сценариев для создания логики, изменяющей сюжет в зависимости от действий игрока. Конечно, можно было это запрограммировать, но визуальный редактор пассажей - вещь все-таки удобная.

Если другие программисты учат Rust или Go, то я учу никому ненужный экзотичный Harlowe.

Начнем с простого.

  • Переменные

    <!--присвоение значений-->
    (set: _vacancy to "Junior разработчик") <!--локальная переменная, внутри одного пассажа-->
    (set: $metWithFriends to true) <!--глобальная переменная-->
    
    <!--использование переменной-->
    (print: _vacancy) 
    (print: $metWithFriends
  • Условия

    (if: $challengePassed is true)[Небольшой подвох, но Иван справился с задачей за пару часов]
    (else:)[Иван недостаточно прокачался в этой области. К сожалению, он терпит неудачу.]
  • Ссылка на другой пассаж

    [[Закрыть резюме ->Сайт для поиска работы]]

Иногда перед переходом нужно поменять состояние. В таком случае спасает функция link.

  • Ссылка с действиями

    (link: $salaryLinkText)[(set: $salary to _salary)(goto: "Зарплатные ожидания в резюме")]
  • Цикл

    (for: each _vacancy, ...$visibleVacancies)[
       (print: _vacancy)
    ]

Бросание кости придает игре больше непредсказуемости.

  • Генерация случайного числа

    (random: 1, 10)
  • Вложенные пассажи.

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

(set: $passage to (passage:)'s name)
(display: "Время")
(display: "Обновить состояние")

Но на простых переменных далеко не уедешь. Для того, чтобы сложный мир было проще менять нужны более сложные структуры данных.

  • Создание простого массива

    (set: $skills to (a:"Базы данных", "Знание алгоритмов", "Коммуникабельность", "Стрессоустойчивость", "Обучаемость", "Git"))

Немного был удивлен синтаксисом обращения к элементу массива. Посмотрите на это:

  • Обращение к элементу массива

    $editableSkills's 1st
    $editableSkills's 2nd
    $editableSkills's 3rd
    $editableSkills's 4th

Еще немного странно выглядит ассоциативный массив, в котором порядок элементов важен для правильного соответствия.

  • Задание ассоциативного массива

    (set: $vacancy1 to (dm: "title", "Developer / Frontend разработчик", "salaryText", "от 100 000 руб. до вычета налогов", "salary", 90000, "skills", (a: "UI/UX", "HTML/CSS"), "experience", 2, "description", "Проект в сфере онлайн-платежей."))

Такие массивы можно засунуть в датасет - коллекцию уникальных элементов. Например так:

  • Создание датасета

    (set: $visibleVacancies to (ds: $vacancy1,$vacancy2,$vacancy3,$vacancy4,$vacancy5,$vacancy6))

С течением времени я стал жалеть, что выбрал Twine и Harlowe для моей идеи. Но назад было идти уже поздно. В итоге получилось 80 пассажей и больше 1000 строк кода и текста. Я давал эту игру участникам курса, как материал, призванный применить знания полученные на протяжении всего курса в такой вот нестандартной форме. На удивление, игра всем понравилась, хотя и визуального сопровождения в ней не было. Поэтому я и решил ее выложить. Писал текст и код я, руководствуясь своим опытом как собеседуемого, так и собеседующего.

Сюжет

Переходи к заключению, если не хочешь спойлеров.

Иван типишный вайтишник-свитчер - то есть человек меняющий свой род деятельности на айти. Работает консультантом в банке. Однако попал под сокращение и согласился на уменьшение ставки и рабочих часов наполовину. Теперь он намерен найти работу в IT. На пути к работе мечты его поджидают различные испытания. В игре есть фриланс биржи, OpenSource репозитории, leetcode задачи, Chat-GPT и старый добрый хабр. Для успешного прохождения игры рекомендую прочитать статью: Как повысить свои шансы на оффер, когда ты джун?

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

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

Заключение

Текстовые квесты — это отличный способ объединить обучение и развлечение в одном формате. Вдохновленный ностальгией по «Космическим рейнджерам», я создал интерактивный симулятор поиска работы в IT, который помогает игрокам лучше понять процесс найма. Надеюсь, что моя игра станет полезным и увлекательным инструментом для всех, кто начинает свой путь в IT.

Ссылка на квест: Помоги Ивану найти работу

В Telegram группе Собес делимся опытом и помогаем друг другу в прохождении собесов в IT - вступайте.

Еще полезные ресурсы для джунов ищущих работу - у меня в профиле.

Комментарии (1)


  1. sobeskiller
    18.11.2024 12:22

    Гы. Это постирония наверно такая? Поиск работы превратился в квест! Вот раньше было - просто берёшь и находишь работу. Потому что эта работа есть и нужен хоть кто-то чтобы её делать. А сейчас работа - суперприз в игре! Надеюсь в будущем эта игра не превратится в шутинг от первого лица...