Hosted by Valantic (valantic.com)
***
Our fourth MUC++ meeting in 2026 will be on April 23rd. We'll have the pleasure to welcome Martin Hořeňovský to our user group. Martin currently works in the R&D team at Pex, on automatic audio/video/melody content recognition. He also used to teach C++ at CTU in Prague, and still maintains Catch2. This leaves him with a lot of opinions on testing, and strangely also on randomness in C++
***
Main talk by Martin Hořeňovský
Title: Perfect Code doesn't exi...
Perfect code doesn't exist, right? There are always tradeoffs, complications and hidden complexities in the way. At least until now. I wrote the perfect C++ function, and I'll show it to you. What's more, I'll prove it to you, using all the different automated tools and approaches we commonly rely on during development: compiler warnings, static analysis, code coverage and others.
In practical terms, I will showcase various tools we use during development; what issues they can catch, what issues they do catch, and why they protect us from Murphy, but not Machiavelli.
***
Short talk by Marin Hofbauer
Title: Improving Developer Experience: A Practical Approach to IDE Support in Large-Scale C++ Projects using Bazel and VSCode
Abstract: Bazel is a powerful build system, especially well-suited for large-scale, multi-language codebases, which is actively used by companies such as Google, BMW, or Nvidia. However, its integration with C++ IDEs remains far from ideal. Unlike CMake, which offers mature IDE support out-of-the-box, Bazel’s limited IDE integration creates friction for developers who rely on features like auto-completion, cross-references, and debugging within tools like Visual Studio Code.
A possible explanation for this is that Bazel is typically used in very large-scale projects, where IDEs themselves often struggle to index the sheer size of the codebase. Additionally, since Bazel supports several programming languages, a general IDE support for all languages is hard to achieve. Projects such as https://github.com/build-server-protocol try to simplify this integration with an abstraction layer, but are not yet available.
Additionally, many IDEs and developers expect common command-line tools to be available in the system PATH, which leads to duplicated effort: one set of tools is managed within the build system, while another must be separately maintained for development use. This fragmentation leads to subtle inconsistencies, onboarding hurdles, and a degraded development experience.
In this talk, we present a practical solution to this problem: a methodology that ensures the exact same tools and toolchains managed by Bazel are also used by the local development environment and IDEs. By combining open-source projects such as bazel_env.bzl and bazel-compile-commands with clangd and VSCode, we create a setup that provides accurate and high-quality IDE support, even large and complex C++ codebases.
To illustrate this approach, we have open-sourced a demo project at https://github.com/hofbi/bazel-ide. Of particular note is the devcontainer environment, which shows that this workflow requires only git, bazel, and direnv to be installed locally while everything else is provided and managed by the build system.
Bio: Markus is working on Developer Productivity at Zipline. This team develops and maintains the build system, developer tooling, and the CI/CD system to enable other developers and non-engineers to build and release high-quality software products in a modern development environment. Markus received his PhD in Electrical and Computer Engineering from the Technical University of Munich where he is still teaching principles of software engineering to students.
***
Live Stream: TBA
***
Schedule
18:00 -- Welcome with Snacks and Drinks
19:00 -- Welcome by Valantic/MUC++
19:05 -- Introduction Valantic
19:25 -- Markus Hofbauer: Improving Developer Experience: A Practical Approach to IDE Support in Large-Scale C++ Projects using Bazel and VSCode
19:55 -- Networking Break
20:20 -- Martin Horenovsky: Perfect Code doesn't Exist
~22:15 -- Official End