Thirteen years have passed since the initial public release of AFL.
There is no doubt that AFL was the catalyst for the boom in coverage-guided fuzzing.
During this period, trillions of CPU hours have been spent by major vendors running coverage-guided fuzzers.
In academia, thousands of papers have been published, each claiming to fuzz better than the last.
It is the right time to look back at this hype.
Researchers and practitioners alike are releasing their own tools and techniques, and users must choose from among a vast number of options.
Simply put, we have too many choices and too many degrees of freedom.
This thesis aims to provide an overview of recent fuzzing advances and to offer users a ``second opinion'' on their fuzzing practices.
We examine the current state of fuzzing from three different standpoints.
First, we ask whether there is a principled way to determine which fuzzer is best suited for a given target program.
This addresses the question of what to run from our fuzzing arsenal.
We show that static properties of a program, extractable at compile time, correlate with the runtime performance of different fuzzing techniques.
Certain fuzzers work better on certain targets, and this correlation is simple yet powerful enough to enable prediction.
We use a machine learning model to recommend the best fuzzer configuration for a given program before any fuzzing trial is run.
Second, we study the reliability of fuzzing evaluations.
This addresses the question of how to run and evaluate fuzzers rigorously.
Fuzzing is inherently stochastic, but the extent of this randomness is widely underestimated.
We identify and quantify the sources of non-determinism in fuzzing campaigns, stemming from both the target program and the fuzzer itself.
We empirically show that the number of independent trials commonly used in the literature is far from sufficient to draw statistically robust conclusions.
Lastly, we ask how to run fuzzers given a fixed CPU budget.
Nowadays, fuzzing campaigns routinely involve many CPU cores, with practitioners running many fuzzer instances in parallel.
Yet the relative efficacy of sequential fuzzing on a single core versus parallel fuzzing across many cores remains understudied.
We present the first study under a constant CPU-time budget and quantify the advantage that parallel fuzzing offers.
This addresses the question of how to best use available hardware resources for a fuzzing campaign.
Together, these contributions guide practitioners toward better fuzzing campaign design, enabling more informed decisions at every stage.