A common complaint that I hear from Computer Science graduates is that their CS classes do not prepare them enough for working in the real world as a Software Developer. Thus, it is not uncommon for people to have a lack of self-confidence in their coding ability. In all honesty, I would argue that no set of Computer Science classes from any school are going to give you self-confidence as a developer. But, the CS curriculum is not the only means for you to improve your software development skills. I would humbly argue that I am proof of this, because while my GPA may not have been the highest amongst my peers, I often found myself more confident as a software developer than my peers. Why? It really comes down to one short and simple rule, always be learning.
When I say, always be learning, I mean to take the time to learn new things outside of the classroom walls. By doing research and side projects in your free time, you can furhter improve your self-confidence as a developer as you gain knowledge in new areas of computing and work with new frameworks and technologies. Many of the professors, if not all, that teach you your Computer Science courses are involved in some form of research and most likely are looking for fresh undergraduate talent. Get into an undergraduate research assistant position as soon as possible.
The first Computer Science lab I worked in was the Cooperative Computing Lab during my second semester of my sophomore year, under the Fundamentals of Computing I professor from the previous semester. It is important to go to office hours in order to establish a relationship with your professor, and ask them about their research. Trust me, they can talk about it for days and showing the slightest of interest gets your foot in the door and opens up the opportunity. Through this research in distributed systems and computing, I was able to first learn some PHP, but the more valuable skill I acquired was Python through my summer research fellowship with Professor Thain. In lieu of a summer internship, summer research positions hold just as much opportunity for professional growth and learning. I felt an increase in coding confidence after that research position, as my research partner and I were able to build a Python tool that automated and distributed the computation of protein folding simulations. Research is cool, do not fear it.
The second Computer Science lab I worked in was in iCeNSA, where I did data mining and machine learning research, in addition to building applications and designing systems for the collection of the data that we will be mining. I acquired this position through my Android side projects, and one of my classmates recommended me to their professor, who needed an Android developer for a project, and I ended up working on other projects as well. Through this project, I was able to gain experience doing Android development, database design, and Django and EmberJS development, while also increasing my theoretical knowledge around Data Mining and Machine Learning. Trust me, working in this research lab had me feeling HIGHLY confident by the time I graduated and had to leave the lab and I attribute this lab experience as another reason why I am always thirsty for knowledge. But, I would not have been able to get this second lab position without showing my qualifications, which I did through side projects.
A lot of people make the excuse that they do not have time for side projects during their undergraduate career, but to be honest, I would suggest making time for side projects. Side projects become a vehicle to teach yourself something that may not be taught in classes, such as Ruby on Rails, EmberJS, AngularJS, etc. Sometimes, your side projects could even start off small in scope and as study breaks. I created Bandcamp Downloader (https://github.com/iheanyi/bandcamp-dl) as study break, a trivial solution to a problem I had. Similarly, a classmate of mine built a small Python program to scrape the dining hall menu every day and it hooked into the Twilio API and would send him a text message when North or South Dining Hall had one of his favorite meals. While it seems pretty silly, he taught himself Python in order to build this project and he learned something new. Side projects allow you to step outside of your comfort zone, learn something new, and grow as a software developer. When you finish these side projects, make sure to create a GitHub account (https://github.com/) and upload your side projects there. This allows you to not only build up a portfolio, but it also serves as a good point of reference for your growth as a developer, so dont hesitate to put yourself out there!
Small aside, hackathons are a good way of getting your skills up and knocking out a project over a weekend. Get your homework done early and head to hackathons, such as MHacks (http://mhacks.org) or PennApps (http://2015f.pennapps.com/), because they are a prime opportunity for learning. There are brilliant minds from all over the country, sometimes world, attending these hackathons, and many of these hackathons offer a travel stipend or reimbursement for applicants (often, not always). These are prime locations for growth and opportunity (and networking with employers), so attend as many of these as possible if you can.
If you do not make the time for side projects, you can always use your class projects as a challenge to learn more. If you are given creative freedom for your final projects in class, I would try to use it as an opportunity to learn something new to add to your repertoire of skills. For my Interaction Design final project (https://ndsearch.co), I used this opportunity to learn EmberJS and Ruby on Rails. For my Data Mining final project, I learned EmberJS & Django (http://iheanyi.com/projects/imbalanced-data-analyzer/) in order to automate analyses of large sets of imbalanced data. I was not proficient in any of these frameworks before I started doing these projects, but working on these allowed me to grow as a software developer as my knowledge grew. I suggest that you take the opportunity to do the same.
In conclusion, here are the main means of growing as a software developer and improving your coding confidence. First, join a Computer Science research lab on campus, which allow you to code in an academic setting and often teach you new things about theoretical Computer Science. Secondly, make time to work on side projects, no matter how small, to continually refine and improve your skills as a developer. Thirdly, try to attend as many hackathons as possible. Lastly, use class projects as another opportunity to acquire more knowledge outside of the scope of the classroom, especially in classes that offer creative freedom for final projects. I hope these suggestions and my story will help you all become amazing developers by the end of your four years. If you have any questions, feel free to reach out and contact me.