Learning to Contribute to Software Projects
October 21, 2013 7:33 AM Subscribe
How can I bridge the gap between knowledge of basic programming and actually contributing to software development?
I'm currently a computer science student about to earn his Associate's degree, hoping to eventually start a career in software development. Right now, I feel like I'm pretty good at applying the theories behind programming, such as Object Oriented Programming, how to make data structures like a linked list or a binary tree, and I've played around a bit with frameworks like Django.
I feel like I should be doing more outside of school to develop my skills beyond just downloading a neat set of libraries and playing with them. I'm applying for internships, but I'd like to know what else I can do to learn to develop software that goes beyond the toy sort of programs I make for myself as a hobby. I'd like to contribute on Github, but I also worry that it'd be a bad idea as I've never produced production code before.
What would be a good next step for me?
I'm currently a computer science student about to earn his Associate's degree, hoping to eventually start a career in software development. Right now, I feel like I'm pretty good at applying the theories behind programming, such as Object Oriented Programming, how to make data structures like a linked list or a binary tree, and I've played around a bit with frameworks like Django.
I feel like I should be doing more outside of school to develop my skills beyond just downloading a neat set of libraries and playing with them. I'm applying for internships, but I'd like to know what else I can do to learn to develop software that goes beyond the toy sort of programs I make for myself as a hobby. I'd like to contribute on Github, but I also worry that it'd be a bad idea as I've never produced production code before.
What would be a good next step for me?
I'm a professional software developer who was more or less in your shoes when I graduated with a BS in computer science. I think at the most high level to be a successful coder you have to be able to get stuff done and know how to do things the right way. A computer science program in college tries to teach you both of those things, but most new grads aren't very good at either. To be able to get stuff done, you have to have a lot of experience working on long-term projects and solving novel problems, whereas in a classroom you're just working on canned assignments that only exist to apply what you've been taught. And although learning about OO and other CS fundamentals is great, that's like being given a carpenter's toolbox and learning all of the physics around how a hammer works and being told how to swing a hammer at the right angle to drive in nails, without actually ever building something. You're never going to know when to use inheritance and when not to until you spend a lot of time on real projects and see when your inheritance hierarchy makes your design work well and when inheritance blows up in your face and makes your design terrible.
So my main advice to anyone who is thinking about a career in software development is to start a hobby project that has real users and keep working on it long-term. It's better to work on something like a simple smartphone app that you develop yourself in a month and people really use than a huge ambitious project with a bunch of other people that fizzles out after months and never sees the light of day. You do not have to be a great coder to start out, and in fact the first production code you write is probably going to be pretty terrible. But if you put out something that works, people will probably use it and you'll be better when you start your next project. Do not spend a lot of time learning every detail of some fancy new programming language or framework, start with whatever skills you have now and learn the rest as you go while you implement the project. As you try and fail and push your way through getting the project done, you'll learn the wrong way and right way. When you first start a project using tools that are unfamiliar to you, you'll probably spend a lot of time looking up basic things on Stack Overflow and whatnot, but that's fine. Also, having an actual working product that people use and that you have to maintain is completely different than working on a project in a classroom. Users will request features that you didn't plan for, and they will find obscure bugs that you never thought about or ran into during development. The initial release is only the beginning of a real software project, and most of the fundamentals of software development wouldn't be necessary if issues like maintenance were not a huge concern.
The nice thing about software development is that you don't need any money or years of experience to get started doing it. If you put some work into a project and get something useful working, you can put it out there and people will use it. You already have the skills necessary to get started, so now is the time to actually do something with them.
posted by burnmp3s at 9:08 AM on October 21, 2013 [2 favorites]
So my main advice to anyone who is thinking about a career in software development is to start a hobby project that has real users and keep working on it long-term. It's better to work on something like a simple smartphone app that you develop yourself in a month and people really use than a huge ambitious project with a bunch of other people that fizzles out after months and never sees the light of day. You do not have to be a great coder to start out, and in fact the first production code you write is probably going to be pretty terrible. But if you put out something that works, people will probably use it and you'll be better when you start your next project. Do not spend a lot of time learning every detail of some fancy new programming language or framework, start with whatever skills you have now and learn the rest as you go while you implement the project. As you try and fail and push your way through getting the project done, you'll learn the wrong way and right way. When you first start a project using tools that are unfamiliar to you, you'll probably spend a lot of time looking up basic things on Stack Overflow and whatnot, but that's fine. Also, having an actual working product that people use and that you have to maintain is completely different than working on a project in a classroom. Users will request features that you didn't plan for, and they will find obscure bugs that you never thought about or ran into during development. The initial release is only the beginning of a real software project, and most of the fundamentals of software development wouldn't be necessary if issues like maintenance were not a huge concern.
The nice thing about software development is that you don't need any money or years of experience to get started doing it. If you put some work into a project and get something useful working, you can put it out there and people will use it. You already have the skills necessary to get started, so now is the time to actually do something with them.
posted by burnmp3s at 9:08 AM on October 21, 2013 [2 favorites]
mccarty.tim: " I'd like to contribute on Github, but I also worry that it'd be a bad idea as I've never produced production code before."
Someone else has to accept your patch, so quality is just as much on them as it is on you.
posted by pwnguin at 8:15 PM on October 21, 2013 [1 favorite]
Someone else has to accept your patch, so quality is just as much on them as it is on you.
posted by pwnguin at 8:15 PM on October 21, 2013 [1 favorite]
Finding an open source project to contribute to can give you valuable experience working with other people on real-world projects. I don't mean just silently sending pull requests on GitHub, but finding a project with a community willing to talk to you and help you when you get stuck. You don't have to start out by writing big perfect patches - you can start by fixing small bugs, fixing documentation, adding comments to code, etc. This article has a lot of good suggestions: 14 Ways to Contribute to Open Source without Being a Programming Genius or a Rock Star.
One way to find a project is to look at what you already use - MediaWiki/Wikipedia, Firefox, Etherpad, LibreOffice, GIMP? Big projects like those tend to have lots of documentation to help new contributors + active IRC channels where you can ask for help.
And yes, come hang out with us at OpenHatch! I help with OpenHatch a little bit, and it's a great place to get some practice (via the training missions), advice and encouragement (via the friendly IRC channel), ideas for projects to contribute to (via the project search system), and even some experience by contributing to OpenHatch itself, which is conveniently based on Django.
posted by dreamyshade at 10:34 PM on October 21, 2013
One way to find a project is to look at what you already use - MediaWiki/Wikipedia, Firefox, Etherpad, LibreOffice, GIMP? Big projects like those tend to have lots of documentation to help new contributors + active IRC channels where you can ask for help.
And yes, come hang out with us at OpenHatch! I help with OpenHatch a little bit, and it's a great place to get some practice (via the training missions), advice and encouragement (via the friendly IRC channel), ideas for projects to contribute to (via the project search system), and even some experience by contributing to OpenHatch itself, which is conveniently based on Django.
posted by dreamyshade at 10:34 PM on October 21, 2013
This thread is closed to new comments.
Something almost everyone can do is reading though project READMEs, attempting to install software, and noting problems. On GitHub, "star" and projects you like, and most authors (me included!) will be happy for the interest!
Good luck! Useful contributions come in lots and lots of forms!
posted by gregglind at 7:49 AM on October 21, 2013 [2 favorites]