Choosing names and arguments that don't make it clear the tradeoffs. Example void * AllocateSharedMemory ( int sizeInBytes) When it turns out that AllocateSystemMemory can only allocate in chunks of 16k or more. Think about how a user might use it. What if they start allocating small strings with this function? It might arguably be better to change it to void * AllocateSharedMemoryBlocks ( int blockCount) By changing the name to MemoryBlocks it makes it clear without docs (at the call point) that it's not in bytes and that you probably need to find out the size of the blocks. Also it makes it clear it's not appropriate for allocating lots of small things.