Welcome to ProntoPro's backend assignment!
Please read through the instructions below and don't hesitate to ask questions in case you need any clarification on the specs.
Good luck and have fun!
We need to build a new product comprising two functionalities:
- showing to the public the amount of "thumbs up" we received
- showing to our internal marketing team some stats via a js app about how many "thumbs up" we received in the last 1 min, 5 mins and 15 mins
The underlying APIs will expose some JSON endpoints that will be consumed by our mobile apps and it will allow the users to send a "thumb up"; since mobile app is not yet available we have to define the API contract and send the specs to mobile-app developers. Also note that for the sake of this assignment no authentication mechanism is required for the public endpoint consumed from mobile app.
After some considerations we decided to split the product in two backend services named public-service
and private-service
.
This service will:
- expose the API that allow us to receive the "thumbs up" from the mobile-app
- host the web page showing up a public counter with the number of "thumbs up" we received
- communicate to the private service about the "thumbs up" it received
This service will:
- receive data from the public service
- expose the following API for the "thumbs up" stats for the js app to consume:
Request: GET /stats Response: { "thumbsUp": { "1min": 1, "5mins": 10, "15mins": 100 } }
- You MUST use PHP for one service and Go for the other: it's up to you to decide which component should be built using which language
- The two services must use a messaging mechanism such as HTTP, AMPQ or gRPC to communicate: data storage mechanisms such as database or files are not allowed as communication system
- The js app that reads the data from
private-service
is taken care of by the frontend team, so you should not worry about it - Writing unit, integration or benchmark tests is optional but recommended
- The presence of
Makefile
,Dockerfile
anddocker-compose.yml
files to help setting up and running the project is optional but appreciated - A continuous integration pipeline definition (eg:
.travis.yaml
,Jenkinsfile
,.github/workflow
...) is optional
- Start describing the list of interactions between
public-service
andprivate-service
- Feel free to use any library that might help you get the job done faster or more conveniently
- Consider the network to be not reliable
- Add any third-party service you need in order to make the product work as expected
- It is ok for the the
private-service
to lose data in case the process crashes or gets restarted
Here's what we'll look into when evaluating your submission (items are sorted alphabetically and not by importance):
- Code quality
- Coding style
- Documentation (eg: notes explaining the architecture, quality of code comments, setup instructions, etc.)
- Git commit messages & content
- Knowledge of languages / libraries
- Product reliability
- Software architecture
- Tests
Work on your repository and send us the access to it once the work is completed; you can send the repo to us via mail (in a ZIP file) or make the project available (based on platform you use) to user:
If you want to use a different platform let us know how we can access.
The assignment do not have any time constraints (you can return it after a day or in two weeks), in any case we will consider the time you need to complete the assignment.