Saturday, March 31, 2007

Letter to a former student

Here's some advice I wrote to a former student who is headed into software development. Can anyone add to or improve my comments?

1) software development in general

The Mythical Man Month (overrated, in my view, but everyone in the industry has read it)

Joel Spolsky on Software (a successful entrepreneur who has a big following in the developer community; he has an extensive web site)

Paul Graham (a CS PhD who writes about software and startups; very opinionated; check out his web site)

2) algorithms

The standard text is Rivest et al., but for an informal introduction to some of the best stuff in CS try The Turing Omnibus. For security and crypto, try Applied Cryptography by Schneier. Knuth's books on the art of computer programming are probably mainly of academic interest, but you might enjoy a look.

3) general

Anyone in the working world should read How To Win Friends and Influence People by Dale Carnegie -- I swear by it. There is an outline of the whole book on my blog somewhere :-)

4) miscellaneous comments

Unix shell tools are amazingly powerful and will serve you time and again -- grep, piping, awk, sed, emacs, etc. Many Windows programmers are unfamiliar with these and are blown away by their power to do quick and dirty stuff.

The more you know the more effective you become -- experienced programmers think a lot before they code, and they tend to reuse existing code or libraries.

Don't forget to think like a physicist -- get to the heart of the problem before starting in any direction; make quick and dirty models and test them out; test your assumptions throughout the process by checking against the accumulating evidence. After you have a feel for the problem spend some time generalizing about or abstracting from what you've done.


Abyss said...

you mean Cormen et al

steve said...

Yes, it's Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Cliff Stein, (see ), but to me Rivest is the "big guy" in that group, so I always refer to him!

Anonymous said...

My own opinionated additions (OK, not everyone will agree with all of these):

If you plan on doing any Java development, learn how to use eclipse.

Use Perl often, but only for one liners.

When writing C on Linux, use GNU makefiles.

Learn XSLT (and dom and sax).

Program GUI stuff with XUL, or now even XAML.

tc said...

Debugging - hard to articulate what it is, but can help you save (or lose) a ton of time. There are a couple of books out there, but ultimately you have to do it a lot, and pay attention while you're doing it.

Blue said...

What sort of advice was the student looking for?

For me there are two primary joys to software. The first is the creation of something real in the world. The first time I created a successfully running program (a very! long time ago), I thought that this was the closest a man could come to knowing what it was like to give birth.

The second is the joy of abstraction. It's probably the same for physicists: the realization that there is an abstraction that incorporates a number of previously disparate elements as special cases. It's like climbing a mountain. At each level, one gets a better view of the terrain. But at each level one catches glimpses of yet higher peaks with better views.

Computer science has been called applied philosophy. It's the only discipline that has created languages that can both (a) represent ideas in one's head and (b) produce results in the physical world. Software is the externalization of thought in a symbolic and executable form. No other discipline can claim anything like that.

Anonymous said...

blue: software as 'the externalization of thought'? there are a lot of interesting thoughts that can't be implemented.

Anonymous said...

Following up on the mention of that famous book by Frederick Brooks, the former student should also see his essay No Silver Bullet.

David Kane said...

Also Eric Raymond's books, especially The Cathedral and the Bazaar and The Art of Unix Programming.

Blog Archive