My one point of contention with helm is it's too controlling. There is no built in function for enumerating the candidates list, if you happen to want that. The current contents of the minibuffer (whatever you have typed or have not typed) up until recently couldnt be used as as the selection. Now there is a must-match parameter, but it can only be set upon invoking helm and not via a key binding (if you wanted both behaviours). The parameter must-match also doesn't solve the problem of selecting the empty string and selecting the empty string breaks out of helm. I still use helm for when I want strict control over the candidates, such as for running elisp functions with M-x. Ivy, on the other hand, is a much simpler fuzzy-finder. It's more like fzf. I use ivy as the default completing-read function.