A blockchain is a big database that keeps track of things, like bitcoins. They have a clever way of allowing people to transfer balances but without having anyone in control.
A global, open system to keep track of balances is a powerful thing. It's like a bank without the bank.
If we're talking about transferring a bitcoin, the transaction looks like this: Alice sends Bob 1 bitcoin. Pretty simple.
However, what if we could make the transactions a bit more complicated? What if we could recreate something like a joint checking account? Where you need 2 people to sign off on the transaction.
In a blockchain setting, it would look like this: Alice and Bob agree to send 1 Bitcoin to Carol.
This is what it means for a blockchain to be programmable. You can create any condition you want for some money to be spent.
This is essentially what smart contracts are. Preconfigured conditions to a customized transaction.
Imagine a will: Put all $ into a preprogrammed account that will distribute all of Bob's money to Alice if Bob doesn't check-in once every 6 months.
Because Ethereum has a programming language built-in where anyone can create customized transactions, almost any type of transaction is possible.
This is Ethereum's leapfrog improvement over Bitcoin.
In Ethereum there are 2 types of accounts. Normal ones that human beings control, and contract accounts. Contract accounts are filled with computer code that anyone can preprogram and deploy. When you send money to them it does what the code tells it to.
This way you can have immutable, preprogrammed agreements that you can guarantee will execute exactly as programmed (sometimes to bad effect).
Executing agreements in open-source code reduces the need for 3rd parties and is more open, transparent, and efficient.