Culture Time
Culture Time is one of the unique things that makes the EU & UK Engineering Team at OpenTable so special. During Culture Time, engineers can engage in professional development like online courses, work on proof-of-concepts for new OpenTable features, and more. It is an opportunity for us to grow and learn new technologies, as well as a chance to work with people outside our normal team. Some Culture Time projects have even gained momentum and ended up as production code. In fact, the tech blog itself is an example of a Culture Time project.
Acing the internship interview
Today is an exciting day because we've just started accepting applications for our summer internship programme! If you're reading this then hopefully you've already applied or you're thinking of applying. Don't worry if that's not the case, but just bear in mind that the target audience of this blog post is internship programme candidates.
We're hiring!
It is a very exciting time for us at OpenTable, and specifically at OpenTable Engineering in Europe.
Welcome to the OpenTable Europe technology blog
Hi, welcome to our relaunched tech blog, it's been quite some time in the works! Our last post was in 2019 – and to be fair there have been some distractions since – but we're delighted to be back.
Meetup: Design Systems in the Real World with React
This Thursday, June 13th, we are pleased to be able to partner with the React GraphQL Academy to host Design Systems in the Real World with React at our Finsbury Square office, London.
Structuring large ASP.NET Core projects for testing and readability
This is a continuation of a previous post where I described in detail how to test an ASP.NET Core API end-to-end in an isolated, repeatable fashion. This is a shorter post that discusses an approach to structuring your project that should make it easier to test and develop.
Testing an API In Memory in ASP.NET Core
This is long post that describes how to setup an in-memory test harness for testing an entire ASP.NET Core API with lots of code examples.
Starting your career as a software developer
A couple of years ago I was asked to give a talk to programming undergraduates at Kings College, London. I wrote up the session as a blog post and added it to my personal website, where it has received thousands of hits since (one or two hits).
Monads explained by a imperative programmer - with examples
A monad is any type construct that follows a specific pattern; it works in the same way as other design patterns. The .NET ApplicationContext is a singleton in the same way that Array is a Monad. Something being a monad does not define its purpose; in the same way that a class can implement many interfaces, a monadic type can also conform to many patterns to increase its usefulness.
Meetup: New Ideas for the New Year
Tuesday the 12th of December, OpenTable is delighted to host the thirteenth appointment with the WEBdeLDN meetup.
Meetup: Bedtime stories
Wednesday the 22nd of November, OpenTable is delighted to host the twelfth appointment with the WEBdeLDN meetup, featuring talks by Tammie Lister (Experience Designer at Automattic) and Cristiano Rastelli (Front-End Engineer at Badoo).
Circuit Breakers and Application Resilience
For most people circuit breakers are a concept that belongs in the world of electricity. They are usually a box of fuses under the stairs that prevents the tangle of extension cords from turning into an unexpected open fireplace behind the TV. But the concept of a circuit breaker is something that we can apply to software and software services.
Meetup: Frontend Refactoring at Scale
OpenTable is delighted to host the tenth WEBdeLDN monthly meetup with talks by Jack Franklin and Nick Balestra.
Hosting external events
This June, OpenTable hosted the London Machine Learning Study Group to great success. We provided the food, drinks, and space for an extremely talented speaker and over 100 RSVPs. It was also my first experience hosting an external meetup at OpenTable - and I learned a lot!
Pragmatic Testing with GraphQL
We’ve been using GraphQL at OpenTable for a little over half a year now. I won’t go into detail as to why we started using it, but suffice to say, we really enjoyed creating our very first GraphQL endpoint. It eased a lot of the inconsistencies that we were experiencing with some of our REST-ful services.
OpenTable's Global Hackathon 2017
Last week we were excited to kick-off our first OpenTable Global Hackathon, underway simultaneously in San Francisco, Los Angeles, Mumbai, Melbourne, and right here in London. Having personally never attended a hackathon before let alone helped organise one I was initially daunted, but with some careful planning, good suggestions from the team and a fair amount of making it up as we went along, the end result was quite a success.
The goal driven organisation
Quarterly team goals are an effective way to establish organisational purpose, direction and alignment while supporting team agility. But be vigilant - they can be used inappropriately.
testing-node-apps-with-docker-compose (and some Soul)
As I am sure the audience of this post knows to some extent, Docker is a technology that has grown to become popular over the last few years, allowing developers to deploy pieces of software by packaging them into standardized containers, in a number of various ecosystems (Apache Mesos, Amazon Web Services and many more).
falcor-postman
At OpenTable, we have an engineering culture that empowers us to research, experiment and learn.
OpenComponents - microservices in the front-end world
Many engineers work every day on opentable.com from our offices located in Europe, America, and Asia, pushing changes to production multiple times a day. Usually, this is very hard to achieve, in fact it took years for us to get to this point. I described in a previous article how we dismantled our monolith in favour of a Microsites architecture. Since the publication of that blog post we have been working on something I believe to be quite unique, called OpenComponents.
Testing React Components
At OpenTable it’s becoming an increasingly popular trend to use React. One of the reasons for this is the ability for it to server-side render whilst still giving us the client side flexibility that we all crave!
Puppet-Community
Puppet is an important tool to us at OpenTable; we couldn’t operate as efficiently without it but Puppet is more than a tool or a vendor, it is a community of people trying to help each other operate increasing complex and sophisticated infrastructures.
The DNS ABC
Before joining OpenTable I was looking for a software engineer job and I've done my fair share of interviews. A question that has popped out a lot, and when I say a lot I mean always, is:
Hapi.js and SIGTERM
When we first stood up our hapi.js APIs, we wrote init scripts to start/stop them. Stopping the server, was simply a case of sending SIGKILL (causing the app to immediately exit).
Dismantling the monolith - Microsites at Opentable
A couple of years ago we started to break-up the code-base behind our consumer site opentable.com, to smaller units of code, in order to improve our productivity. New teams were created with the goal of splitting up the logic that was powering the back-end and then bring to life new small services. Then, we started working on what we call Microsites.
A Beginner's guide to REST services
As a junior, I always find it easier to just sit and write code than actually stop to think about the theoretical basis that lie under the applications I work on. REST is one of those terms I heard a lot about, so I decided to try to sum up what it means and how it affects the choices we make everyday as software engineers.
On Strongly Typed Logging
Logging is a crucial element of monitoring highly available systems. It allows not only to find out about errors but also quickly identify their cause. Logs are often used to generate metrics that help business and engineering make informative decisions on future development directions.
Building a living styleguide at OpenTable
If you're reading this you've probably built yourself a website. A site - large or small - that's thrown together or crafted over many months. And if you have, you’ve probably kept all your CSS class names in your head, or at least been able to go straight to the relevant stylesheets to retrieve them.
Explaining Flux architecture with macgyver.js
Flux is an application architectural pattern developed by Facebook. It was developed to solve some of the complexities of the MVC pattern when used at scale by favouring a uni-directional approach. It is a pattern and not a technology or framework.
Supporting IE8 in the OpenTable redesign
We're really proud to have released last week our redesigned website, the culmination of months of hard work from many talented people here in London and in San Francisco.
Proxying Services With Hapi.js
I've raved in the past about how awesome hapi.js is, but I'm going to talk about just a specific case today.
Hobknob v2.0: A new dimension
Sometimes there is the requirement for more granularity when toggling a feature switch. Version 2.0 of Hobknob hopes to address this with feature categories.
Interacting with ElasticSearch using Hubot
At OpenTable, we use a few ElasticSearch clusters. Our aim was to be able to interact with our ElasticSearch clusters via HipChat so that we could troubleshoot easily and without having to log into our VPN. We already use Hubot as part of our systems workflow, so it made sense to be able to interact with ElasticSearch with it.
Coach don't rescue
I recently attended a fascinating and emotionally-charged talk by Samantha Soma at DareConf 2014 titled 'How to stop rescuing people'. It strongly mirrored my experience of moving into a leadership role and I'd recommend anyone with a spare 30mins to watch it.
Hobknob v1.0: Now with authorization
We are pleased to announce the version 1.0 release of Hobknob, our open-source feature toggle management system. With it comes a few additions and several improvements.
PuppetConf 2014 - Part 3
This is our summary of PuppetConf 2014. In our previous post we gave an overview of the first day of the conference. This post will provide an overview of the final day.
PuppetConf 2014 - Part 2
This is our summary of PuppetConf 2014. In our previous post we gave an overview of the contributor summit. This post will provide an overview of the first day of PuppetConf.
PuppetConf 2014 - Part 1
It has been one week since our attendance at this years PuppetConf and we have just now caught up on all the great talks that were given and the projects demonstrated over the 3 day period. Here's our summary of the event (split into 3 parts), hopefully you will find as much inspiration in the content as we have.
Introducing Hobknob: Feature toggling with etcd
The ability to dynamically turn features on/off in software without the need to redeploy code is extremely beneficial. Whether you are trialing a new feature or using branch by abstraction to avoid creating feature branches, the use of feature toggles can aid continuous delivery and provide a mechanism to reduce mean time to resolution when an issue occurs.
Testing Puppet with Beaker pt.3 - Testing Roles
In the first two parts of this blog series we have focusing on testing puppet modules with beaker. As an open source contributor there is always a large test matrix so this makes absolute sense. But what about the other large use-case for beaker - what about our day-to-day internal code base? Not all of this is modules, in fact a large portion of it is other puppet code - roles, profiles, facts, hiera data etc. All of this needs testing as well.
Testing Puppet with Beaker pt.2 - The Windows story
In part one we discussed our first steps into the world of acceptance testing our Puppet manifests. By using Beaker we able to test managing local users on our Linux boxes. This was a positive experience for us. It allowed us to get to grips with the basics of configuring Beaker to run tests and configuring our node sets to run those tests against. In this post, we will be discussing how we went about getting Beaker working with Windows.
What can I do?
I've noticed recently a lot of content in my social media network is based on the current escalating problems in the Middle East.
Acceptance Now
When is acceptance-only testing a good idea, and how can its problems be overcome?
Continuous Delivery: Automating Deployment Visibility
In our continued effort to drive towards a service oriented architecture each of our teams are continuously improving their deployment processes. Recently our team has focussed on automating as much as possible, putting as much into chat as we can and improving our logging/metrics.
Managing Windows Features with Puppet
Back in June 2013, I wrote about Windows Feature Management with PowerShell. We have since released a Puppet module that will do this for us. We originally wrote PowerShell:
Managing Windows Web Applications with Puppet
As part of our move towards a configuration management tool, we really wanted to start automating as much of our infrastructure as possible. This included our application configuration stack. IIS management is pretty easy with PowerShell. It would look something like this
Remote Worker Notes – Tools and Setup
For the last couple months I've been working remotely with our search team at OpenTable. Let me share our remote working setup and some rationale for our choices. I will shy away from judging how it's all worked out and leave that for subsequent blog posts.
Effective prioritisation
Prioritisation is a huge part of modern life. No. Prioritisation is an ESSENTIAL part of modern life. I'm not talking solely about Agile here either. Yes we plan stories, yes we prioritise them to get them into the backlog but I'm aiming at a higher level. Life lessons that are useful to all of us.
Look ma, no unit tests!
At OpenTable we strive to deliver change as quickly and correctly as possible. To do this effectively we are always looking for new tools and methods that allow us, the developers, to respond quickly and accurately to changing requirements and environments.
Upgrading Puppet with Puppet
As part of one of our recent ForgeFriday efforts we released a new module puppetversion with the purpose of managing the installation and upgrade of Puppet in a platform agnostic way.
Testing Puppet with Beaker
One afternoon I got asked to write a new Puppet module to manage local users on our Linux boxes. Not a contrived example but a real-world need as we begin to move our infrastructure from Windows to Linux. Managing users is one of those tasks that is at the core of the Puppet ecosystem and I thought this would be pretty easy as I had done this sort of thing many times before. What added to the complexity was that we needed to support Ubuntu, Centos and FreeBSD machines that we had in our stack and we wanted to make it something that was open source and on the Forge - so lots of testing was required.
ForgeFriday - our commitment to the Puppet Forge
Those of you that read this blog on a regular basis will be aware that here at OpenTable we take our commitment to Open Source very seriously. As part of the infrastructure team at OpenTable we are begining a process of being open-first. That means that everything we write will be open-sourced unless it contains a significant amount of internal information but we will architect to limit this.
Internationalisation in a RESTful world
I18n is often a painful afterthought when serving content from a http-api. It can be taken for granted and tacked on using nasty query string values. But thankfully HTTP provides us with a solid gold opportunity. If you can look past the mire of content negotiation you can see the nuggets that lie inside.
When to performance test in production
In my last post about performance testing I wrote about how we decided to do it in production as the ultimate test of success. Performance testing in production is enough to make some operations guys have a panic attack and a few odd looks were dished my way when I raised it on behalf of the team.
Performance testing our Search API
It was midnight on the Friday before Christmas, my seven-week old child was tucked up asleep and I was pretty chilled. All was calm and it was time for bed. Two minutes later I had a phone call, followed by a series of Nagios email alerts, and a need to put my work hat on quickly. The search API was having trouble; as the manager of the team who developed it, I was not looking forward to this. We were having a real slowdown at one of our busiest times of the year – this was going to be fun.
Benchmarking APIs - why it’s important, and how
Since I joined OpenTable I’ve been experimenting with performance monitoring, specifically on web services. One of the projects my team is responsible for is a REST API that provides UI elements for HTML5 applications, shaped as HTML snippets and static resources. Our consumers are websites deployed in multiple parts of the world, so our service needs to be fast and reliable.
Programme Management, making Agile scale
A lot of us were lucky enough to attend NDC London this year, we even sponsored one of the food stalls. I often see one or more real themes coming from talks at conferences. At NDC London I saw three talks around scaling Agile. Indeed Dan North's (@tastapod) talk was called exactly that. It is a topic OpenTable is trying to make happen. We are about 100 engineers on three continents which is a lot of teams working together.
The adoption of Configuration Management
In years gone by, we were a traditional IT company. We had teams of developers and operations. They rarely mixed. Around nine months ago we started to really try and get these teams working together. We introduced a configuration management tool, Puppet, into our ecosystem.
20% time: Why, as a manager, you should love your engineers to be doing it
We allow all our UK based developers to have some time to explore new technologies, try out prototypes and clean-up things that escape the day-to-day process. Two days out of ten, seems a lot doesn't it?
Coaching style over substance
Have you ever been lucky enough to mentor someone who really got it? Maybe you've had the opposite experience and the session ended up being a failure for both of you?
Beginning a journey to chatops with Hubot
As a part of our 30% time a few of our team, @ajroyle, @stack72 and I (@ryantomlinson) decided to get together and look at Hubot with Hipchat integration. There are several weird and wonderful scripts that ship with Hubot (see above) but the core concept of driving tooling via chat is one that we see value in.
Linking to your app in Windows 8
In an effort to raise the visibility of our excellent Windows 8 app we have recently connected www.opentable.com to the Windows Store. This was simply a case of adding two lines of meta data to our site. Or it should have been – there were several gotchas along the way that are worth sharing.
Resolving domains to areas in ASP.NET MVC
When building a previous project, I created an ASP.NET MVC application that would allow subdomains to resolve to different areas of the project and thus show different views. I wanted to be able to extend this functionality. I wanted to allow different domains to point to different areas. This would allow me to deploy the application just once and then have different headers on the web server rather than regional variances. Whilst on a flight to San Francisco, I was able to hack together some code that allows just that. The details of that hackiness are below.
Quick look at RethinkDB
Someone in the office mentioned RethinkDb and I was impressed by the rhetoric on the site, so I decided to spend a couple of hours spiking one of our existing nodejs apps with RethinkDb. The app currently uses MongoDb so inevitably I'm comparing the two.
Counting in ElasticSearch
Counting is the religion of this generation it is its hope and its salvation. Gertrude Stein
Grunt + Vagrant = Acceptance Test Heaven
My continued love affair with Grunt reached a new high the other day, when I combined Vagrant with my Grunt deployment tasks and test runners.
Grunt your deployments too
We've been using Grunt as a build tool for our nodejs apps, and it's brilliant. It lints, it configures, it minifies, it tests and it packages.
MapReduce in MongoDB
One of the first things I took on when joining OpenTable was building a new endpoint in our reviews API to aggregate and summarise restaurant review data. Thankfully, at the time, all the data I needed was cached in memory so building the response object was a simple set of linq queries over the cached reviews.
Using Vagrant to work with ElasticSearch on your local machine
Recently, I have started to work a lot more with Vagrant as a tool for creating a standard development environment across my team. This essentially means that regardless what the developers' machine is set up or running as, they can still reproduce the same environment as their colleagues just by entering a command.
One Gun - Many Enemies
I spent some time, re-investigating Javascript. After a few months of intensive TDD and SOLID training at OpenTable I was curious how those principles apply in a slightly different environment. Guess what, they do not differ that much... I planned to write about all this sometime in the future after gaining more experience from real battles ahead, however Watirmelon post invited me to attack this subject immediately.
Managing Windows Certificates with PowerShell
Managing certificates on Windows is really painful. There is no easy way to do it. The general way to install a certificate to a Windows Server 2008 machine is as follows:
NDC Oslo
Three OpenTable heroes took to Norway last week to attend NDC Oslo. For two of us it was our first major conference and for one, Paul Stack, he had to speak.
Windows Feature Management with PowerShell
In late 2012, our development team started to move towards our systems being much more automated. Long gone are the days of developers creating runbooks in Word and giving them to our operations team to use to set up our production servers.
nLocalGeoCoder
With OpenTable having engineering teams spread across multiple offices it's important for us to maintain open email dialogue about new products us or our teams have created, new tools we've discovered or problem solving approaches that have helped us achieve our goals. Recently in one of these emails Aish introduced the team to a new open source ruby implementation of reverse geocode lookup for latitude and longitude he'd written called local-geocoder. With an interest in understanding how this worked, to learn a bit of ruby, to make this project accessible to .net developers and just to see how long it would take I decided to port it to C# and .net.
Getting Started With SpecRun
We recently switched from writing automated acceptance from Cucumber to SpecFlow... this is no slight on Cucumber it's just that we had a lot of C# developers who wanted to get closer to writing acceptance tests. Worth adding that SpecFlow has also come a long way as a .Net port of Cucumber and is pretty much like for like now.