I got invited to do a [Summer-session](http://www.microsoftsommarkollo.se/index.php/2013/05/microsoft-och-open-source-ur-ett-utvecklarperspektiv/) on Open Source from a developer perspective. It was my friend [Dag König](http://www.buzzfrog.se/) that invited me and I had great fun, both preparing and doing the session.
I even pulled of a demo of a life-time, in my opinion. We'll come to that later.
If you think about it the journey that OSS has done in the .NET and Microsoft community has been quite remarkable. Just a couple of years ago the words "Microsoft" and "Open source" could not be mentioned in the same sentence. Now you can fire up a virtual machine in Azure with Linux and the complete LAMP-stack on it. On top of that there's a number of prominent people promoting open source and alternatives to Microsoft recommendations and technologies - from within Microsoft.
That's cool in my book. It can be improved of course. But it's the start of the journey and I like it. ### **My journey**
Since I'm by no means a authority on the history of the Open Source movement and it's history I told the story from my perspective. My journey begun a summer when I was the only one left at my current project. Since I didn't have much to do I thought I could try to teach myself something new. I had heard about build scripts and tried to create one. In order to accomplish this I had to use both [CruiseControl.Net](http://www.cruisecontrolnet.org/) and [NUnit](http://www.nunit.org/).
This was the first time that I've used things and followed instructions that didn't came from Microsoft. It was (at the time) something that I didn't even considered before. But there and then I started my journey into taking input and ideas from other places than Microsoft.
Let me just say that I don't have anything against Microsoft. I like them - but I like my options as well. With more frameworks, more input, more opinions I have more to choose from. ### **The real history**
Ok, the official history is pretty awesome too. But it's way to long to relate here. I learnt a great deal from these two wikipedia articles ([Free Software movement](http://en.wikipedia.org/wiki/Free_software_movement) and [Open Source Initiative](http://en.wikipedia.org/wiki/Open_Source_Initiative)).
Here they are in condensed format: > [Free software > movement](http://en.wikipedia.org/wiki/Free_software_movement) yada > yada yada [Richard > Stalman](http://en.wikipedia.org/wiki/Richard_Stallman), yada, > [GNU](http://en.wikipedia.org/wiki/GNU_Project) (GNU's not Unix - > haha!) wanted to "create a operating system that was free from > constraints on use of its source code", [Linus > Torvalds](http://en.wikipedia.org/wiki/Linus_Torvalds) did that later, > called it [Linux](http://en.wikipedia.org/wiki/Linux), [Eric > Raymond](http://en.wikipedia.org/wiki/Eric_S._Raymond) wrote about it, > coined the phrase [open > source.](http://en.wikipedia.org/wiki/Open_Source_Initiative)
There you have it: the condensed version of the early history of Open Source.
In the .NET community the advent of Alt.NET was really important to start people thinking about that thing that we use and things that we think doesn't HAVE to come from Microsoft. Although they (Alt.NET) in the beginning came out as an "-ism", against Microsoft - they eventually calmed down and became "an alternative to Microsoft".
For us these alternatives means that we have to be informed and make up our own mind on what's great and not. Where we before have been spoon-fed from Microsoft with what's good and not, we now have to form our own opinion. Something that at least for me has led to me learning more, improving my understanding and taking in more inputs. ### **Our session**
The rest of the session was a whirlwind tour of tools and frameworks that I have used and learned about. It was done at break-neck speed but we actually got pretty good reviews, so something must have stuck. #### **NuGet**
One of the tools that really opened a lot of door for open source in the .NET world was [NuGet](http://nuget.org/) . It totally revolutionized how you manage external dependencies. Scott Hanselmann have a great bit on that in the first 5 minutes in [this session](http://channel9.msdn.com/Events/MIX/MIX11/FRM09). That contrast the before and after NuGet in a great way.
I talked about the only two commands you really need: - Install-Package XXX (don't forget to set the correct project!) - Uninstall-Package XXX (don't forget to do "-RemoveDependencies" or you'll end up in trouble).
We also talked about the benefits of "[Enabling NuGet restore](http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages)" to avoid checking in a lot of Mb with binaries.
Finally we had a discussion on when you should wrap the access to your external dependencies (if you think you'll ever need to replace the OSS framework for example) and why checking in the source code of an OSS framework into your repository is the worst of two worlds (you have responsibility to fix bugs and no support from the community). #### **Git**
Since more or less every OSS framework use Git I thought it could be a great idea to introduce Git to the audience. They didn't though… so I kept it short. Very short.
But I have actually got by the last 3 years with just knowing 6-7 commands and understanding some simple facts about the git architecture.
[Git](http://git-scm.com/) is a distributed source control system, meaning that every developer have a complete copy of the repository. You clone the repository to get a local copy, of your own. In addition Git uses a staging area in which you "compose" a commit before you commit it into the repository.
Here are all the commands I know: - "git -?" and "git \[command\] -?" shows the help. And it's actually pretty good. "git branch -?" for example - "git clone \[URL\]" creates a local copy of a repository that you can work in. Git adds a link back to the repository you cloned as a remote repository called "origin". "git clone <https://github.com/torvalds/linux.git>" for example - "git checkout \[branch\]" branches are pretty ligthweight in Git and you find yourself switching between them often. This command does exactly that. If you add a "-b" to the command you create a new branch. This is useful when you start working on a new feature. "git checkout -b 'MyNewFeature'" for example - "git add \[file\]" and "git rm \[file\]" are commands that add and remove files to the staging area for your commit. With these command you build up your commit into a nice shape before you commit it into the repository. "git add --all" adds all your changes - "git status" shows how your staging area looks right now. This is run often. Like a ticks almost. - "git commit -m '\[commit message\]'" commits the changes in your staging area into your repository. Commit often. Very often. "git commit -m 'GetPersonFromDatabase tested'" - "git push \[remote\] \[branch\]" this command pushes the committed changes in your branch to the remote. For example "git push origin "MyNewFeature" pushes the changes committed into the MyNewFeature branch to the "origin" repository. - "git merge \[branch\] \[branch\]" merges the changes in one branch into the other branch. "git merge master MyNewFeature" merges the changes of "MyNewFeature" into "master" #### **Example frameworks**
We rattled through a couple of frameworks and showed them off. Since I wanted to give a broad introduction I thought of a couple of categories and found some frameworks that I like. This made me realize that a lot of the things that you end up using is the thing that people you trust, you follow and you like are using.
This is MY list - your might be better, but please tell me about it.
I created a [repository for these examples here](https://github.com/marcusoftnet/OSSMsDemos) where I show how to use the framework.
Here's the list - Unit testing: [xUnit](http://xunit.codeplex.com/) and [ShouldFluent](http://should.codeplex.com/) - Dependency Injection: [AutoFac](http://autofac.org/) (let the religious war begin…) - Web: [NancyFx](http://nancyfx.org/) - of course - Data Access: Simple.Data(http://www.blogger.com/) - I might have called it "the ultimate solution to data access". And meant it. - Packages of packages: [SuperDuperHappyPath](https://www.nuget.org/packages/SuperDuperHappyPath/) this package helps you put together a stack of packages to write Nancy apps with (hosted on ASP.NET, with NDjango views and Simple.Data against MongoDb for example). I think this will become more common. - Datamapper: [Automapper](http://automapper.org/) - REST API Client: [RestSharp](http://restsharp.org/) - We finally showed that Microsofts own templates in Visual Studio reaches out to NuGet to pull open source frameworks. [WebApi](http://www.asp.net/web-api) and [ASP.NET MVC](http://www.asp.net/mvc) are two examples #### **How do I know if it's any good?** This is a question that seems to trouble a lot of people that are new to using open source. Can I trust it? Will it stay around? Is it the best one? Questions like that. The simple answer is: you cannot know. You have to make an informed decision by yourself or by consulting others. Here is my list of things that I more or less conscious goes through when using a OSS framework (and some problematization around the metrics): How does it look? Does it have a [great web site](http://nancyfx.org/)? Is it easy to follow and understand [the API](http://restsharp.org/)? Do I get great first impression of the framework? I think this is super important and have often turned to another framework based on the simple fact that I didn't understand how to use the framework in under 30 seconds. What are the stats on [GitHub](http://github.com/) ([CodePlex](http://www.codeplex.com/), [Google Code](https://code.google.com/) or whatever)? At GitHub there's a great tab called pulse (for [Nancy](https://github.com/NancyFx/Nancy/pulse) for example) that gives you an overview of the activity.
But is a lot of changes always good? What about ["feature complete" frameworks](https://github.com/marcusoftnet/SpecFlow.Assist.Dynamic/pulse)? Is it bad that no changes are happening? There's also other stats that you should consider: - The number of forks - people have copies of this code - The number of stars - people likes this code - The number of watchers - people are interested in news in this code How many people are downloading it (on [NuGet](https://www.nuget.org/stats/packages/Nancy?groupby=Version) for example)? These stats tells me how much it's being used. But beware of the "operation"-aspect; now-a-days when a many people are restoring their packages from NuGet on build the numbers are WAY higher than the number of different people using it. Here's the stats from Nancy for example.
How is the documentation? Can I understand it? Is it well written? Is is **updated**? What about the "web presence"; can you find it via Google? Are people interested by it on [StackOverflow](http://stackoverflow.com/)? Is there a chat somewhere? Does the creator tweet or blog? #### Summing up this means that you have to decide for yourself. There isn't one single source of truth. Now... this resembles something that I know... what can it be ... AHA! The real world! It's just like that ### **How to contribute back** The final part of my presentation was about giving back to the frameworks you are using. I think this is vital to get a active and living community. Besides it ties nicely back to [the basic ideas and principles of open source](http://en.wikipedia.org/wiki/The_Cathedral_and_the_Bazaar#Guidelines_for_creating_good_open_source_software). In this section it was live demos all along. I talked about the ways that you can contribute back and was demonstrating live on the Nancy project as we went along. #### File bugs and issues One of the first and simplest thing you can do is to file issues, suggestions or bugs. On GitHub that's super simple with the issue creator. We created a [simple issue for a improvement](https://github.com/NancyFx/Nancy/issues/1196) of one of the error messages from Nancy. Filing issues is simple since it's just reporting what you found. If you're feeling adventerous you could also add a failing test that proves your point. That makes the maintainers of the framework go crazy of happiness. I have [done so a couple of times](https://github.com/markrendle/Simple.Data/issues/121) and that's been called "the best bug report I ever got" by [some people](https://github.com/markrendle). #### Documentation Write some documentation or update the existing documentation. Most OSS platforms (GitHub, Codeplex etc) have their documentation as a wiki so that anyone can update the documentation when they see the need. In many OSS frameworks the documentation is often out of date with the functionality of the framework. So just by **updating** the documentation you are doing them a big service. The "problem" with updating documentation is that you have to know what you are talking about, how the OSS framework works and should work and how to write about it. But this is your way into looking deeper in the functionality of the framework. I've learned a lot about [Simple.Data when writing docs](http://simplefx.org/simpledata/docs/pages/Test/Basics.htm) for them. At the session we updated the wiki-page on [Model binding for Nancy](https://github.com/NancyFx/Nancy/wiki/Model-binding/_history). Live on stage. #### Pull requests The final "level" in helping your favorite open source framework is to send them code and fixes. A lot of the things that I have sent in is [fixing failing tests](https://github.com/picklesdoc/pickles/pull/49) or get [rid of warnings](https://github.com/NancyFx/Nancy/pull/934). And that have taught me enough to actually being able to add new features and fixes. Be sure to look into the code standards they are using and follow the instructions on how to do [contribute to their repository](https://github.com/NancyFx/Nancy/blob/master/CONTRIBUTING.md). Don't feel sad if they send it back to you - this a great learning opportunity and, remember, that it's their code. In the session we did a [pull request live on stage](https://github.com/NancyFx/Nancy/pull/1197) to fix the issue we reported before. Thanks to the great Nancy crew we also got our changed merged into the master-code repository while we waited! Best demo I ever did! ### **Summary** As always I learned a great deal about the topic (OSS in this case) while preparing for this presentation and while executing it. For me OSS is now a vital and important part of my daily work. But that Microsoft is hosting an event on OSS is actually really cool. This is a changed approach from Microsoft and that change has happened fast - and continues to happen. Get on the .NET OSS train - it's a good one! PS. Dag König has made a couple of podcast on OSS and some frameworks (Nancy and Simple.Data for example): - <http://www.buzzfrog.se/index.php/2013/04/dev-cast-30-microsoft-and-open-source/> - <http://www.buzzfrog.se/index.php/2013/04/devcast-29-behvs-or-mappers-eller-rcker-det-med-simpledata/> - <http://www.buzzfrog.se/index.php/2013/02/devcast-22-ramverket-nancy/> ** **