Accurately estimating time needed to make a program is a skill you will acquire with experience.
In between a few things can help you
I use this software
ToDoList 7.0.8 - An effective and flexible way to keep on top of your tasks[
^], it is a hierarchical ToDoList, it means you can cut a task in as many subtasks as you need and on as many levels as you need.
The forum is very active if you need help.
Principle:
Make a main task for your project
make a sub-task per functionality (from the user point of view)
on next level enumerate the internal features you need to create that functionality.
assign estimates when the subtask is clear enough or subdivide again if you need.
All your estimates will be collected to the main task, it is your estimate for the project.
As the project advance, you check the subtasks advancement and report real time spend.