DEV Community

Jason C. McDonald
Jason C. McDonald

Posted on • Updated on

I've Trained Programming Interns For 6+ Years, Ask Me Anything!

I've had the marvelous privilege of running an internship program in my area through my software company. I've worked with the computer science and career service departments of our local universities to continually improve this internship, and am proud to say that we've had a dozen graduates of the program to date, most of whom went on to full-time development and IT positions.

Interns work 6 hours a week (almost always remote) on actual projects in C++ and Python. They have opportunities to participate in team leadership, hiring, and standards authoring. Although remote, we're fully collaborative, and offer the same level of administrative structure you'd find in any full-time industry job (remote or otherwise). Ours is definitely an unusual program, but it works.

Since our company has between 3-10 active employees at any given time, I wear many hats. In running this internship, I've simultaneously served as lead developer, hiring manager, trainer, mentor, technical writer, code reviewer, IT, DevOps, you name it! I've helped interns learn to manage time, handle conflicts, solve problems, ask questions, review code, write documentation...and much, much more.

I've made a lot of mistakes over the years of running this program, but it's been an adventure I've loved every minute of. I've been taking the time to look back as I get things in place for (hopefully) the next round of interns next year.

Ask me anything!


Read the article based on this AMA...

Latest comments (131)

Collapse
 
haken_oliver profile image
Oliver Haken

How do you learn about modules using help(), dir() ect

Collapse
 
musawakiliml profile image
Musa Adamu Wakili

Hello, i have started an internship program in my academy this yea, basically i am teaching them only python programming. Pls what will be the best way for me to mentor them into becoming good at programming in 8 months.

Collapse
 
codemouse92 profile image
Jason C. McDonald • Edited

Here's a few things:

  1. Give them real tasks to do in a real project, where the outcome depends on them. Encourage them to make and learn from mistakes.

  2. Give them space to do the task, and encourage them to seek help when they need it, but otherwise stay out from underfoot until they ask. Save your feedback for code review, and then...

  3. Give them thorough code reviews. Keep positive feedback and constructive criticism in balance therein.

  4. Teach them how to find their own answers. Research and using documentation is a skill that takes practice.

  5. Create opportunities for them to collaborate with one another, and with the rest of the team. As one of my interns regularly reminds his peers, "the internship is us."

  6. Focus on training soft skills and general programming skills: task and time management, communication, code review (they should review others too!), writing documentation, testing, debugging, effective repository usage, and so on. These are the skills that are so hard to pick up on in a career. You can always learn another technology.

Be advised, an internship isn't really a good model to teach programming for the first time. Once they have basic programming skills, an internship allows them to use those skills on a real team. They'll do a lot of on-the-job learning, and possibly even some training, but the purpose is to gain real world development experience.

Collapse
 
eezzell profile image
eezzell

Hello,

I am starting a paid internship program at my organization, and will be working with interns who are going through the same grad program that I did. I was considering starting a book study as professional development for the interns, but am not sure if I will be able to ask the interns to count all of the hours they may take reading the book towards their paid hours. I was considering asking them to read an excerpt that would count towards their hours and to allow their book presentation work to count towards their hours, but to make the reading of the complete book optional. Do you have any suggestions?

Collapse
 
codemouse92 profile image
Jason C. McDonald • Edited

Hi @eezzell ,

There are actually two books that we require all interns to read here at my company, and they are allowed to count all the time. There are a couple of books that I may recommend or assign, depending on their task. That may sound like it would take a large chunk out of the 240 hours, but the return on that reading is actually worthwhile.

Usually, the best way to keep this balanced is to have a clear checklist of expectations for the internship. If they know up front what all they will need to do with their time, and how long they have to do it, that will help them to prioritize. At my company, we require 240 hours, 6 hours a week, and we have confirmed that all the tasks can be completed comfortably within that timeframe.

As to your particular situation, you could have them just read an excerpt, but understand that they are not likely to want to read the rest of their book on their own time. Paying interns for training time is just one of the investments a company makes. If you can't justify paying them to read the book, chances are it's not that important.

Collapse
 
dah00 profile image
Obed

(I hope it is not to late to ask a question)
I am a sophomore college student, I would like to get an internship but at the same time, I am still worried that I don’t have a decent knowledge for an internship yet. I am about to finish my Data Structure class now. My question is, what is the minimum knowledge required to get an internship? What else should I do to be confident enough in coding.
Thank you.

Collapse
 
codemouse92 profile image
Jason C. McDonald

It depends on the internship, really. Some (like the one I run) only require basic proficiency with at least one programming language, and familiarity with either object-oriented or functional programming; all of that you'd get from your typical CS-101/102. Others may want you to know a particular language, or have other knowledge; look at the posted requirements for any internship you're interested in.

As far as gaining coding confidence, you only gain that by working on real projects. In lieu of an internship, start a side-project of your own. Make it about something you personally care about, something you would actually use. Then, build it, learning as you go. This is the single best way to gain confidence in programming, and it makes an excellent addition to your coding portfolio, especially if you put it on GitHub or the like.

Collapse
 
dah00 profile image
Obed

Thank you for your respond, it is very helpful.

Collapse
 
codemouse92 profile image
Jason C. McDonald

My morning devotional is my reset button. :)

Collapse
 
laserblue profile image
laserblue

Do you agree with Semmy Purewal's statement regarding the existence of a gap between what is taught in Universities and the professional world?

Learning Web App Development (2014 ) by Semmy Purewal
pg. xi

“It turns out that there’s a pretty large gap between practical, everyday software engineering and programming as taught by computer science departments at colleges and universities.”

“In early 2008, after about six years of grad school and teaching part-time, …”
“... I had been studying computer science for about nine years at that point, and had been teaching students how to develop software for about six years. Shouldn’t I have already known how to build web applications? It turns out …”

Collapse
 
codemouse92 profile image
Jason C. McDonald

Absolutely. This is the gap wherein fits the internship program I run. A couple of the university CS professors I've worked with in the past have affirmed the same, and regularly warn their students of this gap; unfortunately, their students invariably remain incredulous until they actually try to work in the industry.

Collapse
 
deevs_hari profile image
Dhivahari Vivek

Undergrad here! Have been trying forever for a cyber security internship but decided to accept a software engineering internship to at least get some experience (and because the cyber opportunities were taking too long to respond to me). I know cybersec internships really appreciate prior cybersec experience and this current internship is just software engineering. I am also leveraging the security research team of which I am leading. Will the fact that my current internship (that ISN'T cyber security-related) still add some weight to my resume when eventually looking at cyber security internships and eventually a cyber sec full-time position? Do I still have a chance at cybersec opportunities when my only professional experience in the industry is regular software engineering? (Though, I may get to do security things, but the position is an all-purpose compsci position, if you catch my drift.)

Thanks for your time!

Collapse
 
codemouse92 profile image
Jason C. McDonald

I can't say much to the cybersecurity sector per se, as I have no work experience in that specialty. That said, I know that general computer science and computer programming do play a major role nevertheless. Industry work experience, especially at this stage of your career, is always valuable.

Depending on your particular internship, however, you may be able to maximize the future applicability of your experience. Learn the security factors of the languages and technologies you're using. Every language has security holes. If you can familiarize yourself with the security flaws that may potentially affect the project your team is working on, you may be able to provide useful feedback through code reviews, bug reports, and the like.

If this sounds like something you want to do, I recommend talking with your supervisor about it. They may have specific ideas on how you, in your current assignments, could add value to the project from a security angle.

In any case, remember: any computer science position will necessitate knowledge of programming patterns, paradigms, techniques, and algorithms. Nothing you're doing is wasted, even if you can't do much security-related.

Collapse
 
jasterix profile image
Jasterix

Great post! Is this a paid internship?

Collapse
 
codemouse92 profile image
Jason C. McDonald

Unpaid, as the organization in question focuses on open source, and does not presently have income. (Even I, one of the owners, doesn't get paid.)

Collapse
 
codemouse92 profile image
Jason C. McDonald

I'm sorry, but I don't assist with cracking. I also would advise you to think better of this plan; even most white hat hackers would consider this unethical.

Collapse
 
haseebshout profile image
Haseeb Munir

Hello Jason,

I just read your post and I thought that I should connect with you as I am seeking advice regarding the career switch I want to make. I am a Mechanical Engineer and most of my life I have lived in Middle East, hence most of my 12 years experience is on Oil & Gas Industry projects. I was more towards Projects Control department.
I moved to USA 3 years ago, and now I have my work permit here. I have been working on different contractual jobs but I always wanted to make a switch to IT industry as I don't enjoy Oil & Gas anymore.
Obviously I had to do some research about what I want exactly and it seems that I am gravitating more towards Data and AI.
After digging in deeper I found out that any coding language is something that I must know in order to move forward.
I would like to ask you what exactly is the path in your opinion that I should follow in order to learn the basics quickly and then later land a job.
I am 36 now, Someone recommended me Udacity Nanodegree but I am not sure if 6 to 8 months course can help me find a job.
I know that the first step is learning a coding language but I would like to learn by working on a project. I know about many online institutes and recruiting agencies that would offer a crash course worth hundreds of dollars or even free and would promise that they would place the candidate and land a job. But what happens actually is that after the course, they would prepare a Resume that would have 5+ years of fake experience and the candidate would be told to prepare for the interview accordingly.
To be honest, as mentioned above, I would like to find a way where I could learn the language by working on a project, polish my skills and even start on a basic level job.
What are your suggestions.
Thanks in advance,
Muhammad Haseeb Munir.

Collapse
 
codemouse92 profile image
Jason C. McDonald • Edited

Hi Muhammad,

Thankfully, formal education is not always a necessity! It played such a minor part in my own professional journey.

Here's what I recommend:

  1. Start learning a language. Given your interest area, start with Python. Automate the Boring Stuff with Python by Al Sweigart is an excellent place to start. After that, check out my own Dead Simple Python series to dig deeper. While learning any language, focus on strengthening the fundamentals.

  2. Plug into developer communities. The #python channel on Freenode IRC is an excellent community to join! That was the crowd that first broke me in as a greenhorn, and I continue to learn so much from them. Make yourself a part of the communities you're in. Ask questions. Answer questions, or at least try to. Write articles here on DEV, especially #devjournal posts initially, documenting what you learn. Communication in all forms is essential to success in programming, and it also builds your skills in English and whatever other language(s) you use.

  3. Find an open source project to contribute to. One possibility is Mycroft.ai, a fairly mature open source personal voice assistant project, developed in Python. You can start by writing simple skills, and working your way up to the tough stuff. Challenge yourself!

  4. When you encounter a problem that seems too tough, learn what you need to solve it. Talk to people in your programming communities. Experiment. Break things, and then fix them! You learn more from these moments of being "stuck" than you could from any book or course.

Lather, rinse, repeat. If you dedicate yourself to this process, soon enough, you'll have gained enough provable knowledge through your open source participation to earn a spot in an entry level position. Bonus, the friends you make over time in the communities you're in may even be willing to recommend you, once they've gotten to know you, of course.

Collapse
 
haseebshout profile image
Haseeb Munir

Hello Jason,

Thanks for the swift reply. I will start following the steps and might again ask you for your help if I need some help.

Thanks once again

Collapse
 
israelamandi profile image
Israel Amandi Snr

Hi Jason,
I am a newbie. Can you please mentor and coach me to become a marketable programmer?

Collapse
 
codemouse92 profile image
Jason C. McDonald • Edited

Hi Israel,

Thanks for reaching out. My time is very limited, but you're welcome to check out this listing for the internship program I've been referring to. If this is what you're looking for, I'd encourage you to apply to the Informal Internship program (since you're international).

Otherwise, there are a number of other mentors here on DEV; alternatively, you can post your own listing seeking one.

All the best!

Collapse
 
codemouse92 profile image
Jason C. McDonald

Another question, this one via email.

I'm getting ready to finish my masters degree. On the other hand im trying to find a way to get a remote job. According to your experience in the field, what skills do I need? Where should I search?

The exact skills you need depend on the remote job you're applying for, but in general...

  • You'll need to be reasonably proficient with whatever language(s) the job uses.
  • You should be familiar with the common algorithms, data structures, and design patterns in programming.
  • You MUST be able to communicate clearly and effectively with others.

Take a look at dev.to/codemouse92/how-to-become-a... (as well as Part 3).

In terms of searching for a job, there are a number of job listing sites for tech, including:

You can also look for a Jobs or Careers page on the website for any tech company you think you might want to work for.

Besides applying to jobs, you should definitely look for opportunities to contribute code to open source projects. This will help you build your all-important portfolio, which any company will want to see as part of considering you for a job.

Third, you should build your professional network through DEV, Freenode IRC, GitHub, LinkedIn, and the like. One of the benefits to have strong working relationships with other coders is that they can recommend you to jobs at companies they work at or have contacts at, and they can vouch for your skills. It takes time to build this network; the main point of any such a relationship should be mutual support, not just "what can I get out of this". Over my years in coding, I've built an extensive network of professional friends across many countries, and touching dozens of major organizations. I never set out to make friends with people who "knew people." These friendships just happened naturally over time, and now are a major help to my career.

Collapse
 
codemouse92 profile image
Jason C. McDonald • Edited

I received a great question through PM worth sharing.

I am student of computer science...I am confused which field to select as my specialisation. Can you help me which programming language should I go for. If I pick Java what is important to know in this field as a Java developer?

It actually isn't that important to "select" a specialization right away. It isn't uncommon for developers to select one later in their career, after they've had the opportunity to try different things.

The same is true of languages...it doesn't matter that much which one you start with. Find one you like and learn it! If you learn you need to know another language, learn that one as well. Many developers know multiple languages.

Right now, you should focus your attention on mastering the general skills you'll need: programming basics, paradigms (object-oriented, functional, and generic programming especially), debugging skills, algorithms, data structures, design patterns, math skills, communication. You'll need these skills regardless of your specialty.

Some day, you'll find some specific thing (or even multiple things) that you deeply enjoy in programming, and that will probably become your specialty. It may even wind up being something you'd never thought of!

For now, just enjoy the ride.

Collapse
 
luisduenas profile image
Luis Dueñas

Hi Jason, I recently started my first remote job!, what advice can you give us to avoid common mistakes newbies make? (and what are those mistakes?) i don't want to screw this up.

Collapse
 
codemouse92 profile image
Jason C. McDonald • Edited

Hi Luis,

Congrats on your job! Here's a few survival tips:

1) Schedule strict work hours, and guard them fiercely. Your employer may set hours for you, or they may give you some autonomy here. In any case, you should have just as much of a well-defined schedule as if you worked in an office.

2) Create a dedicated workspace. Environment has a huge impact on our psychology. You should define a space that is only for remote work, if at all possible. You should never allow yourself to use this space for playing Minecraft, watching Netflix, or hacking on personal projects. This might be a home desk, a corner of a coffee shop, a table in the local library, a spot in a collaborative workspace...just find somewhere that is for work and ONLY work.

3) Set boundaries with co-habitators. Partners, children, roommates, neighbors, and friends need to understand that when you're working, you're effectively not there. Work time is not a time to mow the lawn, wash the dishes, walk the dog, or play Borderlands. Schedule other times to do these things. Let nothing encroach on your work time, unless it would also be acceptable while at the office (such as a medical emergency.)

4) Have a dedicated computing environment. If you can acquire a dedicated work computer, do this. Otherwise, you may want to create a separate user account on your usual machine. As with the physical environment, this helps minimize distractions and improve productivity. There's no temptation to play Minecraft or check Twitter if the icons aren't even there.

5) Shut off distractions. Use browser plugins like Leechblock NG to keep yourself off of distracting websites. Close out of social media on your smartphone. Set your notifications to only be work related. (This is one more advantage for #4.) You may tell yourself "Oh, I can leave Discord open and not get distracted," but you're really just lying to yourself. ;)

6) Find opportunities to interact with your coworkers. Learn how to use all the company's collaboration tools. Take time to set up Slack (or whatever is used) so you can safely leave it open without it sucking up all your attention. Seize on opportunities to collaborate over video chat. Get to know your coworkers. Just because you're remote doesn't mean you need to be disconnected.

7) Invest in your tools. It will be easier to work if you have good tools, so you should splurge a bit on these as your budget allows. Consider investing in a good keyword and mouse. Find comfortable headphones that allow you block out distractions. If you use an online music streaming service, buy a subscription without ads. Purchase a few relevant coding reference books, and keep them on hand. I even have a whiteboard on my home office wall!

By the way, MyNoise.net is worth every penny of its (amazingly affordable) lifetime subscription. It really helps with focus and blocking out distractions.

I hope these help! I'd also recommend looking at my other responses on this thread regarding time management.

Collapse
 
luisduenas profile image
Luis Dueñas

Thanks for the tips, i'm currently trying to invest in my tools, i never new they were so important until i started working from home, i doesn't even thought about having a comfortable desk chair before!, i will look up for your other responses!

Collapse
 
codemouse92 profile image
Jason C. McDonald

I received a question on Twitter from a computer science professor, asking how to help his students, who all understand theory, how to apply that to logic. I wanted to share my answer here as well:


As you probably know, all the theory goes out the window as soon as one is working on actual code. There are two things you can do to help your students with this:

1) One of the best things you can do for your students is to "drop them in the deep end of the pool," so to speak. Instead of assigning only small, well-defined projects, have them work on larger, more real-world-style projects, especially in pairs. (Grade them individually, not as a pair, to help ensure they BOTH do the work.) Allow them to hit the difficulties of writing real software. Through the struggle, they'll start to learn through trial-and-error how to apply theory to logic.

2) Study ACTUAL code in your classes. Take examples from production code. Have the students read sections of code from major open source projects, wherein the theory you've discussed is applied.

Teaching programming is not unlike teaching English or any other spoken language — you must read and write the language to learn how it really works.