views:

224

answers:

12

I'm currently in College doing a Computer Systems program (2 years) and so far the first term is composed of very basic stuff that I am already familiar with so I'm looking for something to do "on the side". What I know right now is some basic VB.NET, Java, and C++ and I enjoy building small OS (windows) utilities like file renamer, etc.

I'm wondering if I should go and learn some new language (Scheme comes to mind or Python?), expand on what I know right now, or look at stuff like design patterns. I know that these are all important but right now, my goal is to do or learn something that will get/help me in an internship probably as early as next year.

+3  A: 

Scout out a few companies that you'd like to intern at and find out what they use. Then learn that. On a side note, I'd check out C# (much of your vb.net will transfer over) and PHP. These are two of the most-widely used languages today in the industry. I'd also encourage you to start playing with client-side libraries like jQuery, as they will likely greatly help you land a job in the future if found on your resume.

Jonathan Sampson
Forgive me if I understood you wrong but does that mean I should lean a bit more towards the "web side" for now?
Sheen Robertson
Not neccessarily, i'd try both and see which you enjoy most. Overall, when going into a field i'd not try and learn something "just because it's most used", find your strengths and stick to them.
RCIX
Sheen, not necessarily. Find out what your local companies are doing; web or not? Start learning the necessary technologies to cater to their needs. I've used C# for both winforms and webforms, so learning it will help you out in both areas. PHP is largely web-centric, so whether or not your local companies focus on web-development will determine your route.
Jonathan Sampson
+1  A: 

Just a couple of random thoughts.

If your goal is to get an internship, learn about the companies you're interested in interning in. If these are corporations like Microsoft or Google, you should be able to find some stuff about internship interviews they're doing. Of course I'm not telling you to prepare to give canned answers to canned questions. Also - Google and Microsoft have great HR and technical interviews - they tend to as questions that don't have the best answer - they mainly check your ability to think on your own, outside of the box, and your ability to learn.

This really deserves a separate paragraph: You need to be able to demonstrate you're able to learn new knowledge fast.

If you're interested in interning in a smaller company - you probably won't find info about their interview process, so you have to learn the things that they do and demonstrate you'll be of use to them for the 2-3 months you're going to work with them.

On the other hand - the more programming languages (programming paradigms, really) you're familiar with, the better. Learning Python will open you a couple of doors (for Django web development, and with Google in general, because they're big on Python). Keep in mind that programming languages are merely tools (one is better to do one thing, other to do something different), and what really matters is how you use them. It boils down to what you know about programming in general - design patterns, programming paradigms.

Judging from the languages you mention (VB, Java, C++), you're into OO programming. Try Haskell or Erlang for a change. Get out of your comfort zone while you still can let yourself do that.

Good luck!

Marcin Seredynski
+1 for "Get out of your comfort zone". That phrase resumes what learning and improving is all about.
Pablo Fernandez
+1  A: 

Couple of languages to look into:

  • PowerShell - It's a nice extension of what you already know and its a great introduction to scripting and the joy that is the Windows subsystems (WMI, etc)
  • Perl - You can never go wrong learning Perl (for any number of reasons)
  • Haskell or F# - Come to the functional world and learn about a whole different way to attack problems (especially recursion, it blew my mind how easy it was. :))
  • C# is very much like Java and on the .NET platform

A few topics that you might want to also look into:

  • XML, XSLT, XSD and strongly typed messaging. You will find it everywhere and it is more than just angle brackets and nesting
  • Low level networking - sockets, RPC, IPC, transports, TCP/IP all the good stuff. Try writing a web server, from scratch without using any support libraries beyond the basic primitives (sockets, etc.)
  • Databases and good relational design. How do you build relational structures, what constitutes a relationship and when should you use them. There are whole ecosystems devoted to just these topics.

Or you could always go back to your roots and learn C (not C++), learn what it was like in the good old days and why many of the language features you use now are so important/helpful.

GrayWizardx
+1 for haskell/f#
RCIX
A: 

I second Jonathan's recommendations and if you have time left I would highly recommend learning a functional language like Erlang or Haskell. It gives you another perspective on problem solving. Erlang also gives you exposure to concurrent programming.

ennuikiller
A: 

You should feel free to try out various of languages. One thing that I always told new comers is no matter which language you pick up or which direction of software development you heading, you should always continously building up your fundamentals on computer science like OO, patterns, methodologies and all the wecked things we came up with.

Good luck, have fun!

rockacola
A: 

To get something that almost certainly will not be in a 2-year Computer Systems program, will be exciting, and most important, will teach you to think bigger and more exciting thoughts, check out How to Design Programs and the TeachScheme project. As you learn Scheme, your mind will expand, and you won't be bored.

If you're curious about why to learn Scheme, check out Paul Graham's essay "Beating the Averages".

Norman Ramsey
+2  A: 

Pick a project that interests you (for ex. I chose long time ago an IDV3 parser) and with it, expand vertically your C/C++ knowledge (with Kernighan-Ritchie and Stroutrup books) and horizontally with Code Complete.

Focus on doing thing correctly, not just getting the stuff done (save that for your internship :-))

Ariel
+1 for Code Complete, I really need to re-read my copy!
Richard Ev
A: 

Just to put a completely different idea out there, how about building up your network? Are there local user groups that you could join and possibly find a mentor or two there that could help steer you in a sense? That'd be my suggestion as you never know when knowing someone or hearing something may lead to what you really want. If that seems too ambitious or outside what you want, then consider polishing up your resume and interview skills.

JB King
A: 

I think both of your own suggestions are pretty good. A technology different from what you know now like Python or jQuery would help you expand your technical knowledge and expose you to different ways of thinking. They would certainly also help round out a resume.

Even before learning a new language I'd suggest looking into design patterns. A book like Head First Design Patterns (in Java) should be easy for someone with your level of Java experience to use to gain knowledge about design patterns. I suggest you do that before doing a new language because learning most design patterns is something I didn't do until after graduating from college, and I then wished I had learned them sooner.

rosscj2533
+1  A: 

I'd recommend reading up about automated testing - specifically TDD (Test-Driven Development) and Unit Testing. From a tools perspective I'd recommend NUnit (for .NET-based automated testing) and JUnit (for Java-based automated testing).

Over the past few years I've found a whole new world of software engineering where developers are increasingly expected to write code and automated tests that prove the functionality of that code. Initially this can sound like a bit of a strange proposition, but I've found that it has fantastic benefits when done well.

I can update this entry with more links that I think you might find useful if you're interested in this topic.

Richard Ev
A: 

One skill that software engineers can lack is a good ability to communicate with their customer and understand their needs.

We don't live in a world where we get handed a perfect specification that tells us what to code, then we go off and code for three months and then hand a product over to our customer that does exactly what they need.

This is why the best software engineers always strive to have a grasp of what their customers business problems actually are, as opposed to just listening to how their customer expresses the solution that they think will solve their problems.

Take your example of a file renamer utility. If I were to tell you that I wanted a file renamer you could certainly go off and write one for me. However, you don't yet know why I want to rename files. Nor do you know how often I want to do this or how many files I want to rename. It might be that if you sat me down and asked me a few questions you might discover that you could better fulfil my requirements with something that doesn't even rename files! Or, maybe you might save yourself loads of time if you figure out that I want to rename 10,000 files every night from a Windows scheduled task. I don't need that fancy UI with an animated progress bar that you were going to create.

But.

I don't have a list of salient useful links to add in here. I guess that my general point is that there's a lot more to being a great software engineer than learning a bunch of languages. It takes years to become an expert in a language and new versions come out all the time. Being an expert in .NET 2.0 might have been great 2 years ago but now companies are asking for .NET 3.5 expertese. However, companies have been asking for good OO skills for at least a decade or more. They've also been asking for great comunication skills for aeons.

In summary: I'd recommend focussing on your soft skills, as well as the tech.

Richard Ev
A: 

Learn why you're best avoiding working for any company that claims to use Waterfall, and why Agile can help us build the software that really fits our customers' requirement.

Richard Ev