Skip to content

Commit

Permalink
one commit to rule them all
Browse files Browse the repository at this point in the history
  • Loading branch information
Robert Cambridge authored and rcambrj committed Oct 22, 2024
0 parents commit d9fba5b
Show file tree
Hide file tree
Showing 14 changed files with 1,956 additions and 0 deletions.
12 changes: 12 additions & 0 deletions .envrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/usr/bin/env bash
# ^ added for shellcheck and file-type detection

# Watch & reload direnv on change
watch_file devshell.toml

if [[ $(type -t use_flake) != function ]]; then
echo "ERROR: use_flake function missing."
echo "Please update direnv to v2.30.0 or later."
exit 1
fi
use flake
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/.direnv/
7 changes: 7 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
all: index.html Robert_Cambridge.pdf

index.html: README.md
go run .

Robert_Cambridge.pdf: README.md
go run .
153 changes: 153 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
# Robert Cambridge

Self-educated backend and infrastructure software engineer.\
Passionate about _readable_, _scalable_ & _secure_ code.\
Commander of `git`, `Terraform`, `Go`, `Typescript` on `node.js`, `nix`, `linux` systems, networking.

> *"takes a lot of pride in delivering good work"* - Antti Kupila
<!-- force separate quotes -->

> *"he really gave it 110% and was critical to the project's success"* - Eaden McKee
<!-- force separate quotes -->

> *"highly skilled, battle-tested and a great team lead and mentor"* - Saemie Chouchane
<!-- force separate quotes -->

> *"one of the most naturally talented programmers you'll meet"* - Jamie Learmonth
Available for **freelance** work in **Amsterdam** or remote.

:telephone_receiver: [+31 203 699 866]\
:envelope: [email protected]\
:link: [linkedin.com/in/rcambrj]\
:link: [github.com/rcambrj]\
:busts_in_silhouette: [Schedule an interview]\
:printer: [Download PDF]

## Experience

### Frasers Group via Lab Digital, Utrecht [03/2024 - 10/2024]
* Maintained & developed `Typescript` ecommerce backend running alongside `commercetools`
* Created & fixed `Terraform` infrastructure architecting the `AWS` `Lambda` & `ECS` services
* Introduced `nix` devshell to make onboarding & distribution of tooling easier

### VanMoof via MA Micro Ltd, Amsterdam [10/2023 - 01/2024]
* Maintained & developed infrastructure managed with `Terraform`, inherited from previous team
* Brought up and improved engineer-facing `Kubernetes` clusters and staging environments
* Architected & executed plan to switch .com website to be reverse-proxied by `Cloudflare`
* Implemented `Cloudflare` rules & workers with `Terraform` to direct traffic to origins
* Assisted with the development of new internal services written in `Go`
* Wrote `Kubernetes` manifests to be instantiated by `ArgoCD`
* Continually scrutinised systems for security flaws and reported those detected

### VanMoof, Amsterdam [07/2021 - 05/2023]
* Developed web services in `Go` (`golang` `Lambdas` via `Terraform`)
* Developed web services in `Serverless.js` (`node.js` `Lambdas` via `CloudFormation`)
* Brought up and maintained `AWS` services such as `RDS`, `DynamoDB`, `S3` and related network & ACL infrastructure
* Architected and developed a service to supply OTA firmware updates to bikes
* Architected and developed a service to track and investigate manufacturing faults

### Polestar via code d'azur, Amsterdam [09/2020 - 07/2021]
* Mentored & guided a team of 12
* Helped maintain the `gatsby` site with several hundred static pages running `React` with `emotion`
* Collaborated with other team representatives to prepare and complete architectural plans
* Investigated new integrations, contributing to formalisation of new visions into manageable pieces of work
* Maintained & improved the deployment pipelines in `Bitbucket`
* Architected system to run database migrations on an off-the-shelf headless CMS (`DatoCMS`)

### PON Occasions via Dept, Amsterdam [01/2020 - 06/2020]
* Brought multi-deployment whitelabel frontend project from greenfield to live with a team of three
* Architected `Next.js` and vanilla `webpack` builds to use a common app codebase using `Typescript`
* Employed `React`, `styled-components` and `Storybook` for a scalable structure
* Analysed client requirements and translated into kanban-style work board
* Built a strong bridge of trust for expectations of delivery with client

### [ABN AMRO Incubator] via Dept, Amsterdam [01/2020 - 02/2020]
* Implemented deployment of _multi-process_ `node.js` app to Heroku Pipelines
* Architected reverse proxy/frontend/backend apps as discrete Docker-like workspaces
* Created sane `node.js` `Typescript` configuration and linting
* Pioneered unit and end-to-end testing, integrated testing in the CI/CD build pipeline
* Collaborated with testers to write and improve automated `TestCafe` scripts
* Implemented `GraphQL` API to manage files on `box.com` with custom `Auth0` authentication/authorization

### Etos via Dept, Amsterdam [09/2019 - 12/2019]
* Contributed new features and bugfixes to existing vanilla JS website
* Improved developer experience by installing sensible Javascript linting tools

### Activia via AKQA, Amsterdam [05/2019 - 08/2019]
* Led the development of this global brand's new website construction
* Brought `Gatsby` project from greenfield to delivery with a team of two
* Architected `Contentful` data structure for a global rollout across many regions and languages
* Bootstrapped project with `React`, `styled-components`, `Storybook`, `jest` & `enzyme`
* Created smooth animated transitions between statically generated pages
* Setup and maintained deployment pipeline on `AWS Elastic Beanstalk`
* Initially solo, laid the ground work for the new Amsterdam engineering team to grow with best practices

### Imperial Tobacco/Fontem (blu.com), Amsterdam [01/2019 - 04/2019]
* Configured `webpack` and `Babel` for `Jest`, `Storybook` and `Next.js` with `Typescript`
* Configured reverse proxy for micro-frontends with localisation and health checks
* Designed major parts of the API specification, with comprehensive buy in from the frontend+backend team
* Created new page components in `React` with `styled-components` and matching Contentful model architecture
* Improved `OpenAPI`/`Swagger` code generation templates for `Typescript` to better support inheritance/polymorphism

### Ace & Tate, Amsterdam [10/2018 - 12/2018]
* Forged a plan to unobtrusively transition to continuous integration+deployment pipeline
* Dockerised services and deployed them to `AWS EB` via `CircleCI` and `AWS ECR`
* Identified data acquisition failures from third parties and built `node.js` caching layer to mitigate
* Created high impact interactions in `react-native` with careful attention to user experience cost
* Rebuilt parts of the `React` application to gain confidence by way of thorough unit testing
* Coached the team through agile principles, ultimately building trust in development capacity

### Gain Theory via Tweag IO, London [03/2018 - 07/2018]
* Rebuilt client-facing data visualisation tools in `reactjs/redux` using `d3` and `recharts`
* Analysed client requirements to establish business data structure and functionality
* Engineered `node.js` service to transform data structure and store in `postgres`
* Implemented SVO-based ACL using `cancan` and `passportjs`
* Dockerised all services, plus `docker-compose` for developer experience

### Wonderbill via Boston Consulting Group, London [07/2016 - 02/2018]
* Developed a web scraping framework to retrieve consumer billing data in a `Chrome` extension
* Architected data structure to store billing data supporting a wide range of account shapes
* Dockerised services to retrieve billing data programmatically with a `node.js` wrapper to invoke `Chrome` via `Selenium`
* Trained and led a small team of developers creating scripts to scrape & store billing data
* Architected and implemented strategies to track, follow and improve billing data accuracy
* Repeatedly exceeded improvement targets for data accuracy and acquisition efficiency
* Contributed small improvements to `golang` & `ruby` data storage services

### NHS England via Web Technology Group, London [01/2016 - 06/2016]
* Developed a web-based CMS-like document management intranet site running `reactjs/redux` powered by `Nuxeo`

### Arcadia Group, London [08/2015 - 12/2015]
* Developed leading UK retail brands' ecommerce front ends
* Created reusable logic across the 8 retail sites whilst supporting brand identity

### Square Enix, London [03/2015 - 06/2015]
* Continued development game website in `backbone` and `marionette`
* Created an avatar provider microservice
* Iterated authentication library to support new major features retaining backwards compatibility

### Expedia, London [12/2014 - 02/2015]
* Developed internal analytics/reporting intranet site running `backbone`
* Refactored non-standard `node.js` `express` API into organised RESTful endpoints
* Implemented MVP (presenter) architecture to abstract business logic from API URLs
* Rewrote the ACL to use permission-based authorisation with hierarchy and groups

### Square Enix, London [05/2014 - 10/2014]
* Developed website for a game in `backbone` and `marionette`
* Created a cross-domain consumer authentication (SSO) library for company-wide roll out

### Sportlobster, London [01/2014 - 03/2014]
* Led & mentored a team of 3 frontend developers using Javascript

### Boxlight, London [10/2010 - 12/2013]
* Architected & developed hundreds of web applications in PHP and Javascript
* Deployed using rsync to AWS EC2 machines, eventually with Jenkins

[+31 203 699 866]: https://rcambrj.github.io/resume/callme.html
[linkedin.com/in/rcambrj]: https://linkedin.com/in/rcambrj
[github.com/rcambrj]: https://github.com/rcambrj
[Schedule an interview]: https://calendly.com/rcambrj/interview
[Download PDF]: https://raw.githubusercontent.com/rcambrj/resume/refs/heads/main/Robert_Cambridge.pdf
Binary file added Robert_Cambridge.pdf
Binary file not shown.
26 changes: 26 additions & 0 deletions callme.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<body style="display: flex; justify-content: center; align-items: center; height: 100%; width: 100%;">
<div id="zadarmaScripts"></div>
<script>
(function() {
var script = document.createElement('script');
script.src = 'https://my.zadarma.com/callmewidget/v2.0.9/loader.js';
document.getElementById('zadarmaScripts').appendChild(script);
}());
</script>
<div id="myZadarmaCallmeWidget6334"></div>
<script>
var myZadarmaCallmeWidget6334;
var myZadarmaCallmeWidgetFn6334 = function() {
myZadarmaCallmeWidget6334 = new ZadarmaCallmeWidget("myZadarmaCallmeWidget6334");
myZadarmaCallmeWidget6334.create({
"widgetId": "VY86yUMadsHB34Ebztchz6MABk5hXpvF65bykpz8sSA268rKnV7bc5Tjx2stfc1b4aKvBKf47hc2h7jeKAhybnemtRx3Ye3698d473071d1d06d62c49a5c6249829a7", "sipId":"229620_0", "domElement":"myZadarmaCallmeWidget6334" }, { "shape":"square", "language":"en", "width":"0", "dtmf":false, "font": "'Trebuchet MS','Helvetica CY',sans-serif", "color_call": "rgb(255, 255, 255)", "color_bg_call": "rgb(126, 211, 33)", "color_border_call": "rgb(191, 233, 144)", "color_connection": "rgb(255, 255, 255)", "color_bg_connection": "rgb(33, 211, 166)", "color_border_connection": "rgb(144, 233, 211)", "color_calling": "rgb(255, 255, 255)", "color_border_calling": "rgb(255, 218, 128)", "color_bg_calling": "rgb(255, 181, 0)", "color_ended": "rgb(255, 255, 255)", "color_bg_ended": "rgb(164,164,164)", "color_border_ended": "rgb(210, 210, 210)"
});
};

if (window.addEventListener) {
window.addEventListener('load', myZadarmaCallmeWidgetFn6334, false);
} else if (window.attachEvent) {
window.attachEvent('onload', myZadarmaCallmeWidgetFn6334);
}
</script>
</body>
3 changes: 3 additions & 0 deletions devshell.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# https://numtide.github.io/devshell
[[commands]]
package = "go"
115 changes: 115 additions & 0 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 34 additions & 0 deletions flake.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
description = "nix devshell for rcambrj/resume";

inputs.nixpkgs.url = "github:NixOS/nixpkgs?ref=nixos-unstable";
inputs.devshell.url = "github:numtide/devshell";
inputs.devshell.inputs.nixpkgs.follows = "nixpkgs";
inputs.flake-utils.url = "github:numtide/flake-utils";
inputs.flake-utils.inputs.nixpkgs.follows = "nixpkgs";

inputs.flake-compat = {
url = "github:edolstra/flake-compat";
flake = false;
};

outputs =
{
self,
flake-utils,
devshell,
nixpkgs,
...
}:
flake-utils.lib.eachDefaultSystem (system: {
devShells.default =
let
pkgs = import nixpkgs {
inherit system;

overlays = [ devshell.overlays.default ];
};
in
pkgs.devshell.mkShell { imports = [ (pkgs.devshell.importTOML ./devshell.toml) ]; };
});
}
13 changes: 13 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module github.com/rcambrj/resume

go 1.23.2

require github.com/go-rod/rod v0.116.2

require (
github.com/ysmood/fetchup v0.2.4 // indirect
github.com/ysmood/goob v0.4.0 // indirect
github.com/ysmood/got v0.40.0 // indirect
github.com/ysmood/gson v0.7.3 // indirect
github.com/ysmood/leakless v0.9.0 // indirect
)
16 changes: 16 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
github.com/go-rod/rod v0.116.2 h1:A5t2Ky2A+5eD/ZJQr1EfsQSe5rms5Xof/qj296e+ZqA=
github.com/go-rod/rod v0.116.2/go.mod h1:H+CMO9SCNc2TJ2WfrG+pKhITz57uGNYU43qYHh438Mg=
github.com/ysmood/fetchup v0.2.4 h1:2kfWr/UrdiHg4KYRrxL2Jcrqx4DZYD+OtWu7WPBZl5o=
github.com/ysmood/fetchup v0.2.4/go.mod h1:hbysoq65PXL0NQeNzUczNYIKpwpkwFL4LXMDEvIQq9A=
github.com/ysmood/goob v0.4.0 h1:HsxXhyLBeGzWXnqVKtmT9qM7EuVs/XOgkX7T6r1o1AQ=
github.com/ysmood/goob v0.4.0/go.mod h1:u6yx7ZhS4Exf2MwciFr6nIM8knHQIE22lFpWHnfql18=
github.com/ysmood/gop v0.2.0 h1:+tFrG0TWPxT6p9ZaZs+VY+opCvHU8/3Fk6BaNv6kqKg=
github.com/ysmood/gop v0.2.0/go.mod h1:rr5z2z27oGEbyB787hpEcx4ab8cCiPnKxn0SUHt6xzk=
github.com/ysmood/got v0.40.0 h1:ZQk1B55zIvS7zflRrkGfPDrPG3d7+JOza1ZkNxcc74Q=
github.com/ysmood/got v0.40.0/go.mod h1:W7DdpuX6skL3NszLmAsC5hT7JAhuLZhByVzHTq874Qg=
github.com/ysmood/gotrace v0.6.0 h1:SyI1d4jclswLhg7SWTL6os3L1WOKeNn/ZtzVQF8QmdY=
github.com/ysmood/gotrace v0.6.0/go.mod h1:TzhIG7nHDry5//eYZDYcTzuJLYQIkykJzCRIo4/dzQM=
github.com/ysmood/gson v0.7.3 h1:QFkWbTH8MxyUTKPkVWAENJhxqdBa4lYTQWqZCiLG6kE=
github.com/ysmood/gson v0.7.3/go.mod h1:3Kzs5zDl21g5F/BlLTNcuAGAYLKt2lV5G8D1zF3RNmg=
github.com/ysmood/leakless v0.9.0 h1:qxCG5VirSBvmi3uynXFkcnLMzkphdh3xx5FtrORwDCU=
github.com/ysmood/leakless v0.9.0/go.mod h1:R8iAXPRaG97QJwqxs74RdwzcRHT1SWCGTNqY8q0JvMQ=
Loading

0 comments on commit d9fba5b

Please sign in to comment.