First of all you need to make it clear to yourself what kind of magic system you really want. As far as i know there is no common definiton for it, but i would call it scientific magic vs blackbox magic. You want scientific magic.
Blackbox Magic is somewhat unapproachable, unintuitiv and not explainable. Most games like Skyrim and most other games do it like that. There might be a source for the magic, but magic effects are just THERE. And either they are usable and recreatable (by casting spells or binding them to items) or they are part of the world (like magical creatures, portals and other magical effects).
Scientific Magic is what i like to call magic that is approachable, repeatable and able to get almost infinitly complex. Instead of the caster saying 'Fire ball' and a flaming ball of exploding fire flies in the enemies face, the caster understands, that his spell first weaves a ball of in a magic matrix, fill that ball with mana, adjust this infused mana with the aspect of fire and propel it with a fling of another magic matrix. If this sounds like an engineer process... well, it is. And as this all seems constructed, maybe there is a way around it.
So to design this engineering approach, i also want to adress some of htmlcoderexe's examples, as i find some of them quite fitting, while others not so much.
As i said, this kind of magic has to be approachable. What i mean is, that in its basics, it should seem logical. Fire is hot and the opposite of cold. If something is moving, a force has been applied, etc.
Your magic system needs to have basic elements, that do something, but not a lot.
In addition to that, if you combine two of those basic elements, something different might happen.
Lets combine two elements and try the spell -> Something happens.
Combine the elements in the same way -> Same thing happens.
Combine the elements in another way -> The same thing or something different happens.
Anything else and the player might be discouraged to try something new because... something new could happened if he does the same thing again... so why change?
Now instead of two basic elements, build some more complex elements from several basic elements, combine those to a greater effect (and more mana required) and to create more complexe elements or to archive different effects.
I dont want to trick you. To archive this kind of depth, you certainly will to implement some kind of 'Programming', but the trick is to not let the player have the feeling that it is. So lets design it.
Imagine this. In your world is a language, that conveys magic effects into the real world. Something like the dragon language from Skyrim.
Lets asume you have some basic words (our basic elements) your player starts with. Deep down in a ruin, he finds the word for Iref, but does not know, what it does. He speaks the word and something in his hands begins to burn, maybe even some of his clothes. From this he knows, that Iref is Fire. Not very useful yet, but somewhere else he finds the word Llab and casts it, and he sees a 'ball of magic' infront of him.
As a natural explorer, he tries 'Iref Llab' and a magic ball filled with fire appeares. It does not move and if touched, it just bursts like a bubble, not like an explosion. And so he tries to find new words and combines them.
To implement it, let the player have some kind of writing board, where he writes those runes (maybe more like drag and drop) or something and arrange them like he thinks it is right. Technical this IS programming, but the fun behind is to figure out the way you are able to programm more complex stuff.
Now you can think of other ways to modify the interactions. E.g. instead of fire the player gets Temperature. Now it makes a difference how he combines that with the ball. 'Temperature Ball would be a ball filled with fire, while Ball Temperature would be an ice ball. ** Temperatur Ball Velocity ** would push that Fireball away from the caster, while Velocity Temperatur Ball would push the ball against the caster etc.
Later on an experienced caster would get more complexe elements like **temperature ball* or ** ball temperature* as an own Word to implement in the spell, and even this could be combined to more complex spells.
- A fire ball that really explodes
- A Healing Aura with different targets
- Creating intelligent creatures from differen basic elements
- A ball filled with multiple fireballs (something like a cluster grenade)