A few years ago I wrote a blog post about the development environment for building xLim 2 applications. Ben recently uncovered it and asked a question if anything has changed since then. Yes, it did. 2 years are a huge time interval, especially when you try to learn as fast as you can. So let's talk about my current software environment around the PC workstation which is mainly used for the development (there also is a notebook for develop-while-you-travel and an iPad for learning and planning, but that's a different story which I'll tell later, if you're interested).
Side story - what is this xLim?
For those of you who are still confused with the whole xLim concept, here's how it showed up.
3.5 years ago, while working remotely as a Developer and Team Lead in an American company I got fed up with the absolute lack of progress in the project (it hit hard the complexity barrier) and decided that it should be possible to do better with much fewer resources, than 5-15 developers. Much fewer meant - just one developer or slightly more.
When you have idea, passion and a bravery to follow it (which is sometimes referred as "childish stupidity" by more conservative part of the society), then two things are certain to follow:
- cool name (xLim standing for eXtensible Lightweight Information Management system);
- a bunch of hard lessons and disappointments.
So they did show up on the horizon rather soon and were put to a good use. Practical experience was turned into the first "lessons learned" report, which actually opened me the way to the first remote freelance project and even more experience.
You can still download the report and associated screenshots from the xLim page (just scroll to the very bottom).
Lessons were continuously learned (or learnt in GB English) since then and recorded in form of the reports, articles and teaching materials for the Russian teams I happened to manage and train from time to time. Most part of them was republished as articles within the xLim series.
Every time there was a decent paradigm shift in the perception of the problem at hand (and the simplest possible solutions that work in practice), xLim version number was incremented. Every next version incorporated the best of the experience from the previous steps, but reshuffled the whole vision and opened room for new paradigms and further movement forward. Current version is 4 - "xLim 4: CQRS in the Cloud" and I still maintain that you can build and run incredibly rich and beneficial applications without spending a lot of resources or time))
OK, let's get back to the point - how does my development environment look right now, in October 2010, while it matches xLim 4.
IDE, Required Tools and Libraries
- Visual Studio 2010 (mine is Ultimate, but Professional is enough)
- Microsoft .NET Framework 4.0 (TPL and Rx for .NET are a must)
- ReSharper 5.1 (some things never change, just get better)
- NUnit for Unit Testing
- Mercurial (TortoiseHg) or Git (TortoiseGit) for version control (as long as this is not CVS, SVN, TFS or SourceSafe).
- Autofac IoC Container
- Protobuf-net for fast and efficient serialization, implementing custom storage formats.
- ASP.NET MVC with MvcContrib and a dash of jQuery (completely replaces DXperience in web).
- SQLite for file-based databases with incredible performance, SQL syntax and schema-tolerance (i.e.: you can put 4MB Blob into INT field).
- Reflector for .NET
- Putty SSH client.
- RabbitMQ - preferred message server implementing AMQP (in cases when I don't have to use Azure Queues)
As you can see SQLite is the only persistence-focused item in this list. There is no SQL Express, mySQL, Oracle or, NHibernate+FluentNHibernate+LINQ with all libraries it uses. I'm still using them on a daily basis because of the existing projects (or databases we need to integrate with). Plus NHibernate is featured in Lokad.CQRS (as a single library) because that's what people are mostly used to.
However, in my personal mental model (and while evolving projects) ORMs are being rotated out along with the relational databases - with a great success, more flexibility and simplicity. Check out the article on CQRS, Reliability and Redundancy. It may not seem particularly simple in the theory, yet when it gets to the code (backed up by the reasoning), things do get more simple and efficient.
In addition to a few things being removed or replaced, there is a new and critically important piece: cloud computing. Virtual Machines from Rackspace Cloud are used frequently. For example, when I need test against some version of DB engine, which I don't want to install on my development machine. That's 1-3 minutes to provision Ubuntu and SSH into it and a few more to apt-get and configure mySQL instance. That's a bit faster than Windows Azure (which takes just half an hour to update Worker Role) which I also happen to use at Lokad.
Obviously, Cloud Computing, as perceived from the point of efficient development, is not just a quick way to get VMs to play with and pay pennies for that. Cloud storage and on-demand computing are actually affecting the whole concept of xLim 4 and allow an individual to build systems that could compete with corporations in scalability and flexibility (and still fit within a limited budget). The concept of Almost-infinitely scalable systems (as applied to CQRS) would be much more complex to achieve without cloud computing. Just check out the CQRS Roadmap for the better high-level picture.
- Launchy (keystroke launcher that I also configured to open ticket shortcuts in various trackers).
- FSCapture - for making screenshots.
- Fiddler2 - the best tool to debug these AJAX Calls or REST APIs (esp. when you need to prove to Azure team that their APIs do not behave according to the documentation)
- JetBrains dotTrace profiler
- KeePass Password Safe - for keeping my passwords, logins and sensitive configuration settings.
- JungleDisk (Desktop Edition) - for backing up my files into the cloud (in encrypted way) and transparently syncing them between the machines.
- FoxitReader - because Adobe PDF reader is an overkill.
- Evernote - to gather small notes, articles and reference materials.
- 7-Zip - the Archive Manager
- Windows 7 64 bit - the best operating system that works with Visual Studio 2010.
- GhostDoc - VisualStudio Add-in for generating XML documentation stubs.
Please note, that a few of these items create additional value outside my development machine. For example, Evernote and Jungle Disk frictionlessly sync important information between my development PC, travel notebook and an iPad.
Development Environment Collaboration
Strict development environment requirements from xLim 2 are getting obsolete. With the cloud and SaaS services available you can rent various wikis, issue trackers and version control repositories at rather competitive rates or even for free (for smaller projects). For everything else there is a cloud. Open source projects benefit significantly from offers like: Google Projects and Google Sites.
At Lokad we are currently using CodebaseHQ (Mercurial hosting + issue tracker), Google Sites and self-hosted CruiseControl.NET (yes, this one is antique but it still does the job and even handles a bit of misuse by Lokad R&D)
In short, you can get yourself rather flexible development environment for the distributed teams either for free or at the cost of a few dollars per month.
Just add Skype to it.
CQRS section aggregates various references specific to the architectural approaches of the current xLim version (and all the solutions I'm building).
As for the pre-architecture requirements of xLim 4 (development practices, recommended reading, design guidelines, low-level building blocks and producing decent code etc) - that will be a rather long story to tell within this post (or probably even series). For references I just recommend to look through previous versions of xLim, discarding everything that does not fit into the CQRS approaches or does not scale in the cloud.
NB: Composite application approach still holds, but all these Enterprise Application blogs or universal frameworks just do not work out. You can rapidly develop various Client applications on top of CQRS without any need for the complexity.
Actual hardware is nothing special these days and hasn't been upgraded for a year. Yet it works for me (especially when compared with more painful configs). Let's start with the most important things:
- important! Microsoft Natural Ergonomic Keyboard 4000 (after more than 10 years of coding my wrists are quite touchy about keyboards and eventually start burning on any other keyboard)
- important! Microsoft Natural Wireless Laser Mouse 6000 (same reasons as the keyboard, although I would try to get one of Logitech's Trackballs these days).
- important! Ergonomic chair designed for workers-of-the-keyboard (I picked one at the local store)
- important! Two decent wide-screen LCD monitors. And they are better to be connected to DVI/HDMI ports (ATI Radeon HD 4800 in my case), unless you want your eyes to be hurting by the end of the day.
Less important stuff:
- Intel Core 2 Quad CPU Q6700 @ 2.67 (would use i7 these days)
- 8 GB of RAM
- RAID 0 HD Setup for faster disk IO over the OS and project files (would use SSD these days)
- Decent power box to supply tower with all this hardware.
Note, that I am not doing any over-clocking to "get the bang out of the buck". It is just not worth it.
Tools For the Project Manager
- Microsoft Office 2010 (Word, Excel, Powerpoint)
- Microsoft Visio 2010 - for creating all these nice diagrams you see in my blog.
As you can see we've lost MindManager, MS Project, NDepend and Source Monitor from our list. Complex management software is no longer needed (at least personally for me) due to work in environment that rapidly changes and sometimes requires new feature to be designed, implemented, deployed and stabilized within 1-5 days.
At such pace well-thought projects become obsolete really fast (the next few days) and become just a waste of time. Instead, Amazon.com development style starts working better and better. Getting Things Done methodology, priority lists and OmniFocus (which unfortunately runs only on iPad or Mac) help to stay sane and keep all things under control even when there are multiple projects running concurrently with multiple tasks that have volatile priorities.
Word, Visio and Moleskine help to do the actual planning, brainstorming and architecture design.
Now, locking back at changes within these couple of years I can clearly see reduced dependency on the libraries, frameworks or specific tools (aside from the Visual Studio + ReSharper). There's a clear tendency of getting rid of the relational databases and layers of persistence and using more capabilities offered by the cloud. Projects get smarter, more reliable and efficient not because of the building blocks used, but because of a lot of theory being put into them and simplicity enforced at all levels.
Actually I believe simplicity to be the hardest target to arrive at. It easy to develop a complex solution. It's much harder to develop solution that achieves the same but in a more simple and straightforward way. This at least requires some experience and I feel like standing at the beginning of the road towards this experience.
Despite these changes I still maintain that a single developer with limited resources can build and manage rather interesting solutions; especially if he uses these resources efficiently, keeps everything simple and thinks a lot before doing anything (obviously now the term "interesting solution" means a bit more, than 3 years ago).