From 03c798e1da6961b9cd65b70d36742e4c724486e0 Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Wed, 25 Oct 2017 16:38:11 +1300 Subject: [PATCH 01/58] Prettier file formatting --- constants.js | 2413 ++++++++++++++++++++++++++------------------------ 1 file changed, 1270 insertions(+), 1143 deletions(-) diff --git a/constants.js b/constants.js index 1195480d..eec14b29 100644 --- a/constants.js +++ b/constants.js @@ -1,63 +1,83 @@ // @flow -import * as d3 from 'd3' +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 TrackId = + | "MOBILE" + | "WEB_CLIENT" + | "FOUNDATIONS (PLATFORM)" + | "SERVERS & API" + | "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] + "MOBILE": Milestone, + "WEB_CLIENT": Milestone, + "FOUNDATIONS (PLATFORM)": Milestone, + "SERVERS & API": 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 + 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', -} + "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 const maxLevel = 135; export type Track = { displayName: string, @@ -68,1145 +88,1252 @@ export type Track = { 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 -|} + "MOBILE": Track, + "WEB_CLIENT": Track, + "FOUNDATIONS (PLATFORM)": Track, + "SERVERS & API": 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 surface", - "Add follow button for publications on Android", - "Fetched and displayed a new stream, using existing stream item styles", - ], - }, { - "summary": "Develops new instances of existing architecture, or minor improvements to existing architecture", - "signals": [ - "Defines new useful and appropriate proto-generated objects", - "Creates simple new activities on Android", - "Migrates code from old patterns to new patterns", - ], - "examples": [ - "Upgraded SDWebImage to a new major version", - "Added support for rendering a new type of stream item", - "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 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", - ], - }], + 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 surface", + "Add follow button for publications on Android", + "Fetched and displayed a new stream, using existing stream item styles" + ] + }, + { + summary: "Develops new instances of existing architecture, or minor improvements to existing architecture", + signals: [ + "Defines new useful and appropriate proto-generated objects", + "Creates simple new activities on Android", + "Migrates code from old patterns to new patterns" + ], + examples: [ + "Upgraded SDWebImage to a new major version", + "Added support for rendering a new type of stream item", + "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 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 footer on the post page", - "Hooked up the action to dismiss a post from a stream", - "Built PaymentHistory screen using ResponseScreen", - ], - }, { - "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 credit card input component", - "Created shared buttons template", - "Built modal system", - ], - }, { - "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 Medium", - "Researched utility of service workers for Medium", - "Designed and implemented ResponseScreen", - ], - }, { - "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 Medium's post morpher and delta system", - "Implemented Medium's scrolling text over image blur", - "Designed and pioneered proto-based model storage", - ], - }, { - "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 Lite", - "Implemented unidirectional data flow to completion", - ], - }], + 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 footer on the post page", + "Hooked up the action to dismiss a post from a stream", + "Built PaymentHistory screen using ResponseScreen" + ] + }, + { + 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 credit card input component", + "Created shared buttons template", + "Built modal system" + ] + }, + { + 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 Medium", + "Researched utility of service workers for Medium", + "Designed and implemented ResponseScreen" + ] + }, + { + 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 Medium's post morpher and delta system", + "Implemented Medium's scrolling text over image blur", + "Designed and pioneered proto-based model storage" + ] + }, + { + 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 Lite", + "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 Ansible 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 Ansible configuration management", - "Built Medium's realtime stats pipeline", - "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 BBFD", - "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 Medium's continuous delivery strategy", - "Developed and implemented HA strategy", - ], - }], + 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 Ansible 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 Ansible configuration management", + "Built Medium's realtime stats pipeline", + "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 BBFD", + "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 Medium's continuous delivery strategy", + "Developed and implemented HA strategy" + ] + } + ] }, - "SERVERS": { - "displayName": "Servers", - "category": "A", - "description": "Develops expertise in server side engineering, using technologies such as Go, NodeJS, or Scala", - "milestones": [{ - "summary": "Works effectively within established server side frameworks, following current best practices", - "signals": [ - "Adds NodeJS endpoints using layers architecture", - "Adds golang endpoints using Gotham architecture", - "Makes minor server changes to support client needs", - ], - "examples": [ - "Added IFTTT trigger for new bookmark to medium2", - "Added delete audio route to Buggle", - "Queried a Dynamo LSI appropriately", - ], - }, { - "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 Dynamo", - "Acted as caretaker for routes protos", - "Updated Facebook API version and codebase dependencies", - ], - }, { - "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 Medium", - "Implemented payments integration with Stripe", - "Built Textshots server", - ], - }, { - "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 Medium's ranked feed architecture", - "Designed custom domains architecture", - "Created Gotham framework for creating Go services", - ], - }, { - "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 Go as Medium's statically typed language", - "Defined microservices architecture and medium2 migration plan", - "Defined and implemented proprietary IP core to the company's success", - ], - }], + SERVERS: { + displayName: "Servers", + category: "A", + description: "Develops expertise in server side engineering, using technologies such as Go, NodeJS, or Scala", + milestones: [ + { + summary: "Works effectively within established server side frameworks, following current best practices", + signals: [ + "Adds NodeJS endpoints using layers architecture", + "Adds golang endpoints using Gotham architecture", + "Makes minor server changes to support client needs" + ], + examples: [ + "Added IFTTT trigger for new bookmark to medium2", + "Added delete audio route to Buggle", + "Queried a Dynamo LSI appropriately" + ] + }, + { + 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 Dynamo", + "Acted as caretaker for routes protos", + "Updated Facebook API version and codebase dependencies" + ] + }, + { + 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 Medium", + "Implemented payments integration with Stripe", + "Built Textshots server" + ] + }, + { + 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 Medium's ranked feed architecture", + "Designed custom domains architecture", + "Created Gotham framework for creating Go services" + ] + }, + { + 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 Go as Medium's statically typed language", + "Defined microservices architecture and medium2 migration plan", + "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 history dashboard", - ], - }, { - "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 promo editor", - "Delivered audio uploading for web client", - "Executed the recommends to claps backfill", - ], - }, { - "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 Hightower", - "Managed infrastructure migration to VPC", - "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 a key company metric", - ], - "examples": [ - "Managed technical migration to SOA", - "Lead technical delivery of 10/7", - "Delivered multi-month engineering project on time", - ], - }], + 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 Quick User Switching", + "Delivered low stock warning for iOS", + "Delivered new User badge" + ] + }, + { + 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 basic promotions API endpoint", + "Delivered new View Customer design", + "Executed the multiple image uploader for products" + ] + }, + { + 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 delivery of Promotions", + "Built the features service", + "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 a key company metric" + ], + examples: [ + "Managed migration to AWS", + "Managed delivery of Christmas 2017 priorities", + "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 The Watch before running a backfill", - "Updated project status changes in Asana 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 payments 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 React", - "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 Medium's growth framework and rationale", - "Aligned the entire organization around claps", - ], - }, { - "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", - ], - }], + 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 The Watch before running a backfill", + "Updated project status changes in Asana 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 payments 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 React", + "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 Medium's growth framework and rationale", + "Aligned the entire organization around claps" + ] + }, + { + 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 on Hatch 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 zelda fitzgerald 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 PRB to run the same volume of tests faster", - "Simplified hermetic test data modification", - "Created fixture system for 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 Medium'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 exec team", - "Instituted and ensured success of a 20% time policy", - "Started The Watch", - ], - }], + 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 on Hatch 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 zelda fitzgerald 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 PRB to run the same volume of tests faster", + "Simplified hermetic test data modification", + "Created fixture system for 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 Medium'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 exec team", + "Instituted and ensured success of a 20% time policy", + "Started The Watch" + ] + } + ] }, - "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 Hatch posts about improvement opportunities", - "Raises meaningful tensions in tactical meetings", - "Asks leadership team probing questions at FAM", - ], - "examples": [ - "Wrote about problems with TTR on Hatch", - "Wrote about content policy problems on Hatch", - "Reported a site issue in Github", - ], - }, { - "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 video 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 medium2 to mono repo and bazel", - ], - }, { - "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 from Holacracy", - "Built Medium Android prototype and convinced execs to fund it", - "Convinced leadership and engineering org to move to Medium Lite architecture", - ], - }], + 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 Hatch posts about improvement opportunities", + "Raises meaningful tensions in tactical meetings", + "Asks leadership team probing questions at FAM" + ], + examples: [ + "Wrote about problems with TTR on Hatch", + "Wrote about content policy problems on Hatch", + "Reported a site issue in Github" + ] + }, + { + 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 video 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 medium2 to mono repo and bazel" + ] + }, + { + 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 from Holacracy", + "Built Medium Android prototype and convinced execs to fund it", + "Convinced leadership and engineering org to move to Medium Lite 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 a Floodgate Academy intern", - ], - }, { - "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 Pathwise curriculum for group leads", - "Advocated to execs for engineer development resources and programs", - ], - }], + 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 a Floodgate Academy intern" + ] + }, + { + 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 Pathwise 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 Frankenmeeting structure for small team", - "Improved Watch 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", - ], - }], + 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 Frankenmeeting structure for small team", + "Improved Watch 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", - ], - }], + 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", - ], - }], + 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 Medium'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 Hatch post on avoiding RDS backfill issues", - "Wrote Medium-U content module", - ], - }, { - "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 Medium's 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", - ], - }], + 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 Medium'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 Hatch post on avoiding RDS backfill issues", + "Wrote Medium-U content module" + ] + }, + { + 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 Medium's 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 Medium to the outside world and establishes it as an attractive and thoughtful place to work", - "milestones": [{ - "summary": "Represents Medium well externally, and influences individuals positively", - "signals": [ - "Shares personal and organizational successes with their network", - "Attends Medium-hosted events and talks with guests", - "Communicates genuine and honest excitement about their work externally", - ], - "examples": [ - "Shared a Medium 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 Medium", - "Joined public Slack group and represented Medium appropriately, and well", - "Organizes positive small- or medium-sized events that bring people to Medium", - ], - "examples": [ - "Volunteered as a helper for CODE2040 writing workshop", - "Organized a short tour of the office by college students", - "Talked at a Women Who Code event hosted at Medium", - ], - }, { - "summary": "Works hard to positively influence large groups of people on their views of Medium", - "signals": [ - "Mentors or participates in a high visibility way in an external organization", - "Builds fruitful partnerships with external organizations", - "Writes blog posts about Medium that receive moderate traffic", - ], - "examples": [ - "Represented Medium on a panel at a conference of industry experts", - "Established close ties with Creative Commons", - "Built a durable, long-standing relationship with Code2040", - ], - }, { - "summary": "Establishes Medium 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 Medium's organizational or technical innovations", - "Leverages significant following to evangelise Medium", - ], - "examples": [ - "Published a paper on Medium technology in a peer-reviewed journal", - "Authored joint-press release with EFF on DNT", - "Published “Why Content Editable Is Terrible” on the Medium engineering blog", - ], - }, { - "summary": "Introduces Medium 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 Medium positively", - "Drives recognition and adoption of Medium in significant numbers", - ], - "examples": [ - "Published or interviewed in a mainstream newspaper or website outside tech", - "Keynoted a conference with international attention", - "Represented Medium in national televised media", - ], - }], + EVANGELISM: { + displayName: "Evangelism", + category: "D", + description: "Promotes Medium to the outside world and establishes it as an attractive and thoughtful place to work", + milestones: [ + { + summary: "Represents Medium well externally, and influences individuals positively", + signals: [ + "Shares personal and organizational successes with their network", + "Attends Medium-hosted events and talks with guests", + "Communicates genuine and honest excitement about their work externally" + ], + examples: [ + "Shared a Medium 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 Medium", + "Joined public Slack group and represented Medium appropriately, and well", + "Organizes positive small- or medium-sized events that bring people to Medium" + ], + examples: [ + "Volunteered as a helper for CODE2040 writing workshop", + "Organized a short tour of the office by college students", + "Talked at a Women Who Code event hosted at Medium" + ] + }, + { + summary: "Works hard to positively influence large groups of people on their views of Medium", + signals: [ + "Mentors or participates in a high visibility way in an external organization", + "Builds fruitful partnerships with external organizations", + "Writes blog posts about Medium that receive moderate traffic" + ], + examples: [ + "Represented Medium on a panel at a conference of industry experts", + "Established close ties with Creative Commons", + "Built a durable, long-standing relationship with Code2040" + ] + }, + { + summary: "Establishes Medium 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 Medium's organizational or technical innovations", + "Leverages significant following to evangelise Medium" + ], + examples: [ + "Published a paper on Medium technology in a peer-reviewed journal", + "Authored joint-press release with EFF on DNT", + "Published “Why Content Editable Is Terrible” on the Medium engineering blog" + ] + }, + { + summary: "Introduces Medium 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 Medium positively", + "Drives recognition and adoption of Medium in significant numbers" + ], + examples: [ + "Published or interviewed in a mainstream newspaper or website outside tech", + "Keynoted a conference with international attention", + "Represented Medium in national televised media" + ] + } + ] }, - "RECRUITING": { - "displayName": "Recruiting", - "category": "D", - "description": "Strengthens Medium's team by bringing in excellent staff members", - "milestones": [{ - "summary": "Brings new candidates into the pipeline and understands how to evaluate candidates at Medium", - "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 monthly brunch for candidates to meet Medium 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 Medium's presence at a recruitment fair", - "Started CODE2040 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", - ], - }], + RECRUITING: { + displayName: "Recruiting", + category: "D", + description: "Strengthens Medium's team by bringing in excellent staff members", + milestones: [ + { + summary: "Brings new candidates into the pipeline and understands how to evaluate candidates at Medium", + 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 monthly brunch for candidates to meet Medium 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 Medium's presence at a recruitment fair", + "Started CODE2040 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 on Hatch", - ], - }, { - "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 Watch 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": [ - "Lead Watch cycles with little support while still contributing to projects", - "Started and drove the LGBTQIA ERG", - "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 Shepherd nodes", - "Acted as sole maintainer of Boxen 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 Medium's values", - "Sets the tone, policy, and goals around maintaining an inclusive company", - ], - "examples": [ - "Organized wine and olive tasting offsite to Napa for the whole engineering org", - "Devised, delivered and acted on findings from an engineer happiness survey", - "Challenged and corrected exclusionary behaviour or policies", - ], - }], - }, -} + 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 on Hatch" + ] + }, + { + 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 Watch 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: [ + "Lead Watch cycles with little support while still contributing to projects", + "Started and drove the LGBTQIA ERG", + "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 Shepherd nodes", + "Acted as sole maintainer of Boxen 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 Medium's values", + "Sets the tone, policy, and goals around maintaining an inclusive company" + ], + examples: [ + "Organized wine and olive tasting offsite to Napa for the whole engineering 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 trackIds: TrackId[] = Object.keys(tracks); export const categoryIds: Set = trackIds.reduce((set, trackId) => { - set.add(tracks[trackId].category) - return set -}, new Set()) + 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)) - }) + 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 } - }) -} + 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 totalPointsFromMilestoneMap = ( + milestoneMap: MilestoneMap +): number => + trackIds + .map(trackId => milestoneToPoints(milestoneMap[trackId])) + .reduce((sum, addend) => sum + addend, 0); -export const categoryColorScale = d3.scaleOrdinal() +export const categoryColorScale = d3 + .scaleOrdinal() .domain(categoryIds) - .range(['#00abc2', '#428af6', '#e1439f', '#e54552']) + .range(["#00abc2", "#428af6", "#e1439f", "#e54552"]); export const titles = [ - {label: 'Engineer I', minPoints: 0, maxPoints: 16}, - {label: 'Engineer II', minPoints: 17, maxPoints: 35}, - {label: 'Senior Engineer', minPoints: 36, maxPoints: 57}, - {label: 'Group Lead', minPoints: 36, maxPoints: 57}, - {label: 'Staff Engineer', minPoints: 58, maxPoints: 89}, - {label: 'Senior Group Lead', minPoints: 58, maxPoints: 89}, - {label: 'Principal Engineer', minPoints: 90}, - {label: 'Director of Engineering', minPoints: 90} -] + { label: "Engineer I", minPoints: 0, maxPoints: 16 }, + { label: "Engineer II", minPoints: 17, maxPoints: 35 }, + { label: "Senior Engineer", minPoints: 36, maxPoints: 57 }, + { label: "Group Lead", minPoints: 36, maxPoints: 57 }, + { label: "Staff Engineer", minPoints: 58, maxPoints: 89 }, + { label: "Senior Group Lead", minPoints: 58, maxPoints: 89 }, + { label: "Principal Engineer", minPoints: 90 }, + { label: "Director of Engineering", minPoints: 90 } +]; export const eligibleTitles = (milestoneMap: MilestoneMap): string[] => { - const totalPoints = totalPointsFromMilestoneMap(milestoneMap) + const totalPoints = totalPointsFromMilestoneMap(milestoneMap); - return titles.filter(title => (title.minPoints === undefined || totalPoints >= title.minPoints) - && (title.maxPoints === undefined || totalPoints <= title.maxPoints)) - .map(title => title.label) -} + return titles + .filter( + title => + (title.minPoints === undefined || totalPoints >= title.minPoints) && + (title.maxPoints === undefined || totalPoints <= title.maxPoints) + ) + .map(title => title.label); +}; From 1cdb921ffbd5f1ff56bc879953eb7e9042fcadc9 Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Thu, 26 Oct 2017 09:14:23 +1300 Subject: [PATCH 02/58] Updated Communication examples --- constants.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/constants.js b/constants.js index eec14b29..6513e308 100644 --- a/constants.js +++ b/constants.js @@ -488,9 +488,9 @@ export const tracks: Tracks = { "Asks for help at the appropriate juncture" ], examples: [ - "Updated The Watch before running a backfill", - "Updated project status changes in Asana promptly", - "Gave thoughtful check-in and check-out comments" + "Updated oncall-engineers before running a resource-intensive task.", + "Updated issue status changes in Jira promptly", + "Gave thoughtful meeting check-in and check-out comments" ] }, { @@ -515,8 +515,8 @@ export const tracks: Tracks = { ], examples: [ "Directed team response effectively during outages", - "Gave a substantial Eng All Hands presentation on React", - "Gave notice of upcoming related work in Eng Briefing" + "Gave a substantial Eng All Hands presentation on Redux", + "Gave notice of upcoming related work in Band Practise" ] }, { @@ -528,8 +528,8 @@ export const tracks: Tracks = { ], examples: [ "Lead off-site workshop on interviewing", - "Wrote Medium's growth framework and rationale", - "Aligned the entire organization around claps" + "Implemented Vend's engineering growth framework", + "Aligned the entire organization around the release of Promotions" ] }, { From 3732cc98544d21c43308b8444a9dc0a04be97d96 Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Thu, 26 Oct 2017 09:16:00 +1300 Subject: [PATCH 03/58] Updated Craft examples --- constants.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/constants.js b/constants.js index 6513e308..ab174f90 100644 --- a/constants.js +++ b/constants.js @@ -561,9 +561,9 @@ export const tracks: Tracks = { "Writes clear comments and documentation" ], examples: [ - "Caught a bug on Hatch before it went live", + "Caught a bug while playing with a feature before it went live", "Landed non-trivial PR with no caretaker comments", - "Wrote hermetic tests for the happy and sad cases" + "Wrote good hermetic tests for a microservice" ] }, { @@ -575,7 +575,7 @@ export const tracks: Tracks = { ], examples: [ "Requested tests for a PR when acting as reviewer", - "Reduced the number of zelda fitzgerald exceptions", + "Removed unused feature flags in the monoliph", "Fixed a TODO for someone else in the codebase" ] }, @@ -587,9 +587,9 @@ export const tracks: Tracks = { "Adds tooling to improve code quality" ], examples: [ - "Improved PRB to run the same volume of tests faster", - "Simplified hermetic test data modification", - "Created fixture system for visual quality" + "Improved build pipeline to run the same volume of tests faster", + "Improved dev container build speed and moved all containers from Quay to ECR", + "Created a shared library after seeing multiple projects doing the same thing " ] }, { @@ -597,10 +597,10 @@ export const tracks: Tracks = { 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" + "Coordinates support team ticket volume meetings and prioritises findings" ], examples: [ - "Added code coverage reporting to iOS CI pipeline", + "Implemented a strategy to attack flakey build pipelines", "Iterated repeatedly to develop Medium's underlines solution", "Defined and oversaw plan for closing Heartbleed vulnerability" ] @@ -613,9 +613,9 @@ export const tracks: Tracks = { "Secures time and resources from execs to support great quality" ], examples: [ - "Negotiated resources for Fix-It week with exec team", - "Instituted and ensured success of a 20% time policy", - "Started The Watch" + "Negotiated resources for Standardisation Sprints", + "", + "Implemented compensation for on-call rotation" ] } ] From bfba173f7884266d6900a7c9b7052f7232c80db1 Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Thu, 26 Oct 2017 09:17:08 +1300 Subject: [PATCH 04/58] Updated initiative examples --- constants.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/constants.js b/constants.js index ab174f90..dd0479c1 100644 --- a/constants.js +++ b/constants.js @@ -629,13 +629,13 @@ export const tracks: Tracks = { { summary: "Identifies opportunities for organizational change or product improvements", signals: [ - "Writes Hatch posts about improvement opportunities", + "Writes Confluence page about improvement opportunities", "Raises meaningful tensions in tactical meetings", - "Asks leadership team probing questions at FAM" + "Asks leadership team insightful questions at AMA " ], examples: [ - "Wrote about problems with TTR on Hatch", - "Wrote about content policy problems on Hatch", + "Wrote about problems with ECS on Confluence", + "", "Reported a site issue in Github" ] }, @@ -648,7 +648,7 @@ export const tracks: Tracks = { ], examples: [ "Advocated on own behalf for a change in role", - "Implemented flow typing for promises", + "Implemented feature service API in Go Common", "Audited web client performance in Chrome and proposed fixes" ] }, @@ -662,7 +662,7 @@ export const tracks: Tracks = { examples: [ "Defined style guide to resolve style arguments", "Proposed and implemented at-mentions prototype", - "Implemented video for Android independently, unprompted" + "Made significant improvments to Monoliph Jenkins pipeline, unprompted" ] }, { @@ -674,8 +674,8 @@ export const tracks: Tracks = { ], examples: [ "Created the interviewing rubric and booklet", - "Implemented and secured support for native login", - "Migrated medium2 to mono repo and bazel" + "Implemented and secured support for 2FA login", + "Migrated go-common to individual repos for maintainability" ] }, { @@ -686,9 +686,9 @@ export const tracks: Tracks = { "Changes complex organizational processes" ], examples: [ - "Migrated the organization from Holacracy", - "Built Medium Android prototype and convinced execs to fund it", - "Convinced leadership and engineering org to move to Medium Lite architecture" + "Migrated team structure from Solutions to Product+Engineering", + "Built Scanner prototype and convinced company to launch it", + "Convinced leadership and engineering org to move from Rackspace to AWS" ] } ] From 57ce22c16ec3b41f2939c52e693c3d425e783bf1 Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Thu, 26 Oct 2017 09:22:38 +1300 Subject: [PATCH 05/58] Updated all Supporting area examples --- constants.js | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/constants.js b/constants.js index dd0479c1..eb81f1b6 100644 --- a/constants.js +++ b/constants.js @@ -709,20 +709,20 @@ export const tracks: Tracks = { examples: [ "Collected and delivered feedback", "Discussed career options and areas of interest informally", - "Hosted a Floodgate Academy intern" + "Mentored an Intern" ] }, { 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", + "Ensure a team member has an appropriate role on their team", + "Offers effective career advice to team members, without being prescriptive", "Creates space for people to talk through challenges" ], examples: [ - "Set up and attended regular, constructive 1:1s", + "Set up and attended regular, constructive 1:1s ", "Provided coaching on how to have difficult conversations", - "Taught group members the GROW model" + "Taught team members the GROW model" ] }, { @@ -733,8 +733,8 @@ export const tracks: Tracks = { "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", + "Reviewed individual team progression regularly", + "Suggested appropriate team member for a new position", "Arranged a requested switch of discipline for a group member" ] }, @@ -746,7 +746,7 @@ export const tracks: Tracks = { "Ensures all group members' roles are meeting their career needs" ], examples: [ - "Completed training on situational leadership", + "Completed leadership training", "Built a resourcing plan based on company, team, and individual goals", "Prevented regretted attrition with intentional, targeted intervention" ] @@ -759,8 +759,8 @@ export const tracks: Tracks = { "Pushes everyone to be as good as they can be, with empathy" ], examples: [ - "Provided coaching to group leads", - "Devised Pathwise curriculum for group leads", + "Provided coaching to team leads", + "Devised growth plan for team leads", "Advocated to execs for engineer development resources and programs" ] } @@ -780,8 +780,8 @@ export const tracks: Tracks = { "Actively participates and makes contributions within organizational processes" ], examples: [ - "Facilitated effective tactical meeting with empathy", - "Explained tactical meeting format to a new hire", + "Facilitated effective meetings with empathy", + "Explained sprint planning format to a new hire", "Provided feedback on sprint planning meeting" ] }, @@ -793,22 +793,22 @@ export const tracks: Tracks = { "Advocates for improved diversity and inclusion, and proposes ideas to help" ], examples: [ - "Defined Frankenmeeting structure for small team", - "Improved Watch on-call rotation scheduling", + "Defined sprint planning structure for small team", + "Improved on-call rotation scheduling", "Defined standard channels for inter-team communication" ] }, { - summary: "Develops processes to solve ongoing organizational problems", + summary: "Develops processes and programs 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", + "Developed 90-day plan template", "Created bug-rotation program to address ongoing quality issues", - "Defined Guilds manifesto and charter" + "Defined Frontend Guild manifesto" ] }, { @@ -820,8 +820,8 @@ export const tracks: Tracks = { ], examples: [ "Connected mobile recruiting difficulties to focus on excellence", - "Raised leadership level change discrepancies", - "Analyzed the hiring rubric for false negative potential" + "Raised leadership level discrepancies", + "Analyzed the hiring process for false negative potential" ] }, { @@ -832,9 +832,9 @@ export const tracks: Tracks = { "Leads planning and communication for reorgs" ], examples: [ - "Lead efforts to increase number of mobile engineers", + "Lead efforts to increase investment in Engineering", "Directed resources to meaningfully improve diversity at all levels", - "Built the growth framework rubric" + "Reviewed and aligned salaries across similar levels." ] } ] @@ -940,7 +940,7 @@ export const tracks: Tracks = { ], examples: [ "Completed training on decision making", - "Convinced a group member to solve a problem directly, rather than doing it for them", + "Convinced a team member to solve a problem directly, rather than doing it for them", "Gave honest feedback about poor performance, with compassion" ] }, From e3869b0d4acdb48bc192d0bb189d6ae649a48edd Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Thu, 26 Oct 2017 09:49:06 +1300 Subject: [PATCH 06/58] Change logo and add Heroku scripts --- components/SnowflakeApp.js | 4 +- components/Wordmark.js | 5 +- constants.js | 108 ++++++++++++++++++------------------- package.json | 3 +- static.json | 3 ++ 5 files changed, 62 insertions(+), 61 deletions(-) create mode 100644 static.json diff --git a/components/SnowflakeApp.js b/components/SnowflakeApp.js index db61502f..565900d4 100644 --- a/components/SnowflakeApp.js +++ b/components/SnowflakeApp.js @@ -156,7 +156,7 @@ class SnowflakeApp extends React.Component { } `} @@ -200,7 +200,7 @@ class SnowflakeApp extends React.Component { handleTrackMilestoneChangeFn={(track, milestone) => this.handleTrackMilestoneChange(track, milestone)} />
- Made with ❤️ by Medium Eng. + Forked with ❤️ from Medium Eng. Learn about the growth framework. Get the source code. Read the terms of service. diff --git a/components/Wordmark.js b/components/Wordmark.js index e6cef3b4..998ad847 100644 --- a/components/Wordmark.js +++ b/components/Wordmark.js @@ -1,5 +1,2 @@ // @flow -export default () => - - - +export default () => diff --git a/constants.js b/constants.js index eb81f1b6..a22bfaab 100644 --- a/constants.js +++ b/constants.js @@ -1018,16 +1018,16 @@ export const tracks: Tracks = { ] }, { - summary: "Teaches small groups of engineers and contributes to Medium's shared knowledge base", + summary: "Teaches small groups of engineers and contributes to Vend'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 Hatch post on avoiding RDS backfill issues", - "Wrote Medium-U content module" + "Gave a lunch'n'learn presentation on Go", + "Wrote Wiki page on how to run a complex db migration", + "Answered multiple Confluence Questions with clarity" ] }, { @@ -1035,16 +1035,16 @@ export const tracks: Tracks = { 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" + "Creates lunch-n-learn series and lines up speakers" ], examples: [ - "Created and lead Medium's Women in Eng group", + "Created and lead Vend's Frontend platform group", "Organized an Eng All Hands with an outside speaker", - "Designed and taught web client guild curriculum" + "Designed and taught Go microservices curriculum" ] }, { - summary: "Instills and promotes a culture of learning and development within the team", + summary: "Instills and promotes a culture of learning and development within the entire engineering team", signals: [ "Sets incentive structures to recognise and reward mentorship", "Empowers team members to develop themselves", @@ -1053,7 +1053,7 @@ export const tracks: Tracks = { examples: [ "Instituted the professional education budget for engineers", "Mentored mentors", - "Started the eng advisor program and lined up external mentors" + "Took team members on visits to SF tech leaders" ] } ] @@ -1062,17 +1062,17 @@ export const tracks: Tracks = { EVANGELISM: { displayName: "Evangelism", category: "D", - description: "Promotes Medium to the outside world and establishes it as an attractive and thoughtful place to work", + description: "Promotes Vend to the outside world and establishes it as an attractive and thoughtful place to work", milestones: [ { - summary: "Represents Medium well externally, and influences individuals positively", + summary: "Represents Vend well externally, and influences individuals positively", signals: [ "Shares personal and organizational successes with their network", - "Attends Medium-hosted events and talks with guests", + "Attends Vend-hosted events and talks with guests", "Communicates genuine and honest excitement about their work externally" ], examples: [ - "Shared a Medium product launch post on Facebook", + "Shared a Vend 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" ] @@ -1080,53 +1080,53 @@ export const tracks: Tracks = { { 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 Medium", - "Joined public Slack group and represented Medium appropriately, and well", - "Organizes positive small- or medium-sized events that bring people to Medium" + "Takes meaningful action to introduce people to Vend", + "Joined public Slack group and represented Vend appropriately, and well", + "Organizes positive small- or medium-sized events that bring people to Vend" ], examples: [ - "Volunteered as a helper for CODE2040 writing workshop", + "Volunteered as a helper for Summer of Tech workshops", "Organized a short tour of the office by college students", - "Talked at a Women Who Code event hosted at Medium" + "Talked at a Women Who Code event hosted at Vend" ] }, { - summary: "Works hard to positively influence large groups of people on their views of Medium", + summary: "Works hard to positively influence large groups of people on their views of Vend", signals: [ "Mentors or participates in a high visibility way in an external organization", "Builds fruitful partnerships with external organizations", - "Writes blog posts about Medium that receive moderate traffic" + "Writes blog posts about Vend that receive moderate traffic" ], examples: [ - "Represented Medium on a panel at a conference of industry experts", - "Established close ties with Creative Commons", - "Built a durable, long-standing relationship with Code2040" + "Represented Vend on a panel at a conference of industry experts", + "Established close ties with Callaghan", + "Built a durable, long-standing org relationship with industry bodies" ] }, { - summary: "Establishes Medium as an great, innovative company and workplace to the whole industry", + summary: "Establishes Vend 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 Medium's organizational or technical innovations", - "Leverages significant following to evangelise Medium" + "Publishes material about Vend's organizational or technical innovations", + "Leverages significant following to evangelise Vend" ], examples: [ - "Published a paper on Medium technology in a peer-reviewed journal", - "Authored joint-press release with EFF on DNT", - "Published “Why Content Editable Is Terrible” on the Medium engineering blog" + "Published a paper on Vend technology in a peer-reviewed journal", + "Authored press release on HTTPoxy", + "Published a great technical post on the Vend engineering blog" ] }, { - summary: "Introduces Medium in a positive light to a wider audience outside the industry", + summary: "Introduces Vend 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 Medium positively", - "Drives recognition and adoption of Medium in significant numbers" + "Influences people with large audiences to talk about Vend positively", + "Drives recognition and adoption of Vend in significant numbers" ], examples: [ "Published or interviewed in a mainstream newspaper or website outside tech", "Keynoted a conference with international attention", - "Represented Medium in national televised media" + "Represented Vend in national televised media" ] } ] @@ -1135,10 +1135,10 @@ export const tracks: Tracks = { RECRUITING: { displayName: "Recruiting", category: "D", - description: "Strengthens Medium's team by bringing in excellent staff members", + description: "Strengthens Vend's team by bringing in excellent staff members", milestones: [ { - summary: "Brings new candidates into the pipeline and understands how to evaluate candidates at Medium", + summary: "Brings new candidates into the pipeline and understands how to evaluate candidates at Vend", signals: [ "Reviews existing network for hiring leads regularly", "Shadows interviews to gain familiarity with process", @@ -1153,14 +1153,14 @@ export const tracks: Tracks = { { 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", + "Provides clear, objective feedback on candidates (we should have an interview rubric)", "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 monthly brunch for candidates to meet Medium employees", - "Tested a new service for quality and diversity of candidates" + "Added observable evidence for interview feedback", + "Started a monthly brunch for candidates to meet Vend employees", + "" ] }, { @@ -1171,7 +1171,7 @@ export const tracks: Tracks = { "Reverse shadows trainees and helps calibrate their feedback" ], examples: [ - "Wrote new interview question which meets our question quality criteria", + "Wrote fantastic new interview questions that are measurable and insightful", "Brought candidates into our pipeline proactively, with a high conversion rate", "Proposed useful, tangible improvements to the interview process" ] @@ -1185,8 +1185,8 @@ export const tracks: Tracks = { ], examples: [ "Planned engineering summit on interview process and training", - "Organized and lead Medium's presence at a recruitment fair", - "Started CODE2040 internship program" + "Organized and lead Vend's presence at a recruitment fair", + "Started internship program" ] }, { @@ -1218,9 +1218,9 @@ export const tracks: Tracks = { "Joins groups or committees outside regular duties" ], examples: [ - "Joined and actively participated in the web client guild", + "Joined and actively participated in the Frontend platform group", "Brought a small gift back from vacation for the team", - "Wrote entertaining and informative Prod Ops writeups on Hatch" + "Wrote entertaining and informative incident review updates on Confluence" ] }, { @@ -1231,21 +1231,21 @@ export const tracks: Tracks = { "Finds ways to ramp up and engage new hires quickly" ], examples: [ - "Created onboarding bingo", + "Created Fuck Yeah Fridays", "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 Watch shifts at short notice", + "Takes on additional on-call 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: [ - "Lead Watch cycles with little support while still contributing to projects", - "Started and drove the LGBTQIA ERG", + "Handles on-call with little support while still contributing to projects", + "Started and drove the diversity and ally skills training", "Stayed positive and improved team morale during period after layoffs" ] }, @@ -1258,20 +1258,20 @@ export const tracks: Tracks = { ], examples: [ "Devoted large amount of time to helping outside direct responsibilities", - "Refactored hundreds of legacy Shepherd nodes", - "Acted as sole maintainer of Boxen for years" + "Refactored a multitude of legacy PHP issues", + "Acted as sole maintainer of Jenkins 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 Medium's values", + "Holds individuals, teams, and leadership accountable to Vend's values", "Sets the tone, policy, and goals around maintaining an inclusive company" ], examples: [ - "Organized wine and olive tasting offsite to Napa for the whole engineering org", - "Devised, delivered and acted on findings from an engineer happiness survey", + "Organized summer BBQ for the whole engineering org", + "Devised, delivered and acted on findings from a CultureAmp survey", "Challenged and corrected exclusionary behaviour or policies" ] } diff --git a/package.json b/package.json index d060d04e..561c811a 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,8 @@ "scripts": { "dev": "next", "export": "next build && next export", - "flow": "flow" + "flow": "flow", + "postinstall": "export" }, "devDependencies": { "flow-bin": "^0.57.2" diff --git a/static.json b/static.json new file mode 100644 index 00000000..486cc263 --- /dev/null +++ b/static.json @@ -0,0 +1,3 @@ +{ + "root": "out/" +} \ No newline at end of file From 4549bdf3238826cfdfbb5d4167d82719c0d82b57 Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Thu, 26 Oct 2017 09:53:52 +1300 Subject: [PATCH 07/58] Try to fix heroku deploy --- components/SnowflakeApp.js | 13 +++++++------ package.json | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/components/SnowflakeApp.js b/components/SnowflakeApp.js index 565900d4..cadc2edf 100644 --- a/components/SnowflakeApp.js +++ b/components/SnowflakeApp.js @@ -1,16 +1,17 @@ // @flow -import TrackSelector from '../components/TrackSelector' -import NightingaleChart from '../components/NightingaleChart' +import type { Milestone, MilestoneMap, TrackId } from '../constants' +import { eligibleTitles, milestoneToPoints, milestones, trackIds } from '../constants' + 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 NightingaleChart from '../components/NightingaleChart' import PointSummaries from '../components/PointSummaries' -import type { Milestone, MilestoneMap, TrackId } from '../constants' import React from 'react' import TitleSelector from '../components/TitleSelector' +import Track from '../components/Track' +import TrackSelector from '../components/TrackSelector' +import Wordmark from '../components/Wordmark' type SnowflakeAppState = { milestoneByTrack: MilestoneMap, diff --git a/package.json b/package.json index 561c811a..c27584de 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "dev": "next", "export": "next build && next export", "flow": "flow", - "postinstall": "export" + "postinstall": "next build && next export" }, "devDependencies": { "flow-bin": "^0.57.2" From 3673bf7f9760383030d628ccde87981ae5987b00 Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Thu, 26 Oct 2017 10:10:10 +1300 Subject: [PATCH 08/58] Adds reset button --- components/SnowflakeApp.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/components/SnowflakeApp.js b/components/SnowflakeApp.js index cadc2edf..46ef823d 100644 --- a/components/SnowflakeApp.js +++ b/components/SnowflakeApp.js @@ -48,7 +48,7 @@ const coerceMilestone = (value: number): Milestone => { const emptyState = (): SnowflakeAppState => { return { - name: '', + name: 'Enter Your Name Here', title: '', milestoneByTrack: { 'MOBILE': 0, @@ -201,7 +201,10 @@ class SnowflakeApp extends React.Component { handleTrackMilestoneChangeFn={(track, milestone) => this.handleTrackMilestoneChange(track, milestone)} />
- Forked with ❤️ from Medium Eng. + this.setState(emptyState())}>Reset +
+
+ Forked from Medium Eng. Learn about the growth framework. Get the source code. Read the terms of service. From e4e24675bba28a32680bc691c2be53ab6f093563 Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Mon, 30 Oct 2017 13:32:51 +1300 Subject: [PATCH 09/58] Hide title selector until we've baselined everyone --- components/SnowflakeApp.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/SnowflakeApp.js b/components/SnowflakeApp.js index 46ef823d..b799e159 100644 --- a/components/SnowflakeApp.js +++ b/components/SnowflakeApp.js @@ -171,10 +171,10 @@ class SnowflakeApp extends React.Component { onChange={e => this.setState({name: e.target.value})} placeholder="Name" /> - this.setTitle(title)} /> + setTitleFn={(title) => this.setTitle(title)} /> */} From de39c4a642858f3284f10050c48de2fce8e14aa8 Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Thu, 2 Nov 2017 07:43:28 +1300 Subject: [PATCH 10/58] New examples for Building category --- constants.js | 80 ++++++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/constants.js b/constants.js index a22bfaab..edc7981a 100644 --- a/constants.js +++ b/constants.js @@ -137,7 +137,7 @@ export const tracks: Tracks = { ], examples: [ "Upgraded SDWebImage to a new major version", - "Added support for rendering a new type of stream item", + "Added support for a new type of promotion", "Prototyped a simple new feature quickly" ] }, @@ -149,7 +149,7 @@ export const tracks: Tracks = { "Adds support for new iOS features after a major iOS version upgrade" ], examples: [ - "Designed iOS caching strategy for offline reading", + "Designed iOS caching strategy for product search", "Built series reader on Android", "Informed the team about recent best practice changes and deprecations" ] @@ -163,8 +163,8 @@ export const tracks: Tracks = { ], examples: [ "Upgraded CocoaPods to a new major version", - "Designed architecture for fetching and rendering stream items", - "Migrated Android persistance layer to reactive programming" + "Designed architecture for storing and synchronising sales", + "Removed all Singletons in iOS app" ] }, { @@ -175,7 +175,7 @@ export const tracks: Tracks = { "Invents new techniques to responsibly stretch limits of the Android platform" ], examples: [ - "Defined and drove complete migration plan to Swift or Kotlin", + "Defined and drove complete migration plan to Swift", "Implemented Android recycler views before platform support existed", "Pioneered application-level abstractions for multi-app environment" ] @@ -196,9 +196,9 @@ export const tracks: Tracks = { "Uses CSS appropriately, following style guide" ], examples: [ - "Implemented sticky footer on the post page", - "Hooked up the action to dismiss a post from a stream", - "Built PaymentHistory screen using ResponseScreen" + "Implemented new Houston confirmation banner in the Monoliph", + "Hooked up the action to dismiss a card from the dashboard", + "Reskinned customer list using existing customer badge" ] }, { @@ -210,7 +210,7 @@ export const tracks: Tracks = { ], examples: [ "Built credit card input component", - "Created shared buttons template", + "Created shared datepicker template in Houston", "Built modal system" ] }, @@ -223,8 +223,8 @@ export const tracks: Tracks = { ], examples: [ "Designed font loading strategy for Medium", - "Researched utility of service workers for Medium", - "Designed and implemented ResponseScreen" + "Researched utility of HTTP/2 for Vend", + "Designed and implemented Add/Edit Product screen" ] }, { @@ -235,9 +235,9 @@ export const tracks: Tracks = { "Makes architectural decisions that eliminate entire classes of bugs" ], examples: [ - "Designed Medium's post morpher and delta system", + "Designed Vend's frontend entity storage and syncronisation system", "Implemented Medium's scrolling text over image blur", - "Designed and pioneered proto-based model storage" + "Defined and drove migration strategy from Angular 1.6 to 2" ] }, { @@ -266,11 +266,11 @@ export const tracks: Tracks = { signals: [ "Writes thorough postmortems for service outages", "Makes simple configuration changes to services", - "Performs backfills safely and effectively, without causing pages" + "Sits in on-call rotation at level 1" ], examples: [ - "Made safe and effective Ansible changes", - "Implemented new ETL pipelines based on existing ones", + "Made safe and effective changes to app-gulp", + "Added a new server role using Puppet and Terraform", "Resolved out of disk errors independently" ] }, @@ -278,13 +278,13 @@ export const tracks: Tracks = { 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", + "Creates re-usable components for developers", "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" + "Upgraded a project from NPM to Yarn", + "Created Go consumer package (river)", + "Identified source of slow requests in a single service from the edge in" ] }, { @@ -295,8 +295,8 @@ export const tracks: Tracks = { "Makes major version upgrades to libraries" ], examples: [ - "Designed Ansible configuration management", - "Built Medium's realtime stats pipeline", + "Designed ENVS3 configuration management", + "Built Vend log processing and storage pipeline", "Designed flexible framework for writing machine learning jobs" ] }, @@ -308,9 +308,9 @@ export const tracks: Tracks = { "Introduces new databases and technologies to meet underserved needs" ], examples: [ - "Designed and built BBFD", + "Designed and built Duke", "Designed AWS configuration management", - "Introduced Kinesis and pioneered streaming events pipeline" + "Introduced stream processing with Maxwell and Hydrant" ] }, { @@ -323,7 +323,7 @@ export const tracks: Tracks = { examples: [ "Invented a novel ML technique that advanced the state of the art", "Defined and developed Medium's continuous delivery strategy", - "Developed and implemented HA strategy" + "Developed and implemented DR strategy" ] } ] @@ -332,19 +332,19 @@ export const tracks: Tracks = { SERVERS: { displayName: "Servers", category: "A", - description: "Develops expertise in server side engineering, using technologies such as Go, NodeJS, or Scala", + description: "Develops expertise in server side engineering, using technologies such as Go, Java, or PHP", milestones: [ { summary: "Works effectively within established server side frameworks, following current best practices", signals: [ - "Adds NodeJS endpoints using layers architecture", - "Adds golang endpoints using Gotham architecture", + "Adds PHP endpoints using Symfony", + "Adds Go endpoints to a service", "Makes minor server changes to support client needs" ], examples: [ - "Added IFTTT trigger for new bookmark to medium2", - "Added delete audio route to Buggle", - "Queried a Dynamo LSI appropriately" + "Fixed a small bug in the monoliph Shopify API client", + "Created a backend tool to version entities", + "Wrote a MySQL query that made good use of indexes" ] }, { @@ -356,8 +356,8 @@ export const tracks: Tracks = { ], examples: [ "Identified need for new index on Dynamo", - "Acted as caretaker for routes protos", - "Updated Facebook API version and codebase dependencies" + "Re-worked ElasticSearch analyzers for better autocompletion results", + "Added a new report type to the reporting service" ] }, { @@ -368,9 +368,9 @@ export const tracks: Tracks = { "Writes playbooks for new service maintenance" ], examples: [ - "Implemented Google Auth login to Medium", - "Implemented payments integration with Stripe", - "Built Textshots server" + "Re-work reporting to use date-based indexes", + "Implemented promotions service", + "Built Xendo consumer" ] }, { @@ -382,8 +382,8 @@ export const tracks: Tracks = { ], examples: [ "Designed Medium's ranked feed architecture", - "Designed custom domains architecture", - "Created Gotham framework for creating Go services" + "Designed historical inventory system", + "Created standards and tools for writing Go microservices" ] }, { @@ -394,8 +394,8 @@ export const tracks: Tracks = { "Identifies and solves systemic problems with current architecture" ], examples: [ - "Researched, vetted, and selected Go as Medium's statically typed language", - "Defined microservices architecture and medium2 migration plan", + "Researched, vetted, and selected Go as Vend's statically typed language", + "Defined microservices architecture and how services communicate", "Defined and implemented proprietary IP core to the company's success" ] } From 094ad5b0d8421d95c3ed1881824ed835660c5670 Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Thu, 8 Feb 2018 19:24:04 +1300 Subject: [PATCH 11/58] Add the title selector back in --- components/SnowflakeApp.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/SnowflakeApp.js b/components/SnowflakeApp.js index b799e159..46ef823d 100644 --- a/components/SnowflakeApp.js +++ b/components/SnowflakeApp.js @@ -171,10 +171,10 @@ class SnowflakeApp extends React.Component { onChange={e => this.setState({name: e.target.value})} placeholder="Name" /> - {/* this.setTitle(title)} /> */} + setTitleFn={(title) => this.setTitle(title)} /> From f01d05569149a3c6cff19a0059cc28433e2bda46 Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Thu, 8 Feb 2018 19:24:24 +1300 Subject: [PATCH 12/58] Change some track names --- constants.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/constants.js b/constants.js index edc7981a..81c8c68f 100644 --- a/constants.js +++ b/constants.js @@ -257,7 +257,7 @@ export const tracks: Tracks = { }, FOUNDATIONS: { - displayName: "Foundations", + displayName: "Platform", category: "A", description: "Develops expertise in foundational systems, such as deployments, pipelines, databases and machine learning", milestones: [ @@ -330,7 +330,7 @@ export const tracks: Tracks = { }, SERVERS: { - displayName: "Servers", + displayName: "Services & APIs", category: "A", description: "Develops expertise in server side engineering, using technologies such as Go, Java, or PHP", milestones: [ From adb11aeb78236f354ae7e8bd2fe3b45851013435 Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Thu, 8 Feb 2018 19:32:12 +1300 Subject: [PATCH 13/58] Modifications to Career track --- constants.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/constants.js b/constants.js index 81c8c68f..78ed9fbf 100644 --- a/constants.js +++ b/constants.js @@ -265,8 +265,7 @@ export const tracks: Tracks = { summary: "Works effectively within established structures, following current best practices", signals: [ "Writes thorough postmortems for service outages", - "Makes simple configuration changes to services", - "Sits in on-call rotation at level 1" + "Makes simple configuration changes to services" ], examples: [ "Made safe and effective changes to app-gulp", @@ -700,16 +699,16 @@ export const tracks: Tracks = { 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", + summary: "Engages in the Engineering career development process", signals: [ - "Advocates on behalf and in defense of a group member", + "Has a career plan or some form of growth plan in place", "Shares opportunities for improvements and recognises achievements", - "Explains appropriate available industry paths" + "Understands growth opportunities available to them" ], examples: [ - "Collected and delivered feedback", + "Engaged in career development conversation with their manager", "Discussed career options and areas of interest informally", - "Mentored an Intern" + "Provided informal ideas for a team member's career growth" ] }, { From d1585375081b0a56141640aa86a519de9d0a5062 Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Thu, 8 Feb 2018 19:36:28 +1300 Subject: [PATCH 14/58] Modifications to Recruitment track --- constants.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/constants.js b/constants.js index 78ed9fbf..a1a51d6d 100644 --- a/constants.js +++ b/constants.js @@ -1137,7 +1137,7 @@ export const tracks: Tracks = { description: "Strengthens Vend's team by bringing in excellent staff members", milestones: [ { - summary: "Brings new candidates into the pipeline and understands how to evaluate candidates at Vend", + summary: "Brings new candidates into the pipeline and/or understands how to evaluate candidates at Vend", signals: [ "Reviews existing network for hiring leads regularly", "Shadows interviews to gain familiarity with process", From b24a76f0fcd6283747afc6f62cdd462a05868e02 Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Thu, 8 Feb 2018 19:41:24 +1300 Subject: [PATCH 15/58] Modified communication example --- constants.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/constants.js b/constants.js index a1a51d6d..b07e49ce 100644 --- a/constants.js +++ b/constants.js @@ -514,7 +514,7 @@ export const tracks: Tracks = { ], examples: [ "Directed team response effectively during outages", - "Gave a substantial Eng All Hands presentation on Redux", + "Gathered multiple stakeholders together to communicate a priority change", "Gave notice of upcoming related work in Band Practise" ] }, From 617cd871b308fd29e3cb086c1a8ce859cef50664 Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Thu, 8 Feb 2018 20:06:50 +1300 Subject: [PATCH 16/58] Modifications to Platform track --- constants.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/constants.js b/constants.js index b07e49ce..06353c2a 100644 --- a/constants.js +++ b/constants.js @@ -257,7 +257,7 @@ export const tracks: Tracks = { }, FOUNDATIONS: { - displayName: "Platform", + displayName: "Platform & Data", category: "A", description: "Develops expertise in foundational systems, such as deployments, pipelines, databases and machine learning", milestones: [ @@ -281,8 +281,6 @@ export const tracks: Tracks = { "Triages service issues correctly and independently" ], examples: [ - "Upgraded a project from NPM to Yarn", - "Created Go consumer package (river)", "Identified source of slow requests in a single service from the edge in" ] }, From 4214af3c7cab291ec0a5803bcb874e97e1a6beb5 Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Fri, 9 Feb 2018 09:17:39 +1300 Subject: [PATCH 17/58] Modifications to Plaform track --- constants.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/constants.js b/constants.js index 06353c2a..81e70ce1 100644 --- a/constants.js +++ b/constants.js @@ -265,7 +265,8 @@ export const tracks: Tracks = { summary: "Works effectively within established structures, following current best practices", signals: [ "Writes thorough postmortems for service outages", - "Makes simple configuration changes to services" + "Makes simple configuration changes to services", + "Has knowledge necessary to be level 1 on-call" ], examples: [ "Made safe and effective changes to app-gulp", From 6a1bcf69372909a4320aea65a417df4c437afcff Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Mon, 30 Apr 2018 10:17:06 +1200 Subject: [PATCH 18/58] Modify Career level 3 Make "and/or" so that if you're bringing in candidates regularly, that's enough for a 3 --- constants.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/constants.js b/constants.js index 81e70ce1..ae24f66c 100644 --- a/constants.js +++ b/constants.js @@ -1162,7 +1162,7 @@ export const tracks: Tracks = { ] }, { - summary: "Maintains and strengthens the integrity of the current process, and regularly brings in great candidates", + summary: "Maintains and strengthens the integrity of the current process, and/or regularly brings in great candidates", signals: [ "Teaches new interviewers how to interview with empathy", "Models great interview technique and feedback when shadowed", From c5442268cea63cf78769079fb0245fad208dc1f0 Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Tue, 16 Oct 2018 13:23:51 +1300 Subject: [PATCH 19/58] Remove remaining references to Medium --- constants.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/constants.js b/constants.js index ae24f66c..dac085ca 100644 --- a/constants.js +++ b/constants.js @@ -222,7 +222,6 @@ export const tracks: Tracks = { "Acts a caretaker for all of web client code" ], examples: [ - "Designed font loading strategy for Medium", "Researched utility of HTTP/2 for Vend", "Designed and implemented Add/Edit Product screen" ] @@ -236,7 +235,7 @@ export const tracks: Tracks = { ], examples: [ "Designed Vend's frontend entity storage and syncronisation system", - "Implemented Medium's scrolling text over image blur", + "Implemented Vend's multi-framework strategy", "Defined and drove migration strategy from Angular 1.6 to 2" ] }, @@ -320,7 +319,7 @@ export const tracks: Tracks = { ], examples: [ "Invented a novel ML technique that advanced the state of the art", - "Defined and developed Medium's continuous delivery strategy", + "Defined and developed Vend's continuous delivery strategy", "Developed and implemented DR strategy" ] } @@ -379,7 +378,7 @@ export const tracks: Tracks = { "Makes appropriate buy vs build choices" ], examples: [ - "Designed Medium's ranked feed architecture", + "Designed and implemented Vend's mutation-based API", "Designed historical inventory system", "Created standards and tools for writing Go microservices" ] @@ -599,7 +598,6 @@ export const tracks: Tracks = { ], examples: [ "Implemented a strategy to attack flakey build pipelines", - "Iterated repeatedly to develop Medium's underlines solution", "Defined and oversaw plan for closing Heartbleed vulnerability" ] }, From 90b1f2e3432ef2754e7690f070715c3f8dbd3796 Mon Sep 17 00:00:00 2001 From: Ben Gracewood Date: Tue, 16 Oct 2018 13:28:41 +1300 Subject: [PATCH 20/58] Update titles to match wiki --- constants.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/constants.js b/constants.js index dac085ca..1a22d7be 100644 --- a/constants.js +++ b/constants.js @@ -1313,13 +1313,14 @@ export const categoryColorScale = d3 export const titles = [ { label: "Engineer I", minPoints: 0, maxPoints: 16 }, + { label: "Associate Engineer", minPoints: 0, maxPoints: 16 }, { label: "Engineer II", minPoints: 17, maxPoints: 35 }, + { label: "Engineer", minPoints: 17, maxPoints: 35 }, + { label: "Engineer III", minPoints: 36, maxPoints: 57 }, { label: "Senior Engineer", minPoints: 36, maxPoints: 57 }, - { label: "Group Lead", minPoints: 36, maxPoints: 57 }, - { label: "Staff Engineer", minPoints: 58, maxPoints: 89 }, - { label: "Senior Group Lead", minPoints: 58, maxPoints: 89 }, - { label: "Principal Engineer", minPoints: 90 }, - { label: "Director of Engineering", minPoints: 90 } + { label: "Engineer IV", minPoints: 58, maxPoints: 89 }, + { label: "Principal Engineer", minPoints: 58, maxPoints: 89 }, + { label: "Engineer V", minPoints: 90 } ]; export const eligibleTitles = (milestoneMap: MilestoneMap): string[] => { From fbe894aed436130e9edbd0ddce65bb5bb346e78d Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Thu, 18 Oct 2018 08:37:04 +1300 Subject: [PATCH 21/58] Fix flow typing errors --- components/LevelThermometer.js | 2 +- components/SnowflakeApp.js | 12 +++++------- components/TitleSelector.js | 4 ++-- components/Wordmark.js | 3 +++ constants.js | 4 ++-- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/components/LevelThermometer.js b/components/LevelThermometer.js index c570a777..6862d90e 100644 --- a/components/LevelThermometer.js +++ b/components/LevelThermometer.js @@ -61,7 +61,7 @@ class LevelThermometer extends React.Component { .style('text-anchor', 'start') } - rightRoundedRect(x, y, width, height, radius) { + rightRoundedRect(x: number, y: number, width: number, height: number, radius: number): string { return "M" + x + "," + y + "h" + (width - radius) + "a" + radius + "," + radius + " 0 0 1 " + radius + "," + radius diff --git a/components/SnowflakeApp.js b/components/SnowflakeApp.js index 46ef823d..3d753c86 100644 --- a/components/SnowflakeApp.js +++ b/components/SnowflakeApp.js @@ -53,8 +53,8 @@ const emptyState = (): SnowflakeAppState => { milestoneByTrack: { 'MOBILE': 0, 'WEB_CLIENT': 0, - 'FOUNDATIONS': 0, - 'SERVERS': 0, + 'FOUNDATIONS (PLATFORM)': 0, + 'SERVERS & API': 0, 'PROJECT_MANAGEMENT': 0, 'COMMUNICATION': 0, 'CRAFT': 0, @@ -79,8 +79,8 @@ const defaultState = (): SnowflakeAppState => { milestoneByTrack: { 'MOBILE': 1, 'WEB_CLIENT': 2, - 'FOUNDATIONS': 3, - 'SERVERS': 2, + 'FOUNDATIONS (PLATFORM)': 3, + 'SERVERS & API': 2, 'PROJECT_MANAGEMENT': 4, 'COMMUNICATION': 1, 'CRAFT': 1, @@ -240,9 +240,7 @@ class SnowflakeApp extends React.Component { shiftFocusedTrackMilestoneByDelta(delta: number) { let prevMilestone = this.state.milestoneByTrack[this.state.focusedTrackId] let milestone = prevMilestone + delta - if (milestone < 0) milestone = 0 - if (milestone > 5) milestone = 5 - this.handleTrackMilestoneChange(this.state.focusedTrackId, milestone) + this.handleTrackMilestoneChange(this.state.focusedTrackId, coerceMilestone(milestone)) } setTitle(title: string) { diff --git a/components/TitleSelector.js b/components/TitleSelector.js index ec9b1d2e..2212ca54 100644 --- a/components/TitleSelector.js +++ b/components/TitleSelector.js @@ -6,11 +6,11 @@ import type { MilestoneMap } from '../constants' type Props = { milestoneByTrack: MilestoneMap, - currentTitle: String, + currentTitle: string, setTitleFn: (string) => void } -class TitleSelector extends React.Component { +class TitleSelector extends React.Component { render() { const titles = eligibleTitles(this.props.milestoneByTrack) return +
+ {this.state.sheetId && + } + + {this.state.sheetId + ? + : } + +
+ ) + } + } + + handleSheetChange(e: SyntheticEvent) { + const val = e.currentTarget.value + const match = val.match(DOCS_URL_REGEX) + if (match) { + // URL pasted in + this.setState({ sheetId: match[1] }) + } else { + this.setState({ sheetId: val }) + } + } + + handleAuthClick() { + gapi.auth2.getAuthInstance().signIn() + } + + importSheet() { + if (!this.state.sheetId) { + return + } + console.log('importing sheet', this.state.sheetId) + // Get stuff from sheet + gapi.client.sheets.spreadsheets.values.get({ + spreadsheetId: this.state.sheetId, + range: RANGE + }).then(response => { + console.log('imported sheet') + const range = response.result + if (range.values.length > 0) { + const milestones = range.values.map(val => parseInt(val[0])) + milestones.forEach(milestone => console.log(milestone)) + this.props.onImport(milestones) + } else { + console.log('no values found') + } + }) + } + + handleSignOutClick() { + gapi.auth2.getAuthInstance().signOut() + } + + handleCreateClick() { + const rows = trackIds.map(trackId => [tracks[trackId].displayName, this.props.milestoneByTrack[trackId]]) + const data = rows.map((row, i) => ({ + startRow: i, + rowData: { + values: [ + { + userEnteredValue: { + stringValue: row[0] + } + }, + { + userEnteredValue: { + numberValue: row[1] + } + } + ] + } + })) + gapi.client.sheets.spreadsheets.create({ + properties: { + title: `${this.props.name}'s Snowflake` + }, + sheets: [ { data } ] + }).then(response => { + this.setState({ sheetId: response.result.spreadsheetId }) + }) + } + + handleSaveClick() { + const values = trackIds.map(trackId => this.props.milestoneByTrack[trackId]) + gapi.client.sheets.spreadsheets.values.update({ + spreadsheetId: this.state.sheetId, + range: RANGE, + valueInputOption: 'USER_ENTERED', + resource: { + majorDimension: 'COLUMNS', + values: [ values ] + } + }).then(() => { + console.log('saved') + }).catch(() => { + console.log('error saving') + }) + } +} diff --git a/components/SnowflakeApp.js b/components/SnowflakeApp.js index 3d753c86..aad9f4ec 100644 --- a/components/SnowflakeApp.js +++ b/components/SnowflakeApp.js @@ -7,6 +7,7 @@ import KeyboardListener from '../components/KeyboardListener' import LevelThermometer from '../components/LevelThermometer' import NightingaleChart from '../components/NightingaleChart' import PointSummaries from '../components/PointSummaries' +import SheetsControl from '../components/SheetsControl' import React from 'react' import TitleSelector from '../components/TitleSelector' import Track from '../components/Track' @@ -171,6 +172,10 @@ class SnowflakeApp extends React.Component { onChange={e => this.setState({name: e.target.value})} placeholder="Name" /> + { ) } + handleSheetsImport(milestones: Milestone[]) { + const milestoneByTrack = {} + milestones.forEach((milestone, i) => { + milestoneByTrack[trackIds[i]] = milestone + }) + this.setState({ milestoneByTrack }) + } + handleTrackMilestoneChange(trackId: TrackId, milestone: Milestone) { const milestoneByTrack = this.state.milestoneByTrack milestoneByTrack[trackId] = milestone diff --git a/pages/index.js b/pages/index.js index 9b3fe6b8..e3da5693 100644 --- a/pages/index.js +++ b/pages/index.js @@ -1,5 +1,28 @@ import SnowflakeApp from '../components/SnowflakeApp' +import Head from 'next/head' + +if (typeof window !== 'undefined') { + window.handleClientLoad = () => { + console.log('handleClientLoad') + const checkInit = () => { + if (window.sheetsControl) { + gapi.load('client', window.sheetsControl.initClient.bind(window.sheetsControl)) + } else { + setTimeout(checkInit, 500) + } + } + checkInit() + } +} export default () =>
+ +