Please see the youearnedit
directory for the actual code submission, leaving legacy project structure in place for requirements outline.
Original
Hello! We're so thrilled you're applying to join us at YEI!
To help us learn a little about how you work and write code, we ask that you spend a few hours (3-5) on the following code problem. The goal of this is for you to have an opportunity to show your skills as a developer and your commitment to writing well crafted code, in a setting that is most comfortable to you. Please don't spend too much time - we want to be mindful of what we're asking you to commit. The goal of this is not to have a production-ready application. This challenge is a sort of 'choose your own adventure' problem based around premise below. Be sure to be mindful of how long it will take to implement your solution, this is not about how much you build, but about the quality of what you build.
Using the public Github API or Github's GraphQL API, build a rudimentary service that queries the Rails repository for the latest open issues that are unassigned.
The service should provide the ability for the end User to do the following:
- Filter the results by component (explained below)
- Order the results by comment counts (ie. most commented to least, least to most)
As well as anything else your implementation needs.
In the repository, the Rails team uses labels to define the components of the stack the issues relate to. The components we'd like you to get issues for are:
- ActionCable
- ActionMailer
- ActionPack
- ActionView
- ActiveJob
- ActiveModel
- ActiveRecord
- ActiveStorage
- ActiveSupport
- Asset Pipeline
Feel free to ignore the other labels.
I'm going to build a Rails app with an adapter for the Github API v3 (unauthenticated) that uses a HTTP library to make the requests, build out an object oriented parser to handle the response data and persist it into SQLite, then build a query object to handle the sorting and filtering of the issue data for presentation in the UI. I'm going to test the boundaries of my application and mock the response data from Github.
I'm going to build a Rails app that doesn't persist any data from the Github API, but offers real-time requests to the API, controlled by a basic AJAX UI. I'm going to use VCR to handle test coverage of the adapter to Github interactions, and will test the query interface exposed by my API controller.
- Our backend is Ruby on Rails and our web client is React. Are you comfortable with either of these? Awesome, they are the most straight forward for us to evaluate.
- Don't feel comfortable in Rails or React? Feel free to switch it up. Remember though, we might not be experts in your tooling so explain your choices of different technology the way you would introduce new tech to your team.
- Most of what we do is web-based, but feel free to show off your skills and writing command-line tools, APIs, or GUIs.
- RSpec, Minitest, Jest, Mocha - write tests please and use what you tools you like to do.
- MongoDB, PostgreSQL, SQLite - if you need a database, please pick one of these.
Show us your skills - this can be:
- Building out a robust api integration
- Building an ETL processor to persist the data from the API
- Building a nice clean API of your own to expose the data you transform from Github
- Building a fancy UI around a basic API of your own using other tools like JS.
This is where you can really show off who you are and what you can do. Just don't go too overboard on time.
Make sure you:
- Write clean, well tested, well organized code.
- Leave comments if appropriate. We don't comment everything. We just explain the "hard parts."
- Don't spend too much time on setting up your environment. This repo ships with a base rails app in
./youearnedit
. If you want to use React, we recommend using Create React App or webpacker to set up the dev environment. Feel free to ignore parts that aren't relevant to your example. Using this as a starting point will help minimize changes so we can focus on your code.
- This is not a 'build as many features as possible' challenge - consider the time to implement, and build what you can accordingly.
- Don't overuse gems - if you're building a sweet frontend and not the backend, use a GitHub gem. If you're focusing on building a backend, don't use the gem, show us the code!
- Don't submit broken code - your solution should be functional
- Don't spend too much time
- Don't break out your code into separate application services. A monolith is fine.
- Please don't put your solution on Github. We'd love our candidates to keep their solutions to themselves.
We want to see that you can a) code, b) problem solve, c) organize your thoughts into a reasonable implementation. We love looking at elegant solutions, but don't be too crafty or non-normal in your coding style. We're looking to see that you follow common standards and conventions, and that you follow well understood paradigms like DRY, separation of concerns, and good object orientation in Ruby or composition in React.
At YEI, we test our code as often as we can to ensure things are sound - we'd expect the same out of you, so please have some test coverage around the important parts. In the interest of time, you don't need 100% complete coverage, so feel free to ignore things like view tests and feature tests. Unit tests of the important parts is more than enough. Although we use RSpec exclusively for our Ruby tests at YEI, you're welcome to use alternatives if that's faster for you.
- Write a README - this should explain what you implemented (high level), how to get the code running, and how to interact with it (CLI, web app, etc.)
- If using Ruby, please include a
.ruby-version
file and aGemfile
for dependencies - If using Javascript, please include your
package.json
file - While we love git and GitHub, we don't want our candidates to be able to see each other's work and the history of the project. Please take your entire directory, and zip or tarball it for submission.
After you submit your solution, we're going to go review your code, see what you implemented and how you did it. This will be our basis to get a brief understanding of your abilities in code, as well as a well-understood problem set to follow up with our technical interview - a pairing session with one of our teammates.
For the pairing session:
- You should be prepared to talk about any of the complex parts of your solution, why you solved things a certain way, and what challenges you faced.
- You should be prepared to modify your code as a pair, including running your test suite, having the app running, etc