Somebody, please, have a go at computer programming.
These days, the accepted proper technique is to code small routines, bottom-to-top. Anything that makes you have to scroll on an average monitor is considered large. Modern compilers have excellent optimization capabilities, small pieces of code can be welded together to make an efficient program (I will not touch on the advantages of verbosity because that is not relevant here).
The brain works prettymuch the same way. Thousands of concise elements do simple things, more small elements coördinate the actions of the simple elements, on up the hierarchy to the functions we can seem to observe acting at the uppermost levels. Our brains are like huge maple trees, with our consciousness focused at the trunk. And we can see about to the epipelagic depth of our function, nowhere near its benthic depths. What forms our choices is sometimes obvious, but often obscured by many layers.
My favorite exercise for observing this is to look, something I picked up from a Japanese fencing manual. Just try to see everything in your field of view. Everything. After doing this for a minute or so, how ever much you can stand, take some time to reflect on how much you are not seeing almost all the time. Your brain is discarding humongous amounts of information constantly, and you are not really even aware that it is happening most of the time.
That is just a tiny windowpane into the depths of your mind. What goes on in there (like how you get a sudden urge to write or paint or break into song or whatever) is not to be treated lightly. You can describe the origins or your choices and actions as “free will”, but that is little more than hand-waving that adds nothing of value to the conversation. Until we can realistically map the whole of the brain’s source code, and then start to understand how the routines interact with each other, all this vacuous philosophizing is inconsequential. Fapilosophy, I guess.