Skip to main content

The humble beginnings

Hello, world!

My name is Adrian and I’ve worked on games for the past 4 years. I broke into gamedev by composing music for indies while simultaneously doing QA at QLOC studio in Warsaw, Poland. After 9 months there, I got a job at CD Projekt RED, where at first I continued my QA career, but then moved on to audio programming through embedded audio QA duties and some technical sound design and implementation assistance. I've recently parted with RED and joined an enthusiastic team of Crunching Koalas where I code in C++.
Over these past 3 years I've subjected myself to a pretty hardcore wholistic learning routine which blurred the lines between various different fields of software development for me. Although my
primary education is in music performance and composition, I've invested a lot of personal time and resources in learning how to code. Throughout my career at RED, I dubbed in JavaScript, Python, C# and finally C++, but I've also spent a lot of time on design related tasks, including scripting (both visual and code), technical sound implementation, quest, animation and behavior graphs debugging and asset management. In this blog I intend to write about how it all went for me, including my programming self-education experience, my being thrown into deep waters of RED Editor with no prior experience with any other game engine, and how my dreams of working on the most well known games have been confronted with a surprising reality.

Design like a programmer

I intend to start this blog off with a series of articles called “Design like a programmer”.  This series is aimed mostly at designers working on games. If you are a designer, be it of quest, game, gameplay, progression or other aspects of a game, I will share with you some principles that should help you improve your design process and make your designs easier to maintain and/or expand in the future. If you are not a designer, don’t be discouraged from following, as I believe some of the ideas and observations I’m going to share could easily be applied to many other fields of game development.
Throughout the “Design like a programmer” series I will explore numerous principles that programmers learn both at university and at work and try to explain them using visual scripting, code samples and real life examples. Each code sample I’ll use will be clearly described so that you could follow along even if you don’t code yourself.
Let me explain a bit more what problems this first series of articles will tackle and why I’ve chosen to call it “Design like a programmer”.
When the field of game development had started to become an actual business, most of the developers where programmers. Even though the programming languages of yore were quite different from the standards we know today, certain programming principles have been established back then and have not changed since. This is very well reflected by programming literature, which core canon entries still comprise of publications published 10 or 15 years ago. As gamedev has started growing and the complexity of games increased, more specialized positions have started to appear. Artists, sound designers, UX and UI designers, gameplay, RPG and progression designers - all of them take care of very specific aspects of a game. This is understandable considering the scale of the games we are used to these days, but it also brings additional problems that can take heavy toll on a game’s production cycle and final quality.
Since the audio is my main field of expertise, let me explain further using sound design as an example. Sound designers’ skill set comprises mostly of authoring sound effects using self-recorded or library assets, implementing them into the game and mixing them before release. Those tasks demand that a sound designer knows about:
  • the physics of sound propagation
  • recording gear and how to use it effectively
  • using digital audio workstations and an endless array of sound processing effects
  • the workflow of audio implementation in the engine they use
  • the audio middleware they use

Each of the points listed above could be focused on solely to build an entire career around it. This is in fact what happens in bigger audio teams, where some people take care of foley recordings, some of ambience and/or field recording, some of technical implementation and so on. Unfortunately, this very often leads to many of those highly specialized individuals being unaware of what place does their work fit in the huge jigsaw of the game they are building. This means they often perform their tasks without understanding the context, which can in turn place additional burden of work on anybody else that will have to process the assets on their way to the final build. But what does any of this have to do with thinking like a programmer or game and quest design? Glad you asked!
Both my personal observations and the numerous discussions I’ve had with fellow developers seem to suggest, that this specialization has lead to people being able to pursue any of those highly specialized careers without having the skills that were considered basic and common knowledge so many years ago. There are many people who have started their careers in the field of design (or transitioned to design from QA), and many more dreaming of doing so. Many of those people have never coded in their lives, which means they are not and likely will never become aware of certain principles and design approaches their colleagues from the code department have learnt. And that’s a shame, because there are numerous tips coders have passed from one to another that eventually became a standard that drastically improves not only the quality of code, but more importantly addresses many of the hardships associated with modern game development.
It is my opinion that among numerous causes of troubled game development nowadays, the fact that those solid principles that used to be universally known all these years ago but are not that common anymore is somewhere at the top of the list.
Game development is a very iterative process, which very often leads to tough crunch and lots of work being thrown away multiple times throughout a development cycle of a game. Luckily, iteration is something that’s basically synonymous with programming and there are numerous programming principles that can easily be applied to other fields of game development to make the process less painful. This series of articles will explore those principles in detail one at a time and hopefully show how they can be applied in other fields.
I hope that as you follow along, you will get ideas on how your work could be made easier to maintain and expand. As we explore various different maintainability and expandability principles together, I hope that the iterative process of game development will become easier to handle and allow you to spend your crunch time at home, crunching together on tasty food with your family and friends.

---
Adrian

Comments

Popular posts from this blog

Float precision and Time in Unity

Float precision and Time in Unity Recently, I was tasked with addressing an interesting issue that occured in a Unity game. After the game run for about 2 days, it virtually stopped streaming in map assets during world locomotion. Assets were streamed in with a huge delay (up to x-teen seconds) and it simply wouldn’t do. After finding out what caused this strange bug, I thought it would make an interesting article to share with you. Both the problem, and the process of finding its origin were quite an interesting experience. Debugging Since the problem only occurred after at least 2 days of ‘soaking’, I knew time is going to play a role here. I started investigating the issue by looking at the custom streaming code used in the game. It consisted of a bunch of asset loading and unloading functions, called every tick. At the start of each tick, before calling the functions, the code would cache the current Time.realtimeSinceStartup, which is a timer managed by the Unity engine tha

Array property customization in Unreal Engine 4

With the drive towards as much data-driven gameplay as possible, there comes a need for easy to edit and nice to interact with data assets that can accommodate all that data. While Unreal Engine 4’s UI framework allows us to display a wide range of data structures, its default handling of nested properties can quickly result in deeply nested structures that need to be expanded in order to edit them. This can really hurt productivity in some scenarios. Fortunately, we have the ability to fully customize how our data is laid out. While there are nice tutorials all around the web that explain how to customize our custom classes and structs, I’ve not been able to find an article that would explain how one would go about customizing how collection types display their data. In this article I will describe how to customize the display of an array property in UE4. I will follow it with the one for customizing maps display in the near future. Defining the issue I intend to explain the pr

My CD Projekt RED story, part 3

My CD Projekt RED story, part 3 We are now 2 years into my CD Projekt RED adventure and so far, it’s been mostly smooth sailing. I got promoted to a QA Analyst position, an equivalent of a specialist position for developers. I was earning around 2600zł or $650 per month, which would sometimes go as high as 3500zł with additional crunch pay. At this point I felt fairly rewarded for my efforts and could even start planning my wedding. I also received the first bonus for my participation in the creation of both Witcher 3 expansions. This amounted to roughly 13.000zł or $4250, which was an amount of money I had a hard time wrapping my head around. I still lived in a single room in an apartment I shared with other people, but at this point it was mostly my own choice. I’ve had my own wedding on the horizon so I needed every coin I could save for the occasion. Getting out of QA It was during that time that I decided I want to transition away from doing QA work. I approached the audio te