Growth/Team/Norms

This page is intended to document the Growth Team's norms and ceremonies. Team ceremonies for Growth is defined as a series of acts and processes performed regularly with the intention of creating an environment that promotes iterative improvement, innovation and productivity.

On this team, process is not intended to become performative, rather it is intended to provide the needed structure to:


 * Improve Iteratively; Learn and Adjust
 * Experiment
 * Fail Fast
 * Reflect
 * Collaborate
 * Share Knowledge, Wins & Lessons
 * With Each Other
 * Our Communities
 * The Foundation
 * Set and Meet Goals
 * Adding Value/Priorities > Scope
 * Wikimedia Foundation Annual Plan
 * Short and Long Term

Team ceremonies can be altered if it is collectively determined after trial they are not effective as is. Plans and goals are set as a baseline and something to strive towards. Plans and goals if not met should not result in condemnation or negative tones. Not meeting plans and goals should be viewed as an opportunity to learn what needs to be adjusted, rather it is process, priorities, scope or expectations.

Standup & Team Discussions
Traditionally, Scrum-style standups are at the start of the workday, and are meant to


 * 1) Serve as the first line of defense against wasting time. Specifically, this is the tightest feedback loop a team has as a group.
 * 2) Motivate the team through shared commitment.

This is generally accomplished through 3 classic questions:


 * What did you work on yesterday?
 * What will you work on today?
 * What is blocking you?

The Growth team, like many teams at WMF, uses a modified version of this approach, due mostly to the fact that the team is widely distributed across the world (and thus each person is on a different schedule). Synchronous time has a different meaning (e.g. the start of one day may be the end of another, even if there is overlap), and is precious (i.e. should only be used when necessary). The team modifies their standup as follows:


 * Synchronous (video) standups occur every Wednesday. The team may also standup attached to another meeting.
 * Typically, sync standups are 15 minutes and cover blockers.
 * Standups are generally an opportunity to share progress on work, raise tasks that could potentially impact others, or to escalate blockers that impede team productivity.
 * Topics that need to be explored in depth are held until discussion times on Mondays or Tuesdays, or ad-hoc, as needed.

Often, the team will cope with wide geographical distribution by assigning "homework," to mitigate the need for synchronous meetings. This will often take the form of a pre-recorded video or slide deck, which members of the team will watch ahead of a meeting to discuss it. The team agreed (at their retro on 2020-12-14) that the minimum time to get homework ahead of such a meeting is 2 days, not including the day the video was sent and the day the video will be discussed. The team refers to this as the "2-day Sandwich Norm."
 * Asynchronous (email/chat) standups occur every weekday.
 * GrowthStandupBot 9000 is a program run by Google Apps Script to automate daily emails to the team list.
 * The bot asks focuses on the current day, and is flexible depending on whom is responding. It asks for either what is planned for that day, or what was planned and how that went. Blockers are also appropriate to share.
 * The purpose of the thread is to
 * Notify other team members of your participation, so that they will be prompted to do so, too (vs adding to a document or etherpad and checking throughout the day).
 * Centralize the team's daily check-in on work, to help adjust priorities, and help one another, as needed.
 * Hold one another accountable for commitments.
 * This can also include sharing non-Growth-team work. For instance, to let the team know why you might not (or have not) engaged as much as expected.

Board Triage
Phab board triage occurs asynchronously. It is done by engineers as part of the daily chores process.

Planning Meetings
Planning Meetings are weekly meetings attended by the team on Mondays. During the planning meeting, the team identifies and prioritizes tasks that are to be completed for the next 1-2 weeks. Tasks prioritized for the upcoming month are to be represented on the Current Sprint board.

Retrospective Meetings
Retrospective Meetings (retros) are bi-weekly meetings attended by the team every other Monday. During Retrospectives, the team revisits action items from the last retrospective and reflects on the past two weeks progress by collectively answering the following:


 * Did we meet our acceptance criteria?
 * What have we accomplished?
 * What worked?
 * What could we improve next time?
 * What was confusing?

Action items will be captured during the meeting and due dates and action owners will be assigned.

Google Calendar
New members of the team will be added to the Growth team calendar. If a team member will be out of the office for four or more hours during a working day, they are to share it on the team calendar at the earliest indicator that they may be out. This practice will help the team manage expectations when estimating what work can get accomplished during planning. Team ceremonies will also be represented on the Google Calendar.

Gerrit
The Growth team uses Gerrit, a code collaboration tool, for peer code review.

Phabricator
Phabricator is the organization’s task/issue tracking tool that houses the Growth team’s user stories, tasks, progress and prioritization of work. Tickets at the top of the Ready for Development column in the Current Sprint Milestone are considered the highest priority and next up in the queue to work on.

Translations
Our software contains hundreds of text strings. We rely on volunteers and Product Ambassadors to translate these texts into various languages, and want to reduce the burden of translation as much as possible when adding new texts. In order to do so, we will:


 * 1) Use a prefix for draft message texts. For example, if the text is not finalized by product/design, engineers should use  This has two benefits:
 * 2) Visual reminder to product, design and engineering that we need to finalize the message.
 * 3) Longer message text, to allow us to better design for languages that are more verbose than English.
 * 4) Use a no-translate template in QQQ.json. Draft messages (those prefixed with "DRAFT:") should have the "notranslate" template at the end of the qqq.json message.
 * 5) Create a "finalize messages and qqq.json" task for an epic. For a given epic of work, there should be a task to finalize messages. In this task, we will make a patch to finalize the copy for en.json (removing the "DRAFT:" prefix) and the qqq.json (removing the "notranslate" template).
 * 6) Allow 7 days for translation. Once the text strings are finalized in step 3, we should allow for at least 7 days before enabling the feature for wide use. That allows ambassadors and volunteers time to translate the text. Examples:
 * 7) If the messages are finalized on Tuesday, after the branch cut, then the feature using these messages should not be enabled for broad use until the following Thursday, at the earliest.
 * 8) If the messages are finalized on a Friday, the messages should not be enabled for broad use until 13 days later, on Thursday (group2 deployment) at the earliest. That's because the translators would only have Saturday/Sunday/Monday to get translations done in time for the next week's train.

If updating an existing message
Sometimes, the Phabricator task will call for updating an existing message in a live feature, and the copy is not yet finalized.


 * If it is not feasible to add a feature flag for the new development, do not merge the patch until the copy is finalized. Engineers can set a -2 on the patch to make this obvious to reviewers.
 * If you can add a feature flag, then create a new i18n string for en.json / qqq.json using the {DRAFT} prefix in en.json and "notranslate" template in qqq.json, and use those strings in the feature flagged code. That patch is safe to merge. When the copy is finalized, we can delete the new string and copy the contents into the existing live feature's strings, or delete the live feature's strings from en.json/qqq.json in favor of the new feature's strings.