views:

169

answers:

5

I'm an undergrad Computer Science student and studying online. There is a lot of self study, independent research and practice i have to do myself. I wonder how beneficial would it be to choose this subject combination in programming:

  • Data Structures
  • OOP
  • Assembly Language & Computer Architecture

Although i also have the option to take DLD (Digital Logic Design) or Data communication courses instead of Assembly Language. My interest lies in programming and i'm also working as a programmer at local software house. Can anyone give me some good advice and suggestions.

+5  A: 

Digital Logic Design and Computer Architecture will both help your understanding of low-level computer concepts and your appreciation for the awesome work optimizing compilers do for you. The listed courses sound like a good combination to me.

Ryan Prior
+3  A: 

That looks fine. If you can learn some functional programming while you are at university I think you should do that, as this is going to broaden your horizons.

If you want to get a programming job at the end of this, you might want to consider joining an open source project and getting some real world experience too. You'll learn a lot more about programming and the tools programmers use by actually programming for a real project than you will by learning how to program in the classroom. Although having both the theoretical knowledge and the experience are important.

Mark Byers
Can you recommend an open source project on the internet for a student of Computer Science? I'd be glad to work on C/C++ projects.
Maxood
A: 

An Algorithms course is necessary. A compiler-design course is also quite useful. And then there is the vast and interesting field of Artificial Intelligence.

Amit Kumar
Compiler Design and AI are advanced courses in the sense they need to have good knowledge of Data Structures and Algorithms. Algorithms is no doubt a very important and interesting course.And i think it should be taken along with Data Structures. What do you think?
Maxood
Yes, or Algorithms can be taken immediately after DS.
Amit Kumar
+1  A: 

The first two subjects (Data Structures and OOP) seem to have a dependency - you should understand OOP before going into Data Structures.

The last subject(Assembly Language & Computer Architecture) would be fine to take concurrently with Data Structures - but I would take a basic programming class and learn OOP before diving into assembly.

For reference, this is the structure my school's honors program takes(and it's been great so far):

1st Semester:
Data Structures and Algorithms
Intro to Logic

2nd Semester:
Intro to Computer Architecture
Discrete math

3rd Semester:
Advanced Computer Architecture
Application of theory(e.x. compression, encryption, error correction)
Programming languages

4th Semester:
Operating Systems(done in x86, uses MIT course material) - challenging but very fun and rewarding class


Sometime after 4th semester:
Algorithms or Automata Theory

After the fourth semester at my school, you're pretty much free to take whatever you want(as an honors student) - most people take grad classes at this point.

My point in listing this out is to demonstrate that my school uses a "two track" model of theory(logic, discrete match, etc.) and implementation(architecture, operating systems, etc.). If you're interested in CS, it's important to be well-skilled in both. You need to both understand the theory and how to implement it well to be a good "well-rounded" computer scientist.

My advice would be to follow a similar model. Take architecture classes, but also take theory classes.

Mike
So do you think that Data Communication is not that consistent or beneficial to study along with the other subjects in programming? Although it has theory and exercises on Analog to Digital and Digital to Analog conversion(it's an introductory level).Please comment
Maxood
What I recommended was just a "core" set of classes that would be good to take. Of course, you should take other electives to go along with them! My advice would be to take what you're interested in. Core classes will give you basic proficiency, but elective classes will give you the ability to explore what you like, and get involved in research! I don't really know what "Data Communications" means, but I'd say go for it if you're interested in the class.
Mike
Data Communication pertains to the study of data transmission in digital form. It is a more extensive study about LAN, WAN, Intranet and Internet.It also covers socket and other topics related to anlof to digital conversion and network topologies like Star, Bus, Ring, Token-Ring, etc. Wonder if this knowledge would help me in socket or network programming? I think it should, what do you say?
Maxood
Sure, that sounds fun(so long as you're interested in it)!
Mike
BTW i frankly think that OOP, DLD and Assembly Language will be the best combination as the subjects are quite consistent and will help the learner to develop a familiarity as to what computers do to model the real world at higher and lower levels.Thank you so much for your valuable feedback.
Maxood
+3  A: 

The only thing on your list you might consider delaying is OOP. I am careful to distinguish between object-oriented design and object-oriented programming:

  • Object-oriented design is today's term for learning to program with data abstraction. It is an essential part of every programmer's toolbox, and it should be part of any good course in data structures.

  • Object-oriented programming is the art of reusing implementations through inheritance. Years of experience teaching undergraduate students have shown me that this is a difficult, advanced topic, except perhaps in very specialized settings like building two-dimensional graphical user interfaces.

Get as much OO design as you can, as early as you can, but steer clear of inheritance until you have more experience.

Finally, assembly code and machine architecture are essential topics if you are to develop a deep understanding of and an intuitive feel for computational costs. These topics are highly recommended. Definitely take this course instead of logic design (an honorable topic, but distant from programming) or data communication (whatever it is).

As at least one other poster has observed, once you have these topics under your belt, some functional programming would be good.

Norman Ramsey
I deeply appreciate your opinion. Can you recommend a good text book on Object Oriented Design except those of classical ones? Is it a good idea to learn OOP with UML instead of implementing it in C++ or Java? I also found that you have expertise in C, Haskell and Lua. I'd be keen to chat with you on Skype. Thank you.
Maxood
@Maxood: It has been some time since I looked at books on design. I still like Liskov and Guttag's classic text *Abstraction and Specification in Program Development*. Even though the text uses a dead language (CLU), all the key ideas are there. I will have to check my bookshelf at work and see what else I can recommend.
Norman Ramsey
Darius Bacon
@Darius: I hate the new book. I think the original edition is much better. Why? Because the original edition uses CLU, Liskov's Turing award-winning language, and it expresses all the concepts very directly and clearly. To express the same concepts in Java requires a lot of paraphrasing and indirection---for example, Java does not have iterators, `yield`, or general-purpose `for` loops---and as a result the ideas are obscured by a poor choice of language. But I suppose it might be more accessible to a mass audience.
Norman Ramsey
That's a pity. Makes me that much less likely to ever read the new one.
Darius Bacon
@Darius: If you've read the original, the new one is a complete waste of time.
Norman Ramsey