The goal of jointly providing efficiency and fairness in wireless networks can be seen as the problem of maximizing a given utility function. In contrast with wired networks, the capacity of wireless networks is typically time-varying and not known explicitly. Hence, as the capacity region is impossible to know or measure exactly, existing scheduling schemes either under-estimate it and are too conservative, or they over-estimate it and suffer from congestion collapse. We propose a new adaptive algorithm, called Enhance & Explore (E&E). It maximizes the utility of the network without requiring any explicit characterization of the capacity region. E&E works above the MAC layer and it does not demand any modification to the existing networking stack. We first evaluate our algorithm theoretically and we prove that it converges to a state of optimal utility. We then evaluate the performance of the algorithm in a WLAN setting, using both simulations and real measurements on a testbed composed of IEEE 802.11 wireless routers. Finally, we investigate a wireless mesh network setting and we find that, when coupled with an efficient mechanism for congestion control, the E&E algorithm greatly increases the utility achieved by multi-hop networks as well.