At Uber, we ignite opportunity by setting the world in motion. We take on big problems to help drivers, riders, delivery partners, and eaters get moving in more than 600 cities around the world.
We welcome people from all backgrounds who seek the opportunity to help build a future where everyone and everything can move independently. If you have the curiosity, passion, and collaborative spirit, work with us, and let's move the world forward, together.
About the Role
Engineers in this role work across teams and across layers of the stack to solve open-ended performance problems for Uber's server infrastructure. We take the long view and respond strategically to problems with our long-term focus on performance and efficiency. We define metrics, build novel tools and visualizations, and use them to solve real problems.
You will help Uber grow its service to more people around the world by scaling its back-end infrastructure gracefully. You will help Uber's code achieve and maintain high standards of performance and efficiency. You will understand and work across layers of abstraction, from distributed systems to the kernel to language runtimes. With enough experience, you will partner with a large number of development and infrastructure teams to independently solve challenging open-ended problems.
You will use your experience in Java development and performance analysis to solve performance problems specific to the Java language and runtime.
What You'll Do / What You'll Need / Bonus Points / About the Team
What You'll Do
* Do deep systems and software work to improve performance and efficiency for Uber
* Use performance analysis tools (such as tracers, profilers, logs) to debug application-level problems
* Build new tools to further such performance analysis
* Diagnose system performance issues, propose improvements in code and configuration to achieve desired system performance
* Run the full cycle from diagnosis, code change/review, deployment, to verifying impact
What You'll Need
* Ability to reason methodically about performance: what matters most, is it CPU usage? Cache effects? Allocations? GC pressure? Locks? I/O? How do you know?
* Understanding of systems-level performance effects such as:
* Transaction latency and throughput
* Kernel or user-space level scheduling effects
* Blocking effects such as file/network IO, locking, and synchronization
* Minimum 2 years experience with the Java language
* Experience benchmarking and profiling Java code
* Experience modifying code to improve the performance of a Java (micro)service
* Ability to monitor operating system metrics for resource usage
* Understanding of JVM tuning, including the JIT compiler
* Experience optimizing performance of Java threads and synchronization
* Experience monitoring and tuning Java garbage collection
* Experience with Java heap analysis, memory leak diagnosis, memory use reduction
Bonus Points If
* Experience optimizing code for processor cache effects
* Experience detecting and fixing synchronization issues (e.g. lock contention)
* Knowledge of Linux systems including procfs CPU accounting (top et al), thread state, and CFS scheduler effects
* Familiarity with typical performance data presentations, such as a flamegraph, critical path graph, or a simple top-N hot functions list
About the Team
We are the Performance Engineering team, part of the Efficiency team. The charter of the Efficiency team is to help ensure that Engineering teams are taking full advantage of the infrastructure resources allocated to them. The Performance Engineering team does a range of deep technical work in pursuit of better performance and efficiency.
Uber is a provider of a mobile application connecting passengers with drivers for hire.