This project has been written as a gem using Ruby 2.6.
Before continue, ensure the bundler is installed on the machine.
git clone https://github.com/filipemenezes/unbabel-cli.git
cd unbabel-cli
bundle install
bundle exec rake install
# Print result to stdout
unbabel-cli average <input-filename> --window-size 10
# Print result to a file
unbabel-cli average <input-filename> --window-size 10 --output_file <output-filename>
# For usage help you can run
unbabel-cli help average
- Validate input file content
- Validate window size
- Write automated tests
- Edge cases
At Unbabel we deal with a lot of translation data. One of the metrics we use for our clients' SLAs is the delivery time of a translation.
In the context of this problem, and to keep things simple, our translation flow is going to be modeled as only one event.
Example:
{
"timestamp": "2018-12-26 18:12:19.903159",
"translation_id": "5aa5b2f39f7254a75aa4",
"source_language": "en",
"target_language": "fr",
"client_name": "easyjet",
"event_name": "translation_delivered",
"duration": 20,
"nr_words": 100
}
Your mission is to build a simple command line application that parses a stream of events and produces an aggregated output. In this case, we're instered in calculating, for every minute, a moving average of the translation delivery time for the last X minutes.
If we want to count, for each minute, the moving average delivery time of all translations for the past 10 minutes we would call your application like (feel free to name it anything you like!).
unbabel_cli --input_file events.json --window_size 10
The input file format would be something like:
{"timestamp": "2018-12-26 18:11:08.509654","translation_id": "5aa5b2f39f7254a75aa5","source_language": "en","target_language": "fr","client_name": "easyjet","event_name": "translation_delivered","nr_words": 30, "duration": 20}
{"timestamp": "2018-12-26 18:15:19.903159","translation_id": "5aa5b2f39f7254a75aa4","source_language": "en","target_language": "fr","client_name": "easyjet","event_name": "translation_delivered","nr_words": 30, "duration": 31}
{"timestamp": "2018-12-26 18:23:19.903159","translation_id": "5aa5b2f39f7254a75bb33","source_language": "en","target_language": "fr","client_name": "booking","event_name": "translation_delivered","nr_words": 100, "duration": 54}
The output file would be something in the following format.
{"date": "2018-12-26 18:11:00", "average_delivery_time": 0}
{"date": "2018-12-26 18:12:00", "average_delivery_time": 20}
{"date": "2018-12-26 18:13:00", "average_delivery_time": 20}
{"date": "2018-12-26 18:14:00", "average_delivery_time": 20}
{"date": "2018-12-26 18:15:00", "average_delivery_time": 20}
{"date": "2018-12-26 18:16:00", "average_delivery_time": 25.5}
{"date": "2018-12-26 18:17:00", "average_delivery_time": 25.5}
{"date": "2018-12-26 18:18:00", "average_delivery_time": 25.5}
{"date": "2018-12-26 18:19:00", "average_delivery_time": 25.5}
{"date": "2018-12-26 18:20:00", "average_delivery_time": 25.5}
{"date": "2018-12-26 18:21:00", "average_delivery_time": 25.5}
{"date": "2018-12-26 18:22:00", "average_delivery_time": 31}
{"date": "2018-12-26 18:23:00", "average_delivery_time": 31}
{"date": "2018-12-26 18:24:00", "average_delivery_time": 42.5}
Before jumping right into implementation we advise you to think about the solution first. We will evaluate, not only if your solution works but also the following aspects:
- Simple and easy to read code. Remember that simple is not easy
- Include a README.md that briefly describes how to build and run your code
- Be consistent in your code.
Feel free to, in your solution, include some your considerations while doing this challenge. We want you to solve this challenge in the language you feel most confortable with. Our machines run Python, Ruby, Scala, Java, Clojure, Elixir and Nodejs. If you are thinking of using any other programming language please reach out to us first 🙏.
Also if you have any problem please open an issue.
Good luck and may the force be with you
If you feeling creative feel free to consider any additional cases you might find interesting. Remember this is a bonus, focus on delivering the solution first.