C
@protean
As long as I tan into it, there are two main reason for unstable systems and two depending on the type of preoject.
Python: You have to test all paths, so you will not run into typical python problems which you find only during runtime.
i2c problems with the pycom extension boards. You have to run a lot of long time tests. Otherwise you may run into i2c exceptions. Maybe the deepsleep problem is related to this. Sometimes deepsleep does not go to sleep on my pytrack and so the device never wakes up and start your code again. But since 1.20.rc4 I have not run into this problem.
memory fragmentation maybe a problem on larger projects. RAM is limitted. Especially on the old devices. So you cannnot code in the same way as on your PC. You have to keep in mind that the compiler, string and float methods will fragment your memory a lot. You can get around the compiler issue by using a cross compiler on the PC. For the remaining part you have to keep an eye on system. If it need huge buffers, allocate them on an eraly stage and reuse them instead of allocating new ones. Avoid floats and strings. Don't import somewhere during runtime. Import your needed modules in the same way as your huge buffers.
some developers don't see the limits of the radio systems. There seems to be no feedback when they are too noisy and the radio submodule forces them to be silent.
Sadly there is no option to log erros onto SD card. So it's hard to see, that most problems are related to typos, forgotten self. and memory fragmentation. I have seen a project which started to build a GC which was able to reorganize the allocated objects. Would be great to have these two features as an option in micopython.