diff --git a/Makefile b/Makefile index a57b6cd..01f6bbb 100644 --- a/Makefile +++ b/Makefile @@ -2,8 +2,11 @@ html: index.html -index.html: resume.tex - pandoc resume.tex -s --metadata title="Bastian Gruber - CV" -o index.html +index.html: resume.tex res.cls resume.cfg style.css + make4ht -f html5 -c resume.cfg resume.tex + sed -i 's|]*>||; s||Bastian Gruber - CV|' resume.html + mv resume.html index.html + rm -f resume.css pdf: resume.pdf @@ -11,6 +14,6 @@ resume.pdf: resume.tex res.cls pdflatex resume.tex clean: - rm -f index.html resume.aux resume.log resume.dvi + rm -f index.html resume.aux resume.log resume.dvi resume.html resume.css resume.4ct resume.4tc resume.idv resume.lg resume.tmp resume.xref all: html pdf diff --git a/index.html b/index.html index 751df37..e389862 100644 --- a/index.html +++ b/index.html @@ -1,177 +1,159 @@ - - - - - - - Bastian Gruber - CV - - - -
-

Bastian Gruber - CV

-
+ + + Bastian Gruber - CV + + + + + + +
+
Bastian Gruber 
 
 
+
+ + +
Professional  
LinkedIn: linkedin.com/in/bastiangruber 
Project: rustwebdevelopment.com  
E-Mail: gruberbastian@me.com  
+ + +
Code  
GitHub: github.com/gruberb 
Code: code.novanexus.ca  
Website: bastiangruber.ca  
+

SUMMARY

+

Senior Rust engineer and published author (”Rust Web Development” - Manning) with 15+ years building scalable +backend systems. Currently contributing to Firefox at Mozilla, shipping code to hundreds of millions of users. +Founded Rust&Tell Berlin, the largest Rust meetup globally. +

+

SKILLS

+

Languages: Rust, Python, TypeScript, JavaScript, Go
Frontend: React, Angular, Vue.js
Backend: Rust (Actix, Warp, Axum), Python (FastAPI), Node.js, Go
Patterns: REST, GraphQL, gRPC, async Rust, distributed systems (P2P)
Infrastructure: AWS, Google Cloud, Docker, Kubernetes, CI/CD, Grafana
Domains: Systems programming, Firefox, FFI, protocol implementation, IoT, blockchain +

+

PROFESSIONAL EXPERIENCE

+

Senior Software Engineer - Full-time July 2024 - Now +
Mozilla, Remote
Contributing to Firefox (desktop and mobile) shipped to hundreds of millions of users. All work is open source. +

+ +

Senior Systems Engineer, Team Lead - Full-time April 2023 - June 2024 +
Toposware, Remote
Developing a Peer-to-Peer distributed network, with high throughput and low latency. Part of the core team, +consisting out of 4 people. Implementing the protocol and the services in-house. Debugging of production issues, +implementing the core protocol, re-wrote the CLI, led benchmark initiatives, set up part of the CI/CD flow and +Grafana dashboards.

+ +

Senior Software Engineer - Full-time August 2022 - February 2023 +
Centrifuge, Remote
Part of the protocol team implementing the DeFi application on top of Substrate. Working in a self-governed +organization, leading the documentation efforts around Rust and the protocol implementation.

+ + +

Author of ”Rust Web Development” October 2020 - December 2022 +
Manning Publications, Remote
Writing the book ”Rust Web Development”. Research, writing and marketing the book in partnership with +Manning.

+ +

Sr. Solutions Architect (Professional Services) - Full-time June 2020 - August 2022 +
Twilio Inc., Remote
Second Solutions Architect hired for the new EMEA Professional Services team. Enabled enterprise customers to +integrate Twilio APIs through architecture design, code reviews, and hands-on implementation support. +

+ +

Systems Engineer - Contract August 2019 - May 2020 +
Kraken Digital Currency Exchange, Remote (San Francisco)
Part of the first Rust team of the company, replacing the core trading engine with Rust. Worked alongside 12 highly +experienced Software Developers from all over the world. Refactor code from PHP to Rust, wrote new features in +Rust in a well-tested highly secure manner.

+ +

Rust Developer - Freelance March 2019 - July 2019 +
Self Employed, Berlin/Toronto
Took time to deep-dive into Rust, founded the Rust&Tell Berlin MeetUp, contributed to Rust core and created +learning paths for NodeJS developers transitioning to Rust.

+ +

Sr. Software Engineer - Freelance March 2016 - February 2019 +
OSRAM, Körber Digital, Avenga, ERGO Group, GIATA, PaperHive, Glispa (Berlin)
Freelance consultant for enterprise clients. Focus on microservices architecture, IoT platforms, and frontend +development.

+ +

Software Engineer - Full-time August 2015 - February 2016 +
smartB Energy Management GmbH, Berlin
Worked in a small agile team creating an application for business owners to monitor energy consumption. +

+ +

Software Engineer - Freelance March 2015 - July 2015 +
blogfoster GmbH, Berlin
First developer hired to rewrite existing PHP/Backbone application using NodeJS and React.

+ +

Frontend Developer - Full-time February 2014 - March 2015 +
Dalia Research, Berlin
First and sole frontend developer at 8-person startup.

+ +

EDUCATION

+

Bachelor of Science, Computer Science September 2010 - February 2014 +
TH Ingolstadt
Scholarship from Allianz Deutschland AG to study Computer Science, fully funded and with trainings in Scrum, +Java, PL/I and mainframe systems on the side. +

+
+ + + \ No newline at end of file diff --git a/resume.4ct b/resume.4ct new file mode 100644 index 0000000..26be2b4 --- /dev/null +++ b/resume.4ct @@ -0,0 +1,6 @@ +\expandafter\ifx\csname doTocEntry\endcsname\relax \expandafter\endinput\fi +\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-10000}{QQ2-1-1}{\centerline {SUMMARY}}}{1}\relax +\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-20000}{QQ2-1-2}{\centerline {SKILLS}}}{1}\relax +\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-30000}{QQ2-1-3}{\centerline {PROFESSIONAL EXPERIENCE}}}{1}\relax +\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-40000}{QQ2-1-4}{\centerline {EDUCATION}}}{5}\relax +\par diff --git a/resume.4tc b/resume.4tc new file mode 100644 index 0000000..67ad61f --- /dev/null +++ b/resume.4tc @@ -0,0 +1,5 @@ +\expandafter\ifx\csname doTocEntry\endcsname\relax \expandafter\endinput\fi +\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-10000}{QQ2-1-1}{\centerline {SUMMARY}}}{1}\relax +\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-20000}{QQ2-1-2}{\centerline {SKILLS}}}{1}\relax +\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-30000}{QQ2-1-3}{\centerline {PROFESSIONAL EXPERIENCE}}}{1}\relax +\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-40000}{QQ2-1-4}{\centerline {EDUCATION}}}{5}\relax diff --git a/resume.cfg b/resume.cfg new file mode 100644 index 0000000..95ae7a7 --- /dev/null +++ b/resume.cfg @@ -0,0 +1,3 @@ +\Preamble{xhtml,html5} +\begin{document} +\EndPreamble diff --git a/resume.dvi b/resume.dvi index 4477e99..58730d8 100644 Binary files a/resume.dvi and b/resume.dvi differ diff --git a/resume.idv b/resume.idv new file mode 100644 index 0000000..6a411a4 Binary files /dev/null and b/resume.idv differ diff --git a/resume.lg b/resume.lg new file mode 100644 index 0000000..a815e27 --- /dev/null +++ b/resume.lg @@ -0,0 +1,164 @@ +htfcss: cmsl font-style: oblique; +htfcss: cmbx font-weight: bold; +htfcss: cmbxsl font-weight: bold; font-style: oblique; +htfcss: cmbx font-weight: bold; +htfcss: cmbxsl font-weight: bold; font-style: oblique; +htfcss: cmtt font-family: monospace,monospace; +File: resume.html +File: resume.css +File: resume.tmp +Css: p{margin-top:0;margin-bottom:0} +Css: p.indent{text-indent:0;} +Css: p + p{margin-top:1em;} +Css: p + div, p + pre {margin-top:1em;} +Css: div + p, pre + p {margin-top:1em;} +Css: a { overflow-wrap: break-word; word-wrap: break-word; word-break: break-word; hyphens: auto; } +Css: @media print {div.crosslinks {visibility:hidden;}} +Css: table.tabular{border-collapse: collapse; border-spacing: 0;} +Css: a img { border-top: 0; border-left: 0; border-right: 0; } +Font_Css("4"): .small-caps{font-variant: small-caps; } +Font_Css("10"): .htf-cmbx {font-weight: bold; font-style:normal;} +Font_Css("12"): .htf-calligraphy {font-family:cursive} +Font_Css("14"): .htf-italic {font-style: italic;} +Font_Css("16"): .htf-bold {font-weight: bold;} +Font_Css("12"): .htf-calligraphy-bold {font-family:cursive ; font-weight: bold; } +Css: center { margin-top:1em; margin-bottom:1em; } +Css: td center { margin-top:0em; margin-bottom:0em; } +Css: .Canvas { position:relative; } +Css: img.math{vertical-align:middle;} +Css: div.par-math-display, div.math-display{text-align:center;} +Css: body{ margin:1em auto; max-width:80ch; padding:0 .62em; } +Css: h1,h2,h3,h4,h5 { line-height:1.2; } +Css: @media print{ body{ max-width:none } } +Css: .partHead, .likepartHead { font-size: 2em; } +Css: .chapterHead, .likechapterHead { font-size: 1.7411em; } +Css: .sectionHead, .likesectionHead { font-size: 1.5157em; } +Css: .subsectionHead, .likesubsectionHead { font-size: 1.3195em; } +Css: .subsubsectionHead, .likesubsubsectionHead { font-size: 1.1487em; } +Css: @media (prefers-color-scheme: dark) { img[src^="resume"]{filter: invert(1); } } +Css: body { background-color: Canvas; color: CanvasText; color-scheme: light dark; } +Css: li p.indent { text-indent: 0em } +Css: li p:first-child{ margin-top:0em; } +Css: li p:last-child, li div:last-child { margin-bottom:0.5em; } +Css: li p:first-child{ margin-bottom:0; } +Css: li p~ul:last-child, li p~ol:last-child{ margin-bottom:0.5em; } +Css: .enumerate1 {list-style-type:decimal;} +Css: .enumerate2 {list-style-type:lower-alpha;} +Css: .enumerate3 {list-style-type:lower-roman;} +Css: .enumerate4 {list-style-type:upper-alpha;} +Css: div.newtheorem { margin-bottom: 2em; margin-top: 2em;} +Css: div.newtheorem .head{font-weight: bold;} +Css: .obeylines-h,.obeylines-v {white-space: nowrap; } +Css: div.obeylines-v p { margin-top:0; margin-bottom:0; } +Css: .overline{ text-decoration:overline; } +Css: .overline img{ border-top: 1px solid black; } +Css: td.displaylines {text-align:center; white-space:nowrap;} +Css: .centerline {text-align:center;} +Css: .rightline {text-align:right;} +Css: pre.verbatim {font-family: monospace,monospace; text-align:left; clear:both; } +Css: .fbox {padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; } +Css: div.fbox {display:table} +Css: div.center div.fbox {text-align:center; clear:both; padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; } +Css: div.minipage{width:100%;} +Css: div.center, div.center div.center {text-align: center; margin-left:1em; margin-right:1em;} +Css: div.center div {text-align: left;} +Css: div.flushright, div.flushright div.flushright {text-align: right;} +Css: div.flushright div {text-align: left;} +Css: div.flushleft {text-align: left;} +Css: .underline{ text-decoration:underline; } +Css: .underline img{ border-bottom: 1px solid black; margin-bottom:1pt; } +Css: .framebox-c, .framebox-l, .framebox-r { padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; } +Css: .framebox-c {text-align:center;} +Css: .framebox-l {text-align:left;} +Css: .framebox-r {text-align:right;} +Css: span.thank-mark{ vertical-align: super } +Css: span.footnote-mark sup.textsuperscript, span.footnote-mark a sup.textsuperscript{ font-size:80%; } +Css: code.verb{font-family:monospace,monospace;} +Css: div.tabular, div.center div.tabular {text-align: center; margin-top:0.5em; margin-bottom:0.5em; } +Css: table.tabular td p{margin-top:0em;} +Css: table.tabular {margin-left: auto; margin-right: auto;} +Css: td p:first-child{ margin-top:0em; } +Css: td p:last-child{ margin-bottom:0em; } +Css: div.td00{ margin-left:0pt; margin-right:0pt; } +Css: div.td01{ margin-left:0pt; margin-right:5pt; } +Css: div.td10{ margin-left:5pt; margin-right:0pt; } +Css: div.td11{ margin-left:5pt; margin-right:5pt; } +Css: table[rules] {border-left:solid black 0.4pt; border-right:solid black 0.4pt; } +Css: td.td00{ padding-left:0pt; padding-right:0pt; } +Css: td.td01{ padding-left:0pt; padding-right:5pt; } +Css: td.td10{ padding-left:5pt; padding-right:0pt; } +Css: td.td11{ padding-left:5pt; padding-right:5pt; } +Css: table[rules] {border-left:solid black 0.4pt; border-right:solid black 0.4pt; } +Css: .hline hr, .cline hr{ height : 0px; margin:0px; } +Css: .hline td, .cline td{ padding: 0; } +Css: .hline hr, .cline hr{border:none;border-top:1px solid black;} +Css: .hline {border-top: 1px solid black;} +Css: .hline + .vspace:last-child{display:none;} +Css: .tabbing-right {text-align:right;} +Css: div.float, div.figure {margin-left: auto; margin-right: auto;} +Css: div.float img {text-align:center;} +Css: div.figure img {text-align:center;} +Css: .marginpar,.reversemarginpar {width:20%; float:right; text-align:left; margin-left:auto; margin-top:0.5em; font-size:85%; text-decoration:underline;} +Css: .marginpar p,.reversemarginpar p{margin-top:0.4em; margin-bottom:0.4em;} +Css: .reversemarginpar{float:left;} +Css: table.equation {width:100%;} +Css: .equation td{text-align:center; } +Css: td.equation { margin-top:1em; margin-bottom:1em; } +Css: td.equation-label { width:5%; text-align:center; } +Css: td.eqnarray4 { width:5%; white-space: normal; } +Css: td.eqnarray2 { width:5%; } +Css: table.eqnarray-star, table.eqnarray {width:100%;} +Css: div.eqnarray{text-align:center;} +Css: div.array {text-align:center;} +Css: div.pmatrix {text-align:center;} +Css: table.pmatrix {width:100%;} +Css: span.pmatrix img{vertical-align:middle;} +Css: div.pmatrix {text-align:center;} +Css: table.pmatrix {width:100%;} +Css: span.bar-css {text-decoration:overline;} +Css: img.cdots{vertical-align:middle;} +Css: .partToc a, .partToc, .likepartToc a, .likepartToc {line-height: 200%; font-weight:bold; font-size:110%;} +Css: .index-item, .index-subitem, .index-subsubitem {display:block} +Css: div.caption {text-indent:-2em; margin-left:3em; margin-right:1em; text-align:center; margin-top: 0.5rem;} +Css: div.caption span.id{font-weight: bold; white-space: nowrap; } +Css: h1.partHead{text-align: center} +Css: p.bibitem { text-indent: -2em; margin-left: 2em; margin-top:0.6em; margin-bottom:0.6em; } +Css: p.bibitem-p { text-indent: 0em; margin-left: 2em; margin-top:0.6em; margin-bottom:0.6em; } +Css: .subsubsectionHead, .likesubsubsectionHead { font-size: 1em; } +Css: .paragraphHead, .likeparagraphHead { margin-top:2em; font-weight: bold;} +Css: .subparagraphHead, .likesubparagraphHead { font-weight: bold;} +Css: .verse{white-space:nowrap; margin-left:2em} +Css: div.maketitle {text-align:center;} +Css: h2.titleHead{text-align:center;} +Css: div.maketitle{ margin-bottom: 2em; } +Css: div.author, div.date {text-align:center;} +Css: div.thanks{text-align:left; margin-left:10%; font-size:85%; font-style:italic; } +Css: div.author{white-space: nowrap;} +Css: div.abstract p {margin-left:5%; margin-right:5%;} +Css: div.abstract {width:100%;} +Css: .abstracttitle{text-align:center;margin-bottom:1em;} +Css: .subsectionToc, .likesubsectionToc {margin-left:1em;} +Css: .subsubsectionToc, .likesubsubsectionToc {margin-left:2em;} +Css: .paragraphToc, .likeparagraphToc {margin-left:3em;} +Css: .subparagraphToc, .likesubparagraphToc {margin-left:4em;} +Css: figure.float, div.figure {margin-left: auto; margin-right: auto;} +Css: figure.figure {text-align:center;} +Css: figcaption.caption {text-indent:-2em; margin-left:3em; margin-right:1em; text-align:center;} +Css: figcaption.caption span.id{font-weight: bold; white-space: nowrap; } +Css: p + figcaption, img + figcaption{margin-top: 1em;} +Css: .abstract{margin:1em;} +Css: table.tabbing {width:100%; margin-top:1em;} +Css: td.tabbing {width:33%;} +Css: div.section {margin-left:3em;} +Css: .center-addresses {width:100%} +Css: .line-address {text-align:right;} +Css: table.section td{ vertical-align:top;} +Css: td.section {padding-right:2em; width:20%;} +Css: table.section {margin-top:1em;} +Css: .position table {width:100%;} +--- characters --- +Font("cmr","10","10","100") +Font("cmtt","10","10","100") +Font("cmbx","12","12","100") +Font("cmbx","10","10","100") +Font("cmsl","10","10","100") diff --git a/resume.log b/resume.log new file mode 100644 index 0000000..62edfb9 --- /dev/null +++ b/resume.log @@ -0,0 +1,110 @@ +This is pdfTeX, Version 3.141592653-2.6-1.40.27 (TeX Live 2026/dev/Arch Linux) (preloaded format=pdflatex 2026.1.20) 20 JAN 2026 16:26 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**resume.tex +(./resume.tex +LaTeX2e <2024-11-01> patch level 2 +L3 programming layer <2025-01-18> +(./res.cls +Document Style `res' <26 Sep 89>. +Document Class: res 2000/05/19 v1.4b Resume class +(/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2024/06/29 v1.4n Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2024/06/29 v1.4n Standard LaTeX file (size option) +) +\c@part=\count196 +\c@section=\count197 +\c@subsection=\count198 +\c@subsubsection=\count199 +\c@paragraph=\count266 +\c@subparagraph=\count267 +\c@figure=\count268 +\c@table=\count269 +\abovecaptionskip=\skip49 +\belowcaptionskip=\skip50 +\bibindent=\dimen141 +) +No auxiliary output files. + +\tabular@text=\toks17 +\tabular@head=\toks18 +\tabular@tail=\toks19 +\@ta=\toks20 +\undefined@token=\toks21 +\sectionwidth=\dimen142 +\sectionskip=\skip51 +\resumewidth=\dimen143 +\@columnwidth=\dimen144 +\c@numberofcolumns=\count270 +) (/usr/share/texmf-dist/tex/latex/psnfss/helvet.sty +Package: helvet 2020/03/25 PSNFSS-v9.3 (WaS) + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2022/05/29 v1.15 key=value parser (DPC) +\KV@toks@=\toks22 +)) +(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2024-05-08 L3 backend support: PDF output (pdfTeX) +\l__color_backend_stack_int=\count271 +\l__pdf_internal_box=\box52 +) + +LaTeX Warning: Unused global option(s): + [10pt]. + +No file resume.aux. +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 30. +LaTeX Font Info: ... okay on input line 30. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 30. +LaTeX Font Info: ... okay on input line 30. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 30. +LaTeX Font Info: ... okay on input line 30. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 30. +LaTeX Font Info: ... okay on input line 30. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 30. +LaTeX Font Info: ... okay on input line 30. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 30. +LaTeX Font Info: ... okay on input line 30. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 30. +LaTeX Font Info: ... okay on input line 30. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <7> on input line 46. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <5> on input line 46. + + +[1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}{/usr/share/texmf-dist/fonts +/enc/dvips/cm-super/cm-super-ts1.enc}] + +[2] + +[3] + *********** +LaTeX2e <2024-11-01> patch level 2 +L3 programming layer <2025-01-18> + *********** + ) +Here is how much of TeX's memory you used: + 605 strings out of 475171 + 10850 string characters out of 5767095 + 404915 words of memory out of 5000000 + 23670 multiletter control sequences out of 15000+600000 + 560438 words of font info for 41 fonts, out of 8000000 for 9000 + 14 hyphenation exceptions out of 8191 + 49i,8n,52p,364b,200s stack positions out of 10000i,1000n,20000p,200000b,200000s + +Output written on resume.pdf (3 pages, 81198 bytes). +PDF statistics: + 40 PDF objects out of 1000 (max. 8388607) + 24 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 1 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/resume.pdf b/resume.pdf index 50ac27b..55b8252 100644 Binary files a/resume.pdf and b/resume.pdf differ diff --git a/resume.tex b/resume.tex index c9e6bba..083ed2f 100644 --- a/resume.tex +++ b/resume.tex @@ -118,6 +118,15 @@ Part of the protocol team implementing the DeFi application on top of Substrate. \item Co-authored RFCs to enhance the protocol \end{itemize} +{\sl Author of "Rust Web Development"} \hfill October 2020 - December 2022 \\ +Manning Publications, Remote \\ +Writing the book "Rust Web Development". Research, writing and marketing the book in partnership with Manning. +\begin{itemize} \itemsep -2pt +\item Published technical book on building web services with Rust +\item Created comprehensive tutorials covering async Rust, web frameworks, and deployment +\item Book available worldwide through Manning Publications +\end{itemize} + {\sl Sr. Solutions Architect (Professional Services) - Full-time} \hfill June 2020 - August 2022 \\ Twilio Inc., Remote \\ Second Solutions Architect hired for the new EMEA Professional Services team. Enabled enterprise customers to integrate Twilio APIs through architecture design, code reviews, and hands-on implementation support. @@ -128,25 +137,52 @@ Second Solutions Architect hired for the new EMEA Professional Services team. En \item Involved in hiring, onboarding, and scaling the Professional Services team \end{itemize} -{\sl Systems Engineer - Contract} \hfill September 2019 - May 2020 \\ +{\sl Systems Engineer - Contract} \hfill August 2019 - May 2020 \\ Kraken Digital Currency Exchange, Remote (San Francisco)\\ Part of the first Rust team of the company, replacing the core trading engine with Rust. Worked alongside 12 highly experienced Software Developers from all over the world. Refactor code from PHP to Rust, wrote new features in Rust in a well-tested highly secure manner. -\begin{itemize} - \item Re-wrote several PHP services in Rust to increase the throughput 100fold - \item Wrote new services in Rust from the ground up - \item Cross-communication with different teams and the CTO +\begin{itemize} \itemsep -2pt +\item Re-wrote several PHP services in Rust to increase the throughput 100fold +\item Wrote new services in Rust from the ground up +\item Cross-communication with different teams and the CTO \end{itemize} -{\sl Sr. Software Engineer - Freelance} \hfill February 2016 - February 2019 \\ -OSRAM, K\"orber Digital, ERGO Group, GIATA (Berlin) \\ +{\sl Rust Developer - Freelance} \hfill March 2019 - July 2019 \\ +Self Employed, Berlin/Toronto \\ +Took time to deep-dive into Rust, founded the Rust\&Tell Berlin MeetUp, contributed to Rust core and created learning paths for NodeJS developers transitioning to Rust. +\begin{itemize} \itemsep -2pt +\item Founded and organized the monthly "Rust \& Tell Berlin" meetup (now largest Rust meetup globally) +\item Contributed to Rust core and various Rust libraries +\item Created Rust learning resources for NodeJS developers +\end{itemize} + +{\sl Sr. Software Engineer - Freelance} \hfill March 2016 - February 2019 \\ +OSRAM, K\"orber Digital, Avenga, ERGO Group, GIATA, PaperHive, Glispa (Berlin) \\ Freelance consultant for enterprise clients. Focus on microservices architecture, IoT platforms, and frontend development. \begin{itemize} \itemsep -2pt \item Built authentication infrastructure for OSRAM's large-scale IoT platform (Node.js, Go, Lua) \item First engineering hire at K\"orber Digital; established tech stack and real-time data pipelines on AWS +\item Tech Lead at Avenga; enabled Scrum processes and refactored codebase into microservices \item Migrated legacy PHP systems to Node.js microservices with Docker at GIATA +\item Built in-house analytics dashboards and ad platforms at Glispa with AngularJS \item Mentored teams on Scrum adoption and modern JavaScript practices \end{itemize} +{\sl Software Engineer - Full-time} \hfill August 2015 - February 2016 \\ +smartB Energy Management GmbH, Berlin \\ +Worked in a small agile team creating an application for business owners to monitor energy consumption. +\begin{itemize} \itemsep -2pt +\item Full-stack development with JavaScript and Python +\item Heavy use of pair programming and TDD practices +\end{itemize} + +{\sl Software Engineer - Freelance} \hfill March 2015 - July 2015 \\ +blogfoster GmbH, Berlin \\ +First developer hired to rewrite existing PHP/Backbone application using NodeJS and React. +\begin{itemize} \itemsep -2pt +\item Built the first version of the ad marketplace for this young startup +\item Mapped out architecture with CTO; implemented TDD practices +\end{itemize} + {\sl Frontend Developer - Full-time} \hfill February 2014 - March 2015 \\ Dalia Research, Berlin \\ First and sole frontend developer at 8-person startup. diff --git a/resume.tmp b/resume.tmp new file mode 100644 index 0000000..41b58e2 --- /dev/null +++ b/resume.tmp @@ -0,0 +1,2 @@ + +/* css.sty */ \ No newline at end of file diff --git a/resume.xref b/resume.xref new file mode 100644 index 0000000..f1ffd28 --- /dev/null +++ b/resume.xref @@ -0,0 +1,8 @@ +\:CrossWord{)F1F-}{resume.html}{1}% +\:CrossWord{)M1x0}{;}{1}% +\:CrossWord{)M2x0}{;}{1}% +\:CrossWord{)M3x0}{;}{1}% +\:CrossWord{)Qx1-10000}{1}{1}% +\:CrossWord{)Qx1-20000}{1}{1}% +\:CrossWord{)Qx1-30000}{1}{1}% +\:CrossWord{)Qx1-40000}{1}{5}% diff --git a/style.css b/style.css new file mode 100644 index 0000000..0aa72a2 --- /dev/null +++ b/style.css @@ -0,0 +1,160 @@ +/* CV Styles */ +* { box-sizing: border-box; } + +html { + color: #1a1a1a; + background-color: #fdfdfd; +} + +body { + margin: 0 auto; + max-width: 750px; + padding: 40px 50px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif; + font-size: 15px; + line-height: 1.6; +} + +@media (max-width: 600px) { + body { font-size: 14px; padding: 20px; } +} + +@media print { + body { max-width: none; padding: 20px; font-size: 11pt; } +} + +/* Name header */ +.cmbx-12 { + font-size: 28px; + font-weight: 600; + display: block; + text-align: center; + margin-bottom: 5px; +} + +/* Hide empty rows in name table */ +.resume > .tabular:first-child table tr:not(:first-child) { + display: none; +} + +/* Contact info */ +.center-addresses { + width: 100%; + margin: 15px 0 30px 0; + border-collapse: collapse; +} + +.center-addresses td { + padding: 0 20px; + vertical-align: top; + font-size: 14px; + line-height: 1.8; +} + +.first-address { + text-align: right; + border-right: 1px solid #ddd; + width: 50%; +} + +.second-address { + text-align: left; + width: 50%; +} + +@media (max-width: 600px) { + .center-addresses td { + display: block; + width: 100%; + text-align: center; + padding: 10px 0; + border: none; + } + .first-address { + border-right: none; + border-bottom: 1px solid #ddd; + } +} + +.center-addresses .cmbx-10 { + font-weight: 600; + color: #333; + display: block; + margin-bottom: 3px; +} + +/* Section headers */ +.sectionHead { + margin: 35px 0 15px 0; + padding-bottom: 8px; + border-bottom: 2px solid #333; +} + +.sectionHead .centerline { + font-size: 12px; + font-weight: 600; + letter-spacing: 2px; + color: #333; +} + +/* Section content */ +div.section { + margin-left: 0; +} + +/* Job titles */ +.cmsl-10 { + font-weight: 600; + font-style: normal; + color: #222; +} + +/* Bold text */ +.cmbx-10 { + font-weight: 600; +} + +/* Lists */ +ul.itemize1 { + margin: 8px 0 25px 0; + padding-left: 20px; +} + +li.itemize { + margin-bottom: 5px; + color: #333; +} + +/* Paragraphs */ +p { + margin: 0 0 8px 0; +} + +p.noindent { + margin-bottom: 12px; +} + +/* Remove extra spacing from tables */ +.tabular { + margin: 0; +} + +table.tabular { + margin: 0 auto; +} + +/* Links */ +a { + color: #0066cc; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +/* Line breaks styling */ +br.newline { + display: block; + margin-bottom: 2px; +}