Resources about different Computer Science fields
I am going to begin my final year at university this September so I need to do a project for my dissertation. I had a look at the list with the projects suggested by the uni last year and I don't find any of them THAT interesting. That, combined to my "love" for "theoretical" computer science as a whole got me into thinking that it would be nice to spend the last month of my summer holidays researching some of the cs fields in more depth. So far at university, regarding the more "theoretical" side of computer science we have mainly looked at searching and sorting algorithms, string matching, game theory, design patterns for software engineering and maze solving algorithms. Next year the syllabus includes bioinformatics, compilers and machine learning. I have an idea about all of these but nothing incredibly detailed (ie, we didn't do algorithms design at all). So, I was thinking, instead of either picking a project from the list or picking a project that a hobbyist could do as well, why not study about a few fields of computer science and brain开发者_运维技巧storm in the process?
I would really appreciate it if you could point me to available resources (books, ebooks, pdfs, online communities, etc) about the fields below, or even suggest new fields to be explored.
Note that I only want to understand what they are about, not mess with technical issues, yet.
The fields:
Web Semantics
Algorithms (analysis, design, etc)
Machine Learning
Evolutionary Computation
Game Theory
Other (???)
http://ocw.mit.edu is an incredibly good resource for all things academic, especially computer science related. They have tons of cool lecture notes, links to readings, book suggestions, videos, and problem sets on most every comp sci and scientific topic. It's basically MIT's syllabi and coursework all posted on a website available to the public. Also, MIT's focus in it's CS classes is pretty theoretical, so that's a plus.
As an added bonus, "open coursework" comes from the open source philosophy.
I'd also like to add a suggestion to the existing list of topics: cryptography.
This doesn't quite answer your question, but here are my two cents:
The ideal topic would be one you have:
- Interest in.
- An opinion about.
- Already know a little bit about, but haven't had the time to explore in more depth.
For example, suppose you believe that:
Writing programs that parse, manipulate, and encode data in custom human-editable text formats is hard. I believe it can and should be much easier.
It doesn't necessarily mean that the tools for working with text formats don't exist. Maybe you just haven't noticed them, or they aren't compatible with the programming language you know, or you didn't like using them. But, maybe there is a great tool out there for working with text formats.
While looking around, you keep seeing Haskell and Parsec over and over again. You give in to the hype and learn Haskell, and it turns out to be really cool. Then you start learning Parsec, and find it's pretty decent. Your project could be a presentation introducing your colleagues to Parsec, complete with a case study demonstrating a domain-specific language in a "real-world" setting. Here, you didn't really invent anything, but you introduced something wonderful to yourself and your colleagues, and you did it in a way that makes sense to them.
Then again, suppose Parsec just doesn't cut it. Maybe you can't find anything at all to simplify working with custom text formats (maybe everything's just too darn complicated for something that should be so simple). In this case, you might want to develop a framework that simplifies your task. Don't start on it right away, but do some research. Look at other systems, look at the approach they took, and come up with some good reasons why they fall short. Learn a new programming language or API that may bring you closer to your goal. Maybe even read some papers pertaining to your topic. Your project would then build on a lot of existing work, but would help fix the issues you saw.
In summary, the ideal topic would be one you're already interested in to an extent. I believe it's good to approach computer science with an opinion about how things should be, yet at the same time be open to existing ideas.
A key skill in Computer Science is to write code. But to become a great coder, one first has to learn to read code. (Hemingway first learned to read before mastered his writing). Grasping code quickly is one of the crucial skills in CS. I wrote a small web page that is about code understanding by solving code puzzles in the user difficulty level: Finxter. As a side effect, you learn about the most important algorithms and algorithmic techniques: QuickSort, MergeSort, Scheduling, computational complexity, etc.
For Machine Learning: Andrew Ng (Stanford Prof.) has his machine learning course online.
You can find it in iTunes U and YouTube.
精彩评论