Tech
Nov 14, 2023
From forecasts to improved ads, hear what our software engineering interns have been up to
At Wolt, we learn by doing. Find out what that means in practice by getting to know Iwona, Itoe, Johanna, Riikka, and Diana. They are here to tell their internship stories and share an inside perspective on what it’s like to intern as a Software Engineer at Wolt.
How Iwona contributed to more accurate supply planning
I’m Iwona, a Software Engineering intern at Wolt. During my internship, I’ve been working on an internal tool for supply planning specifically focused on the courier segment. With 25 countries worldwide, it can be tough to estimate the right number of courier partners needed in each location. Our Country Operations Teams have stayed on top of it using a spreadsheet. This manual process isn’t very reliable and takes a lot of work. This tool aims to improve long-term supply planning to ensure enough courier partners are available at the right times. By leveraging forecasts for various metrics, the tool aims to optimize planning, improve decision-making, and automate operations for our Country Operations Teams. The result? Now, our Country Operations Teams can create a reliable supply plan in just a few clicks, backed by data.
Why are accurate forecasts important?
Maintaining accurate and reliable forecasts is a priority, as they enable us to make better decisions based on reliable information. Forecasts help us estimate how many courier partners we need to fulfill the expected number of orders on time. Many things can affect our predictions’ accuracy, from market conditions to weather fluctuations, unexpected events, or data errors. That’s why we incorporated a forecast monitoring component to the tool. It’s designed to give us a better overview of our forecasts’ performance. What does the forecast monitoring component do? It enables us to track the performance of forecasts and commitment targets over time and displays them in charts and tables. We can then compare the actual number of orders and courier partners needed against our predictions. And if they don’t match, it’s an opportunity for improvement.
Better forecasting means a better user experience
The new component will improve the accuracy of our supply planning significantly. It is currently being deployed in a few countries but in the future, it’ll help us trace the quality of our forecasts across more than 500 cities worldwide. Comprehensively monitoring our forecasts will also help us identify inaccuracies and adjust our models as needed, improving accuracy and reliability over time. By providing accurate and transparent information about our predictions, we can foster trust and credibility and improve communication between teams. All of our teams will be able to see the same error metrics, empowering them with insights on forecast performance and commitment tracking.
I’ve gained hands-on experience and built my confidence
My internship experience focused on two primary areas of learning: software development and forecasting techniques and models. It’s given me hands-on experience managing diverse operations within the database structure, calculating error metrics, and creating user interfaces using Plotly Dash and backend services using FastAPI, Pandas, Numpy technologies. Building a component from scratch and integrating it into an existing tool has taught me a lot. In addition to software development, exploring different methods of forecasting and their practical implications helped me understand forecasting techniques and models better.
I feel proud to have played a part in building a tool that directly impacts our planning capabilities. The experience has given me confidence in my skills as a software developer, and this internship has prepared me for the future by equipping me with valuable problem-solving and analytical abilities. I can’t wait to apply these skills to even more challenging projects and continue contributing to cutting-edge solutions in the tech industry.
How Itoe improved Wolt’s advertising platform by developing new features with Kotlin
I’m Itoe, a Backend Software Engineering Intern at Wolt’s AdTech team. When I started in March 2023, I expected to be assigned tasks and given plenty of instructions. In reality, I can choose many of my projects and have real ownership of my tasks, of course with the support from my colleagues and team. Here’s a sneak peek at one of my most exciting projects at Wolt so far:
Attracting more customers by improving Wolt Ads’ service
The AdTech Team makes, well, Wolt Ads. It’s a new advertising service that allows merchants and brands to advertise themselves within the Wolt app, giving them visibility and attracting more customers. As an intern, I’ve been helping to build the ad management platform. The backend is developed using Kotlin and Ktor frameworks, and the frontend uses TypeScript and React. My team constantly adds new features to improve the platform's performance. As one of my first-ever projects, I got to improve the platform by making the end date field of ads campaigns optional. This way, advertisers can run ads continuously.
What’s it like to build APIs with Kotlin and Ktor?
Kotlin is a programming language for the Java Virtual Machine (JVM) and can be used anywhere Java is used today. Compared to Java, Kotlin is more concise. That means developers can achieve the same results with fewer code and bugs.
While Kotlin is used for developing Android apps, it’s also used for web and server-side applications. Thanks to its clean language design and powerful features, we can use it to build and maintain Wolt’s large-scale projects more efficiently. A perfect example of this is Kotlin’s statically typed language. Checks on variable types are executed during compilation time, so you must always write code using the correct type. While it was initially difficult (especially serializing or deserializing JSON objects), I gradually got used to coding with correct types in Kotlin. It’s cleaner, more readable, and easier to fix.
I’ve also been building a REST API service, which helps advertisers book and manage ad campaigns. I implemented a search function and pagination feature on endpoints listing campaigns. It sounds simple, but it took a lot of implementation. In practice, it meant adding filters on database PostgreSQL queries, linking the Ktor application and the database by Jdbi, and modifying the DTO model. These tasks required implementation from database to endpoint. It was a great opportunity to learn about clean architecture. Before the internship, I didn’t have much database experience, but I’ve grown my knowledge thanks to tasks like this.
Why good communication is important
During the internship, I have not only improved my technical knowledge, but I’ve also picked up some valuable soft skills. Needing to explain my ideas clearly and listen to others has helped me to become a better communicator. Good communication is an important part of being in a team and ensures we are all on the same page. Also, small mistakes can lead to big problems in software development. I’ve learned to be more careful when checking my code to make sure everything aligns with what’s needed. I am sure these skills will really help me in my career.
Why Johanna thinks good software engineering is an approach
I’m Johanna, a Software Engineering intern at Wolt and part of the Consumer Platform Team. When I first started, I thought I’d be creating features for the Wolt app—things related to ordering food on the app. Instead, I kept hearing discussions on something in “Datadog”, “Kafka this”, “Gateway that”, and “Did somebody scale the pods?”. It took me a while to figure it all out.
With a bit of time and support from my peers, I understood what my team does—and to say it simply, we’re the backbone of the backend. We maintain the infrastructure and keep things running smoothly for our engineers. While we don’t directly make new features for the Wolt app, our work deeply influences the backend and how people in Wolt’s feature teams work.
When small things aren’t small
Small changes can have a big impact. Let’s say there’s a new weight display unit. Imagine we wanted to show the price per 100 grams instead of kilograms. That sounds like a quick tweak, right? For an application like Wolt, the scale is much bigger, and the behind-the-scenes is rather complex. A small addition like this could change things for many people in multiple locations. If done sloppily, it could crash.
I quickly realized how much time and effort my team put into thinking through all the possible scenarios and preparing for the unexpected. We need to think about scalability and what might happen in the future. What if Wolt needs different values in the future? How would that change everything again? Too many times, I’ve thought to myself, “This must be the final fix”. Then my code would return from review with a comment like “Oh, but what if this scenario happened?”. I might be a bit of a worrying kind of person, often thinking what might go wrong, so it kind of felt right up my alley. Although spending a lot of time thinking about worst-case scenarios, code reviews are a great learning experience, and I've learned a lot from the discussions with my team.
I learned to approach complexity with (just enough) context
Other teams ping our team when they notice errors or if something crashes. At this point, I think it’s worth noting one significant chunk of Wolt’s codebase: Restaurant-API, a colossal monolith of billions of lines (to my estimate), built since 2014, with dozens of developers working on it every day. I made the mistake and went ahead to take a little peek at it on the first day of my internship, got a stomach ache, and thought there was no way I could understand any of it. Fair to say, six months in and me and Restaurant-API are pretty okay now.
One of my biggest learnings has been finding out how my team approaches complex issues. Even if they had no experience with that particular part of the codebase, they could quickly grasp the context with just a glance. It’s like being a doctor. You get 15 minutes with a patient, listen to the symptoms, and ask the right questions – then understand the problem. Next, you think about the immediate solution and the long-term consequences. You don’t have to understand everything in detail. Having the ability to evaluate something is enough. It’s about asking the right questions. It’s about knowing how much context you need. I went from staring at unfamiliar code for hours – like a deer caught in headlights – to a determined little coder diving into the rabbit hole and then hopping out bravely to try a solution. It’s been such an interesting journey!
Just keep on coding
When my internship ends, I will move into a new team to work on new features. I’m glad I’ve gained a better understanding of Wolt's backend. I think this internship gave me new knowledge on preventing catastrophes and navigating chaos. I learned patience, how not to get a stomach ache each time you face something unfamiliar or stare at a code you don’t immediately know or understand. Now I trust I will be able to handle it and code on, as cool as a cucumber.
How Riikka and Diana built Wolt’s Search Debug Tool from scratch
We’re Riikka and Diana, Software Engineering interns at Wolt. When we joined the Consumer Search Team, we quickly started working on a Search Debug Tool. What’s that? Imagine browsing Wolt’s app, but something’s off, and you can’t say what. Our Search Debug Tool helps our engineers identify and fix bugs faster by flagging issues as they happen. The result? A better-looking app where everything looks Wolt-grade. Along the way, we’ve embraced feedback and overcame challenges to deliver a seamless and enjoyable solution—and we’re excited to share our learnings with you!
How collaborating with designers helped us get started
To get things started, we defined the project’s scope and objectives by putting together a detailed Request for Comments document (RFC), and took ownership of the tool’s design – fun! But making sure the user experience hits the mark? With the two of us brainstorming, it became clear we needed an extra spark. And what better way to shake things up than by collaborating with some product designers? With their help, we began reviewing and refining our numerous design ideas.
The product designers taught us a few things, like prioritizing the most important use cases to stay focused. Instead of throwing stuff at the wall and hoping it would stick, we learned to build a simple foundation. Once the foundation was ready, we started to make it more complex. This approach made it much easier to tailor the product design to specific contexts, pain points, and preferences. The result? Our wireframes improved, and we had more “aha” moments than we could count!
Unlocking growth through Pull Request feedback
As the development phase started, we quickly understood that merging our Pull Requests (PR) was going to be tough. At Wolt, we have a strong feedback culture and do code reviews, where we get feedback for the code we deploy. While our senior engineers were hungry for changes, we took this as a challenge! With our great keyboard skills and a big dose of determination, we jumped into code reviews, handled the suggestions for improvements like pros, and managed to conquer those PRs!
The takeaway? Those PR comments – while first overwhelming, became a fantastic opportunity to learn and improve. Each suggestion was a building block that helped us improve. So next time you receive a ton of PR feedback, just remember it can help you grow.
From backend interns to full-stack developers
While both of our backgrounds were mostly in backend engineering, at Wolt we both got the chance to deep-dive into the world of frontend. We expanded our skillset from Python to TypeScript as the Search Debug Tool project progressed. TypeScript was something entirely new to us. But thanks to our mentor’s help, we could push beyond our comfort zone and learn on the go.
We improved over time, gaining a full view of the development process by linking backend and frontend tasks. As our knowledge grew, we found new ways of doing things. For example, instead of creating a specific feature in the backend and continuing it on the frontend, we transitioned to a frontend-only solution that was smarter and sleeker. It’s a great example of how going from backend wizardry to full-stack funhouse expanded our skillset and gave us more ownership of the Search Debug Tool. This resulted in a more efficient and smoother development process.
We’re ready for new adventures!
As our internship adventure starts to reach its finale, it feels less of a wrap-up and more of a ‘’stay tuned’’ moment. Our journey resembles a rollercoaster ride from debugging dilemmas to design dynamism—and finding our way through PR feedback. With our trusty and reliable new coding superpowers, we feel ready to take on new challenges. One thing is certain: we’re ready to embrace it like the coding champions we have become.
Hold on tight, world…we’re about to code up a storm!
Ready to jump on board?
We're passionate about doing things well, whether that’s building a new tool or kick-starting an early career. After completing their internships, all five interns were offered full-time jobs at Wolt—and are already coding their way through the next adventure.
Want to join the ride? We offer various programs in product development for students, recent graduates, or self-taught learners. 👇