From b8e20945fd4140c4baef911d2c646c138c6a57ec Mon Sep 17 00:00:00 2001 From: opsb Date: Mon, 15 Mar 2021 21:07:11 +0100 Subject: [PATCH] Update CV with CTM --- .tool-versions | 1 + elm.json | 2 +- src/Data.elm | 65 +++++++++++++++++++++++++++++------------------ src/Main.elm | 42 ++++++++++++------------------ src/View/Atom.elm | 21 ++++++++++++--- 5 files changed, 75 insertions(+), 56 deletions(-) diff --git a/.tool-versions b/.tool-versions index 364f809..7412d71 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1,2 @@ elm 0.19.0 +nodejs 14.14.0 diff --git a/elm.json b/elm.json index 39874d1..69f9e40 100644 --- a/elm.json +++ b/elm.json @@ -3,7 +3,7 @@ "source-directories": [ "src" ], - "elm-version": "0.19.0", + "elm-version": "0.19.1", "dependencies": { "direct": { "elm/browser": "1.0.0", diff --git a/src/Data.elm b/src/Data.elm index 8701724..4cc85b8 100644 --- a/src/Data.elm +++ b/src/Data.elm @@ -80,7 +80,22 @@ introduction = experience = - { twentyBn = + { ctm = + { title = "Consultant" + , location = "London / Remote" + , company = "CompareThe\nMarket.com" + , dates = "Feb 2019-Present" + , projects = + [ { name = "MoneyHub" + , start = 2019 + , end = 2021 + , overview = "Having bought Bean.com, a startup that helped people save money on their bills CompareTheMarket wanted to replace the existing platform with a high performance elixir service to integrate the majority of UK high street banks using the Open Banking specification. Devised and built custom algorithms for analysing transaction data and identifying merchants and recurring bills and payments." + , stack = [ "Elixir", "Elm", "Javascript", "Ruby" ] + , talkingPoints = [] + } + ] + } + , twentyBn = { title = "Consultant" , location = "Berlin / Remote" , company = "TwentyBN" @@ -169,7 +184,7 @@ experience = [ { name = "Give4Sure" , start = 2012 , end = 2014 - , overview = "A cross-browser plugin and webapp that helped charities raise money while their supporters shopped online. The browser extension highlighted links on any page to participating retailers in a charity's chosen color. Given that the extension ran on every page and costs needed to be kept low it was built so that it can run entirely independently of our servers." + , overview = "A cross-browser plugin and webapp that helped charities raise money while their supporters shopped online. The browser extension highlighted links on any page to participating retailers in a charity's chosen color." , stack = [ "Browser extensions", "Ruby on Rails", "Postgres", "Ember.js", "Kanban", "BDD" ] , talkingPoints = [ "Built browser extension to handle high volume but with low infrastructure costs." @@ -181,7 +196,7 @@ experience = , { name = "Marks and Spencer School Uniforms" , start = 2011 , end = 2012 - , overview = "A collaboration with Marks and Spencer to provide bespoke school uniforms to UK schools. Built a webapp that allowed schools to create and preview custom school uniforms based on Marks and Spencer's standard uniform." + , overview = "Led the development of an online store allowing schools to customise standard Marks and Spencer uniforms with their school badges and colours." , stack = [ "Ruby on Rails", "Postgres", "Kanban", "BDD" ] , talkingPoints = [ "Built online catalogue that allowed schools to sign up and create their own bespoke uniform online." @@ -201,25 +216,16 @@ experience = ] } , informa = - { title = "Tech lead" + { title = "Tech lead/Architect" , location = "London" , company = "Informa" , dates = "2005-2010" , projects = - [ { name = "Intelligence Centre 2" - , start = 2008 - , end = 2010 - , stack = [ "Java/Spring", "Oracle DB", "Scrum", "BDD" ] - , overview = "Custom CMS for analysis of the telecoms sector. Frustrated with using web based text editors (which were very poor at the time), I proposed and built a webdav based solution for the journalists to write articles in word, save and then see them rendered immediately on the website." - , talkingPoints = - [ "Devised a webdav based system that allowed journalists to edit articles directly in MS Word. The system allowed journalists to hit save in Word and instantly see a preview on the live site." - ] - } - , { name = "World Cellular Information Service" + [ { name = "World Cellular Information Service" , start = 2007 , end = 2006 , stack = [ "Java", "Spring", "MS Analytics services", "Oracle DB", "Scrum", "TDD" ] - , overview = "BI portal for worldwide cellular market data. Having developed the successful architecture for the new WBIS product (see below) I was asked to roll it out for what's Informa Telecom's flagship product." + , overview = "BI portal for worldwide cellular market data. Having developed the successful architecture for the new WBIS product (see below) I was asked to roll it out for Informa Telecom's flagship product." , talkingPoints = [ "Used incremental approach with frequent releases to gradually shift product over to new architecture without disrupting the live service or requiring parallel development." , "Introduced clover to track test coverage and promote a TDD approach" @@ -236,6 +242,15 @@ experience = , "Introduced maven to standardise build process" ] } + , { name = "Intelligence Centre 2" + , start = 2008 + , end = 2010 + , stack = [ "Java/Spring", "Oracle DB", "Scrum", "BDD" ] + , overview = "Devised a webdav based CMS allowing Journalists to write their articles in MS Word, save and see an instant preview of their article on the website." + , talkingPoints = + [ "Devised a webdav based system that allowed journalists to edit articles directly in MS Word. The system allowed journalists to hit save in Word and instantly see a preview on the live site." + ] + } ] } , nutshellDevelopment = @@ -271,27 +286,27 @@ education = skills : List Skill skills = [ { name = "Ruby on Rails", years = 8 } - , { name = "Elixir / Phoenix", years = 2.5 } - , { name = "Elm", years = 2.5 } + , { name = "Elixir / Phoenix", years = 5 } + , { name = "Elm", years = 5 } , { name = "React/Redux", years = 0.5 } , { name = "RxJS", years = 1.5 } , { name = "Ember.js", years = 5 } - , { name = "Javascript - ES2017", years = 8 } + , { name = "Javascript - ES2017", years = 10 } , { name = "Java", years = 5 } , { name = "SQL", years = 14 } , { name = "Firebase", years = 2 } , { name = "OLAP / MDX", years = 4 } , { name = "Event-sourcing/CQRS", years = 2 } - , { name = "Scrum / Kanban", years = 13 } - , { name = "BDD / TDD", years = 13 } - , { name = "Git", years = 10 } + , { name = "Scrum / Kanban", years = 15 } + , { name = "BDD / TDD", years = 15 } + , { name = "Git", years = 12 } , { name = "Realtime systems", years = 5 } - , { name = "HTML", years = 12 } - , { name = "CSS / SASS", years = 12 } + , { name = "HTML", years = 14 } + , { name = "CSS / SASS", years = 14 } , { name = "OO", years = 14 } - , { name = "Functional", years = 3 } + , { name = "Functional", years = 5 } , { name = "Heroku", years = 8 } - , { name = "AWS", years = 8 } + , { name = "AWS", years = 10 } ] diff --git a/src/Main.elm b/src/Main.elm index d7ab3ca..6e653f2 100644 --- a/src/Main.elm +++ b/src/Main.elm @@ -259,8 +259,9 @@ experiencePage = "Experience" ) , row [ width fill, height fill ] - [ Atom.pageColumn [ spacing 40 ] - [ positionView (Data.experience |> .twentyBn) + [ Atom.pageColumn [ spacing 25 ] + [ positionView (Data.experience |> .ctm) + , positionView (Data.experience |> .twentyBn) , positionView (Data.experience |> .liqid) , positionView (Data.experience |> .zapnito) , positionView (Data.experience |> .lytbulb) @@ -393,32 +394,22 @@ mobilePositionView position = positionView : Position -> Element msg positionView position = - column - [ spacing 15 - , width fill - , paddingEach { top = 0, right = 0, bottom = 5, left = 0 } - ] - [ column [ spacing 8, width fill ] - [ row [ width fill, spacing 20 ] - [ column [ width (fillPortion 11), spacing 5, alignTop ] - [ el [ alignLeft ] - (Atom.title2 [] position.company) - , el [ alignLeft ] (Atom.title3 [ Font.color Colors.red ] <| position.title) - , el [ alignLeft ] (Atom.bodyText [] position.dates) - , el [ alignLeft ] (Atom.bodyText [] position.location) - ] - , row [ spacing 20, width (fillPortion 20), alignTop ] - [ column [ spacing 15, width (fillPortion 20) ] (List.map projectView position.projects) - ] - ] + row [ width fill, spacing 0 ] + [ column [ width (fillPortion 7), spacing 5, alignTop ] + [ Atom.title3 [ Font.size 16, paddingEach { top = 0, right = 0, bottom = 5, left = 0 } ] position.company + , Atom.title5 [ Font.size 12, Font.color Colors.red ] <| position.title + , Atom.bodyText [Font.size 10] position.dates + , Atom.bodyText [Font.size 10] position.location ] + , column [ spacing 15, width (fillPortion 20) ] + (List.map projectView position.projects) ] projectView : Project -> Element msg projectView project = column [ spacing 5 ] - [ Atom.title3 [ paddingEach { top = 0, right = 0, bottom = 5, left = 0 } ] project.name + [ Atom.title3 [ Font.size 14, Font.medium, paddingEach { top = 0, right = 0, bottom = 2, left = 0 }, centerY ] project.name , Atom.paragraph [ Font.size 12 ] [ text <| projectSummary <| project ] , hashTags project.stack ] @@ -426,7 +417,7 @@ projectView project = projectSummary : Project -> String projectSummary project = - project.overview |> String.split "." |> List.head |> Maybe.withDefault "" + project.overview hashTags : List String -> Element msg @@ -438,14 +429,14 @@ hashTags tags = |> String.join ", " in Atom.paragraph - [ Font.size 11 + [ Font.size 9 , Font.color Colors.grey --, Font.italic --, Atom.titleFont , Font.alignLeft , Font.medium - , Font.family [ Font.monospace ] + , Font.family [] ] [ text formatted ] @@ -494,8 +485,7 @@ openSourceProject project = { url = project.repo , label = row [ width fill ] - [ el [ alignLeft ] (Atom.title3 [] project.name) - , el [ alignRight ] (Atom.title4 [] project.shortInvolvement) + [ el [ alignLeft ] (Atom.title4 [Font.size 14, Font.medium] project.name) ] } , Atom.autolink project.overview diff --git a/src/View/Atom.elm b/src/View/Atom.elm index 98519e4..35dd369 100644 --- a/src/View/Atom.elm +++ b/src/View/Atom.elm @@ -17,6 +17,7 @@ module View.Atom exposing , title2 , title3 , title4 + , title5 , titleFont , verticalDivider ) @@ -76,7 +77,7 @@ title3 : List (Element.Attribute msg) -> String -> Element msg title3 customAttrs title_ = attrsEl [ titleFont - , Font.size 18 + , Font.size 16 , Font.color Colors.grey , Font.semiBold , letterSpacing -0.2 @@ -87,6 +88,18 @@ title3 customAttrs title_ = title4 : List (Element.Attribute msg) -> String -> Element msg title4 customAttrs title_ = + attrsEl + [ titleFont + , Font.size 14 + , Font.semiBold + , Font.color Colors.grey + ] + customAttrs + (text title_) + + +title5 : List (Element.Attribute msg) -> String -> Element msg +title5 customAttrs title_ = attrsEl [ titleFont , Font.size 14 @@ -173,13 +186,13 @@ bodyText customAttrs text_ = tableOfContentsLine : String -> String -> Element msg tableOfContentsLine leftText rightText = - row [ width fill, Font.family [ Font.monospace ] ] + row [ width fill, Font.family [] ] [ el [ Font.color Colors.grey , paddingEach { bottom = 0, left = 0, top = 0, right = 5 } ] - (title4 [ Font.family [ Font.monospace ], Font.size 11 ] leftText) + (title4 [ Font.family [], Font.size 11 ] leftText) , el [ width fill , Border.dotted @@ -193,7 +206,7 @@ tableOfContentsLine leftText rightText = [ Font.color Colors.grey , paddingEach { bottom = 0, left = 5, top = 0, right = 0 } ] - (title4 [ Font.family [ Font.monospace ], Font.size 12 ] rightText) + (title4 [ Font.letterSpacing 0.1, Font.size 10 ] rightText) ]