From 36ff9504bc7136f3994d183ab62d2e2ac8a298be Mon Sep 17 00:00:00 2001 From: Graham McCarthy Date: Wed, 12 Jun 2019 16:57:32 -0400 Subject: [PATCH 01/13] :art: attempting to create multiple tracks. it is not working. --- components/SnowflakeApp.js | 6 +- constants_engineering.js | 1214 ++++++++++++++++++++++++++++++++++++ constants_product.js | 1202 +++++++++++++++++++++++++++++++++++ pages/engineering.js | 14 + pages/index.js | 45 +- pages/product.js | 14 + 6 files changed, 2488 insertions(+), 7 deletions(-) create mode 100644 constants_engineering.js create mode 100644 constants_product.js create mode 100644 pages/engineering.js create mode 100644 pages/product.js diff --git a/components/SnowflakeApp.js b/components/SnowflakeApp.js index 6a31b740..cb509e06 100644 --- a/components/SnowflakeApp.js +++ b/components/SnowflakeApp.js @@ -1,16 +1,16 @@ // @flow +import React from 'react' import TrackSelector from '../components/TrackSelector' import NightingaleChart from '../components/NightingaleChart' import KeyboardListener from '../components/KeyboardListener' import Track from '../components/Track' import Wordmark from '../components/Wordmark' import LevelThermometer from '../components/LevelThermometer' -import { eligibleTitles, trackIds, milestones, milestoneToPoints } from '../constants' import PointSummaries from '../components/PointSummaries' -import type { Milestone, MilestoneMap, TrackId } from '../constants' -import React from 'react' import TitleSelector from '../components/TitleSelector' +import { eligibleTitles, trackIds, milestones, milestoneToPoints } from '../constants' +import type { Milestone, MilestoneMap, TrackId } from '../constants' type SnowflakeAppState = { milestoneByTrack: MilestoneMap, diff --git a/constants_engineering.js b/constants_engineering.js new file mode 100644 index 00000000..e4e0cd52 --- /dev/null +++ b/constants_engineering.js @@ -0,0 +1,1214 @@ +// @flow +import * as d3 from 'd3' + +export type TrackId = 'MOBILE' | 'WEB_CLIENT' | 'FOUNDATIONS' | 'SERVERS' | + 'PROJECT_MANAGEMENT' | 'COMMUNICATION' | 'CRAFT' | 'INITIATIVE' | + 'CAREER_DEVELOPMENT' | 'ORG_DESIGN' | 'WELLBEING' | 'ACCOMPLISHMENT' | + 'MENTORSHIP' | 'EVANGELISM' | 'RECRUITING' | 'COMMUNITY' +export type Milestone = 0 | 1 | 2 | 3 | 4 | 5 + +export type MilestoneMap = { + 'MOBILE': Milestone, + 'WEB_CLIENT': Milestone, + 'FOUNDATIONS': Milestone, + 'SERVERS': Milestone, + 'PROJECT_MANAGEMENT': Milestone, + 'COMMUNICATION': Milestone, + 'CRAFT': Milestone, + 'INITIATIVE': Milestone, + 'CAREER_DEVELOPMENT': Milestone, + 'ORG_DESIGN': Milestone, + 'WELLBEING': Milestone, + 'ACCOMPLISHMENT': Milestone, + 'MENTORSHIP': Milestone, + 'EVANGELISM': Milestone, + 'RECRUITING': Milestone, + 'COMMUNITY': Milestone +} +export const milestones = [0, 1, 2, 3, 4, 5] + +export const milestoneToPoints = (milestone: Milestone): number => { + switch (milestone) { + case 0: return 0 + case 1: return 1 + case 2: return 3 + case 3: return 6 + case 4: return 12 + case 5: return 20 + default: return 0 + } +} + +export const pointsToLevels = { + '0': '1.1', + '5': '1.2', + '11': '1.3', + '17': '2.1', + '23': '2.2', + '29': '2.3', + '36': '3.1', + '43': '3.2', + '50': '3.3', + '58': '4.1', + '66': '4.2', + '74': '4.3', + '90': '5.1', + '110': '5.2', + '135': '5.3', +} + +export const maxLevel = 135 + +export type Track = { + displayName: string, + category: string, // TK categoryId type? + description: string, + milestones: { + summary: string, + signals: string[], + examples: string[] + }[] +} + +type Tracks = {| + 'MOBILE': Track, + 'WEB_CLIENT': Track, + 'FOUNDATIONS': Track, + 'SERVERS': Track, + 'PROJECT_MANAGEMENT': Track, + 'COMMUNICATION': Track, + 'CRAFT': Track, + 'INITIATIVE': Track, + 'CAREER_DEVELOPMENT': Track, + 'ORG_DESIGN': Track, + 'WELLBEING': Track, + 'ACCOMPLISHMENT': Track, + 'MENTORSHIP': Track, + 'EVANGELISM': Track, + 'RECRUITING': Track, + 'COMMUNITY': Track +|} + +export const tracks: Tracks = { + "MOBILE": { + "displayName": "Mobile", + "category": "A", + "description": "Develops expertise in native mobile platform engineering, such as iOS or Android", + "milestones": [{ + "summary": "Works effectively within established iOS or Android architectures, following current best practices", + "signals": [ + "Delivers features requiring simple local modifications", + "Adds simple actions that call server endpoints", + "Reuses existing components appropriately", + ], + "examples": [ + "Added existing button to a different iOS view", + "Add button to add item on Android", + "Fetched and displayed items using existing item styles", + ], + }, { + "summary": "Develops new instances of existing architecture, or minor improvements to existing architecture", + "signals": [ + "Defines new useful and appropriate objects", + "Creates simple new activities on Android", + "Migrates code from old patterns to new patterns", + ], + "examples": [ + "Upgraded Alamofire to a new major version", + "Added support for rendering a new type of data endpoint", + "Prototyped a simple new feature quickly", + ], + }, { + "summary": "Designs major new features and demonstrates a nuanced understanding of mobile platform constraints", + "signals": [ + "Implements complex features with a large product surface area", + "Works effectively with Android reactive programming framework", + "Adds support for new iOS features after a major iOS version upgrade", + ], + "examples": [ + "Designed and personally implemented an iOS caching strategy for offline reading", + "Built series reader on Android", + "Informed the team about recent best practice changes and deprecations", + ], + }, { + "summary": "Builds complex, reusable architectures that pioneer best practices and enable engineers to work more effectively", + "signals": [ + "Pioneers architecture migration strategies that reduce programmer burden", + "Fixes subtle memory management issues", + "Implements interactive dismissals that bring delight", + ], + "examples": [ + "Upgraded CocoaPods to a new major version", + "Designed architecture for fetching and rendering stream items", + "Migrated Android persistance layer to reactive programming", + ], + }, { + "summary": "Is an industry-leading expert in mobile engineering or sets strategic mobile direction for an eng team", + "signals": [ + "Defines long-term goals and ensures active projects are in service of them", + "Designs and builds innovative, industry-leading UI interactions", + "Invents new techniques to responsibly stretch limits of the Android platform", + ], + "examples": [ + "Defined and drove complete migration plan to Swift or Kotlin", + "Implemented Android recycler views before platform support existed", + "Pioneered application-level abstractions for multi-app environment", + ], + }], + }, + + "WEB_CLIENT": { + "displayName": "Web client", + "category": "A", + "description": "Develops expertise in web client technologies, such as HTML, CSS, and JavaScript", + "milestones": [{ + "summary": "Works effectively within established web client architectures, following current best practices", + "signals": [ + "Makes minor modifications to existing screens", + "Fixes simple design quality issues", + "Uses CSS appropriately, following style guide", + ], + "examples": [ + "Implemented sticky item adder on the item detail page", + "Hooked up the action to delete an item from an agenda", + "Built a new page using ready made scaffolding for EmberJS", + ], + }, { + "summary": "Develops new instances of existing architecture, or minor improvements to existing architecture", + "signals": [ + "Makes sensible abstractions based on template and code patterns", + "Specs and builds interactive components independently", + "Prototypes simple new features quickly", + ], + "examples": [ + "Built paginated page component", + "Created shared buttons template", + "Uses and understand how Ember-Data works ", + ], + }, { + "summary": "Designs major new features and demonstrates a nuanced understanding of browser constraints", + "signals": [ + "Provides useful design feedback and suggests feasible alternatives", + "Performs systemic tasks to significantly minimise bundle size", + "Acts a caretaker for all of web client code", + ], + "examples": [ + "Designed font loading strategy for SoapBox", + "Researched utility of service workers for SoapBox", + "Designed and implemented A major feature in the app", + ], + }, { + "summary": "Builds complex, reusable architectures that pioneer best practices and enable engineers to work more effectively", + "signals": [ + "Pioneers architecture migrations that reduce programmer burden", + "Implements complex UI transitions that bring delight", + "Makes architectural decisions that eliminate entire classes of bugs", + ], + "examples": [ + "Designed and implemented a significant SoapBox component library asset", + "Implemented SoapBox's complex microsoft teams embedded frame view", + "Designed and pioneered local storage model for front-end authentication", + ], + }, { + "summary": "Is an industry-leading expert in web client or sets strategic web client direction for an eng team", + "signals": [ + "Invents new techniques to innovate and overcome browser constraints", + "Identifies and solved systemic problems with current architecture", + "Defines a long-term vision for web client and ensures projects are in service of it", + ], + "examples": [ + "Invented CSS in JS", + "Defined and drove migration strategy to EmberJS from JQuery", + "Implemented unidirectional data flow to completion", + ], + }], + }, + + "FOUNDATIONS": { + "displayName": "Foundations", + "category": "A", + "description": "Develops expertise in foundational systems, such as deployments, pipelines, databases and machine learning", + "milestones": [{ + "summary": "Works effectively within established structures, following current best practices", + "signals": [ + "Writes thorough postmortems for service outages", + "Makes simple configuration changes to services", + "Performs backfills safely and effectively, without causing pages", + ], + "examples": [ + "Made safe and effective AWS changes", + "Implemented new ETL pipelines based on existing ones", + "Resolved out of disk errors independently", + ], + }, { + "summary": "Develops new instances of existing architecture, or minor improvements to existing architecture", + "signals": [ + "Made minor version upgrades to technologies", + "Builds machine learning jobs within the ML framework", + "Triages service issues correctly and independently", + ], + "examples": [ + "Upgraded NodeJS from 8.0 to 8.1.1", + "Built custom packages for RPMs", + "Improved ETL efficiency by improving Dynamo to S3 loading", + ], + }, { + "summary": "Designs standalone systems of moderate complexity, or major new features in existing systems", + "signals": [ + "Acts as primary maintainer for existing critical systems", + "Designs moderately complex systems", + "Makes major version upgrades to libraries", + ], + "examples": [ + "Designed AWS configuration management", + "Built SoapBox's realtime stats pipeline and monitoring dashboard", + "Designed flexible framework for writing machine learning jobs", + ], + }, { + "summary": "Builds complex, reusable architectures that pioneer best practices for other engineers, or multi-system services", + "signals": [ + "Designs complex projects that encompass multiple systems and technologies", + "Demonstrates deep knowledge of foundational systems", + "Introduces new databases and technologies to meet underserved needs", + ], + "examples": [ + "Designed and built caching service for improved data performance management", + "Designed AWS configuration management", + "Introduced Kinesis and pioneered streaming events pipeline", + ], + }, { + "summary": "Is an industry-leading expert in foundational engineering or sets strategic foundational direction for an eng team", + "signals": [ + "Designs transformational projects in service of long-term goals", + "Defines the strategic vision for foundational work and supporting technologies", + "Invents industry-leading techniques to solve complex problems", + ], + "examples": [ + "Invented a novel ML technique that advanced the state of the art", + "Defined and developed SoapBox's continuous delivery strategy", + "Developed and implemented High Availability strategy", + ], + }], + }, + + "SERVERS": { + "displayName": "Servers", + "category": "A", + "description": "Develops expertise in server side engineering, using technologies such as PHP, NodeJS, or Python and creating performant REST APIs.", + "milestones": [{ + "summary": "Works effectively within established server side frameworks, following current best practices", + "signals": [ + "Adds NodeJS endpoints using layers architecture", + "Adds Service endpoints using Laravel PHP Framework", + "Makes minor server changes to support client needs", + ], + "examples": [ + "Added IFTTT trigger for adding items to SoapBox", + "Added a RESTful DELETE API endpoint for item management", + "Created a minor PHP Artisan command for a Laravel function", + ], + }, { + "summary": "Develops new instances of existing architecture, or minor improvements to existing architecture", + "signals": [ + "Assesses correctness and utility of existing code and avoids blind copy-pasting", + "Generalizes code when appropriate", + "Determines data needs from product requirements", + ], + "examples": [ + "Identified need for new index on Algolia", + "Acted as caretaker for API routes management", + "Updated version and codebase dependencies without errors", + ], + }, { + "summary": "Designs standalone systems of moderate complexity, or major new features in existing systems", + "signals": [ + "Acts as primary maintainer for existing critical systems", + "Integrates third party services effectively", + "Writes playbooks for new service maintenance", + ], + "examples": [ + "Implemented Google Auth login to SoapBox", + "Implemented payments integration with Stripe", + "Built Email Delivery services and deployed servers ", + ], + }, { + "summary": "Builds complex, reusable architectures that pioneer best practices for other engineers, or multi-system services", + "signals": [ + "Delivers complex systems that achieve their goals", + "Avoids subtle architectural mistakes when considering new systems", + "Makes appropriate buy vs build choices", + ], + "examples": [ + "Designed SoapBox's cursor management for paged data feeds", + "Designed custom domains architecture", + "Created Idempotency framework for proper API management", + ], + }, { + "summary": "Is an industry-leading expert in server side engineering or sets strategic server side direction for an eng team", + "signals": [ + "Designs transformational projects of significant complexity and scope", + "Makes decisions that have positive, long term, wide ranging consequences", + "Identifies and solves systemic problems with current architecture", + ], + "examples": [ + "Researched, vetted, and selected Laravel as SoapBox's primary backend language", + "Defined microservices architecture and migration plan for V4 -> V5 customers", + "Defined and implemented proprietary IP core to the company's success", + ], + }], + }, + + "PROJECT_MANAGEMENT": { + "displayName": "Project management", + "category": "B", + "description": "Delivers well-scoped programs of work that meet their goals, on time, to budget, harmoniously", + "milestones": [{ + "summary": "Effectively delivers individual tasks", + "signals": [ + "Estimates small tasks accurately", + "Delivers tightly-scoped projects efficiently", + "Writes effective technical specs outlining approach", + ], + "examples": [ + "Wrote the technical spec for featured post images", + "Delivered stream item support for email digests", + "Delivered payment billing history project", + ], + }, { + "summary": "Effectively delivers small personal projects", + "signals": [ + "Performs research and considers alternative approaches", + "Balances pragmatism and polish appropriately", + "Defines and hits interim milestones", + ], + "examples": [ + "Delivered comment messaging interface", + "Delivered file uploading for web client", + "Executed the recommends database backfills for priority sorting", + ], + }, { + "summary": "Effectively delivers projects through a small team", + "signals": [ + "Delegates tasks to others appropriately", + "Integrates business needs into project planning", + "Chooses appropriate project management strategy based on context", + ], + "examples": [ + "Ran project retro to assess improvement opportunities", + "Completed launch checklist unprompted for well controlled rollout", + "Facilitated project kickoff meeting to get buy-in", + ], + }, { + "summary": "Effectively delivers projects through a large team, or with a significant amount of stakeholders or complexity", + "signals": [ + "Finds ways to deliver requested scope faster, and prioritizes backlog", + "Manages dependencies on other projects and teams", + "Leverages recognition of repeated project patterns", + ], + "examples": [ + "Oversaw technical delivery of Agenda Templates Project", + "Managed infrastructure migration to virtual private clouds", + "Involved marketing, legal, and appropriate functions at project start", + ], + }, { + "summary": "Manages major company pushes delivered by multiple teams", + "signals": [ + "Considers external constraints and business objectives when planning", + "Leads teams of teams, and coordinates effective cross-functional collaboration", + "Owns key company metrics", + ], + "examples": [ + "Managed technical migration to SOA", + "Lead technical delivery of migration from SoapBox V4 to V5", + "Delivered multi-month engineering project on time", + ], + }], + }, + + "COMMUNICATION": { + "displayName": "Communication", + "category": "B", + "description": "Shares the right amount of information with the right people, at the right time, and listens effectively", + "milestones": [{ + "summary": "Communicates effectively to close stakeholders when called upon, and incorporates constructive feedback", + "signals": [ + "Communicates project status clearly and effectively", + "Collaborates with others with empathy", + "Asks for help at the appropriate juncture", + ], + "examples": [ + "Updated SoapBox github wiki when performing install scripts and run into errors", + "Updated project status changes in JIRA promptly", + "Gave thoughtful check-in and check-out comments", + ], + }, { + "summary": "Communicates with the wider team appropriately, focusing on timeliness and good quality conversations", + "signals": [ + "Practises active listening and suspension of attention", + "Ensures stakeholders are aware of current blockers", + "Chooses the appropriate tools for accurate and timely communication", + ], + "examples": [ + "Received and integrated critical feedback positively", + "Created cross-team Slack channel for revenue based work", + "Spoke to domain experts before writing spec", + ], + }, { + "summary": "Proactively shares information, actively solicits feedback, and facilitates communication for multiple stakeholders", + "signals": [ + "Resolves communication difficulties between others", + "Anticipates and shares schedule deviations in plenty of time", + "Manages project stakeholder expectations effectively", + ], + "examples": [ + "Directed team response effectively during outages", + "Gave a substantial Eng All Hands presentation on EmberJS", + "Gave notice of upcoming related work in Eng Briefing", + ], + }, { + "summary": "Communicates complex ideas skillfully and with nuance, and establishes alignment within the wider organization", + "signals": [ + "Communicates project risk and tradeoffs skillfully and with nuance", + "Contextualizes and clarifies ambiguous direction and strategy for others", + "Negotiates resourcing compromises with other teams", + ], + "examples": [ + "Lead off-site workshop on interviewing", + "Wrote SoapBox's growth framework and rationale", + "Aligned the entire organization around Discussions development", + ], + }, { + "summary": "Influences outcomes at the highest level, moves beyond mere broadcasting, and sets best practices for others", + "signals": [ + "Defines processes for clear communication for the entire team", + "Shares the right amount of information with the right people, at the right time", + "Develops and delivers plans to execs, the board, and outside investors", + ], + "examples": [ + "Organized half year check-in company offsite", + "Created the communication plan for a large organizational change", + "Presented to the board about key company metrics and projects", + ], + }], + }, + + "CRAFT": { + "displayName": "Craft", + "category": "B", + "description": "Embodies and promotes practices to ensure excellent quality products and services", + "milestones": [{ + "summary": "Delivers consistently good quality work", + "signals": [ + "Tests new code thoroughly, both locally, and in production once shipped", + "Writes tests for every new feature and bug fix", + "Writes clear comments and documentation", + ], + "examples": [ + "Caught a bug by QAing onw work before it went live", + "Landed non-trivial PR with no caretaker comments", + "Wrote hermetic tests for the happy and sad cases", + ], + }, { + "summary": "Increases the robustness and reliability of codebases, and devotes time to polishing products and systems", + "signals": [ + "Refactors existing code to make it more testable", + "Adds tests for uncovered areas", + "Deletes unnecessary code and deprecates proactively when safe to do so", + ], + "examples": [ + "Requested tests for a PR when acting as reviewer", + "Reduced the number of sentry exceptions", + "Fixed a TODO for someone else in the codebase", + ], + }, { + "summary": "Improves others' ability to deliver great quality work", + "signals": [ + "Implements systems that enable better testing", + "Gives thoughtful code reviews as a domain expert", + "Adds tooling to improve code quality", + ], + "examples": [ + "Improved performance of travis scripts to run the same volume of tests faster", + "Simplified hermetic test data modification", + "Created system for improved and accessible visual quality", + ], + }, { + "summary": "Advocates for and models great quality with proactive actions, and tackles difficult and subtle system issues", + "signals": [ + "Builds systems so as to eliminate entire classes of programmer error", + "Focuses the team on quality with regular reminders", + "Coordinates Watch priorities and projects", + ], + "examples": [ + "Added code coverage reporting to iOS CI pipeline", + "Iterated repeatedly to develop SoapBox's underlines solution", + "Defined and oversaw plan for closing Heartbleed vulnerability", + ], + }, { + "summary": "Enables and encourages the entire organization to make quality a central part of the development process", + "signals": [ + "Defines policies for the engineering org that encourage quality work", + "Identifies and eliminates single points of failure throughout the organization", + "Secures time and resources from execs to support great quality", + ], + "examples": [ + "Negotiated resources for Fix-It week with SLT", + "Instituted and ensured success of a 20% time policy", + "Started a guild to tackle system vulnerabilties and squash bugs", + ], + }], + }, + + "INITIATIVE": { + "displayName": "Initiative", + "category": "B", + "description": "Challenges the status quo and effects positive organizational change outside of mandated work", + "milestones": [{ + "summary": "Identifies opportunities for organizational change or product improvements", + "signals": [ + "Writes project briefs about improvement opportunities", + "Raises meaningful tensions in tactical meetings", + "Asks leadership team probing questions at all hands", + ], + "examples": [ + "Wrote about problems with API performance issues", + "Wrote about content policy problems", + "Reported a site issue in Github/JIRA", + ], + }, { + "summary": "Causes change to positively impact a few individuals or minor improvement to an existing product or service", + "signals": [ + "Picks bugs off the backlog proactively when blocked elsewhere", + "Makes design quality improvements unprompted", + "Takes on trust and safety tasks proactively when blocked elsewhere", + ], + "examples": [ + "Advocated on own behalf for a change in role", + "Implemented flow typing for promises", + "Audited web client performance in Chrome and proposed fixes", + ], + }, { + "summary": "Causes change to positively impact an entire team or instigates a minor feature or service", + "signals": [ + "Demonstrates concepts proactively with prototypes", + "Fixes complicated bugs outside of regular domain", + "Takes ownership of systems that nobody owns or wants", + ], + "examples": [ + "Defined style guide to resolve style arguments", + "Proposed and implemented at-mentions prototype", + "Implemented file upload for Android independently, unprompted", + ], + }, { + "summary": "Effects change that has a substantial positive impact on the engineering organization or a major product impact", + "signals": [ + "Champions and pioneers new technologies to solve new classes of problem", + "Exemplifies grit and determination in the face of persistent obstacles", + "Instigates major new features, services, or architectures", + ], + "examples": [ + "Created the interviewing rubric and booklet", + "Implemented and secured support for native login", + "Migrated database to latest version of MYSQL unprompted to allow better unicode support across product", + ], + }, { + "summary": "Effects change that has a substantial positive impact on the whole company", + "signals": [ + "Creates a new function to solve systemic issues", + "Galvanizes the entire company and garners buy in for a new strategy", + "Changes complex organizational processes", + ], + "examples": [ + "Migrated the organization to using Agile methodologies", + "Built SoapBox chrome extention prototype and convinced execs to build it", + "Convinced leadership and engineering org to move to a microservices architecture", + ], + }], + }, + + "CAREER_DEVELOPMENT": { + "displayName": "Career development", + "category": "C", + "description": "Provides strategic support to engineers to help them build the career they want", + "milestones": [{ + "summary": "Gives insight into opportunities and helps identify individuals' strengths and weaknesses", + "signals": [ + "Advocates on behalf and in defense of a group member", + "Shares opportunities for improvements and recognises achievements", + "Explains appropriate available industry paths", + ], + "examples": [ + "Collected and delivered feedback", + "Discussed career options and areas of interest informally", + "Hosted an improving interviewing workshop session", + ], + }, { + "summary": "Formally supports and advocates for one person and provides tools to help them solve career problems", + "signals": [ + "Ensure a group member has an appropriate role on their team", + "Offers effective career advice to group members, without being prescriptive", + "Creates space for people to talk through challenges", + ], + "examples": [ + "Set up and attended regular, constructive 1:1s", + "Provided coaching on how to have difficult conversations", + "Taught group members the GROW model", + ], + }, { + "summary": "Inspires and retains a small group of people and actively pushes them to stretch themselves", + "signals": [ + "Discusses paths, and creates plans for personal and professional growth", + "Advocates to align people with appropriate roles within organization", + "Works with team leads to elevate emerging leaders", + ], + "examples": [ + "Reviewed individual group member progression every 6 weeks", + "Suggested appropriate group member for Tech Lead position", + "Arranged a requested switch of discipline for a group member", + ], + }, { + "summary": "Manages interactions and processes between groups, promoting best practices and setting a positive example", + "signals": [ + "Manages team transitions smoothly, respecting team and individual needs", + "Develops best practices for conflict resolution", + "Ensures all group members' roles are meeting their career needs", + ], + "examples": [ + "Completed training on situational leadership", + "Built a resourcing plan based on company, team, and individual goals", + "Prevented regretted attrition with intentional, targeted intervention", + ], + }, { + "summary": "Supports the development of a signficant part of the engineering org, and widely viewed as a trusted advisor", + "signals": [ + "Supports and develops senior leaders", + "Identified leadership training opportunities for senior leadership", + "Pushes everyone to be as good as they can be, with empathy", + ], + "examples": [ + "Provided coaching to group leads", + "Devised engineering growth curriculum for group leads", + "Advocated to execs for engineer development resources and programs", + ], + }], + }, + + "ORG_DESIGN": { + "displayName": "Org design", + "category": "C", + "description": "Defines processes and structures that enables the strong growth and execution of a diverse eng organization", + "milestones": [{ + "summary": "Respects and participates in processes, giving meaningful feedback to help the organization improve", + "signals": [ + "Reflects on meetings that leave them inspired or frustrated", + "Teaches others about existing processes", + "Actively participates and makes contributions within organizational processes", + ], + "examples": [ + "Facilitated effective tactical meeting with empathy", + "Explained tactical meeting format to a new hire", + "Provided feedback on sprint planning meeting", + ], + }, { + "summary": "Identifies opportunities to improve existing processes and makes changes that positively affect the local team", + "signals": [ + "Defines meeting structure and cadence that meets team needs", + "Engages in organizational systems thinking", + "Advocates for improved diversity and inclusion, and proposes ideas to help", + ], + "examples": [ + "Defined innovative meeting structure for small team", + "Improved support on-call rotation scheduling", + "Defined standard channels for inter-team communication", + ], + }, { + "summary": "Develops processes to solve ongoing organizational problems", + "signals": [ + "Creates programs that meaningfully improve organizational diversity", + "Solves long-standing organizational problems", + "Reallocates resources to meet organizational needs", + ], + "examples": [ + "Developed baseline team templates for consistency", + "Created bug-rotation program to address ongoing quality issues", + "Defined Guilds manifesto and charter", + ], + }, { + "summary": "Thinks deeply about organizational issues and identifies hidden dynamics that contribute to them", + "signals": [ + "Evaluates incentive structures and their effect on execution", + "Analyzes existing processes for bias and shortfall", + "Ties abstract concerns to concrete organizational actions or norms", + ], + "examples": [ + "Connected mobile recruiting difficulties to focus on excellence", + "Raised leadership level change discrepancies", + "Analyzed the hiring rubric for false negative potential", + ], + }, { + "summary": "Leads initiatives to address issues stemming from hidden dynamics and company norms", + "signals": [ + "Builds programs to train leadership in desired skills", + "Creates new structures that provide unique growth opportunities", + "Leads planning and communication for reorgs", + ], + "examples": [ + "Lead efforts to increase number of mobile engineers", + "Directed resources to meaningfully improve diversity at all levels", + "Built the growth framework rubric", + ], + }], + }, + + "WELLBEING": { + "displayName": "Wellbeing", + "category": "C", + "description": "Supports the emotional well-being of group members in difficult times, and celebrates their successes", + "milestones": [{ + "summary": "Uses tools and processes to help ensure colleagues are healthy and happy", + "signals": [ + "Keeps confidences unless legally or morally obliged to do otherwise", + "Applies the reasonable person principle to others", + "Avoids blame and focuses on positive change", + ], + "examples": [ + "Ensured group members were taking enough vacation", + "Put themself in another's shoes to understand their perspective", + "Checked in with colleague showing signs of burnout", + ], + }, { + "summary": "Creates a positive, supportive, engaging team environment for group members", + "signals": [ + "Sheds light on other experiences to build empathy and compassion", + "Validates ongoing work and sustains motivation", + "Proposes solutions when teams get bogged down or lose momentum", + ], + "examples": [ + "Coordinated a small celebration for a project launch", + "Connected tedious A|B testing project with overall company goals", + "Noted a team without a recent win and suggested some easy quick wins", + ], + }, { + "summary": "Manages expectations across peers, leads in the org, promotes calm, and prevents consensus building", + "signals": [ + "Trains group members to separate stimulus from response", + "Maintains a pulse on individual and team morale", + "Helps group members approach problems with curiosity", + ], + "examples": [ + "Completed training on transference and counter transference", + "Completed training on compromise and negotiation techniques", + "Reframed a problem as a challenge, instead of a barrier, when appropriate", + ], + }, { + "summary": "Advocates for the needs of teams and group members, and proactively works to calm the organization", + "signals": [ + "Ensures team environments are safe and inclusive, proactively", + "Grounds group member anxieties in reality", + "Tracks team retention actively and proposes solutions to strengthen it", + ], + "examples": [ + "Relieved org tension around product direction by providing extra context", + "Encouraged group members to focus on what they can control", + "Guided people through complex organizational change", + ], + }, { + "summary": "Manages narratives, channels negativity into inspiration and motivation, and protects the entire team", + "signals": [ + "Recognizes and points out narratives when appropriate", + "Works to reshape narratives from victimization to ownership", + "Increases the psychological safety of the entire team", + ], + "examples": [ + "Converted group member from a problem haver to a problem solver", + "Challenged false narrative and redirected to compassion and empathy", + "Cultivated and championed a culture of empathy within the entire team", + ], + }], + }, + + "ACCOMPLISHMENT": { + "displayName": "Accomplishment", + "category": "C", + "description": "Inspires day to day excellence, maximises potential and effectively resolves performance issues with compassion", + "milestones": [{ + "summary": "Helps individuals identify blockers and helps them identify next steps for resolution", + "signals": [ + "Notices when someone is stuck and reaches out", + "Helps others break down problems into feasible, tangible next steps", + "Talks through problems non-judgmentally", + ], + "examples": [ + "Completed training on diagnosing problems", + "Unblocked a group member", + "Reinforces and affirms positive feedback for good work", + ], + }, { + "summary": "Helps individuals resolve difficult performance issues, with insight, compassion, and skill", + "signals": [ + "Gathers context outside the immediate problem", + "Recognizes issues within local environment and suggests change", + "Works to encourage ownership of actions and responsibilities", + ], + "examples": [ + "Completed training on decision making", + "Convinced a group member to solve a problem directly, rather than doing it for them", + "Gave honest feedback about poor performance, with compassion", + ], + }, { + "summary": "Intervenes in long-standing performance issues with targeted behavior change or performance plans", + "signals": [ + "Aggregates signals of poor performance and creates process for improvement", + "Investigates motivation and externalities for consistent poor performance", + "Puts together comprehensive, achievable performance plans", + ], + "examples": [ + "Worked with group member to address persistent communication failures", + "Arranged a transfer to another team, resulting in improved performance", + "Managed group member closely to maximise chances of PIP success", + ], + }, { + "summary": "Mediates escalated situations, empowers underperforming teams, and resolves conflict", + "signals": [ + "Recognizes heightened situations and toxic or aggressive interactions", + "Inserts themself into conflict where appropriate to calm and mediate", + "Encourages open dialog and builds trust between parties in conflict", + ], + "examples": [ + "Empowered a team to drive forward amidst uncertainty", + "Protected team from externalities so they could focus on goals", + "Mediated sit-down between team members to address tension", + ], + }, { + "summary": "Resolves complex organizational dysfunction, or persistent conflict at senior levels", + "signals": [ + "Takes control of dysfunctional teams to organise chaos", + "Repairs broken team dynamics and builds harmony", + "Presides over a well-oiled team of teams", + ], + "examples": [ + "Turned around the performance of a problematic team", + "De-escalated serious tensions between teams", + "Rebuilt trust between senior team leads", + ], + }], + }, + + "MENTORSHIP": { + "displayName": "Mentorship", + "category": "D", + "description": "Provides support to colleagues, spreads knowledge, and develops the team outside formal reporting structures", + "milestones": [{ + "summary": "Informally mentors individuals in an ad-hoc way, supports new hires, and conveys institutional knowledge", + "signals": [ + "Makes themself available for informal support and advice", + "Acts as sounding board for peers and more junior members", + "Provides sound advice when asked", + ], + "examples": [ + "Acted as an onboarding buddy", + "Paired with an engineer to help them with an unfamiliar area", + "Helped a colleague understand their feelings", + ], + }, { + "summary": "Mentors people proactively, and guides people to realizations rather than providing the answer", + "signals": [ + "Takes time to explain concepts and best practices", + "Asks questions to illuminate concepts, rather than stating them", + "Allows others to lead efforts when it will help their development", + ], + "examples": [ + "Shared interesting article with a team member to help with their growth", + "Offered unprompted feedback to help growth, with empathy", + "Lead from behind to support someone new to a leadership role", + ], + }, { + "summary": "Teaches small groups of engineers and contributes to SoapBox's shared knowledge base", + "signals": [ + "Avoids siloing information when it can be usefully shared with others", + "Works to increase the bus factor of systems", + "Finds tools that work best for a team member's personality", + ], + "examples": [ + "Gave a brown bag presentation on payments", + "Wrote article for support team on how to properly investigate bugs with Microsoft Teams authentication", + "Wrote content on how to properly install and set up development environment", + ], + }, { + "summary": "Encourages people to mentor each other, and creates ways for them to do so", + "signals": [ + "Defines an entire curriculum for a discipline", + "Draws positive attention to well-modeled mentor and teaching behaviours", + "Creates brown bag series and lines up speakers", + ], + "examples": [ + "Created and lead SoapBox' Women in Eng group", + "Organized an Eng All Hands with an outside speaker", + "Designed and taught web client guild curriculum", + ], + }, { + "summary": "Instills and promotes a culture of learning and development within the team", + "signals": [ + "Sets incentive structures to recognise and reward mentorship", + "Empowers team members to develop themselves", + "Role models productive and healthy mentor relationships", + ], + "examples": [ + "Instituted the professional education budget for engineers", + "Mentored mentors", + "Started the eng advisor program and lined up external mentors", + ], + }], + }, + + "EVANGELISM": { + "displayName": "Evangelism", + "category": "D", + "description": "Promotes SoapBox to the outside world and establishes it as an attractive and thoughtful place to work", + "milestones": [{ + "summary": "Represents SoapBox well externally, and influences individuals positively", + "signals": [ + "Shares personal and organizational successes with their network", + "Attends SoapBox-hosted events and talks with guests", + "Communicates genuine and honest excitement about their work externally", + ], + "examples": [ + "Shared a SoapBox product launch post on Facebook", + "Acted as a guide for a non-friend visitor to the office", + "Supported PR efforts by giving a quote or having a photo taken", + ], + }, { + "summary": "Participates more centrally in small events, and takes simple actions that positively influence groups of people", + "signals": [ + "Takes meaningful action to introduce people to SoapBox", + "Joined public Slack group and represented Soapbox appropriately, and well", + "Organizes positive small- or medium-sized events that bring people to SoapBox", + ], + "examples": [ + "Volunteered as a helper for external code writing workshop", + "Organized a short tour of the office by college students", + "Talked at a Laravel Toronto event hosted at SoapBox", + ], + }, { + "summary": "Works hard to positively influence large groups of people on their views of Soapbox", + "signals": [ + "Mentors or participates in a high visibility way in an external organization", + "Builds fruitful partnerships with external organizations", + "Writes blog posts about Soapbox that receive moderate traffic", + ], + "examples": [ + "Represented Soapbox on a panel at a conference of industry experts", + "Established close ties with Creative Commons", + "Built a durable, long-standing org relationship with external not-for-profit", + ], + }, { + "summary": "Establishes Soapbox as an great, innovative company and workplace to the whole industry", + "signals": [ + "Establishes themself as an industry thought leader who attracts talent", + "Publishes material about Soapbox's organizational or technical innovations", + "Leverages significant following to evangelise Soapbox", + ], + "examples": [ + "Published a paper on Soapbox technology in a peer-reviewed journal", + "Authored joint-press releases", + "Published opinionated post on an Engineering blog internal or external", + ], + }, { + "summary": "Introduces Soapbox in a positive light to a wider audience outside the industry", + "signals": [ + "Delivers key messages to broad, mainstream audiences", + "Influences people with large audiences to talk about Soapbox positively", + "Drives recognition and adoption of Soapbox in significant numbers", + ], + "examples": [ + "Published or interviewed in a mainstream newspaper or website outside tech", + "Keynoted a conference with international attention", + "Represented Soapbox in national televised media", + ], + }], + }, + + "RECRUITING": { + "displayName": "Recruiting", + "category": "D", + "description": "Strengthens Soapbox's team by bringing in excellent staff members", + "milestones": [{ + "summary": "Brings new candidates into the pipeline and understands how to evaluate candidates at Soapbox", + "signals": [ + "Reviews existing network for hiring leads regularly", + "Shadows interviews to gain familiarity with process", + "Reviews current job postings regularly", + ], + "examples": [ + "Completed interview calibration", + "Set up casual sessions to practice asking questions", + "Referred appropriate individuals for open positions", + ], + }, { + "summary": "Interviews regularly, helps the team make meaningful hiring decisions, and helps build a diverse pipeline", + "signals": [ + "Uses interview rubric to provide clear, objective feedback on candidates", + "Interviews candidates with empathy and treats them all with equal respect", + "Researches approaches for sourcing candidates and diversifying hiring", + ], + "examples": [ + "Added observable evidence for every rating", + "Started a quarterly event for candidates to meet SoapBox employees", + "Tested a new service for quality and diversity of candidates", + ], + }, { + "summary": "Maintains and strengthens the integrity of the current process, and regularly brings in great candidates", + "signals": [ + "Teaches new interviewers how to interview with empathy", + "Models great interview technique and feedback when shadowed", + "Reverse shadows trainees and helps calibrate their feedback", + ], + "examples": [ + "Wrote new interview question which meets our question quality criteria", + "Brought candidates into our pipeline proactively, with a high conversion rate", + "Proposed useful, tangible improvements to the interview process", + ], + }, { + "summary": "Actively contributes to and leads hiring decisions, and goes to great lengths to source great candidates", + "signals": [ + "Documents subtle cues in interviews that indicate values alignment", + "Makes hiring decisions, resolving discrepancies between conflicting reports", + "Top-grades candidates and teases out character traits", + ], + "examples": [ + "Planned engineering summit on interview process and training", + "Organized and lead SoapBox's presence at a recruitment fair", + "Started a SoapBox internship program", + ], + }, { + "summary": "Sets recruitment strategy, invests in long-term relationships for critical roles, and recruits at scale", + "signals": [ + "Sets the tone, policy and goals around building a diverse, high-quality team", + "Identifies and brings in promising acquisitions", + "Tracks industry activity, identifying opportunities for critical roles", + ], + "examples": [ + "Talked with a senior candidate over many months to fill a critical role", + "Organized efforts around convincing acquired engineers to join and stay", + "Set goals, then tracked and reported metrics on team demographics over time", + ], + }], + }, + + "COMMUNITY": { + "displayName": "Community", + "category": "D", + "description": "Builds community internally, gives of themself to the team, and champions and extols company values", + "milestones": [{ + "summary": "Is available and present on current teams, and works to contribute positively to company culture", + "signals": [ + "Participates in team activities and offsites", + "Treats colleagues and clients with respect", + "Joins groups or committees outside regular duties", + ], + "examples": [ + "Joined and actively participated in the web client guild", + "Brought a small gift back from vacation for the team", + "Wrote entertaining and informative Prod Ops writeups", + ], + }, { + "summary": "Steps up, builds connectedness, and takes concrete actions to promote an inclusive culture", + "signals": [ + "Makes space for others to participate", + "Collaborates with other engineers outside direct responsibilities", + "Finds ways to ramp up and engage new hires quickly", + ], + "examples": [ + "Created onboarding bingo", + "Brought shy and introverted people into a dominant conversation", + "Volunteered as secretary for a team", + ], + }, { + "summary": "Contributes to improving team relatedness, and helps build a culture of lending support", + "signals": [ + "Takes on additional support shifts at short notice", + "Pitches in to help other teams hit deadlines, without missing own deadlines", + "Uses position to raise difficult issues on someone's behalf", + ], + "examples": [ + "Helped with support calls while still contributing to projects", + "Organizes team building events", + "Stayed positive and improved team morale during period after layoffs", + ], + }, { + "summary": "Exemplifies selflessness for the team without compromising responsibilities, and lifts everyone up", + "signals": [ + "Goes above and beyond on the Watch, serving the team without complaint", + "Implements concrete programs to signficantly improve team inclusivity", + "Takes on large amounts of tedious grunt work for the team without being asked", + ], + "examples": [ + "Devoted large amount of time to helping outside direct responsibilities", + "Refactored hundreds of legacy files", + "Acted as sole maintainer of LinkifyJS for years", + ], + }, { + "summary": "Lives the company values, guards positive culture, and defines policies that support relatedness between teams", + "signals": [ + "Brings separate teams together to build relatedness", + "Holds individuals, teams, and leadership accountable to SoapBox's values", + "Sets the tone, policy, and goals around maintaining an inclusive company", + ], + "examples": [ + "Organizes events for whole org", + "Devised, delivered and acted on findings from an engineer happiness survey", + "Challenged and corrected exclusionary behaviour or policies", + ], + }], + }, +} + +export const trackIds: TrackId[] = Object.keys(tracks) + +export const categoryIds: Set = trackIds.reduce((set, trackId) => { + set.add(tracks[trackId].category) + return set +}, new Set()) + +export const categoryPointsFromMilestoneMap = (milestoneMap: MilestoneMap) => { + let pointsByCategory = new Map() + trackIds.forEach((trackId) => { + const milestone = milestoneMap[trackId] + const categoryId = tracks[trackId].category + let currentPoints = pointsByCategory.get(categoryId) || 0 + pointsByCategory.set(categoryId, currentPoints + milestoneToPoints(milestone)) + }) + return Array.from(categoryIds.values()).map(categoryId => { + const points = pointsByCategory.get(categoryId) + return { categoryId, points: pointsByCategory.get(categoryId) || 0 } + }) +} + +export const totalPointsFromMilestoneMap = (milestoneMap: MilestoneMap): number => + trackIds.map(trackId => milestoneToPoints(milestoneMap[trackId])) + .reduce((sum, addend) => (sum + addend), 0) + +export const categoryColorScale = d3.scaleOrdinal() + .domain(categoryIds) + .range(['#24acfc', '#8147FC', '#b7dc50', '#00D7C8']) + +export const titles = [ + {label: 'Engineer I', minPoints: 0, maxPoints: 16}, + {label: 'Engineer II', minPoints: 17, maxPoints: 35}, + {label: 'Sr. Engineer', minPoints: 36, maxPoints: 57}, + {label: 'Team Lead', minPoints: 36, maxPoints: 57}, + {label: 'Engineering Manager', minPoints: 36, maxPoints: 57}, + {label: 'Staff Engineer', minPoints: 58, maxPoints: 89}, + {label: 'Sr. Team Lead', minPoints: 58, maxPoints: 89}, + {label: 'Sr. Engineering Manager', minPoints: 58, maxPoints: 89}, + {label: 'Principal Engineer', minPoints: 90}, + {label: 'Dir. Engineering', minPoints: 90} +] + +export const eligibleTitles = (milestoneMap: MilestoneMap): string[] => { + const totalPoints = totalPointsFromMilestoneMap(milestoneMap) + + return titles.filter(title => (title.minPoints === undefined || totalPoints >= title.minPoints) + && (title.maxPoints === undefined || totalPoints <= title.maxPoints)) + .map(title => title.label) +} diff --git a/constants_product.js b/constants_product.js new file mode 100644 index 00000000..f74d5247 --- /dev/null +++ b/constants_product.js @@ -0,0 +1,1202 @@ +// @flow +import * as d3 from 'd3' + +export type TrackId = 'MOBILE' | 'WEB_CLIENT' | 'FOUNDATIONS' | 'SERVERS' | + 'PROJECT_MANAGEMENT' | 'COMMUNICATION' | 'CRAFT' | 'INITIATIVE' | + 'CAREER_DEVELOPMENT' | 'ORG_DESIGN' | 'WELLBEING' | 'ACCOMPLISHMENT' | + 'MENTORSHIP' | 'EVANGELISM' | 'RECRUITING' | 'COMMUNITY' +export type Milestone = 0 | 1 | 2 | 3 | 4 | 5 + +export type MilestoneMap = { + 'MOBILE': Milestone, //market understanding + 'WEB_CLIENT': Milestone, //Product strategy + 'FOUNDATIONS': Milestone, //product Analysis + 'SERVERS': Milestone, //Product Design + 'PROJECT_MANAGEMENT': Milestone, + 'COMMUNICATION': Milestone, + 'CRAFT': Milestone, + 'INITIATIVE': Milestone, + 'CAREER_DEVELOPMENT': Milestone, + 'ORG_DESIGN': Milestone, + 'WELLBEING': Milestone, + 'ACCOMPLISHMENT': Milestone, + 'MENTORSHIP': Milestone, + 'EVANGELISM': Milestone, + 'RECRUITING': Milestone, + 'COMMUNITY': Milestone +} +export const milestones = [0, 1, 2, 3, 4, 5] + +export const milestoneToPoints = (milestone: Milestone): number => { + switch (milestone) { + case 0: return 0 + case 1: return 1 + case 2: return 3 + case 3: return 6 + case 4: return 12 + case 5: return 20 + default: return 0 + } +} + +export const pointsToLevels = { + '0': '1.1', + '5': '1.2', + '11': '1.3', + '17': '2.1', + '23': '2.2', + '29': '2.3', + '36': '3.1', + '43': '3.2', + '50': '3.3', + '58': '4.1', + '66': '4.2', + '74': '4.3', + '90': '5.1', + '110': '5.2', + '135': '5.3', +} + +export const maxLevel = 135 + +export type Track = { + displayName: string, + category: string, // TK categoryId type? + description: string, + milestones: { + summary: string, + signals: string[], + examples: string[] + }[] +} + +type Tracks = {| + 'MOBILE': Track, + 'WEB_CLIENT': Track, + 'FOUNDATIONS': Track, + 'SERVERS': Track, + 'PROJECT_MANAGEMENT': Track, + 'COMMUNICATION': Track, + 'CRAFT': Track, + 'INITIATIVE': Track, + 'CAREER_DEVELOPMENT': Track, + 'ORG_DESIGN': Track, + 'WELLBEING': Track, + 'ACCOMPLISHMENT': Track, + 'MENTORSHIP': Track, + 'EVANGELISM': Track, + 'RECRUITING': Track, + 'COMMUNITY': Track +|} + +export const tracks: Tracks = { + "MOBILE": { + "displayName": "Market understanding", + "category": "A", + "description": "Assess and value market opportunities, monitor competitors, identify trends", + "milestones": [{ + "summary": "Understand the job to be done for a product", + "signals": [ + "Gather feedback from stakeholders to identify minimum viable product or minimum marketable feature", + "Communicate requirements to the engineering team", + ], + "examples": [ + "Wrote product brief for modifying Private Notes based on customer feedback", + ], + }, { + "summary": "Understand the market demand for a feature or product", + "signals": [ + "Understands the competitive landscape, approximate pricing and total market size", + "Understands the target user and communicates it to the team", + "Prototypes simple new features quickly", + ], + "examples": [ + "Built a product brief / product requirements document for Next Steps pro feature set", + "Built a competitive matrix comparing SoapBox app feature set vs competitors", + ], + }, { + "summary": "Indentifies the total addressable market for specific products", + "signals": [ + "Works with other departments to approximate total market and provides realistic revenue goals", + "Uses market opportunities to prioritize one product or feature request over another", + ], + "examples": [ + "Worked with marketing to determine competitor average pricing for tech sector utilization and identified total market opportunity and influenced internal pricing discussion", + "Worked with marketing department to craft message specific to target users", + ], + }, { + "summary": "Independently identifies, assesses and communicates market opportunities", + "signals": [ + "Familiarity with tech domain allows PM to identify adjacent market opportunities", + "Proposes alternative paths forward to management team", + ], + "examples": [ + "Demonstrated that minor changes to product would provide a higher conversion rate and increase total market opportunity, presented to management", + ], + }, { + "summary": "Is considered an expert on company strategy to identify and assess market opportunities", + "signals": [ + "Has systemized methodology for assessing opportunities and regularly develops strategy to address", + "Clearly compares competing opportunities and evaluates which present the highest opportunity for growth", + ], + "examples": [ + "Identified market opportunity, effectively created organizational alignment around it and changed company direction", + ], + }], + }, + + "WEB_CLIENT": { + "displayName": "Product strategy", + "category": "A", + "description": "Develops expertise in web client technologies, such as HTML, CSS, and JavaScript", + "milestones": [{ + "summary": "Works effectively within established web client architectures, following current best practices", + "signals": [ + "Makes minor modifications to existing screens", + "Fixes simple design quality issues", + "Uses CSS appropriately, following style guide", + ], + "examples": [ + "Implemented sticky item adder on the item detail page", + "Hooked up the action to delete an item from an agenda", + "Built a new page using ready made scaffolding for EmberJS", + ], + }, { + "summary": "Develops new instances of existing architecture, or minor improvements to existing architecture", + "signals": [ + "Makes sensible abstractions based on template and code patterns", + "Specs and builds interactive components independently", + "Prototypes simple new features quickly", + ], + "examples": [ + "Built paginated page component", + "Created shared buttons template", + "Uses and understand how Ember-Data works ", + ], + }, { + "summary": "Designs major new features and demonstrates a nuanced understanding of browser constraints", + "signals": [ + "Provides useful design feedback and suggests feasible alternatives", + "Performs systemic tasks to significantly minimise bundle size", + "Acts a caretaker for all of web client code", + ], + "examples": [ + "Designed font loading strategy for SoapBox", + "Researched utility of service workers for SoapBox", + "Designed and implemented A major feature in the app", + ], + }, { + "summary": "Builds complex, reusable architectures that pioneer best practices and enable engineers to work more effectively", + "signals": [ + "Pioneers architecture migrations that reduce programmer burden", + "Implements complex UI transitions that bring delight", + "Makes architectural decisions that eliminate entire classes of bugs", + ], + "examples": [ + "Designed and implemented a significant SoapBox component library asset", + "Implemented SoapBox's complex microsoft teams embedded frame view", + "Designed and pioneered local storage model for front-end authentication", + ], + }, { + "summary": "Is an industry-leading expert in web client or sets strategic web client direction for an eng team", + "signals": [ + "Invents new techniques to innovate and overcome browser constraints", + "Identifies and solved systemic problems with current architecture", + "Defines a long-term vision for web client and ensures projects are in service of it", + ], + "examples": [ + "Invented CSS in JS", + "Defined and drove migration strategy to EmberJS from JQuery", + "Implemented unidirectional data flow to completion", + ], + }], + }, + + "FOUNDATIONS": { + "displayName": "Product analysis", + "category": "A", + "description": "Develops expertise in foundational systems, such as deployments, pipelines, databases and machine learning", + "milestones": [{ + "summary": "Works effectively within established structures, following current best practices", + "signals": [ + "Writes thorough postmortems for service outages", + "Makes simple configuration changes to services", + "Performs backfills safely and effectively, without causing pages", + ], + "examples": [ + "Made safe and effective AWS changes", + "Implemented new ETL pipelines based on existing ones", + "Resolved out of disk errors independently", + ], + }, { + "summary": "Develops new instances of existing architecture, or minor improvements to existing architecture", + "signals": [ + "Made minor version upgrades to technologies", + "Builds machine learning jobs within the ML framework", + "Triages service issues correctly and independently", + ], + "examples": [ + "Upgraded NodeJS from 8.0 to 8.1.1", + "Built custom packages for RPMs", + "Improved ETL efficiency by improving Dynamo to S3 loading", + ], + }, { + "summary": "Designs standalone systems of moderate complexity, or major new features in existing systems", + "signals": [ + "Acts as primary maintainer for existing critical systems", + "Designs moderately complex systems", + "Makes major version upgrades to libraries", + ], + "examples": [ + "Designed AWS configuration management", + "Built SoapBox's realtime stats pipeline and monitoring dashboard", + "Designed flexible framework for writing machine learning jobs", + ], + }, { + "summary": "Builds complex, reusable architectures that pioneer best practices for other engineers, or multi-system services", + "signals": [ + "Designs complex projects that encompass multiple systems and technologies", + "Demonstrates deep knowledge of foundational systems", + "Introduces new databases and technologies to meet underserved needs", + ], + "examples": [ + "Designed and built caching service for improved data performance management", + "Designed AWS configuration management", + "Introduced Kinesis and pioneered streaming events pipeline", + ], + }, { + "summary": "Is an industry-leading expert in foundational engineering or sets strategic foundational direction for an eng team", + "signals": [ + "Designs transformational projects in service of long-term goals", + "Defines the strategic vision for foundational work and supporting technologies", + "Invents industry-leading techniques to solve complex problems", + ], + "examples": [ + "Invented a novel ML technique that advanced the state of the art", + "Defined and developed SoapBox's continuous delivery strategy", + "Developed and implemented High Availability strategy", + ], + }], + }, + + "SERVERS": { + "displayName": "Product design", + "category": "A", + "description": "Develops expertise in server side engineering, using technologies such as PHP, NodeJS, or Python and creating performant REST APIs.", + "milestones": [{ + "summary": "Works effectively within established server side frameworks, following current best practices", + "signals": [ + "Adds NodeJS endpoints using layers architecture", + "Adds Service endpoints using Laravel PHP Framework", + "Makes minor server changes to support client needs", + ], + "examples": [ + "Added IFTTT trigger for adding items to SoapBox", + "Added a RESTful DELETE API endpoint for item management", + "Created a minor PHP Artisan command for a Laravel function", + ], + }, { + "summary": "Develops new instances of existing architecture, or minor improvements to existing architecture", + "signals": [ + "Assesses correctness and utility of existing code and avoids blind copy-pasting", + "Generalizes code when appropriate", + "Determines data needs from product requirements", + ], + "examples": [ + "Identified need for new index on Algolia", + "Acted as caretaker for API routes management", + "Updated version and codebase dependencies without errors", + ], + }, { + "summary": "Designs standalone systems of moderate complexity, or major new features in existing systems", + "signals": [ + "Acts as primary maintainer for existing critical systems", + "Integrates third party services effectively", + "Writes playbooks for new service maintenance", + ], + "examples": [ + "Implemented Google Auth login to SoapBox", + "Implemented payments integration with Stripe", + "Built Email Delivery services and deployed servers ", + ], + }, { + "summary": "Builds complex, reusable architectures that pioneer best practices for other engineers, or multi-system services", + "signals": [ + "Delivers complex systems that achieve their goals", + "Avoids subtle architectural mistakes when considering new systems", + "Makes appropriate buy vs build choices", + ], + "examples": [ + "Designed SoapBox's cursor management for paged data feeds", + "Designed custom domains architecture", + "Created Idempotency framework for proper API management", + ], + }, { + "summary": "Is an industry-leading expert in server side engineering or sets strategic server side direction for an eng team", + "signals": [ + "Designs transformational projects of significant complexity and scope", + "Makes decisions that have positive, long term, wide ranging consequences", + "Identifies and solves systemic problems with current architecture", + ], + "examples": [ + "Researched, vetted, and selected Laravel as SoapBox's primary backend language", + "Defined microservices architecture and migration plan for V4 -> V5 customers", + "Defined and implemented proprietary IP core to the company's success", + ], + }], + }, + + "PROJECT_MANAGEMENT": { + "displayName": "Project management", + "category": "B", + "description": "Delivers well-scoped programs of work that meet their goals, on time, to budget, harmoniously", + "milestones": [{ + "summary": "Effectively delivers individual tasks", + "signals": [ + "Estimates small tasks accurately", + "Delivers tightly-scoped projects efficiently", + "Writes effective technical specs outlining approach", + ], + "examples": [ + "Wrote the technical spec for featured post images", + "Delivered stream item support for email digests", + "Delivered payment billing history project", + ], + }, { + "summary": "Effectively delivers small personal projects", + "signals": [ + "Performs research and considers alternative approaches", + "Balances pragmatism and polish appropriately", + "Defines and hits interim milestones", + ], + "examples": [ + "Delivered comment messaging interface", + "Delivered file uploading for web client", + "Executed the recommends database backfills for priority sorting", + ], + }, { + "summary": "Effectively delivers projects through a small team", + "signals": [ + "Delegates tasks to others appropriately", + "Integrates business needs into project planning", + "Chooses appropriate project management strategy based on context", + ], + "examples": [ + "Ran project retro to assess improvement opportunities", + "Completed launch checklist unprompted for well controlled rollout", + "Facilitated project kickoff meeting to get buy-in", + ], + }, { + "summary": "Effectively delivers projects through a large team, or with a significant amount of stakeholders or complexity", + "signals": [ + "Finds ways to deliver requested scope faster, and prioritizes backlog", + "Manages dependencies on other projects and teams", + "Leverages recognition of repeated project patterns", + ], + "examples": [ + "Oversaw technical delivery of Agenda Templates Project", + "Managed infrastructure migration to virtual private clouds", + "Involved marketing, legal, and appropriate functions at project start", + ], + }, { + "summary": "Manages major company pushes delivered by multiple teams", + "signals": [ + "Considers external constraints and business objectives when planning", + "Leads teams of teams, and coordinates effective cross-functional collaboration", + "Owns key company metrics", + ], + "examples": [ + "Managed technical migration to SOA", + "Lead technical delivery of migration from SoapBox V4 to V5", + "Delivered multi-month engineering project on time", + ], + }], + }, + + "COMMUNICATION": { + "displayName": "Communication", + "category": "B", + "description": "Shares the right amount of information with the right people, at the right time, and listens effectively", + "milestones": [{ + "summary": "Communicates effectively to close stakeholders when called upon, and incorporates constructive feedback", + "signals": [ + "Communicates project status clearly and effectively", + "Collaborates with others with empathy", + "Asks for help at the appropriate juncture", + ], + "examples": [ + "Updated SoapBox github wiki when performing install scripts and run into errors", + "Updated project status changes in JIRA promptly", + "Gave thoughtful check-in and check-out comments", + ], + }, { + "summary": "Communicates with the wider team appropriately, focusing on timeliness and good quality conversations", + "signals": [ + "Practises active listening and suspension of attention", + "Ensures stakeholders are aware of current blockers", + "Chooses the appropriate tools for accurate and timely communication", + ], + "examples": [ + "Received and integrated critical feedback positively", + "Created cross-team Slack channel for revenue based work", + "Spoke to domain experts before writing spec", + ], + }, { + "summary": "Proactively shares information, actively solicits feedback, and facilitates communication for multiple stakeholders", + "signals": [ + "Resolves communication difficulties between others", + "Anticipates and shares schedule deviations in plenty of time", + "Manages project stakeholder expectations effectively", + ], + "examples": [ + "Directed team response effectively during outages", + "Gave a substantial Eng All Hands presentation on EmberJS", + "Gave notice of upcoming related work in Eng Briefing", + ], + }, { + "summary": "Communicates complex ideas skillfully and with nuance, and establishes alignment within the wider organization", + "signals": [ + "Communicates project risk and tradeoffs skillfully and with nuance", + "Contextualizes and clarifies ambiguous direction and strategy for others", + "Negotiates resourcing compromises with other teams", + ], + "examples": [ + "Lead off-site workshop on interviewing", + "Wrote SoapBox's growth framework and rationale", + "Aligned the entire organization around Discussions development", + ], + }, { + "summary": "Influences outcomes at the highest level, moves beyond mere broadcasting, and sets best practices for others", + "signals": [ + "Defines processes for clear communication for the entire team", + "Shares the right amount of information with the right people, at the right time", + "Develops and delivers plans to execs, the board, and outside investors", + ], + "examples": [ + "Organized half year check-in company offsite", + "Created the communication plan for a large organizational change", + "Presented to the board about key company metrics and projects", + ], + }], + }, + + "CRAFT": { + "displayName": "Craft", + "category": "B", + "description": "Embodies and promotes practices to ensure excellent quality products and services", + "milestones": [{ + "summary": "Delivers consistently good quality work", + "signals": [ + "Tests new code thoroughly, both locally, and in production once shipped", + "Writes tests for every new feature and bug fix", + "Writes clear comments and documentation", + ], + "examples": [ + "Caught a bug by QAing onw work before it went live", + "Landed non-trivial PR with no caretaker comments", + "Wrote hermetic tests for the happy and sad cases", + ], + }, { + "summary": "Increases the robustness and reliability of codebases, and devotes time to polishing products and systems", + "signals": [ + "Refactors existing code to make it more testable", + "Adds tests for uncovered areas", + "Deletes unnecessary code and deprecates proactively when safe to do so", + ], + "examples": [ + "Requested tests for a PR when acting as reviewer", + "Reduced the number of sentry exceptions", + "Fixed a TODO for someone else in the codebase", + ], + }, { + "summary": "Improves others' ability to deliver great quality work", + "signals": [ + "Implements systems that enable better testing", + "Gives thoughtful code reviews as a domain expert", + "Adds tooling to improve code quality", + ], + "examples": [ + "Improved performance of travis scripts to run the same volume of tests faster", + "Simplified hermetic test data modification", + "Created system for improved and accessible visual quality", + ], + }, { + "summary": "Advocates for and models great quality with proactive actions, and tackles difficult and subtle system issues", + "signals": [ + "Builds systems so as to eliminate entire classes of programmer error", + "Focuses the team on quality with regular reminders", + "Coordinates Watch priorities and projects", + ], + "examples": [ + "Added code coverage reporting to iOS CI pipeline", + "Iterated repeatedly to develop SoapBox's underlines solution", + "Defined and oversaw plan for closing Heartbleed vulnerability", + ], + }, { + "summary": "Enables and encourages the entire organization to make quality a central part of the development process", + "signals": [ + "Defines policies for the engineering org that encourage quality work", + "Identifies and eliminates single points of failure throughout the organization", + "Secures time and resources from execs to support great quality", + ], + "examples": [ + "Negotiated resources for Fix-It week with SLT", + "Instituted and ensured success of a 20% time policy", + "Started a guild to tackle system vulnerabilties and squash bugs", + ], + }], + }, + + "INITIATIVE": { + "displayName": "Initiative", + "category": "B", + "description": "Challenges the status quo and effects positive organizational change outside of mandated work", + "milestones": [{ + "summary": "Identifies opportunities for organizational change or product improvements", + "signals": [ + "Writes project briefs about improvement opportunities", + "Raises meaningful tensions in tactical meetings", + "Asks leadership team probing questions at all hands", + ], + "examples": [ + "Wrote about problems with API performance issues", + "Wrote about content policy problems", + "Reported a site issue in Github/JIRA", + ], + }, { + "summary": "Causes change to positively impact a few individuals or minor improvement to an existing product or service", + "signals": [ + "Picks bugs off the backlog proactively when blocked elsewhere", + "Makes design quality improvements unprompted", + "Takes on trust and safety tasks proactively when blocked elsewhere", + ], + "examples": [ + "Advocated on own behalf for a change in role", + "Implemented flow typing for promises", + "Audited web client performance in Chrome and proposed fixes", + ], + }, { + "summary": "Causes change to positively impact an entire team or instigates a minor feature or service", + "signals": [ + "Demonstrates concepts proactively with prototypes", + "Fixes complicated bugs outside of regular domain", + "Takes ownership of systems that nobody owns or wants", + ], + "examples": [ + "Defined style guide to resolve style arguments", + "Proposed and implemented at-mentions prototype", + "Implemented file upload for Android independently, unprompted", + ], + }, { + "summary": "Effects change that has a substantial positive impact on the engineering organization or a major product impact", + "signals": [ + "Champions and pioneers new technologies to solve new classes of problem", + "Exemplifies grit and determination in the face of persistent obstacles", + "Instigates major new features, services, or architectures", + ], + "examples": [ + "Created the interviewing rubric and booklet", + "Implemented and secured support for native login", + "Migrated database to latest version of MYSQL unprompted to allow better unicode support across product", + ], + }, { + "summary": "Effects change that has a substantial positive impact on the whole company", + "signals": [ + "Creates a new function to solve systemic issues", + "Galvanizes the entire company and garners buy in for a new strategy", + "Changes complex organizational processes", + ], + "examples": [ + "Migrated the organization to using Agile methodologies", + "Built SoapBox chrome extention prototype and convinced execs to build it", + "Convinced leadership and engineering org to move to a microservices architecture", + ], + }], + }, + + "CAREER_DEVELOPMENT": { + "displayName": "Career development", + "category": "C", + "description": "Provides strategic support to engineers to help them build the career they want", + "milestones": [{ + "summary": "Gives insight into opportunities and helps identify individuals' strengths and weaknesses", + "signals": [ + "Advocates on behalf and in defense of a group member", + "Shares opportunities for improvements and recognises achievements", + "Explains appropriate available industry paths", + ], + "examples": [ + "Collected and delivered feedback", + "Discussed career options and areas of interest informally", + "Hosted an improving interviewing workshop session", + ], + }, { + "summary": "Formally supports and advocates for one person and provides tools to help them solve career problems", + "signals": [ + "Ensure a group member has an appropriate role on their team", + "Offers effective career advice to group members, without being prescriptive", + "Creates space for people to talk through challenges", + ], + "examples": [ + "Set up and attended regular, constructive 1:1s", + "Provided coaching on how to have difficult conversations", + "Taught group members the GROW model", + ], + }, { + "summary": "Inspires and retains a small group of people and actively pushes them to stretch themselves", + "signals": [ + "Discusses paths, and creates plans for personal and professional growth", + "Advocates to align people with appropriate roles within organization", + "Works with team leads to elevate emerging leaders", + ], + "examples": [ + "Reviewed individual group member progression every 6 weeks", + "Suggested appropriate group member for Tech Lead position", + "Arranged a requested switch of discipline for a group member", + ], + }, { + "summary": "Manages interactions and processes between groups, promoting best practices and setting a positive example", + "signals": [ + "Manages team transitions smoothly, respecting team and individual needs", + "Develops best practices for conflict resolution", + "Ensures all group members' roles are meeting their career needs", + ], + "examples": [ + "Completed training on situational leadership", + "Built a resourcing plan based on company, team, and individual goals", + "Prevented regretted attrition with intentional, targeted intervention", + ], + }, { + "summary": "Supports the development of a signficant part of the engineering org, and widely viewed as a trusted advisor", + "signals": [ + "Supports and develops senior leaders", + "Identified leadership training opportunities for senior leadership", + "Pushes everyone to be as good as they can be, with empathy", + ], + "examples": [ + "Provided coaching to group leads", + "Devised engineering growth curriculum for group leads", + "Advocated to execs for engineer development resources and programs", + ], + }], + }, + + "ORG_DESIGN": { + "displayName": "Org design", + "category": "C", + "description": "Defines processes and structures that enables the strong growth and execution of a diverse eng organization", + "milestones": [{ + "summary": "Respects and participates in processes, giving meaningful feedback to help the organization improve", + "signals": [ + "Reflects on meetings that leave them inspired or frustrated", + "Teaches others about existing processes", + "Actively participates and makes contributions within organizational processes", + ], + "examples": [ + "Facilitated effective tactical meeting with empathy", + "Explained tactical meeting format to a new hire", + "Provided feedback on sprint planning meeting", + ], + }, { + "summary": "Identifies opportunities to improve existing processes and makes changes that positively affect the local team", + "signals": [ + "Defines meeting structure and cadence that meets team needs", + "Engages in organizational systems thinking", + "Advocates for improved diversity and inclusion, and proposes ideas to help", + ], + "examples": [ + "Defined innovative meeting structure for small team", + "Improved support on-call rotation scheduling", + "Defined standard channels for inter-team communication", + ], + }, { + "summary": "Develops processes to solve ongoing organizational problems", + "signals": [ + "Creates programs that meaningfully improve organizational diversity", + "Solves long-standing organizational problems", + "Reallocates resources to meet organizational needs", + ], + "examples": [ + "Developed baseline team templates for consistency", + "Created bug-rotation program to address ongoing quality issues", + "Defined Guilds manifesto and charter", + ], + }, { + "summary": "Thinks deeply about organizational issues and identifies hidden dynamics that contribute to them", + "signals": [ + "Evaluates incentive structures and their effect on execution", + "Analyzes existing processes for bias and shortfall", + "Ties abstract concerns to concrete organizational actions or norms", + ], + "examples": [ + "Connected mobile recruiting difficulties to focus on excellence", + "Raised leadership level change discrepancies", + "Analyzed the hiring rubric for false negative potential", + ], + }, { + "summary": "Leads initiatives to address issues stemming from hidden dynamics and company norms", + "signals": [ + "Builds programs to train leadership in desired skills", + "Creates new structures that provide unique growth opportunities", + "Leads planning and communication for reorgs", + ], + "examples": [ + "Lead efforts to increase number of mobile engineers", + "Directed resources to meaningfully improve diversity at all levels", + "Built the growth framework rubric", + ], + }], + }, + + "WELLBEING": { + "displayName": "Wellbeing", + "category": "C", + "description": "Supports the emotional well-being of group members in difficult times, and celebrates their successes", + "milestones": [{ + "summary": "Uses tools and processes to help ensure colleagues are healthy and happy", + "signals": [ + "Keeps confidences unless legally or morally obliged to do otherwise", + "Applies the reasonable person principle to others", + "Avoids blame and focuses on positive change", + ], + "examples": [ + "Ensured group members were taking enough vacation", + "Put themself in another's shoes to understand their perspective", + "Checked in with colleague showing signs of burnout", + ], + }, { + "summary": "Creates a positive, supportive, engaging team environment for group members", + "signals": [ + "Sheds light on other experiences to build empathy and compassion", + "Validates ongoing work and sustains motivation", + "Proposes solutions when teams get bogged down or lose momentum", + ], + "examples": [ + "Coordinated a small celebration for a project launch", + "Connected tedious A|B testing project with overall company goals", + "Noted a team without a recent win and suggested some easy quick wins", + ], + }, { + "summary": "Manages expectations across peers, leads in the org, promotes calm, and prevents consensus building", + "signals": [ + "Trains group members to separate stimulus from response", + "Maintains a pulse on individual and team morale", + "Helps group members approach problems with curiosity", + ], + "examples": [ + "Completed training on transference and counter transference", + "Completed training on compromise and negotiation techniques", + "Reframed a problem as a challenge, instead of a barrier, when appropriate", + ], + }, { + "summary": "Advocates for the needs of teams and group members, and proactively works to calm the organization", + "signals": [ + "Ensures team environments are safe and inclusive, proactively", + "Grounds group member anxieties in reality", + "Tracks team retention actively and proposes solutions to strengthen it", + ], + "examples": [ + "Relieved org tension around product direction by providing extra context", + "Encouraged group members to focus on what they can control", + "Guided people through complex organizational change", + ], + }, { + "summary": "Manages narratives, channels negativity into inspiration and motivation, and protects the entire team", + "signals": [ + "Recognizes and points out narratives when appropriate", + "Works to reshape narratives from victimization to ownership", + "Increases the psychological safety of the entire team", + ], + "examples": [ + "Converted group member from a problem haver to a problem solver", + "Challenged false narrative and redirected to compassion and empathy", + "Cultivated and championed a culture of empathy within the entire team", + ], + }], + }, + + "ACCOMPLISHMENT": { + "displayName": "Accomplishment", + "category": "C", + "description": "Inspires day to day excellence, maximises potential and effectively resolves performance issues with compassion", + "milestones": [{ + "summary": "Helps individuals identify blockers and helps them identify next steps for resolution", + "signals": [ + "Notices when someone is stuck and reaches out", + "Helps others break down problems into feasible, tangible next steps", + "Talks through problems non-judgmentally", + ], + "examples": [ + "Completed training on diagnosing problems", + "Unblocked a group member", + "Reinforces and affirms positive feedback for good work", + ], + }, { + "summary": "Helps individuals resolve difficult performance issues, with insight, compassion, and skill", + "signals": [ + "Gathers context outside the immediate problem", + "Recognizes issues within local environment and suggests change", + "Works to encourage ownership of actions and responsibilities", + ], + "examples": [ + "Completed training on decision making", + "Convinced a group member to solve a problem directly, rather than doing it for them", + "Gave honest feedback about poor performance, with compassion", + ], + }, { + "summary": "Intervenes in long-standing performance issues with targeted behavior change or performance plans", + "signals": [ + "Aggregates signals of poor performance and creates process for improvement", + "Investigates motivation and externalities for consistent poor performance", + "Puts together comprehensive, achievable performance plans", + ], + "examples": [ + "Worked with group member to address persistent communication failures", + "Arranged a transfer to another team, resulting in improved performance", + "Managed group member closely to maximise chances of PIP success", + ], + }, { + "summary": "Mediates escalated situations, empowers underperforming teams, and resolves conflict", + "signals": [ + "Recognizes heightened situations and toxic or aggressive interactions", + "Inserts themself into conflict where appropriate to calm and mediate", + "Encourages open dialog and builds trust between parties in conflict", + ], + "examples": [ + "Empowered a team to drive forward amidst uncertainty", + "Protected team from externalities so they could focus on goals", + "Mediated sit-down between team members to address tension", + ], + }, { + "summary": "Resolves complex organizational dysfunction, or persistent conflict at senior levels", + "signals": [ + "Takes control of dysfunctional teams to organise chaos", + "Repairs broken team dynamics and builds harmony", + "Presides over a well-oiled team of teams", + ], + "examples": [ + "Turned around the performance of a problematic team", + "De-escalated serious tensions between teams", + "Rebuilt trust between senior team leads", + ], + }], + }, + + "MENTORSHIP": { + "displayName": "Mentorship", + "category": "D", + "description": "Provides support to colleagues, spreads knowledge, and develops the team outside formal reporting structures", + "milestones": [{ + "summary": "Informally mentors individuals in an ad-hoc way, supports new hires, and conveys institutional knowledge", + "signals": [ + "Makes themself available for informal support and advice", + "Acts as sounding board for peers and more junior members", + "Provides sound advice when asked", + ], + "examples": [ + "Acted as an onboarding buddy", + "Paired with an engineer to help them with an unfamiliar area", + "Helped a colleague understand their feelings", + ], + }, { + "summary": "Mentors people proactively, and guides people to realizations rather than providing the answer", + "signals": [ + "Takes time to explain concepts and best practices", + "Asks questions to illuminate concepts, rather than stating them", + "Allows others to lead efforts when it will help their development", + ], + "examples": [ + "Shared interesting article with a team member to help with their growth", + "Offered unprompted feedback to help growth, with empathy", + "Lead from behind to support someone new to a leadership role", + ], + }, { + "summary": "Teaches small groups of engineers and contributes to SoapBox's shared knowledge base", + "signals": [ + "Avoids siloing information when it can be usefully shared with others", + "Works to increase the bus factor of systems", + "Finds tools that work best for a team member's personality", + ], + "examples": [ + "Gave a brown bag presentation on payments", + "Wrote article for support team on how to properly investigate bugs with Microsoft Teams authentication", + "Wrote content on how to properly install and set up development environment", + ], + }, { + "summary": "Encourages people to mentor each other, and creates ways for them to do so", + "signals": [ + "Defines an entire curriculum for a discipline", + "Draws positive attention to well-modeled mentor and teaching behaviours", + "Creates brown bag series and lines up speakers", + ], + "examples": [ + "Created and lead SoapBox' Women in Eng group", + "Organized an Eng All Hands with an outside speaker", + "Designed and taught web client guild curriculum", + ], + }, { + "summary": "Instills and promotes a culture of learning and development within the team", + "signals": [ + "Sets incentive structures to recognise and reward mentorship", + "Empowers team members to develop themselves", + "Role models productive and healthy mentor relationships", + ], + "examples": [ + "Instituted the professional education budget for engineers", + "Mentored mentors", + "Started the eng advisor program and lined up external mentors", + ], + }], + }, + + "EVANGELISM": { + "displayName": "Evangelism", + "category": "D", + "description": "Promotes SoapBox to the outside world and establishes it as an attractive and thoughtful place to work", + "milestones": [{ + "summary": "Represents SoapBox well externally, and influences individuals positively", + "signals": [ + "Shares personal and organizational successes with their network", + "Attends SoapBox-hosted events and talks with guests", + "Communicates genuine and honest excitement about their work externally", + ], + "examples": [ + "Shared a SoapBox product launch post on Facebook", + "Acted as a guide for a non-friend visitor to the office", + "Supported PR efforts by giving a quote or having a photo taken", + ], + }, { + "summary": "Participates more centrally in small events, and takes simple actions that positively influence groups of people", + "signals": [ + "Takes meaningful action to introduce people to SoapBox", + "Joined public Slack group and represented Soapbox appropriately, and well", + "Organizes positive small- or medium-sized events that bring people to SoapBox", + ], + "examples": [ + "Volunteered as a helper for external code writing workshop", + "Organized a short tour of the office by college students", + "Talked at a Laravel Toronto event hosted at SoapBox", + ], + }, { + "summary": "Works hard to positively influence large groups of people on their views of Soapbox", + "signals": [ + "Mentors or participates in a high visibility way in an external organization", + "Builds fruitful partnerships with external organizations", + "Writes blog posts about Soapbox that receive moderate traffic", + ], + "examples": [ + "Represented Soapbox on a panel at a conference of industry experts", + "Established close ties with Creative Commons", + "Built a durable, long-standing org relationship with external not-for-profit", + ], + }, { + "summary": "Establishes Soapbox as an great, innovative company and workplace to the whole industry", + "signals": [ + "Establishes themself as an industry thought leader who attracts talent", + "Publishes material about Soapbox's organizational or technical innovations", + "Leverages significant following to evangelise Soapbox", + ], + "examples": [ + "Published a paper on Soapbox technology in a peer-reviewed journal", + "Authored joint-press releases", + "Published opinionated post on an Engineering blog internal or external", + ], + }, { + "summary": "Introduces Soapbox in a positive light to a wider audience outside the industry", + "signals": [ + "Delivers key messages to broad, mainstream audiences", + "Influences people with large audiences to talk about Soapbox positively", + "Drives recognition and adoption of Soapbox in significant numbers", + ], + "examples": [ + "Published or interviewed in a mainstream newspaper or website outside tech", + "Keynoted a conference with international attention", + "Represented Soapbox in national televised media", + ], + }], + }, + + "RECRUITING": { + "displayName": "Recruiting", + "category": "D", + "description": "Strengthens Soapbox's team by bringing in excellent staff members", + "milestones": [{ + "summary": "Brings new candidates into the pipeline and understands how to evaluate candidates at Soapbox", + "signals": [ + "Reviews existing network for hiring leads regularly", + "Shadows interviews to gain familiarity with process", + "Reviews current job postings regularly", + ], + "examples": [ + "Completed interview calibration", + "Set up casual sessions to practice asking questions", + "Referred appropriate individuals for open positions", + ], + }, { + "summary": "Interviews regularly, helps the team make meaningful hiring decisions, and helps build a diverse pipeline", + "signals": [ + "Uses interview rubric to provide clear, objective feedback on candidates", + "Interviews candidates with empathy and treats them all with equal respect", + "Researches approaches for sourcing candidates and diversifying hiring", + ], + "examples": [ + "Added observable evidence for every rating", + "Started a quarterly event for candidates to meet SoapBox employees", + "Tested a new service for quality and diversity of candidates", + ], + }, { + "summary": "Maintains and strengthens the integrity of the current process, and regularly brings in great candidates", + "signals": [ + "Teaches new interviewers how to interview with empathy", + "Models great interview technique and feedback when shadowed", + "Reverse shadows trainees and helps calibrate their feedback", + ], + "examples": [ + "Wrote new interview question which meets our question quality criteria", + "Brought candidates into our pipeline proactively, with a high conversion rate", + "Proposed useful, tangible improvements to the interview process", + ], + }, { + "summary": "Actively contributes to and leads hiring decisions, and goes to great lengths to source great candidates", + "signals": [ + "Documents subtle cues in interviews that indicate values alignment", + "Makes hiring decisions, resolving discrepancies between conflicting reports", + "Top-grades candidates and teases out character traits", + ], + "examples": [ + "Planned engineering summit on interview process and training", + "Organized and lead SoapBox's presence at a recruitment fair", + "Started a SoapBox internship program", + ], + }, { + "summary": "Sets recruitment strategy, invests in long-term relationships for critical roles, and recruits at scale", + "signals": [ + "Sets the tone, policy and goals around building a diverse, high-quality team", + "Identifies and brings in promising acquisitions", + "Tracks industry activity, identifying opportunities for critical roles", + ], + "examples": [ + "Talked with a senior candidate over many months to fill a critical role", + "Organized efforts around convincing acquired engineers to join and stay", + "Set goals, then tracked and reported metrics on team demographics over time", + ], + }], + }, + + "COMMUNITY": { + "displayName": "Community", + "category": "D", + "description": "Builds community internally, gives of themself to the team, and champions and extols company values", + "milestones": [{ + "summary": "Is available and present on current teams, and works to contribute positively to company culture", + "signals": [ + "Participates in team activities and offsites", + "Treats colleagues and clients with respect", + "Joins groups or committees outside regular duties", + ], + "examples": [ + "Joined and actively participated in the web client guild", + "Brought a small gift back from vacation for the team", + "Wrote entertaining and informative Prod Ops writeups", + ], + }, { + "summary": "Steps up, builds connectedness, and takes concrete actions to promote an inclusive culture", + "signals": [ + "Makes space for others to participate", + "Collaborates with other engineers outside direct responsibilities", + "Finds ways to ramp up and engage new hires quickly", + ], + "examples": [ + "Created onboarding bingo", + "Brought shy and introverted people into a dominant conversation", + "Volunteered as secretary for a team", + ], + }, { + "summary": "Contributes to improving team relatedness, and helps build a culture of lending support", + "signals": [ + "Takes on additional support shifts at short notice", + "Pitches in to help other teams hit deadlines, without missing own deadlines", + "Uses position to raise difficult issues on someone's behalf", + ], + "examples": [ + "Helped with support calls while still contributing to projects", + "Organizes team building events", + "Stayed positive and improved team morale during period after layoffs", + ], + }, { + "summary": "Exemplifies selflessness for the team without compromising responsibilities, and lifts everyone up", + "signals": [ + "Goes above and beyond on the Watch, serving the team without complaint", + "Implements concrete programs to signficantly improve team inclusivity", + "Takes on large amounts of tedious grunt work for the team without being asked", + ], + "examples": [ + "Devoted large amount of time to helping outside direct responsibilities", + "Refactored hundreds of legacy files", + "Acted as sole maintainer of LinkifyJS for years", + ], + }, { + "summary": "Lives the company values, guards positive culture, and defines policies that support relatedness between teams", + "signals": [ + "Brings separate teams together to build relatedness", + "Holds individuals, teams, and leadership accountable to SoapBox's values", + "Sets the tone, policy, and goals around maintaining an inclusive company", + ], + "examples": [ + "Organizes events for whole org", + "Devised, delivered and acted on findings from an engineer happiness survey", + "Challenged and corrected exclusionary behaviour or policies", + ], + }], + }, +} + +export const trackIds: TrackId[] = Object.keys(tracks) + +export const categoryIds: Set = trackIds.reduce((set, trackId) => { + set.add(tracks[trackId].category) + return set +}, new Set()) + +export const categoryPointsFromMilestoneMap = (milestoneMap: MilestoneMap) => { + let pointsByCategory = new Map() + trackIds.forEach((trackId) => { + const milestone = milestoneMap[trackId] + const categoryId = tracks[trackId].category + let currentPoints = pointsByCategory.get(categoryId) || 0 + pointsByCategory.set(categoryId, currentPoints + milestoneToPoints(milestone)) + }) + return Array.from(categoryIds.values()).map(categoryId => { + const points = pointsByCategory.get(categoryId) + return { categoryId, points: pointsByCategory.get(categoryId) || 0 } + }) +} + +export const totalPointsFromMilestoneMap = (milestoneMap: MilestoneMap): number => + trackIds.map(trackId => milestoneToPoints(milestoneMap[trackId])) + .reduce((sum, addend) => (sum + addend), 0) + +export const categoryColorScale = d3.scaleOrdinal() + .domain(categoryIds) + .range(['#24acfc', '#8147FC', '#b7dc50', '#00D7C8']) + +export const titles = [ + {label: 'Engineer I', minPoints: 0, maxPoints: 16}, + {label: 'Engineer II', minPoints: 17, maxPoints: 35}, + {label: 'Sr. Engineer', minPoints: 36, maxPoints: 57}, + {label: 'Team Lead', minPoints: 36, maxPoints: 57}, + {label: 'Engineering Manager', minPoints: 36, maxPoints: 57}, + {label: 'Staff Engineer', minPoints: 58, maxPoints: 89}, + {label: 'Sr. Team Lead', minPoints: 58, maxPoints: 89}, + {label: 'Sr. Engineering Manager', minPoints: 58, maxPoints: 89}, + {label: 'Principal Engineer', minPoints: 90}, + {label: 'Dir. Engineering', minPoints: 90} +] + +export const eligibleTitles = (milestoneMap: MilestoneMap): string[] => { + const totalPoints = totalPointsFromMilestoneMap(milestoneMap) + + return titles.filter(title => (title.minPoints === undefined || totalPoints >= title.minPoints) + && (title.maxPoints === undefined || totalPoints <= title.maxPoints)) + .map(title => title.label) +} diff --git a/pages/engineering.js b/pages/engineering.js new file mode 100644 index 00000000..bfb0a724 --- /dev/null +++ b/pages/engineering.js @@ -0,0 +1,14 @@ +import SnowflakeApp from '../components/SnowflakeApp' +import dynamic from "next/dynamic"; + +const constants = dynamic(import("../constants_engineering")) + +function Home() { + return ( +
+ +
+ ); +} + +export default Home; diff --git a/pages/index.js b/pages/index.js index 9b3fe6b8..f409c639 100644 --- a/pages/index.js +++ b/pages/index.js @@ -1,5 +1,42 @@ -import SnowflakeApp from '../components/SnowflakeApp' +import Link from 'next/link' +import Wordmark from '../components/Wordmark' -export default () =>
- -
+function Home() { + return ( +
+ + +
+ + + +
+
+
+ + Product + +
+
+ + Engineering + +
+
+
+ ); +} + +export default Home; diff --git a/pages/product.js b/pages/product.js new file mode 100644 index 00000000..8fb6877d --- /dev/null +++ b/pages/product.js @@ -0,0 +1,14 @@ +import SnowflakeApp from '../components/SnowflakeApp' +import dynamic from "next/dynamic"; + +const constants = dynamic(import("../constants_engineering")) + +function Home() { + return ( +
+ +
+ ); +} + +export default Home; From 79c3189dc3d7708e799bc511f3f1d13e8662da56 Mon Sep 17 00:00:00 2001 From: Christopher Fraser Date: Tue, 9 Jul 2019 16:49:25 -0400 Subject: [PATCH 02/13] Reduce reliance on specific ids and use more from the passed in constants file --- components/SnowflakeApp.js | 76 +++++++++++++++++--------------------- components/Track.js | 7 ++-- constants_product.js | 8 ++-- pages/engineering.js | 5 +-- pages/product.js | 4 +- 5 files changed, 44 insertions(+), 56 deletions(-) diff --git a/components/SnowflakeApp.js b/components/SnowflakeApp.js index cb509e06..351fbb6b 100644 --- a/components/SnowflakeApp.js +++ b/components/SnowflakeApp.js @@ -9,8 +9,6 @@ import Wordmark from '../components/Wordmark' import LevelThermometer from '../components/LevelThermometer' import PointSummaries from '../components/PointSummaries' import TitleSelector from '../components/TitleSelector' -import { eligibleTitles, trackIds, milestones, milestoneToPoints } from '../constants' -import type { Milestone, MilestoneMap, TrackId } from '../constants' type SnowflakeAppState = { milestoneByTrack: MilestoneMap, @@ -19,7 +17,7 @@ type SnowflakeAppState = { focusedTrackId: TrackId, } -const hashToState = (hash: String): ?SnowflakeAppState => { +const hashToState = (hash: String, trackIds): ?SnowflakeAppState => { if (!hash) return null const result = defaultState() const hashValues = hash.split('#')[1].split(',') @@ -45,29 +43,16 @@ const coerceMilestone = (value: number): Milestone => { } } -const emptyState = (): SnowflakeAppState => { +const emptyState = (trackIds): SnowflakeAppState => { return { name: '', title: '', - milestoneByTrack: { - 'MOBILE': 0, - 'WEB_CLIENT': 0, - 'FOUNDATIONS': 0, - 'SERVERS': 0, - 'PROJECT_MANAGEMENT': 0, - 'COMMUNICATION': 0, - 'CRAFT': 0, - 'INITIATIVE': 0, - 'CAREER_DEVELOPMENT': 0, - 'ORG_DESIGN': 0, - 'WELLBEING': 0, - 'ACCOMPLISHMENT': 0, - 'MENTORSHIP': 0, - 'EVANGELISM': 0, - 'RECRUITING': 0, - 'COMMUNITY': 0 - }, - focusedTrackId: 'MOBILE' + milestoneByTrack: trackIds.reduce((acc, trackId) => { + acc[trackId] = 0 + + return acc + }, {}), + focusedTrackId: trackIds[0] } } @@ -76,7 +61,7 @@ const defaultState = (): SnowflakeAppState => { name: 'Soapbox Simon', title: 'Senior Engineer', milestoneByTrack: { - 'MOBILE': 1, + 'MARKET': 1, 'WEB_CLIENT': 2, 'FOUNDATIONS': 3, 'SERVERS': 1, @@ -93,11 +78,11 @@ const defaultState = (): SnowflakeAppState => { 'RECRUITING': 3, 'COMMUNITY': 0 }, - focusedTrackId: 'MOBILE' + focusedTrackId: 'MARKET' } } -const stateToHash = (state: SnowflakeAppState) => { +const stateToHash = (state: SnowflakeAppState, trackIds) => { if (!state || !state.milestoneByTrack) return null const values = trackIds.map(trackId => state.milestoneByTrack[trackId]).concat(encodeURI(state.name), encodeURI(state.title)) return values.join(',') @@ -108,16 +93,18 @@ type Props = {} class SnowflakeApp extends React.Component { constructor(props: Props) { super(props) - this.state = emptyState() + this.state = {...props.constants}; + this.state.user = emptyState(this.state.trackIds); + console.log(this.state); } componentDidUpdate() { - const hash = stateToHash(this.state) + const hash = stateToHash(this.state.user, this.state.trackIds) if (hash) window.location.replace(`#${hash}`) } componentDidMount() { - const state = hashToState(window.location.hash) + const state = hashToState(window.location.hash, this.state.trackIds) if (state) { this.setState(state) } else { @@ -168,27 +155,27 @@ class SnowflakeApp extends React.Component { this.setState({name: e.target.value})} placeholder="Name" /> this.setTitle(title)} /> - - + +
this.handleTrackMilestoneChange(track, milestone)} />
{ increaseFocusedMilestoneFn={this.shiftFocusedTrackMilestoneByDelta.bind(this, 1)} decreaseFocusedMilestoneFn={this.shiftFocusedTrackMilestoneByDelta.bind(this, -1)} /> this.handleTrackMilestoneChange(track, milestone)} />
@@ -215,10 +205,10 @@ class SnowflakeApp extends React.Component { } handleTrackMilestoneChange(trackId: TrackId, milestone: Milestone) { - const milestoneByTrack = this.state.milestoneByTrack + const milestoneByTrack = this.state.user.milestoneByTrack milestoneByTrack[trackId] = milestone - const titles = eligibleTitles(milestoneByTrack) + const titles = this.state.eligibleTitles(milestoneByTrack) const title = titles.indexOf(this.state.title) === -1 ? titles[0] : this.state.title this.setState({ milestoneByTrack, focusedTrackId: trackId, title }) @@ -238,7 +228,7 @@ class SnowflakeApp extends React.Component { } shiftFocusedTrackMilestoneByDelta(delta: number) { - let prevMilestone = this.state.milestoneByTrack[this.state.focusedTrackId] + let prevMilestone = this.state.user.milestoneByTrack[this.state.focusedTrackId] let milestone = prevMilestone + delta if (milestone < 0) milestone = 0 if (milestone > 5) milestone = 5 @@ -246,7 +236,7 @@ class SnowflakeApp extends React.Component { } setTitle(title: string) { - let titles = eligibleTitles(this.state.milestoneByTrack) + let titles = eligibleTitles(this.state.user.milestoneByTrack) title = titles.indexOf(title) == -1 ? titles[0] : title this.setState({ title }) } diff --git a/components/Track.js b/components/Track.js index 8b4ac354..848d210d 100644 --- a/components/Track.js +++ b/components/Track.js @@ -1,7 +1,6 @@ // @flow - -import { tracks, milestones, categoryColorScale } from '../constants' import React from 'react' +import { categoryColorScale } from '../constants' import type { MilestoneMap, TrackId, Milestone } from '../constants' type Props = { @@ -12,7 +11,9 @@ type Props = { class Track extends React.Component { render() { - const track = tracks[this.props.trackId] + const track = this.props.tracks[this.props.trackId] + const milestones = this.props.milestones + const trackIds = this.props.trackIds const currentMilestoneId = this.props.milestoneByTrack[this.props.trackId] const currentMilestone = track.milestones[currentMilestoneId - 1] return ( diff --git a/constants_product.js b/constants_product.js index f74d5247..818cb521 100644 --- a/constants_product.js +++ b/constants_product.js @@ -1,14 +1,14 @@ // @flow import * as d3 from 'd3' -export type TrackId = 'MOBILE' | 'WEB_CLIENT' | 'FOUNDATIONS' | 'SERVERS' | +export type TrackId = 'MARKET' | 'WEB_CLIENT' | 'FOUNDATIONS' | 'SERVERS' | 'PROJECT_MANAGEMENT' | 'COMMUNICATION' | 'CRAFT' | 'INITIATIVE' | 'CAREER_DEVELOPMENT' | 'ORG_DESIGN' | 'WELLBEING' | 'ACCOMPLISHMENT' | 'MENTORSHIP' | 'EVANGELISM' | 'RECRUITING' | 'COMMUNITY' export type Milestone = 0 | 1 | 2 | 3 | 4 | 5 export type MilestoneMap = { - 'MOBILE': Milestone, //market understanding + 'MARKET': Milestone, //market understanding 'WEB_CLIENT': Milestone, //Product strategy 'FOUNDATIONS': Milestone, //product Analysis 'SERVERS': Milestone, //Product Design @@ -71,7 +71,7 @@ export type Track = { } type Tracks = {| - 'MOBILE': Track, + 'MARKET': Track, 'WEB_CLIENT': Track, 'FOUNDATIONS': Track, 'SERVERS': Track, @@ -90,7 +90,7 @@ type Tracks = {| |} export const tracks: Tracks = { - "MOBILE": { + "MARKET": { "displayName": "Market understanding", "category": "A", "description": "Assess and value market opportunities, monitor competitors, identify trends", diff --git a/pages/engineering.js b/pages/engineering.js index bfb0a724..33632cf9 100644 --- a/pages/engineering.js +++ b/pages/engineering.js @@ -1,12 +1,11 @@ import SnowflakeApp from '../components/SnowflakeApp' -import dynamic from "next/dynamic"; +import * as constants from '../constants_engineering' -const constants = dynamic(import("../constants_engineering")) function Home() { return (
- +
); } diff --git a/pages/product.js b/pages/product.js index 8fb6877d..2771771d 100644 --- a/pages/product.js +++ b/pages/product.js @@ -1,7 +1,5 @@ import SnowflakeApp from '../components/SnowflakeApp' -import dynamic from "next/dynamic"; - -const constants = dynamic(import("../constants_engineering")) +import * as constants from '../constants_product'; function Home() { return ( From a66b06cef2095e94aec0689f45affebc453dd276 Mon Sep 17 00:00:00 2001 From: Christopher Fraser Date: Wed, 10 Jul 2019 11:02:50 -0400 Subject: [PATCH 03/13] Reduce original constants file to general functions --- constants.js | 1131 -------------------------------------------------- 1 file changed, 1131 deletions(-) diff --git a/constants.js b/constants.js index e4e0cd52..c83a6bc8 100644 --- a/constants.js +++ b/constants.js @@ -1,30 +1,5 @@ // @flow import * as d3 from 'd3' - -export type TrackId = 'MOBILE' | 'WEB_CLIENT' | 'FOUNDATIONS' | 'SERVERS' | - 'PROJECT_MANAGEMENT' | 'COMMUNICATION' | 'CRAFT' | 'INITIATIVE' | - 'CAREER_DEVELOPMENT' | 'ORG_DESIGN' | 'WELLBEING' | 'ACCOMPLISHMENT' | - 'MENTORSHIP' | 'EVANGELISM' | 'RECRUITING' | 'COMMUNITY' -export type Milestone = 0 | 1 | 2 | 3 | 4 | 5 - -export type MilestoneMap = { - 'MOBILE': Milestone, - 'WEB_CLIENT': Milestone, - 'FOUNDATIONS': Milestone, - 'SERVERS': Milestone, - 'PROJECT_MANAGEMENT': Milestone, - 'COMMUNICATION': Milestone, - 'CRAFT': Milestone, - 'INITIATIVE': Milestone, - 'CAREER_DEVELOPMENT': Milestone, - 'ORG_DESIGN': Milestone, - 'WELLBEING': Milestone, - 'ACCOMPLISHMENT': Milestone, - 'MENTORSHIP': Milestone, - 'EVANGELISM': Milestone, - 'RECRUITING': Milestone, - 'COMMUNITY': Milestone -} export const milestones = [0, 1, 2, 3, 4, 5] export const milestoneToPoints = (milestone: Milestone): number => { @@ -70,1099 +45,6 @@ export type Track = { }[] } -type Tracks = {| - 'MOBILE': Track, - 'WEB_CLIENT': Track, - 'FOUNDATIONS': Track, - 'SERVERS': Track, - 'PROJECT_MANAGEMENT': Track, - 'COMMUNICATION': Track, - 'CRAFT': Track, - 'INITIATIVE': Track, - 'CAREER_DEVELOPMENT': Track, - 'ORG_DESIGN': Track, - 'WELLBEING': Track, - 'ACCOMPLISHMENT': Track, - 'MENTORSHIP': Track, - 'EVANGELISM': Track, - 'RECRUITING': Track, - 'COMMUNITY': Track -|} - -export const tracks: Tracks = { - "MOBILE": { - "displayName": "Mobile", - "category": "A", - "description": "Develops expertise in native mobile platform engineering, such as iOS or Android", - "milestones": [{ - "summary": "Works effectively within established iOS or Android architectures, following current best practices", - "signals": [ - "Delivers features requiring simple local modifications", - "Adds simple actions that call server endpoints", - "Reuses existing components appropriately", - ], - "examples": [ - "Added existing button to a different iOS view", - "Add button to add item on Android", - "Fetched and displayed items using existing item styles", - ], - }, { - "summary": "Develops new instances of existing architecture, or minor improvements to existing architecture", - "signals": [ - "Defines new useful and appropriate objects", - "Creates simple new activities on Android", - "Migrates code from old patterns to new patterns", - ], - "examples": [ - "Upgraded Alamofire to a new major version", - "Added support for rendering a new type of data endpoint", - "Prototyped a simple new feature quickly", - ], - }, { - "summary": "Designs major new features and demonstrates a nuanced understanding of mobile platform constraints", - "signals": [ - "Implements complex features with a large product surface area", - "Works effectively with Android reactive programming framework", - "Adds support for new iOS features after a major iOS version upgrade", - ], - "examples": [ - "Designed and personally implemented an iOS caching strategy for offline reading", - "Built series reader on Android", - "Informed the team about recent best practice changes and deprecations", - ], - }, { - "summary": "Builds complex, reusable architectures that pioneer best practices and enable engineers to work more effectively", - "signals": [ - "Pioneers architecture migration strategies that reduce programmer burden", - "Fixes subtle memory management issues", - "Implements interactive dismissals that bring delight", - ], - "examples": [ - "Upgraded CocoaPods to a new major version", - "Designed architecture for fetching and rendering stream items", - "Migrated Android persistance layer to reactive programming", - ], - }, { - "summary": "Is an industry-leading expert in mobile engineering or sets strategic mobile direction for an eng team", - "signals": [ - "Defines long-term goals and ensures active projects are in service of them", - "Designs and builds innovative, industry-leading UI interactions", - "Invents new techniques to responsibly stretch limits of the Android platform", - ], - "examples": [ - "Defined and drove complete migration plan to Swift or Kotlin", - "Implemented Android recycler views before platform support existed", - "Pioneered application-level abstractions for multi-app environment", - ], - }], - }, - - "WEB_CLIENT": { - "displayName": "Web client", - "category": "A", - "description": "Develops expertise in web client technologies, such as HTML, CSS, and JavaScript", - "milestones": [{ - "summary": "Works effectively within established web client architectures, following current best practices", - "signals": [ - "Makes minor modifications to existing screens", - "Fixes simple design quality issues", - "Uses CSS appropriately, following style guide", - ], - "examples": [ - "Implemented sticky item adder on the item detail page", - "Hooked up the action to delete an item from an agenda", - "Built a new page using ready made scaffolding for EmberJS", - ], - }, { - "summary": "Develops new instances of existing architecture, or minor improvements to existing architecture", - "signals": [ - "Makes sensible abstractions based on template and code patterns", - "Specs and builds interactive components independently", - "Prototypes simple new features quickly", - ], - "examples": [ - "Built paginated page component", - "Created shared buttons template", - "Uses and understand how Ember-Data works ", - ], - }, { - "summary": "Designs major new features and demonstrates a nuanced understanding of browser constraints", - "signals": [ - "Provides useful design feedback and suggests feasible alternatives", - "Performs systemic tasks to significantly minimise bundle size", - "Acts a caretaker for all of web client code", - ], - "examples": [ - "Designed font loading strategy for SoapBox", - "Researched utility of service workers for SoapBox", - "Designed and implemented A major feature in the app", - ], - }, { - "summary": "Builds complex, reusable architectures that pioneer best practices and enable engineers to work more effectively", - "signals": [ - "Pioneers architecture migrations that reduce programmer burden", - "Implements complex UI transitions that bring delight", - "Makes architectural decisions that eliminate entire classes of bugs", - ], - "examples": [ - "Designed and implemented a significant SoapBox component library asset", - "Implemented SoapBox's complex microsoft teams embedded frame view", - "Designed and pioneered local storage model for front-end authentication", - ], - }, { - "summary": "Is an industry-leading expert in web client or sets strategic web client direction for an eng team", - "signals": [ - "Invents new techniques to innovate and overcome browser constraints", - "Identifies and solved systemic problems with current architecture", - "Defines a long-term vision for web client and ensures projects are in service of it", - ], - "examples": [ - "Invented CSS in JS", - "Defined and drove migration strategy to EmberJS from JQuery", - "Implemented unidirectional data flow to completion", - ], - }], - }, - - "FOUNDATIONS": { - "displayName": "Foundations", - "category": "A", - "description": "Develops expertise in foundational systems, such as deployments, pipelines, databases and machine learning", - "milestones": [{ - "summary": "Works effectively within established structures, following current best practices", - "signals": [ - "Writes thorough postmortems for service outages", - "Makes simple configuration changes to services", - "Performs backfills safely and effectively, without causing pages", - ], - "examples": [ - "Made safe and effective AWS changes", - "Implemented new ETL pipelines based on existing ones", - "Resolved out of disk errors independently", - ], - }, { - "summary": "Develops new instances of existing architecture, or minor improvements to existing architecture", - "signals": [ - "Made minor version upgrades to technologies", - "Builds machine learning jobs within the ML framework", - "Triages service issues correctly and independently", - ], - "examples": [ - "Upgraded NodeJS from 8.0 to 8.1.1", - "Built custom packages for RPMs", - "Improved ETL efficiency by improving Dynamo to S3 loading", - ], - }, { - "summary": "Designs standalone systems of moderate complexity, or major new features in existing systems", - "signals": [ - "Acts as primary maintainer for existing critical systems", - "Designs moderately complex systems", - "Makes major version upgrades to libraries", - ], - "examples": [ - "Designed AWS configuration management", - "Built SoapBox's realtime stats pipeline and monitoring dashboard", - "Designed flexible framework for writing machine learning jobs", - ], - }, { - "summary": "Builds complex, reusable architectures that pioneer best practices for other engineers, or multi-system services", - "signals": [ - "Designs complex projects that encompass multiple systems and technologies", - "Demonstrates deep knowledge of foundational systems", - "Introduces new databases and technologies to meet underserved needs", - ], - "examples": [ - "Designed and built caching service for improved data performance management", - "Designed AWS configuration management", - "Introduced Kinesis and pioneered streaming events pipeline", - ], - }, { - "summary": "Is an industry-leading expert in foundational engineering or sets strategic foundational direction for an eng team", - "signals": [ - "Designs transformational projects in service of long-term goals", - "Defines the strategic vision for foundational work and supporting technologies", - "Invents industry-leading techniques to solve complex problems", - ], - "examples": [ - "Invented a novel ML technique that advanced the state of the art", - "Defined and developed SoapBox's continuous delivery strategy", - "Developed and implemented High Availability strategy", - ], - }], - }, - - "SERVERS": { - "displayName": "Servers", - "category": "A", - "description": "Develops expertise in server side engineering, using technologies such as PHP, NodeJS, or Python and creating performant REST APIs.", - "milestones": [{ - "summary": "Works effectively within established server side frameworks, following current best practices", - "signals": [ - "Adds NodeJS endpoints using layers architecture", - "Adds Service endpoints using Laravel PHP Framework", - "Makes minor server changes to support client needs", - ], - "examples": [ - "Added IFTTT trigger for adding items to SoapBox", - "Added a RESTful DELETE API endpoint for item management", - "Created a minor PHP Artisan command for a Laravel function", - ], - }, { - "summary": "Develops new instances of existing architecture, or minor improvements to existing architecture", - "signals": [ - "Assesses correctness and utility of existing code and avoids blind copy-pasting", - "Generalizes code when appropriate", - "Determines data needs from product requirements", - ], - "examples": [ - "Identified need for new index on Algolia", - "Acted as caretaker for API routes management", - "Updated version and codebase dependencies without errors", - ], - }, { - "summary": "Designs standalone systems of moderate complexity, or major new features in existing systems", - "signals": [ - "Acts as primary maintainer for existing critical systems", - "Integrates third party services effectively", - "Writes playbooks for new service maintenance", - ], - "examples": [ - "Implemented Google Auth login to SoapBox", - "Implemented payments integration with Stripe", - "Built Email Delivery services and deployed servers ", - ], - }, { - "summary": "Builds complex, reusable architectures that pioneer best practices for other engineers, or multi-system services", - "signals": [ - "Delivers complex systems that achieve their goals", - "Avoids subtle architectural mistakes when considering new systems", - "Makes appropriate buy vs build choices", - ], - "examples": [ - "Designed SoapBox's cursor management for paged data feeds", - "Designed custom domains architecture", - "Created Idempotency framework for proper API management", - ], - }, { - "summary": "Is an industry-leading expert in server side engineering or sets strategic server side direction for an eng team", - "signals": [ - "Designs transformational projects of significant complexity and scope", - "Makes decisions that have positive, long term, wide ranging consequences", - "Identifies and solves systemic problems with current architecture", - ], - "examples": [ - "Researched, vetted, and selected Laravel as SoapBox's primary backend language", - "Defined microservices architecture and migration plan for V4 -> V5 customers", - "Defined and implemented proprietary IP core to the company's success", - ], - }], - }, - - "PROJECT_MANAGEMENT": { - "displayName": "Project management", - "category": "B", - "description": "Delivers well-scoped programs of work that meet their goals, on time, to budget, harmoniously", - "milestones": [{ - "summary": "Effectively delivers individual tasks", - "signals": [ - "Estimates small tasks accurately", - "Delivers tightly-scoped projects efficiently", - "Writes effective technical specs outlining approach", - ], - "examples": [ - "Wrote the technical spec for featured post images", - "Delivered stream item support for email digests", - "Delivered payment billing history project", - ], - }, { - "summary": "Effectively delivers small personal projects", - "signals": [ - "Performs research and considers alternative approaches", - "Balances pragmatism and polish appropriately", - "Defines and hits interim milestones", - ], - "examples": [ - "Delivered comment messaging interface", - "Delivered file uploading for web client", - "Executed the recommends database backfills for priority sorting", - ], - }, { - "summary": "Effectively delivers projects through a small team", - "signals": [ - "Delegates tasks to others appropriately", - "Integrates business needs into project planning", - "Chooses appropriate project management strategy based on context", - ], - "examples": [ - "Ran project retro to assess improvement opportunities", - "Completed launch checklist unprompted for well controlled rollout", - "Facilitated project kickoff meeting to get buy-in", - ], - }, { - "summary": "Effectively delivers projects through a large team, or with a significant amount of stakeholders or complexity", - "signals": [ - "Finds ways to deliver requested scope faster, and prioritizes backlog", - "Manages dependencies on other projects and teams", - "Leverages recognition of repeated project patterns", - ], - "examples": [ - "Oversaw technical delivery of Agenda Templates Project", - "Managed infrastructure migration to virtual private clouds", - "Involved marketing, legal, and appropriate functions at project start", - ], - }, { - "summary": "Manages major company pushes delivered by multiple teams", - "signals": [ - "Considers external constraints and business objectives when planning", - "Leads teams of teams, and coordinates effective cross-functional collaboration", - "Owns key company metrics", - ], - "examples": [ - "Managed technical migration to SOA", - "Lead technical delivery of migration from SoapBox V4 to V5", - "Delivered multi-month engineering project on time", - ], - }], - }, - - "COMMUNICATION": { - "displayName": "Communication", - "category": "B", - "description": "Shares the right amount of information with the right people, at the right time, and listens effectively", - "milestones": [{ - "summary": "Communicates effectively to close stakeholders when called upon, and incorporates constructive feedback", - "signals": [ - "Communicates project status clearly and effectively", - "Collaborates with others with empathy", - "Asks for help at the appropriate juncture", - ], - "examples": [ - "Updated SoapBox github wiki when performing install scripts and run into errors", - "Updated project status changes in JIRA promptly", - "Gave thoughtful check-in and check-out comments", - ], - }, { - "summary": "Communicates with the wider team appropriately, focusing on timeliness and good quality conversations", - "signals": [ - "Practises active listening and suspension of attention", - "Ensures stakeholders are aware of current blockers", - "Chooses the appropriate tools for accurate and timely communication", - ], - "examples": [ - "Received and integrated critical feedback positively", - "Created cross-team Slack channel for revenue based work", - "Spoke to domain experts before writing spec", - ], - }, { - "summary": "Proactively shares information, actively solicits feedback, and facilitates communication for multiple stakeholders", - "signals": [ - "Resolves communication difficulties between others", - "Anticipates and shares schedule deviations in plenty of time", - "Manages project stakeholder expectations effectively", - ], - "examples": [ - "Directed team response effectively during outages", - "Gave a substantial Eng All Hands presentation on EmberJS", - "Gave notice of upcoming related work in Eng Briefing", - ], - }, { - "summary": "Communicates complex ideas skillfully and with nuance, and establishes alignment within the wider organization", - "signals": [ - "Communicates project risk and tradeoffs skillfully and with nuance", - "Contextualizes and clarifies ambiguous direction and strategy for others", - "Negotiates resourcing compromises with other teams", - ], - "examples": [ - "Lead off-site workshop on interviewing", - "Wrote SoapBox's growth framework and rationale", - "Aligned the entire organization around Discussions development", - ], - }, { - "summary": "Influences outcomes at the highest level, moves beyond mere broadcasting, and sets best practices for others", - "signals": [ - "Defines processes for clear communication for the entire team", - "Shares the right amount of information with the right people, at the right time", - "Develops and delivers plans to execs, the board, and outside investors", - ], - "examples": [ - "Organized half year check-in company offsite", - "Created the communication plan for a large organizational change", - "Presented to the board about key company metrics and projects", - ], - }], - }, - - "CRAFT": { - "displayName": "Craft", - "category": "B", - "description": "Embodies and promotes practices to ensure excellent quality products and services", - "milestones": [{ - "summary": "Delivers consistently good quality work", - "signals": [ - "Tests new code thoroughly, both locally, and in production once shipped", - "Writes tests for every new feature and bug fix", - "Writes clear comments and documentation", - ], - "examples": [ - "Caught a bug by QAing onw work before it went live", - "Landed non-trivial PR with no caretaker comments", - "Wrote hermetic tests for the happy and sad cases", - ], - }, { - "summary": "Increases the robustness and reliability of codebases, and devotes time to polishing products and systems", - "signals": [ - "Refactors existing code to make it more testable", - "Adds tests for uncovered areas", - "Deletes unnecessary code and deprecates proactively when safe to do so", - ], - "examples": [ - "Requested tests for a PR when acting as reviewer", - "Reduced the number of sentry exceptions", - "Fixed a TODO for someone else in the codebase", - ], - }, { - "summary": "Improves others' ability to deliver great quality work", - "signals": [ - "Implements systems that enable better testing", - "Gives thoughtful code reviews as a domain expert", - "Adds tooling to improve code quality", - ], - "examples": [ - "Improved performance of travis scripts to run the same volume of tests faster", - "Simplified hermetic test data modification", - "Created system for improved and accessible visual quality", - ], - }, { - "summary": "Advocates for and models great quality with proactive actions, and tackles difficult and subtle system issues", - "signals": [ - "Builds systems so as to eliminate entire classes of programmer error", - "Focuses the team on quality with regular reminders", - "Coordinates Watch priorities and projects", - ], - "examples": [ - "Added code coverage reporting to iOS CI pipeline", - "Iterated repeatedly to develop SoapBox's underlines solution", - "Defined and oversaw plan for closing Heartbleed vulnerability", - ], - }, { - "summary": "Enables and encourages the entire organization to make quality a central part of the development process", - "signals": [ - "Defines policies for the engineering org that encourage quality work", - "Identifies and eliminates single points of failure throughout the organization", - "Secures time and resources from execs to support great quality", - ], - "examples": [ - "Negotiated resources for Fix-It week with SLT", - "Instituted and ensured success of a 20% time policy", - "Started a guild to tackle system vulnerabilties and squash bugs", - ], - }], - }, - - "INITIATIVE": { - "displayName": "Initiative", - "category": "B", - "description": "Challenges the status quo and effects positive organizational change outside of mandated work", - "milestones": [{ - "summary": "Identifies opportunities for organizational change or product improvements", - "signals": [ - "Writes project briefs about improvement opportunities", - "Raises meaningful tensions in tactical meetings", - "Asks leadership team probing questions at all hands", - ], - "examples": [ - "Wrote about problems with API performance issues", - "Wrote about content policy problems", - "Reported a site issue in Github/JIRA", - ], - }, { - "summary": "Causes change to positively impact a few individuals or minor improvement to an existing product or service", - "signals": [ - "Picks bugs off the backlog proactively when blocked elsewhere", - "Makes design quality improvements unprompted", - "Takes on trust and safety tasks proactively when blocked elsewhere", - ], - "examples": [ - "Advocated on own behalf for a change in role", - "Implemented flow typing for promises", - "Audited web client performance in Chrome and proposed fixes", - ], - }, { - "summary": "Causes change to positively impact an entire team or instigates a minor feature or service", - "signals": [ - "Demonstrates concepts proactively with prototypes", - "Fixes complicated bugs outside of regular domain", - "Takes ownership of systems that nobody owns or wants", - ], - "examples": [ - "Defined style guide to resolve style arguments", - "Proposed and implemented at-mentions prototype", - "Implemented file upload for Android independently, unprompted", - ], - }, { - "summary": "Effects change that has a substantial positive impact on the engineering organization or a major product impact", - "signals": [ - "Champions and pioneers new technologies to solve new classes of problem", - "Exemplifies grit and determination in the face of persistent obstacles", - "Instigates major new features, services, or architectures", - ], - "examples": [ - "Created the interviewing rubric and booklet", - "Implemented and secured support for native login", - "Migrated database to latest version of MYSQL unprompted to allow better unicode support across product", - ], - }, { - "summary": "Effects change that has a substantial positive impact on the whole company", - "signals": [ - "Creates a new function to solve systemic issues", - "Galvanizes the entire company and garners buy in for a new strategy", - "Changes complex organizational processes", - ], - "examples": [ - "Migrated the organization to using Agile methodologies", - "Built SoapBox chrome extention prototype and convinced execs to build it", - "Convinced leadership and engineering org to move to a microservices architecture", - ], - }], - }, - - "CAREER_DEVELOPMENT": { - "displayName": "Career development", - "category": "C", - "description": "Provides strategic support to engineers to help them build the career they want", - "milestones": [{ - "summary": "Gives insight into opportunities and helps identify individuals' strengths and weaknesses", - "signals": [ - "Advocates on behalf and in defense of a group member", - "Shares opportunities for improvements and recognises achievements", - "Explains appropriate available industry paths", - ], - "examples": [ - "Collected and delivered feedback", - "Discussed career options and areas of interest informally", - "Hosted an improving interviewing workshop session", - ], - }, { - "summary": "Formally supports and advocates for one person and provides tools to help them solve career problems", - "signals": [ - "Ensure a group member has an appropriate role on their team", - "Offers effective career advice to group members, without being prescriptive", - "Creates space for people to talk through challenges", - ], - "examples": [ - "Set up and attended regular, constructive 1:1s", - "Provided coaching on how to have difficult conversations", - "Taught group members the GROW model", - ], - }, { - "summary": "Inspires and retains a small group of people and actively pushes them to stretch themselves", - "signals": [ - "Discusses paths, and creates plans for personal and professional growth", - "Advocates to align people with appropriate roles within organization", - "Works with team leads to elevate emerging leaders", - ], - "examples": [ - "Reviewed individual group member progression every 6 weeks", - "Suggested appropriate group member for Tech Lead position", - "Arranged a requested switch of discipline for a group member", - ], - }, { - "summary": "Manages interactions and processes between groups, promoting best practices and setting a positive example", - "signals": [ - "Manages team transitions smoothly, respecting team and individual needs", - "Develops best practices for conflict resolution", - "Ensures all group members' roles are meeting their career needs", - ], - "examples": [ - "Completed training on situational leadership", - "Built a resourcing plan based on company, team, and individual goals", - "Prevented regretted attrition with intentional, targeted intervention", - ], - }, { - "summary": "Supports the development of a signficant part of the engineering org, and widely viewed as a trusted advisor", - "signals": [ - "Supports and develops senior leaders", - "Identified leadership training opportunities for senior leadership", - "Pushes everyone to be as good as they can be, with empathy", - ], - "examples": [ - "Provided coaching to group leads", - "Devised engineering growth curriculum for group leads", - "Advocated to execs for engineer development resources and programs", - ], - }], - }, - - "ORG_DESIGN": { - "displayName": "Org design", - "category": "C", - "description": "Defines processes and structures that enables the strong growth and execution of a diverse eng organization", - "milestones": [{ - "summary": "Respects and participates in processes, giving meaningful feedback to help the organization improve", - "signals": [ - "Reflects on meetings that leave them inspired or frustrated", - "Teaches others about existing processes", - "Actively participates and makes contributions within organizational processes", - ], - "examples": [ - "Facilitated effective tactical meeting with empathy", - "Explained tactical meeting format to a new hire", - "Provided feedback on sprint planning meeting", - ], - }, { - "summary": "Identifies opportunities to improve existing processes and makes changes that positively affect the local team", - "signals": [ - "Defines meeting structure and cadence that meets team needs", - "Engages in organizational systems thinking", - "Advocates for improved diversity and inclusion, and proposes ideas to help", - ], - "examples": [ - "Defined innovative meeting structure for small team", - "Improved support on-call rotation scheduling", - "Defined standard channels for inter-team communication", - ], - }, { - "summary": "Develops processes to solve ongoing organizational problems", - "signals": [ - "Creates programs that meaningfully improve organizational diversity", - "Solves long-standing organizational problems", - "Reallocates resources to meet organizational needs", - ], - "examples": [ - "Developed baseline team templates for consistency", - "Created bug-rotation program to address ongoing quality issues", - "Defined Guilds manifesto and charter", - ], - }, { - "summary": "Thinks deeply about organizational issues and identifies hidden dynamics that contribute to them", - "signals": [ - "Evaluates incentive structures and their effect on execution", - "Analyzes existing processes for bias and shortfall", - "Ties abstract concerns to concrete organizational actions or norms", - ], - "examples": [ - "Connected mobile recruiting difficulties to focus on excellence", - "Raised leadership level change discrepancies", - "Analyzed the hiring rubric for false negative potential", - ], - }, { - "summary": "Leads initiatives to address issues stemming from hidden dynamics and company norms", - "signals": [ - "Builds programs to train leadership in desired skills", - "Creates new structures that provide unique growth opportunities", - "Leads planning and communication for reorgs", - ], - "examples": [ - "Lead efforts to increase number of mobile engineers", - "Directed resources to meaningfully improve diversity at all levels", - "Built the growth framework rubric", - ], - }], - }, - - "WELLBEING": { - "displayName": "Wellbeing", - "category": "C", - "description": "Supports the emotional well-being of group members in difficult times, and celebrates their successes", - "milestones": [{ - "summary": "Uses tools and processes to help ensure colleagues are healthy and happy", - "signals": [ - "Keeps confidences unless legally or morally obliged to do otherwise", - "Applies the reasonable person principle to others", - "Avoids blame and focuses on positive change", - ], - "examples": [ - "Ensured group members were taking enough vacation", - "Put themself in another's shoes to understand their perspective", - "Checked in with colleague showing signs of burnout", - ], - }, { - "summary": "Creates a positive, supportive, engaging team environment for group members", - "signals": [ - "Sheds light on other experiences to build empathy and compassion", - "Validates ongoing work and sustains motivation", - "Proposes solutions when teams get bogged down or lose momentum", - ], - "examples": [ - "Coordinated a small celebration for a project launch", - "Connected tedious A|B testing project with overall company goals", - "Noted a team without a recent win and suggested some easy quick wins", - ], - }, { - "summary": "Manages expectations across peers, leads in the org, promotes calm, and prevents consensus building", - "signals": [ - "Trains group members to separate stimulus from response", - "Maintains a pulse on individual and team morale", - "Helps group members approach problems with curiosity", - ], - "examples": [ - "Completed training on transference and counter transference", - "Completed training on compromise and negotiation techniques", - "Reframed a problem as a challenge, instead of a barrier, when appropriate", - ], - }, { - "summary": "Advocates for the needs of teams and group members, and proactively works to calm the organization", - "signals": [ - "Ensures team environments are safe and inclusive, proactively", - "Grounds group member anxieties in reality", - "Tracks team retention actively and proposes solutions to strengthen it", - ], - "examples": [ - "Relieved org tension around product direction by providing extra context", - "Encouraged group members to focus on what they can control", - "Guided people through complex organizational change", - ], - }, { - "summary": "Manages narratives, channels negativity into inspiration and motivation, and protects the entire team", - "signals": [ - "Recognizes and points out narratives when appropriate", - "Works to reshape narratives from victimization to ownership", - "Increases the psychological safety of the entire team", - ], - "examples": [ - "Converted group member from a problem haver to a problem solver", - "Challenged false narrative and redirected to compassion and empathy", - "Cultivated and championed a culture of empathy within the entire team", - ], - }], - }, - - "ACCOMPLISHMENT": { - "displayName": "Accomplishment", - "category": "C", - "description": "Inspires day to day excellence, maximises potential and effectively resolves performance issues with compassion", - "milestones": [{ - "summary": "Helps individuals identify blockers and helps them identify next steps for resolution", - "signals": [ - "Notices when someone is stuck and reaches out", - "Helps others break down problems into feasible, tangible next steps", - "Talks through problems non-judgmentally", - ], - "examples": [ - "Completed training on diagnosing problems", - "Unblocked a group member", - "Reinforces and affirms positive feedback for good work", - ], - }, { - "summary": "Helps individuals resolve difficult performance issues, with insight, compassion, and skill", - "signals": [ - "Gathers context outside the immediate problem", - "Recognizes issues within local environment and suggests change", - "Works to encourage ownership of actions and responsibilities", - ], - "examples": [ - "Completed training on decision making", - "Convinced a group member to solve a problem directly, rather than doing it for them", - "Gave honest feedback about poor performance, with compassion", - ], - }, { - "summary": "Intervenes in long-standing performance issues with targeted behavior change or performance plans", - "signals": [ - "Aggregates signals of poor performance and creates process for improvement", - "Investigates motivation and externalities for consistent poor performance", - "Puts together comprehensive, achievable performance plans", - ], - "examples": [ - "Worked with group member to address persistent communication failures", - "Arranged a transfer to another team, resulting in improved performance", - "Managed group member closely to maximise chances of PIP success", - ], - }, { - "summary": "Mediates escalated situations, empowers underperforming teams, and resolves conflict", - "signals": [ - "Recognizes heightened situations and toxic or aggressive interactions", - "Inserts themself into conflict where appropriate to calm and mediate", - "Encourages open dialog and builds trust between parties in conflict", - ], - "examples": [ - "Empowered a team to drive forward amidst uncertainty", - "Protected team from externalities so they could focus on goals", - "Mediated sit-down between team members to address tension", - ], - }, { - "summary": "Resolves complex organizational dysfunction, or persistent conflict at senior levels", - "signals": [ - "Takes control of dysfunctional teams to organise chaos", - "Repairs broken team dynamics and builds harmony", - "Presides over a well-oiled team of teams", - ], - "examples": [ - "Turned around the performance of a problematic team", - "De-escalated serious tensions between teams", - "Rebuilt trust between senior team leads", - ], - }], - }, - - "MENTORSHIP": { - "displayName": "Mentorship", - "category": "D", - "description": "Provides support to colleagues, spreads knowledge, and develops the team outside formal reporting structures", - "milestones": [{ - "summary": "Informally mentors individuals in an ad-hoc way, supports new hires, and conveys institutional knowledge", - "signals": [ - "Makes themself available for informal support and advice", - "Acts as sounding board for peers and more junior members", - "Provides sound advice when asked", - ], - "examples": [ - "Acted as an onboarding buddy", - "Paired with an engineer to help them with an unfamiliar area", - "Helped a colleague understand their feelings", - ], - }, { - "summary": "Mentors people proactively, and guides people to realizations rather than providing the answer", - "signals": [ - "Takes time to explain concepts and best practices", - "Asks questions to illuminate concepts, rather than stating them", - "Allows others to lead efforts when it will help their development", - ], - "examples": [ - "Shared interesting article with a team member to help with their growth", - "Offered unprompted feedback to help growth, with empathy", - "Lead from behind to support someone new to a leadership role", - ], - }, { - "summary": "Teaches small groups of engineers and contributes to SoapBox's shared knowledge base", - "signals": [ - "Avoids siloing information when it can be usefully shared with others", - "Works to increase the bus factor of systems", - "Finds tools that work best for a team member's personality", - ], - "examples": [ - "Gave a brown bag presentation on payments", - "Wrote article for support team on how to properly investigate bugs with Microsoft Teams authentication", - "Wrote content on how to properly install and set up development environment", - ], - }, { - "summary": "Encourages people to mentor each other, and creates ways for them to do so", - "signals": [ - "Defines an entire curriculum for a discipline", - "Draws positive attention to well-modeled mentor and teaching behaviours", - "Creates brown bag series and lines up speakers", - ], - "examples": [ - "Created and lead SoapBox' Women in Eng group", - "Organized an Eng All Hands with an outside speaker", - "Designed and taught web client guild curriculum", - ], - }, { - "summary": "Instills and promotes a culture of learning and development within the team", - "signals": [ - "Sets incentive structures to recognise and reward mentorship", - "Empowers team members to develop themselves", - "Role models productive and healthy mentor relationships", - ], - "examples": [ - "Instituted the professional education budget for engineers", - "Mentored mentors", - "Started the eng advisor program and lined up external mentors", - ], - }], - }, - - "EVANGELISM": { - "displayName": "Evangelism", - "category": "D", - "description": "Promotes SoapBox to the outside world and establishes it as an attractive and thoughtful place to work", - "milestones": [{ - "summary": "Represents SoapBox well externally, and influences individuals positively", - "signals": [ - "Shares personal and organizational successes with their network", - "Attends SoapBox-hosted events and talks with guests", - "Communicates genuine and honest excitement about their work externally", - ], - "examples": [ - "Shared a SoapBox product launch post on Facebook", - "Acted as a guide for a non-friend visitor to the office", - "Supported PR efforts by giving a quote or having a photo taken", - ], - }, { - "summary": "Participates more centrally in small events, and takes simple actions that positively influence groups of people", - "signals": [ - "Takes meaningful action to introduce people to SoapBox", - "Joined public Slack group and represented Soapbox appropriately, and well", - "Organizes positive small- or medium-sized events that bring people to SoapBox", - ], - "examples": [ - "Volunteered as a helper for external code writing workshop", - "Organized a short tour of the office by college students", - "Talked at a Laravel Toronto event hosted at SoapBox", - ], - }, { - "summary": "Works hard to positively influence large groups of people on their views of Soapbox", - "signals": [ - "Mentors or participates in a high visibility way in an external organization", - "Builds fruitful partnerships with external organizations", - "Writes blog posts about Soapbox that receive moderate traffic", - ], - "examples": [ - "Represented Soapbox on a panel at a conference of industry experts", - "Established close ties with Creative Commons", - "Built a durable, long-standing org relationship with external not-for-profit", - ], - }, { - "summary": "Establishes Soapbox as an great, innovative company and workplace to the whole industry", - "signals": [ - "Establishes themself as an industry thought leader who attracts talent", - "Publishes material about Soapbox's organizational or technical innovations", - "Leverages significant following to evangelise Soapbox", - ], - "examples": [ - "Published a paper on Soapbox technology in a peer-reviewed journal", - "Authored joint-press releases", - "Published opinionated post on an Engineering blog internal or external", - ], - }, { - "summary": "Introduces Soapbox in a positive light to a wider audience outside the industry", - "signals": [ - "Delivers key messages to broad, mainstream audiences", - "Influences people with large audiences to talk about Soapbox positively", - "Drives recognition and adoption of Soapbox in significant numbers", - ], - "examples": [ - "Published or interviewed in a mainstream newspaper or website outside tech", - "Keynoted a conference with international attention", - "Represented Soapbox in national televised media", - ], - }], - }, - - "RECRUITING": { - "displayName": "Recruiting", - "category": "D", - "description": "Strengthens Soapbox's team by bringing in excellent staff members", - "milestones": [{ - "summary": "Brings new candidates into the pipeline and understands how to evaluate candidates at Soapbox", - "signals": [ - "Reviews existing network for hiring leads regularly", - "Shadows interviews to gain familiarity with process", - "Reviews current job postings regularly", - ], - "examples": [ - "Completed interview calibration", - "Set up casual sessions to practice asking questions", - "Referred appropriate individuals for open positions", - ], - }, { - "summary": "Interviews regularly, helps the team make meaningful hiring decisions, and helps build a diverse pipeline", - "signals": [ - "Uses interview rubric to provide clear, objective feedback on candidates", - "Interviews candidates with empathy and treats them all with equal respect", - "Researches approaches for sourcing candidates and diversifying hiring", - ], - "examples": [ - "Added observable evidence for every rating", - "Started a quarterly event for candidates to meet SoapBox employees", - "Tested a new service for quality and diversity of candidates", - ], - }, { - "summary": "Maintains and strengthens the integrity of the current process, and regularly brings in great candidates", - "signals": [ - "Teaches new interviewers how to interview with empathy", - "Models great interview technique and feedback when shadowed", - "Reverse shadows trainees and helps calibrate their feedback", - ], - "examples": [ - "Wrote new interview question which meets our question quality criteria", - "Brought candidates into our pipeline proactively, with a high conversion rate", - "Proposed useful, tangible improvements to the interview process", - ], - }, { - "summary": "Actively contributes to and leads hiring decisions, and goes to great lengths to source great candidates", - "signals": [ - "Documents subtle cues in interviews that indicate values alignment", - "Makes hiring decisions, resolving discrepancies between conflicting reports", - "Top-grades candidates and teases out character traits", - ], - "examples": [ - "Planned engineering summit on interview process and training", - "Organized and lead SoapBox's presence at a recruitment fair", - "Started a SoapBox internship program", - ], - }, { - "summary": "Sets recruitment strategy, invests in long-term relationships for critical roles, and recruits at scale", - "signals": [ - "Sets the tone, policy and goals around building a diverse, high-quality team", - "Identifies and brings in promising acquisitions", - "Tracks industry activity, identifying opportunities for critical roles", - ], - "examples": [ - "Talked with a senior candidate over many months to fill a critical role", - "Organized efforts around convincing acquired engineers to join and stay", - "Set goals, then tracked and reported metrics on team demographics over time", - ], - }], - }, - - "COMMUNITY": { - "displayName": "Community", - "category": "D", - "description": "Builds community internally, gives of themself to the team, and champions and extols company values", - "milestones": [{ - "summary": "Is available and present on current teams, and works to contribute positively to company culture", - "signals": [ - "Participates in team activities and offsites", - "Treats colleagues and clients with respect", - "Joins groups or committees outside regular duties", - ], - "examples": [ - "Joined and actively participated in the web client guild", - "Brought a small gift back from vacation for the team", - "Wrote entertaining and informative Prod Ops writeups", - ], - }, { - "summary": "Steps up, builds connectedness, and takes concrete actions to promote an inclusive culture", - "signals": [ - "Makes space for others to participate", - "Collaborates with other engineers outside direct responsibilities", - "Finds ways to ramp up and engage new hires quickly", - ], - "examples": [ - "Created onboarding bingo", - "Brought shy and introverted people into a dominant conversation", - "Volunteered as secretary for a team", - ], - }, { - "summary": "Contributes to improving team relatedness, and helps build a culture of lending support", - "signals": [ - "Takes on additional support shifts at short notice", - "Pitches in to help other teams hit deadlines, without missing own deadlines", - "Uses position to raise difficult issues on someone's behalf", - ], - "examples": [ - "Helped with support calls while still contributing to projects", - "Organizes team building events", - "Stayed positive and improved team morale during period after layoffs", - ], - }, { - "summary": "Exemplifies selflessness for the team without compromising responsibilities, and lifts everyone up", - "signals": [ - "Goes above and beyond on the Watch, serving the team without complaint", - "Implements concrete programs to signficantly improve team inclusivity", - "Takes on large amounts of tedious grunt work for the team without being asked", - ], - "examples": [ - "Devoted large amount of time to helping outside direct responsibilities", - "Refactored hundreds of legacy files", - "Acted as sole maintainer of LinkifyJS for years", - ], - }, { - "summary": "Lives the company values, guards positive culture, and defines policies that support relatedness between teams", - "signals": [ - "Brings separate teams together to build relatedness", - "Holds individuals, teams, and leadership accountable to SoapBox's values", - "Sets the tone, policy, and goals around maintaining an inclusive company", - ], - "examples": [ - "Organizes events for whole org", - "Devised, delivered and acted on findings from an engineer happiness survey", - "Challenged and corrected exclusionary behaviour or policies", - ], - }], - }, -} - export const trackIds: TrackId[] = Object.keys(tracks) export const categoryIds: Set = trackIds.reduce((set, trackId) => { @@ -1192,19 +74,6 @@ export const categoryColorScale = d3.scaleOrdinal() .domain(categoryIds) .range(['#24acfc', '#8147FC', '#b7dc50', '#00D7C8']) -export const titles = [ - {label: 'Engineer I', minPoints: 0, maxPoints: 16}, - {label: 'Engineer II', minPoints: 17, maxPoints: 35}, - {label: 'Sr. Engineer', minPoints: 36, maxPoints: 57}, - {label: 'Team Lead', minPoints: 36, maxPoints: 57}, - {label: 'Engineering Manager', minPoints: 36, maxPoints: 57}, - {label: 'Staff Engineer', minPoints: 58, maxPoints: 89}, - {label: 'Sr. Team Lead', minPoints: 58, maxPoints: 89}, - {label: 'Sr. Engineering Manager', minPoints: 58, maxPoints: 89}, - {label: 'Principal Engineer', minPoints: 90}, - {label: 'Dir. Engineering', minPoints: 90} -] - export const eligibleTitles = (milestoneMap: MilestoneMap): string[] => { const totalPoints = totalPointsFromMilestoneMap(milestoneMap) From b71ffcb863e719bbd32f3a19a18db3ce89660d14 Mon Sep 17 00:00:00 2001 From: Christopher Fraser Date: Wed, 10 Jul 2019 11:05:18 -0400 Subject: [PATCH 04/13] Remove general functions from specific constant file --- constants.js | 1 + constants_product.js | 97 +------------------------------------------- 2 files changed, 2 insertions(+), 96 deletions(-) diff --git a/constants.js b/constants.js index c83a6bc8..fdb5990e 100644 --- a/constants.js +++ b/constants.js @@ -1,5 +1,6 @@ // @flow import * as d3 from 'd3' + export const milestones = [0, 1, 2, 3, 4, 5] export const milestoneToPoints = (milestone: Milestone): number => { diff --git a/constants_product.js b/constants_product.js index 818cb521..f5dc8bb1 100644 --- a/constants_product.js +++ b/constants_product.js @@ -5,7 +5,6 @@ export type TrackId = 'MARKET' | 'WEB_CLIENT' | 'FOUNDATIONS' | 'SERVERS' | 'PROJECT_MANAGEMENT' | 'COMMUNICATION' | 'CRAFT' | 'INITIATIVE' | 'CAREER_DEVELOPMENT' | 'ORG_DESIGN' | 'WELLBEING' | 'ACCOMPLISHMENT' | 'MENTORSHIP' | 'EVANGELISM' | 'RECRUITING' | 'COMMUNITY' -export type Milestone = 0 | 1 | 2 | 3 | 4 | 5 export type MilestoneMap = { 'MARKET': Milestone, //market understanding @@ -25,50 +24,6 @@ export type MilestoneMap = { 'RECRUITING': Milestone, 'COMMUNITY': Milestone } -export const milestones = [0, 1, 2, 3, 4, 5] - -export const milestoneToPoints = (milestone: Milestone): number => { - switch (milestone) { - case 0: return 0 - case 1: return 1 - case 2: return 3 - case 3: return 6 - case 4: return 12 - case 5: return 20 - default: return 0 - } -} - -export const pointsToLevels = { - '0': '1.1', - '5': '1.2', - '11': '1.3', - '17': '2.1', - '23': '2.2', - '29': '2.3', - '36': '3.1', - '43': '3.2', - '50': '3.3', - '58': '4.1', - '66': '4.2', - '74': '4.3', - '90': '5.1', - '110': '5.2', - '135': '5.3', -} - -export const maxLevel = 135 - -export type Track = { - displayName: string, - category: string, // TK categoryId type? - description: string, - milestones: { - summary: string, - signals: string[], - examples: string[] - }[] -} type Tracks = {| 'MARKET': Track, @@ -1149,54 +1104,4 @@ export const tracks: Tracks = { ], }], }, -} - -export const trackIds: TrackId[] = Object.keys(tracks) - -export const categoryIds: Set = trackIds.reduce((set, trackId) => { - set.add(tracks[trackId].category) - return set -}, new Set()) - -export const categoryPointsFromMilestoneMap = (milestoneMap: MilestoneMap) => { - let pointsByCategory = new Map() - trackIds.forEach((trackId) => { - const milestone = milestoneMap[trackId] - const categoryId = tracks[trackId].category - let currentPoints = pointsByCategory.get(categoryId) || 0 - pointsByCategory.set(categoryId, currentPoints + milestoneToPoints(milestone)) - }) - return Array.from(categoryIds.values()).map(categoryId => { - const points = pointsByCategory.get(categoryId) - return { categoryId, points: pointsByCategory.get(categoryId) || 0 } - }) -} - -export const totalPointsFromMilestoneMap = (milestoneMap: MilestoneMap): number => - trackIds.map(trackId => milestoneToPoints(milestoneMap[trackId])) - .reduce((sum, addend) => (sum + addend), 0) - -export const categoryColorScale = d3.scaleOrdinal() - .domain(categoryIds) - .range(['#24acfc', '#8147FC', '#b7dc50', '#00D7C8']) - -export const titles = [ - {label: 'Engineer I', minPoints: 0, maxPoints: 16}, - {label: 'Engineer II', minPoints: 17, maxPoints: 35}, - {label: 'Sr. Engineer', minPoints: 36, maxPoints: 57}, - {label: 'Team Lead', minPoints: 36, maxPoints: 57}, - {label: 'Engineering Manager', minPoints: 36, maxPoints: 57}, - {label: 'Staff Engineer', minPoints: 58, maxPoints: 89}, - {label: 'Sr. Team Lead', minPoints: 58, maxPoints: 89}, - {label: 'Sr. Engineering Manager', minPoints: 58, maxPoints: 89}, - {label: 'Principal Engineer', minPoints: 90}, - {label: 'Dir. Engineering', minPoints: 90} -] - -export const eligibleTitles = (milestoneMap: MilestoneMap): string[] => { - const totalPoints = totalPointsFromMilestoneMap(milestoneMap) - - return titles.filter(title => (title.minPoints === undefined || totalPoints >= title.minPoints) - && (title.maxPoints === undefined || totalPoints <= title.maxPoints)) - .map(title => title.label) -} +} \ No newline at end of file From 10e6766a1f3765b241e268923c56218b71b81384 Mon Sep 17 00:00:00 2001 From: Christopher Fraser Date: Wed, 10 Jul 2019 11:08:38 -0400 Subject: [PATCH 05/13] Add titles back to product, remove general functions for engineering --- constants_engineering.js | 84 ---------------------------------------- constants_product.js | 18 +++++++-- 2 files changed, 14 insertions(+), 88 deletions(-) diff --git a/constants_engineering.js b/constants_engineering.js index e4e0cd52..4f5ae98a 100644 --- a/constants_engineering.js +++ b/constants_engineering.js @@ -1,11 +1,8 @@ // @flow -import * as d3 from 'd3' - export type TrackId = 'MOBILE' | 'WEB_CLIENT' | 'FOUNDATIONS' | 'SERVERS' | 'PROJECT_MANAGEMENT' | 'COMMUNICATION' | 'CRAFT' | 'INITIATIVE' | 'CAREER_DEVELOPMENT' | 'ORG_DESIGN' | 'WELLBEING' | 'ACCOMPLISHMENT' | 'MENTORSHIP' | 'EVANGELISM' | 'RECRUITING' | 'COMMUNITY' -export type Milestone = 0 | 1 | 2 | 3 | 4 | 5 export type MilestoneMap = { 'MOBILE': Milestone, @@ -25,50 +22,6 @@ export type MilestoneMap = { 'RECRUITING': Milestone, 'COMMUNITY': Milestone } -export const milestones = [0, 1, 2, 3, 4, 5] - -export const milestoneToPoints = (milestone: Milestone): number => { - switch (milestone) { - case 0: return 0 - case 1: return 1 - case 2: return 3 - case 3: return 6 - case 4: return 12 - case 5: return 20 - default: return 0 - } -} - -export const pointsToLevels = { - '0': '1.1', - '5': '1.2', - '11': '1.3', - '17': '2.1', - '23': '2.2', - '29': '2.3', - '36': '3.1', - '43': '3.2', - '50': '3.3', - '58': '4.1', - '66': '4.2', - '74': '4.3', - '90': '5.1', - '110': '5.2', - '135': '5.3', -} - -export const maxLevel = 135 - -export type Track = { - displayName: string, - category: string, // TK categoryId type? - description: string, - milestones: { - summary: string, - signals: string[], - examples: string[] - }[] -} type Tracks = {| 'MOBILE': Track, @@ -1163,35 +1116,6 @@ export const tracks: Tracks = { }, } -export const trackIds: TrackId[] = Object.keys(tracks) - -export const categoryIds: Set = trackIds.reduce((set, trackId) => { - set.add(tracks[trackId].category) - return set -}, new Set()) - -export const categoryPointsFromMilestoneMap = (milestoneMap: MilestoneMap) => { - let pointsByCategory = new Map() - trackIds.forEach((trackId) => { - const milestone = milestoneMap[trackId] - const categoryId = tracks[trackId].category - let currentPoints = pointsByCategory.get(categoryId) || 0 - pointsByCategory.set(categoryId, currentPoints + milestoneToPoints(milestone)) - }) - return Array.from(categoryIds.values()).map(categoryId => { - const points = pointsByCategory.get(categoryId) - return { categoryId, points: pointsByCategory.get(categoryId) || 0 } - }) -} - -export const totalPointsFromMilestoneMap = (milestoneMap: MilestoneMap): number => - trackIds.map(trackId => milestoneToPoints(milestoneMap[trackId])) - .reduce((sum, addend) => (sum + addend), 0) - -export const categoryColorScale = d3.scaleOrdinal() - .domain(categoryIds) - .range(['#24acfc', '#8147FC', '#b7dc50', '#00D7C8']) - export const titles = [ {label: 'Engineer I', minPoints: 0, maxPoints: 16}, {label: 'Engineer II', minPoints: 17, maxPoints: 35}, @@ -1204,11 +1128,3 @@ export const titles = [ {label: 'Principal Engineer', minPoints: 90}, {label: 'Dir. Engineering', minPoints: 90} ] - -export const eligibleTitles = (milestoneMap: MilestoneMap): string[] => { - const totalPoints = totalPointsFromMilestoneMap(milestoneMap) - - return titles.filter(title => (title.minPoints === undefined || totalPoints >= title.minPoints) - && (title.maxPoints === undefined || totalPoints <= title.maxPoints)) - .map(title => title.label) -} diff --git a/constants_product.js b/constants_product.js index f5dc8bb1..8f3f6c38 100644 --- a/constants_product.js +++ b/constants_product.js @@ -1,6 +1,4 @@ // @flow -import * as d3 from 'd3' - export type TrackId = 'MARKET' | 'WEB_CLIENT' | 'FOUNDATIONS' | 'SERVERS' | 'PROJECT_MANAGEMENT' | 'COMMUNICATION' | 'CRAFT' | 'INITIATIVE' | 'CAREER_DEVELOPMENT' | 'ORG_DESIGN' | 'WELLBEING' | 'ACCOMPLISHMENT' | @@ -24,7 +22,6 @@ export type MilestoneMap = { 'RECRUITING': Milestone, 'COMMUNITY': Milestone } - type Tracks = {| 'MARKET': Track, 'WEB_CLIENT': Track, @@ -1104,4 +1101,17 @@ export const tracks: Tracks = { ], }], }, -} \ No newline at end of file +} + +export const titles = [ + {label: 'Jr Product Manager', minPoints: 0, maxPoints: 16}, + {label: 'Engineer II', minPoints: 17, maxPoints: 35}, + {label: 'Sr. Engineer', minPoints: 36, maxPoints: 57}, + {label: 'Team Lead', minPoints: 36, maxPoints: 57}, + {label: 'Engineering Manager', minPoints: 36, maxPoints: 57}, + {label: 'Staff Engineer', minPoints: 58, maxPoints: 89}, + {label: 'Sr. Team Lead', minPoints: 58, maxPoints: 89}, + {label: 'Sr. Engineering Manager', minPoints: 58, maxPoints: 89}, + {label: 'Principal Engineer', minPoints: 90}, + {label: 'Dir. Engineering', minPoints: 90} +] From e93bbd056c9173745fe80f6e9ce90cae8795f757 Mon Sep 17 00:00:00 2001 From: Christopher Fraser Date: Wed, 10 Jul 2019 15:11:39 -0400 Subject: [PATCH 06/13] Completely disconnect the layout from the specific consts of the loaded file --- components/LevelThermometer.js | 4 ++-- components/NightingaleChart.js | 14 +++++++------- components/PointSummaries.js | 7 ++++--- components/SnowflakeApp.js | 30 +++++++++++++++++++----------- components/TitleSelector.js | 5 +++-- components/Track.js | 5 ++--- components/TrackSelector.js | 11 +++++------ constants.js | 14 +++++++------- 8 files changed, 49 insertions(+), 41 deletions(-) diff --git a/components/LevelThermometer.js b/components/LevelThermometer.js index 1de6202f..c2d0b238 100644 --- a/components/LevelThermometer.js +++ b/components/LevelThermometer.js @@ -1,7 +1,7 @@ // @flow import * as d3 from 'd3' -import { pointsToLevels, categoryPointsFromMilestoneMap, categoryColorScale, categoryIds, maxLevel } from '../constants' +import { pointsToLevels, categoryPointsFromMilestoneMap, categoryColorScale, maxLevel } from '../constants' import React from 'react' import type { MilestoneMap } from '../constants' @@ -71,7 +71,7 @@ class LevelThermometer extends React.Component { + "z"; } render() { - let categoryPoints = categoryPointsFromMilestoneMap(this.props.milestoneByTrack) + let categoryPoints = categoryPointsFromMilestoneMap(this.props.milestoneByTrack, this.props.trackIds, this.props.tracks) let lastCategoryIndex = 0 categoryPoints.forEach((categoryPoint, i) => { if (categoryPoint.points) lastCategoryIndex = i diff --git a/components/NightingaleChart.js b/components/NightingaleChart.js index acbc28f7..52f67a57 100644 --- a/components/NightingaleChart.js +++ b/components/NightingaleChart.js @@ -2,7 +2,7 @@ import React from 'react' import * as d3 from 'd3' -import { trackIds, milestones, tracks, categoryColorScale } from '../constants' +import { milestones, categoryColorScale } from '../constants' import type { TrackId, Milestone, MilestoneMap } from '../constants' const width = 400 @@ -33,8 +33,8 @@ class NightingaleChart extends React.Component { this.arcFn = d3.arc() .innerRadius(milestone => this.radiusScale(milestone)) .outerRadius(milestone => this.radiusScale(milestone) + this.radiusScale.bandwidth()) - .startAngle(- Math.PI / trackIds.length) - .endAngle(Math.PI / trackIds.length) + .startAngle(- Math.PI / this.props.trackIds.length) + .endAngle(Math.PI / this.props.trackIds.length) .padAngle(Math.PI / 200) .padRadius(.45 * width) .cornerRadius(2) @@ -64,10 +64,10 @@ class NightingaleChart extends React.Component { `} - {trackIds.map((trackId, i) => { + {this.props.trackIds.map((trackId, i) => { const isCurrentTrack = trackId == this.props.focusedTrackId return ( - + {arcMilestones.map((milestone) => { const isCurrentMilestone = isCurrentTrack && milestone == currentMilestoneId const isMet = this.props.milestoneByTrack[trackId] >= milestone || milestone == 0 @@ -77,14 +77,14 @@ class NightingaleChart extends React.Component { className={'track-milestone ' + (isMet ? 'is-met ' : ' ') + (isCurrentMilestone ? 'track-milestone-current' : '')} onClick={() => this.props.handleTrackMilestoneChangeFn(trackId, milestone)} d={this.arcFn(milestone)} - style={{fill: isMet ? categoryColorScale(tracks[trackId].category) : undefined}} /> + style={{fill: isMet ? categoryColorScale(this.props.tracks[trackId].category) : undefined}} /> ) })} this.props.handleTrackMilestoneChangeFn(trackId, 0)} /> diff --git a/components/PointSummaries.js b/components/PointSummaries.js index 61934b57..4d04deac 100644 --- a/components/PointSummaries.js +++ b/components/PointSummaries.js @@ -1,16 +1,17 @@ // @flow -import { pointsToLevels, milestoneToPoints, trackIds, totalPointsFromMilestoneMap, maxLevel } from '../constants' +import { pointsToLevels, milestoneToPoints, totalPointsFromMilestoneMap, maxLevel } from '../constants' import type { MilestoneMap } from '../constants' import React from 'react' type Props = { - milestoneByTrack: MilestoneMap + milestoneByTrack: MilestoneMap, + trackIds: Array } class PointSummaries extends React.Component { render() { - const totalPoints = totalPointsFromMilestoneMap(this.props.milestoneByTrack) + const totalPoints = totalPointsFromMilestoneMap(this.props.milestoneByTrack, this.props.trackIds) let currentLevel, nextLevel diff --git a/components/SnowflakeApp.js b/components/SnowflakeApp.js index 351fbb6b..2b9415f9 100644 --- a/components/SnowflakeApp.js +++ b/components/SnowflakeApp.js @@ -9,6 +9,7 @@ import Wordmark from '../components/Wordmark' import LevelThermometer from '../components/LevelThermometer' import PointSummaries from '../components/PointSummaries' import TitleSelector from '../components/TitleSelector' +import { getTrackIds, eligibleTitles, milestones } from '../constants'; type SnowflakeAppState = { milestoneByTrack: MilestoneMap, @@ -94,8 +95,8 @@ class SnowflakeApp extends React.Component { constructor(props: Props) { super(props) this.state = {...props.constants}; + this.state.trackIds = getTrackIds(this.state.tracks); this.state.user = emptyState(this.state.trackIds); - console.log(this.state); } componentDidUpdate() { @@ -162,21 +163,27 @@ class SnowflakeApp extends React.Component { this.setTitle(title)} /> - - + +
this.handleTrackMilestoneChange(track, milestone)} />
{ decreaseFocusedMilestoneFn={this.shiftFocusedTrackMilestoneByDelta.bind(this, -1)} /> this.handleTrackMilestoneChange(track, milestone)} />
@@ -197,7 +203,7 @@ class SnowflakeApp extends React.Component { 👩‍🔬 Learn about our Soapbox growth framework.
@@ -208,16 +214,18 @@ class SnowflakeApp extends React.Component { const milestoneByTrack = this.state.user.milestoneByTrack milestoneByTrack[trackId] = milestone - const titles = this.state.eligibleTitles(milestoneByTrack) + const titles = eligibleTitles(milestoneByTrack, this.state.titles, this.state.trackIds) const title = titles.indexOf(this.state.title) === -1 ? titles[0] : this.state.title - this.setState({ milestoneByTrack, focusedTrackId: trackId, title }) + this.setState({ user: { milestoneByTrack, focusedTrackId: trackId, title } }) + console.log(this.state); } shiftFocusedTrack(delta: number) { - let index = trackIds.indexOf(this.state.focusedTrackId) + const trackIds = this.state.trackIds + let index = trackIds.indexOf(this.state.user.focusedTrackId) index = (index + delta + trackIds.length) % trackIds.length - const focusedTrackId = trackIds[index] + const focusedTrackId = th[index] this.setState({ focusedTrackId }) } @@ -236,7 +244,7 @@ class SnowflakeApp extends React.Component { } setTitle(title: string) { - let titles = eligibleTitles(this.state.user.milestoneByTrack) + let titles = eligibleTitles(this.state.user.milestoneByTrack, this.state.trackIds) title = titles.indexOf(title) == -1 ? titles[0] : title this.setState({ title }) } diff --git a/components/TitleSelector.js b/components/TitleSelector.js index ec9b1d2e..1ac0fb9c 100644 --- a/components/TitleSelector.js +++ b/components/TitleSelector.js @@ -7,12 +7,13 @@ import type { MilestoneMap } from '../constants' type Props = { milestoneByTrack: MilestoneMap, currentTitle: String, - setTitleFn: (string) => void + setTitleFn: (string) => void, + trackIds: Array } class TitleSelector extends React.Component { render() { - const titles = eligibleTitles(this.props.milestoneByTrack) + const titles = eligibleTitles(this.props.milestoneByTrack, this.props.titles, this.props.trackIds) return