Si, è normale che funzioni! Le variabili non sono impostate solo allo step 1 e 3. Per eliminare i notice (i notice vanno eliminati via codice, cioè evitando che vengano prodotti e non nascosti con error_reporting!) basta usare isset:

Codice PHP:
if( isset( $_POST ) ) {
   
$nome=ucwords($_POST['nome']);
   
$cognome=ucwords($_POST['cognome']);
   
$invia=$_POST['invia'];
   
$insert=$_POST['insert'];

Quello di sopra è un modo generale.

Puoi però effettuare il controllo seletivamente in questo modo

Codice PHP:
if( isset( $_POST['nome'] ) ) {
   
$nome ucwords($_POST['nome']);
}

// ecc. 
Il controllo selettivo lo puoi anche contrarre in questi due modi
Codice PHP:
// I metodo
if( isset( $_POST['nome'] ) )
   
$nome ucwords($_POST['nome']) ;

// II Metodo
// Operatore ternario: alla var viene assegnato
// un valore vuoto se $_POST non esiste

$nome = ( isset( $_POST['nome'] ) ) ? ucwords$_POST['nome'] ) : '' 
Per ciò che riguarda la semplicità di PHP esso è veramente semplice ma all'inizio, se non hai precedenti esperienze di programmazione, può confondere un po' (come tutti i linguaggi!). Prova ad imparare il C o il C++ e poi vedi se il PHP è semplice o meno! Tutto è relativo!