I'm working through onchain program development still.

the solana program crate provides a lot of tools necessary.

My first program will just send lamports from one account to another. But i'm not sure what flow I should use.

Do I create a program address then deploy it?

Or do I deploy the program and from there I get a programID to be able to send lamports to?

I think the latter is the ticket. Maybe I just need to create a program to receive lamports. I can insert the programID or address. (are programIds and the same as program addresses?)

This page on accounts helped. https://docs.solana.com/developing/programming-model/accounts

An account is only necessary if the program will persist beyond the initial instruction set. And I can create an account keypair with SystemProgram::CreateAccount.