È più difficile imparare la parte oop o la programmazione di basso livello (nel senso di gestione della memoria, ecc..)??
Secondo me è indubbiamente più complessa la seconda..
Per questo se hai delle buone basi con il c (e quindi di basso livello), è più semplice "integrare" la programmazione a oggetti (imho).
Sono due cose diverse, la oop è un paradigma di programmazione, la seconda è un tipo di linguaggio.
Sebbene non sia una pratica assai seguita, è possibile fare OOP su linguaggi low level come ASM (
Object-Oriented Programming in Assembly Language | Dr Dobb's)
In più un linguaggio come C (cito il commento sopra) è un linguaggio imperativo ma facilmente "switchabile" a OOP (con il C++).
Diciamo che in base al linguaggio il manuale tende a insegnare il paradigma più appropriato (solitamente in base alla natività del linguaggio), se il linguaggio è fortemente OOP difficilmente lo si studierà come imperativo (vedi Ruby), in quanto poi tutto ciò che ne concerne (Framework e librerie in primis) saranno programmate con il paradigma OOP.
Se uno parte con Pascal o Fortran troverà difficile la programmazione OOP, su questo non c'è alcun dubbio, ma non significa che l'OOP sia difficile. Io personalmente provenendo da linguaggi imperativi come PHP 4 ho avuto difficoltà a passare a OOP con il 5, appunto perchè non ero abituato. Ho trovato più semplice l'uso di un linguaggio funzionale (altro paradigma usato per la programmazione in multithreading come Erlang => Elixir) ma rimane solo un paradigma, niente di più.
La programmazione a basso livello invece è il modo in cui puoi interagire con il computer che runna il software: un linguaggio ASM sarà più difficile da scrivere rispetto a un linguaggio di alto livello come Perl o Javascript perchè non ha una natura di programmazione dei controller di memoria, puntatori, vettori e via dicendo, quindi non c'è la necessità di conoscere architetture di processori nè di riallocare memorie e via dicendo.
La complessità di un linguaggio non è sempre direttamente proporzionale al paradigma che si usa: spesso si fa questa confusione (ed è giusto che sia così) quando si fa il passaggio da linguaggio ad alto livello (spesso interpretato) a linguaggio di basso livello (compilato) a cui si devono dare maggiori attenzioni specie in argomenti mai affrontati come appunto la memoria e le allocazioni in esse, soprattutto perchè in un linguaggio ad alto livello non si potrà mai gestire la memoria (che invece viene gestita in automatico dall'interprete).
IMHO se dovessi ricominciare a programmare partirei con Elixir, il giusto compromesso di linguaggio di programmazione che permette di sviluppare un software funzionante in meno di 2 settimane con un'ottima gestione del multithreading (e quindi un pieno supporto alle tecnologie multicore) senza lo sbatti di dover usare librerie esterne e funzioni ridondanti per riallocare processi e via dicendo. Se poi si vuole solo "giocare" con la programmazione qualunque linguaggio interpretato ad alto livello va bene, dipende solo dall'uso che se ne vuole fare. Tutto a prescindere dal paradigma, imperativo - OOP - funzionale che sia.