TeamDojo

An application for improving (application and project) skills of your teams through gamification.

It allows teams to self assess their skills and checks if they are reaching a specified ability level. If they reach a new ability level, they will be rewarded with a cool new Team Avatar, Level Rewards - like a virtual belt - and topic specific Badges. TeamDojo also calculates scores, based on specific skill, level and badge ranking/difficulty and ranks the teams by the amount of their achieved scores.

screencast

Usage

Cloning

git clone https://github.com/otto-de/TeamDojo.git
cd TeamDojo/

Docker

First build a docker image by running:

./gradlew bootWar -Pprod -PnodeInstall jibDockerBuild

Then run:

docker-compose -f src/main/docker/app.yml up -d

The application will be available at http://localhost:8080

Model

Organization

TeamDojo comes prefilled with some demo data. Log in with the default admin credentials: admin/teamdojo at http://localhost:8080/#/admin and change your organization Entities - Organization. It will be your navigation root node.

Dimension

Next you would like to create some Dimensions your teams want to achieve skills for: Entities - Dimension. Examples could be Quality Assurance, Security, Operations, Architecture, ...

Team

Teams are the users of TeamDojo. Here you can create them.

Entities - Team

Level

Now you can specify maturity or ability Levels for these Dimensions. Each Level should contain n Skills - see next step.

A Level consists of the following settings:

Entities - Level

Badge

While Level are the core of the maturity model, Badges can be used to push some specific skills or to reward well performing teams.

Entities - Badges

Skill

The core element of this framework. Teams can obtain skills.

Entities - Skill

Assign Skills to Level and Badges

Every Skill should be assigned to at least one Level or Badge:

Here you can specify which skills are necessary to obtain a specific Level or Badge.

Scoring System and Balancing

If a team completes a skill, its score will be added to the team's score. With the Skill Score property you can value its costs / complexity / importance.

To honor the skill completion of specific levels or badges, you can adjust the Level/Badge Score Multiplier. Every completed Skill will add its skill score multiplied with the Score Multiplier. E.g.:

Skill: TLS everywhere; Score: 10
Badge: Encryption Master; Score Multiplier: 2

#Completion of TLS everywhere will resulting in:
   10 (Skill Score)
+  20 (Skill Score x Score Multiplier)
=> 30 Points

You can also reward the completion of levels and badges. Therefore you can gain bonus points with Level/Badge Completion Bonus. If the required percentage (Required Score) of skills for the Badge or Level is reached, the Completion Bonus will be added to the Team scores. E.g.:

Skill: TLS everywhere; Score: 10
Skill: Update your Systems; Score: 30
Level: Green; Required Score: 1.0; Level Completion Bonus: 100

#Completion of all skills will resulting in:
    10 (Skill Score)
+   30 (Skill Score)
+  100 (Completion Bonus)
=> 140 Points

You can combine them of course:

Skill: TLS everywhere; Score: 10
Skill: Update your Systems; Score: 30
Level: Green; Required Score: 1.0; Score Multiplier: 1; Level Completion Bonus: 100
Badge: Encryption Master; Score Multiplier: 2

#Completion of all skills will resulting in:
    10 (Skill Score)
+   10 (Skill Score x Level Multiplier)
+   20 (Skill Score x Badge Multiplier)
+   30 (Skill Score)
+   30 (Skill Score x Level Multiplier)
+  100 (Level Completion Bonus)
=> 200 Points

Security

For maximum transparency and accessibility there is no user / role concept. Everyone can see and change everything. An exception is the technical Administrator. He configures rarely changing data like teams, levels, skills, etc. to hide the internal complexity.

We believe that this tool helps software development teams to track where they are performing well and where they can become improve to build better software. Any additional complexity level - processes, login, role models - will result in a decreasing motivation to use yet another tool during your daily business.

The easiest way to hide your internal data are IP whitelists on network level. Host this tool in your internal network and let everyone use and see it.

If you really want any kind of authentication/authorization process, build it, push it back into this repository but make it optional.

Default secrets / credentials

The default admin credentials are: admin/teamdojo, configured in src/main/resources/config/liquibase/users.csv.

The secret for the "Remember me" Cookie is configured in src/main/resources/config/application-prod.yml.

Please change the password and secret in your production environment.

Development

Here you can find the dev documentation.

Further Development (Status determination feature)

Determining the status of a skill acquired by a Team was reworked.

A combination of data from the Skill and Teamskill entities are used in the determination of the status.

The fields used in calculating the status are "irrelevant" and "completedAt" (From the TeamSkill Entity) and "expiryPeriod" (from the Skill Entity).

In the context of a given Team, a skill is in the

OPEN Status - If the TeamSkill.completedAt field is not set (that is null) and TeamSkill.irrelevant is not true

IRRELEVANT status - If the TeamSkill.irrelevant field is set to true, notwithstanding the values of the other fields.

ACHIEVED status - If the TeamSkill.completedAt field is set and the TeamSkill.irrelevant is not true and the TeamSkill.completedAt plus the SKill.expiryPeriod (in days) is later than the current date.

EXPIRING status - If the TeamSkill.completedAt field is set and the TeamSkill.irrelevant is not true, the current date is later than the TeamSkill.completedAt plus the SKill.expiryPeriod (in days) but not later than a 7-days grace period.

EXPIRED status - If the TeamSkill.completedAt field is set and the TeamSkill.irrelevant is not true, the current date is later than the TeamSkill.completedAt plus the SKill.expiryPeriod (in days) and the 7-days grace period is past.

The corresponding skill status for a team is determined and set in the AchievableSkillDTO and passed as part of the JSON string on to the frontend.

At the frontend, the skillstatus information in the JSON-string from the backend is deserialized into a typescript object (SkillStatus enum in the IAchievableSkill Typescript type).

The Skillstatus information at the frontend is used to calculate the number of teams that have acquired a given skill, to display the status of a skill for a given team, to toggle status from one state to another.