, , ,

I have the pleasure of being a part of Sandia National Laboratories (SNL) College Cyber Defenders (CCD) program.  I have been conducting some of the phone interviews for next summer’s program already.  During the interview, I give each prospective student a chance to ask me any question they want.  “This is your phone interview”, I tell them.

Lately, in addition to the usual questions you would expect, several have asked: “What should a CS student know to be successful at Sandia?”  This is a good question to ask — and not just for the labs but for any research position or job in academia, government, and private industry.

I began wondering: “is my advice too narrow?  I know what is useful in my current research interests and duties, but what about generally?”  What is a good core set of skills that a graduating, eager CS degreed individual entering the work force can build upon in order to have an awesome career before real life crushes their aspirations like an empty beer can?

Using my favorite research tool, I began googling to see what others felt about the subject.  Naturally, everyone has their two cents: what computer science concepts should I know?  However, I stumbled upon this from Joel Spolsky.  Here is another from an academic.  The latter’s list is pretty long; I would focus on the top of the list; the further down, the more specialized the skills become.  Besides, trying to master all of them may take you longer than you have life left.

the lyf so short, the craft so long to lerne.

Chaucer (1340-1400)

Spolsky’s advice is more succinct and do-able.  Learning to write is a great skill for CS and non-CS alike.  If you can not describe, in a page or paragraph, to a reasonably thinking human being what your program is supposed to do, then how do you possibly hope to tell a machine how to do it?  In fact, you don’t need to learn a programming language to learn how to program.  English will work just nicely.  Let another human being be the “compiler/interpreter” and see if they perform the task(s) you described.  If they seg-fault and core dump, they can explain in plain English your error far better than some of the cryptic compiler errors you will encounter.

I would add one more skill to the list: don’t blow off discrete mathematics because its hard.  Discrete math is often called, “math for computer scientists.” for a reason. Time and again you will use the core concepts, combining them, building upon them to design algorithms to solve some of today’s most challenging and interesting problems.  If you want to get in on the Big Data craze everyone is raving about, you will need discrete math.

Of course, dispensing advice is easy so I am going to put my money where my mouth is.  Here’s my story: two years ago, I was at a cross-roads in my career.  I was looking for ways to improve my technical skills.  I thought long and about it.  My time is limited and I am a pretty lazy.  I can’t improve every skill at once, but if I could improve one technical skill that would have the most positive impact in my CS career, what would that be?  I chose to re-study discrete mathematics and I am glad I did.

By the way, if your discrete math (DM) class is not using this text, run — don’t walk — run to your nearest book store and get yourself a copy.  Its worth the heady sticker price and it is pretty verbose, but verboseness is good in this case.  The author does an excellent job of explaining the concepts and not pulling any of that “proof is up to the reader” crap so many other DM texts employ.  I used this text in the course of my personal re-study.  It took me about 9 months to get through it cover-to-cover and it was the best thing I ever did for myself.  The text has plenty of exercises; do them and you will walk away understanding the concepts.

I don’t know what’s the matter with people: they don’t learn by understanding, they learn by some other way — by rote or something. Their knowledge is so fragile!

Richard P Feynman (1918 – 1988)

The most profound lesson I discovered is that DM is learning how to communicate in the language of mathematics.  It is a lot like English composition, except the syntax and statements involve logic and mathematical thought, you learn how to write by writing essays.  Lots of essays.  In DM you write proofs.  Lots of proofs.  I found that doing proofs was similar to writing programs — especially inductive proofs.  It is not a coincidence that programming languages are modeled after mathematical statements, structures, and objects.  I know my study of DM has made me a better software developer.

So study your discrete mathematics, kids, and who knows what you will be able accomplish.  Check out what some supposed CS  people did with their discrete math knowledge below.  I leave the proof up to you, my dear reader 😉