I guess EEPROM and ICSP and self-writing devices enabling bootloaders weren't always the norm.
Previously to PICs I was using 8031 and 68HC05 with external EPROM, and before that Z80. Most MCUs back then were mask programmed. You could get windowed EPROM versions for development, but they were very expensive and took 20 minutes to erase (and often failed after a few write/erase cycles). I also obtained an 8031 variant that had a 'piggyback' EPROM socket on top of the chip.
whole not having a return command... i.e. you can't even preserve the W register upon returning from a subroutine. Third... no interrupts..? It is painful to even write assembly for these baseline devices.
And yet they could still be useful. My first PIC project was an
ESC for RC models. That little PIC was able to read a 1-2ms servo pulse with glitch filtering and failsafe, generate 2.7kHz PWM, apply the brake and check for low battery voltage, all in real time. It replaced an analog circuit that used several ICs and was less sophisticated.
assembly isn't even efficient. You spend 3 or 4 times as much code to do the same thing, if you can even do it at all.
Actually this isn't quite true. PIC has a 'RISC' instruction set that might appear to need more code, but every instruction is only 1 word and most execute in a single CPU cycle (4 clock cycles). You may need more lines of assembler
source code to do the same job as a typical CISC MCU, but the machine code is often more compact and faster. For example the original 8031 took several bytes and 12 clock cycles or more to do simple things like testing a bit in a register.
The PIC just does things a bit differently. On baseline PICs you set W to a literal value when returning from a subroutine, so you have to put variable return values into a 'file register' (RAM) instead. But file registers in the PIC are like CPU registers in other architectures, so in reality all values
are returned in registers! The stack only has 2 levels, but with no interrupts and no PUSH or POP you know exactly how much stack is required. You can only call subroutines 2 levels deep, but most of the time this is plenty for the things you can do in 511 words of ROM or less (and when it isn't you just inline the code).
the baseline PIC is more trouble than it is worth if you need accuracy of the internal oscillator.
This was true of older chips such as the 12C509, but modern versions are a lot more accurate. Loosing the calibration value is only a problem if you use bad tools. At least PICs don't brick themselves if you choose the wrong oscillator option like AVRs do.
Baseline PICs certainly are limited, but when introduced they were a big advancement over other MCUs when you needed a compact device to do a simple job. And with the 10F series they still are. Of course now with the 10F322 you have even more power (midrange instruction set, 16MHz clock, ADC, PWM, Configurable Logic Cell etc.)