One thing I’d emphasize is that absolute beginners are often intimidated by the tools themselves. Faced with the incomprehensibly obscure console commands or IDEs with myriads of mysterious-looking buttons and dialog boxes, it can be hard to figure out how to even start writing simple beginner-level programs, especially if the language itself requires that even the simplest programs must include some obscure-looking code for initialization, declarations, imports, etc. Thankfully, these days you can probably find good tutorials on the web that should make these initial steps less scary.
As for the beginning language, that strongly depends on what your goals are. To become a good generalist, I would recommend learning C and assembly (for whatever architecture; x86 is probably not a good choice for beginners compared to e.g. MIPS), and also studying the inner workings of compilers (i.e. how parsers, optimizers, and code generators work, and also how various high-level language constructs map onto the concrete memory layout and machine code patterns). When faced with a novel language, this should allow you to immediately figure out what’s the rationale behind its various features that would otherwise look arbitrary and strange. Also, in my experience, moving from C to almost any imperative language, including object-oriented languages, is a fairly easy transition. (I have very little experience with functional languages, but these also have to run on top of virtual machines written in imperative ones.)
Of course, if you have more specific goals in mind, like focusing on web programming or numerical calculations, a different and less generalist approach is probably advisable.
One thing I’d emphasize is that absolute beginners are often intimidated by the tools themselves. Faced with the incomprehensibly obscure console commands or IDEs with myriads of mysterious-looking buttons and dialog boxes, it can be hard to figure out how to even start writing simple beginner-level programs, especially if the language itself requires that even the simplest programs must include some obscure-looking code for initialization, declarations, imports, etc. Thankfully, these days you can probably find good tutorials on the web that should make these initial steps less scary.
As for the beginning language, that strongly depends on what your goals are. To become a good generalist, I would recommend learning C and assembly (for whatever architecture; x86 is probably not a good choice for beginners compared to e.g. MIPS), and also studying the inner workings of compilers (i.e. how parsers, optimizers, and code generators work, and also how various high-level language constructs map onto the concrete memory layout and machine code patterns). When faced with a novel language, this should allow you to immediately figure out what’s the rationale behind its various features that would otherwise look arbitrary and strange. Also, in my experience, moving from C to almost any imperative language, including object-oriented languages, is a fairly easy transition. (I have very little experience with functional languages, but these also have to run on top of virtual machines written in imperative ones.)
Of course, if you have more specific goals in mind, like focusing on web programming or numerical calculations, a different and less generalist approach is probably advisable.