University is intended to give students a good base of theoretical knowledge so they can learn new skills faster and more easily once they enter the workforce. This seems reasonable, but the reality is in the software world students are often expected to also have a lot of practical skills that they don’t necessarily learn in school. To combat this, many students choose to lessen their focus on classes and instead put their time towards activities such as hackathons, side projects, and finding the best internship.
I am a Computing student and have been an intern at Intelliware for the past year. In my three years of being a student, I have found that getting involved with activities outside the classroom has helped me learn practical skills. For instance, three friends and I decided to enter Imagine Cup, a Microsoft competition for students that challenges them to identify a start-up pitch and create a working prototype. We were in our second year of University when we created Walkly, a mobile app designed to help users stay safe while walking home alone. Each user enters their destination and estimated arrival time and, if they do not arrive on time, their chosen contacts are alerted and prompted to take action. After three months of challenging work, we submitted our app and business pitch to the Canadian finals and we won! We went to Seattle for a week to compete in the international finals, where we met other teams from around the world. Although we didn’t make it any further in the competition, we were extremely proud of the outcome, considering our lack of experience.
The road to the Imagine Cup finals was not easy, but I believe that it would have been much smoother, and we might have achieved more, if we had been better prepared for the challenges of developing a “real world” app. Although our idea was good, our app was barely functional and had only rudimentary features. I don’t expect school to teach me everything I need to build a specific app, but there are some basic skills relevant for all types of programming that would have been extremely beneficial to know. Below are some examples of practical skills that I believe all programming students should be familiar with that may not be covered by their academic programs.
At the top of the list of things programming students should learn is the concept of source control. Many classes have group projects, especially in the later years, tools like Git should be introduced early to facilitate group work.
My experience is that some students can learn basic source control principles and tools by participating in hackathons and competitions, but students who don’t get involved with these activities can be left in the dark. For example, I’ve worked on projects with third year computer science students where, when I give them a GitHub link to use, they don’t use the designed functionality but instead download the files they need, work on them independently, and then email them back.
As well, how to resolve merge conflicts is another important skill. On Walkly there were four of us working on the same five or six files so we would have frequent conflicts. To resolve them, we would save our changes in a text editor, open the other person’s file, then try to redo our changes using the new code. This was an awkward process which we could have easily avoided.
In school we used a very simple IDE called BlueJ. Although it was a step above using a text editor, and had some interesting features to support learning, it lacked the horsepower of the development environments you work with in industry. For our Walky project we used Microsoft’s Visual Studio, arguably one of the most powerful IDEs available. In the Java world, the equivalent is Eclipse, the most common IDE used for a wide range of open source development languages, particularly Java.
Even though we used an industrial strength IDE for developing Walkly, we had no idea how to use it or even knew that it provided tools that would help debug code. To do our debugging, we used print statements and manual work, meaning that it took days to fix small issues.
Example of debug statements used in Walkly.
I realize there are licensing issues (i.e. costs) associated with some of the commercial IDE’s, but there are Open Source versions available. At the very least, more experience with the various commercially available IDE’s and their capabilities would have saved us a lot of time.
Collaboration, and working with others is a skill that should be emphasized at the University level. With class assignments, I was used to doing them by myself in a single day, submitting them, and then forgetting all about them. Working on Walkly with three other people over multiple months was completely new for all of us, and we found it very difficult to collaborate. None of us put any effort into writing clean code or using commit messages to summarize our changes. We couldn’t even understand each other’s code, leading to us writing even worse code and making our code base extremely unmanageable.
Examples of our “descriptive” commit messages
Computer Science curriculums should include guidelines about best practices on facilitating productive collaboration within teams.
While implementing Walkly, we didn’t use any frameworks since we didn’t even know they existed. The closest thing we had were APIs for Facebook and Google and although these should have been easy to implement, the idea of using outside code in our app was so foreign to us that we found it quite difficult.
What did school teach us?
Of course, our University program has added a great deal of value. It is important to learn the theoretical background that makes new concepts easy to learn. But I do think that practical skills need more coverage if schools want to help students be more successful in their future careers.
While working on Walkly, we had no idea what we were doing technically and none of us were trained in business, but by completing a polished presentation that made it look as if we knew exactly we were doing, we managed to win. In truth, the functionality that we had in the app barely worked, and the night before the live presentation in Seattle, we had to hardcode the date as the day of the presentation, before it would run. Although it is possible that with some more help from the University we would have done better, the competition still allowed us to figure out what we didn’t know, helping us gain focus for the following year at school.
If you are a student, I think it’s crucial to get involved in competitions, side projects, and hackathons. If you have kids in school technical programs, encourage them to participate in activities outside their core classes. Since the tech world moves so fast, it is hard for the school curriculum to keep up and a lot of kids end up learning on their own. The students who don’t might find themselves falling behind once they get into the workforce.
The importance of your work terms
We can’t expect every school to teach us everything we need to know. Our work terms are the way to fill in the gaps between academics and our “real world” careers. Use the choice of your time working, be it a summer or a full year as I have experienced, to choose the place you work carefully. In the software development world, you should be looking for a company that is strong on technical practices and the tools, practices and frameworks that I have described above.
My work term at Intelliware was a terrific learning experience for me, showed me the gaps I have described above, and has helped me on my journey to becoming a professional software developer.