Let's say you want to really learn cloud computing, unit testing, inversion of control or CQRS. You can either:
- pay for a course, read some books, do exercises and get a certificate at the end;
- participate in an open source project or two in your field, getting real-world practical knowledge and being forever recorded as a contributor; nothing to pay and skills will be up-to-date.
Guess which option will score more victory points, when you apply for a job or start building your own ISV startup? My personal biased bet will be on Open Source, so let's talk about it.
BTW, my many thanks to Muneeb for sending a question on the topic. Also thanks to Jonathan Oliver for helping to clarify the title.
Open Source projects are something we all know about - projects where people collaborate to develop a product, providing it at no cost along with documentation and source code.
In .NET community you probably came across a project like NUnit, Autofac, NAnt or NHibernate. These are open source. Their analogues on the other platforms are usually open source as well. You can get the source codes, build them and run. Certain restrictions may apply, depending on the licensing terms. However generally you can do pretty much what you want as long as the credit is given and fair sense is applied.
We can clearly see the commercial benefit of Open Source Software (OSS) in various projects - you don't need to pay licensing costs and usually have faster development model. However, there is much more in OSS!
In my previous post of 10 Steps To Become Better .NET Developer there was this seemingly simple line:
Contribute to Open Source Projects of your choice.
Actually this was one of the most important items in the self-improvement list. Let's talk how exactly open source projects can help you to become a better developer.
If you would like to recommend a .NET Open Source, or need help in finding one that fits your field of interest - please read towards the end of the article and leave a comment.
Learn from Open Source
First of all, you can benefit from the Open Source by just downloading the source code and learning how smart people get things done in software. I loved reading through and being inspired by NAnt, OmeaReader of JetBrains, MindTouch and StructureMap, when I was just starting with .NET. Such an activity helps to:
- practically see how people organize code and do all sorts of small things: name classes and variables, throw exceptions, write sanity checks and document code;
- learn about testing projects, building and integrating them - this is real-world stuff;
- see various ways to organize projects, supply documentation and version dependencies;
- practically understand what steps are actually involved in delivering a project.
Of course, there are no perfect projects or developers. After checking out a few similar projects you will notice that they tend to have different strengths and focuses. Some might have better codebase, the other - better documentation, third - more efficient development environment and faster feature deliveries.
By comparing them you will see tradeoffs made by people running them. They had to focus on the most important things (in their opinion) while using limited resources at hand. Resources are usually limited by their own free time and motivation. And since the Open Source project is active and being used, you can already say that they were successful in making these choices and executing them. Hence, you can learn a lot.
Besides, if you focus on a set of open source projects in a certain niche, you will be able to learn the technology and the primary principles behind. You will practically see the choices and trade-offs being made in the code.
For example, less than a year ago I knew little about messaging and nothing about service buses. Yet, when there was a need to build a service bus for Windows Azure with a specific set of requirements, it was a rather straightforward process. I simply had to:
- Learn the theory and read a lot of articles;
- Find open source projects dealing with the similar problems (NServiceBus, Mass Transit and Rhino Queues), reading through them;
- Start working on Lokad.CQRS, while adapting the most important ideas from these projects to the specifics of Windows Azure;
- whenever I had a problem at hand, there were already 2-3 options of solving it.
The end result is that now I can say a couple of words about using and building service buses in cloud computing environments and on-premises (esp. in CQRS architectures and Windows Azure). Plus this brings real business value at Lokad.
As you can see Open Source projects can give you a lot merely by providing real-world something to learn from. However you can gain a lot more by actively participating in them.
Participate in Open Source
Participating in Open Source project allows you to:
- actually practice your development skills: applying design patterns, writing unit tests, managing complexity and doing all sorts of other things essential for any project;
- get feedback on what you do and potentially some helpful guidance - it will come from the people involved in the project and hence having practical experience in the field; this is far more better than spending time in university (for which you will need to pay) and listening to teachers that don't necessarily have up-to-date practical knowledge and experience;
- learn and practice things like: issue trackers, wikis, version control systems and change management, integration tests; you will also learn how to use them in order to work with the other people spread all across the globe.
How Can You Get Involved in OSS project?
First you need to pick projects in the field that really interests you.
The "really interests" part is extremely important, since personal motivation can make a huge difference between personal endeavor pushed to success and something we just spend time on and eventually put aside.
Second, you learn as much as you can about it:
- read documentation (and especially the FAQ);
- download the source code, try building it and running;
- walk through the samples, if there are any;
- sometimes other people will blog about the project - google these articles up.
Already at this point you probably have some questions or came across an odd behavior. Share these discoveries!
- ask questions in the community;
- blog about successful and not-so-successful experience (while doing that - please try to be more professional, than I tend to be, say, when writing about Windows Azure);
- try to figure the problems on your own, propose solutions and submit patches.
I can already tell you that almost every single open source project (i.e.: .NET framework or tool) would love to have:
- better documentation and tutorials;
- unit tests and small bug fixes;
- small features that some people want but don't have the skills to do;
- people using their projects and providing detailed feedback;
So you can check out issue trackers (they could also be named as tickets, bugs or feature requests) in a project. They will list problems and feature requests that project owners would love to be done. Yet for some reason they are not done; the reason being - lack of time to do that. So if you step up for the challenge and offer your help - you'll be a hero of the day. If you are just a beginning developer and don't see something you can handle, just go the community and say the words:
"Hi, I love your project and would like to contribute. Tickets are too complex for me at the at the moment, but I really want to learn this field. How can I help?".
I would be surprised if you'll be able to get away with less than few things to do and recommendations. The truth is: owners of these projects run them in their spare time and will gladly accept any help you can offer. Besides that, they are passionate about their projects and just love to talk, teach, help and share (how many university teachers do love answering questions on evenings and weekends?). Community members usually are no better either - they just love talking about the project, field and improving it, while doing all sorts of things to make this happen. Since there always are some really smart people out there (with a practical experience), this is way better than your average class for learning, sharing and having some fun.
That's the nature of the open source. So if you would love to learn some practical skills (and understand that universities might just serve some outdated theory), feel free to check OSS out. For example, in .NET you can start with:
- For Inversion of Control: Autofac IoC Container (22 tasks in the issue tracker) and Windsor Container (more than 50 unresolved issues)
- For Cloud Computing and Windows Azure: Lokad.Cloud for Windows Azure (23 tasks in the issue tracker)
- For Continuous Integration: Cruise Control .NET (more than 200 open issues)
- For Unit Testing: AutoTest.NET (just 3 issues, but they will have more, plus participating there can get you a beta of Mighty Moose) or NUnit (38 open bugs in 3.0 version)
- For service buses: NServiceBus and MassTransit
NB: This list is by no means complete. It just serves the purpose of giving the overall perspective. If you want to recommend an open source project to participate or look for one in a specific field - please, read to the end of the article and leave a comment.
After participating in Open Source projects, you can also take the next step - start your own. There are always places in .NET community and outside, where the tooling is less than perfect or there only are expensive options. By taking this step, you will learn an additional set of skills which a lot of companies look for in resumes (we definitely do at Lokad). This will also will provide you with additional background for managing development projects at companies or starting your own business. In fact, an open source project you are passionate about, can become the foundation for the business. But that's a story for another post.
Go for it!
So if you liked what you heard - I encourage you to go and take a closer look at open source projects in the fields you are passionate about. You could learn a lot of practical and inspiring things, get a good line for the resume (actually companies tend to look for active contributors in the open source projects that they rely on) and give something back to the community. The latter will give you this warm fuzzy feeling of doing good stuff and being part of some bigger effort.
I also strongly encourage you to comment below if you:
- look for an open source project in a specific field with a friendly and welcoming community willing to help you to learn and contribute back; please indicate field of study/interest.
- run an open source project in some field (or know such projects) that would love to get more help and interest; please indicate focus of the project and give a few samples of how a novice can help. Contact info would also help.
You can also retweet this article and share it with people and communities to encourage diving into open source projects (you might have one or two specific ones in your mind already) and getting real-world experience while helping them to move forward. Links for sharing are below. I'll keep this article updated.
PS: As you can see, an innocent-looking item of "Contribute to Open Source Projects of your choice" in 10 Steps To Become Better .NET Developer turns out to be far more exciting and valuable than it might look on the surface. I'm planning to dive in a few more topics from this list later as well. Stay tuned!