We have a full time vacancy in our development team for a creative and methodical web artisan early in their career. If you want to build your skills by working on a mix of challenging and bespoke projects in a supportive environment this could be just the job you're looking for.

What you'll be doing

Working as the third member of our agile cross-functional team you'll be responsible for producing reliable, maintainable and well structured code across the full stack of our projects. You'll lead on individual features and produce the server provisioning and configuration management recipes, automated tests, backend and frontend applications and user interfaces required to deliver them.

You'll craft clean code that delights future developers as much as it does users. You'll relish the challenge of working on legacy code and seeking out ways to improve it. Where you find bugs or missing features in the open source components we use you'll try to resolve them and contribute your changes back to the upstream project - and you'll work with the maintainers to get them merged. You'll take an interest in user behaviour on our sites and find the places where the user experience could be improved.

You'll challenge yourself to continuously improve your skills and the quality of the team's work. You'll enjoy participating in regular code reviews - both giving and receiving constructive feedback - and pair programming sessions.

What you'll be using

We use a wide range of technologies - partly because we believe in always using the right tool for the job at hand, and partly because we've taken on support and future development of a number of legacy projects. We don't expect you to arrive as an expert in all of these, and we'll give you time to experiment with and learn the ones that are new to you. For new work, we try as far as possible to find modern, clean and well structured libraries that lend themselves to dependency injection, mocking and use in our BDD process.

Our current stack includes:

PHP - production
Composer, Kohana framework, Doctrine 1 ORM, Doctrine 2 ORM, Symfony 1, Diem CMF, Symfony console, SWIFTMailer, PHPExcel, Guzzle and more
PHP - development
PHPSpec, PHPUnit, Behat, Mink, Phing
Other build tools
Chef, Vagrant and Berkshelf (Ruby), Jenkins, Travis CI, PhantomJS
Databases and search
mySQL, Apache CouchDB, ElasticSearch
Front-end
HTML5, LESS, Twitter Bootstrap, jQuery, QUnit
Cloud providers
Amazon, Linode, Digital Ocean
Workflow
git, github, Pivotal Tracker

What you'll bring

We are primarily recruiting for personality, aptitude and ability to integrate into our team and our BDD and clean code philosophy. We expect to support you learning specific tools and technologies - but there are obviously some basic essential qualifications and experience you'll need to put to use the minute you start:

  • A solid grounding in web (ideally web application) development with PHP, with around two years experience either professional, voluntary or through regular contributions to quality open source projects.
  • A reasonable understanding of the principles of object oriented programming and modern PHP development. A relevant degree might help with this, but is absolutely not required. Having read http://www.phptherightway.com/ would be a good start, as would an awareness of "Uncle Bob" Martin's clean code principles and http://cleancoders.com/.
  • To be relatively comfortable using distributed version control (ideally git) and the github pull request flow.
  • A flexible approach, logical thinking skills and the ability to communicate with developers, clients and users.

It would be a definite advantage if you had at least a reasonable eye for visual user interface design and/or an interest in arts and culture.

What we'll give in return

In exchange for 35 hours of your time a week, we'll give you:

  • A starting salary around £20-25k.
  • Flexible working hours with the option for some remote working - on a regular schedule agreed in advance.
  • At least 2 hours paid professional development time every week to read, follow training videos, or experiment with new technologies. We're working towards being able to dedicate Friday afternoons to this, but we're not quite there yet.
  • Control over a minimum training budget of £300 a year. We may make more available for specific training we agree is important to the business.
  • 28 days paid holiday a year.
  • 3 duvet days a year.
  • The chance to be paid to work on open source code and - if you want it - to contribute articles to our client or developer blogs.
  • Mentoring, support and encouragement.
  • Interesting and varied projects that make a real difference to users.

Once you've settled in, we will ask you to cover occasional evening and weekend on-call support slots.

How you should apply

Instead of a cover letter, we're asking all applicants to complete and submit a quick coding exercise. You do not have to provide a fully working solution to the problem - only to complete the single class stubbed out at the bottom of the specification. Your class will obviously need to show how it would use the APIs of any collaborators, but you do not need to show these other classes, the template, or anything outside that single class file.

A client wants their site to show a calendar that acts like a heatmap of ticket availability at a specific venue over the month. It should:

  • display a cell for each day in the selected month
  • show the number of individual performances at the selected venue on each day
  • colour each day's cell based on the average performance availability, and show a text status on hover, as follows:
Average % of tickets availableColourLabel
80% - 100%#607f66Excellent
50% - 80%#b5f0c0Good
20% - 50%#faebccSelling fast
2% - 20%#ebccd1Limited
0% - 2%#e5a589Sold out

We have access to two data sources. The website CMS uses a NoSQL database that stores JSON objects like this:

{
    "event": {
        "code":  "JAMEJACK",
        "title": "James Jackson in concert",
        "venue": "Edinburgh Arena",
        "performances": [
            {
                "id":     991392930,
                "start":  "2014-08-03T19:30:00+0100",
                "end":    "2014-08-03T20:30:00+0100"
            },
            {
                "id":     991392989,
                "start":  "2014-04-09T19:30:00+0100",
                "end":    "2014-04-09T20:30:00+0100"
            }
        ]
    }
}

The ticketing system exposes an xml dataset like this:

<sales>
    <performance id="991392929" capacity="270" sold_count="30">
    <performance id="991392930" capacity="110" sold_count="90">
    <performance id="991392931" capacity="150" sold_count="3">
    <!-- etc -->
</sales>

We want you to implement the following class, which is responsible for collecting the required data and processing it ready to be displayed by the template.

<?php
class AvailabilityCalendarPresenter {

  /**
   * @param string $venue_name
   * @param int    $month
   * @param int    $year
   */
  public function display($venue, $month, $year) {
    // The application will call this method and expects to get back the data ready for display in the template.
    // Depending on your background you might be used to doing this work in your controller, viewmodel or view layer.
    // You DO NOT have to: 
    // - implement any collaborator classes - just assume they exist and show how you'd use them.
    // - care about error handling - assume all input will be good 
    // - care about performance - we'll assume that you'll refactor later if required.
    // - produce something that actually works. We'll ignore the odd typo too if your intent is clear.
  }

}

There is no correct solution, but we're interested to see how you approach the problem and how you structure your code.

How you should send your application

Fill in your details on our quick online form. If you have trouble with the embedded form below you'll find it here.

The closing date for applications is 9:00AM on Monday 31 March 2014. Good luck!

Job details

Title
Web developer
Salary
£20-£25,000 pa
Contract
Permanent, Full Time
Closing date
9:00AM on Monday 31 March 2014
Andrew Coulton
By Andrew Coulton

Founder & technical lead
Twitter Linkedin Google+ Github

Andrew formed inGenerator after almost 13 years in roles supporting delivery of the arts in Scotland, and a lifetime of writing code. Read full biography.