# Gerrit User Summit 2024 - Speakers

### Luca Milanesio - CEO, GerritForge {#dmilanesio}

With 33 years of experience in all aspects of Source Control Management, CI/CD
and Application Lifecycle Management, I have contributed to the success of many
large companies across the globe.

I co-founded GERRITFORGE 16 years ago, when I then join forces with Google,
Qualcomm, SAP and the other Gerrit contributors to fuel innovation and drive the
Gerrit Code Review open-source project. I play an active role in the OpenSource
Community, contributing to several major projects.
* Jenkins Continuous Integration (http://www.jenkins-ci.org) since 2007 in
cooperation with CloudBees (www.cloudbees.com)
* Gerrit Code Review (https://code.google.com/p/gerrit/) and JGit
(https://projects.eclipse.org/projects/technology.jgit) since 2011 in
cooperation with Google (www.google.com) and SAP (www.sap.com) I have been
speaking in international conferences (Krakow, Varsaw, San Francisco, Palo Alto,
GooglePlex - Mountain View) and author of whitepapers and books on Git and
Gerrit Code Review.

### Jacek Centoswki - Senior Software Engineer - SoftwareMill {#jcentoswki}

I am a software engineer and architect with experience across various domains.
Over time, I’ve seen how good architecture and thoughtful design choices
directly influence the quality, maintainability, and long-term impact of a
product.

I care about practical, scalable designs and clear separation of concerns. In my
work, I focus on designing and maintaining systems that support change and are
easy to reason about. I believe that during the implementation phase, code
reviews are a crucial step - and making them as efficient as possible pays off.

Outside of work, I contribute to open source, particularly Gerrit Code Review,
where I’m active as a developer, maintainer, and occasional speaker.

### Farshad Kazemi - MLOps/SE researcher - Arteria AI {#fkazemi}

Yet another developer seeking to find the answer to "why" questions!

### Antonio Barone - Senior Sofware Engineer - GerritForge inc. {#abarone}

Gerrit maintainer and Release manager

### Vasdev Gullapalli - Senior Staff Site Reliability Engineer/Manager - Qualcomm {#vgullapalli}

Vasdev Gullapalli is a Senior Staff Engineer and Manager at Qualcomm,
specializing in Site Reliability Engineering, DevOps, and platform engineering.
With over 15 years of technology leadership, he architects and manages
large-scale software delivery platforms, including GitHub, GitLab, and Gerrit,
supporting over 100,000 engineers worldwide.

### Fredrik Medley - Lead Architect - Meroton {#fmedley}

Fredrik is the Lead Architect at Meroton, focusing on improving developer
experience by finding the bottlenecks in the build, test and bug-fixing flows.
He has used Gerrit and Zuul since 2013, Bazel since 2017 and is a maintainer of
Buildbarn.

### Martin Fick - Senior Software Configuration Management Engineer - NVIDIA {#mfick}

I was the first person (along with Saša Živkov) to be appointed as a Gerrit
maintainer by Shawn in 2011 while working for Qualcomm, and I have been
contributing and working in the Gerrit ecosystem ever since. While working at
NVIDIA, I also recently became a jgit committer and hope to contribute a lot
more to both for another decade at least.

At Qualcomm I helped design many of the plugin extensions such as the ability to
tie in plugin arguments to ssh commands and to add search operators and search
output from plugins. I also did most of the development of the task plugin and
designed most of the batch plugin. I significantly helped push many
multi-primary technologies forward, including guiding how to make jgit accurate
and performant on NFS in these situations. I helped reduced the memory
consumption of cached index files to help servers scale better with thousands of
repositories, and more recently I have helped significantly improve the
performance of fetches and H2 caches.

### Scott Chacon - CEO - GitButler {#scachon}

Scott Chacon is the former cofounder of GitHub; now cofounder of GitButler, a
next generation version control client, based in Berlin. Scott helped grow
GitHub from 4 cofounders to 450 employees over 8 years, eventually being
acquired by Microsoft for $7.5 billion. Scott is also the author of Pro Git,
published by Apress and found online at git-scm.com. In unrelated news, he holds
a WSET Level 3 certification in Wines and Spirits and owns a dog rescue outside
of Berlin.

### Patrick Steinhardt, GitLab {#psteinhardt}

I have started contributing to Git and libgit2 more than 10 years ago and am
nowadays one of the core Git contributors. I care deeply about the whole Git
community and have contributed to large projects like the reftable backend and
pluggable object databases, but also to countless other smaller projects.
Nowadays I am employed by GitLab as engineering manager of the Git team, where I
coordinate our upstream contributions into the Git project.

### Skyler {#skyler}
Hi, I'm Skyler (pronouns she/her)!

I'm a software engineer - working professionally to bring LibreOffice based
office editing to your browser - which means I use both Gerrit (when writing
LibreOffice) and GitHub (when writing Collabora Online) on a regular basis.

To me, code is inherently a collaborative endeavor - even my dotfiles are shared
with friends(!) - so I care about high quality code review and crafting a commit
history that is maximally useful to anyone reading my commits (be it my friends
today or myself in the future...).