Tags: | Posted by Admin on 12/11/2008 9:44 AM | Comments (0)
First we get into the requirements which basically state a class on algorithms CS610 and 3 out of the 4 classes (CS 631, CS656, CS650, CS630). I will take all 5 classes because I think there is value to all 4 of the classes that I have to pick 3 out of 4. And below are my reasons for all the requirements CS610 - Algorithm Design: A vitally important class for several reasons. The PhD qualifying exam includes a section on algorithms from this class. Should I go for a PhD my way of reviewing this material will be to take the advanced algorithm course that builds on the material learned here. Basically this is what my undergraduate Advanced Algorithm Design class (432) should have been, but I got the watered down version. Using the skills in this class you can better design and analyze algorithms. It is also key to understanding a lot of the notation in the computer science literature. And learning mathematical tips to solving recurrence relations/etc... So this class is vitally important!!!! Also a lot of other classes have this as a prerequisite. CS631 - Database Systems: Databases are everywhere. It's true that I work with them in my 40 hour a week job. But this class may offer additional insights. Anyway this class is a prerequisite for a few classes as well. And I think methods of physical storage will help drill home the algorithms to create your own database system. Maybe after this class it might be easier to go read the code for PostgreSQL or mySQL? Anyway there is some value to taking this class. CS650 - Computer Architecture: To make efficient computer programs you have to understand the hardware, at least the processors. I took CS250 at NJIT which was undergraduate computer architecture. I hated the class, it was incredibly boring for me. Also we had a TA teaching the class (a pet peeve that I always had with NJIT) who also knew next to nothing. So we went slow through the course and there was quite a bit that the TA learned even slower than the class. We did some k-maps, and some gates but that was about it. We never got into discussing the fun parts of the computer. And since computer architecture is boring to me I'll never read a book about it on my own. So basically this class is a way to force me to learn more about computer architecture. It also talks about the various caches and exploiting instruction level parallelism, all important parts of the computer. I have read some about parts of computer architecture, like the processor pipeline and cache and developed some rules of thumb for things. But in big systems properly using the hardware can make all the difference in the world. So this class definitely has some value. CS630 - Operating Systems: I would say you can never learn too much of this stuff. I don't know what this class will give me over the undergraduate class (I think 332). But it is worth looking at this stuff again, I'm sure I don't remember everything from the undergraduate class anyway. The only thing is that I want a different professor than who teaches a bunch of sections. The same professor gave me a 0 on a project in undergraduate Intro to Unix and then vanished before I could ask him why. I had to appeal to the Dean, I showed my project which was time stamped on the NJIT unit system before the due date. And he eventually designated another teacher to mark it. The other teacher gave me full credit and it was enough to bring my grade from a B+ to an A. I really don't know why the project was marked a 0 to this day. But either way a professor who vanishes like that is not one I want to talk to. Plus the professor was Chinese and he spoke broken english. I have nothing wrong with other ethnic groups or even an accent, but if you can't speak proper english you really have no business teaching a class in english. Anyway it is worth making sure operating system theory is entrenched in my brain... CS656 - Internet + Higher Level Protocols: The class description says it will teach you to use a packet sniffer. That could be fun. Plus a lot of problems in this day and age are solved by networks, so it is good to make sure network theory is firmly under my belt as well. Basically each of the core classes represents on big set of theory in computer science Algorithms, Networks, Operating System, Hardware, Databases. Each of these items are also a huge tool in solving problems. Most other disciplines are combinations of these main tools. I would also have to take 4 of these classes anyway as a requirement for the masters degree. And if I could skip one I would probably pick Computer Organization (hardware) which is exactly one that doesn't need to be skipped!!! During a Google interview when they were asking me about sorting numbers and I suggested sorting sets in memory and then merging them using the merge algorithm I was correct. However I was obsessed with doing it two at a time because that is the classical merge algorithm. And for sorting in memory i was open to any sort, heap, quick, merge, etc.... Ultimately they suggested quick because it makes better use of the computer cache. And they suggested a multi way merge because of the amount of read time it saves on the disk. Anyway I didn't get that job LOL. But they used their knowledge of computer hardware to figure out the software solution. That is an area that I am lacking. So basically it is important to get these main levels of solutions down, Hardware, Networks, Operating System Theory, Database Theory, Algorithm design down. So each class has some value. Even if it was total review, it would entrench the knowledge in my head even further. But I suspect all the classes include more programming projects than the undergraduate classes and with more application I'll learn more.... Then there are the total optional classes which can be anything and these are what I am interested in: CS659 - Image Processing/Analysis: I don't know how to process images so I would like to learn. Maybe I'll want to create scanning software some day, since I hate paper and want to eliminate it. So the techniques of representing images would probably come in handy. Anyway I don't really know anything about this area so whatever I learn would be great.... CS668 - Parallel Algorithms: With multi-core processors this is important to understand. I have a book on them but I haven't really read it. Anyway this class is why it is important to do well in CS610 Algorithms because here we are again.... CS670 - Artificial Intelligence If I get a PhD I think the fun area to research is this area. A lot of the techniques for interesting problems come from here. Machine Learning, Searching, Data Mining, etc. it's all about artificial intelligence, making computers act as intelligent agents. Basically getting the computer to make decisions about things through observations is done via Artificial Intelligence techniques. And as a key to automating a ton of boring, mindless, repetitive work is getting the computer to make decisions, I am very interested here. I hate tedious work so I'd love to pass any that I have to do off to a computer!!! Unfortunately it seems like this course was not offered last fall or last spring, so maybe no one will offer this course? That would suck!!!! I am REALLY interested in this course. And I think a course with a lesson plan and assignments would be a huge benefit over me just reading "Artificial Intelligence: A Modern Approach" (plus the book is very boring :-P I need external motivation LOL). CS734 - Data Mining: Basically some applied artificial techniques. Looking at information to extract patterns or to figure out ways of predicting something. If the Netflix prize isn't solved after taking this class, I may want to look into it. Basically the Netflix prize if for improving their recommendations system. Things like finding patterns, figuring out what movies someone might like based on how they rated movies that they saw, all fall into data mining. The government abuses this to find "terrorists". But in reality when you data mine you just correlate things, you don't know the why. You may find that smokers are more likely to commit terrorist acts, but that doesn't say why. Just because someone fits a data mining pattern doesn't mean they are guilty. I have a book on this, but sitting through a class may be interesting. CS633 - Distributed Systems: This course seems like the one course that might have some application in a normal software development career. Part of the discussions from the teacher who I will take this course with mentions discussions on CORBA and J2EE which are actually used in corporate development environment. I have Andrew S. Tanenbaum's book "Distributed Systems: Principles and Paradigms" which has the theory. I am trying to read it, but I do find it boring. While the NJIT text is not the same, the material should be about the same. Basically distributed systems are systems that try to appear as one system in a unified way but they are really a bunch of computers. E Voting Systems, Database Systems like Prudential's where they had 20 servers but they all appeared as one database, modern web applications, etc. are all examples of this. Generally the trick is a layer of middleware which hides the distributed nature of the system. Clients using the application talk to the middleware which them distributes the computations over the systems. Anyway this class would just be interesting and it has a ton of applications. It also includes concerns like Security. Also Peer to Peer networks fall under distributed systems, thinks like Kazaa, Gnutella, eDonkey, Bittorrent, etc.. A large part of distributed systems is just a combination of Networking, Operating System Design, and Algorithms. And then I have one free course to pick....some ideas are CS673: Software Design and Production Methodology CS680: Linux Kernel Programming CS782: Pattern Matching The reality is that in order to get my masters in 2.5 years I need to take 2 classes per semester. So it could be that one semester two classes from this list are not offered at different times at night that I can take, so I will have to substitute. I hope not but that is the reality. I think i will definitely be able to take the 5 classes from the required list, I have to be able to take 4 to graduate. But the others I'm not sure. I haven't seen Artificial Intelligence or Parallel Algorithms offered at all. Image Processing is mostly offered e-learning so that shouldn't be a problem. Data mining also seems offered a lot, although I would want to take it after Artificial Intelligence. Distributed Systems also seems to be offered a lot. I hope I can express interest in AI and get someone to teach it in the 2.5 years that I am studying my Masters. I think AI will be important in determining whether I get a PhD or not.... So anyway assuming I get something near my selection of classes, I will have a broad set of knowledge across various disciplines of Computer Science and a strong base in the main tools for solving problems (Algorithms, Hardware, Networking, Operating Systems, Databases). And the start of knowledge into Artificial Intelligence which basically combines all of the main tools of problem solving into getting the computer to be an intelligent agent. Distributed Systems should teach me the principles underlying many enterprise information systems making me a more valuable programmer to a corporation anyway :) Image Processing and Distributed Systems are more because I am interested. Parallel Algorithms because they are the future with the multi-core machines. Artificial Intelligence and Data Mining because those are sometimes in use but areas where more research is needed. But we will see.... Then if I go PHD I take Advanced Algorithms (instead of reviewing the material from Algorithms), Algorithmic Graph Theory, and Introduction to Computability and Complexity as these are the subjects of the qualifying examination. Then I also can look into some type of independent study with a professor to learn research. Then the last 1.5 years are spent writing a PhD (or 3 years if doing it part time). But whether I go PhD or no depends on several things. 1. Whether I can convince 3 professors to write me a good letter of recommendation. 2. What level of funding I can get. 3. Whether I am interested in a career in research or not. The most important item is 3. The only way to determine that is to find an interesting area (I think Artificial Intelligence is probably that area, I would hate to focus on one small area my entire career and Artificial Intelligence seems to bring all the main areas of computer science tools together under one area) and to see what it is like to do research. So maybe the final class for my masters needs to be an independent study with a professor where I can try out doing research....... Anyway if nothing else the Masters gives me a broad background against a large portion of computer science. Hopefully I have more than enough background to read people's Academic papers in Algorithms and stuff. Because I'm sure there is a ton of stuff discovered by Academics that has a bunch of applications that no one thought of. So finding some applications and starting a company on them could probably lead to money. Maybe the masters will give me ideas on how to start a company or for a cool open source project!!! If not, maybe I can read people's research papers and find something fun :) Then if I get a PHD, that is when I specialize into whatever area is necessary to do CS Research for a year and a half and then spend the other year and a half doing the PHD. So we will see how my plan happens....