Adslot Media & Publisher

Campaigns by the A–Team.

Collaboration and Feature Development

At Adslot I have col­lab­or­ated with design­ers, product man­agers, full-stack developers, and QA to cre­ate the best solu­tions for the people who use our products.

One example that shows my col­lab­or­at­ive approach to devel­op­ing new fea­tures was devel­op­ing a new product pre­view cre­at­or. The ini­tial design was a modal as part of the first step of product cre­ation. I star­ted pro­to­typ­ing how this view might inter­act based on the ini­tial designs. I noticed that the user would have to shift modes out of the product setup to cre­ate the pre­view, and then shift modes back again. I thought that the work­flow would be easier to fol­low if we moved product pre­view into its own step. I sketched out a wire­frame and talked through it with the design­er. After explain­ing this solu­tion from a user per­spect­ive we col­lab­or­ated on the wire­frame to reach an even stronger solu­tion.

As a Front–End Developer I am an advoc­ate for good struc­tural inter­face design. I empath­ise with the users and col­lab­or­ate to cre­ate the best experiences.

Application Architecture

I co-led a large refactoring effort of the crucial campaign management section of Adslot. This is a performance critical area, with a lot of application state and business logic. We designed a system to reduce performance bottlenecks and increase maintainability of this codebase. We rewrote the entire data structures to use our newly created partner–facing API. We decided to use a flux-like approach in this AngularJS app; leaning on small immutable data structures, isolated components, and one–way data flow. The old version of this section had hard to fix bugs caused by ad–hoc mutations to data. This new version is much easier to reason about. We recursively freeze data coming from the server via AJAX or websockets. These immutable objects guarantee that the client knows the server’s state. This new version enabled us to build a new campaign briefing feature.


Cli­ent–side frame­works like Angu­larJS give pro­gram­mers a lot of power but don’t guar­an­tee per­form­ance. The Adslot product requires lots of data dis­played in ways that give our users insight and con­trol. This can lead to per­form­ance con­cerns. I pro­file our applic­a­tion to find bot­tle­necks, and apply this know­ledge along with external research. I seek advice from other team mem­bers and share gained know­ledge back to the team to improve our methodologies.

One of the ways we address performance in AngularJS is by making sure that watches just look at the properties that can change. We use immutable data structures where possible so that we just need to watch the object reference instead of a deep watch. When this isn’t possible we watch a picked version of the object with just the mutable properties. Since AngularJS 1.3 we have one–time bound properties in our templates. I have encouraged our team to move away from evaluating functions in our templates, since these run every digest cycle. I balance performance and maintainability, never prematurely optimising at the expense of code readability.

The Rest of the Web–app Stack

I have learnt about package management, build processes, and deployment. We have used Amazon DynamoDB and now use a PostgreSQL database. I have learned best practices for the Node.js backend from the full–stack team. I have worked with our infrastructure team on increasing the linting run on CI. I have learnt how to use Git in a team environment and am now able to help newer colleagues out of any situation. I am comfortable with command–line tools and have worked on tooling for the team.

Automated Testing

I have become proficient at unit testing AngularJS and Node.js JavaScript. I write tests to cover possible cases beyond hitting every branch and function. I have worked with the QA department to solidify our UI tests. I co-led moving our UI tests to Protractor to get more deterministic results when testing AngularJS interfaces.

Go to
Large Screenshot adslot_media_site