Ed Plant's CV¶
Introduction¶
I, Ed Plant, am a UK-based Senior Software Architect (IC) for Expend, a FinTech software company handling millions of pounds of customer card spend per year.
I am a Product Engineer able to reason about our customers' business needs and workflows. At the same time, I have a strong understanding of how our system currently works, opinions on how it should work, and can design and implement change safely.
Skills:
- Python (Starlette, Pydantic, SQLalchemy)
- AWS (Lambda, ECS, RDS, DynamoDB, SNS, SQS, S3, Cloudwatch, VPC, Route 53, KMS)
- PostgreSQL and PL/pgSQL
- GitHub Actions CI/CD
- Pulumi (Infrastructure as Code alternative to Terraform)
- TDD
- Contract/Acceptance Testing
- Microservices and Event Driven Architecture
- Dependency Injection Pattern
- Progressive Rollouts
Contact me on LinkedIn.
My AI Opinion¶
All words in the CV are my own. I solicited advice from both humans and AI and made my own decisions.
I have been a cautious adopter of AI Coding Assistants, experiencing both benefits and a new class of problems.
I use Claude Code and have found certain tasks solved impressively competently and quickly.
However, without the steering of an experienced engineer, it produces false confidence in something plausible-looking but subtly wrong and usually unnecessarily complicated.
I see it as my responsibility to keep my codebase working, clean and coherent for future maintainers (human or AI). I don't accept AI as an excuse for ignoring best practices, avoiding critical thinking or accepting poor quality solutions. Used well, it can accelerate individuals/teams.
I haven't used fully agentic SDLC before and am concerned that an AI-only developer will eventually lose the skills that made them capable of doing the job to begin with.
Strengths and Traits¶
- solve problems in a structured way
- analyse code and requirements with meticulous attention to detail
- recall business and technical knowledge from experience
- clarify requirements from ambiguity, false assumptions and general confusion
- investigate and resolve production incidents calmly and systematically
- drive change to improve technical foundations
- coach juniors and/or manage a small team
- am friendly and personable with colleagues
- share knowledge using diagrams, tables, documents and presentations
- understand and improve legacy systems, pay down technical debt
- dislike inter-personal conflict, yet stay professional
Testimonials¶
Brett Scott, managed me:
Ed brings a rare combination of deep technical expertise, engineering craftsmanship, curiosity, pragmatism and the ability to create clarity where others see complexity.
I have had the pleasure of working with Ed as a Senior Software Engineer for five years, and he is one of the strongest engineers I have worked with.
What stands out most about Ed is his thoroughness. He has an exceptional ability to take a complex, ambiguous or poorly understood area of a system, quickly get to grips with it, and turn confusion into clarity. He does this whether through thoughtful design documentation, architecture and technical discussions, or by getting into the code and refactoring it into something simpler and easier to understand.
Technically, Ed is an expert Python developer with a deep understanding of software architecture, design and Infrastructure as Code. He is a true coding craftsman, with a strong appreciation for engineering quality and a particularly astute understanding of what a good "Definition of Done" looks like. He doesn’t just focus on making something work, he considers whether the solution is maintainable, well designed, appropriately tested and genuinely complete.
He also makes a significant contribution beyond his individual coding contributions. He has helped establish engineering standards for the team and is a trusted voice when making technical decisions. He is respected by his colleagues and regularly influences the direction of engineering decisions through well-reasoned and pragmatic contributions.
Ed thrives in ambiguity, which is particularly valuable in a complex product environment. He is able to retain and apply a significant amount of domain knowledge across a large and complicated system, and can make sense of unfamiliar areas remarkably quickly. His contribution to initiative kick-offs, discovery sessions, Three Amigos and pair programming is consistently thoughtful and productive, helping the team reach a shared understanding before moving into implementation.
He also has an excellent attitude towards evolving software development practices. Rather than adopting new approaches for their own sake, he is willing to evaluate them critically and assess where they genuinely improve the way we work. His proactive and positive adoption of AI throughout the software development lifecycle is a great example of this.
Ed is an excellent collaborator. He works effectively with engineers, product colleagues, non-technical stakeholders and external partners, and communicates complex technical ideas clearly to different audiences.
Overall, Ed brings a rare combination of deep technical expertise, engineering craftsmanship, curiosity, pragmatism and the ability to create clarity where others see complexity. He is someone I trust to take ownership of difficult problems, challenge thinking constructively, and help raise the engineering standards of the people around him.
Filipe Fernandes, team member:
low ego, keen sense on security, pragmatic and care about long term maintainability/scaling
Ed's a rare gem of an engineer, really enjoyed working with him. His low ego, keen sense on security, pragmatic and care about long term maintainability/scaling, make me think he's best backend engineer I've worked with.
Javier Molina Sanz, Adyen Integration Expert:
Ed's attention to detail and efficiency are on a completely different level
I had the pleasure of working with Ed almost daily during the Adyen implementation at Expend, and he was exceptional to collaborate with.
Ed's attention to detail and efficiency are on a completely different level.
Beyond executing a seamless implementation, his constructive feedback on our documentation and developer experience was invaluable, setting the foundation for a very scalable integration
Matthew Finding, managed me:
He would constantly challenge the status quo and any outdated practices, coming up with sensible and considered approaches to move the organisation forward
Ed was brought to my attention as part of a project where he validated the suitability of a new product for use in real-world customer trading platform environments. His attention to detail, thorough documentation of issues, and pragmatic approach to resolution of problems, quickly led to a fantastic working relationship with my team at the time. This was before he worked for me directly and already had a solid reputation as a technical leader, which was backed up when I looked for references from his managers when recruiting him into my own group.
Upon joining my team Ed had to embed himself as the new lead within an existing team, helping to implement new processes and practices as well as assisting with spearheading our latest automation initiative. This was a challenging and no doubt daunting task but he did a fantastic job, not only giving his team a new purpose but ensuring that they were contributing effectively for the benefit of the wider engineering department. To do so, he had quickly get himself and his team up to speed on several new technologies and tools, and gain a deeper, low-level, insight into the inner workings of our product set. He very much rose to the challenge.
Ed is a really great team player, I really enjoyed working with him and was privileged to have him in my group - I knew I could assign work to his his team and be confident he would get it done, or feedback immediately where there were issues. I always enjoyed our 1-2-1s; he would constantly challenge the status quo and any outdated practices, coming up with sensible and considered approaches to move the organisation forward.
I would wholeheartedly recommend Ed to any organisation and am sure he would be a valuable member to any team.
Francesca Wise, managed by me:
Since taking over the Platform Deployment team Ed has revolutionised the way the team works, pushing automation initiatives, questioning and refining procedures.
I have had the pleasure of working for Ed for the past 2 years.
Ed has really pushed me to exceed my own expectations and evolve my skillset.
He has excelled at pushing his team to succeed and evolve.
Since taking over the Platform Deployment team Ed has revolutionised the way the team works, pushing automation initiatives, questioning and refining procedures.
He has an excellent wealth of knowledge and is always looking to apply that knowledge to help the team and company improve.
I have enjoyed working for Ed and would recommend him to any employer.
2021-Present Senior Software Architect @ Expend¶
Expend is a UK FinTech expenses software company:
- ~5k users
- ~5k cards
- ~£28m spend made through our platform in ~45k customer transactions in 2025
- fewer than ten developers
- ~200 Lambdas, ~40 microservices
- webservices and event-driven architecture
In the last five years I've improved Expend's developer experience, platform stability, and increased velocity to implement new customer-facing features .
Integration to a Card Issuer
In 2025-26 I led the implementation effort to integrate with a new Card Issuer partner, Adyen.
I performed a deep analysis of our previous integration, communicated with the partner's consultant to understand their APIs, webhooks and reports, and planned how our use cases could be achieved.
I pushed for some significant deliberate architectural changes compared to the old system, based on pain points I had experienced:
- it would not be Expend's responsibility to maintain a 'ledger' of account balances, instead we would trust Adyen to provide reliable account balances for generating account statements
- for card spending realtime authorisation decisions, the partner's transaction rules would support all our use cases, while being more performant than a call-out system like we had before
- we would publish a stream of transactions to a downstream unified transaction service, supporting multiple sources to support parallel running with the old system
I acted as a project manager to raise epics in a clear sequence, where there were blocking dependencies. I assigned the required front-end and mobile tasks to the relevant team members, and had brief communication sessions (inspired by 'three amigos') before starting work, to check shared understanding.
I collaborated closely with a team-mate on the back-end work, pairing sometimes to make a decision, or work on something tricky, otherwise reviewing each other's PRs. We used the TDD approach and had high confidence in the quality and correctness of what we were shipping, which was borne out by later production usage.
The migration to the new Card provider has gone smoothly with 300+ customers migrated in 6 months, with only one day pre-arranged spending downtime per customer.
The system I architected has stood up well, now that it is being used by real customers in production: the major decisions about trade-offs have not been regretted. The Adyen team said they were impressed with the speed at which Expend integrated with them.
Distributed Monolith -> Microservices
Problem
I inherited an architecture which looked superficially like microservices but was monolithic in practice (shared databases, one folder of shared code, one CICD pipeline), without getting the advantages of either approach.
Solution
As a pre-requisite to allow safe refactoring for each service, I created more acceptance tests which asserted the API contracts with other services independent of the internal behaviour.
With 12 factor app principles in mind, I pulled apart the monolith to distinct projects with clear domain boundaries and dependencies. Each project can now be deployed independently, without blocking PRs for other projects in the monorepo.
I refactored each service to use a dependency injection pattern instead of a singleton 'resource manager' used anywhere and everywhere, so it's more explicit at every level how different pieces fit together, and easier to mock in unit tests.
I split out chunks from the shared code folder into many discrete libraries published with semantic versioning, and then installed only into the projects which need them.
Benefit
Publishing a new library no longer risks breaking all services simultaneously. The trade-off is that promoting the new library version across multiple/all projects is more of a chore.
Introducing clearer boundaries, explicit dependencies and looser coupling has improved confidence, lowered risk and increased deployment frequency. Each developer in the team can easily deploy to production multiple times per day, if required.
By making deployments small and frequent, a regression is easy to trace back to the breaking change and our mean time to recovery (MTTR) is usually less than 2 hours.
Unfortunately we still have some shared databases for complex legacy systems where the risk of change was too high to justify a rewrite. However, we haven't extended that antipattern for any new work since I joined. In some cases we managed to replace direct database access of foreign data with HTTP calls to the owning service, even though both services ultimately still use the same database.
Multi Factor Authentication (2FA / MFA)
Problem
Expend already has a secure user authentication system, but since our product can control cards and spending, our customers now expect additional security.
Solution
In 2023, I implemented the new multi-factor authentication service for Expend. The most difficult part was the constraint of only having one login endpoint (legacy, hard to change), which needed to support multiple new MFA workflows before the user is fully logged in.
- new microservice with fairly simple db schema to save user's preferred delivery mechanism in one table, and another table of already-used OTPs to prevent a replay attack
- pyotp library for the core mechanics
- an mfa auth workflow with different code paths for first-time setup, confirm delivery mechanism with OTP, log in with OTP, log in with 'remember me on this device' JWT, log in with recovery code
In the MFA service, I wrote integration tests for the pyotp wrappers, the database utilities, and the various login workflows. The legacy login service's integration with the new MFA service was also tested. Additionally I collaborated with front-end and mobile developers to make sure that all of our contributions worked together end-to-end.
We then did a staged rollout where customers could opt-in to MFA, before it was made mandatory for all customers.
Benefit
- positive feedback from a customer who requested the feature: "We love the 2fa feature so thank you for rolling it out!"
- MFA was a pre-requisite for Card PIN reveal feature with Adyen (when we found this out in 2025-2026 it was simply already done)
- a step towards ISO 27001 compliance
Introduced Pulumi Infrastructure as Code
Problem
Cloud resources were maintained manually only by the CTO. No like-live test environment.
Solution
I introduced Pulumi as our Infrastructure as Code tool:
- made libraries to codify our common patterns
- established guardrails to prevent accidental destruction
- imported existing cloud resources
- deployed a new AWS staging environment
Benefit
Most legacy services have now been migrated to Pulumi and deployed to Staging.
This has made our environment more robust and scalable. Anyone in the team can make changes to cloud resources with confidence, and it's trivial to deploy new projects. Pulumi supports defining infrastructure in Python or Typescript which makes adoption easier for developers without a DevOps background.
In hindsight I should have trained the rest of the team how to import legacy infrastructure, as my time has become a bottleneck to progress on the initiative.
Migrated CICD to GitHub Actions
Problem
Our CI/CD was using an expensive software vendor, while being poorly understood and temperamental.
Solution
I migrated our CI/CD from an expensive software vendor to GitHub Actions.
Benefit
Cheaper, simpler, better understood. Less responsibility of running our own runner infrastructure.
To be fair, GitHub's own uptime has got worse in the last year or two.
Previous Roles¶
2017-2021 Trading Platform Deployment Team Lead @ Fidessa
Fidessa (now part of ION Group) is a market leader in stock market trading software.
I led a development automation team (5-10 reports at peak) with a mission to deliver change to SaaS customers more frequently and more automatically.
I streamlined the software delivery pipeline by a few days per monthly release, by squashing some software layers added by different teams.
My greatest achievement was deploying the company's first ever multi-tenanted trading platform in a more modern way:
- Straight from Development group, without hand-over to Delivery group
- consistent automated deployment technology in all environments
- Monthly, automated upgrade cycle rather than yearly, semi-manual
This resulted in the application developers being able to deliver value to market more rapidly than before. Overheads of supporting old code branches are minimal. Being multi-tenanted, the marginal cost of on-boarding additional customers is much lower than normal practice of purchasing and deploying to new hardware.
2016 Consultant @ FIS
I mainly did client-facing 1st and 2nd line Production support, and left to get more hands-on development and automation opportunities.
2014-2016 Trading Platform Delivery Team Lead @ Fidessa
The role was a generalist mix of Implementation Consultancy, Project Management, Development, Testing, Deployment and Application Support.
I led a team of 3, responsible for several customers’ trading platforms. I managed and helped hands-on deliver SDLC projects across the whole lifecycle for a high-profile customer.
2010-2014 Trading Platform Delivery Engineer @ Fidessa
Configured, customised and upgraded trading platform applications.