Be aware, companies are not monolithic entities. There's the "functional departments" (HR, accounting), and they are easy to find. But they are useless for making contacts. If the core business is IT (and you really want to be in an IT shop, not just plugging in people's network cards) then you need to get onto the project managers (or just project workers) in the company. HR is a waste of time, unless you must talk to them. Google, LinkedIn, the companies website, email, and a phone are your friends. Find someone who looks like a developer, email, then follow up with a call. It never hurts to ask.
If you want to do a demo project (and while you might not need it, but it won't hurt), tell us your skills, and I'm sure someone will suggest a reasonable "Hello world"y project you could do. It doesn't have to be revolutionary, or even good. Just enough to show you know how to get stuff working.
I'll be taking 4 CS courses this year (2 in the Fall, 2 in the Winter), they are: Object-Oriented Programming II (Java), Data Analysis with Scripting Languages (Python), Introduction to Algorithms and Data Structures (Java), and Logic for Computer Science.
I don't consider myself incompetent by any means, but I still have a lot to learn. I find problem solving fun, but unfortunately I get fed up if I get stuck and can't make in progress towards finding a solution.
Steps (you can cut out anything that ends up being difficult - it's just a demo thingy from a student):
- hello world, using a web framework. Go for a minimal one, like flask / bottle / web.py.
- hello world, with a list of <a href="/1">Aricle 1</a> links. (hand written html mock-up). Something like:
def GET(self):
return '''
<body>
<ol>
<li><a href="/0/">Article 0</a></li>
<li><a href="/1/">Article 1</a></li>
<li><a href="/2/">Article 2</a></li>
<li><a href="/3/">Article 3</a></li>
</ol>
</body>''') # does this need a head?
- generate the html links in python, from a list ['my first article', 'my second article', '<b>Escape html injections?</b>',u'\u4f60\u597d does unicode work?']. The html should now be: (head)
<body>
<ol>
<li><a href="/0/">Article 0</a></li>
...
<li><a href="/3/">Article 3</a></li>
</ol>
</body>
Note, don't worry about titles. Titles are a pain (you convert them to url-safe "slugs", but the slugs might clash ... you could spend hours on it and it's just not fun).- write the "article" pages. They should look like:
<body>my first article</body>
For bonus points, make sure you can't inject html (the <b> post should not be bold), and that unicode works OK.- Add a page where you can post. You will need a text box to post in.
- Use a sqlite3 db instead of a list.
- User authentication? Cookies? For a toy project, don't use passwords, just log anyone on with whatever name they input. Use cookies to keep them logged on. Password handling and secure HMAC cookies - (ask the interview how this should be done - give them a chance to show you how smart they are, or why they just use a solid tested framework that does it all for them)
- Finally, pimp the site a little. Eye candy always impress. Just don't waste time on it.
- Check it into github.
That's about it. It's just a toy project, but gives them something to look at.
What I mean is, make sure that you've talked to people in the company. Like others have suggested, talk to people outside of the HR department. If you need a suggestion for how to go about contacting them, I've had a lot of success with finding someone who works there, sending them an email with a subject "What's happening at <company name> this summer?" Inside the email, include a sentence about why their company is cool, a sentence about why you'd like to work/intern for them, and then ask them if they might have a place for you.
Not only have emails like this been well received, they give you the chance to craft your initial conversation with a company, and talk to many more companies than going through HR would allow.
In my experience I had a much higher response rate than I expected, and while many weren't looking for anyone, a follow up email asking if they knew anyone who was hiring often produced another lead or two. Best of luck.
Do this now so you know where you are, instead of finding it years from now when being interviewed for a real job. The sooner the better.
2. It takes less than a day to come up with a project. For example, I built a facebook tab CMS in about 5 hours, and it's a pretty cool little demo. Is it a big deal? No. It's not even enough to compete with the plethora of $5/month offerings already on the market. But does it demonstrate some basic skills? Absolutely. Take a saturday and write something simple. Make it work well (FINISH IT), and you'll be surprised at how much credibility it gets you. In fact, make your own facebook tab CMS. It doesn't have to be clever - it just has to be real.
Also, internships are there to learn, nobody expects you being a guru, they expect someone with passion and a hard worker.
Good luck!