Tags: degree |
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....