├── davidverhasselt.pdf ├── README.md ├── tweaks.sty └── davidverhasselt.tex /davidverhasselt.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DV/resume/master/davidverhasselt.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This is my personal résumé, as rendered by LaTeX using a customized `moderncv` package. 2 | 3 | If you're interested in hiring me, hit me up on david@crowdway.com. 4 | 5 | # Usage 6 | 7 | Install mactex: 8 | 9 | brew cask install mactex 10 | 11 | Run pdflatex: 12 | 13 | pdflatex davidverhasselt.tex 14 | 15 | -------------------------------------------------------------------------------- /tweaks.sty: -------------------------------------------------------------------------------- 1 | % Tweaks to make my CV look like I want it to 2 | 3 | % Command to layout keywords nicely 4 | \newcommand{\cvkeywords}[1] { 5 | \hspace{0.75em}\emph{#1} 6 | \vspace{0.25em}\newline 7 | } 8 | 9 | % This command is copied in full, except for two [b]s changed into [t] to make the name 10 | % and title stick to the top instead of the bottom. 11 | \renewcommand*{\makecvtitle}{% 12 | % recompute lengths (in case we are switching from letter to resume, or vice versa) 13 | \recomputecvlengths% 14 | % optional detailed information (pre-rendering) 15 | \def\phonesdetails{}% 16 | \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number 17 | \protected@edef\phonesdetails{\phonesdetails\protect\makenewline\collectionloopitem\hspace{5pt}\csname\collectionloopkey phonesymbol\endcsname}}% 18 | \def\socialsdetails{}% 19 | \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link 20 | \protected@edef\socialsdetails{\socialsdetails\protect\makenewline\collectionloopitem\hspace{5pt}\csname\collectionloopkey socialsymbol\endcsname}}% 21 | \newbox{\makecvtitledetailsbox}% 22 | \savebox{\makecvtitledetailsbox}{% 23 | \addressfont\color{color2}% 24 | \begin{tabular}[t]{@{}r@{}}% 25 | \ifthenelse{\isundefined{\@addressstreet}}{}{\makenewline\@addressstreet\hspace{5pt}\addresssymbol% 26 | \ifthenelse{\equal{\@addresscity}{}}{}{\makenewline\@addresscity}% if \addresstreet is defined, \addresscity and addresscountry will always be defined but could be empty 27 | \ifthenelse{\equal{\@addresscountry}{}}{}{\makenewline\@addresscountry}}% 28 | \phonesdetails% needs to be pre-rendered as loops and tabulars seem to conflict 29 | \ifthenelse{\isundefined{\@email}}{}{\makenewline\emaillink{\@email}\hspace{5pt}\emailsymbol}% 30 | \ifthenelse{\isundefined{\@homepage}}{}{\makenewline\httplink{\@homepage}\hspace{5pt}\homepagesymbol}% 31 | \socialsdetails% needs to be pre-rendered as loops and tabulars seem to conflict 32 | \ifthenelse{\isundefined{\@extrainfo}}{}{\makenewline\@extrainfo}% 33 | \end{tabular} 34 | }% 35 | % optional photo (pre-rendering) 36 | \newbox{\makecvtitlepicturebox}% 37 | \savebox{\makecvtitlepicturebox}{% 38 | \ifthenelse{\isundefined{\@photo}}% 39 | {}% 40 | {% 41 | \hspace*{\separatorcolumnwidth}% 42 | \color{color1}% 43 | \setlength{\fboxrule}{\@photoframewidth}% 44 | \ifdim\@photoframewidth=0pt% 45 | \setlength{\fboxsep}{0pt}\fi% 46 | \framebox{\includegraphics[width=\@photowidth]{\@photo}}}}% 47 | % name and title 48 | \newlength{\makecvtitledetailswidth}\settowidth{\makecvtitledetailswidth}{\usebox{\makecvtitledetailsbox}}% 49 | \newlength{\makecvtitlepicturewidth}\settowidth{\makecvtitlepicturewidth}{\usebox{\makecvtitlepicturebox}}% 50 | \ifthenelse{\lengthtest{\makecvtitlenamewidth=0pt}}% check for dummy value (equivalent to \ifdim\makecvtitlenamewidth=0pt) 51 | {\setlength{\makecvtitlenamewidth}{\textwidth-\makecvtitledetailswidth-\makecvtitlepicturewidth}}% 52 | {}% 53 | \begin{minipage}[t]{\makecvtitlenamewidth}% 54 | \namestyle{\@firstname\ \@lastname}% 55 | \ifthenelse{\equal{\@title}{}}{}{\\[1.25em]\titlestyle{\@title}}% 56 | \end{minipage}% 57 | \hfill% 58 | % optional detailed information (rendering) 59 | \llap{\usebox{\makecvtitledetailsbox}}% \llap is used to suppress the width of the box, allowing overlap if the value of makecvtitlenamewidth is forced 60 | % optional photo (rendering) 61 | \usebox{\makecvtitlepicturebox}\\[2.5em]% 62 | % optional quote 63 | \ifthenelse{\isundefined{\@quote}}% 64 | {}% 65 | {{\centering\begin{minipage}{\quotewidth}\centering\quotestyle{\@quote}\end{minipage}\\[2.5em]}}% 66 | \par}% to avoid weird spacing bug at the first section if no blank line is left after \makecvtitle 67 | -------------------------------------------------------------------------------- /davidverhasselt.tex: -------------------------------------------------------------------------------- 1 | %% Copyright 2006-2013 Xavier Danaux (xdanaux@gmail.com). 2 | % 3 | % This work may be distributed and/or modified under the 4 | % conditions of the LaTeX Project Public License version 1.3c, 5 | % available at http://www.latex-project.org/lppl/. 6 | 7 | 8 | \documentclass[11pt,a4paper,sans]{moderncv} % possible options include font size ('10pt', '11pt' and '12pt'), paper size ('a4paper', 'letterpaper', 'a5paper', 'legalpaper', 'executivepaper' and 'landscape') and font family ('sans' and 'roman') 9 | \usepackage[utf8]{inputenc} 10 | 11 | % adjust the page margins 12 | \usepackage[scale=0.75, top=1.5cm, bottom=1.5cm, left=1.5cm, right=1.5cm]{geometry} 13 | 14 | % moderncv themes 15 | \moderncvstyle{classic} % style options are 'casual' (default), 'classic', 'oldstyle' and 'banking' 16 | \moderncvcolor{blue} % color options 'blue' (default), 'orange', 'green', 'red', 'purple', 'grey' and 'black' 17 | \RequirePackage{tweaks} 18 | %\renewcommand{\familydefault}{\sfdefault} % to set the default font; use '\sfdefault' for the default sans serif font, '\rmdefault' for the default roman one, or any tex font name 19 | %\nopagenumbers{} % uncomment to suppress automatic page numbering for CVs longer than one page 20 | 21 | \setlength{\hintscolumnwidth}{2.5cm} % if you want to change the width of the column with the dates 22 | %\setlength{\makecvtitlenamewidth}{10cm} % for the 'classic' style, if you want to force the width allocated to your name and avoid line breaks. be careful though, the length is normally calculated to avoid any overlap with your personal info; use this at your own typographical risks... 23 | 24 | 25 | 26 | % personal data 27 | \name{David}{Verhasselt} 28 | \title{Senior Software Engineer, Contractor} 29 | \address{Tallinn, Estonia \& Ghent, Belgium} 30 | \phone{+372~559~59~633} 31 | \email{david@crowdway.com} 32 | \homepage{www.davidverhasselt.com} 33 | \social[linkedin]{dverhasselt} 34 | \social[twitter]{davidverhasselt} 35 | \social[github]{dv} 36 | \extrainfo{Belgian, eligible for work in EU and UK\\willing to relocate} 37 | 38 | % \photo[64pt][0.4pt]{picture} % optional, remove / comment the line if not wanted; '64pt' is the height the picture must be resized to, 0.4pt is the thickness of the frame around it (put it to 0pt for no frame) and 'picture' is the name of the picture file 39 | % \quote{Some quote} % optional, remove / comment the line if not wanted 40 | 41 | % to show numerical labels in the bibliography (default is to show no labels); only useful if you make citations in your resume 42 | %\makeatletter 43 | %\renewcommand*{\bibliographyitemlabel}{\@biblabel{\arabic{enumiv}}} 44 | %\makeatother 45 | %\renewcommand*{\bibliographyitemlabel}{[\arabic{enumiv}]}% CONSIDER REPLACING THE ABOVE BY THIS 46 | 47 | %---------------------------------------------------------------------------------- 48 | % content 49 | %---------------------------------------------------------------------------------- 50 | \begin{document} 51 | %----- resume --------------------------------------------------------- 52 | \setlength{\makecvtitlenamewidth}{400pt} 53 | \makecvtitle 54 | 55 | % \section{Experience} 56 | % \subsection{Vocational} 57 | % \cventry{year--year}{Job title}{Employer}{City}{}{General description no longer than 1--2 lines.\newline{}% 58 | % Detailed achievements:% 59 | % \begin{itemize}% 60 | % \item Achievement 1; 61 | % \item Achievement 2, with sub-achievements: 62 | % \begin{itemize}% 63 | % \item Sub-achievement (a); 64 | % \item Sub-achievement (b), with sub-sub-achievements (don't do this!); 65 | % \begin{itemize} 66 | % \item Sub-sub-achievement i; 67 | % \item Sub-sub-achievement ii; 68 | % \item Sub-sub-achievement iii; 69 | % \end{itemize} 70 | % \item Sub-achievement (c); 71 | % \end{itemize} 72 | % \item Achievement 3. 73 | % \end{itemize}} 74 | % \cventry{year--year}{Job title}{Employer}{City}{}{Description line 1\newline{}Description line 2} 75 | % \subsection{Miscellaneous} 76 | % \cventry{year--year}{Job title}{Employer}{City}{}{Description} 77 | 78 | % TODO: Talk about docker? 79 | 80 | \vspace{-10pt} 81 | \section{Profile} 82 | Senior software engineer with 5 years of professional web development experience on the back-end and front-end using \textbf{Ruby}, \textbf{Ruby on Rails} and \textbf{Javascript}. 83 | 84 | I prefer BDD with Rspec and Capybara and am a big proponent of object oriented best practices like SOLID. I'm active in the open source community and regularly invest time in learning about the latest technologies and keeping my skills up to date. 85 | 86 | \vspace{10pt} 87 | \section{Technical Skills} 88 | \subsection{Extremely Proficient With} 89 | \cvline{languages}{Ruby, CoffeeScript, JavaScript, HTML5, CSS3} 90 | \cvline{technologies}{\small Rails, Rspec, Haml, Sass, Ajax, Git, Vim, Redis, PostgreSQL, Sphinx, Nginx, Facebook APIs, Google APIs, Docker, Backbone.js, jQuery, Bootstrap, Stripe, Oauth} 91 | % But also: Nanoc, JSON, Bourbon, Compass, Stripe.js, Tropo API, Google Contacts API, Oauth, Facebook API, Facebook Open Graph, Google Calendar API 92 | \subsection{Have Experience With} 93 | \cvline{languages}{\small Python, C, C++, PHP, Java, Bash \& Zsh Scripting, Swift, Objective-C, Actionscript 3} 94 | \cvline{technologies}{\small Scrum, Sinatra, Memcache, CDN, WebGL, MySQL, Elastic Search, Cocoa, Nginx, CUDA, Flex} 95 | % But also: Solaris, Ubuntu, Debian, CentOS, OSX, Sublime, Latex, VHDL, Haskell, Mozart, Tmux 96 | 97 | \vspace{10pt} 98 | \section{Experience} 99 | \cventry{2014--2015}{Rails Engineer}{PieSync, Consultant}{}{}{ 100 | \cvkeywords{Ruby, Ruby on Rails, Coffeescript, Stripe, Ecommerce, Microservices, APIs} 101 | Built the Ecommerce subscription functionality for the PieSync SaaS service, integrated with Stripe allowing users to sign-up and pay, and expanded the customer-facing dashboard. Also worked on the internal back-end responsible for synchronizing different APIs. Helped integrate the platform with several different CRM APIs. 102 | } 103 | 104 | \vspace{10pt} 105 | \cventry{2013--present}{Lead Developer}{ICE Technologies, Consultant}{}{}{ 106 | \cvkeywords{Ruby on Rails, Google APIs, Domain Registrar APIs, Sphinx, Performance} 107 | In charge of gradually upgrading and adding features to the internal management and sales system. Added integration with Google Calendar and Google Contacts, and the ability to register domain names for clients from within the application. Greatly improved performance using memcache and Javascript. 108 | } 109 | 110 | \vspace{10pt} 111 | \cventry{2013--present}{Lead Developer}{Tightship, Consultant}{}{}{ 112 | \cvkeywords{Ruby on Rails, Sphinx, Elastic Search, Solaris, Performance} 113 | Managed to convert a poorly maintained codebase from Rails 2.1 to Rails 4. Improved performance from 12 seconds per page view to \textless3 seconds using code improvements and careful caching. Refactored away technical debt in line with the client's budget. 114 | } 115 | 116 | \vspace{10pt} 117 | \cventry{2007--present}{Founder, Developer}{Seenly}{}{}{ 118 | \cvkeywords{Ruby on Rails, Javascript, Facebook Graph API, Backbone.js, Scalability, PostgreSQL, WebGL} 119 | Photobooth-like web app. Created first version using Actionscript 3 and PHP, later completely rewrote it using Ruby on Rails, HTML5 and WebGL. Bootstrapped to 850K unique visitors a month with over 51 million photos taken to date. Integrated with Facebook to allow users to upload photos. 120 | } 121 | 122 | \vspace{10pt} 123 | \cventry{2014}{Project Manager}{Onio Technologies, Consultant}{}{}{ 124 | \cvkeywords{Javascript, Ecommerce} 125 | Lead internationalization of sales webpage and added multi-currency and VAT-compliance using geo identification to the shopping cart. 126 | } 127 | 128 | \vspace{10pt} 129 | \cventry{2011--2012}{Rails Engineer}{Reverse Robocall, Consultant}{}{}{ 130 | \cvkeywords{Ruby on Rails, Heroku, Telephony API, Spree, Authorize.net, Ecommerce} 131 | Built web app where users could purchase automated robocalls to politicians. Integrated Spree, a shopping cart environment, with Tropo, a Twilio-like Telephony API, to call users and record their message as part of the purchasing process. Automated sending hundreds of robocalls to politicians. 132 | \\ 133 | \emph{Reverse Robocall was featured on Slashdot and Ars Technica.} 134 | } 135 | 136 | \vspace{10pt} 137 | \cventry{2008--2010}{Web Application Developer}{Ghent University}{}{}{ 138 | \cvkeywords{PHP, MySQL, Linux} 139 | Maintained and extended the internal administration web app used by over 100 student organizations. 140 | } 141 | 142 | \vspace{10pt} 143 | \cventry{2004--2008}{Sysadmin}{Student organization Zeus WPI}{}{}{ 144 | \cvkeywords{Linux, Solaris, Sysadmin} 145 | % The student organization for computer enthusiasts at Ghent University. Maintained Linux and Solaris workstations and server park and provided admin services for members. Over the years I held several board positions, including president and treasurer. 146 | } 147 | 148 | \cventry{2003}{Freelance developer}{Matrix Orbital}{}{}{ 149 | \cvkeywords{Delphi, Microcontrollers, Embedded Systems} 150 | % Created an internal test system for their products. Interfaced over RS-232 with several different types of LCD displays. Included over 50 customizable tests the user could schedule for each display. 151 | } 152 | 153 | \vspace{10pt} 154 | \section{Open Source Contributions} 155 | Creator of the popular \textbf{redis-semaphore} gem which utilizes Redis to implement distributed semaphores as Dijkstra intended. It includes fail safety using timeouts to guard against client failures. 156 | 157 | I have also made significant contributions to other popular open source projects such as Rails, less-rails, acts\_as\_tree and BubbleWrap. See \underline{\href{https://github.com/dv}{my github profile}} for details. 158 | 159 | \vspace{10pt} 160 | \section{Education} 161 | \cventry{2008--2010}{MS Computer Science Engineering}{Ghent University}{Belgium}{}{} 162 | \cvitem{\small minor}{\small Information and Communications Technology} 163 | \cvitem{\small honors}{\small Cum Laude} 164 | \cventry{2004--2008}{BS Computer Science}{Ghent University}{Belgium}{}{} 165 | 166 | \vspace{10pt} 167 | \section{Master thesis} 168 | \cvitem{title}{\bfseries{Affine Motion Compensation using Translational 169 | Motion Vectors on the GPU}} 170 | \cvitem{supervisors}{Bart Pieters, Stijn Notebaert, Rik Van de Walle} 171 | \cvitem{}{\small Using CUDA I architected and developed an affine motion compensation process to be run on the GPU, and inserted it into a reference H.264 video encoder to improve video compression without sacrificing speed.} 172 | 173 | \vspace{10pt} 174 | \section{Spoken Languages} 175 | \cvdoubleitem{\bfseries Dutch}{Excellent (Native)}{\bfseries English}{Excellent} 176 | \cvdoubleitem{\bfseries French}{Intermediate}{\bfseries German}{Basic} 177 | \cvdoubleitem{\bfseries Estonian}{Basic}{}{} 178 | 179 | % Footer 180 | \vfill 181 | \begin{center} 182 | \small 183 | \today\hspace{3pt}-- Latest version available on \href{http://www.davidverhasselt.com/resume}{www.davidverhasselt.com/resume} -- Source on \href{http://github.com/dv/resume}{github.com/dv/resume} 184 | \end{center} 185 | % \clearpage 186 | \end{document} 187 | --------------------------------------------------------------------------------