Hi! I’ve been thinking about this for a while. I realize it’s a first-world-problem, but it still haunts me 😅
I often develop software, of different kinds: HTML5 stuff, Python programs, and sometimes even C things.
My main development machine is my desktop GNU+Linux PC. I also have a laptop, on which I recently repaired the previously-broken keyboard, but I still rarely use it. I will now get to why.
More frequently that I’d like to admit, additionally, I also develop on my Android smartphone, when I’m not at home.
I don’t bring my laptop anywhere, because it’s a 2KG 15" beast. The best I can do is to use it around the house, moving it from my desk.
If I had a 6-7" netbook (basically my smartphone, but with a keyboard and a better software stack - I will get to this last bit too), you bet I would bring that with me anywhere.
Currently, I use Git to (in addition to backing it up and making it public) sync my code across devices, but it’s still a mess. Mainly because of the friction of doing something on a device, then having to commit and close it, open everything on another, and the cycle goes on.
Because yes, I need to open and close stuff.
I use my PC for stuff that’s other than just programming, and can’t just leave stuff open, I need to turn it off when not in use because it wastes a lot of energy. At the same time, turning it off means wasting time because on HDD - unless I want to reinstall Alpine Linux, where everything was blazing fast but the need of configuring every system thing by hand killed me - everything takes ages to load.
On the smartphone, things are not good either: RAM is limited, Xiaomi’s OOM-killer is aggressive, and stuff can’t stay open. Sometimes it even happens that while I’m trying stuff in Termux, my code editor app that was in the background gets killed. At least, flash memory means everything reopens quick.
Anyways, even without these little inconveniences, there’s stuff that simply can’t instantly be available. I can’t edit a text file on a machine and having the editor on another automatically have the latest version of my file, let alone stuff like the cursor position… At least with my current development tools.
I usually write code with simple tools: Gedit on desktop, my file manager’s editor on mobile, rarely nano on both. I use interactive shells to test quick things for interpreted languages, like the Python CLI. Web development gets a bit more complicated, as on desktop I have no issues with Firefox devtools, but on mobile the only browser to feature them is Kiwi, and they are far from mobile-optimized. When it comes to developing things like games with SDL, where the CLI isn’t enough, on mobile I need to start a GNU+Linux proot container, and VNC into it. Finally, I use Git CLI to push/pull code.
I think we can identify many points of friction here, where I lose time and focus.
Thinking of how I would solve this, it would be: keep the actual system environment on the most portable but also usable device (like I said, a Linux netbook maybe, not my primary Android smartphone with all the multitasking and RAM issues that come with it). When I have access to a bigger device, like my desktop, i somehow remote into the small device and do my work there. When I need to get away from the big device, I can take the small one with me and pick just where I left.
Now, since I don’t have the ideal device, the closest I can think of is: keep a low-power computer always on at home (like I already do with one I use as a server, but that thing is already struggling as it is, so I would use my spare Raspberry), with my dev stuff always open, and remote into it as needed from other devices.
But, here come another issue: how do I actually remote into it?
VNC is not really an option. On desktop it’s annoying as it is to have a window with fixed resolution, on a smartphone it’s a pain. Not to mention, the lag. I could use remote X11 on my PC, and have native windows spawn from the dev machine to my local desktop… not on Android though. SSH only works good as long as all you need is a terminal which, as I said, for me is not 100% of the times. There aren’t even terminal code editors that I really like.
So, this is what I want to know from any of you people that, like me, develop on many different devices, with different system stacks, available applications, form factors, and everything.
Is there any solution more optimal than VNC? Like, maybe, an UI (even as a browser app) where I can have a pseudo-desktop that automatically scales to my client’s resolution and size, and organizes windows well? Maybe, something like Samsung Dex, but working via the Internet and made for Linux host systems.
Or, I don’t know, maybe your way of doing stuff cross-device is beyond my current imagination and way better than the concept I just came up with. Tell me that too!
Learn about hibernation. Cuts time from a full power-off state to replicating your last known state completely from several minutes to 30 seconds even on my fairly old, slow machine.
I already use hibernation on my desktop, actually - but I have to close some of my programs before hibernating or I will find the system is a super slow. Linux handles RAM and swap management, from my experience, a less well than what the current NT (the Windows kernel) does.
You encrypted your file system, didn’t you?
Hm yeah, does that make a difference with a decent CPU? On my current PC I’ve never noticed any difference, with or without drive encryption.
The way drive encryption is implemented on Linux makes it really gross for hibernation. A whole lot of time is wasted.