Skip to content

Applying for Engineering Manager roles

Applying for Engineering Manager jobs this week.

A chilly cycle ride on Wednesday demonstrated that my energy levels are lower and I am still hampered by a chest infection. I managed a steady 21.5kmh average speed, I'm crawling up hills and the bike is quick everywhere else.

Practicalli

Updated the custom Megalinter flavors for Clojure and Zensical (Static Site Generator).

Zsh

When looking at the TUI gdu disk tool I noticed that gdu was defined as an alias for the git command.

Using the alias command I discovered that a long list of git related aliases were defined.

After a little searching I discovered that the Prezto zsh community config defines a long list of aliases for git, which I have never used.

Aliases defined by Prezto, enabled by default
g=git
gCO='gCo $(gCl)'
gCT='gCt $(gCl)'
gCa='git add $(gCl)'
gCe='git mergetool $(gCl)'
gCl='git --no-pager diff --name-only --diff-filter=U'
gCo='git checkout --ours --'
gCt='git checkout --theirs --'
gFb='git flow bugfix'
gFbc='git flow bugfix checkout'
gFbd='git flow bugfix diff'
gFbf='git flow bugfix finish'
gFbl='git flow bugfix list'
gFbm='git flow bugfix pull'
gFbp='git flow bugfix publish'
gFbr='git flow bugfix rebase'
gFbs='git flow bugfix start'
gFbt='git flow bugfix track'
gFbx='git flow bugfix delete'
gFf='git flow feature'
gFfc='git flow feature checkout'
gFfd='git flow feature diff'
gFff='git flow feature finish'
gFfl='git flow feature list'
gFfm='git flow feature pull'
gFfp='git flow feature publish'
gFfr='git flow feature rebase'
gFfs='git flow feature start'
gFft='git flow feature track'
gFfx='git flow feature delete'
gFh='git flow hotfix'
gFhc='git flow hotfix checkout'
gFhd='git flow hotfix diff'
gFhf='git flow hotfix finish'
gFhl='git flow hotfix list'
gFhm='git flow hotfix pull'
gFhp='git flow hotfix publish'
gFhr='git flow hotfix rebase'
gFhs='git flow hotfix start'
gFht='git flow hotfix track'
gFhx='git flow hotfix delete'
gFi='git flow init'
gFl='git flow release'
gFlc='git flow release checkout'
gFld='git flow release diff'
gFlf='git flow release finish'
gFll='git flow release list'
gFlm='git flow release pull'
gFlp='git flow release publish'
gFlr='git flow release rebase'
gFls='git flow release start'
gFlt='git flow release track'
gFlx='git flow release delete'
gFs='git flow support'
gFsc='git flow support checkout'
gFsd='git flow support diff'
gFsf='git flow support finish'
gFsl='git flow support list'
gFsm='git flow support pull'
gFsp='git flow support publish'
gFsr='git flow support rebase'
gFss='git flow support start'
gFst='git flow support track'
gFsx='git flow support delete'
gR='git remote'
gRa='git remote add'
gRb=git-hub-browse
gRl='git remote --verbose'
gRm='git remote rename'
gRp='git remote prune'
gRs='git remote show'
gRu='git remote update'
gRx='git remote rm'
gS='git submodule'
gSI='git submodule update --init --recursive'
gSa='git submodule add'
gSf='git submodule foreach'
gSi='git submodule init'
gSl='git submodule status'
gSm=git-submodule-move
gSs='git submodule sync'
gSu='git submodule update --remote --recursive'
gSx=git-submodule-remove
gb='git branch'
gbD='git branch --delete --force'
gbL='git branch --all --verbose'
gbM='git branch --move --force'
gbR='git branch --move --force'
gbS='git show-branch --all'
gbV='git branch --verbose --verbose'
gbX='git branch --delete --force'
gba='git branch --all --verbose'
gbc='git checkout -b'
gbd='git branch --delete'
gbl='git branch --verbose'
gbm='git branch --move'
gbr='git branch --move'
gbs='git show-branch'
gbv='git branch --verbose'
gbx='git branch --delete'
gc='git commit --verbose'
gcF='git commit --verbose --amend'
gcFS='git commit --verbose --amend --gpg-sign'
gcO='git checkout --patch'
gcP='git cherry-pick --no-commit'
gcR='git reset "HEAD^"'
gcS='git commit --verbose --gpg-sign'
gcY='git cherry --verbose'
gca='git commit --verbose --all'
gcaS='git commit --verbose --all --gpg-sign'
gcam='git commit --all --message'
gcc='nocorrect gcc'
gcf='git commit --amend --reuse-message HEAD'
gcfS='git commit --amend --reuse-message HEAD --gpg-sign'
gcl=git-commit-lost
gcm='git commit --message'
gcmS='git commit --message --gpg-sign'
gco='git checkout'
gcp='git cherry-pick --ff'
gcr='git revert'
gcs='git show'
gcsS='git show --pretty=short --show-signature'
gcy='git cherry --verbose --abbrev'
gd='git ls-files'
gdc='git ls-files --cached'
gdi='git status --porcelain --short --ignored | sed -n "s/^!! //p"'
gdk='git ls-files --killed'
gdm='git ls-files --modified'
gdu='git ls-files --other --exclude-standard'
gdx='git ls-files --deleted'
get='curl --continue-at - --location --progress-bar --remote-name --remote-time'
gf='git fetch'
gfa='git fetch --all'
gfc='git clone'
gfcr='git clone --recurse-submodules'
gfm='git pull'
gfma='git pull --autostash'
gfr='git pull --rebase'
gfra='git pull --rebase --autostash'
gg='git grep'
ggL='git grep --files-without-matches'
ggi='git grep --ignore-case'
ggl='git grep --files-with-matches'
ggv='git grep --invert-match'
ggw='git grep --word-regexp'
giA='git add --patch'
giD='git diff --no-ext-diff --cached --word-diff'
giI='git update-index --no-assume-unchanged'
giR='git reset --patch'
giX='git rm -r --force --cached'
gia='git add'
gid='git diff --no-ext-diff --cached'
gii='git update-index --assume-unchanged'
gir='git reset'
gist='nocorrect gist'
giu='git add --update'
gix='git rm -r --cached'
gl='git log --topo-order --pretty=format:"$_git_log_medium_format"'
glS='git log --show-signature'
glb='git log --topo-order --pretty=format:"$_git_log_brief_format"'
glc='git shortlog --summary --numbered'
gld='git log --topo-order --stat --patch --full-diff --pretty=format:"$_git_log_medium_format"'
glg='git log --topo-order --graph --pretty=format:"$_git_log_oneline_format"'
glo='git log --topo-order --pretty=format:"$_git_log_oneline_format"'
globurl='noglob urlglobber '
gls='git log --topo-order --stat --pretty=format:"$_git_log_medium_format"'
gm='git merge'
gmC='git merge --no-commit'
gmF='git merge --no-ff'
gma='git merge --abort'
gmt='git mergetool'
gp='git push'
gpA='git push --all && git push --tags'
gpF='git push --force'
gpa='git push --all'
gpc='git push --set-upstream origin "$(git-branch-current 2> /dev/null)"'
gpf='git push --force-with-lease'
gpp='git pull origin "$(git-branch-current 2> /dev/null)" && git push origin "$(git-branch-current 2> /dev/null)"'
gpt='git push --tags'
gr='git rebase'
gra='git rebase --abort'
grc='git rebase --continue'
grep='nocorrect grep --color=auto'
gri='git rebase --interactive'
grs='git rebase --skip'
gs='git stash'
gsL=git-stash-dropped
gsS='git stash save --patch --no-keep-index'
gsX=git-stash-clear-interactive
gsa='git stash apply'
gsd='git stash show --patch --stat'
gsl='git stash list'
gsp='git stash pop'
gsr=git-stash-recover
gss='git stash save --include-untracked'
gsw='git stash save --include-untracked --keep-index'
gsx='git stash drop'
gt='git tag'
gtl='git tag --list'
gts='git tag --sign'
gtv='git verify-tag'
gwC='git clean --force'
gwD='git diff --no-ext-diff --word-diff'
gwR='git reset --hard'
gwS='git status --ignore-submodules=$_git_status_ignore_submodules'
gwX='git rm -r --force'
gwc='git clean --dry-run'
gwd='git diff --no-ext-diff'
gwr='git reset --soft'
gws='git status --ignore-submodules=$_git_status_ignore_submodules --short'
gwx='git rm -r'

Add the zstyle directive to ${ZDOTDIR:-$HOME}/.zpreztorc so alias definitions are not loaded.

# Skip the aliases Prezto defines by default
zstyle ':prezto:module:git:alias' skip 'yes'

This directive has been added to Practicalli dotfiles Zsh configuration

Neovim

Practicalli books are being published due to an updated to Uv release (10.3.3). Every update has been successful so far, except for Practicalli Neovim.

Practicalli Neovim: deploy pages action output

Run actions/deploy-pages@v5:  4m 9s
(node:320) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
Fetching artifact metadata for "github-pages" in this workflow run
Found 1 artifact(s)
Creating Pages deployment with payload:
{
    "artifact_id": 13528725108,
    "pages_build_version": "72bba13003490b88e416998550ff5250c22dfd62",
    "oidc_token": "***"
}
Created deployment for 72bba13003490b88e416998550ff5250c22dfd62, ID: 72bba13003490b88e416998550ff5250c22dfd62
Getting Pages deployment status...
Current status: deployment_queued
Getting Pages deployment status...
Current status: deployment_queued
Getting Pages deployment status...
Current status: deployment_queued
Getting Pages deployment status...
Current status: deployment_queued
Getting Pages deployment status...
Current status: deployment_queued
Getting Pages deployment status...
Current status: deployment_queued
Getting Pages deployment status...
Current status: deployment_queued
Getting Pages deployment status...
Current status: deployment_queued
Getting Pages deployment status...
Current status: deployment_queued
Getting Pages deployment status...
Current status: deployment_queued
Getting Pages deployment status...
Error: Deployment failed, try again later.

Clicking on the GitHub Copilot button "Explain Error" on the workflow run page:

"typically an external GitHub Pages deployment issue rather than a problem in the docs build itself. The artifact upload had already succeeded, and the failure happened afterward when GitHub tried to publish the Pages site."

The 'queued' nature of the output suggested a failure of the GitHub pages service. Re-running all the jobs resolved the issue.

Artificial Intelligence

Whilst I am not currently a subscriber to 'AI' services (waiting for the gold rush damage to subside) it is prudent to know how effectively used relates tools and services in this area.

Specifying a context for the project is done so depending on what the agent is focused on, e.g. defining a persona for each type of agent.

A persona tells the agent what its role is, what tools (commands) it can use to do work. The persona also identifies what is expected via code and style examples (and docs where relevant). The structure is also described so the agent can make fewer assumptions.

Most importantly, the personal tells an agent what is should and should not do.

There are several approaches to defining a specific context for a project, all based around defining a "Persona" for an agent.

  • AGENTS.md is a general persona for any kind of agent
  • CLAUDE.md is Claude specific
  • .github/agents/agent-kind.md GitHub Copilot approach to defining agent specific persona

I will start by adding an AGENTS.md file to all the Practicalli Projects. Then evaluate if there is any value adding a CLAUDE.md file.

AGENTS.md

  • Agent Persona
  • Commands and Flags (options)
  • Testing
  • Detailed stack description with key dependencies
  • Project File Structure (describe key files and directories)
  • Workflows ?
  • Version Control & CI Workflows
  • Code and style examples
  • Clear boundaries (avoid secrets, vendor directories, production configs, specific folders)

!!! TIP “Never commit secrets” The most useful constraint to add to any project.

GitHub Copilot

GitHub Copilot uses .github/agents/ directory for defining an agent persona

Define a persona for each kind of agent, using frontmatter and custom instructions.

Common persona:

  • @docs-agent for technical writing
  • @test-agent for quality assurance
  • @security-agent for security analysis
  • @lint-agent fix code style and format (low risk)
  • @api-agent
  • @dev-deploy-agent run dev deployment

GitHub CoPilot technical writing agent

---
name: docs_agent
description: Expert technical writer
---

## Persona

You are an expert technical writer for this project.

## Commands

Build docs: `make build` (checks for broken links)
Lint markdown: `make format-check` (validates your work)

## Your role

- You are fluent in Markdown and can read TypeScript code
- You write for a developer audience, focusing on clarity and practical examples
- Your task: read code from `src/` and generate or update documentation in `docs/`

## Project knowledge

- **Tech Stack:** React 18, TypeScript, Vite, Tailwind CSS
- **File Structure:**
  - `src/` – Application source code (you READ from here)
  - `docs/` – All documentation (you WRITE to here)
  - `tests/` – Unit, Integration, and Playwright tests
  - `deps.edn` – Library dependencies for the project
  - `build.edn` – Build the project
  - `Makefile` – Consistent task definitions for all Practicalli projects

## Documentation practices

Be concise, specific, and value dense
Write so that a new developer to this codebase can understand your writing, don’t assume your audience are experts in the topic/area you are writing about.

## Boundaries
- ✅ **Always:** Write new files to `docs/`, follow the style examples, run markdownlint
- ⚠️ **Ask:** Before modifying existing documents in a major way
- 🚫 **Never:** Modify code in `src/`, edit config files, commit secrets

Resources:

Careers

Applied for an Engineering Manager role at:

  • Citizens Advice
  • Civica deliver critical services for citizens around the world
  • Deliveroo
  • Ebury (Human review)
  • G-Research
  • GitLab
  • Ki Insurance (no interest)
  • Legora (no interest)
  • Omnea (no interest)
  • Pearson
  • Perk (no interest)
  • Phoenix Software
  • Runware
  • Seccl
  • Utility Warehouse
  • Zopa Bank
  • Relay logistics disruptor

Roles I decided not to apply for

  • SearchApi (weird questions on the initial form)

An engineering manager with a range of experiences across business domains, built on two decades of software engineering experience.

Software engineer and leadership experiences, mentoring teams and applying agile & lean practices for effective delivery


Thank you.

🌐 Practical.li Website

Practical.li GitHub Org practicalli-johnny profile

@practicalli_johnny