Ah, my own code writing career spanned a mere 30 years though 10 years further on, I’m still addicted to code writing.
For those who wish to take absolute best advantage of hardware, assembler is imo unbeatable, with its direct correspondence to hardware. Trouble with assembler is, it is different for each processor family, with a big learning curve for each new architecture. In my own career I have written code of which I am rather proud, for certainly proprietary mainframes, for Motorola 68000, and for Microchip PIC. But I have never been able to justify the time to learn how to efficiently code Intel assemblers, so I’d not be a good person for an Intel assembler project.
Along came ‘C’, one goal of which was to provide a good chance of machine-independent correspondence to most processors’ assembly languages. It has for many years been the favourite for devs with whom I worked, simply because you can generally get a good idea, from looking at what you have written, how much code it will occupy, and with what memory footprint. In my own career, OS internals and protocol stacks, performance and efficiency was all-important, and with custom designed hardware performance was set in concrete, so nobody liked to get further from the hardware than ‘C’.
Object-oriented variations such as C++ and its variants, allow an amazing amount of functionality to be obtained from a single line of code, and are well suited to abstract problems. Trouble is, it can be very hard to envisage what machine code that line of code will generate, hence very difficult to know whether it is efficient enough. But if your goal is to must write something that works, in a short time, and you have the option to simply specify a faster CPU if your code runs too slow, OO languages can be very useful.
And then of course, there are the proliferation of other platform-independent interpreted languages, like Basic, Java, Python etc. All have their uses, but generally hugely inefficient, if your mission is to make every CPU cycle count.
In summary, I’d say that good (emphasise
good) programming in ‘C’ should be a mandatory skill for anybody serious about programming as a career, even if not used on a daily basis. If you can write good ‘C’ you can probably learn any assembler. A bit like studying the Highway Code is mandatory for getting a driving licence, or when learning to cycle.