I saw a post a little while ago asking: what are the fundamentals every developer should learn. I couldn't think of a good reply at the time (and now I can't find the post). I could think of a lot of things that it would help most people to know, and thought of saying something about how the human and business side of it is often more influential than the software side. I thought of listing some computer science concepts.
But are these really fundamental to the development of software? People without formal CS education can succeed just fine in software development. People sometimes develop software for personal use, without a business case in mind. And computers might one day develop software for their own use, without humans being involved.
There are some things that are nearly universal. For example (as one commenter to the post I mentioned suggested), virtually every piece of software you interact with, and every language you use, is either written in C, written in something that was written in C, or interpreted by something that was written in C, etc. C seems to have hit a sweet spot in terms of low-level control and portability. However, it's possible to develop software in assembler or machine code, and one could imagine an alternative ecosystem that built on top of that in a way that didn't include a C-like language.
Most languages have control flow, but one could also consider creating complex Excel spreadsheets to be a form of programming. One could imagine an alternative ecosystem based on Excel-like objects, with no concept of "the statement currently being executed".
More specialized kinds of software development might have fundamentals. If you're a web developer, the nature of the web is probably fundamental to what you do: HTTP, pages, CSS, the DOM. On the other hand, someone could come up with an abstraction that makes those things irrelevant for the average developer.
Is abstraction fundamental? Most of the things I've listed so far are examples of building abstractions upon a lower level architecture. However, it's possible to write programs without creating new abstractions.
What about principles of software engineering? Design, testing, and getting clear on requirements certainly help you write better software. Breaking things down into small, shippable pieces, à la Agile certainly help keep a project on track. But sometimes people develop software without knowing any of those things, and sometimes it goes fine.
I'm definitely not saying you should throw out everything you know. There are absolutely concepts that are important to either the history or the current state of software development. I'm just not sure that it truly has fundamentals in the same way that, say, physics does. What do you think?
I hope you've enjoyed this dose of nihilism. Here's a Weird Al song.