├── .DS_Store ├── README.md ├── backend └── instructions.md ├── data ├── .DS_Store └── instructions.md ├── devops └── instructions.md ├── frontend └── instructions.md └── shared ├── .DS_Store └── salary_datasets ├── salary_survey-1.csv ├── salary_survey-1.json ├── salary_survey-2.csv ├── salary_survey-2.json ├── salary_survey-3.csv └── salary_survey-3.json /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pineapplehq/hiring-exercises/650dc37796ad177464474d4435ad292e08585843/.DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![welcome logo!](https://dka575ofm4ao0.cloudfront.net/pages-transactional_logos/retina/186505/03_Welcome_Color_Black_Wordmark_Horizontal.png) 2 | 3 | For current open positions, see 👩‍💻 4 | 5 | ------------------ 6 | 7 | # Hiring @ Welcome 8 | 9 | ![hiring process graphic!](https://welcome-public-assets.s3.us-east-2.amazonaws.com/welcome_hiring_process.png) 10 | 11 | Hello! If you are reading this then we're likely in the process chatting with you about a technical role at [Welcome](https://heywelcome.com). If so, congratulations :tada: ! 12 | 13 | In order to move forward, we'd like to know a little about how you work. To that end, this repository contains a set of **short, time-boxed** (approximately 1-3 hours max) that you can use demonstrate your skills and abilities. 14 | 15 | These are **NOT** *coding exercises*. The goal of these exercises is to give you an asynchronous medium for demonstrating how you would break down a set of user stories and requirements into something akin to a rapid POC/spike. There is no grading or scoring, nor is it pass-fail, rather these are meant to serve a sample of your reductive thought processes as an engineer. We know that 3 hours is not a lot of time and you will both not be able to complete everything you'd like, and will feel pressure to do more. Please truly hold yourself to 3 hours max and make sure to create the `ROADMAP.md` file as outlined in the instructions below. 16 | 17 | ## First, a few words about asynchronous/take-home exercises 18 | 19 | We know that the technical hiring processes in our industry are generally broken. We also know that there are mixed opinions on take-home exercises in general. The primary reasons we ask candidates of *all* levels to complete these exercises are as follows. 20 | 21 | * 🌎 ~ We're a fully-remote team spread across multiple time zones and we hire candidates from across time and space. Async exercises allow you to show off your skills at a time/place that works for you. 22 | 23 | * ⏳ ~ Take-home exercises allow you to work at your own pace. We intentionally structure these to take around 1-3ish hours of time and ask that you limit your investment to no more than the suggested time, however you are free to break this into as many sessions as you wish. 24 | 25 | * 🛠 ~ It matches the nature of our work. Most of being an engineer on a remote team is self-directed exploration of a problem, followed by period(s) of cyclic work/edit/review, followed by submittal for review and approval by your peers. Async exercises allow you to do the same. 26 | 27 | * 👁 ~ It eliminates the performance anxiety of forced-pairing with someone whom you've just met. 28 | 29 | * 🧰 ~ It allows you to use the tools, languages, and frameworks where you are the most productive. 30 | 31 | ## General Instructions 32 | 33 | 1. Choose an exercise directory that matches your primary domain. This is the area in which you feel the most comfortable and have the highest degree of mastery 34 | * [frontend](frontend/instructions.md) 35 | * [backend](backend/instructions.md) 36 | * [data](data/instructions.md) 37 | * [devops](devops/instructions.md) 38 | 39 | 2. Read the `instructions.md` file in the matching directory. Be sure to read the instructions carefully and ask any clarifying questions either via [Github issues](https://github.com/pineapplehq/hiring-exercises/issues) or by emailing hiring@heywelcome.com 40 | 41 | 3. Create a new **private repository** for your exercise and add the Welcome hiring team members as private collaborators (We do this to preserve your anonymity so it's not obvious you are looking for a new tole.) 42 | * [Dan @ Welcome (Head of Engineering)](https://github.com/thoughtpunch) 43 | * [Scott Burns](https://github.com/sburns) 44 | * [Bart Proost](https://github.com/bartcheers) 45 | 46 | 4. Complete as much of the exercise as you can in 3 hours or less. Unless otherwise specified in the `instructions.md` document, you can use any language, framework, or toolchain you wish, although ideally this would be Python, Javascript (ReactJS), and SQL (purely because those are the languages we use to build Welcome and will be the most familiar with) 47 | 48 | 5. Be sure to include the following in your submission 49 | * a `README.md` with the following information 50 | * **A few screenshots of the finished product**. Show off that work! 📸 51 | * The exercise you choose and why 52 | * A short explanation of what you built 53 | * How to test/demo/run (if applicable) 54 | * NOTE: a 'working' exercise is awesome, however it is NOT a hard requirement. We mean it! 55 | * Any feedback/notes (i.e. if something was hard, confusing, frustrating, etc) 56 | * Anything else you'd lke us to know about your submission 57 | * a `ROADMAP.md` with what you would add/change if you had more time. Dream big. 58 | * a super-simple test suite if applicable (even one test is a bonus) 59 | * Some form of lightweight technical documentation (code comments are fine) 60 | 61 | 5. When complete email a link to the repository and any special instructions to hiring@heywelcome.com 62 | 63 | 6. Sit back and relax. We'll review your submission and get back to you within 48 hours :smiley: 64 | -------------------------------------------------------------------------------- /backend/instructions.md: -------------------------------------------------------------------------------- 1 | # Welcome Backend-focused Product Exercise 2 | 3 | ``` 4 | TIMEBOX: 2-3 hours max. We mean it! Set at timer and hard-stop at 3 hours ⏱ 5 | LANGUAGES: Python, Javascript, SQL 6 | FRAMEWORKS: Django, Flask, NodeJS, etc (Exercise B can be pure SQL) 7 | TESTS: nice to have, but not mandatory 8 | DOCS: nice to have, but not mandatory 9 | ``` 10 | 11 | ## Overview 12 | 13 | This exercise is to implement the best possible solution to one of the exercises below in the time alloted. We're evaluating your ability to take a set of requirements and spike a holistic solution that demonstrates craftsmanship, thoughtfulness and good architectural design. This is **NOT** a test of how well you know Python/Django/Flask/SQL, nor should you try to impress us with overly clever and obtuse solutions. If you want to impress us, build something that is beautiful, intuitive and easy to debug/test/extend :smiley: . 14 | 15 | Ideally your solution would have some way to run locally and test the results so we can fully analyze your efforts. 16 | 17 | ## Choose **One** Of the following 18 | 19 | --- 20 | 21 | > :rotating_light: :exclamation: :point_right: **Please use one of the salary datasets provided here for either exercise [/shared/salary_datasets](/shared/salary_datasets)** :point_left: :exclamation: :rotating_light: 22 | 23 | ### Exercise A: Expose an API for querying compensation data 24 | 25 | The goal of this exercise is to design a read-only API (REST or GraphAPI) that returns one or more records from static set of compensation data. 26 | 27 | #### User Story: As a developer I want to 28 | 29 | * list compensation data via API `GET` request 30 | * Filter by one or more fields/attributes (e.g. `/compensation_data?salary[gte]=120000&zip_code=11201` ) 31 | * Sort by one or more fields/attributes (e.g. `/compensation_data?sort=last_name`) 32 | * fetch a single record via GET request 33 | * **Stretch Goal**: return a sparse fieldset (e.g. `/compensation_data?fields=first_name,last_name,salary`) 34 | * have the JSON response be normalized into a uniform schema via a serializer or json template 35 | * **Stretch Goal**: serialize more than one compensation [data set](/shared/salary_datasets) 36 | 37 | ### A few quick notes on submitting Exercise A 38 | 39 | * Don't worry about any web application concerns other than serializing JSON and returning via a GET request. 40 | * The example above (`/compensation_data`...) is not a contract. Feel free to design the URL structure and JSON schema that you believe creates the best client/consumer experience 41 | 42 | --- 43 | 44 | ## Exercise B: Database Design Exercise - Storing Compensation Data 45 | 46 | The goal of this exercise is to design a highly normalized database schema for storing compensation data 47 | 48 | * Create a schema for storing the compensation data provided in one of the [available data sets](/shared/salary_datasets). This schema should be in at least [3NF](https://en.wikipedia.org/wiki/Third_normal_form) with tables for **employee**, **role**, and anything else that makes sense for the data given. 49 | * Upload at least one dataset to the schema 50 | * **Stretch Goal**: upload all 3 salary datasets to the database schema 51 | * Validate that you can perform the following queries. You can export the results of these queries via CSV or attach screenshots of the the output 52 | * Average compensation of roles where the role is some kind of engineer (hint: `ILIKE`) 53 | * Average, min, and max compensation per city (if available in dataset) 54 | * One interesting query of your choice (*average compensation by gender perhaps???*) 55 | * Create a quick database schema diagram 56 | * Many admin tools and clients will allow you to generate these from your schema. If not possible, just draw a super-simple diagram in MS Paint or similar tool 🎨 57 | 58 | ### A few quick notes on submitting Exercise B 59 | 60 | * Ideally this exercise would use SQLite or Postgres, but any SQL database is OK 61 | * Feel free to upload the entire SQL dump (with schema) of the populated database, or create a script that creates the schema and populates the database with one or more of the provided salary data CSVs. Please do whatever makes the most sense given the time alloted. 62 | * If you'd like to use a scripting language like Python or Ruby along with an ORM to make this easier, thats fine with us! 63 | 64 | --- 65 | 66 | ## Submitting your exercise 67 | 68 | 1. See [instructions for submitting your work](https://github.com/pineapplehq/hiring-exercises/blob/master/README.md#general-instructions) 69 | -------------------------------------------------------------------------------- /data/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pineapplehq/hiring-exercises/650dc37796ad177464474d4435ad292e08585843/data/.DS_Store -------------------------------------------------------------------------------- /data/instructions.md: -------------------------------------------------------------------------------- 1 | # Welcome Data Engineering/Science Product Exercise 2 | 3 | ``` 4 | TIMEBOX: 2-4 hours max. We mean it! Set at timer and hard-stop at 4 hours ⏱ 5 | LANGUAGES: Python, SQL 6 | FRAMEWORKS: Jupyter 7 | ``` 8 | 9 | ## Overview 10 | 11 | This exercise is to evaluate real-world compensation data. This is **NOT** a test of how well you know [Jupyter](https://jupyter.org/)/Python/SQL, nor should you try to impress us with overly clever and obtuse analysis. If you want to impress us use the time alloted to extract the maximum value from the data possible. 12 | 13 | Submissions should be in the form of a [Jupyter notebook](https://jupyter.org/), however you are free to write custom SQL queries or functions if that better fits your work style. Ideally your solution would have some way to run locally and test the results so we can fully analyze your efforts. 14 | 15 | ### Inspiration 16 | * [Github: jrenner/hacker-news-salaries-data](https://cdn.rawgit.com/jrenner/hacker-news-salaries-data/master/explore_salaries.html) 17 | * [Github: minimaxir/sfba-compensation](https://github.com/minimaxir/sfba-compensation/blob/master/angelist_sfbayarea_jobs.ipynb) 18 | * [Anaconda: gwinnen/sf-salaries-exercise](https://anaconda.org/gwinnen/sf-salaries-exercise/notebook) 19 | * [Kaggle: drgilermo/salary-analysis](https://www.kaggle.com/drgilermo/salary-analysis) 20 | 21 | 22 | ## Exercise 23 | 24 | --- 25 | The goal of this exercise is analyze a data set containing several CSVs of compensation data submitted by individuals via Google Sheets. This data has not been modified in any way from the original source. 26 | 27 | * Clean and format all [3 compensation data CSVs](/shared/salary_datasets) to use a common set of fields/attributes/columns containing at least the following... 28 | * Role/Title 29 | * Location 30 | * Salary (base compensation) in $US dollars with cents 31 | * Years experience 32 | * Bonus 33 | * Validate that you can perform the following analyses and export the results via [Jupyter notebook](https://jupyter.org/), a CSV or attach screenshots of the the output 34 | * **Compensation by Role** 35 | * Find the average compensation of roles where the role is some kind of technical professional 36 | * Visualize the relationship between compensation and role 37 | * **Compensation by Geographic Region** 38 | * Average, min, and max compensation per city/region 39 | * Visualize the relationship between city and salary/base compensation 40 | * **Compensation by Experience** 41 | * Visualize the relationship between cash compensation and other forms of compensation 42 | * Visualize the relationship between years of experience and total compensation (cash and bonus/equity) 43 | * Visualize One interesting query/facet of your choice (*average compensation by gender perhaps???*) 44 | 45 | --- 46 | 47 | ## Submitting your exercise 48 | 49 | 1. See [instructions for submitting your work](https://github.com/pineapplehq/hiring-exercises/blob/master/README.md#general-instructions) 50 | -------------------------------------------------------------------------------- /devops/instructions.md: -------------------------------------------------------------------------------- 1 | # Welcome DevOps Product Exercise 2 | 3 | ``` 4 | TIMEBOX: 1-2 hours max. We mean it! 5 | LANGUAGES: any 6 | FRAMEWORKS: any 7 | TESTS: nice to have, but not mandatory 8 | DOCS: nice to have, but not mandatory 9 | ``` 10 | 11 | ## UNDER CONSTRUCTION 12 | 13 | ![WIP!](https://cdn.theatlantic.com/thumbor/60Ru-wmiq_yZj6n_KgL6XPnGnbw=/media/img/posts/2015/10/Dunes8119construction/original.gif) 14 | -------------------------------------------------------------------------------- /frontend/instructions.md: -------------------------------------------------------------------------------- 1 | # Welcome Frontend Product Exercise 2 | 3 | ``` 4 | TIMEBOX: 2-3 hours max. We mean it! 5 | LANGUAGES: Javascript 6 | FRAMEWORKS: React and any libraries you want 7 | TESTS: nice to have, but not mandatory 8 | DOCS: nice to have, but not mandatory 9 | ``` 10 | 11 | # Overview 12 | 13 | This exercise is to implement the best possible solution to one of the exercises below in the time alloted. We're evaluating your ability to take a set of requirements and spike a holistic solution that demonstrates craftsmanship, thoughtfulness and attention to user experience. This is **NOT** a test of how well you know React or ES7+, nor should you try to impress us with overly clever and obtuse solutions. If you want to impress us, build something that is beautiful, intuitive and easy to debug/test/extend :smiley: . 14 | 15 | Ideally your solution would have some way to run locally and visualize the results in a browser so we can fully analyze the experience and not just the source code. 16 | 17 | # Choose One Of the following 18 | 19 | -------------- 20 | 21 | ## Exercise A: Creating an offer 22 | 23 | ### As a hiring manager I want to 24 | 25 | * Create a a new offer of employement 26 | * Specify the monetary compensation details of an offer (salary, equity, bonus, etc) 27 | * Specify non-monetary compensation and benefits (culture, learning opportunities, etc) 28 | * See a list of the offers I've created 29 | * Share a link to an offer via a unique URL 30 | 31 | ### As an employee receiving an offer I want to 32 | 33 | * View an offer that was sent to me 34 | * **stretch goal**: Ask a question about the offer (ideally a subsection of the offer) 35 | * Understand the non-salary compensation I am being offered (stock valuation, value of healthcare benefits) 36 | * See detail about the role, team, and organization 37 | 38 | ## Exercise B: Visualizing Compensation and Benefits 39 | 40 | ### As a HR-team member I want to 41 | 42 | * "Upload" a CSV/JSON file with my the compensation data of my current organization 43 | * **NOTE**: You don't need to create an API around file storage/IO. Use any/all of the sample files in [/shared/salary_datasets](/shared/salary_datasets) or create your own simple faked data set. 44 | * View the data in a simple tabular view 45 | * **stretch goal**: be able to sort or search by any unique identifiers (name, email, etc) so I can find specific rows 46 | * View simple visualization(s) of the distribution of salary compensation so I can get an overview/aggregate of overall compensation 47 | * **stretch goal**: be able to visualize data across more than one dimension 48 | 49 | --------- 50 | 51 | # Submitting your exercise 52 | 53 | 1. See [instructions for submitting your work](https://github.com/pineapplehq/hiring-exercises/blob/master/README.md#general-instructions) 54 | -------------------------------------------------------------------------------- /shared/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pineapplehq/hiring-exercises/650dc37796ad177464474d4435ad292e08585843/shared/.DS_Store --------------------------------------------------------------------------------