Whatever fundamentals are necessary to understand the things that I’m likely to come across while programming (I’m hoping to go into data science, if that makes a difference). I don’t know enough to know which particular fundamentals are needed for this, so I guess that’s actually part of the question.
Well, if you’ll be going into data science, it’s unlikely that you will care greatly about the particulars of the underlying hardware. This means the computer-science branch is more useful to you than the physical-execution one.
I am still not sure what kind of fundamentals do you want. The issue is that the lowest abstraction level is trivially simple: you have memory which can store and retrieve values (numbers, basically), and you have a processing unit which understands sequences of instructions about doing logical and mathematical operations on those values. That’s it.
The interesting parts, and the ones from which understanding comes (IMHO) are somewhat higher in the abstraction hierarchy. They are often referred to as programming language paradigms.
The major paradigms are imperative (Fortran, C, Perl, etc.), functional (LISP), logical (Prolog), and object-oriented (Smalltalk, Ruby).
They are noticeably different in that writing non-trivial code in different paradigms requires you to… rearrange your mind in particular ways. The experience is often described as a *click*, an “oh, now it all makes sense” moment.
I guess a good starting point might be: Where do I go to learn about each of the different paradigms? Again, I’d like to know the theory as well as the practice.
Whatever fundamentals are necessary to understand the things that I’m likely to come across while programming (I’m hoping to go into data science, if that makes a difference). I don’t know enough to know which particular fundamentals are needed for this, so I guess that’s actually part of the question.
Well, if you’ll be going into data science, it’s unlikely that you will care greatly about the particulars of the underlying hardware. This means the computer-science branch is more useful to you than the physical-execution one.
I am still not sure what kind of fundamentals do you want. The issue is that the lowest abstraction level is trivially simple: you have memory which can store and retrieve values (numbers, basically), and you have a processing unit which understands sequences of instructions about doing logical and mathematical operations on those values. That’s it.
The interesting parts, and the ones from which understanding comes (IMHO) are somewhat higher in the abstraction hierarchy. They are often referred to as programming language paradigms.
The major paradigms are imperative (Fortran, C, Perl, etc.), functional (LISP), logical (Prolog), and object-oriented (Smalltalk, Ruby).
They are noticeably different in that writing non-trivial code in different paradigms requires you to… rearrange your mind in particular ways. The experience is often described as a *click*, an “oh, now it all makes sense” moment.
I guess a good starting point might be: Where do I go to learn about each of the different paradigms? Again, I’d like to know the theory as well as the practice.
Google is your friend. You can start e.g. here or here.