Dungeon 2. The Walking Skeleton

por Fran Iglesias

Después del primer sprint, el siguiente paso es conseguir que se pueda jugar con el juego.

Suena obvio, pero no todos los proyectos de software buscan asegurar este mínimo. Es decir. El juego ahora mismo es una birria, pero da absolutamente igual porque no se puede jugar. Por tanto, necesitamos proporcionar a las jugadoras potenciales de una forma de interaccionar con el código que ya tenemos para que, al menos, puedan entender la mecánica básica y darnos feedback.

The walking skeleton

El esqueleto andante es una forma de referirse a un pequeño desarrollo inicial con el que aseguramos que el sistema que estamos diseñando puede funcionar. Nos interesa que el sistema pueda levantarse, que esté accesible a las usuarias de la forma prevista, que los grandes componentes estén presentes, etc. Puede ser preparar un repositorio para el desarrollo, un pipeline para el despliegue, habilitar un servidor… lo que sea necesario.

Por ejemplo, en nuestro caso queremos que el juego se ejecute en la línea de comandos. Una forma de hacer esto es utilizar setuptools y definir un archivo setup.py que defina el entry point de la aplicación:

.
├── Pipfile
├── dungeon
│   ├── __init__.py
│   ├── __main__.py
│   ├── dungeon.py
│   ├── game.py
│   ├── room.py
│   ├── tests
│   │   ├── __init__.py
│   │   └── minimum_game_test.py
│   └── wall.py
└── setup.py

Aquí está setup.py:

from setuptools import setup

setup(
    name="Dungeon",
    version="0.1.0",
    packages=["dungeon"],
    entry_points={
        "console_scripts": [
            "dungeon = dungeon.__main__:main"
        ]
    },
)

Y aquí tenemos nuestro entry point en dungeon/__main__.py

import sys


def main(args=None):
    if args is None:
        args = sys.argv[1:]

    print("Welcome to the Dungeon")


if __name__ == "__main__":
    sys.exit(main())

Con esto, podemos ejecutar el walking skeleton:

python -m dungeon

Y esto es lo que obtenemos:

❯ python -m dungeon
Welcome to the Dungeon


Ya tenemos un walking skeleton que nos permite asegurar que hay una aplicación que es ejecutable.

De todos modos, vamos a enriquecer un poquito este esqueleto, haciendo que se ejecute algo del juego. Aunque solo sea una especie de demo. Suficiente para saber que podemos conectar este entry point con el juego en sí. Con eso tendremos algo para enseñar.

Modifiquemos dungeon/__main__.py

import sys

from dungeon.game import Game


def main(args=None):
    if args is None:
        args = sys.argv[1:]

    print("Welcome to the Dungeon")
    print("-")
    game = Game()
    game.start()
    print(game.execute("look around"))
    print("-")
    print(game.execute("go south"))
    print("-")
    print(game.execute("look around"))
    print("-")
    print(game.execute("go north"))
    print("-")


if __name__ == "__main__":
    sys.exit(main())

Y al ejecutar, obtenemos:

❯ python -m dungeon
Welcome to the Dungeon
-
North: There is a door
East: There is a wall
South: There is a wall
West: There is a wall
That's all

-
You hit a wall
-
North: There is a door
East: There is a wall
South: There is a wall
West: There is a wall
That's all

-
Congrats. You're out
-

Próximos pasos

Con esta iteración hemos podido entregar lo que ha resultado ser una demo del juego. No es jugable, pero permite hacerse una idea de por dónde van los tiros.

Y es muy interesante porque aunque tiene un montón de defectos ya nos garantiza podemos arrancar la aplicación y que el entry point escogido está vinculado con el código del juego en sí.

Incluso en esta pequeña demo podemos recoger feedback. Vamos a ver algunas ideas:

  • Por el código sabemos que se ejecutan varias órdenes del juego. Sin embargo, no hacemos eco de ellas de modo que al ver el resultado de la demo, no queda claro cómo funcionaría pues únicamente muestra su resultado.
  • La demo no es interactiva, aunque el juego esté muy limitado, no podemos poner a las usuarias a explorarlo, con lo que obtendríamos un feedback importante.

Por tanto, no estamos en condiciones de entregar el juego, pero ya sabemos qué hacer para lograrlo.

Otro aprendizaje importante es que estas iteraciones pequeñas nos permiten pivotar o cambiar de objetivos fácilmente. Por ejemplo, la entrega que acabamos de realizar ha puesto de relieve algunos problemas que de otro modo tal vez no se hubiesen puesto de manifiesto hasta un momento más tardío en el que fuesen más difíciles de solucionar.

Gracias a eso, por ejemplo, podemos ocuparnos de como tratar este “eco” de las acciones del usuario, lo que será información muy valiosa para avanzar en el diseño.

Así que nuestra próxima iteración irá enfocada a resolver este problema que ahora mismo consideramos más importante.

Código de esta iteración

Siguiente paso

Temas

good-practices

refactoring

php

testing

tdd

design-patterns

python

blogtober19

design-principles

tb-list

misc

bdd

legacy

golang

dungeon

ruby

tools

hexagonal

tips

software-design

ddd

books

bbdd

soft-skills

pulpoCon

oop

javascript

api

typescript

sql

ethics

agile

swift

java