Commit 7093f5f9 authored by Eric Johnson's avatar Eric Johnson

First working PI page

performance indicators in YML
Page rendered at /handbook/engineering/performance-indicators
partial templates and helper functions
parent 6016bfed
Pipeline #68050454 passed with stages
in 23 minutes and 46 seconds
- name: Engineering Pulse Survey
description: A pulse survey is a brief, frequently sent survey that provides near-real-time information about satisfaction in time series. It usually consists of just 1-2 NPS-style questions like “How likely are you to recommend GitLab to your friends as a place to work?” , with an optional comment box for qualitative answers. This is unlike an annual, or bi-annual engagement survey that has much more content, but also has lower submission rates, and can only be sent infrequently.
orgs:
- Engineering
- Development
- Infrastructure
- Quality
- Security
- Support
- UX
is_key: false
maturity:
level: 2
reason: We have an MVC with graphs automated into Periscope. The level of manual work is minimal but can still be improved. Need to expand beyond 2 small teams.
health:
level: 3
reason: We have data from Q1 showing engagement and have received positive feedback on the format.
urls:
- https://gitlab.com/
next_steps:
- Next iteration to expand to the Ops teams (and beyond). https://gitlab.com/gitlab-com/www-gitlab-com/issues/4453
- Discuss with Product a viable implementation of this in the GitLab product
- We probably need our new PO business partner to start
- Need faceting by team/department/function while preserving anonymity
- We need to choose the right tool. Qualtrics, 6Q, CultureAmp, HazelHQ (Slack integration)
- The right tool needs to have an API, or otherwise be able to get data into Snowplow
- name: Hiring Actual vs Plan
description: Are we able to hire high quality workers to build our product vision in a timely manner?
orgs:
- Engineering
- Development
- Infrastructure
- Quality
- Security
- Support
- UX
is_key: true
maturity:
level: 3
reason: We have charts driven off of team.yml
health:
level: 1
reason: Engineering as a whole is on plan, but Development needs attention (see below)
urls:
- https://about.gitlab.com/handbook/hiring/charts/engineering-function/
next_steps:
- Development is a ~92% of plan and other departments are making up for the short fall. As you’ll see below we need to raise the rate of backend IC and manager hiring https://docs.google.com/document/d/1NNne33rOtkrogqWRzdQZ4U3kiZdc2PC6B44WCpmQpNc/edit#heading=h.n7ud5z3o36vo
- It’s going to be cleaner if we get this in Periscope. We need to select a system-of-record for vacancies (probably Greenhouse, Paul suggests snowplow, making the forecast near-real time is problematic) and build integrations into other data destinations (team.yml, chase’s financial planning sheet, etc)
......@@ -72,12 +72,62 @@ module CustomHelpers
end
def color_code_grades(grade)
grade = "<span style='color:green;'>#{grade}</span>" if grade.include? 'A'
grade = "<span style='color:green;'>#{grade}</span>" if grade.include? 'B'
grade = "<span style='color:orange;'>#{grade}</span>" if grade.include? 'C'
grade = "<span style='color:red;'>#{grade}</span>" if grade.include? 'D'
grade = "<span style='color:red;'>#{grade}</span>" if grade.include? 'F'
grade
color = "green" if grade.include? 'A'
color = "green" if grade.include? 'B'
color = "orange" if grade.include? 'C'
color = "red" if grade.include? 'D'
color = "red" if grade.include? 'F'
"<span style='color:#{color};'>#{grade}</span>"
end
def color_code_health(level)
case level
when 3
color = "green"
text = "Okay"
when 2
color = "orange"
text = "Problem"
when 1
color = "red"
text = "Fire"
else
color = "gray"
text = "Unknown"
end
"<span style='border-radius:0.2em; font-weight:bold; padding-left:1em; padding-right:1em; color:white; background-color:#{color};'>#{text}</span>"
end
def color_code_maturity(level)
color = case level
when 3
"green"
when 2
"orange"
when 1
"red"
else
"gray"
end
"<span style='border-radius:0.2em; font-weight:bold; padding-left:1em; padding-right:1em; color:white; background-color:#{color};'>Level #{level} of 3</span>"
end
def performance_indicators(org)
kpis = []
rpis = []
data.performance_indicators.select { |pi| pi.orgs.include? org }.each do |pi|
if pi.is_key == true
kpis.push(pi)
else
rpis.push(pi)
end
end
partial('includes/performance_indicators.html.erb', locals: { key_performance_indicators: kpis, regular_performance_indicators: rpis })
end
def font_url(current_page)
......
---
layout: markdown_page
title: "Engineering Performance Indicators"
---
## On this page
{:.no_toc}
- TOC
{:toc}
<%= performance_indicators("Engineering") %>
<h3 id="<%= performance_indicator.name.parameterize %>"><%= performance_indicator.name %></h3>
<p><%= performance_indicator.description %></p>
<b>URL(s)</b>
<ul>
<% performance_indicator.urls.each do |url| %>
<li><a href="<%= url %>"><%= url %></a></li>
<% end %>
</ul>
<b>Health: <%= color_code_health(performance_indicator.health.level) %></b>
<p><%= performance_indicator.health.reason %></p>
<b>Maturity: <%= color_code_maturity(performance_indicator.maturity.level) %></b>
<p><%= performance_indicator.maturity.reason %></p>
<b>Next Steps</b>
<ul>
<% performance_indicator.next_steps.each do |next_step| %>
<li><%= next_step %></li>
<% end %>
</ul>
## Key Performance Indicators
<% key_performance_indicators.each do |kpi| %>
<%= partial 'includes/performance_indicator', locals: { performance_indicator: kpi } %>
<% end %>
## Regular Performance Indicators
<% regular_performance_indicators.each do |rpi| %>
<%= partial 'includes/performance_indicator', locals: { performance_indicator: rpi } %>
<% end %>
## Legends
### Maturity
<table>
<tr>
<td><%= color_code_maturity(3) %></td>
<td>Meets full definition of KPI above</td>
</tr>
<tr>
<td><%= color_code_maturity(2) %></td>
<td>~66% done. <i>E.g.</i> Automated data collection, no threshold or dashboard</td>
</tr>
<tr>
<td><%= color_code_maturity(1) %></td>
<td>~33% done. <i>E.g.</i> Manually collected data</td>
</tr>
<tr>
<td><%= color_code_maturity(0) %></td>
<td>We only have an idea or a plan</td>
</tr>
</table>
### Health
<table>
<tr>
<td><%= color_code_health(3) %></td>
<td>The KPI is at an acceptable level compared to the threshold</td>
</tr>
<tr>
<td><%= color_code_health(2) %></td>
<td>This is a blip, or we’re going to watch it, or we just need to enact a proven intervention</td>
</tr>
<tr>
<td><%= color_code_health(1) %></td>
<td>We’ll prioritize our efforts here</td>
</tr>
<tr>
<td><%= color_code_health(0) %></td>
<td>Unknown</td>
</tr>
</table>
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment