Advice for Fall 2011 CS Graduates

It’s been a long time since I’ve posted an update.  I’ve worked at my job, Cleversafe, for almost three months.  In that time frame I’ve learned a ton, some things I wish I would have known going in.  So, as a recent graduate that was lucky enough to find work in this terrible economy, here’s a short list of things that might help you find a job and start the path to becoming a valuable member of the your team.

  • Learn and use version control software.  Haven’t heard of this before?  I recommend learning git by playing with GitHub – it’s free and has a fairly large and welcoming community.  GitHub requires you to have your source exposed unless you pay for the service, so if you’re not comfortable with that or plan on using this for homework (do this), try Kiln, a Mercurial version control software brought to you by FogCreek Software.  Either is sufficient and will help you learn the joy of distributed version control systems.  Learn the lingo associated with it.  Learn to use it on the command line with ease.  Make mistakes and then take the time to fix them using the VCS tools instead of just copy-and-pasting code and starting over (trust me, this will an attractive option once you encounter your first really ugly merge or commit the wrong code).  As a side-benefit, having an active GitHub repository can be an awesome addition to a résumé as potential employers can easily see your passion for development.
  • Learn Linux.  This applies to people who don’t intend on going into a Windows-based development environment (you’ve probably already decided since you use C# or develop exclusively in .NET environments.  Learning Linux will make your life so much easier if you’re developing in a Linux or even OS X based environment.  Knowing how to use tools like awk, sed, and grep are so invaluable they will pay for the investment in time learning them thousands of times over within your first months of actively using them.  Never scroll through a log file again looking for something because you know grep.  The same goes with editors in Linux.  Learn vi(m) and Emacs.  Love one, learn both.  You don’t need to be both a vim guru and an Emacs god, but knowing when to use the right tool at the right time is so important it’s not even funny.  There’s literally no excuse to not be able to sit down at a bash terminal and not be able to edit a file because your favorite editor isn’t installed or you can’t use the mouse.  The easiest way to learn to use Linux is to install it.  Do you have a good reason for having Windows installed on your computer?  Could everything you do on a regular basis be accomplished in Linux with or without the use of a Virtual Machine (the only reason I still have Windows on my desktop is for PC Games)?  Install your favorite variant of Linux and start using it.  Solve your problems as you encounter them.  Try different distros.  Trust me on this one, learning Linux again made my life a lot easier.
  • Learn to use the major IDE of your language.  Do you program in Java?  You better know Eclipse.  This is something even I’m still working with.  Before I was employed, all of my projects were small, I could easily handle them by using text editor like TextMate.  I would execute off the command line.  My form of debugging was reading stack traces and inserting status messages into my code (at least in Java).  Now that I’m working on a project that is thousands of Java files and has a list of dependencies a mile long, I need these tools.  I don’t understand all of our code base (it would be unreasonable to think that someone could understand it all in under three months), but since I use an IDE, I can work within it.  Just a few days ago, another developer showed me some tricks with Eclipse’s debugger that helped me solve some problems I was having in a fraction of the time it would have taken me before.  Using a tool like Eclipse with a bunch of other tools like Emma and Maven makes it easy to keep your project running without a lot of hassle.  IDEs are also good for your health.  Since you made a choice to become a software developer, you should understand the risk of RSI is pretty much 100%.  IDEs offer a lot of keystroke saving tools that might help postpone or avoid your inevitable carpal tunnel surgery.
  • Learn unit testing.  Practice it in every piece of software you write that is anything more than a quick script.  Anything that you would submit as homework or submit for production deserves a unit test.  You will catch errors you didn’t even think of when writing the tests and avoid errors when modifying the code in the future.  When and how to write tests is a highly debated topic and you should read into it.  I really wish this was taught to you in school.  Writing tests has changed they way I program and has made my code so much better than it was before I tested, I’m almost ashamed of anything I released or submitted prior to testing my code.  If you aren’t testing now, start.  Go grab JUnit (or whatever major framework is used for your language of choice) and write some basic tests.  Run them often.  Run them every time you make a some code changes.  You’ll feel the same way I do, and I’m still learning how to do it better.
  • Don’t stop learning after you graduate.  I made it my personal goal to not stop learning.  If the thought of graduation means “no more homework” to you, you’re in for a world of pain.  This time the professor is you, and the due dates are the most dangerous kind, the ones you set.  Try to learn new programming languages and paradigms.  Have you only coded in an object-oriented manner?  Try learning a functional or procedural language.  Read books to learn, but don’t avoid books for pleasure.  Read one of each at the same time (I recently finished the A Song of Ice and Fire series while reading a few Pragmatic Programmer books).  Go to meetings, meet-ups, and hang out with other nerds (ChiPy deserves a shout-out here).  Have personal projects.  Have hobbies outside of programming (I enjoy cooking).  Do whatever it takes to keep your mind active, as boredom will quickly lead to depression.
  • Once you start working, evaluate your situation.  This might be the most important advice I can give.  If you’re unhappy with your job after three months, leave.  If you don’t find yourself thinking about the project you’re currently working on outside of work, get a new project.  If you don’t completely enjoy what you are doing within the first three months of doing it, find something else.  Change things up.  Find what you want to do and do it.  I got lucky.  I found a place where the product is extremely interesting and the team of people I work with are extremely intelligent.  I learn something new every day.  When I go home at night, I find myself thinking about work in a positive manner.  I don’t come home and complain about work.  When I wake up in the morning, I’m eager to get into work.  I think that’s a good sign that I’ve found the right place and right career path.

Finally Finished

Last week I finished my “last” semester of college. The last is in quotes because I still have to take a class during the first summer session. This semester was one of the most rewarding in my entire college career. The majority of this semester has been focused on my Parallel and Distributed Computing class, which was split between seniors and graduate students. 80% of the final grade was based on the project, somewhat of a free-range inquiry into the fundamentals of parallel computing and the differences between parallel application paradigms. We, as a class, were given opportunity to choose individual projects to study parallel computing over a period of 10 to 12 weeks.

My project was a survey of the 0-1 Knapsack problem and the performance gains that can be had by applying parallel programming techniques. Initially, I intended on exploring a solution using OpenMPI, C, and a distributed memory paradigm. After a bit of trouble and testing, I realized that it would be hard to see any big gain in performance, as the network latency of a 10/100 Ethernet network would likely skew any results. I resolved to try out different shared memory solutions using a single machine, as the multicore processor in my laptop could emulate the environment of a much higher performance computing system and would likely give the same result pattern that I would have on a better machine. My project ended up being a successful comparison of performance between a serial algorithm in C++, and two similar solutions using OpenMP and Unified Parallel C. If you’re more interested, a PDF of my report is available here.

During this first summer session I am taking Biology 101, as I was 4 science credits short of graduating in May. I’ll receive my diploma by mail in August, as I will hopefully already be moved into the new apartment that Kate and I found in July. I’m glad to be done with school and am eagerly looking forward to the future.

Updates!

It’s been awhile since I’ve posted. I’ve started my last semester at university, which is exciting but lots of work. I’m currently taking ~20 hours of classes in preparation to graduate, along with 1 summer class scheduled. I’ve put in all of my paperwork to graduate and although I won’t get my diploma in May, I’ll be able to walk for graduation, which should be nice for my family and friends that have been supportive through the entire thing. Most of my classes are not CS related this semester (I’m even taking golf), as I needed a bunch of electives. I’m very excited for my last CS class, as it is Parallel and Distributed Computing, B424 for those of you in the IU system. We’re working with MPI and C to do some introductory cluster and grid computing work. The class is cross-listed with graduate courses, so it is very project oriented, with nearly 80% of our grade riding on the project. This is both exciting and challenging and I feel like the majority of my work will (and has been) my focus for the semester. Hopefully I’ll be able to create something that is an interesting and useful first project with MPI.

This semester I’m also taking a refresher in data structures, as I missed a 3rd year data structures course for my major, but took two elective courses that are more advanced and covered the same topics for my cognate. This will be a useful refresher for C / C++ syntax, although that’s not what I’m focusing on as a career choice. I’ve been applying to jobs in Chicago, as I intend to move in with my girlfriend Kate after my summer semester. I’ve been applying for software development positions, but I’ll probably end up applying for some systems administration work as well since I’ve got prior work experience in that area.

As for stuff outside school, I’ve been playing Eve Online still, and have been promoted to Military Director of my alliance (Test Alliance Please Ignore). We’re the second largest alliance in game, just over 5000 members. We just finished taking over a hostile region for a new home, which was fun and exciting. I won’t ramble about Eve more, as it’s very interesting and totally a game for geeks like me. If you’re interested in finding out more you can try searching Google or sending me an email and I’m sure I can try my best to convince you that its totally fun and interesting. I’ve been working on learning Python on the side, and reading a lot of new books, lots of indoor activities while I wait for the outdoors to defrost. I can’t wait to get out and not have to wear 5 layers of coats and winter accessories.

The Microsoft Kinect as a Project Platform

This semester I took IU South Bend’s C490 Embedded and Real Time Systems, a senior level primer into embedded systems programming, real time systems, and a bit about control logic.  As a part of the class, we worked on the Handyboard robot, an educational robotics system developed by MIT that is based on the Motorola 68HC11 processor.  We’ve utilized several different sensor types, some are Lego based, others are hacked together electronics (old Poloroid sonar sensors).  As someone who will be finished with the class in less than a week (everything is done, just waiting for the final robot competition), I would love to see this course offered again for future students.

And I’d like to see the Kinect used as a sensor platform.  IU South Bend should invest in several Kinects for its professors to play with, to develop a curriculum involving all aspects of Kinect systems – from data sonification with the sonar sensors, to using the 3-D camera for visualization technology.  The Kinect as a platform offers intrepid hackers a chance to create new and interesting interfaces, robots, and sensors using the Kinect hardware.  Browsing through sites such as KinectHacks.net shows how hackable this platform is and how many interesting ideas it can create.

Ransomware and You

Ransomware – a new bonus to modern adware and viruses, is quite a harrowing concept to average users. It’s almost like something out of a Hollywood movie. Imagine this, somehow your computer becomes infected and the next time you restart it doesn’t go as planned. No windows logo, just ominous white text on a black background.  The text reads that all of your data has been held hostage.  You begin to slowly panic because you, like the average computer user, don’t back up your data.

One new variant of this style of virus has been found in the wild, packaged in with a Vundo infection.  The Fortinet Security blog explains the bloody details of the virus and reassuringly enough, the virus doesn’t do exactly as it claims to and encrypt all of your data, instead if rewrites the MBR, which is much less devastating.