"Is running the development environment on the desktop and using ftp to upload changes an effective way to develop sites?" - No, for several reasons. Primarily, because some changes are made to the database, not WordPress files, and ftp can't transfer database changes.
In general, I have found that the only real "pre-production level" test site is a clone of the live site, on the same web server. There are just too many WordPress problems that happen due to web server "issues". I have now standardized on creating test.domain.com for every domain.com I have for WordPress. Yes, there is some risk, since a missed link during the cloning could move a unaware developer from Test to Production without his knowledge. "Always watch the Address Bar in your browser".
In terms of Major Versions of a web site -- i.e. - a ton of changes, all at once, I have found great success with using http://codex.wordpress.org/Giving_WordPress_Its_Own_Directory
Here is how the approach works, conceptually. WordPress is actually in a folder called "wp", but looks, to the web user, like it is running in the root of the domain, as all the visitor URLs DO NOT have /wp/ in them.
The next version of the web site, perhaps for WordPress theme Twenty Thirteen, would be in folder /wp2013/. It just takes a few seconds to change index.php in the root to point to the new folder. There is, however, a requirement for a Content Freeze while /wp2013/ is being built and final testing done just before making it Live.
I do initial development of php code on xampp on a Windows Desktop. You could gain portability with a laptop using the same approach.
Building your own custom Plugins are an awfully good way to add php code to a Production site, but they are a dangerous way to make quick changes on a live site. As in The White Screen of Death. If I have to test php code on a live site, I use shortcodes installed with this plugin: http://wordpress.org/extend/plugins/shortcode-exec-php/
Update: not previously having seen jholder's comment, I should say that he has a very good idea. My only addition to it is that you should build the virtual machine as closely as you can to the live system, i.e. - same version of Linux and all other software, with the same settings, especially PHP memory limits.