Until 2003 most of the software I wrote was exclusively for my own use, or for use primarily in businesses that I was part of. This included a significant amount of systems software – because early personal computers were far less capable than todays embedded systems and the systems software I needed did not exist.
Today most of what I write is embedded software for clients. I work with numerous embedded systems, but the greatest demand is for Linux. I have been using Linux since version 1.3. I switched to Linux on my personal computers about 4 years ago. I have OS X86, OpenBSD, and Windows XP installed on the machine I am using right now. I spend 99.9% of my time in Linux. I did this because I like Linux and because I grew frustrated with windows. I also use Linux because most of the embedded systems I work with run Linux and because almost all the systems I develop for are far more like Linux that Windows. I am constantly learning, because I am using Linux all the time, much of what I learn is about Linux, and some software that I write for embedded Linux devices I test on my own systems. I can not run a Xilinx Local Link TEMAC driver on an x86 desktop, but I can run the Atheros AR9170 USB Wifi driver. In many instances I emulate embedded hardware on my desktop. I can test file system drivers for NAND Flash systems on my desktop without NAND, as well as network bootloaders, …. In most instances I write and test as much as possible on my desktop before addressing the few hardware specific issues on the target system. Most of the embedded systems I write for are big endian and my desktop is little endian this assures that most of my software is portable. Running the same software on a number of different systems exposes problems that can be hard to find on the target. I keep a large collection of different systems – PowerPC Laptops, embedded ppc’s, ARM’s, x86′s, softprocessors. Where feasible I test on as many disparate systems as reasonable.
To the extent possible, I use the software that I write.