Jekyll2022-05-05T12:04:18+00:00https://whitston.org.uk/feed.xmlDaniel WhitstonI'm a London-based developer and technical manager. I post infrequently about software engineering, event and community organising, and welfare / social security systems.Tech test adventure: Arbitrary discount rules and the strategy pattern2017-05-17T00:00:00+00:002017-05-17T00:00:00+00:00https://whitston.org.uk/2017/05/17/tech-test-adventure-arbitrary<h2 id="part-1-the-gildedrose">Part 1 - The Gilded Rose</h2>
<p>A couple of months back, I took on the <a href="https://github.com/emilybache/GildedRose-Refactoring-Kata">Gilded Rose kata</a>. In that test, you’re given a small piece of legacy code with lots of nested conditionals, which causes the stock of a fantasy tavern to change in quality and sale price as each day passes. The task is to refactor the code and add a new rule, without changing any of the existing functionality.</p>
<p>Never one to take the easy route, I really wanted to find a way to represent the various rules governing the decay and change in price over time in a way that separated them out from each other, without hardcoding the specific rules in the structure. I wanted the solution to be applicable regardless of the implemented rules, and to play nicely with large numbers of interacting rules.</p>
<p>This was somewhat outside of the original spec, but is a common issue in the ‘real life’ situation that the spec was modelling - almost any role-playing game has to grapple with issues of emergent interaction between different effects and characteristics. It was also an interesting technical challenge.</p>
<p>The thing I was trying to do was to iterate through each rule in turn, starting with the current age and quality score, testing if the rule applied, applying the rule to change the age and quality if so, then passing the new age and quality to the next rule.</p>
<p>My <a href="https://github.com/DanielJohnston/GildedRose-Refactoring-Kata/tree/master/ruby">attempt at a solution to the Gilded Rose</a> worked just fine, but the abstraction to a model was messy, and the rules code was almost less readable than the original. In discussion with the person setting the test, I was pointed to the <a href="https://en.wikipedia.org/wiki/Strategy_pattern">strategy pattern</a>.</p>
<p>The strategy pattern codifies a structure for swapping out methods on the same base object class, which gives an elegant way of using the same information, structure and base code, while individualising the operation of rules (such as, say, #applies? and #update_quality and #update_age).</p>
<h2 id="part-2-a-range-of-discountrules">Part 2 - A range of discount rules</h2>
<p>Cut to last week. I was set the task of <a href="https://github.com/DanielJohnston/techtest-honeycomb">creating a product order process</a>. Most of it was straightforward, and I’ve implemented and worked with ecommerce systems enough that I had a good idea of what the eventual structure would look like.</p>
<p>However, the meat of the test was giving salespeople the ability to try out different discounts on orders. A couple of discounts were specified, but the door was open to more being added. The existing discount rules acted on the order total, the quantity of specific order types, and reduced prices of specific order types or added a %discount to the entire order. Further, the rules could interact such that the order they were applied in affected the final price. A %discount to the entire order should only be applied at the end, for example.</p>
<p>This means that the solution needed to:</p>
<ul>
<li>Enable discount rules to ‘see’ and affect elements of an order and the total</li>
<li>Make it easy to add new rules without refactoring existing ones</li>
<li>Make it possible to choose which discounts to apply to an order</li>
<li>Apply selected rules in a pre-set order to prevent incorrect application</li>
</ul>
<p>Applying the same steps but with differing rule contents each time? With a selected set of rules for each order? Sounds like it’s time to bust out the strategy pattern! (With a side order of builder pattern!)</p>
<h3 id="poking-thebear">Poking the bear</h3>
<p>I used a TDD approach, going from feature test to unit test to class and method definition. My initial focus was on getting the basic order functionality right , extracting classes as necessary to maintain separation of concerns.</p>
<p>However, I didn’t immediately see a good way to start moving forward on creating a list of discounts, then applying them using the strategy pattern. I used a <a href="https://github.com/DanielJohnston/techtest-honeycomb/blob/20d0d42032d0160ee547bc09d4174f6aed818fbb/lib/order.rb">#discount_total method within the order</a> as an immediate solution, with the intention of extracting and abstracting later, once the rest of the structure was in place.</p>
<h3 id="rousing-thebear">Rousing the bear</h3>
<p>Within fairly short order, I had <a href="https://github.com/DanielJohnston/techtest-honeycomb/tree/20d0d42032d0160ee547bc09d4174f6aed818fbb">working code</a>, that met the feature tests defined by the spec. Two issues, though:</p>
<ul>
<li>The solution as-was didn’t allow for selective application of discounts</li>
<li>Discounts were applied by a lump of code in the Order class, which didn’t smell right and didn’t bode well for adding further discounts</li>
</ul>
<p>Definitely time to try that strategy pattern, then. I extracted out the discount code to its own class as a prelude; test-driven of course. Then I created a DiscountList class to hold each discount, and at the same time used the strategy pattern to split each discount rule into a separate class that got injected into the Discount class at time of instantiation. Then it got ugly.</p>
<p>The quantity and complexity of code changes led to substantial changes in the codebase throughout the chain of classes. This backdrop of complexity didn’t mesh terribly well with figuring out how to pass objects through the chain of classes and instances. In order to do their jobs, the discount rules needed access to details on deliveries and prices, and to a running subtotal as each discount was applied in turn. The easiest place to put the code to pass this information, and iterate through each discount rule, turned out to be… back in the Order class.</p>
<p>This meant that <a href="https://github.com/DanielJohnston/techtest-honeycomb">the eventual solution</a> still entailed running a lump of code in the main ordering class, and passing objects in and out of methods in ways that were far from elegant. The lack of storage within the Discount class raises questions as to whether it’s a true implementation of the strategy pattern, and likewise with the builder pattern and the various container classes’ inability to add contents through composition.</p>
<p>On the plus side, the solution did make it possible to cleanly add further discounts, and to apply them selectively to individual orders, so the intent of the specification was met. While a pre-set order of applying discounts is still pending, it’s not difficult to add, and will only cause problems if an operator specifically applies the discounts the wrong way round.</p>
<h3 id="better-bear-wakingmethods">Better bear waking methods?</h3>
<p>There’s room to extract the code from the existing solution into a further class, such as OrderLine or perhaps the existing DiscountList. I’m uncertain as to a couple of things, though:</p>
<ul>
<li>Is there a better way of structuring this solution, perhaps injecting DeliveryList instances into Discount or DiscountLine instances at time of creation, so they don’t have to be passed back and forth as method arguments each time?</li>
<li>Is there a better way of TDDing this solution? Creating each class was simple enough using unit testing, but the stage where I pulled the discounts, discount_list, and order together was not pretty. I had to rely on the feature tests a lot to make it through that, to the extent that I managed to miss out on unit tests to TDD a method in the Order class, at first.</li>
</ul>
<p>Suggestions and comments welcome. I deliberately haven’t attempted to find an equivalent to this tech test elsewhere yet, but I suspect it’s actually a pretty unusual one.</p>
<h2 id="part-3-the-wrongbear">Part 3 - The Wrong Bear</h2>
<p>After posting the first two sections, I interviewed with the organisation who set the test. A simple request, ‘make a discount that discounts the total by 20% in July for sales over £30’, blew up my approach. To implement this new discount, I needed to both implement a new strategy and add an exclusion to an existing one, the ‘default’ 10% discount on an order above £30, so that the new discount acted in place of that one. This proves there isn’t a separation of concerns. It would be easy to find more discounts that interacted with each other in various similar ways, each one leading to more code complexity to make up for the separate patterns.</p>
<p>I was left with a few unappetising options for the immediate requirement:</p>
<ol>
<li>Create a new strategy as its own class, and modify the affected strategy so that it wasn’t applicable in July while the new one was</li>
<li>Add the July strategy into the existing discount total by 10% strategy, using an if-then-else structure to change what happened. The name returned by the discount would also need to change (!)</li>
<li>Add some kind of selection rules above the strategies, undermining the point of using a strategy pattern in the first place</li>
</ol>
<p>I went with the first option, as a way of attempting to preserve the intention behind the strategy pattern, and it worked out precisely as badly as I’d suspected. The strategy pattern turned out to be a millstone that multiplied the amount of work with each interaction.</p>
<p>The underlying issue is that I’d assumed that manual selection of discounts, a pre-set order of applying discounts, and a running subtotal, would be enough information to manage interaction between discounts. I’d neglected to consider that new discounts might need to supplant existing discounts in certain situations. I’d also assumed that salespeople would be choosing discounts on an individual basis for customers, rather than setting up rules for selecting which discounts to apply when.</p>
<p>The interviewer suggested that moving toward a YAML file with discounts set up using a simple ruleset on pre-defined types of discount was the appropriate way forward. I’ve set up simple workflow-style parsers before, and will update this post as and when I switch to that approach. It may be easiest to TDD in this direction by using the second development option from the above list, that of varying rules within each ‘strategy’, and then transitioning the strategies to a new role as template rules.</p>
<p>It’s mildly embarrassing theming a post around usage of a pattern and then being shown that it’s not appropriate for the chosen example. It’s also a valuable experience in its own right. I’ve left the previous text as-is; a useful reminder of the dangers of being too gung-ho with a beautiful solution that doesn’t quite match the problem.</p>
<p><strong>Update 20/5</strong> - I’ve updated the repo with the interview requirement using the second approach. Holding off on YAML until I get a bit more time, and also to think about how to deal with an if-then-else structure with a range of possible conditions.</p>
<h2 id="bonus-video">Bonus video</h2>
<p>The Gilded Rose is open to a huge range of ‘solutions’. The following video of a Gilded Kata refactoring in Ruby, by Sandi Metz, walks through a solution that’s both elegant and fun to watch:</p>
<div class="videowrapper"><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/8bZh5LMaSmE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>
<h2 id="bonus-legacy-refactoring-note">Bonus legacy refactoring note</h2>
<p>I was really proud of something I did at the start of the Gilded Rose. I wrote a <a href="https://github.com/DanielJohnston/GildedRose-Refactoring-Kata/blob/master/ruby/generate_data.rb">small piece of code</a> which ran against the existing code base and generated hundreds of test specs, covering the changes over time to each type of item in the tavern stores. This made it trivial to check that later refactoring didn’t introduce any regressions in behaviour.</p>
<p>Unfortunately, the <a href="https://github.com/DanielJohnston/GildedRose-Refactoring-Kata/blob/master/ruby/gilded_rose_conformance_spec.rb">conformance testing code</a> wasn’t well structured at the time of submission, and reached a level of complexity that called for its own tests! I’d not really intended it to be the ‘body’ of the solution, as it was more of a bonus check, but it was rightly considered as part of the overall result. It introduced a level of complexity that was seen as exceeding that required by the test spec. Can’t win them all the time, I guess!</p>
<hr />
<p><em>Originally published at <a href="https://medium.com/@danwhitston/tech-test-adventure-arbitrary-discount-rules-and-the-strategy-pattern-4675d590036e">https://medium.com/@danwhitston/tech-test-adventure-arbitrary-discount-rules-and-the-strategy-pattern-4675d590036e</a> on May 17, 2017.</em></p>Daniel WhitstonPart 1 - The Gilded RoseBrowser testing for Ruby from within Windows Subsystem for Linux2017-05-14T00:00:00+00:002017-05-14T00:00:00+00:00https://whitston.org.uk/2017/05/14/browser-testing-for-ruby-from<p>This is a rough guide to setting up browser testing through Selenium on Windows Subsystem for Linux (WSL), aka Bash on Ubuntu on Windows. It assumes the following environment:</p>
<ul>
<li>Windows 10, running WSL</li>
<li>A Ruby dev environment, running inside WSL</li>
<li>Code that we want to test using a web driver, in this case Selenium, with a Capybara and RSpec test framework</li>
</ul>
<p>The coding project folders are stored in the main Windows filing hierarchy and accessed via dev/mnt, but that makes no real difference to development and testing other than making it possible to edit the code using a GUI based editor within Windows.
The problem with browser testing in WSL is that it relies on opening and controlling a web browser, and browsers don’t work on WSL at present as it deliberately doesn’t include X Windows or some other GUI manager - it’s meant to be command line after all. So while you can <code class="language-plaintext highlighter-rouge">apt-get firefox</code>, trying to actually run it isn’t going to work.</p>
<h2 id="some-possible-solutions">Some possible solutions</h2>
<h3 id="give-wsl-a-graphical-interface">Give WSL a graphical interface</h3>
<p>This kind of goes against the point of WSL, but <a href="https://github.com/Microsoft/BashOnWindows/issues/1169#issuecomment-252148854">is apparently possible</a>. The idea is to run an X server in Windows and connect it to WSL. I haven’t tried this out yet as it feels slightly horrifying.</p>
<h3 id="run-tests-on-a-local-virtualmachine">Run tests on a local virtual machine</h3>
<p>Anything with GUI functionality should get round this issue, and using Docker in particular might open a path to easy automation so it’s not too awkward to run tests during development. This would be important, as I’d prefer not to manually spin up and run tests on a VM each time I want to run tests during coding, at least not at this point. I’ve played with Docker and with Windows’ own virtualisation software, and used to use VirtualBox as a mildly clunky dev environment. However, I haven’t quite reached a workable Dockerfile for my own purposes yet.</p>
<h3 id="run-tests-on-a-remote-ciserver">Run tests on a remote CI server</h3>
<p>CI tools such as Travis can happily run browser tests in a VM, and offer a free integrated service on GitHub repos. This isn’t useful for swift checking of code, or for working through issues in a REPL such as IRB or Pry.</p>
<h3 id="use-a-headlessbrowser">Use a headless browser</h3>
<p>I’ve had luck using gems such as Mechanize, but the obvious choice, PhantomJS, has been <a href="https://github.com/Microsoft/BashOnWindows/issues/903">pretty painful to get working in WSL</a>. This would obviate the X Windows issue, but <a href="https://watirmelon.blog/2015/12/08/real-vs-headless-browsers-for-automated-acceptance-tests/">isn’t as thorough as driving a GUI browser</a>.</p>
<h3 id="launch-and-drive-a-windows-test-suite-directly-fromwsl">Launch and drive a Windows test suite directly from WSL</h3>
<p>There’s a tool called Windows Application Driver that <a href="https://github.com/Microsoft/BashOnWindows/issues/1169#issuecomment-252659238">could potentially be driven using the to-be-launched interoperability</a> between WSL and Windows.</p>
<h3 id="run-a-windows-selenium-server-and-remotedriver">Run a Windows Selenium server and remote driver</h3>
<p>This appears to be the recommended and the cleanest approach. Set up a Selenium server in Windows, and then use a remote client in WSL to carry out testing. Both WSL and Windows have access to the same localhost, so this isn’t that complex in theory.</p>
<h2 id="implemented-solution-windows-seleniumserver">Implemented solution - Windows Selenium server</h2>
<p>To set up the Windows Selenium server:</p>
<ul>
<li>Download the Selenium server for Windows</li>
<li>Install Java for Windows</li>
<li>Run the server from CMD or Powershell in Windows. If you run into a port conflict, as I did, you’ll need to set a different port when starting the server, by using e.g. java -jar .\selenium-server-standalone-3.0.1.jar -port 4445. There are some more instructions on the Selenium website.</li>
<li>You should now be able to see the server at <a href="http://localhost:4445/wd/hub/static/resource/hub.html">http://localhost:4445/wd/hub/static/resource/hub.html</a></li>
</ul>
<p>That should get the server up and running. However, it’s still necessary to have some ‘glue’ that connects the server to the browser, for example Chromedriver or Geckodriver, and for the server to know where to find both the glue and the browser executable.</p>
<h2 id="for-firefox-incomplete">For Firefox (incomplete)</h2>
<ul>
<li><a href="https://github.com/mozilla/geckodriver/releases">Install geckodriver</a> on Windows. Note that the modern webdriver for Firefox is now known as Marionette, but that, if I understand correctly, the old webdriver is used for remote connections such as the one we’re setting up.</li>
<li>Try something similar to the Chrome code below, but with :firefox instead of :chrome</li>
<li>Get errors such as <code class="language-plaintext highlighter-rouge">'Selenium::WebDriver::Error::UnknownError: The path to the driver executable must be set by the webdriver.gecko.driver system property'</code> and try Chrome instead</li>
</ul>
<p>Worth noting: <a href="http://toolsqa.com/selenium-webdriver/how-to-use-geckodriver/">this page</a> suggests that the path to geckodriver can be set in the file properties of the Selenium server executable, which seems more useful than the standard instructions on how to include the path in a Java program, and may resolve the issue.</p>
<h2 id="for-chrome-implemented">For Chrome (implemented)</h2>
<ul>
<li><a href="https://sites.google.com/a/chromium.org/chromedriver/downloads">Download Chromedriver</a>, and place it in the Windows PATH where it can be found automatically. I went overboard and copied it to a few places, just to be sure</li>
<li>Ensure Chrome can be reached at the default location of <code class="language-plaintext highlighter-rouge">C:\Users\%USERNAME%\AppData\Local\Google\Chrome\Application\chrome.exe</code> - I created a shortcut to the actual location on my setup. You can find the actual location via <code class="language-plaintext highlighter-rouge">chrome://version/</code></li>
<li>There’s also <a href="https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver">some useful info in the Selenium docs</a></li>
<li>If I’m reading those docs correctly, it may be possible to run Chromedriver directly without a separate Selenium server, but this is the way I’ve done it for now</li>
</ul>
<p>Once the server’s all up and running, the following should do the trick in Ruby:</p>
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="nb">require</span> <span class="s1">'selenium-webdriver'</span>
<span class="k">def</span> <span class="nf">setup</span>
<span class="vi">@driver</span> <span class="o">=</span> <span class="no">Selenium</span><span class="o">::</span><span class="no">WebDriver</span><span class="p">.</span><span class="nf">for</span><span class="p">(</span><span class="ss">:remote</span><span class="p">,</span> <span class="ss">:url</span> <span class="o">=></span> <span class="s1">'http://localhost:4445/wd/hub'</span><span class="p">,</span> <span class="ss">:desired_capabilities</span> <span class="o">=></span> <span class="ss">:chrome</span><span class="p">)</span>
<span class="c1">#@driver = Selenium::WebDriver.for :chrome</span>
<span class="vi">@base_url</span> <span class="o">=</span> <span class="s2">"http://www.google.com/"</span>
<span class="vi">@driver</span><span class="p">.</span><span class="nf">manage</span><span class="p">.</span><span class="nf">timeouts</span><span class="p">.</span><span class="nf">implicit_wait</span> <span class="o">=</span> <span class="mi">30</span>
<span class="vi">@verification_errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">end</span></code></pre></figure>
<p>Now just run:</p>
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">setup</span>
<span class="vi">@driver</span><span class="p">.</span><span class="nf">get</span> <span class="s2">"https://google.com"</span></code></pre></figure>
<p>Further <a href="https://github.com/SeleniumHQ/selenium/wiki/Ruby-Bindings">examples of methods and usage</a> <a href="https://community.perfectomobile.com/posts/938840-ruby-example-for-remotewebdriver">are available</a>.</p>
<h2 id="using-capybara-with-a-remote-seleniumserver">Using Capybara with a remote Selenium server</h2>
<p>The above solution successfully controls a browser through <code class="language-plaintext highlighter-rouge">@driver</code>. However, when using the above solution in IRB after requiring capybara and selenium-webdriver, ‘visit’ is an undefined method unless forced in with <code class="language-plaintext highlighter-rouge">@driver.extend Capybara::DSL</code>, at which point it appears to drop to a default driver. From various stories elsewhere, it appears that recent versions of Capybara may be limiting their functionality to scripts in spec_features.</p>
<p>Using the remote driver solution with actual Capybara tests in RSpec is a somewhat easier experience. Just add the following lines to spec_helper.rb, straight after defining the <code class="language-plaintext highlighter-rouge">Capybara.app</code>:</p>
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># This sets Capybara up to use a REMOTE Selenium server </span>
<span class="no">Capybara</span><span class="p">.</span><span class="nf">javascript_driver</span> <span class="o">=</span> <span class="ss">:selenium_remote_chrome</span>
<span class="no">Capybara</span><span class="p">.</span><span class="nf">register_driver</span> <span class="s2">"selenium_remote_chrome"</span><span class="p">.</span><span class="nf">to_sym</span> <span class="k">do</span> <span class="o">|</span><span class="n">app</span><span class="o">|</span>
<span class="no">Capybara</span><span class="o">::</span><span class="no">Selenium</span><span class="o">::</span><span class="no">Driver</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="n">app</span><span class="p">,</span> <span class="ss">browser: :remote</span><span class="p">,</span> <span class="ss">url: </span><span class="s2">"http://localhost:4445/wd/hub"</span><span class="p">,</span> <span class="ss">desired_capabilities: :chrome</span><span class="p">)</span>
<span class="k">end</span></code></pre></figure>
<p>Now, when you create a spec that requires JavaScript to complete, Capybara will successfully call the remote Selenium server and return the appropriate result:</p>
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">feature</span> <span class="s1">'Enter names'</span> <span class="k">do</span>
<span class="n">scenario</span> <span class="s1">'submitting names'</span><span class="p">,</span> <span class="ss">:js</span> <span class="o">=></span> <span class="kp">true</span> <span class="k">do</span>
<span class="n">visit</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)</span>
<span class="n">fill_in</span> <span class="ss">:player_1_name</span><span class="p">,</span> <span class="ss">with: </span><span class="s1">'Dave'</span>
<span class="n">fill_in</span> <span class="ss">:player_2_name</span><span class="p">,</span> <span class="ss">with: </span><span class="s1">'Mittens'</span>
<span class="n">click_button</span> <span class="s1">'Submit'</span>
<span class="n">expect</span><span class="p">(</span><span class="n">page</span><span class="p">).</span><span class="nf">to</span> <span class="n">have_content</span> <span class="s1">'Dave vs. Mittens'</span>
<span class="k">end</span>
<span class="k">end</span></code></pre></figure>
<hr />
<p><em>Originally published at <a href="https://gist.github.com/DanielJohnston/5cea26ae0861ce1520695cff3c2c3315">https://gist.github.com/DanielJohnston/5cea26ae0861ce1520695cff3c2c3315</a>. This post’s recommendations are somewhat outdated: WSL2 was released, PhantomJS was deprecated, headless browser automation in general works better now. So take the advice with a pinch of salt.</em></p>Daniel WhitstonThis is a rough guide to setting up browser testing through Selenium on Windows Subsystem for Linux (WSL), aka Bash on Ubuntu on Windows. It assumes the following environment:Paid in Full - work and rewards in Nine Worlds2015-01-19T00:00:00+00:002015-01-19T00:00:00+00:00https://whitston.org.uk/2015/01/19/paid-in-full-work-and-rewards<p>When we founded Nine Worlds, we had a few core aims in mind. We wanted to build an annual, London-based residential event with lots of content covering lots of interests. We wanted to include historically marginalised or disadvantaged groups, and to bridge the gaps between different communities. We wanted to increase our knowledge and improve the convention year-on-year by using the same core team and resources. And we wanted to do so in a sustainable and non-exploitative way.</p>
<p>Since then, many people have put a lot of time, work and love into making Nine Worlds what it is now. We’ve succeeded in most of our aims, and the event is growing rapidly. However, we’ve reached a point where we need to make some decisions to ensure that Nine Worlds has a long term future that doesn’t exploit its organisers, guests or attendees. It’s time to articulate more clearly how we will seek to ensure that all involved with the event are treated fairly.</p>
<h2 id="what-do-we-do-to-make-nine-worlds-non-exploitative-and-sustainable">What do we do to make Nine Worlds non-exploitative and sustainable?</h2>
<p>We don’t support the widespread use of unpaid internships and ‘but the experience will look good on your CV’ for professional workers. Equally, we can’t pay an hourly rate for every organiser, steward and speaker without upping the ticket price to at least £800. We seek to operate on the basis of a clear, mutual understanding of what people give and gain from involvement with the convention, and review this each year to ensure that there’s an equitable trade off. This applies to attendees, organisers, guests and commercial suppliers, and we’ve laid out our rough expectations of the relationship with each as follows.</p>
<h3 id="full-time-organisers">Full time organisers</h3>
<p>The event’s full time organisers are a hive mind of three people, Dan, Ludi and Erich. The intention was always to keep this central team from year to year, and building up the convention rather than recreating it from scratch each time has really helped us to improve on the inclusivity and quality of experience of attendees. At this point, we have each put in several thousands of hours without pay of any kind. That’s substantially more than is reasonable or possible to expect on a permanent basis.</p>
<p>Therefore, for the 2015 event, Dan and Ludi will use a portion of event income to cover living expenses. It won’t be much, but it will provide enough of a top up to our other incomes that we’ll be able to work on the event without struggling financially as a result. None of the 2013 or 2014 event income has been or will be used for this purpose, and no money was carried forward from either event. This <em>is</em> our day job for the months around the event, and we’re exploiting ourselves if we don’t recognise that.</p>
<h3 id="part-time-organisers">Part time organisers</h3>
<p>In addition to the hive mind, around 40 organisers manage volunteer wrangling, registration, tech, vendors, marketing, accessibility, press, and each of the dozens of tracks. These roles can be very rewarding - engaging with the wider community, the pleasure of creating and executing a project, the joy of curating sessions around your favourite interest and interacting with leading figures in the field in question, and the gaining of new skills and experience are all valued by our organisers.</p>
<p>None of the positions are paid, and we work hard to ensure that they don’t become just unpaid work or impinge on people’s day jobs. For example, we generally treat professional accountants, designers and the like as commercial suppliers since the work is clearly an extension of the day job that they get paid for. We also try to ensure that nobody incurs costs from their carrying out of the role, and we encourage the recruitment of deputies for most tracks and functions to spread the load and provide backup.</p>
<p>Despite their many positives, organiser roles are also the most tricky to balance. Some of them are critical to the convention’s success, but we don’t want to place undue pressure on those involved and want to ensure the rewards match the effort involved.
Our experience to date is that, each year, two or three of the roles become onerous to those engaged with them. The hive mind and other organisers jump in to help, but this still makes the experience less positive than it could be for those individuals. Nobody has expressed regret to us that they were involved with Nine Worlds, but it is important to us that people have a full understanding of the work involved in any commitments they make. We’re exploring ways of improving our modelling, management and support of organising roles, and will discuss this with individual organisers as part of agreement for their contribution to the 2015 event.</p>
<h3 id="on-site-helpers">On-site helpers</h3>
<p>Many attendees choose to help out with the running of the convention, whether by stewarding, helping with registration, or setting up and tearing down equipment. There is no compulsion to do this, and people choose to help because it enhances their overall experience of the event and gets them more involved. However, we do offer rewards intended to ensure that people do not lose out by their support of the event. These may include recognition of their contribution in the form of t-shirts or mementos, reduced or free entry, and snacks or drinks while on duty. The volunteer coordinator will send out more details closer to the time of the event. To be clear, we do not operate a ‘groats’ system of payment in vouchers, as our view is that that constitutes a payment for work. We want people to help out because they’re having fun, not because of the rewards on offer.</p>
<h3 id="commercial-suppliers">Commercial suppliers</h3>
<p>We make commercial arrangements in the same way as any other organisation. Currently, we have no arrangements which leverage our event’s status to obtain favourable rates. As policy, we try to treat professionals working in their field of expertise as commercial suppliers, in order to avoid exploiting those who work with us.</p>
<h3 id="guests">Guests</h3>
<p>Different fields of work have substantially different expectations for event appearances. In our experience, writers attend to market their work and to connect with the wider community, and often allocate costs as a business expense. Performers and actors may expect payment for attendance. Academics don’t expect payment, but may request coverage of expenses. In general, if somebody is coming to the convention specifically to appear as a guest, and would not be attending otherwise, then we do not charge for entry. Any further agreements are made individually. Given the breadth of interests at Nine Worlds, it would be very unusual for us to pay a substantial amount for an individual guest. Instead, we’re reliant on finding guests who gain from attending the event, sharing their thoughts and interacting with the Nine Worlds community.</p>
<h3 id="attendees">Attendees</h3>
<p>The ticket price for Nine Worlds is comparable to that for other weekend residential fandom conventions, especially those that take place in similar venues. We’re happy that less than £100 for three full days of panels, games, workshops, parties and performances is a good deal. It’s more than many expos, but expos do not have over 400 programme items and 30 different content tracks, and most of their content relies on further purchasing of e.g. merchandise, signatures or photographs.</p>
<p>Our aim is to provide a full experience at the basic ticket price, without placing large proportions of content behind further paid barriers. However, we have and will continue to have a small number of paid workshops each year, both to cover additional costs for specialised content and to limit numbers for popular items. These have included swordplay workshops, gin tastings and liqueur design. These have made up less than 1% of all programme items to date, and we don’t see that increasing substantially.
In our current location, there are unavoidable additional costs for accommodation and travel. We’re looking at other options in the longer term, but will ensure that we don’t drastically change the overall cost of attendance without fair warning.</p>
<h2 id="what-do-other-types-of-convention-do">What do other types of convention do?</h2>
<p>In recent times, there have been two main types of fan event in the UK:</p>
<ul>
<li>Volunteer-run conventions tend to be organised by a different core team every year, who are voted in to host the event after presenting a bid to a previous event’s ticket holders, and work on an entirely unpaid basis. Guests are usually not paid, although travel and rooms may be reimbursed. There’s a strongly defined culture and language, and such events normally top out at 1,000 or so attendees.</li>
<li>Commercial conventions or expos, such as the various Comic Cons or meet-the-cast events for TV shows, frequently charge a smaller entry fee, still rely on volunteers for stewarding and related functions, and make money by charging for large numbers of stallholders or paid signings and photographs with celebrities. They generally do not focus on programming.</li>
</ul>
<p>Both approaches can offer great value to attendees, but they also impose limitations on what can be achieved, and neither of them is immune to charges of exploitation. Volunteer-run conventions are resistant to ‘gouging’, i.e. using position power to make excessive profits, and offer a way for people to give back to their community without feeling that they’re being taken advantage of. However, organiser burnout from the heavy workload is a recognised issue, and the burden on core staff is part of the reason that different teams run the event each year. Also, no pay doesn’t mean no power or no privilege, and the strong community focus can make them initially quite tricky for newcomers to fully engage with and appreciate. Commercial fan conventions need to produce commercial returns, and this can’t come from tickets as nobody is willing to pay the hundreds of pounds that corporate events charge. So instead it comes from a focus on selling signatures, photos, merchandise and other goods. This creates a strong commercial incentive to minimise unpaid entertainment and content options at expo-style events.</p>
<p>As with all generalisations, there are not just individual but entire categories of counter-example. For instance, video games expos have lots of free video gaming, which is provided by the game producers as a way of marketing their products. The split also doesn’t work the same in other countries - e.g. SDCC is a non-profit event that looks from the outside like a huge commercial expo, but also has a lot of content lurking inside. And Dragon Con is the canonical example of a massively multi-track pop culture convention with relatively low entry costs and a huge mix of paid and unpaid content, relatively little of which is expo-style.</p>
<hr />
<p><em>Originally published at <code class="language-plaintext highlighter-rouge">https://danieljohnston.co.uk/2015/01/19/paid-full-work-and-rewards-nine-worlds</code> on January 19, 2015.</em></p>Daniel WhitstonWhen we founded Nine Worlds, we had a few core aims in mind. We wanted to build an annual, London-based residential event with lots of content covering lots of interests. We wanted to include historically marginalised or disadvantaged groups, and to bridge the gaps between different communities. We wanted to increase our knowledge and improve the convention year-on-year by using the same core team and resources. And we wanted to do so in a sustainable and non-exploitative way.Inclusion and Safer Spaces2014-01-22T00:00:00+00:002014-01-22T00:00:00+00:00https://whitston.org.uk/2014/01/22/inclusion-and-safer-spaces<p>I’ve been thinking a lot about the tension that exists in creating inclusive spaces since last Nine Worlds. We got a lot of positive feedback with regard to inclusivity, diversity, and the perception of safety at the event. This particularly focused on LGBTQ and women attendees; race and disability were more problematic, and that’s something we’re working to improve on this coming year.</p>
<p>However, one of the common elements of feedback was that we were seen as a safe space. Given this term invites misinterpretation, it’s worth exploring what we’re trying to do with Nine Worlds, and what we aren’t.</p>
<p>First, some history <em>adjusts spectacles</em>. The concept of safer spaces originates in LGBTQ and feminist activism, and has several formulations. It does not denote a space where there is no danger of assault or offensive speech or views. It does not denote a space that is generically ‘inclusive’. In general use, it often means a space that excludes people who are not members of the group in question (e.g. a safe space for women would exclude men), but can also mean the attempted creation of a non-discriminatory environment through a mix of communication, education and policing.</p>
<p>What we’re trying to do with this convention is to create a maximally inclusive space. That is, a space that welcomes many different groups of people, including those that have often felt unwelcome or experienced discrimination at conventions more generally. Our focus covers interaction between groups and fandoms in geek culture more generally (e.g. discrimination against MLP fandom or fanfic authors) in addition to discrimination on the grounds of gender, race, disability etc. This partly fits with the non-discriminatory definition of a safe space, but is entirely different from the idea of an exclusionary, single group safe space.</p>
<p>So, could Nine Worlds be a safer space? Yes. Could it be safer and still inclusive of and attractive to a range of different groups of attendees? Yes, but with more limits. Bringing together different groups means bringing together different cultures and expectations of reasonable behaviour, and this will inevitably increase the overall likelihood of someone’s behaviour being experienced as offensive. No gathering is entirely safe, nor can it ever be. Instead, we can communicate our position and expectations clearly, listen when things go wrong (or right!), and take the actions that we’re capable of to make it as safe as is reasonably possible. There is a fundamental tension between inclusion and safety, and we are committed to maintaining both to the best of our abilities.</p>
<hr />
<p><em>Originally published at <code class="language-plaintext highlighter-rouge">https://danieljohnston.co.uk/2014/01/22/inclusion-and-safer-spaces</code> on January 22, 2014.</em></p>Daniel WhitstonI’ve been thinking a lot about the tension that exists in creating inclusive spaces since last Nine Worlds. We got a lot of positive feedback with regard to inclusivity, diversity, and the perception of safety at the event. This particularly focused on LGBTQ and women attendees; race and disability were more problematic, and that’s something we’re working to improve on this coming year.Driving sales with CRM2013-12-02T00:00:00+00:002013-12-02T00:00:00+00:00https://whitston.org.uk/2013/12/02/driving-sales-with-crm<p>There are exactly one gazillion online CRM systems nowadays, and a weird lack of summaries online, so I thought I’d publish some of the rough notes I pulled together as part of a recent review. The situation is important, as different CRMs are best suited to different purposes. The company I was working with had a requirement for the system to drive sales activity, and a small team using Google Apps and Android phones. That means the solution I settled on is the one I thought best for this particular focus.</p>
<h2 id="pipedrive">Pipedrive</h2>
<p>Lovely UI. Sales-focused, and specifically designed around tracking and managing a sales pipeline. This makes the ‘it just works’ and initial barrier substantially lower. I’d estimate maybe one day to set up and train on. Supports multiple pipeline types. No Android app although one appears to be in the works. Full two-way Google Calendar and Contacts integration. Has a custom email address to bcc or forward emails to, but no GMail widget to link everything together, although one appears to be in the works. ~£18/month for up to 5 users.</p>
<p>Verdict: Very suitable. We went with this and it’s been a joy to use so far, and really helps to improve the sales focus. Some of the more advanced features aren’t as useful as they’re presumably intended to be, specifically the activity statistics, which has a habit of double counting activities if you e.g. set and complete a task to send an email and then import the email into your account as well. Proper GMail and Android integration will improve things further, but it’s really rather good already.</p>
<h2 id="insightly">Insightly</h2>
<p>Lots of functionality, possibly too much as it can be tricky to understand what goes where at first, and all the tabs get confusing. This means it would have a higher initial barrier, and I’d estimate at least three solid days to set up and train on. Has a nice GMail widget that shows all contacts, tasks etc. related to an email and allows connecting in. The task functionality is something of a disaster zone compared to Asana, and trying to run both simultaneously could get pretty confusing. Free for first three users or £18.50/month for up to 6. Two-way Google Contact and Calendar syncing for paid users. Full functional Android app.</p>
<p>Verdict: I tried this out. It’s cheap and comprehensive, but the interface is a drag, and it doesn’t particularly drive sales.</p>
<h2 id="capsule">Capsule</h2>
<p>Simple UI, if still fond of tabbed interface. Obvious usage. Has decent Android app. Good pipeline viewing. Looks like Google Apps integration is reasonable - there’s an Add to Capsule button for emails from new contacts, and added contacts can have emails attached to opportunities, tasks, general contact feed. Task handling is a bit grim. £8 / month / user. Recommended by a friend, and appears to be UK-based.</p>
<p>Verdict: I tried this out. It’s cheap and simpler to use that Insightly. It still doesn’t drive sales though, and the UI is another of those tabbed interfaces. Probably the second choice after Pipedrive as adoption was more likely to succeed than Insightly.</p>
<h2 id="google-spreadsheet">Google Spreadsheet</h2>
<p>Synchronises well. Google Spreadsheet’s lack of features is a good thing in this context, give or take MI creation. Not good for reporting, MI.</p>
<p>Verdict: Too prone to data errors through entering or pasting data in the wrong place, and not suitable for history or MI. Good for a team of one person.</p>
<h2 id="some-kind-of-shared-notesystem">Some kind of shared note system</h2>
<p>Evernote or Google Keep or some such. Idea is that you use a to do list or spreadsheet, with individual notes for each potential customer. That way you can have the basic information and action management, and also keep detailed information in longform. Worked well with a specific project a while back. Relies on people making sure they keep both the spreadsheet and notes synchronised and up to date. Not great for large numbers of organisations, or MI.</p>
<p>Verdict: probably not.</p>
<h2 id="nimble">Nimble</h2>
<p>Interesting social integration - automatically imports all friends from everywhere and merges their activity into individual records, then tracks their activity and suggests who to contact each day, shows who’s changed jobs etc. Google integration is terrible, no Android app, not the greatest on CRM generally. Here’s what the FAQ says: ‘Nimble is not intended as a system to monitor and report on sales people. It is a social selling tool that makes lead generation and relationship building easier and more airtight.’ Oy vey.</p>
<p>Verdict: I tried this out. It’s potentially valuable for someone relying on social media to drive sales activity, but isn’t a sales management or tracking tool, so it’s a nope.</p>
<h2 id="streak">Streak</h2>
<p>Doesn’t work with Firefox. Doesn’t support Android. Shame as it looks like the only one approaching genuine full-on Gmail integration.</p>
<p>Verdict: nope.</p>
<h2 id="asana">Asana</h2>
<p>Doesn’t have reporting, pipeline or MI functionality. Already in use. Good to do list functionality, obv. Android app is a bit woeful. Difficult to see how to link it in to any kind of reporting for sales management purposes.</p>
<p>Verdict: nope.</p>
<h2 id="excel">Excel</h2>
<p>Easy to get multiple conflicting file versions. Works offline (but may produce incompatible versions). Not good on mobile. Not good for reporting or MI functionality.</p>
<p>Verdict: nope.</p>
<h2 id="solve360-norada">Solve360 / Norada</h2>
<p>A late discovery, so less fully explored than the other options. Looks like it does almost everything, but it’s just too damn big to get a proper handle on. It replaces all parts of CRM, project and task management, and internal storage, and has specialist deployment companies. This makes it more suited to the ‘complete CRM’ approach, that we’re not looking to follow. It’s $39/month for three users.</p>
<p>Verdict: nope.</p>
<hr />
<p><em>Originally published at <code class="language-plaintext highlighter-rouge">https://danieljohnston.co.uk/2013/12/02/driving-sales-crm</code> on December 2, 2013. This post is included for historical curiosity only as its recommendations are super-outdated.</em></p>Daniel WhitstonThere are exactly one gazillion online CRM systems nowadays, and a weird lack of summaries online, so I thought I’d publish some of the rough notes I pulled together as part of a recent review. The situation is important, as different CRMs are best suited to different purposes. The company I was working with had a requirement for the system to drive sales activity, and a small team using Google Apps and Android phones. That means the solution I settled on is the one I thought best for this particular focus.Community building on the web2012-07-07T00:00:00+00:002012-07-07T00:00:00+00:00https://whitston.org.uk/2012/07/07/community-building-on-the-web<p>Over the past few years, I’ve had a bunch of meetings with people trying to extract the secret sauce I used to make Indus Delta into a popular, profitable website. One or two actually made the leap and went on to build their own communities, e.g. No Offence. Hopefully the <a href="https://onlinejournalismblog.com/2010/01/18/nujs-making-journalism-pay-online-five-points/">NUJ conference</a> I addressed on the topic (alongside Guido Fawkes!) inspired a few people as well.</p>
<p>Having seen more than a few different websites in related fields launch and then, usually, sputter to a halt, I’ve been wondering if there was a magic ingredient that brought the whole thing together. Most people launching websites seem to have knowledge of the social marketing side of things, Twitter and Facebook and the top 10 email techniques and so on. A lot of it doesn’t seem to work that well though. Sending newsletters with teasers that don’t reveal the actual story until you go to the website? Doesn’t work so well when the story never matches the sizzle. One putative competitor of Indus Delta launched with the boast that its new site had 10,000 Twitter followers on day 1. Never mind that they’d clearly all been bought to puff up the numbers. So, just trying to follow all the latest social media marketing trends isn’t the secret sauce.</p>
<p>I think a fundamental issue is that people aren’t clear that, when they’re building online services or sites that they want people to develop a relationship with, what they’re actually trying to do is build online communities. There are exceptions to this, but most of the sites I’ve been an onlooker or participant in have as their business objective providing interesting or useful content to build ongoing user engagement and participation leading to sales income, either through ad sales, paid consulting, or subscription fees. That means that these readers of the website, or users of the web service, are a community. And they should be treated as such, and nurtured and communicated with appropriately. Taking them for suckers isn’t going to end well most of the time.</p>
<p>Social media marketing and online community building are somewhat different beasts, and while the former has spawned an entire industry of consultants, the latter has fallen by the wayside. It stretches back to <a href="https://www.well.com/">at least the 80s</a> as a discipline, making it rather ancient and dusty. That also means that there are well established good practices to follow, and I guess my recommendation to anyone thinking of starting a website with a community element (yes, that includes blogs) is to take some time to understand them.</p>
<p>That brings me to the actual purpose of this post, which is to recommend an absolute classic on online community building and management, <em>Community Building on the Web</em> by Amy Jo Kim. It was published in 2000 and is still available in e-book format.</p>
<p>Really, much of community building is marketing seen from a different angle, but it can be a useful perspective. Its relative age is part of what makes it so helpful - it’s easier to cleave to core principles of online engagement when you’re not distracted by the new social media shiny. And it’s very clearly not just a secret sauce you can sprinkle over a business in order to make it suddenly sell lots of stuff.</p>
<hr />
<p><em>Originally published at <code class="language-plaintext highlighter-rouge">https://danieljohnston.co.uk/2012/07/07/community-building-web</code> on July 7, 2012. This post is included for historical curiosity only as its recommendations are super-outdated.</em></p>Daniel WhitstonOver the past few years, I’ve had a bunch of meetings with people trying to extract the secret sauce I used to make Indus Delta into a popular, profitable website. One or two actually made the leap and went on to build their own communities, e.g. No Offence. Hopefully the NUJ conference I addressed on the topic (alongside Guido Fawkes!) inspired a few people as well.What happens when ‘workfare’ replaces paid workers?2012-06-09T00:00:00+00:002012-06-09T00:00:00+00:00https://whitston.org.uk/2012/06/09/what-happens-when-workfare-replaces-paid-workers<p>Apropos of <a href="http://www.guardian.co.uk/society/2012/jun/08/jubilee-stewards-unpaid-labour-growing">this article in the Guardian</a>, I’ve been musing over the impact of mandated work experience placements on the labour market, specifically those that end up replacing paid jobs.</p>
<p>First, I made some assumptions:</p>
<ul>
<li>I’m using ‘work-for-benefits’ to mean work placements that have mandated completion, i.e. they cannot be abandoned by the claimant under threat of loss of benefits. This doesn’t cover fully voluntary work experience; nor does it restrict itself to a particular programme such as the Work Programme.</li>
<li>I’m assuming that that the experiences reported in the Guardian article are factual, and that mandated work-for-benefits replacing paid labour does actually exist.</li>
<li>I’m assuming that the current high levels of unemployment are due to lack of demand leading to there not being enough jobs to go around.</li>
</ul>
<p>The intent of welfare to work programmes is to reduce benefits dependency and maximise labour market participation by preparing and placing claimants in paid employment. The end goal is, roughly speaking, as many people in jobs as possible. Therefore, one defence might be that that the increase in job chances of the claimants undertaking experience outweighs the loss of a single job. For example, 26 claimants undertaking a four week part time placement over the course of a year might replace one employee carrying out paid work for a year, but the increased employability of the claimants results in two or three new jobs being created overall. There are numerous reasons why this won’t fly, though:</p>
<ul>
<li>At a time when the job market is constrained by the number of jobs rather than the number of available, employable workers, a job lost really is a job lost. The employee thus freed up won’t fill an otherwise unfilled vacancy elsewhere. The company employing the person is more likely to hold onto the money than invest it in creating another job. So one paid job lost is equivalent to around one less job that someone fills.</li>
<li>The ‘lost’ job is unlikely to be made up for by the increase in employability of claimants undertaking work experience. The increase in employment chances of claimants is at best controversial. This <a href="http://www.jrf.org.uk/blog/2012/02/workfare-how-about-some-evidence">JRF blog post</a> summarises the evidence of employment impact from various studies. Even where it does increase employment chances, one job entry by a claimant is not equivalent to a job ‘gained’ in the wider economy, as there is a moderate chance that a non-claimant would otherwise have taken the job and someone will become a claimant as a result. This is especially true in an economy with substantially more workers than jobs, as at present.</li>
<li>Over time, unpaid work may well reduce employers’ willingness to hire people to carry out similar tasks, and lower the market price for that job. This reduces job creation further, and lowers the rate of spending in the wider economy.</li>
</ul>
<p>As far as I can see, replacing a paid job with benefit claimants likely has an impact on the wider labour market that is the opposite of the one that welfare to work programmes are intended to promote.</p>
<p>Additionally, it has to be asked whether welfare to work providers are following their ‘market’ into a particularly unfortunate hole. Recent welfare to work programmes have moved toward aligning the payment of providers with the fundamental aims of the provision (moving people into stable long-term employment) as a way of avoiding perverse incentives, where providers game the system and deliver substandard service to claimants in order to meet targets or maximise profits. It doesn’t feel like <em>these</em> work placements are being set up in the genuine desire to improve people’s employability, which leaves only the ‘bad’ reasons of hitting external targets (e.g. DWP requirements to place people into work placements regardless of need, or a provider’s own sausage machine approach to delivery), or of deliberately making people’s lives unpleasant as a way of encouraging them to stop claiming.</p>
<hr />
<p><em>Originally published at <code class="language-plaintext highlighter-rouge">https://danieljohnston.co.uk/2012/06/09/what-happens-when-workfare-replaces-paid-workers</code> on June 9, 2012.</em></p>Daniel WhitstonApropos of this article in the Guardian, I’ve been musing over the impact of mandated work experience placements on the labour market, specifically those that end up replacing paid jobs.Online tendering support for the Work Programme2010-10-30T00:00:00+00:002010-10-30T00:00:00+00:00https://whitston.org.uk/2010/10/30/online-tendering-support-for-the-work-programme<p>After finding out a bit more about Merlin’s web portal earlier this week, I’ve been thinking about online tendering support. Roughly speaking, bidding can be split into five areas:</p>
<ul>
<li>Bid management</li>
<li>Service design & research</li>
<li>Partnerships</li>
<li>Financials</li>
<li>Bid writing</li>
</ul>
<p>Of these, the only one that’s really worth getting into at this stage as a web application is supporting partnerships. I’d suggest two dashboards, one for users with potential primes and one for users with potential subcontractors. I’m not sure if an administrative dashboard would be needed as I suspect whatever’s necessary will already be possible through existing management tools on the software. The initial stage and overall management of the status of potential subcontractors are both potentially useful, but managing and supporting the detailed negotiations around price and the like would add more complexity than it removed.</p>
<h2 id="primes-sign-up">Primes sign-up</h2>
<ul>
<li>Primes would need to be signed up manually, probably by us following a conversation with each prime, possibly through a sign-up form on the site or a sign-up link in a mass email / news story elsewhere</li>
<li>Both primes and subcontractors (note that I’m normally using these words interchangeably to mean both entire organisations and individual users in these organisations) should have a multiple user setup, with one user acting as the ‘owner’ of the organisation with the power to create and delete other users, and the ability to transfer ownership of the organisation to another user</li>
<li>Sign-up information doesn’t need to be particularly major, given anything important can likely be scraped in from Merlin - primarily the areas that primes are bidding in</li>
</ul>
<h2 id="subcontractors-sign-up">Subcontractors sign-up</h2>
<ul>
<li>Sign-up of subcontractors can happen either through a sign-up form on the site, or through manual creation by an administrator, or through creation / upload by a prime, or through automated sign-up following receipt of an emailed expression of interest from the Merlin portal</li>
<li>It is assumed that initial sign-up will be for the purpose of applying to a single prime. This depends on the approach taken by the Merlin portal, but in any case there is a strong chance that a subcontractor will apply to multiple primes through various routes. This means that ‘sign-ups’ that turn out to be for a subcontractor who’s already signed up (i.e. their email address is already a user on the system) should be redirected as applications to the prime in question, without forcing a re-sign-up</li>
<li>The subcontractor sign-up process should where necessary include entry of any information normally found in the Merlin standard EoI template, to make sure all subcontractors have the same basic information available</li>
</ul>
<h2 id="primes-dashboard">Primes dashboard</h2>
<ul>
<li>Standard view is ‘Current applications’, which shows all current applications. It is possible to change the status and ownership of any application, either individually or in bulk. It is possible to filter applications by status and by the responses to the filter questionnaire. By default applications are filtered to only show the current user’s, unset or orphaned ones. This can be unfiltered to allow the user to see and take over applications belonging to other users in the organisation. Roughly speaking, the system has a certain amount in common with an issue tracker system</li>
<li>There are two possible ways of handling filter questionnaires. One is a simple ‘standard filter’ approach where every supplier to a particular prime is automatically sent the standard filter questionnaire for that organisation. The other is a more powerful approach where users can create and edit a range of questionnaires, and assign questionnaires to individual suppliers depending on suitability. The simpler approach may be better for now. The actual process of creating the questionnaire needs to be made as painless as possible, and should allow for radio buttons, checkboxes, numerical and text answers</li>
<li>The ‘owner’ of the prime additionally needs a user management pane to add and remove users to the prime. When a user is removed, the applications assigned to them are set to ‘orphaned’, but their status is left unchanged</li>
<li>The possible statuses of applications are awaiting filter questionnaire, questionnaire completed, active, rejected, subcontract offered, subcontract signed. Awaiting filter questionnaire (which is the initial status, unless there is no questionnaire in which case the status skips straight to active) and ‘rejected’ are the only ones of these that needs to trigger an email to the subcontractor. Both the subcontractor and the prime can safely see the same status. Both of the triggered emails should ideally be customisable templates</li>
<li>Simple export to CSV of the current view is vital, and the email address of the relevant user for each application should be displayed in the table to assist both in messaging the users (use a mailto link?) and in making user of the CSV data. It’s probably best not to handle messaging between primes and subs internally on the system at present. Hence the mailto links and ease of export</li>
<li>There should be a link somewhere on the screen to a display of other potential subcontractors on the system who meet the prime’s criteria (currently, just for location, until we know what the taxonomy is for Merlin) and allowing the prime to invite them to express an interest in working together. Again, depending on taxonomy, this would likely mean creating a filterable list with checkboxes and a customisable message template to be sent to potential subs</li>
<li>For the filter questionnaires stage, it may be desirable to have a cut-off date, by which all EoIs and questionnaires must be submitted. Applications received after this date could be filed in the applications view as ‘too late’ and generate a customisable but automated ‘you’re probably too late’ style response</li>
</ul>
<h2 id="subcontractors-dashboard">Subcontractors dashboard</h2>
<ul>
<li>There should be an alert at the top about uncompleted applications</li>
<li>The main view should be ‘Current applications’, showing applications to primes, with filtering capability by status, and automatic but changeable filtering to those applications owned by the current user or set to ‘unset’ or ‘orphaned’. Pending questionnaires should normally appear at the top, and rejected applications at the bottom</li>
<li>User management pane similar to that for primes</li>
<li>Ability to change ‘owner’ of an application, to complete and submit a questionnaire, to view completed questionnaires. It would ideally be very easy to extract data from completed questionnaires and paste it into new ones where the questions are the same. As an aside, it would be lovely but impractical to enable aggregation of questions from many primes into ‘answer just the once’ forms, at least without a very engaged and active collator willing to negotiate with each prime</li>
<li>There should be a link to potential primes that match the subcontractors taxonomy etc. same as with primes, and allowing the subcontractor to apply to them also. There may need to be some thought about informing primes of this, but there’s really very little advantage to primes in pretending that other primes don’t exist and that subcontractors won’t contact them</li>
<li>Export to CSV, probably some kind of mailto links again</li>
<li>Email automated reminders to users as the cut-off for questionnaires approaches?</li>
</ul>
<p>This is a first sketch of a proposed solution.</p>
<p>Note: This is both part of my ongoing quest to drown the world in bullet points and taken fairly directly from an outline proposal elsewhere.</p>
<hr />
<p><em>Originally published at <code class="language-plaintext highlighter-rouge">https://danieljohnston.co.uk/2010/10/30/online-tendering-support-work-programme</code> on October 30, 2010.</em></p>Daniel WhitstonAfter finding out a bit more about Merlin’s web portal earlier this week, I’ve been thinking about online tendering support. Roughly speaking, bidding can be split into five areas:Helping people to get and keep jobs using online support2010-10-25T00:00:00+00:002010-10-25T00:00:00+00:00https://whitston.org.uk/2010/10/25/helping-people-to-get-and-keep-jobs-using-online-support<p>I’ve been thinking about this topic for a while now. Some brief thoughts, with more to follow. I’ve used a lot of bullet points to lay out the main areas quickly:</p>
<h2 id="online-welfare-to-work-is-going-to-become-a-major-component-of-overall-welfare-to-work-services-in-the-lifetime-of-the-work-programme">Online welfare to work is going to become a major component of overall welfare to work services in the lifetime of the Work Programme</h2>
<p>Online training delivery is maturing rapidly, online delivery of many other services has become commonplace, computer literacy is becoming both expected for participation in the labour market and far more common among workless people than it was, and the structure of the Work Programme lends itself far better to the development and maintenance of online resources which rely on large scale delivery for their impact. I could come up with more reasons until the cows come home.</p>
<h2 id="online-delivery-can-go-hugelywrong">Online delivery can go hugely wrong</h2>
<p>Imagine, if you will:</p>
<ul>
<li>The personal details of 100,000 workless people are accidentally made public
People share completed job applications and CVs with each other. A hundred people apply for a job, all with identical applications</li>
<li>Tumbleweed, population 0 - Shiny new website is set up and sits there, waiting for someone to make it worth visiting</li>
<li>Trolltown - Inadequate monitoring and controls lead to flame wars, claims of libel, and the fiery exit of disgruntled advisers and providers</li>
</ul>
<h2 id="online-delivery-is-a-great-opportunity-for-things-to-goright">Online delivery is a great opportunity for things to go right</h2>
<p>Now imagine a service that is:</p>
<ul>
<li>Flexible - Delivered on demand to the place most suited to the customer, with self service functionality complementing the more traditional adviser-led delivery</li>
<li>Cost efficient - Online delivery offers the opportunity to reduce the more transactional aspects of assisting customers, add self service delivery and peer learning, and reduce some of the inevitable messing about of appointments systems / travel etc. It also reduces the need for central facilities for job search and the like, although it obviously won’t remove the need completely</li>
<li>Creating and preserving its own good practices and knowledge - When online services are delivered well, they can increase the effectiveness of offline delivery by capturing information and knowledge that is often shared informally or kept in the head of whichever adviser has picked up on it, then making it easy to share that with people who need it</li>
<li>Ongoing - Purely offline delivery relies on regular meetings or at least phone calls, and in practice it can be very difficult to track people moving into employment. They tend to be working, commuting, or just busy trying to fit everything else in. Provided a customer has internet access, online networks and communities provide a useful way of maintaining an ongoing relationship without demanding too much time or resources on the part of either party</li>
<li>A rich source of MI for customers, advisers and contractors - Dependent on the system’s functionality, the resulting MI should be robust, unified, and accessible, making it an ideal basis on which to analyse and improve the relationships between all three parties (plus JCP of course!)</li>
</ul>
<h2 id="what-should-this-online-solution-looklike">What should this online solution look like?</h2>
<p>Well, there seem to be three main parts:</p>
<ul>
<li>Marketplace - Enable primes, subcontractors and specialists to connect</li>
<li>Community and resources - Discussion, newsletter, best practice for advisers and customers</li>
<li>Client management system - The most traditional part of the three, but still with big opportunities for improvement around support for and MI capture of remote job search</li>
</ul>
<p>There are also a couple of other really important things that run alongside all of this, namely the process of setting up, marketing, and getting people using such a system, and also ensuring that online delivery properly complements offline delivery by multiple subcontractors, without alienating or replacing them. While it’s possible that some people who are closest to the marketplace might be best served by entirely online delivery, that’s a different proposition, or at least a different element of the proposition, to the one we’re talking about here. The first of these means that the system’s design and roll-out have to be integrated into the overall roll-out of the Work Programme by the prime, and the second means that the system has to be moderately cheap, responsive to the needs of all parties, and reasonably good at self-managing (i.e. run in part by the community it serves).</p>
<hr />
<p><em>Originally published at <code class="language-plaintext highlighter-rouge">https://danieljohnston.co.uk/2010/10/25/helping-people-get-and-keep-jobs-using-online-support</code> on October 25, 2010.</em></p>Daniel WhitstonI’ve been thinking about this topic for a while now. Some brief thoughts, with more to follow. I’ve used a lot of bullet points to lay out the main areas quickly: