Here’s the plan. I reckon it’ll take about five years in all, and I think we’re about 1.5 to 2 years in already. Our starting point is that the AI models are now good enough at coding. Not necessarily “perfect”, just “good enough”. Often, they’re as good (better!) than a junior developer. I don’t know about you, but I’m finding the new models pretty impressive. So are other people. Next,…
TL;DR “Agents in agents driving scripts” is a pattern for handling large-scale, mechanical changes using AI. Each layer of the pattern is developed iteratively, using failures from previous runs to refine either the prompts or the scripts being used. The long version I’m giving a worked example in this post in order to demonstrate how to apply the idea. This post isn’t about either…
I’ve written code which is still in widespread use today that’s old enough to be considered an adult in the UK. I’m pretty proud of that. I’ve also written plenty of code that was absolutely terrible. Sometimes these bits of code are the same. I’ve learned from that. I’ve had the pleasure of working with some brilliant software engineers who opened my eyes to better ways of working. I’ve also…
The code you’ve written means nothing until it’s in the hands of users. Normally, the way I like to write features is to put together the smallest thing I can think of, release that, and then incrementally add features and fix bugs. This lowers risk, and makes it far easier to move quickly, but sometimes that’s just not possible. With the new release of rules_jvm_external 6.1 , I…
In one of the groups I’m part of, someone recently asked “Does anyone have opinions on monorepos? It seems like they should be beneficial to CI in the same way that trunk-based development is, but I’ve never used one in anger.” This is a edited version of my response. I’m a huge fan of co-locating code as a driver for making feedback loops tigher . Taking that…
One of the things I like to talk about with my teams is the goal of getting a new line of code into production as quickly, as safely, and as cheaply as possible . The first part of the goal – getting code into production quickly – is something every team strives for. The second part? In my experience, it tends to be eclipsed by the first part. After all, everyone is under pressure to get the…
To know where we’re going, it helps to know where we’ve come from. While this is true for ourselves, it’s also true of software. It helps explain why some of the things that look unusual or unlikely have been done that way, and helps demonstrate some of the forces that have acted on the design of an apps UI and UX. Why do I mention this? Because when I introduce people to Bazel I…
I have Keanu Reeves to thank for one of my favourite life mottos: Be excellent to each other . It seems to be something that I can apply so often, in so many ways. Take “working with other people on source code” for example. For the sake of this post, I’m talking about large repository with many people working semi-independently on it. Those are most often found in companies, but…
Recently, Bazel 5 was released. Hidden behind a flag is the new bzlmod tool. This is effectively a package manager for Bazel rulesets that’s baked into Bazel itself, the goal being to replace complicated WORKSPACE stanzas with a simple and purely declarative model. Ultimately, there should be no need for a workspace file at all. At work, we maintain a relatively complicated suite of…
Our solar system formed from a cloud of dust and gas. Sometimes, gravity pulled together spectacularly large quantities of matter together, and we ended up with the Sun and the gas giants. Sometimes, the pull of gravity ended up forming something far smaller, like Pluto or Mercury. The asteroid belt? It’s the place where gravity wasn’t quite enough to coalesce matter into Yet Another…
Sometimes, just sometimes, I need to work on a machine that isn’t running macOS. Previously, I’ve done this by installing either a local Docker image, or by running a VM. Neither of these approaches was terribly satisfactory, and both became less viable when I switched to an M1 MacBook Air (which, let it be known, is an absolutely lovely piece of kit) Today, I explored a new approach:…
Ah! Performance reviews! Love ’em or loathe ’em, they’re a feature of corporate life. I’ve only worked in places that do performance reviews every six-to-twelve months. Maybe you work somewhere where performance reviews are done differently. If that’s true, I’m happy for you, and this post won’t be useful for you. If that’s not true, and you’re…
The last time I updated this site was sometime in 2012. I put up a placeholder page, meaning to do far more, started using Blogger for my blog rather than a home-grown solution (again, meaning to find a way to import the old content), and then… and then… and then life happened, and I never seemed to do anything about it. Then came the pandemic, and eventually, encouraged by my wife , I decided to…
A friend of mine messaged me a while ago, and reminded me that my blog had been dormant for a very long time. They were right. I’ve not sat and written down my thoughts for a long time. It’s time to get started again. Now, what to write about….
Well, it’s been a long time since I sat down and wrote a post about the adventures in Selenium-land. Time for an update! Since I last wrote, the work of updating the JSON handling code in the java tree has been completed, and it appears to be stable. However, it would be a terrible waste of time if that was all that we had done, and fortunately it’s not :) The big thing is that…
The month from February to March has been a fun one. At the beginning of March, I attended SauceCon, and gave a keynote on “ Lessons From a Decade in Selenium ”. While the original talk had focused on milestones such as when we first started shipping code, or when we switched to Git, or when someone joined the project, as I sat in the airport waiting to fly, I realised that this was an…
January was a quiet month for Selenium hacking, but it laid the groundwork for February’s efforts. These largely centred around code cleanup in the Grid server, and migrating the project to make better use of our own abstractions over JSON and HTTP . Why do we have our own abstractions for these incredibly common tasks? There are two main reasons. The first is that we’d like freedom to…
You may have noticed a distinct lack of an update last month. It’s because I was focused on client work, Christmas, and the New Year, and took some time away from the keyboard. But I’m back now! The W3C WebDriver spec is now at the stage where we need to demonstrate multiple compatible implementations. Realistically, this means that we need two passes for each test in our test suite .…
I’ve had the pleasure of being a co-editor of the W3C’s WebDriver spec , as well as the original author and one of the current maintainers of Selenium’s Java bindings, and one of the main authors of the current Selenium Server, particularly the pieces to do with implementing the W3C spec. So, as one of the few people on the planet who knows how all the pieces fit together, and…
A monorepo helps reduce the cost of software development. It does this in three different ways: by being simpler to use, by providing better discoverability, and by allowing atomicity of updates. Taking each of these in turn…. Simplicity In the ideal world, all you’d need to do is clone your software repository, do a build, make an edit, put up a pull request, and then repeat the last three steps…
How should a monorepo be organised? It only takes a moment to come up with many competing models, but the main ones to consider are “by language”, “by project”, “by functional area”, and “ nix style”. Of course, it’s entirely possible to blend these approaches together. As an example, my preference is “primarily language-based, secondarily by functional area”, but perhaps I should explain the…
One argument against monorepos is that you need special tooling to make them work. This argument commonly gets presented in a variety of ways, but the most frequent boil down to: Code size: a single repo would be too big for our source control system! Requirement for specialised tooling: we’re happy with what we have! Reduces the ability of teams to move fast and independently Politics and…
The concept of a monorepo seems so self-evident that there is little need to define it. Just co-locate all your code in one place, and you’re done, right? The problem is that this doesn’t capture lots of the nuance of the term. After all, if all you have is a single project, then, by this definition, you have a monorepo. While technically correct ( the best kind of correct! ) this doesn’t feel…
Another month, another update, you lucky people. The highlights: W3C TPAC. I attended the W3C’s TPAC meeting in California. This is the main get-together for many of the “working groups” that are working on standards as part of the W3C. It’s also where the Browser Tools and Testing Working Group met to discuss progress on the WebDriver spec . Good news! Once we clean up the…
I realise that this blog has been pretty quiet. Part of the reason for that is that I’m terrible at sitting down and just writing. What I really need is an incentive. That incentive arrived this month in the form of the Selenium Fellowship, which takes the form of a stipend to fund work hacking on Selenium. Part of the agreement is a monthly blog post. So, you all have the Software Freedom…
Write a poem about a sunrise. Perhaps you’ll leap straight in, and start writing freeform verse. Perhaps you’ll choose a style; a haiku, or a limerick? Something using iambic pentameter or rhyming couplets? Your choice of approach places tangible constraints on how you express yourself. What aspect of the sunrise will you write about? The sun itself, or the environment it rises over?…
Recently, I’ve had a few too many things on my plate to deal with, and have been flirting with burn out, so it’s time to take stock and stop being an idiot. In order to stop doing something, one must understand the things that are being done. In light of that, let me enumerate some of the ways in which I am an idiot: Recently, for only the second time this year, I went to one of the…
What is a monorepo? It’s a unified source code repository used by an organisation to host as much of its code as possible. This is the pattern followed by companies such as Google, Facebook and the BBC, and is the way that I prefer to structure large scale code, as discussed in my post ruminating on codebases I have known . I’m not entirely sure where I first heard the term but I like…
Java has been forked, and Google is the reason. Allow me to explain. Back in the days of Cupcake and Donut, when Android was new and shiny, one of the things that made it attractive to developers was that they could use a language they were familiar with on this new platform. That language was Java, and of course the version used was a modern one. The most recent version of Java at the time was…
I enjoyed breaking the world up into two kinds of developers so much, I thought I’d do it again. The problems that we ask developers to solve are many and varied, but they all contain some mixture of the known and the unknown (sorry to come over all Rumsfeld this early in the post). A new project, the kind of which the company has never undertaken before, is riddled with the unknown to start…
It is, of course, a gross overgeneralisation to say that there are two kinds of developers in the world. In this post I plan to grossly overgeneralise by discussing the two kinds of developers that are out there in the world. Software developers like to write code, but the way that a developer likes to write code can vary wildly. Take, for example, the caveman. When given a problem, the caveman…
This document represents a series of guidelines for writing code that will swiftly pass code review with my team. It doesn’t attempt to be fair. It doesn’t attempt to listen to your opinion. It does present a series of guidelines. You may chose to ignore those guidelines (after all, if they had to be obeyed, we’d have called them “laws”) We may choose to point back to…
I’d thought that this was part of the automated testing canon already, but apparently not, so a quick note on the naming of tests appears to be in order. Well, how I think tests should be named. :) When using an xUnit-style framework, the common pattern is to test class Foo in another class called FooTest. Within this test class, there are several methods. The principle I like to follow is…
A note so that I never forget again : the time used by a ZipEntry instance in Java appears to keep ticking. ZipEntry entry = new ZipEntry( "foo" ); long expected = System. currentTimeMillis (); entry. setTime (expected); Thread. sleep (3000); long seen = entry. getTime () // This fails assertEquals(expected, seen); Update : it turns out that the problem turns out to be that DOS timestamps only…
I tend to get a few requests a day asking for help with a problem with Selenium . I almost never reply to these. It’s not (just!) because I’m an evil minded, grumpy so-and-so, but because it’s not a great use of anyone’s time. I am just one person. I have a full time job, and family and friends that I like to spend time with. I work on Selenium as a volunteer, and that…
At work I’m part of a distributed team. Two colleagues and I are based in London, and the rest of the team is in Menlo Park, California. It’s been reminding me of some lessons that I’ve learnt over the years about working as part of a team that’s spread across time zones, and I thought it might be nice to share some of them. Without further ado: Attempt to get code reviewed…
The UNIX philosophy can be described in many ways (and the Wikipedia page has plenty), but I’ve always admired its practical application in the wealth of shell commands available to a user. Rather than having a single command that Does Everything, the UNIX shell is a place of small commands focused on doing one thing well, yet which are easy to link together. For example, I recently needed…
I was reading a blog the other day that highlighted the fact that I’ve only got a limited number of keystrokes to use up in my working life. I can use those keystrokes on anything: email, writing code, futzing around with the git command line, facebook status messages, posts on Plus, anything…. That got me thinking about why I think that testing is an important part of software…
One of the things that I love most about working in tech is the chances I get to speak in public and share some of the knowledge I’ve somehow managed to accumulate (even, sometimes, about work that I’ve actually done myself!) For someone who enjoys speaking in public, I find it hard to actually promote the fact that I’ll be in places, but some friends have recently asked when and…
Note to self: as an OSS project becomes more successful, the level of clue on the mailing lists drops. Corollary: a successful project will have a mailing list containing several knuckle-bitingly painful posts. Why is this? I believe that it’s all to do with the motivation of the person emailing the list. To begin with, an OSS project only has people who are very interested in using it…
It’s hardly an original thought, but it’s interesting to me that the location of a majority of someone’s computing power has moved from their personally controlled space to datacentres. It’s allowing companies to do some extraordinary data processing, but just surface the results to the user. To prove my case, I cite Google Now. Which is awesome, in the traditional meaning…
As a follow-up from “ Switching between Java 6 and 7 on OS X ”, here’s how to remove Java 7 entirely: # First the JDK cd /Library/Java/JavaVirtualMachines/ sudo rm -rf jdk1.7 \* # And now the JRE cd /Library/Internet \\ Plug-Ins/ sudo rm -rf JavaAppletPlugin.plugin cd ../PreferencePanes/ sudo rm JavaControlPanel.prefpane And that should be that.
You’ve finally got fed up enough with whatever your current problem is to ask for help from someone. That help could come from a number of sources, but for the sake of argument, let’s imagine that it’s a mailing list. Further, let’s imagine that it’s a mailing list that I’m on, and that I genuinely want to help you. Here’s how you can help me help you:…
Ever hear of “talking to the teddy”? That’s the time honoured technique of explaining a particularly troubling and hasslesome technical issue to a colleague only to realize half-way through the explanation that the answer is obvious and the problem far tamer than you thought. You can save face and others’ time by replacing a colleague with a small teddy bear. Explain your…
This took me too long to figure out, so I’m writing this up now. To switch from Java 7 to Java 6 on Lion: sudo rm /System/Library/Frameworks/JavaVM.framework/Versions/Current sudo ln -sf /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents /System/Library/Frameworks/JavaVM.framework/Versions/Current To switch from Java 6 to Java 7: sudo rm…
Code bases, eh? Can’t live with ’em. Can’t live without ’em. Though that’s not strictly true, as many generations have seen. Wait. Hang on. This isn’t quite the articulate start I pictured in my head. Let’s have another go at this. *ahem* The style of architecture used for a large code base largely depends on how the third party dependencies of that code…
It’s been quiet here, and its going to get quieter here for a bit longer: I’m taking some time off to spend with The Boy and The Wife. I’ll be back in time for the W3C TPAC. Have fun, everyone. Try not to break anything while I’m not paying attention :)
Six or so years ago, Jason Huggins and I were talking about the next generation of web testing tools. This wasn’t a conversation about the as-then unreleased Selenium 1.0 or even of WebDriver , which was a new and shiny thing I was working on at ThoughtWorks . This was about the next generation of testing tools. The fact that we can do automated testing on the Web is a happy accident. When…
TL;DR: nothing. Longer version: One of the questions I’ve received most since announcing that I was leaving Google was “what does this mean for the Selenium project ?” My answer is “not much” The project itself is Open Source, and more than half the commits are coming from developers outside of Google. These developers range from people working at other browser…