Posts tagged "software-development"
552 posts tagged with "software-development".
July 2026
March 2026
July 2025
June 2025
May 2025
- Why write your own CMS? -
- Learning lessons -
- Don't dump. Write a test. -
- I have a Peertube -
- How many TODO comments do you have? -
- Plain text TODOs -
- Speaking at Reading College -
- A reason why I like static site generators -
- Extending Sculpin with PHP -
- Don't hack core -
April 2025
- With patches, I can change anything I want -
- Automate Drupal deployments with configuration -
- Self hosting my website -
- Building static websites with Drupal -
- Upgrading incrementally -
- Building fonts with Nix -
- nix is like nvm, but for everything -
- Chaining tools for maximum benefit -
- Generating presentation slides with Nix and rst2pdf -
- Caching with decorators -
- Dealing with different API versions -
- Writing good commit messages -
- Be more selective -
- Don't commit changes with `-m` -
- Automated tests reduce debugging time -
March 2025
- First pull request submitted to nixpkgs -
- Why use Collections? -
- Dependency-free PHP Collections -
- Work in sprints, deploy continuously -
- Drupal test writer for hire -
- Don't repeat yourself -
- Building Bootstrap components with Tailwind CSS -
- Covering icky code with automated tests -
- Legacy code is anything older than... -
- Extra PHPDoc types with PHPStan -
- No-one is paying us to... -
- Archiving Drupal websites as static websites -
- An example of feature flagging -
- What's the correct way to add PHPStan to an existing codebase? -
- Building static websites with Drupal -
- Static websites are easy to backup -
- Static websites are easy to host and deploy -
- Static websites are easy to build -
- You can deploy on Fridays -
- Contrib-first doesn't mean building for every use case -
- Submit your session proposal for DrupalCon Europe -
- CSS variables everywhere -
- Rebase and reorder -
- Feature branching slows delivery -
- How much would it cost to build Drupal? -
- Solve one problem at a time -
February 2025
- Do we still need CSS preprocessors? -
- Smaller modules are more reusable -
- Don't create test.php files -
- What would a suckless version of Drupal look like? -
- To patch or not to patch -
- Tests aren't a line item -
- Speaking at PHP Thames Valley -
- More code, more problems -
- Don't branch, use feature toggles -
- Roll back or fix forward? -
- Feature branches cause merge conflicts -
- What are CI and CD? -
- Don't pre-optimise -
- Rebuilding Bootstrap with Tailwind CSS (and Sculpin) -
- Drupalisms and de-jargoning Drupal -
- Using readonly in PHP -
- Small and fast -
- Tidy then push -
- Refactoring and Test-Driven Development -
- Simpler code doesn't mean less code -
- Writing more tests than production code -
- Having less code than you started with -
- How I work around legacy code -
- Drupal and the Open Web -
- Good software is easy to change -
- Good software is easy to test -
- What's the simplest solution? -
- Don't use global dependencies -
January 2025
- Keep your PHP code up to date using Rector -
- Your CI pipeline is your gatekeeper -
- Make it work, then make it good -
- Is it the application or implementation? -
- Should you have a separate front-end for your Drupal website? -
- Why I like Drupal's Layout Builder -
- Why should you upgrade from Drupal 7? -
- What and why -
- Who's Travis? -
- Why I use nixpkgs-unstable -
- Making ddev reproducible -
- Reproducible or repeatable -
- Minimum viable development environment -
- TypeScript for PHP -
- Comments can lie. Code can't. -
- Learning by reading -
- Patching more things -
- Patching Drupal -
- Easy customisation using patches -
- Don't over rely on AI -
- Who is your BDFL? -
- Just use curl -
- Refactor, remove or replace -
- Don't make assumptions -
- It's fun to be competent -
- Actions, Commands or Services? -
- Drupal is dead. Long live Drupal! -
- Catching up with Mark Conroy -
- todo.txt is the simplest project management tool -
- Anyone can use open source software -
December 2024
- Why do people still build their own CMSes and frameworks? -
- Why I don't buy domain names or host websites for clients -
- Which environment should I test? -
- How quickly can you create or update an environment? -
- The more differences there are, the more likely there will be bugs -
- Everyone's localhost is an environment -
- How easily can you move changes between environments? -
- How many environments do you need? -
- Easy feature flags -
- CD or CDs -
- When would you rather fix a bug? -
- Working iteratively -
- Self hosting the Beyond Blocks podcast -
- RTFM -
- Browsing in plain text -
- Notes on Nix -
- Fixing a laptop -
- Enjoying a cup of Gitea -
- Local merging and squashing -
- Docker and NixOS playing nicely together -
- Running Drupal on devenv -
- Using open source software to build open source software -
- Open source software all the way down -
- One more month of Drupal 7 -
- Do you even need JavaScript? -
- Sculpin from Scratch -
- Adopt a Document -
- Override Node Options and Drupal 11 -
- Homelabbing with NixOS -
November 2024
- Using Nix for local application development -
- Managing dotfiles with Nix -
- Running NixOS in the Cloud -
- Nix as an operating system -
- The Nix language -
- Nix, the package manager -
- A modest JavaScript framework for the HTML you already have -
- No more random packages -
- Building different-looking UIs with consistent class names -
- One configuration language to rule them all -
- Live coding is hard -
- Tailwind CSS v4 is so easy to set up -
- drush deploy -
- Override Node Options used by LocalGov Drupal -
- An interesting thing I spotted about the Override Node Options module -
- Git is not GitHub -
- Starting with a clean slate -
- Speaking at the Drupal London meetup -
- Why consistency and reproducibility are important -
- Could Nix and devenv replace Docker Compose? -
- Write plain text files -
- Discussing Drush and Laravel Prompts with Jess Archer -
- What will be included in Drupal CMS? -
- Should Drush be in Drupal core? -
- Drupal 11 is not Drupal 6 -
- Keep your test suite passing -
- Run your tests more often -
- Passing tests doesn't mean a working application -
October 2024
- Code reviews are about the code, not code style -
- Why "no build" is appealing -
- A deep drive into test-driven Drupal development -
- Thinking of new ideas -
- Always review your changes -
- git stash is underrated -
- Sharp blades and dull blades -
- How would you write this test name? -
- Drupal applications are modular monoliths -
- Test, then refactor -
- PHPUnit or Pest? -
- Is PHP a good first programming language? -
- 16 years on Drupal.org -
- Generative AI in PHP -
- Don't just copy and paste -
- AI as a pair-programming partner -
- AI in Drupal -
- Discussing Drupal's ECA module -
- Is post-end-of-live support an anti-pattern? -
- Make the change easy, then make the easy change -
- YAGNI -
- Technical debt isn't always bad -
- Not all legacy code is technical debt -
September 2024
- Is testing a chore? -
- Testing personal projects -
- Static analysis with Dave Liddament -
- Don't add blank lines -
- Are you a real Developer? -
- What would get you fired? -
- Enforcing consistency with automation -
- Writing custom PHPStan rules for Drupal projects -
- Drupal adopts ADRs -
- Be consistent -
- The two ways of writing PHP code -
- De-jargoning Drupal -
- Next week is DrupalCon Barcelona -
- Experimenting with the Default Content module -
- Looking for alpha testers -
- What's your plan? -
- Violinist, render arrays and feature flags -
- When did you last deploy to production? -
- Do you deploy on Fridays? -
- Beyond Blocks passes 1,000 downloads -
- Avoiding primitive obsession -
- My laptop died -
- Find bugs sooner -
- Bootcamps, Hackathons, Meetups and Drupal with George Gordon -
- find vs. get -
- Diagram-driven development -
- Do your commit messages still make sense? -
- No-one sees your clean-up commits -
- You need tests to refactor safely -
August 2024
- Make it work, then make it good -
- Revisiting the Null Object pattern in Drupal -
- Single File Components in Drupal with Sam Mortenson -
- Build Configs is now public and open-source -
- Named arguments add context -
- CSS, data attributes and feature flags -
- Abbreviations are better than aliases -
- Speaking at PHP Berkshire -
- Drush is using Laravel Prompts -
- Publishing a Zettelkasten -
- Ellipsis in pager template fails accessibility tests -
- Writing bash scripts with Nix -
- Bash scripting for fun (and profit?) -
- Mermaid - markdown for charts -
- Types add context -
- What are err, req and res? -
- Docblocks or attributes? -
- Makings things frictionless -
- LEGO, robotics and open-source software -
- Always write your code as if... -
- Commits are cheap -
- To configure or not to configure -
- People read more code than they write -
- Computers don't care -
- Application code is only part of the puzzle -
- Drupal 7 security support changes -
- Drupal 11 is here! -
- Merging unrelated histories -
- Adding automated tests to Content Access by Path -
July 2024
- Why I use Linux for my operating system -
- Maintaining backward compatibility -
- Don't run code formatting in your CI pipeline -
- Using a run file in your CI pipeline -
- Only have one URL per Git remote -
- Things aren't perfect -
- There isn't just one way to do something -
- Automation, Linux training and mechanical keyboards with Jochen Lillich -
- What's the smallest number of dependencies you can have? -
- Queuing long-running tasks -
- Tailwind CSS v4, with even more CSS -
- The power of arbitrary classes -
- How I started using utility-first CSS -
- Applying all the things -
- You can do utility-first CSS with Sass -
- Back to Sass and traditional CSS -
- Running automated checks in a CI pipeline -
- Committing CI artifacts -
- CI !== CI Pipeline -
- A new version of Drupal is only a command away -
June 2024
- Bootcamps, communities and first Developer jobs -
- Countdown to Drupal 11 -
- Drupal 10.3 released -
- Aliases and abbreviations -
- Don't use aliases -
- Proof of concept -
- Today I learned -
- Re-learning Behat -
- Do you still need TypeScript? -
- Bug free guarantee -
- Is the code extensible? -
- Dead or done -
- Vetting third-party open-source software -
- Recording architectural decisions -
- Do you separate your logic? -
- Online Drupal mob contribution sessions -
- Proudly found elsewhere -
- Drupal is older than... -
- Not invented here -
- End the day with a failing test -
- Writing assertions first -
- Is the abstraction worth it? -
- Writing comments first -
- Only seven months left of Drupal 7 support -
- Don't use AI to write your automated tests -
May 2024
- Putting glue on pizza -
- Ask questions -
- Make it easy -
- Why is everyone moving to SQLite? -
- Why do you still write Sass? -
- Is it time to stop writing Sass? -
- Testing is a reusable skill -
- Don't put HTML in your body field -
- Why I use long parameter names in scripts -
- `git revert` is your friend -
- Which commit has the largest message? -
- Referencing other commits in commit messages -
- Better commit messages means better pull requests -
- Should you strictly enforce the 50/72 rule? -
- Why I don't commit with -m -
- The first test is the hardest -
- Should you include issue IDs in your commit messages? -
- Free code reviews -
- DrupalCamp Ghent -
- Merging without merge commits -
- Don't delete my commit messages -
- Optimise for revertability -
- Do you have a deadline? -
- Assertions aren't just for tests -
- Drupal 7.100.2 -
- Interactive staging -
- Making PHPStan stricter -
- Strict typing in PHP -
- Don't add boolean arguments -
- Re-evaluating old tools -
- Broken pipeline? Fix or revert it. -
April 2024
- Stepping back into debugging -
- Some kind words -
- Replicating a bug with a test -
- Can you make a test fail? -
- Don't cherry-pick features from a branch to deploy -
- If everyone branches, no-one gets the updates -
- Testing topic branches in isolation -
- Why use a static site generator -
- Building websites with PHP and Sculpin -
- Almost at 100 talks and workshops -
- When should you tag 1.0? -
- I made my first commit to LocalGov Drupal Microsites -
- Regular releases encourage contribution -
- Regularly releasing open-source software -
- A note to open-source software maintainers -
- What about updating custom modules and themes? -
- Rector is not just for Drupal -
- Drupal Rector and the Project Update Bot -
- Over 100 ATDC subscribers -
- Resurrecting the Speakerdeck Field module -
- Paying it forward -
- Come for the software, stay for the community -
- Avoiding nesting -
- Drupal is a content management framework -
- One Drupal fits all -
- PHP attributes: coming soon to a Drupal version near you -
- Switching web servers using Build Configs -
- Releasing a new project one page at a time -
- I'm attending LocalGov Drupal Camp -
March 2024
- Making Git work the way you want -
- Leaving a trail of breadcrumbs -
- How I Git -
- Starting to sprinkle JavaScript with Stimulus -
- Hotfixing without branches -
- Let someone else do the work -
- Newport City Council running LocalGov Drupal -
- Why I don't use a GUI for Git -
- Write programs that do one thing and do it well -
- Watching all the things -
- Git hooks - yay or nay? -
- What is legacy code? -
- Drupal Commerce: not just for selling t-shirts and hats -
- Automated Drupal 11 compatibility fixes -
- Patches vs Merge Requests -
- Adding tests to the Content Access by Path module -
- Everything is a trade-off -
- Just say Drupal -
- 80% of PHP? -
- You should know when to remove a feature flag -
- Feature flags should be short-lived -
- Visual testing and Diffy with Yuri Gerasymov -
- Override Node Options is used on 40,624 Drupal websites -
- Conventions over readability? -
- Why write software for this? -
- Types are optional -
- Why write framework-agnostic code -
- Why you need layers in your application code -
- Centarro and Drupal Commerce with Ryan Szrama -
- Are your tests good enough? -
- Back to live streaming -
February 2024
- Experimenting with web components -
- Why I don't branch -
- Building a design system in a few hours with Symfony -
- Docker and content creation with Nick Janetakis -
- Why do people still use Git Flow? -
- When should you start writing tests? -
- Slow down to go fast -
- Diffy and visual regression testing -
- Coding defensively and considering the unhappy path -
- Which level is right for you? -
- Introducing Versa - the versatile CLI tool -
- Build something useful in one day with Mark Conroy -
- Another way to create test module configuration -
- Keep logic within tests for as long as you can -
- Major version updates are just removing deprecated code -
- It takes the drama out of open-source -
- Symfony conventions making their way to Drupal -
- Twig, Symfony and SymfonyCasts with Ryan Weaver -
- Do you really need it? -
- Defining boundaries between custom Drupal modules -
- Experimenting with Architectural Testing -
- Running tests in parallel with Paratest -
- .gitignore or .gitallow -
- Reducing complexity makes contribution easier -
- Automated tests prevent you from adding regressions -
- Start with a failing test -
January 2024
- Automated tests mean you can make changes quicker -
- TDD doesn't mean you know everything upfront -
- Violinist and automation with Eirik Morland -
- Ignoring things globally -
- gitignore - inclusive or exclusive? -
- Write once, manage forever -
- Defining Ubiquitous language -
- Why use automation tools for dependency updates -
- Where is the value in your application? -
- PHPUnit or Pest? -
- Tests can assert multiple things -
- Is zero unlimited? -
- Please don't use short variable names -
- Daily or quarterly? -
- Don't be perfect, be useful -
- Code is a liability, not an asset -
- Testing Legacy with Mike Karthauser -
- Utility classes make global scope local -
- My Drupal testing email course is live -
- Don't put business logic in templates -
- Things take as long as they take -
- PHP in Neovim -
- Flexible Mob and Pair Programming -
- Continuous improvement -
December 2023
- Just... -
- We've always done it this way -
- Decide, automate, document -
- Don't let pride get in the way of productivity -
- Writing new code is quick, to begin with -
- Good code is not about being easy to write -
- A sneak peek of my Drupal automated testing course -
- This should never happen -
- Using a whole framework or part of it -
- Which is the best programming language, CMS or framework? -
- New year coaching -
- hover + focus = hocus -
- Should you run static analysis on your tests? -
- Fail fast, fix fast -
- Adding snapshot tests to Build Configs -
- Building your own in-house Drupal distribution -
- Save time and effort with Drupal distributions -
- DrupalCon session survey results -
- Custom coding standards and conventions -
- Suffixing names -
- Rebuild or iterate -
- Don't just rewrite. Re-invent. -
- A Drupal case study from Oxfam -
- Open-source first doesn't mean you need to cover every use case -
- Open-source encourages more open-source -
- Writing contrib modules as glue between your custom code -
- The contribution-first workflow -
November 2023
- Are bugs good for users? -
- The lowest level is better than no level -
- Which PHPStan level should you use? -
- Finding the best test base -
- Are conventional commits worth it? -
- Frequency reduces difficulty -
- Why I've standardised on 'run' scripts -
- Writing good test names -
- Avoiding over-mocking -
- Don't pre-optimise and over-customise -
- Why I prefer integration tests to unit tests -
- PHPUnit does more than unit testing -
- PHPUnit does more than unit testing -
- Drupal gives you so much out-of-the-box -
- Work in small batches -
- README-driven development -
- "Building Build Configs" at PHP South West -
- It depends -
- The first Beyond Blocks podcast episode is recorded -
- I'm starting a podcast -
- Why you should contribute to open-source software -
- Why your company should contribute to open-source software -
- Is code coverage an objective or guideline? -
October 2023
- I can drive my car blindfolded, but is it a good idea? -
- Can you move faster without tests? -
- Is decoupled Drupal still a thing? -
- Automated tests prevent regressions when upgrading -
- How to test code you didn't write -
- When should you run your tests? -
- Do you need to write tests for small or short-lived projects? -
- Writing tests is an investment -
- Business logic in template files? -
- Do you need that module? -
- Why use Composer to manage Drupal dependencies? -
- Is test-driven development difficult? -
- A breakdown of tests from a current project -
- Software development is like going to the Dentist -
- Some solutions are good enough -
- The best solution is the one that gets the tests to pass -
- There is no perfect solution -
- Only comment what needs to be commented -
- TDD: repeat and refactor -
September 2023
- 92 changed files with 885 additions and 156 deletions -
- Feature flags enable continuous integration -
- Separating environments with feature flags -
- Which branch should be in which environment? -
- Should you use a staging environment? -
- Test to save your job -
- Everyone tests their code, but not everyone writes automated tests -
- Documentation and comments get stale. Tests don't. -
- Buggy software causes reputational damage -
- Why I prefer types -
- Stop writing tests -
- Increasing test coverage with regression tests -
- How much refactoring should I be doing? -
- Types or no types -
- Outside-in or inside-out? -
- Don't inject too many dependencies -
- Don't use "else" -
- Code is read more than it's written -
- A lack of tests discourages refactoring -
- Do you proactively refactor your code? -
- What's the simplest test to begin with? -
- Verbosity over abstraction -
- Including time for tests in estimates -
July 2023
June 2023
May 2023
- A minor breaking change -
- Semantic versioning -
- Why is backward compatibility important? -
- What is deprecated code? -
- Mastering your tools improves productivity -
- Releasing small changes often is less risky -
- When You Do Things Right, People Won't Be Sure You've Done Anything at All -
February 2023
December 2022
- What is the cost of a bug? -
- The Boy Scout rule -
- Duck typing -
- Should you comment your code? -
- Outcomes or output -
- What to do with TODO comments -
- Commit and push something every day -
- Writing readable code -