I am a professional software developer with a wide variety of skills. I can handle all stages of software development from design through development, deployment, maintenance to turndown. I have developed for Windows, Linux, web, Android and iOS platforms with dozens of languages, including C#, C++, Java, Go and Python. I have done UI development, server development, big data analysis, 2D and 3D graphics, sound synthesis, microcontroller programming, and so on. I'm also familiar with cloud systems and related tooling such as AWS, Docker, Kubernetes and Terraform.
This is a sample of what kind of work I have done around software development. While there are links to some code samples, too, please pay in mind that these tend to be already quite dated small-scale hobby projects.
Non-software things
I speak and write Finnish and English fluently, know enough German to handle day-to-day non-professional interaction and also know basic Japanese and Portugese.
I am active in a group of samba players in Helsinki samba school Império do Papagaio. Here I have been, for example, involved in organizing the Helsinki Samba Carnival – a large event drawing thousands of spectators to central Helsinki. Also, for a long time, I was active in computer science student organisation TKO-äly, organizing a lot of their activities.
I draw on computers and on plain old paper. I build electronics. I have designed and fabricated plush toys. I have built a radio control airplane. I have found out that I can do a whole lot of things if I just put my mind to it.
Around games, I'm fond of platformers, shoot-em-ups and construction games. Open world, ability to plan different solutions and discovering things are all things that draw me into a game. Some I have played lately and liked are Hill Climb Racing 2, Stray, Half-Life: Alyx and Superliminal. I am also rather fond of rythm games, in which genre I've recently played games of the Taiko no Tatsujin series.
Senior Full Stack developer at Rovio
2019 to 2024
I joined Rovio as a software developer for their upcoming 4X strategy game Hardhead Squad. Here I was involved with client and server development, and especially with the tooling for player experience and live ops. As I worked as a tech lead for the tooling, we managed to develop a user-friendly and powerful player experience tool. While the game itself was not financially successful and was shut down after soft launch, the support tool has found wide use within Rovio, and is now a part of the Beacon platform.
At Rovio, I've also taken part in game prototyping. As a significant part of this, I was involved in building a modern, highly-scalable, soft-realtime game server. This was a C# server employing actor model to provide in-server and cross-server communication and as a basis to keep game state consistent. For client communication, the server employed UDP transport with high-throughput multithreaded message processing.
As Rovio's goals shifted and the company cut down on prototyping, I joined the Angry Birds 2 team, working as a game server developer in a fully remote position. Here I've been involved in developing the game's C# server, the server's APIs towards game clients and to internal systems, the PostgreSQL database and the React + Typescript tool support and liveops.
Master of Science in Computer Science
Graduated Spring 2019
I returned to my studies after several years working as software developer. I ended up writing my thesis on a subject I had no earlier experience with, the folding of RNA molecules.
An RNA molecule is a long strand. Parts of this strand can join together, forming some shape, or folding. I studied the algorithms for predicting how a specific RNA strand might fold. I combined these with the concept of safe and complete algorithms, an earlier work of my advisors. The prediction algorithms tend to produce a massive number of results, and a safe and complete algorithm detects which parts of a result are common to all result. By taking an iterative approach to this problem, taking turns between designing the new algorithm and implementing the design, I developed and implemented a new algorithm that combines existing RNA prediction algorithm with the safe and complete approach.
The thesis received the grade of Eximia Cum Laude Approbatur, or 5/5 on numerical scale. I also presented my findings at the CPM 2019 conference.
GLSL on WebGL
Spring 2019
I wanted to practice writing effects with GLSL shaders, and I wanted to do that without being tied to my workstation computer. The usual answer to this would be Shadertoy, but I was unable to get a working account there, so I ended up with my own tool. Pros: now I know more of WebGL that I would have with Shadertoy. Cons: it's not as nice to use, and I'm the only user so sharing with others is rather limited.
Software developer at Google
November 2012 to March 2018
I worked for a good while at Google, in their Zurich office. Here I developed software for user analytics of various Maps products. I took part in developing the data collection systems for web, Android and iOS clients and the server-side software that receives the collected data. I also developed various parts of the big data systems that process and analyze the collected data. I participated in the full or nearly full lifecycle of several of these projects, from design to turndown. For the analysis systems, I had big role in turning freshly developed tools into production ready systems that run successfully and on time most of the time, and alert the maintainers whenever they do not.
While I was never officially in any lead position at my team, I was in charge of the majority of the projects I took part in. This was a common approach at Google: quarterly tasks are planned at the end of each quarter, and each team member is responsible of some of those tasks. This meant sometimes assisting someone in their task, and sometimes having someone assist me in mine. The tasks were typically such that it would take a month or few of work for a single person to design and implement. Often the most complex part of such task was not the actual feature, but getting all involved teams to agree if and how the task should be done. This was especially true for our team, as analytics is not a single defined part of the codebase, but needs to be integrated in a large number of places. Quite a few times I had to seek agreement between teams in Zurich, Tokyo and a few locations in USA.
Over the time, I also gained the reputation of knowing our systems and the related systems well. I taught newer team members how those systems work, wrote a fair bit of technical documentation and helped others with their more complicated issues.
I used a large variety of programming languages and technologies in this job, such as Javascript, Java, BigQuery, Python, Go, C++, Objective-C, R, Polymer, AppEngine, MapReduce and Borg. Due to using so many different technologies, I discovered that I am rather fast at getting proficient with a new technology, and that I can quickly understand new codebases such that I can design new features into them.
Software developer at Mapvision
May 2011 to October 2012
Mapvision builds optical measurement devices for factories building car subframes. I took part in developing their Result Suite tool for viewing and analyzing the measurement results.
It was a small group of developers working with the Result Suite. Each of us designed, implemented, tested, etc. new features according to input from people who were in contact with customers and who knew more about quality control practices. While I was not officially in a senior developer position, I was often the one who would solve the more complex issues and help other developers when they had trouble.
I mostly worked with the Microsoft .NET platform, using the C++/CLI language.
While the job was mainly UI development, it is a small company where a developer might end up working with any part of the software. For example, I ended up debugging PostgreSQL query optimization, due to certain queries running way too slow.
Synthetizer built around ATmega microcontroller
2011
I got into the world of microcontrollers after having bought an Arduino board from a vendor at Alternative Party. This noise maker is one of my more polished projects. It runs a software synthetizer on a small 8-bit microcontroller. There are two channels, sine and noise, and each plays a 128 notes long loop that can be set using the buttons and knobs on the front panel.
This was an interesting project, as it required a wide variety of skills. The circuit boards needs to be designed, the parts soldered on, the software is written in C and requires a lot of low-level hardware access, and finally all of this needs to be enclosed in durable and usable case.
Relief mapping
2011
Reading the book Real-Time Rendering I discovered relief mapping, a polygon shading model where the attached height map can self-occlude and self-shadow. This seemed fascinating, so I decided to try implement it myself. It is certainly a slow shading model, but the results are quite nice, even in my non-polished implementation.
Teaching aide at Department of Computer Science, Helsinki University
2009 to 2011
I took part in bringing a more hands-on approach to learning, especially with freshman programming courses, at the Department of Computer Science at Helsinki University.
I was a core member of "Neuvontapaja" group that provided assistance with bachelor-level computer science and first year mathematics course work to any student that happened to join in. We started this as a volunteer effort within TKO-äly, the student organisation of computer science students, since the need for such assistance was clear within the student base. Soon we got the department to adopt the programme, so we instructors became employees of the department.
I also worked as teaching aide on first-ever freshman programming courses that focus on completing a large number of programming tasks instead of the traditional lectures. As a teaching aide, I helped the students with these programming tasks, pointing them into the right direction whenever they had trouble. These courses were the base for current MOOC programming courses
Research assistant, Helsinki Institute of Information Technology
2009 to 2011
I worked as part-time research assistant during my master's studies before finding a full-time job. I was a member of a research group that focuses on computational geometry. For example, I studied for a good while the techniques of finding shortest paths on 2-dimensional plane with polygonal obstacles. I tried to combine those with a method for finding second, third, etc. shortest paths in a graph. There were promising early results, but none were published during my time at the research group.
Testing out path tracing
2010
With path tracing is is straightforward to implement many typically hard effects like depth of field, caustics and ambient occlusion. On the flip side, it is a slow method, as it employs a Monte Carlo method, tracing a massive number of rays between camera, scene objects and light sources.
While the path tracing method is conceptually simple, getting good images out of it is complicated. All of the linear algebra involved is error-prone, each error leading to subtle or even massive rendering errors that are hard to track down. The internal image representation is best implemented in linear colour space with high dynamic range, so a conversion down to sRGB or similar colour space is needed. To make that look good, one needs to understand exposure control and gamma correction.
4k intro at Assembly 2007
August 2007
My second published 4k intro. This one got shown in the 4k intro compo at Assembly 2007. Like previous year, this is likely better as a demonstration of what can be done than as crowd-pleasing artistic piece.
This intro was somewhat late to the game with its non-accelerated graphics – all high-scoring intros were already making use of 3d accelerated graphics and custom shader programs.
Software developer for Inkscape with Finnish Summer of Code programme
Summer 2007
Kesäkoodi was a program arranged by COSS, the Finnish Centre for Open Systems and Solutions, in which they sponsored university students to develop for an established open source project during the summer. I participated in this program, and continued my work from last summer where I implemented filter effects support for Inkscape.
The previous summer I had implemented the core framework required for filter effects in Inkscape. Leveraging that framework, I implemented 13 new filter primitives into Inkscape. By combining those primitives, almost an infinite amount of different filter effects can be created.
All in all, working with Inkscape taught me a lot of the practical skills of working with large codebases with multiple contributors. I also ended up learning a lot about 2D vector and raster graphics, such as how Bézier curves work, what are Porter-Duff blending modes and what is Perlin noise.
4k intro for Assembly 2006
August 2006
Making 4k intros for Windows is a fairly well known area with excellent tools widely available. Doing the same on Linux is a less-known area. The end result is not the greatest, especially as my musical skills are very limited. It does, however, show that there's nothing that would stop one from making a 4k intro on Linux.
It's not the greatest 4k intro out there, not by far, but I'm still proud that I managed to make one, it got shown on the big screen at Assembly 2006. It even scored better than some other intros that got shown in the same compo.
Software developer for Inkscape with Google Summer of Code
Summer 2006
Google Summer of Code is a program where Google sponsors university students so that they can spend their summer improving some established open source project. I participated in this program in summer 2006 and developed the framework for SVG filter effects support in Inkscape.
Inkscape is a massive codebase, developed over a long time. Understanding the codebase and finding the right place to insert the changes that are needed for such significant new feature was no simple feat. Those changes were mostly received well, though I have also seen annoyed comments for developing complicated systems. Unfortunately for the cleanliness and readability of the codebase, those complicated systems were required in order to implement SVG standard correctly.