Coding Practice
October 21, 2010 2:34 PM   Subscribe

Programming Filter: I'm applying for software jobs, but I don't want to forget what I know. How should I practice to keep my skills sharp?

I got my BS in CS, but I don't have much real-life experience. I want to be able to answer interview questions off the top of my head, not after thinking for a minute. Since I'm not programming all the time anymore, I'm starting to forget things—I need a project to work on so I can keep programming fresh in my mind. It wouldn't hurt if I could learn something new while I'm at it.

The languages I know best are C/C++, Java, and Python, but I doubt the language matters all that much. I also don't think learning a new language (like C#) would be worthwhile, but learning new language-independent topics might be a good idea. (For example, I'm totally ignorant of databases/SQL and anything web-related; obviously those are big topics!) I could be wrong about all this, so let me know if I am.

Here are some options I already thought of, but that seem unsatisfying:
  1. Project Euler, 99 Lisp Problems, etc. Solving these little arithmetic puzzles is very different from making structurally complex software of the kind that I'd be working on in real life.
  2. Learn a new computer science subject by reading a textbook and doing all the problems that involve programming. Though I would enjoy learning new stuff, this seems like too much theory and too little actual code-writing.
  3. Find an open-source project and start contributing. It seems overwhelming to just download some huge codebase and get to work without any guidance; I have no idea where to start. (Is there a way to make this easier?)
  4. Write a web server or a raytracer, as suggested in this old thread. A web server might be good, but I don't know how a web server works or anything about networking/HTTP. Should I learn all that?
Any other ideas? Or do you think any of the above are actually good ones? Thanks!
posted by Chicken Boolean to Computers & Internet (22 answers total) 28 users marked this as a favorite
Definitely yes to learning about databases.
posted by RobotHero at 2:55 PM on October 21, 2010 [2 favorites]

The canonical answer is to do open-source. However, people don't typically start work on someone else's codebase because, as you say, you need to comprehend a huge codebase that may or may not be any good - code quality can be pretty independent of how popular a product is.

The usual approach is to think of a program that either you want to use and doesn't exist or the functioning of which interests you, write it and maybe release it.

Writing a webserver and/or raytracer is fun but IMHO you should only do that if those programs interest you. If not, pick something else. However, those two exampls are particularly good things to learn on because they span anywhere from a minimal implementation (an experienced coder might be done in a few hours) to a monstrosity with more functionality than you can poke a stick at (Apache and POVRAY), so it's a problem for all skill-levels and as you learn more, you'll start to see places where your implementation should be improved.

Obviously once you start your design and implementation process, yes, you will need to do some research on protocols, standards, best-practice algorithms and all that stuff - it doesn't matter what you work on, that is always necessary.

Yes, definitely learn about relational databases and networking. They are both very important technologies and you're likely to be expected to know how they work and work with them in a majority of programming jobs.
posted by polyglot at 3:03 PM on October 21, 2010 [1 favorite]

Writing freeware is one way. It involves you in the complete software development life-cycle from concept through implementation to documentation and support. Unlike jumping into an existing open-source project, this is your code, your design, your experience building. It can be in any area that interests you. Bonus if there's no existing freeware application, or the existing ones suck and/or are no longer maintained. It looks good on a resume, that you code, and learn new programming-related things in your spare time.

nth'ing learning about SQL-based databases. Various ways to go about that, but it's a different topic.
posted by hungrysquirrels at 3:05 PM on October 21, 2010

The usual approach is to think of a program that either you want to use and doesn't exist or the functioning of which interests you, write it and maybe release it.

This, really. Look around your life - have you got a huge collection of movies? Books? Anything that could be better organized? Write something to do it. Do you like changing the background image on your computer, but want something that will do it by your rating of the image and vary the amount of time it spends on screen based on time of day and the dominant color in the image? Do it. If not for yourself, for a friend or family member - ask about problem domains and just leap in. Mr. Mirror is currently working on a flexible timeline program for me that will allow me to define my own calendars and put events in with "fuzzy" dates in relation to other things - for my efforts in documenting a fictional history in a fictional universe. He claims this is hella challenging, but me, I just want what I want. Once you're writing something for yourself or someone else you don't want to disappoint, you'll find yourself really engaged, and looking for ways to make it spiffier. You'll also be working to specifications, and hashing out a design process for yourself. Good stuff.
posted by lriG rorriM at 3:08 PM on October 21, 2010 [2 favorites]

For me, its all about actually using my programming skills (or the ones I don't have yet) to do something I actually want. Some stupid crap I've done in the past:

- Play with Phidgets. I hooked one some of this crap up to my doorbell one year, which went to the computer, which then played an mp3 to some speakers behind the door such that when the kiddo's rang the doorbell it made *loud* spooky noises. They get scared, I learned about all sorts of crap.

- Scrape satellite images from websites and make big composites of stuff you find interesting. I made an animated gif of 1 year of pacific storms at an hourly rate. Leared all sorts of crap.

- Being a python guy (and a general believer that algorithm and implementation is usually more important than language) I think python is being under-represented in some of the tests here.

- Play around with writing an iPhone/droid app.

Screw the lisp and all that. If your interviewer asks you that stuff they are most likely jackasses anyways. On the other hand if you pull out your iphone in the interview and feed your fish remotely with the mindstorm robotic arm connected to your machine, it will be impossible for them to feel your enthusiasm.
posted by H. Roark at 3:10 PM on October 21, 2010

In terms of working on structurally complex software, what do you know about UML and design patterns?

The larger open-source projects sometimes have modules or extensions, and some documentation on how to create them. That should be less overwhelming than trying to contribute to the core code, but will also teach you something about how structurally complex software can be broken into smaller chunks.
posted by RobotHero at 3:13 PM on October 21, 2010

Response by poster: As for databases: a while ago, I did learn the basic SQL commands and wrote a small program to create and manipulate a database table. But I had no idea what to do after that. What could I write that involves a database? I know lots of programs use a database, but I really can't think of anything that would be interesting, non-trivial, and not too big.

RobotHero: UML and design patterns are tools, and I'm mainly looking for projects. I don't plan to use either of them except if I'm solving a problem that really needs them. I did draw some UML diagrams but was never taught design patterns; my professors seemed to think they were a bit silly.

I don't own an iPhone (yeah, I know, unbelievable!) and I don't know Objective C, but I do have a Mac. Would it really be worthwhile to write an iPhone app if I don't want to get a job writing iPhone apps?
posted by Chicken Boolean at 3:35 PM on October 21, 2010

What could I write that involves a database?

Picture the database behind metafilter: posts, comments, users. Write a simplistic version of that.
posted by DarkForest at 4:15 PM on October 21, 2010

I'd say definitely do an Android app. You should be able to get a fully-functional project out on the market and up on github in a couple of months of evenings/weekends. Plus you already know Java. You'll just have learn the API and some of the idiosyncrasies.
posted by i_am_a_Jedi at 4:21 PM on October 21, 2010

"Software jobs" covers a lot. There are jobs in which your mastery of a specific programming concept is important (ie: writing or optimizing a specific algorithm), and those which are more holistic (ie: help design, develop, test, and support an entire product). Sometimes the former is referred to as programming, the latter as software engineering.

If you want experience for the latter, it's important that you come up with a project - no matter how small or redundant - and complete it. Anyone can "work on something", it is much more impressive to have completed something. And it hopefully isn't something that has only academic value, ie: writing your own web server.

How about plugins/widgets for an established platform, ie: Firefox?
posted by meowzilla at 4:51 PM on October 21, 2010 [1 favorite]

Doing some coding from any of your ideas or the suggestions above is not a bad idea. But, it tends to be microfocused on particular topics. On thing you could look for are user groups or meetups where you'll be around folks *talking* about programming. To get through an interview you don't actually need to code (well sometimes a sample) but you do need to talk the talk.
posted by sammyo at 5:30 PM on October 21, 2010

GalaxQL teaches practical knowledge of SQL in 2-4 hours, using relatively interesting problems. I don't think that's the kind of thing that keeps your fundamental skills sharp, though. I can think of impractical questions that would, though, e.g. writing a program that answers whether an arbitrary graph is 3-colorable using SQL.

So what I actually recommend is just taking some math or CS textbook and writing a library in your language of choice for solving the problems it sets for humans. Use design patterns and clever data structures appropriately, optimize for efficiency, etc.
posted by Monsieur Caution at 5:32 PM on October 21, 2010

What could I write that...

Well, that's a question with infinite answers! One database I recently built was a tags-engine that binds tags with filenames (well, strings) that allows me to tag all my photos without relying on a proprietary photo archiving program - something like that is very small and achievable (3 tables and a couple days coding to deal with the annoying edge cases) but will teach you a lot about SQL. Reminds me I need to chuck it onto sourceforge soon.

Websites are very often database-backed - think content management systems, etc, as per DarkForest's post. Other DB starter projects that people often do include address-books, media libraries, etc.

If we're to make suggestions though of things you might be interested in working on, we need to know what your interests are. Do you like mathematics - pure or applied? Graphics? Photography? Sound? Games? Emergent behaviour of complex systems? Home automation? Robotics? Artificial intelligence/life?

You want to pick a project that is something you see as cool, whether it exists or not. It should contain things you don't know how to do, but that you know you could learn to do with a bit of effort, i.e a known-soluble problem.

The usual estimate that people spout off is "10,000 hours of directed and productive work in a field to master it". That means if you're just doing stuff as a dayjob, you're not truly useful until about 5-7 years into your employment (sorry!). If you're someone who works on pet projects at home, you'll have your 10k hours and be getting job offers before you graduate.

(...ecalp lufrednow a tenretni eht tn'si ;taht od nac ohw esle enoyna tem reve ev'I erus ton m'I ?sdrawkcab klat nac uoy :lriG rorriM)
posted by polyglot at 6:05 PM on October 21, 2010

"Software jobs" covers a lot. There are jobs in which your mastery of a specific programming concept is important (ie: writing or optimizing a specific algorithm), and those which are more holistic (ie: help design, develop, test, and support an entire product).

Yeah, I want to know what kind of jobs you are interested in? I've been a web developer for more than a decade now and I can tell you that it's a really different ball game than being a game developer. Hell, even within game development there are roles which are really really different, from what I understand. And then there's developing kernel modules. And then there's writing client software for electrical engineering.

I mean, really, what do you want to do? That is your answer. Why do you love programming? Just pick something and make it. If you like it that's great 'cause that means you'll be better at it. The reality I found when I started being a web developer is that because I was super psyched about Linux and Apache I was way better at my job than those CS guys (um, I studied music performance) who just got some random web job when they got out of school. Point being, I spent a lot of time on installing Linux and setting up Apache and writing Perl scripts on my own so my utility was high, even though my CS knowledge was sketchy at the time (honestly, it still could be really improved, but also to be honest I don't think I'll be making it through Knuth anytime soon...).

If you spend the time learning something you LOVE, you'll have an advantage over the likes of me, and the likes of those "just studied CS" bozos because you'll be the full package. BUT, I will always argue that a sincere love of programming will win out over "merely a degree." It doesn't matter what you do; just make sure you enjoy it.

Also, read this if you haven't yet.

Oh, and if you really want to learn something specific, then learn how to write good tests, for fuck's sake.
posted by dubitable at 6:49 PM on October 21, 2010

Screw the lisp and all that. If your interviewer asks you that stuff they are most likely jackasses anyways.

Paul Graham may disagree.
posted by dubitable at 6:52 PM on October 21, 2010

Response by poster: Thanks for your comments, everyone.

meowzilla explains the reason why I'd rather make a complete, useful program (no matter how small) than just implement some algorithm or solve a math problem. A browser extension sounds like a great idea (and I just did the Chrome extension tutorial), but it seems that I'd have to learn JavaScript first.

So far, I like:
1. A minimal web server, to learn about networking (is there something good to read about this?)
2. Something with a database—actually, I'm (slowly) trying to learn Chinese, so maybe I could use a quiz program with spaced repetition (though several already exist)

polyglot: I do like graphics, but I'm not a photographer. I remember a little OpenGL. H. Roark reminds me that I really like satellite images. Emergent behavior is cool, but I don't know anything about it. I'm ruling out anything that requires extra hardware (like robots).

Perhaps my favorite open source project (at least that I've used) is the amazing GraphViz.

dubitable: I AM one of those "just studied CS" bozos! I enjoy programming, but I don't love the nuts 'n' bolts of computers. I am more likely to read The Art of Computer Programming (which I won't anytime soon!) than install Apache just for fun.

While we're derailing, I enjoyed Maciej Cegłowski's article on Paul Graham. And I think Lisp is great.
posted by Chicken Boolean at 7:28 PM on October 21, 2010

I want to be able to answer interview questions off the top of my head, not after thinking for a minute.

Generally speaking, not gonna happen. Good interviewers ask questions they WANT you to think about, and speed of response is very rarely a factor in whether they like you or not. I am much much much more interested in a candidate that can figure out the right answer than one that has the right answer memorized.

Other than that... sometimes, coding is like going to the gym. Whatever will get you in the door to move the muscles is what you should do.
posted by ch1x0r at 8:25 PM on October 21, 2010

Web servers aren't as hard as you're making it out to be. You can literally telnet into a web server. If you don't know much about networking, start from socket programming and work your way up to responding to GET requests.

As far as DBs go, learn your SQL queries sure. But the greater challenge is decent DB design. Relational databases don't always have an obvious mapping to the real world, leading to some tricks that aren't obvious. Still, many trivial applications won't require you to think about that, which is both a plus and minus if you want employment. If you want a challenge, I'd recommend you think about making a nested mefi comment database. I'm told it's doably efficient in postgreSQL but I haven't taken the time to make sure.

An alternative I've seen is a set of routines to practice. Especially since there's more than one way to do most things, it's useful to revisit old ground with new techniques.
posted by pwnguin at 8:36 PM on October 21, 2010

Response by poster: If you want a challenge, I'd recommend you think about making a nested mefi comment database.

pwnguin: sorry if this is a dumb question, but what's nested in a database of comments? Presumably you don't mean each comment has comments of its own (as if it were a thread).
posted by Chicken Boolean at 10:30 AM on October 22, 2010

A few ideas to add to what everyone's said already...

- Look into mashups and small apps you can make using the APIs of sites that interest you. Programmable Web has quite a lot of info which might spark some ideas.

- Looking there this caught my eye: Apps for Development, a contest from the World Bank with various prizes up to $15,000.

- In the same vein as Firefox extensions, consider writing Wordpress plug-ins or Facebook apps. The way to think them up is similar what people have said before, ask yourself what you'd find useful that isn't already there.

Btw, if your main aim is to keep yourself sharp, it's not such a big deal if you are building your own version of something that already exists rather than something really new. But you'll have more fun and be more motivated if it's something you want for yourself and can't find ready built.
posted by philipy at 12:00 PM on October 22, 2010

Chicken Boolean: "Presumably you don't mean each comment has comments of its own (as if it were a thread)."

I do mean exactly this. Obviously this isnt mefi as it is, but mefi as it ought to be.
posted by pwnguin at 8:17 PM on October 22, 2010

Coming in late on this thread.

It's good to keep your CS knowledge sharp, but if you are serious about becoming a professional software developer you're going to want to educate yourself about software development, that is, the practical activity of software design and construction. The stuff you learn in CS is important and will stick with you through your career, but usually CS curriculums only scratch the surface in terms of skills needed to actually work as a professional. Having practical skills is going to separate you from other prospective candidates when you are interviewing.

The book The Pragmatic Programmer is a great first book to read on this topic.

Learning web technologies and SQL are really useful practical skills, even if you wind up working in an area that has nothing to do with these (like embedded systems, for example). Also, Javascript is pretty much essential for web development, so it would be worth learning.
posted by kenliu at 6:43 PM on January 19, 2011

« Older What would a dog actually mean for me?   |   what to do during vacation Newer »
This thread is closed to new comments.