I was at a similar stage to you recently and I found using a IVR was a good solution. An IVR is like a digital receptionist, it allows the user to dial extension numbers once they reach the IVR.
You can download and install the IVR from the admin/module admin page. Then you should find IVR in the applications list. You will then need to add a new IVR, give it a name and set direct dial to extensions, this allows users to dial extension numbers when in the IVR. You will need to submit the changes before you can add it to the inbound route.
I am presuming that you already have an inbound route setup for dealing with the incoming calls to your main number or DID, If not then create one. Then at the bottom under set destination you can send it to your new IVR.
The user should then be able to dial the main number, then once connected dial the extension number.
This assumes Bob is only calling this number to speak to Alice (or whatever their names were). If you need to enable Bob to dial different extensions then yes, you need an IVR giving some choice - Not really to dial extensions but perhaps accessing a directory of names/numbers and selecting or dropping off to the operator. For the ultimate in versatility (and inviting chaos) you’d allow any caller to dial any extension - unheard of if you ask me - without guidance that is.