Watch our YouTube playlists C Programming Tutorials and C Programming Examples to learn how to program in C with step-by-step live coding examples!
Page 2 of 2
In a recent paper published in Nature researchers used an experiment to find evidence that language skills are a stronger predictor of new programmer learning outcomes than math skills.
Some people are suggesting that this means that learning a programming language actually has more in common with learning a natural language than traditionally believed. Traditionally the ability to learn a programming language was thought to be highly associated with math skills… often colleges will even have advanced math courses such as Calculus as a prerequisite. The results of this study are an excellent new challenge to this belief.
As a long-time computer science educator, my own belief is that students generally only need “enough” math skills to learn standard application programming. The basic mathematical operations and some algebra (use of symbols) seem to be what is important. But beyond this, stronger and stronger math skills have diminishing returns, as introductory-level programming simply does not require these skills.
The interesting part to me is the correlation with language learning. As part of my PhD I completed studies on the gamification of early computer science and adult literacy education, so this subject is near and dear to my heart.
My opinion is that language skills are not a predictor of success in learning introductory programming because learning a programming language is like learning a new natural language (e.g. French). In my opinion much of the “returns” in improved learning achieved due to language skills may be due to the ability to precisely understand instructions and educational material.
Learning to program involves consuming and interpreting written information, and precisely following instructions that are given (e.g. “write a program to print the prime numbers up to 50”). When the compiler presents the learner with an error, the learner needs to comprehend the error, and critically, understand what they might not understand. In other words, recognize what about the error message it is that they do not understand. These are hard, underappreciated skills, often involving metacognition (thinking about our own thinking).
That said, I strongly suspect there is more to it than this, underlying strong language skills are a host of abilities that transfer across subject areas, and it should not be surprising they transfer to learning programming as well.
One of the things I’ve seen new programmers struggle with the most is the error messages they get when attempting to write their first programs. They’ll pay attention to the lessons they’re being taught, do their best to understand the concepts like variables and loops, and then attempt to solve their first problem.
And then the compiler (or maybe the browser) essentially tells them they did it wrong. Often the most diligent students will take this as a personal affront… it’s not just that the compiler is telling them their program is wrong, it’s that the compiler is telling them they’re stupid (this isn’t reality, but this is how it feels).
I think this stems from a lot of the “textbook learning” that students typically encounter. In a textbook students are given an overview of concepts with some example solutions to problems, and then are asked to solve exercises (with answers provided at the back of the book). When students fail to solve a problem, they see it as a lack of understanding that needs to be corrected.
This model of learning does not directly translate to programming. On the one hand, yes, when you get a compiler error it may be a sign that you don’t understand something and there is an opportunity to correct that misunderstanding. On the other hand, experienced expert programmers spend much of their working day correcting compiler errors, because making mistakes (big and small, fundamental or trivial) is part and parcel to programming!
Programming involves the solving of novel problems on a consistent basis, with solutions expressed in a very precise and unforgiving syntax. It’s not like learning Physics 101 where once you understand the equation and how to plug in the numbers you can solve identical problems and over and over without error.
This is why I’m a big advocate of the “live coding” model of teaching programming, where the instructor writes programs in front of the students, including making mistakes and correct them. It is essential that students see this for two reasons:
- Making mistakes is normalized for students. If the instructor makes mistakes and is OK with it, then it must be OK for them too.
- Students learn from the problem solving process followed by the instructor. When the instructor interprets the error message and applies strategies to solve the problem (e.g. examine the line of code flagged by the compiler, use Google/Stackoverflow), this teaches students how to problem solve using these strategies as well.
I try to leave “mistakes” in my videos for Portfolio Courses for similar reasons… to help learners via adopting new strategies to solve programming errors!
When I was looking for my “first real job” I had several great opportunities and didn’t know which to take. I had the choice of a more prestigious position (software developer at IBM) or a position that offered more room for growth and learning at a smaller company (NCR).
At the smaller company I was promised the opportunity to participate in all aspects of software development… design, implementation, testing, QA, etc. I was also promised more responsibility and opportunities for leadership. IBM is an excellent company to work for, I later ended up working with them as part of a research grant. But at least in this case, it was clear where the opportunity for growth was, but I was still drawn to IBM given the name recognition… I mean, it’s IBM.
I was pretty stuck on what job to take and so I asked a mentor what would be best, and they told me something I’ll never forget, “When you’re early in your career, go where you’ll grow“. I took the advice and went for the job that would let me grow more. I was able to experience a much larger range of work with more responsibility than I would have at the other position.
In particular I was assigned applied research projects and tasked with teaching the incoming developers how to work on our projects. I found myself way more excited to complete this type of work than any other, and I was able to get some practical experience with both through this job. This influenced my future career direction, and I don’t know where I would’ve ended up if not for this experience.
If you’re earlier in your career, I suggest you follow my mentor’s advice too. Go where you’ll grow. Go where you’ll be given a range of experiences, responsibility, and opportunities to learn. There will always be time for more prestigious and higher paying opportunities later, but those first few years of your career are the best time to put growth first as the experience will pay large dividends for the rest of your career.
I’ve been teaching post-secondary computer science and software development courses for almost 20 years now. Maybe about 10-12 years ago I started having employers regularly tell me things like, “what really sets apart a candidate is if they have a GitHub account with all their projects”. There was an interesting thread on Twitter about this recently: https://twitter.com/jasonalba/status/1405626754098548740.
And in many ways, it makes sense from the employer’s perspective to use this as a differentiator between candidates. If an employer is attempting to hire a co-op student from a college program, and they have 20 students applying, all having taken the same courses, the student with a portfolio of work has done something extra to demonstrate their skills to employers. A portfolio tends to demonstrate those skills in a way that is different than class assignments, in many portfolio projects concepts are applied to solve “real” problems. The presence of a portfolio also communicates things like drive, initiative, independence and soft skill abilities (e.g. ability to market oneself), all things that are attractive to employers.
A portfolio of work can also help job candidates without a traditional academic background (e.g. a software development diploma or computer science degree). Having access to these traditional academic pathways to a job in the tech sector can be seen as a form of privilege, in that not everyone can afford the tuition or time commitment that these pathways require. So in this sense, a portfolio can actually help those without this type of privilege to access better work opportunities.
But eventually many employers started treating a portfolio of work as a requirement for the job rather than one of many possible differentiators between candidates. While personally I’m a big believer in portfolios as a great way for developers to showcase their skills (just look at the name and purpose of this website), I’d really have to caution employers against requiring a portfolio of work.
The big problem is that a portfolio of work takes time to develop and publish. Not everyone has the ability to spend their time outside of work creating portfolio projects. People have family and other life commitments and constraints. Even for those with time, is it really fair and reasonable to ask them to sacrifice this leisure and personal time? And often the paid work that students, learners and professional developers do cannot be made publicly available as part of a portfolio (e.g. it is sold as commercial software).
So if employers are requiring a portfolio of their applicants, they’ll be missing out on excellent candidates who are unable to demonstrate their skills with a portfolio. Missing out on excellent candidates should be enough to spark a re-think. But just as important, it also raises issues of fairness and inclusion, as having time available to build a portfolio is a form of privilege that not everyone can access. For a tech sector that is seeking to improve inclusion, this should also raise an alarm.
While it’s ultimately up to employers to figure out their own processes, I’d strongly suggest that employers do not require portfolio work for this reason. While accepting portfolio work as a means of demonstrating skills is an excellent idea, for example allowing candidates without formal education to showcase their skills, making it a requirement is to the detriment of both the employer and applicants. And arguably the industry itself.
Ideally employers will have application and interview processes that take into account multiple ways to demonstrate proficiency and aptitude for the job. In practice employers may themselves be stretched for time. This is where perhaps new processes and tools/technologies need to be created to assist employers with making better hiring policies.
One of the better developers I know was unable to complete many interviews because they required her to do “homework” solving practice problems. She worked full-time and had to take care of a sick family member during her “off” time. She ended up getting a great job at a web company that used a hands-on technical interview. During the interview she was asked to solve a small technical problem (30 minutes), and the interviewer was just there to see the process she followed. She asked questions. She used Google. Things good developers do every day. She got the job, and she’s now a star at the company.
I don’t think there is an easy answer, but I’d love to hear more stories like this one.
What about Portfolio Courses?
For my part… this entire business is centred on helping students to develop portfolios. I really do feel they are an excellent way to demonstrate a skill set to employers, and that in particular for students and others trying to break into the industry they can make a huge difference. But a big goal of mine with this business is to lower the technical skills and time commitment bar to develop portfolio projects.
I’m hoping that by giving students a hand-holding experience through developing portfolio projects, they’ll be able to develop more projects faster than they would have otherwise. Or maybe even help students to develop projects who before would have developed none at all due to the bar being too high. But I’m going to be doing my best to keep in mind time commitments, with a goal of offering a range of courses able to accommodate different possible time commitments.
Often times we focus on developing our technical skillset, learning the latest framework or technology because it’s on all the job listings. And while this is important as a minimum qualifier for the job, often what differentiates us from other candidates is our soft skills. In other words, technical skills might get your resume on the short list, but soft skills will get you the job.
Research and surveys of employers over many years has shown this to be the case. For example this paper on Industry Expectations of Soft Skills in IT Graduates out of New Zealand which surveyed IT employers on the importance of soft skills:
“Soft skills contribute significantly to individual learning, team performance, client relations and awareness of the business context. Most employers consider these soft skills to be un-trainable in the work-place, making soft skills the critical hurdle for employment. “
…followed by…
“Technical skills are a prerequisite but the point of difference is soft skills — which are hard to train”
Schools and workplaces often don’t do a great job of developing soft skills. A manger once told a colleague of mine that she was a perfect fit for the job because she had “the things you can’t teach”. Is it really true soft skills can’t be taught and learned? Are people just born to be great communicators, team players and organizers?
As an educator, in my experience soft skills can’t always be taught in the same way that technical skills can be taught, with demonstrations, assignments and testing. You might be able to teach a student how to write a good, effective sentence. But it’s hard to teach a student whether sending a bunch of questions over e-mail to their boss is a good idea or not! Maybe they’ll annoy their boss, maybe the boss will be happy to see the enthusiasm… it probably depends on the situation and questions.
These types of social soft skills are often best taught with experiential learning where we conduct some real-world activity that forces us to grow and learn in ways that can’t be captured by “book learning”. When we work on a project as a team, or try to write a tutorial or make a podcast, we go through a series of decisions around communication and collaboration with others that can’t be captured by “book learning” alone.
So when you think about developing your professional portfolio, I strongly recommend keeping an eye towards experiences that will develop your soft skills too! It’s not just about having a GitHub account with projects, it’s also about your time spent organizing clubs, helping others as a tutor, writing articles, and other soft skill oriented experiences.
Because soft skills are so important, we’ll actually be creating courses to teach you how to build your soft skills and showcase them to potential employers! Our first soft skills course, How To Organize Awesome Meetup Events, has now been published on Udemy: https://www.udemy.com/course/how-to-organize-awesome-meetup-events/?referralCode=D98C0AD909E83C38D696. Organizing meetup events where others get together based on a common topic to learn, have fun and network is an excellent way to build and demonstrate your soft skills!
The age old chicken-and-egg problem of first-time job seekers is that every employer wants to hire someone with experience… but how can you ever get your first work experience if every job opening requires experience? This is where it may be tempting to work for free in some capacity to get that initial experience. But should you work for free? Working for free can be exploitative, it can devalue what you’re really worth, and it sets a bad precedent that employers can expect free work.
In my experience, and from watching the experience of many others… working for free, under some very limited and specific circumstances, can actually have a tremendous benefit to your career by allowing you to learn, to grow, to build confidence, and to demonstrate your experience. Under other circumstances though, like unpaid internships at companies that can well afford to pay you and aren’t teaching you anything valuable, in my opinion you’re very likely being exploited, and it’s just not worth it.
So when to work for free and when to take a pass? Here’s when I suggest working for free may be worth it…
Projects for charities, nonprofit and volunteer organizations
Charities, nonprofits and volunteer organizations that exist due to donations, government grants and volunteer time, may legitimately not have the budget to pay for things that they would like to have done, whether it’s a website, graphic design or social media. People will do things like volunteer at the library every week to teach people how to read, or serve soup to the homeless from a kitchen, in order to help these organizations fulfill their mission. Making a WordPress website or a logo, or performing some other service, can be the digital equivalent of serving soup to the homeless or a lawyer doing “pro bono” work for clients that can’t afford their services.
Mind your hours of course… you can only do so much pro bono work, but whether you’re looking for first time experience or just want to help out, volunteering your services to a charity, nonprofit or volunteer organization can help your community while giving you real-world experience.
Open source contributions
Open source projects involve source code, design documents or content that is freely available to the public, and that generally speaking the public are free to contribute to as well. In software development this means software developers coming together to build everything from operating systems to video games. A common misconception is that open source is something specific to software development, and that only software developers can contribute to open source projects. Even for software projects, contributions ranging from event planning to writing documentation are also required, but there are a range of other industries that use open source.
Contributing to open source projects allows you to help build things that benefit everyone. Not everyone can afford expensive proprietary software that costs thousands of dollars per year, but free solutions can do the job good enough (or better). Making open source contributions allows you to work on real-world projects and get feedback on your contributions from the project leaders. Check out this guide on How to Contribute to Open Source to help get you started!
Hobby projects for yourself
Projects that you work on for yourself can have enough intrinsic value to make them worthwhile. One of my friends setup a Raspberry Pi and sensors to monitor his home wine-making operation, so that he could track and analyze things like temperature over time. It might not be worth it if you measure the worth of your hours in dollars, but if it’s a labour of love than it’s a different story. Hobby projects that you work on out of sheer passion can make for the best experience, because your passion for the work will motivate you and will show up when you talk about the project with others (like potential employers).
A business you own shares in
This one you need to be a little careful with… there’s a never ending list of people that will offer you “sweat equity” in their startup business. It’s difficult for a business to get customers or investment for vapourware, and so often startup businesses will rely on giving equity (i.e. shares in the company) to developers and other early team members in order to build a prototype or minimum viable product.
You’ll need to make a judgement call with this one based on the viability of the business, your interest in the business, and the equity that you would take away. I would also strongly advise getting a lawyer to look over any paperwork you sign regarding equity in the company.
Even if it’s something you’re building for your own business idea, you still need to be mindful of the time you’re investing into something that may not have a payoff. All that said, working on and building something for a new business can be a great way to gain experience… businesses have customers with requirements, and who can provide feedback, which can help you to learn and grow.
What about situations to avoid? Or at the very least, exercise extreme caution?
Unpaid internships
Unpaid internships devalue your work, help set a precedent that companies can expect free labour from new graduates, and unlike side projects done on evenings and weekends, occupy too much of the intern’s time. In some cases, and I’ll admit that not all will agree with me here… unpaid internships might be worth it… for example when the intern is receiving a high-level of very valuable training, or when the intern receives academic credit, or when a job offer is guaranteed after a period of unpaid training. Sadly unpaid internships are common in many industries, and often they aren’t providing the sort of high-value training that is really supposed to justify the unpaid nature of the internship. Be very, very careful with unpaid internships.
Spec work
Spec work is when companies ask you to perform some task for free to see your work, and then they may or may not hire or pay you later. Often times this will come in the form of a contest… a $100 prize to design a website layout for example, that leaves you competing with potentially hundreds of other people for the prize. Some recruitment platforms are even building this type of spec work into their system… they’ll have hundreds of students complete work to demonstrate their skills to an employer, who is then able to pick the top student(s) for the job. Unless you’re OK with doing it “just for fun”, I would advise staying clear of spec work… if you’re doing work that isn’t a hobby passion project (where you are your own customer), one of the key things you want out of the process is customer or user feedback, and/or mentorship, which spec work doesn’t provide.
A portfolio is a collection of work that showcases your talents to the world. For example, in software development this might mean contributions you’ve made to open source projects, an e-commerce site you built for a friend, or even a fun chatbot you made for dispensing Chuck Norris jokes!
A strong portfolio is a critical factor to succeeding in a job search, in particular for job searches done earlier in one’s career, when you typically don’t have years of prior paid experience to reference. Employers tend to love portfolio projects because unlike a resume or cover letter, they directly demonstrate your abilities and interests.
So many of my former students have told me that their job interviews essentially became a discussion about their portfolio work, with the employer asking them questions about how and why they built their projects. This ability to communicate about the work you’ve done might actually be as important as the work itself. Former students constantly tell me things like, “it was the video game I made over the summer that actually got me the job”. A portfolio signals to the employer that you are passionate about your craft, and that you have an ability to learn new ideas outside of a classroom environment.
The work contained in a portfolio can be work done during paid employment, but it can also be side projects, passion projects and “pro bono” work done to help your community. By creating a portfolio of side projects, a portfolio can be a great way to break the old paradox that “you need experience to get a job, but all the jobs require experience”. It’s also just really fun to work on and create things that you personally are passionate about. You might not be able to get paid to create a website for your favourite hobby, or for a non-profit organization, but it feels good and rewarding when you create something not because you’re being told to by your boss or a teacher, but because you wanted to make it happen.
The barrier I’ve noticed for many people in developing portfolio projects is that they just don’t know where to get started or what to do when they get stuck. Classroom learning tends to be very structured compared to the more self-directed learning and effort that a portfolio passion project can require. It also tends to be focused on understanding foundational concepts rather than identifying real-world problems and then applying those foundational concepts to those real-world situations. Then there’s the idea problem… what should you build that will showcase your skills, allow you to learn and work on something you’re passionate about, and impress employers?
Portfolio Courses was created to help students build portfolio projects by providing the ideas for projects, and the step-by-step help to complete the projects from start to finish. The courses allow students to customize their project to apply it to problems that they are passionate about, with lists of ideas accompanying each course or options for customization, so that every student that takes a course can have their own unique project. Our goal is to leave you with a project that you can use to impress employers, that you’ll understand and be passionate about, and that you can demo and discuss during an interview to help get that job!
My name is Kevin Browne, I’m the creator of Portfolio Courses.
I’ve worked as an educator for the last 20 years teaching post-secondary level computer science courses.
For years I’ve noticed that students with excellent portfolios of work developed during their spare time (“side projects”) have far more success obtaining post-graduation employment, both in terms of the employment percentages and starting wages. This phenomenon extends beyond junior level employees, as those who build excellent portfolios are very often able to leverage these experiences to advance their careers and take on challenging, meaningful and well-paid work.
But completing side projects is difficult, for everyone. People don’t know what to create or where to start. And that’s where I want to help people.
I’ve started Portfolio Courses with the mission of helping people to build awesome portfolios of work that will help them impress employers, colleagues and clients, and hopefully land their dream job and progress in their careers.
We’ll be releasing free and paid courses, lessons and tutorials to help students learn and develop excellent portfolios.
Please subscribe to our newsletter to stay up to date!