<p>There are a few old time classics you might start with:
Algorithms + Data Structures = Programs by Wirth
Mythical Man-Month by Brooks
C Programming Language by Kernigham
Unix Programming Environment by Kernigham & Pike
Art of Computer Programming/Seminumerical Algorithms by Knuth
some people (not me particularly) like Soul of a New Machine by Kidder
Other O’Reilly animal or nutshell books.
I’m sure others can suggest generic classics. It is kind of like business books, every year there’s a new shelf full on this or that methodology.
Others can also suggest good language books for Python or Java or whatever others are in fashion now (Ruby, Perl, C++, C#, VB…?).</p>
<p>Better yet, just take the summer off and read something interesting like Flatland or Robinson Crusoe or Don Quixote or something by Martin Gardner or Douglas R. Hofstadter or Douglas Adams…</p>
<p>I would find a good, fairly basic, online textbook for discrete mathematics, and give it a good looking over. Let me see if I can dig anything up…</p>
<p>Lol wow. I personally would just enjoy my last summer…;).</p>
<p>But -</p>
<p>Otherwise C++ & C programming books will always be useful (especially since you’re early classes prolly will be with these languages :-P.)</p>
<p>Java is something nice to know. I dont know how useful algorithm and discrete books will be this summer since you probably won’t have those classes for at least another year, but if you just want to read stuff for the sake of it I guess those books wouldn’t be a “bad” thing to read ;).</p>
<p>Though above all try to get some relax with most likely your last summer to not be doing work :-P</p>
<p>I agree with the whole taking it sort of easy thing. Relax, you’ve done well and you have a lot of work ahead of you. Enjoy your free time now!</p>
<p>And yes, it may not be a bad idea to gain a passing familiarity with C++. Ideally, you should at least know how to write a brand new program, from scratch, in a plain text editor or IDE, compile it, execute it, and to develop some basic debugging skills (some IDEs have built-in debuggers, whereas in other systems it is more convenient to write to the console or output files).</p>
<p>The programming thing will be more immediately beneficial. However, it wouldn’t take more than a day to read over the short overview of discrete math, and it would only take a week of casual glancing over to get a nice introduction to some of the math you’ll be doing. The reason I suggest starting with a touch of math is that this is usually what CS majors have the most trouble with… once you pick up a programming language, it’s usually not so bad to run with it.</p>
<p>The only other thing I can think of to look over would be a casual introduction to software engineering. Let me see…</p>
<p>^If you explore the above links you’ll see some of the latest thinking on methodologies, design, and diagramming. Such terms as waterfall, spirals, UML, etc. Nothing bad. If it works for you and helps you conceptualize things fine. I’m sure there are many if not most professionals who will insist those are the only way to develop any software. But if you say that they are relatively obvious and straightforward and not too much different from previous techniques going back to flow charts and Warnier/Orr diagrams and RUP (Rational Unified Process), Agile, RAD (Rapid Application Development), JAD (Joint Application Development), XP (Extreme Programming), or any other buzz words, acronyms, and terminology in the last fifty years, I would not strongly disagree. I don’t think it has ever been proven that any particular language, development framework or methodology is the best or most productive or least error prone, etc. Which I think proves that software development is as much an art form as anything else in spite of endless repeated attempts to mechanize it.</p>
<p>Mainly you need to be able to break a problem down into pieces. Learn to turn puzzles inside out or think of them in different ways to find solutions. Like playing with a Rubic’s cube. Learn to think abstractly, logically, and analytically. Anything that will help you develop your mind is a good thing. But remember Occam’s Razor and keep things as simple as possible. Needless complexity is not efficient.</p>
<p>More reading suggestions: any of Neal Stephenson’s fiction, Stoll’s The Cukoo’s Egg, iWoz by Wozniak. Data Structures and Algorithms by Aho/Hopcroft/Ulman. For some historical perspective: Programming Languages by Jean Sammet. Don’t buy any of these unless you get them used for cheap. Most should be available at the local library. Browse through back issues of the ACM publications or IEEE Computer Society journals.</p>