Game development is a complex process. In 2023 alone we created more than 100.000 game builds, which is a huge number! Supporting our games team in the game development process are the brilliant minds of our Core team. Developers responsible for constructing and maintaining our internal infrastructure –  all the tools, platforms and systems, entirely built in-house and customized to our specific needs, which enable us to do live game operations.

One of these tools is the Build Server, our internal game building pipeline, which has been for the past 6 months under close inspection from Juan and Vlad (our Backend Engineers extraordinaire). We sat down with them for a chat about how we build our games, why we bother developing our own tools and to discover what improvements the team has been working on this year and why.

Juan & Vlad, Backend Engineers on the LiveOps Team within our Core Team

How do we build our games?

Our games are built using the Unity engine and every time there are updates to the game projects, such as asset bundles, new product features or in-game events, we create a new game build. For a game developer, this process takes a lot of time and resources from their machine. Despite the fact that today developers’ machines are more efficient and powerful, it can still take hours to compile all the assets into a new build. This is why, several years ago, we decided to build a collection of tools, which enable us to build games faster, in an automated and more efficient way.

Whilst there are companies that provide this service, having our own personalised, internal build pipeline offers us the flexibility to build in a way that suits our specific needs. It’s not uncommon that companies will have a dedicated Build Pipeline Engineer, or use an out-of-the-box solution. It is a necessity for making games. Ultimately, the product that the gaming company delivers is something that gets installed on some sort of a device (whether that’s a mobile phone, console or PC). Creating these game builds is the part that got automated with our Build Server tools.

Think of it like this – there’s two main components of the Build pipeline, the Controller and the Agents. The Controller allows game programmers, level designers and other users to order a build of whatever they are working on within a specific game. They can do so through our internal build dashboard. The build request then goes to a Build Agent, which starts going through a sequence of steps, resulting in an installable build. Besides these on-demand builds, we also have a lot of scheduled building, which normally runs overnight or on a specific schedule. All the ordered and scheduled builds, build agents and their respective statuses can be seen on the build dashboard.

Build Controller checking in on the Build Agents’ statuses

Vlad elaborates: “The internal build pipeline gives our teams whatever flexibility and customisation they might need – whether someone wants to order a build for a game for a specific branch or a specific revision, if they want to run tests and validations, or not, whether they want to run it on Monday at 2pm, or every Tuesday overnight … You get the drill. The Build Server will notify them when the build is done and they can track everything relating to the building process on a user-friendly and consistently running interface.” These tools therefore give us a complete overview and context into each build, and save us a bunch of time that was previously spent looking into individual problems.

‘If you want it done right, do it yourself.’

This is where building our own tools gives us the advantage over using commercial tools. It enables us to make the game building process super flexible and to bend it to our specific needs. We make a lot of custom integrations in our builds and we have made it very easy for us to report on the things happening in the build pipeline.

The Build Agent is only one of the many moving parts of our build tools. However, it is THE part which actually executes ‘the final recipe’ composed for every game. We actually have several Build Agents (148 to be precise), which are all running on ca. 30 Mac Minis. Juan shares a fun fact about this: “We use Mac Minis because we compile new game builds using Xcode, which requires us to use the MacOS. Having our own internal build tools enables us to build things in Xcode for iOS, which is not something that many commercial tools offered nearly a decade ago when we started looking for an appropriate solution.

Individual agents are set-up in the same way, so that we can reliably know that if the set-up worked for one project, it is also going to work for the others. Another good feature of our build pipeline is that it enables us to upload specific game builds to an app store, instead of our Producers having to do it manually. As Vlad explains: “It’s basically a big collection of tools that contribute to the overall ease of development, in particular by reducing the time that people spend doing repetitive tasks. There’s a lot of things that seem incremental in themselves, but end up adding to a lot.

Juan & Vlad taking a peek at the data

Changing things for the better

Juan and Vlad recently rewrote the Build Agents code from an older version of Python into TypeScript. The old code was difficult to maintain, so everything that needed to be added, fixed or modified to the codebase took a lot of time and effort from our development team. It was basically like constantly readjusting a big Jenga tower.

We therefore took the decision to re-do the Build Agents in a language that was comfortable for all our developers. We also took this opportunity to test our new coding patterns and practices. This was a small project to start with (compared to others), but complex enough that it was suitable for trying this out.

The new coding style is centred around dependency injection (DI). DI is a design pattern which promotes loose coupling between components by externalising the dependencies of a class. Instead of a class creating its own dependencies, they are provided, or injected, from the outside.

Applying DI therefore allows us to have total control over the business logic behind the code. To give an example, we have some business logic that says when the build is finished, we need to notify the user. In order to do that, we call a third party library. However, we do not have control over the third party library and have no way of testing that it actually does what we expect it to. But now, with DI, we are able to abstract that library into a third component which we have complete control over. Juan elaborates: “We now feel very comfortable making structural and behavioural changes in our code, because we are more confident that it will behave as it should. We have a big testing infrastructure, more control and a complete overview of its behaviour.

Vlad goes on to illustrate this with another example: “There are many ways to boil an egg, right? You can boil it in hot water, you can boil it in a microwave, or you can set the house on fire and eventually, this will also make the egg boil.” 🤣

But if you’d rather avoid burning the house down, here’s another metaphor provided by the all-knowing ChatGPT: Imagine you’re building a house. In traditional programming, each room (or class) in your house knows how to make its own furniture (dependencies). With DI, it’s like hiring an interior decorator. You tell the decorator what furniture each room needs, and they bring it in. This way, if you want to change the furniture later, you don’t have to rebuild the whole room; the decorator can just swap it out.

So, applying DI is like having someone else handle the connections between different parts of your program, making it easier to change or upgrade things without messing up the entire system (and burning the house down).

The importance of continuously reiterating on our coding style

“Do you solemnly swear to decouple your components, honour the single responsibility principle, and inject dependencies responsibly, forsaking tight coupling? May your code be flexible, and your tests evergreen.”

Within our team, we always strive towards making our code more maintainable and have an even better quality of life. It’s our long-term vision, and using DI is just one of the target conditions we want to reach on the way there. It is difficult to code consistently at scale in a big team, and to stay cohesive and coherent together. This is why it is extremely useful to have something that can be modified by all of our developers in a comfortable fashion. No matter your role, or your location, you can change something in the codebase and get a fast response into whether this is breaking something or not.

This is why we need to keep reiterating on our coding style – to keep up to date with the standards and good practices,” says Juan, “As long as technology, languages, customer needs and the gaming market evolve, our style will have to follow. We need to be more agile and quicker to respond to things. If we keep doing things the same way, then we will not be able to stay competitive.”

Time for talent with Kamya Krishnan

Namaste 👋 I’m Kamya, pleasure to meet you! I joined Tactile’s QA team 9 months ago. Beyond playing the developed game, my role involves identifying and reporting any potential problems that could impact the game’s quality and functionality 🔦

Meet Kamya, QA Games Tester on Lily’s Garden

Let me share a little bit more about what my team does at Tactile and how I ended up in QA (+ tips for successful QAs at the end!):

🚀 Before Tactile

I started my journey as a Test Engineer in a software services company back home in India. I learned a whole bunch about the software testing process, as well as how to create and execute test cases. After that, I moved into a Test Analyst role, where I focused more on test planning, analysis, and design.

💜 Joining Tactile

Taking a short break during my maternity period, I relocated to Copenhagen with my family. When I returned to work, I transitioned to a QA Engineering role at a Fintech company. This is where I first got familiar with mobile testing and working in an agile environment … which eventually lead me to my current position at Tactile 🙌

As a QA Tester at Tactile, my focus is on ensuring that the weekly releases of our hit game Lily’s Garden go seamlessly, without major crashes or performance glitches. The fact that my contributions directly enhance the overall gaming experience for players is the most fulfilling aspect of my role!

Lily glitching during testing the story part of the game

🏗️ What our team does

Within Lily’s Garden, we work in smaller scrum teams. My role as a QA is to plan, design and execute tests relating to the developments of new game features, such as our most recent Gatcha event and Piranha Rush. I am also responsible for the testing tasks related to in-game ads, which is a significant revenue source for the company! 💰

A huge part of the QA role here is having effective communication with the design and development teams from as early on in the process as possible. This helps to ensure that we help the team avoid having big problems later on!

Funny glitch during testing the story part of the game

💪 Sense of responsibility

The best thing about our team is that it is made out of exceptionally talented individuals from super diverse backgrounds. Our office culture is marked by trust, flat hierarchies and open communication. This has created a great environment for addressing critical issues. I’m genuinely impressed by the strong sense of responsibility shown by my team members, and I really appreciate that everyone is always ready to extend a helping hand during challenging moments.

📚 The keys to success

I believe that QA game testers should embody several key qualities, but the most important ones are:

👉 Robust analytical skills
👉 Effective communication and strong team collaboration
👉 Patience and an eye for detail to navigate through repetitive tasks
👉 A curious mindset for exploring various scenarios
👉 A good understanding of end-users, which helps to understand how players might engage with the game
👉 And lastly, in a QA role you’re often faced with tight deadlines, so it is key to manage time efficiently and prioritize tasks well ⏲️

Are you an aspiring artist or game designer looking to curate a standout portfolio that captures attention and showcases your expertise? The art of presenting your work isn’t just about displaying images, it’s about narrating your creative journey, demonstrating your skills, and resonating with your desired audience.

In this Tactile Tips Series, we delve into the key elements that elevate your portfolio, whether you’re an experienced professional or just getting started. From refining your art portfolio to unveiling the complexities of game design presentations, we’ve gathered insights and tips from our industry experts to help you craft a portfolio that helps you land the job you want.

Art Portfolio Tips

Quality over Quantity
Instead of flooding your portfolio with a lot of pieces that don’t really show your current skill level, focus on centering only the works that exemplify your expertise. While it can be useful to see your progression over time, some of your assets might no longer represent your current level. And as much as the person reviewing the portfolio should look past that, it could show some past weaknesses that you don’t have anymore, but once you see it you can’t unsee it.

Organize & Navigate
Consider categorizing your work based on styles, themes, or mediums. Use clear titles and sections for easy browsing. An example could be dividing your portfolio into sections like “Character Animation,” “Environment Art,” and “Storyboarding” to assist viewers in finding what interests them quickly.

Context Matters
When presenting a project, explain not only what it is but also your specific contributions. For instance, if you worked on a scene consisting of environmental and character art and animation, make sure to name your and each team member’s individual contributions.

Regular Updates
Treat your portfolio as a living document. Add new projects and skills as you develop them. If you recently mastered a new technique or software, integrate it into your portfolio to reflect your current abilities.

Storytelling
It’s all about storytelling and composing a coherent scene. If applicable, place your character in a scene that makes sense dramaturgically. For instance, when you illustrate a messy, chaotic character, their representation should be coherent with their surroundings. If they drive a car, the car should look dirty and messy too, or if they’re chilling in their home, it shouldn’t look too clean and tidy.

Personal Touch
Consider adding a personal statement or a brief narrative explaining your artistic journey. For example, describe how your love for mythology influences your character designs or how traveling inspires your environmental art.

Game Design Tips

Prioritize Released Games (if you can)
Feature your top 3-5 fully released titles prominently. For example, if you’ve worked on mobile games, highlight the ones that garnered significant downloads or received positive reviews. It also can’t hurt to add some information on the games’ tech stack and your individual contributions.

Context, Context, Context
Demonstrate your understanding of game design history and trends. For instance, you implemented a unique mechanic inspired by classic games but reimagined it in a modern context. Make sure to explain how you merged nostalgia with innovation to create a fresh gaming experience. And don’t forget to add information such as feature goals, challenges, mechanics, test iterations, feedback, results and your lessons learned.

Process Insights
Offer in-depth insights into your game design process. If you created a game mechanic that significantly impacted player engagement, walk through its evolution—from initial concept to playtesting iterations. Highlight how player feedback influenced your design decisions.

Metrics and Analytics
Share specific metrics to validate your contributions. If your game experienced a high retention rate or received industry recognition, quantify and detail these achievements. For instance, provide retention percentages or awards received for game design excellence.

Play Links
Make it easy for viewers to access and play your showcased games. Include direct links to playable demos, app store pages, or web versions. Ensure these links are easy to find on your portfolio.

Tips for Juniors

Pet Projects
Don’t hold back on exhibiting your personal projects to show your diverse interests and ambition to create. For instance, if you’re exploring various animation styles, feature short animation clips demonstrating your experimentation with different techniques. For seasoned professionals, it’s interesting to see juniors dabbing in different areas/types of animation because it gives an insight to their curiosity and eagerness to learn.

Sketches
Don’t hesitate to show sketches in your portfolio. They offer a glimpse into your creative process and can often communicate your unique and exciting ideas. For example, we once spoke to an artist who showed a lot of polished, final assets but we were lacking an illustration of their creativity, so we asked them to show some sketches that were exciting and fun to look at because they showed raw creativity and playfulness.

Versatility
Display your versatility by experimenting with various types of animation or design. If you’re a junior game designer, showcase projects where you explore different genres or gameplay mechanics.