It looks so easy when we do it

Into the unknown

Combination has always been about exploring new areas, progressing technology and elevating individuals. As a purely technical development center, we are fortunate to be in business with some of the biggest players in our industry, who have provided us with a steady stream of interesting challenges.

Sportsbook is our current main focus, and just as software development it exhibits the trait that more knowledge increases anticipation and enjoyment. The more you know, the more you understand what little you know, which is one of the most joyful aspects of doing R&D.

Being data driven is not enough, we still rely heavily upon craftmanship and an intuitive understanding.

Infrastructure as code, driven by data

As curiosity drives us to chart the unknown, we often find ourselves doing guesswork and hypothesizing, sometimes having to take leaps of faith. This requires craftsmanship and an intuitive understanding, until there is data enough to apply a measure of scientific rigor. In order to support this process, we need the requisite data and tooling.

 

High cohesion, low coupling

Whether it be objects, microservices or infrastructure – the adage holds. In order to build dependable, flexible and long-lived services, we want those qualities in our code base and our infrastructure.

Virtualizing every aspect and separating the act of releasing from the act of deployment, affords us many luxuries when it comes to scale out, A/B testing and gradual roll out. From being able to spin up test environments courtesy of our IaC, to being able to sleep well knowing that canary deployments offer a last line of defense against human error – making all these non-functional investments feel as functional as anything else that we do.

 

Cloud native

In order to leverage the full potential of having our heads in the cloud, we have gone cloud native. And while things may change in the future, we currently have a tech stack that we feel neatly solves our biggest challenges. Some ubiquitous examples include:

  • Docker
  • Kubernetes
  • Helm
  • LaunchDarkly
  • Grafana
After all, being able to respond to the new, the unexpected and to navigate the unknown is our raison d’être.

Machine learning for humans

In a complex environment, what can we truly know for certain? When a domain is large enough to prohibit an exhaustive exploration, we rely on our instinct and craftmanship to extrapolate from what we can observe and hold to be true.

Be it artificial neural networks or evolution, they both leverage a trait we value highly at Combination, which is adaptability. We never adapt at the cost of adaptability. After all, being able to respond to the new, the unexpected and to navigate the unknown is our raison d’être.

 

Inspect and adapt

Building a search engine entails many things, some of which are rather deterministic and reasonably clear, like collecting/storing data and filtering results. At the fuzzier end of the spectrum is the ranking of matches, which requires being able to holistically ascertain the fitness of the system’s predictions. For us this means acquiring an intricate understanding of the domain in question. We also need to carefully partition and weigh incoming data to get a adaptive feedback loop going, while avoiding the pitfalls of over- and undertraining.

When we started out building search, we already knew the underpinning theory. In addition, having suitable infrastructure in place, this meant that setting up our “intelligent” search MVP was relatively straightforward. With initial vetting done and data pouring in, we could quickly move on to the secret sauce part and start tweaking it from good to great.

 

Steal with pride

We are very grateful for the advancements in the ML community in recent years. The incurred savings have translated into more valuable time for massaging data and creating direct customer value, making us grateful for the existence of:

  • Python
  • PyTorch
  • Elastic

High scalability, low latency, ever changing frameworks, API versioning, dynamic typing etc. are usually quite conducive to expediting the forming of a real mess.

Connecting with the user

We build systems that need to withstand high peak loads, without failing or noticeably degrading in service level. Add to this that our scoreboards are very low latency – in fact delays need to be put in place for them not to ruin the excitement by announcing goals before the live TV stream has shown them. This places a lot of non-functional demands on UI components. The UI also needs to be intuitive and good looking, both on the outside and the inside.

 

Mitigating the mess

High scalability, low latency, ever changing frameworks, API versioning, multiple server resources, dynamic typing etc. are usually quite conducive to expediting the forming of a real mess, particularly in the eyes of those not on the original roster. Considering this, it feels only natural to also have the future custodians in mind.

Apart from making an effort to keep our code clean and have it convey its intent as clearly as possible, we scour the internet for nice frameworks to aid us along the way.

In its current form, push is being done using HTTP/2 after a quick flirt with Websockets. And by introducing an API query language we can relieve the client of a majority of the API-calls. This is particularly nice as very rarely do higher, more maintainable abstractions, naturally lead to better performance.

Few things have changed as often as frontend architectures and technologies in recent years. And while there are legions of nice ways of solving the hello world case, the vast majority of them eventually fall apart at higher complexity problems. Thus far we have been happy using the Backends for Frontends pattern – and so far it looks like fate is not going to spring any nasty surprises on us.

 

Building blocks

Particularly in the user facing space, technologies are bound to come and go. So far we have had many and significant problems solved – and very few new ones created – by employing the following:

  • React
  • Apollo client
  • SignalR
  • GraphQL
  • gRPC
Coming up on two decades and looking forward to the next two, we are definitely in it for the long run – and by 2038 much will have changed.

Hindsight is 2020

As an R&D outfit, we are naturally more excited about the future than the past. Equally so, the most interesting stuff we are building will not belong to the public domain for some time to come.

 

Sportsbook & New Product

What we do know is that we exist to significantly move product and technology forward, and that our current main focus lies with Sportsbook, which is a fascinating domain in itself. Sports betting as an industry is in a strong growth phase with fierce competition, and so far, the technical challenges have been proven very interesting to work with. In addition, we are fortunate to be working with some of the world’s leading operators, ensuring a high pace of innovation.

Coming up on two decades and looking forward to the next two, we are definitely in it for the long run – and by 2038 much will have changed. We hope we remain a cross-functional R&D organization, childishly enthusiastic about our work, but dispassionate enough to see that every problem is as unique as every solution, and that matching them correctly is what matters.

 

Long lived

As we plan on being around for a long time to come, we expect technology and frameworks to keep changing – and even to come and go. That said, there is certain tech that has proven relevant and valuable to us over a considerable period, which we do not foresee moving away from soon, such as:

  • .NET
  • C#
  • Azure
  • Git