My summer as a Gousto Mushroom
Hello, I’m Buneme! I have been a Software Engineer Intern at Gousto on the Mushrooms team for the past 3 months, working on the Android app. I wanted to give a brief summary of what it has been like to work here.
I heard about Gousto through a friend who worked here as an Intern last year. He recommended the company to me, so I got in contact with Ben Brown (Head of Engineering) by email. I came into the company office and had a tour, met the Android team and had opportunities to ask the team questions. A while later, the internship was confirmed and I started my first day as a Mushroom.
One of the first things that I was introduced to was agile. This was completely new to me, having never had a tech internship before. Eventually, as I did more work in the team, I realised just how useful the daily stand-ups and sprints are, and the big difference that they make made to our teams efficiency.
The Android Squad uses the clean app architecture to structure the code base.
This was another thing that was completely new to me. Previously, when working on Android apps, my activities would be handling everything directly from network calls to SQL database operations. This made it hard to maintain projects, and impossible to run tests.
The clean app architecture splits the app code into 3 different layers — presentation, domain and data.
- The presentation layer deals with presenting data to the user.
- The data layer is where all the app data is sent to and retrieved from
- The domain layer sits right in the middle of the presentation and data layer, and allows the two to interact with each other.
This architecture made it easier for me to understand the code base before I started working on tickets.
Our work for each sprint was split up into tickets. The Mobile Team works in 2 week “sprints”. The workload for a sprint is split up into smaller tasks called tickets. One of the first tickets I worked on was fixing a bug which caused the delivery options limit to be hidden in one of the app’s screens.
Other small tickets
I worked on other small tickets towards the start of my internship, in order to help me better understand the codebase. Here are some other examples:
Some bug fixes:
- If you were offline, there were situations where the loading animation would show and never stop
- The app made some assumptions about how many images each premium recipe would have. This caused a few users to experience issues.
Some small features:
- Added analytic tracking to help us track how users interact with the “Contact Us” screen. This mainly consisted of simple lines like:
Analytics.logEvent(CONTACT_US_CHAT, Flow.GET_HELP, Type.PRIMARY_CTA);
- Improved the error handling in our
GoustoAPIclass to give users more descriptive errors when something went wrong
The biggest ticket that I worked on before starting my internship project was setting up Local Notifications. Our team had been talking about implementing push notifications for when a new menu is launched (currently every Tuesday). However, we decided to do a proof of concept using local notifications before investing time in developing the infrastructure required for push notifications.
The local notification works by using Android’s
Alarm Manager. The Alarm manager is one of the components that are used to allow the android phone to perform actions at certain times. If you want the phone to perform a certain action at a certain time, you need to register an
Intent with the Alarm Manager. An intent is just an object that describes an action that can be performed (e.g opening your latest order on Amazon) along with any extra information (e.g the ID of that order).
The intent that I registered with the Alarm Manager launches a notification that informs the user that there is a new menu. As soon as this notification is displayed, a notification for the next menu launch (the next Tuesday) is scheduled. Clicking on the notification opens a screen in the Gousto app that shows the user the new brand new menu.
My Internship project
My main project while at Gousto was developing a widget for the app. The first step of this was meeting with the UI/UX team to discuss requirements. First I received the initial widget wireframes which allowed me to get started with building the widget. After that I got the final designs through inVision.
Building the widget was mostly straightforward. Most of the challenges were based on structuring the widget code in a way that worked well with the clean architecture that our team was already using. Once I got past that and dependancy injection, the rest was mostly straightforward.
I’m glad that I started working on the widget after working on smaller tickets, because by the time I started building the widget, I knew a lot more about how the app worked, as well as Gousto specific concepts (like cut-off).
The widget is a standard Android widget based on
AppWidgetProvider. It loads the latest delivery from the database, and then decides what information and actions it should display, based on the state of the delivery.
Although there is a manual refresh button, the widget uses the Android Broadcast Receiver Component to work out when a user’s order has changed, and then automatically refreshes the widget.
What I learned and observed
I learnt a lot of good practices during my time here in terms of software engineering generally as well as Android development specifically.
Dependency injection and good code architecture makes a codebase maintainable and testable and allows you to add new features quickly.
The management at Gousto communicated the business objectives well to the rest of the company. This meant that no-one was working through seemingly irrelevant tickets, but all the new feature tickets were created with the current business goals in mind.
I also had the chance to learn Kotlin while I was here, which is a mix between object-orientated and functional programming. The Android team is slowly converting their code to Kotlin, so all new code is written in Kotlin.
Overall, I had a great time here and I’m thankful that Gousto were willing to take me on for the Summer break.
Android Mobile Software Engineer Intern, Summer 2018