-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit d9fba5b
Showing
14 changed files
with
1,956 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
/.direnv/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 . |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
# https://numtide.github.io/devshell | ||
[[commands]] | ||
package = "go" |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) ]; }; | ||
}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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= |
Oops, something went wrong.