To convert the unknowns into knowns, you need to aggressively prototype.
What to Prototype?
Here are some examples:
Prototype the use of an API. Create a prototype to see if the API that you need to use works the way you think it does. This includes confirming that it can be called with parameters of the type and range that you can provide. The API may belong to a component that one of your team mates wrote, or it may belong to a third party library. Either way, you want to be absolutely certain about how to use it. No amount of documentation reading will substitute for a well pointed prototype.
Prototype an algorithm. Create a prototype to prove to yourself beyond reasonable doubt that you can implement the solution to a problem.
Prototype an interaction. Create a prototype to show that the interaction sequence or method that you want to use in your application actually works for the intended use. You can take the prototype and usability test it, incorporate the feedback, and then place it into your application.
What should the prototype look like?
Since we are talking about software development, your prototype should be a software program. A small program. As small as possible. A program that answers one or two critical questions and that's it.
The prototype should be like the small program that you write to prove to the API writers that their API has a defect. It has to be small and prove one point. Your objective from the prototype to learn something that you didn't know, or confirm something that you suspected.
How to Prototype?
Pick one or two key questions that you want your prototype to answer and focus your small program answer them. Keep in mind common software engineering and experimentation principles as you decide on how to proceed:
- divide & conquer: write multiple prototypes as needed
- reduce scope: keep the scope of each prototype to a minimum
- isolate concerns: separate the concerns so that you can establish root cause
- confirm behavior: confirm that an API behaves exactly the way you had thought that it would under the conditions that you anticipate
- validate assumptions: validate that what you think is true, it is indeed so
- validate invariants, pre- and post-conditions: half the battle is to identify these; you get extra credit for validating them
I have noticed that after a while some prototypes that started out with the best of intentions, become monsters. Don't be tempted to stick another one or two topics into an existing prototype. Your prototype will become so complicated that you cannot confirm root causes for outcomes. Then you lost your ability to know things for sure.
Lastly: the most important rule is a well worn one: KISS=Keep It Simple & Sufficient.