Constructing a New College IT Curriculum?
slonkak asks: "For extra credit in my Management & Information Systems we were asked to redevelop the IT curriculum. Interning at a government organization for the past 5 years, I have a good idea of what I'd like to know graduating from college. Here are the two tracks I came up with. Does anyone have any suggestions on how to improve this curriculum? I would like more experience members of the Slashdot community to give their input on what they would like to see new hires have a good understanding of." Yes, this one may sound like Slashdot-Do-My-Homework, but the underlying question is still worthwhile. For you IT Managers out there, what do you expect someone with a college degree to know? For you prospective CS Students who might be reading, what would you like to learn while obtaining that degree?
In looking at the two programs outlined, I noticed that they somewhat focus on training for specific products (VC .NET, 2003 Server, Cisco Routers, etc.) rather than underlying theory and principles.
.NET" but rather "experience programming C++."
As the owner of a small business who sometimes looks to hire developers for specific projects, I would probably not hire someone coming from this type of curriculum. In contrast, a programmer with education in principles could likely learn VC, gcc, VectorC or whatever compiler tool best suits the project. To this end, I would not put on my job search documents "experienced in VC
Computational Chemistry products and services.
I can't imagine my ISP being able to handle the /. effect. Anyone willing to mirror the 18K pdf?
PDF
The curriculum that you have posted sounds like something out of DeVry or Chubb and not something that you'd find at a college. Instead of having particular courses in .NET/Java/C++, have generalized data structures and algorithm classes that teach the basics of low-level software design and hammer the importance of efficiency home.
Having theoretical coursework may seem lame and not usefull post-graduation, but they often teach the concepts that are the most used in a CS position. These concepts can be enforced with projects, homeworks, and, most importantly, through internships or co-operative education experiences.
I am a computer scientist in the defense industry and I have seen other 'computer scientists' with degrees from schools whose curriculum approaches what you are proposing. They have a lot harder time thinking in terms of the problem and are 'hard-wired' to use certain technologies to solve every problem. They rely on the SKILLS they were taught in college rather then on the KNOWLEDGE they learned through theory and the application of the theory through constructive coursework.
Here's a link to the current CS curriculum of the school I attended, it has changed a lot since I went there but the focus on theory and knowledge is still present.
When I was in college, seems all we did was install things, set things up, put things togeather. Now here's a crazy idea.. break a system/network/router/etc.. real good, then give it to the students to figure out why it's broken. This could be improperly installed hardware, missing system files, broken network cable, the possibilities are endless.
Since I graduated, I do a lot more 'fixing' than I do setting up things.
For you prospective CS Students who might be reading
Ho ho ho now, Computer Science is very different from Information Systems/Information Technology.
This is not an idea about specific courses but more about how they should be related to each others. Even in the same "branch" (ie:101, 201, 301), courses often had little relations to each other.
Have a course on algorithms make you build a hashmap and then a course on GUIs - two semesters later - use it to build something useful. This kind of interdependance would help students learn to write reusable documented code. Then have them write a program using some other student's old modules... that will teach them how to integrate and maintain crappy buggy code from someone who left the company 3 years ago.
What the hell? This is just a product training course.. not an IT curriculum.
An IT curriculum would look like
* introduction to programming (some intro language)
* statistics or some numerical mathematics course
* data structures
* concurrency
* operating system design
* database design
* artificial intelligence
* network topology and routing theory
etc.
It's 10 PM. Do you know if you're un-American?
but for CS copy them
The things that one should learn at college should be more permanent. Learning a technology or other is irrelevant. And technology changes (a lot). Today is Windows and Linux, but in ten years, who knows?. Formal education should go to the basics. If you learn about networking, you should learn the difference between state-full and state-less protocols, and the two army dilemma. If you are learning about programming, you should learn about paradigms (several of them, imperative, functional, objects, etc) and, maybe, concurrency issues and stuff. If you are learning databases, the best thing is the relational model. Focusing on tools instead of concepts it's bread for today and hunger for tomorrow. Hope it helps, Aureliano
For Network Engineering, I'd expect to see courses on network topology principles (regardless of whether it's Cisco or not you're applying it to). OSI, TCP, IP, broadband networking principles, wireless technologies, security, cryptography, oh and security.
I'd also expect to see classes on the foundations of operating systems and the core aspects of them, how they work, why they work the way they do, etc. Also fundamentals of computer systems themselves -- how they are designed, where they are headed and how, etc.
How about the design and use of compilers in principle? How they work, why they work, why you use the syntax of C/Java/C# vs. something else.
In short, you're way too specific. These seem like courses I'd take to get a certificate in each, not a degree. You can have a C++ programming course with Microsoft Visual, but that should be up to the professor or the curriculum on top of it. I've been in C++ programming classes that allowed the students to use whatever C++ compiler they wanted, since it was the underlying programming priciples that were important, not that we knew how to navigate Microsoft's expensive interface.
Trolls lurk everywhere. Mod them down.
First and foremost, make those classes more than 3 credits. It's hard to fill a quarter/semester when all your major courses have so few credits.
I don't like the class on basic HTML--if you can't pick that up on your own, you're in the wrong major. In fact, I was flat out told that by a professor in one of my first CIS classes.
Finally, I don't see any reason to spend time learning basics about one application (like Exchange or Visual C++) when I can learn the basics of those quickly enough on my own after learning general concepts about software engineering. Also, the Windows Server 2003 class will most certainly be outdated in 2-3 years.
"Information Technology" sounds like a re-branding of the Communications major, possibly with a few more courses thrown in on computers. I don't think the curriculum really matters, as long as you get a degree at the end, right?
But if you seriously want to learn about the technology that drives networks, business, etc., you need to start at the lowest level with an understanding of how binary works and what that means. Then progress to how this works in computers, with bytes, registers, memory, busses, etc.
I think computer science or IT majors could be substantially more helpful if they started with these principles before jumping into the Hello World in Java. At that point, the machines are still a magic black box and the abstraction on it (push the green button to compile) become too ingrained, and it's a lot of work to get a student to see past the abstraction to what's really happening.
I mean, learning about pointers in C before learning assembly language and compiler design seems ludicrous to me, but that's the way most comp sci majors are laid out, apparently. We don't teach math by showing students how to use a calculator to do calculus and then show them "what's really happening inside."
So, if you want a good, useful curriculum, start from the ground up.
If moderation could change anything, it would be illegal.
this looks like a trade school curriculum. not that its bad, but lets not forget that trade schools are only meant to train you for a particular job, whereas college trains you to think and solve much broader problems. this is probably why so many of the tech consultants around here who *dont* have cs degrees, quickly become useless when you start talking about things they didnt learn about in a classroom (eg: anything non-microsoft). but i digress.
your curriculum would benefit from courses that arent so platform/technology dependent, such as algorithms, data-structures, and things like that.
Gyrate Dot Org - "Where high-tech meets low-life"
The best way to gain skills is to work on semester long projects. Back in school did several semester long projects and my favorite was one in which we simulated a UNIX operating system using Java. It was challenging. It had a console all the little UNIX command line apps (cat, talk, edit, vi clone, supported piping, etc). I doubled my skills as a programmer and my Java skills went from 0% to 100% thanks to that project.
-----
One is born into aristocracy, but mediocrity can only be achieved through hard work.
I can't speak to your network engineering curriculum, but the curriculum for developer is woefully lacking in any theory. What you have designed here is a curriculum that will produce individuals that are capable of producing software that conforms to a specification, but have not been prepared to create a specification.
There needs to be courses in data structures, algorithm analysis and operating system theory. I would concern myself less with teaching someone how to be a Java programmer, or a .net programmer, and more with what skills are required to be a good X programmer, where X is whatever language/technology that he or she is presented with. This means that the curriculum and your student aren't obsolete when there is a technology du jour.
I will say that the one thing that the CS curriculum that I was involved in didn't prepare me effectively for was, documentation. I think that it would have been nice to have been required to produce more in the way documentation for the projects that I was involved in.
When I want your opinion I will beat it out of you.
Those aren't bad from a skillset standpoint, but you should probably work in at least one 3 hour technical writing course, and maybe another one concerning the basics or principles of how the IT business works. Weekly, I see brilliant engineer/admin types crash and burn because they cannot adequately express themselves and sell management on why a project failed, why it is necessary to pursue a project, who should get the credit for something actually working, etc.
CS205 has CS205 as a prerequisite! I think recursive courses should be reserved for higher levels.
Syntax error: loose != lose, affect != effect, then!=than
This isn't a CS curriculum, it's a trade school curriculum. Here's why:
/. can tell you that once you pick up the fundamentals of programming (which, fyi, takes years to come to grips with and more years to master), switching languages is as easy as learning syntax and a little about the internals of the language. C -> C++ -> Java -> Pascal -> Perl -> VB...all have the same fundamentals.
First off, don't have speicifics! College should make you learn to think, not make you learn what to think. It's trite, but it's true...the best curriculums expose you to new thought processes, new types of systems and new algorithms.
Why are you taking three semesters of 3 different databases? Have one course: Relational Databases, and take a week to explain the difference between the three. You aren't trying to get someone their certification before graduation.
Where's your fundamental coursework? Data objects? Operating systems? Comparitive languages? Learning how to write hello world? You need these courses as the backbone. Anyone on
Two semesters of Exchange? Why? Very few people actually need to know the inner workings, and buying a book for $50 is tons cheaper than two semesters. Teach this through network theory and protocols.
Historical courses...a history of software, hardware changes/design, the 'family tree' of langagues...these help students to flesh out why the smartest people in our field made the choices (some good, some bad) that they did. There were good reasons for creating what seem like God awful languages ((((Lisp/Scheme?)))) as well as needs that lead to developments like Perl and relational databases. Having a professor over the age of 50 who remembers the days before relational databases is a must...someone who worked on a team to write their own would be even better.
I liked the network theory portions of your curriculum, but there's way too much. A semester (maybe two) on the history of networking, TCP/IP and other protocols (why doesn't anyone use Token Ring anymore?), along with basic, cross platform client/server networking in C (if you can write it in C, you can do it in any other language IMHO). Don't have an entire semester of routers, it's just not worth it.
In general, the best curriculums require overviews and offer electives in specifics, typically available starting your junior year (after you've gotten your feet wet). As much as possible, stay away from specific, commercial technologies. Even though Cisco is the leader in routing, teach what routing is without using the name 'Cisco'. If the student is smart, they'll be able to recognize what Cisco did well and why becaues they have the theory to back it up.
--trb
Yes, your curriculm is design to produce a "90-day wonder" programemr. It is not designed to generate an analyst, or a senior programmer.
You need to focus on several underlying topics. To include:
-OS design
-Compiler design
-Database design (and not just Relational, you need Heirarchtical and network model theory as well)
-Graphics design
-Statistics (If you think you can be a DBA in a relational world without stats, dream on)
-Intro to languages (a kind of survey of what languages are out there and strengths/weaknesses)
-Network principals (Not available when I went to school as my degree pre-dates LANs)
-Screen design
That should do for a start. Oh, and certifications from vendors are so much waste paper when it comes to doing the real world job.
Make the first cirriculum more general. Discuss how things like SMTP,NTP,DNS, etc. work. Then make the intro for Linux/Windows mandatory and the rest for each should be optional. You shouldn't force a person into running an exchange server. Perhaps offer a class in "Alternatives" where you would show Exchage,Notes,OCS,Postfix, sendmail, etc. and compare each and thier benefits. This could pertain to many things such as web servers, smtp servers, database servers. perhaps switch the order of 203 and 303. Learn the basics of a network design before actually implementing one.
For the second, why are people doing development learning Exchange? Also, if i were designing a programming ciricculum, I would start them with C/C++, then perhaps Java, then C#. All the way attempting to avoid using something tied to a platform(ie Mono for C#). Another thing would be to swap Oracle and MySQL,PostgreSQL. Oracle is quite a bit more DB than most people need. Postgres is very ANSI SQL compliant. And honestly, who the hell uses ColdFusion anymore. And I could be mistaken but I imagine ASP will die also as more people pick up C# for web stuff. And PLEASE dont forget about PHP and Perl. PHP seems to be growing in popularity, and Perl is an old standby that can be used almost anywhere(including sysadmin work).
But hey... these are just my thoughts. I am not a professor. Also look at theory just as much as practice. The idea of how to make a Web script(PHP,etc) work correctly is just as important as the actual knowledge of doing it.
My school really encouraged students to get an internship or two under their belt while obtaining their degree, and it was immensely useful. It made me appreciate a lot more of what I was learning, and think of ways to apply it as well.
In addition, it made me a lot more hireable, I believe, than somebody with just the straight education that I got would have been.
On the other hand, my school was lousy at recognizing the experience students would get in internships. For instance, they had two semesters of required classes that were designed specifically to simulate stuff "like it is in the real world". These classes were A) required for those of us who actually had been in the "real world", B) Not like the "real world", and C) Not changed with the suggestions of those of us who had been in the "real world".
Oh, and team projects suck, but find some way to make sure they know how to communicate and know the importance of coding legibly. Everyone should have at least one class where they have to take someone else's code and make it work for a new application. It would teach volumes.
Your proposed curriculum lacks a class that teaches a variety of different (maybe esoteric) programming languages. When I was at college, we had one where we programmed in Scheme (a variant of Lisp), Smalltalk, Clipper and some Java. That may sound stupid at first because you can't delve very deep into each of them, but it does give you a very nice overview of what can be done with different tools. Lisp's syntax is entirely different than what you're used to when coming from a java background. Rules-based oriented programming languages solve very complex problems in an elegant way, etc.
What's this useful for? They say when all you know is a hammer, every problem is a nail.
Overcaffeinated. Angry geeks.
Others have already tackled the "this is really a training curriculum" problem, and talked about adding some courses on theory, algorithms, etc. I would like to add another set of courses (probably upper level) that I think would be interesting...
1) Debugging Techniques
This course covers the art of debugging, basic and advanced debugging techniques, how to debug someone else's code, debugging client/server applications, debugging performance/load issues, debugging on high-volume systems, debugging technologies, etc.
2) Development Methodologies
In today's environment, there are many development methodolgies in vogue. This survey class will cover not only specifics of the Waterfall model, Rational Unified Process, and agile methodologies (such as XP) - but will also cover the theorectical basics of what a methodology must address. Expect discussions of feature/requirements gathering, build/release/maintenance cycles, and other "non-programming" issues.
3) Building computer systems not programs
This course covers how to build "computer systems" that consist of more than 1 program. Learn the types of system architectures (client/server, multi-tier, etc.), issues and design considerations for systems, maintenance considerations, debugging issues, etc.
(Note: this could probably be broken into multiple courses. I would love to see a level 1 and a level 2)
4) Project Management for Programmers
(Requirement: Development Methodologies)
This course discusses the basics of project management, working with a team, breaking a large project into manageable tasks, estimating task length, choosing milestones, etc.
Although not a substitute for a full Project Management curriculum, this course will give you a good overview of the basics of project management.
5) Technology Evaluation
This course teaches the basics of "evaluating a technology." What makes a technology good? What makes a technology obsolete? This course will discuss the theorectical process for choosing development platforms, databases, software, development methodologies, etc. As the world changes, you'll need to figure out which changes to embrace. This course will show you how these decisions should be made.
Can you explain briefly why OS design, compiler design, and graphics design are important for people who want to be good programmers (besides being examples of specific types of fairly important programs)? Also, can you briefly explain how statistics has anything to do with being a DBA? What I know of statistics and databases indicates that there is little overlap in theory-- in practice I use databases everyday to generate statistics.
I'm not asking to be argumentative, but because I am a professional data analyst with a strong interest in programming who would like to understand what else I should know about (there's so much to learn, you know the deal).
IT people need to be able to read and write coherently.
I don't care if you're the best Java/.NET/C/whatever programmer on earth. If you cannot effectively communicate, you are not a very useful employee.
Conformity is the jailer of freedom and enemy of growth. -JFK
-Screen design
One of the most important aspects of being a programmer. Too many developers don't understand what makes a good user interface and what doesn't. Things like consistency through applications and the OS. Not forcing the user to constantly switch between keyboard and mouse. Efficient data entry. If you think you can make a good user interface using a web browser, you are probably wrong.
It is amazing what you can accomplish if you do not care who gets the credit. -- Harry Truman
What kind of degree is this curriculum supposed to produce? The editor mentioned "CS Students" as the people who would take classes like these, but this curriculum has very few Computer Science courses in it, so I have my doubts that it was intended to result in a BS or BA in Computer Science.
Outside of the obvious comments about teaching the fundamentals, not a particular method (it does seem a bit too community college-ish), I would recommend a project-oriented capstone course. Of the many students I've spoken to who needed one of these, the vast majority found them to be the most difficult but worthwhile classes. The University of North Texas (located a few miles from several big-name PC game developers) have an interdisciplinary game design course that's pushed as one of the final courses for students interested in the subject. It encompasses both the CS department and the art department, and they have one semester to develop a working game. Something like this teaches planning, working as part of a team, logical delegating of tasks, time-management, and a whole slew of other things that even a difficult upper-level programming (or art) class simply can't teach.
As an alternate example, a friend of mine graduated a little less than a year ago. His senior Electrical Engineering project was a small group effort (~6 students, IIRC) to design the power source for an anti-personnel missile for Lockheed Martin. Basically, they were given specs (size, acceptable heat levels, power output needed), and were working to design an actual part that would be used in an actual product. The most telling part of the experience was one statement he made a few months later:
"You know, I wish that everytime a professor had taught us something, they would've said, 'by the way, this doesn't actually work in the real world'".
A good application of learning can have a much better result for the student than one more class on topic X. Of course, if poorly done, such classes have the ability to completely screw over good students, impart little knowledge, and piss off industry contacts, but making it work shouldn't be too terribly difficult.
I think it would VERY appealing if an applicant fresh out of college had some experience in how to develop/maintain software in a group. This would only apply to the software development track, but a course that gave an overview of several team programming methodologies would be great. To many college software projects seem to be stand-alone apps developed by a single programmer, and that is not very "real world".
Along the same lines I think that both tracks should have a course in project management (not a course in MS Project). Every self respecting geek always has a project going on (or two or twelve).
-Jackson
Software wise I can't fault your course, but there appears to be little if anything about computer hardware.
1) Network hardware. Hubs, switches, routers, firewalls.
2) PC Hardware Architecture. ISA/PCI, CPU Architecture, Video systems.
3) Comms. ASDL, Modems, Firewire, USB.
I've actually come across a recent Computer Science graduate who didn't know the difference between a PCI slot video card and an AGP card yet he could talk forever about CPU architectures. He didn't get the job.
The more corrupt the state, the more numerous the laws. - Tacitus, 56-120 A.D.
redevelop the IT curriculum.
For you prospective CS Students
For the MILLIONTH time. CS != IT (see, if you're IT, you might not get that)
IT is CS lite.
Yes, this one may sound like Slashdot-Do-My-Homework...
Don't worry Cliff. After reading his proposed curriculum, I don't think he has been doing his own homework for some time now.
* Pretending you're a programmer when the hot secretary comes around.
I think you skipped a "not" in this sentence, didn't you ?
theefer
While I agree with most posters that an IT program should focus on important concepts rather than specific products, there are a couple of "products" that are so important that they should be included in ANY program
- Unix; Don't focus on one brand, or even on one kind of unix (such as linux), but you need to know the basics of all unix variants. Take an O'Reilly Nutshell Book approach to this.
- Windows; Same thing. There are basics that apply across the board, especially now that everything is based on the NT kernel.
- TCP/IP; these are the rules of the road, baby. Everything uses it to communicate now.
While products come and go, some things are going to be in use for a long time, and even if they're not proper "academic" subjects, their practicality and neccessity demands some study, even at Uni.
Life is hard, and the world is cruel
The design of the underlying structure of a relational database is heavily based in statistics.
When you send an SQL query to the DBMS it makes use of the statistics of the various tables to determine the best path to get to the data. To design the database, you need an understanding of how the DBMS goes about doing this to allow you to tune queries more effectively.
In the case of partitioned tablespaces, one must use statistics to determine how best to partition them.
It goes on from there, but I think you get the gist of it.
I once TAed a course on web programming to adults with little background in programming. Whereas you split up web programming into FOUR COURSES, we covered all that material in ONE COURSE. The students had enough programming experience and concepts from other courses that they were easily able to pick up Javascript, Perl, Python, PHP, etc. We spent no time on HTML coding since students were already familiar with other markup/meta- languages (even if they didn't have experience with XML or EBNF, enough exposure to programming should make learning HTML trivial).
Good programmers have a solid understanding of underlying architecture, even if they program GUI or web applications in Python or Java. You list no course on "Computer Architecture" or even "Assembly Programming" (not the same thing but often combined in one course). A course on "Compiler Architecture" should be central to any curriculum, not only because it elucidates programming languages through their implementations, but also because it's a perfect example of melding programming with CS theory.
Instead of separate courses on Java, C++, C#, etc. you need to have a single course on "Programming Languages" which is a survey course of the various languages. This should be taken after an in-depth study of programming in one language. The in-depth study will allow the student to get into more "advanced" topics (in quotes because I'd consider them rather basic) such as advanced data structures (such as B-Trees), Big-O/Theta/Omega notation, hash functions, basic design patterns, loop invariants, etc. It helps no one if you simply re-teach the same elementary topics again and again but in different languages.
The programming language survey course would allow students to apply already-mastered "advanced" concepts to new syntaxes and idioms. The survey course should not simply showcase various procedural programming languages (all the languages you list), but should also include languages like Scheme or Haskell (functional programming), ML (type inference and other type theory), Prolog (logic databases), and perhaps something like Forth or Postscript. Students should be able to take lessons learned from these more "esoteric" languages and apply them to whatever they're doing (I use type safety lessons from ML in my C, functional programming in my Perl and PHP, embedding business logic into a database for end-user modification akin to Prolog, and a stack is not some abstract but mostly useless example from CS theory, but something that I actually use, thanks to Forth/Postscript). If you try to teach functional programming in C# or Javascript, students will have a difficult time following you as these languages can certainly do some functional things but they aren't designed for it, so it's not the right place to learn functional programming.
Due to a solid background in OO theory and implementation, I was able to pick up Objective C in no time at all when I first had to do some Mac programming. Objective C takes a completely different approach to OO programming and C++, Java or C#. I was able to understand the difference between statically-bound and dynamically-bound methods immediately because I know how vtables, etc. are implemented in C++ and was able to extrapolate what a runtime binding system could do for a C-like language from experience with functional languages. Message forwarding posed no conceptual problems - it just made sense. Although Java may now support introspection, you won't find much use for it without dynamic binding, so I doubt Java programmers can easily learn how to use that feature of their language without at least some experience in Objective C or Smalltalk. This is not some min
Anyone taking a CS course program should not be allowed credit for taking classes in C, C++, Cobal, Fortran, Scheme, Lisp, Assembly, Smalltalk, Java, or any other single language. Those courses are offered, but your grade will not effect your GPA, and will not count towards graduation. CS students should be able to pick up any language they need in their own time.
CS should require that everyone take a "programing to hardware" class where assembly is used (doesn't matter which, though I recomend an older RISC one where you don't have to worry about delay slots and the like that complicate modern architectures, yet have simple instructions)
CS should start everyone off with something they have never done. The first class I took in CS requried Scheme, and the professors made it clear that the primary motivation was odds are none of us had seen it. Secondary motivations were: is Lisp is cool, and there is an excellent introduction to programing book from MIT that uses scheme. This class is the first introduction to data structres and algorythms that most CS students should get. There should also be one required programing language course, it should cover at least 12 languages in 10 weeks, and require some algorythm be implimented in all of them. (better yet several so you can see the advantages and disadvantages of each)
CS should concentrate on on algorythms and data structures. (perhaps design patters should be added in? there weren't written when I graduated but they seem useful and teachable)
There isn't time to cover everything, so there should be a graphics line that eventially gets into games. There should be a real-time line, for those interested in time critical things there should be high performance line for those interested in parrell and super computers. There should be a historical line for those interested in that, complete with runing on that old punch card machine in the basement of the physics building and programing it (if it works...) And several others that I can't think of right now. Not all of the above will be long enough for a degree, but the total should be more than a student has time to take in 4 years.
So designers of databases typically perform statistical analyis?
This ciriculum is a complete waste for what I would be looking to hire (a software engineer) - might be Ok for a network/system engineer
For CS - I would hope to see
Survey of computer languages - one of each type
Advanced computer language (pick one above>
Data structures (in a language not taught above)
Networking (not setting up - programming)
OS development (not do something with Linux either)
Compilers
Distributed Computing (not p2p - real app)
Project/Team class (solve a hard problem - program management)
Hardware design/CPU architecture/System level stuff
Technical writting
Technical Speaking
Algorithms
- now since I tend to hire networking people
Advanced Networking
Security/Cryptography
Advanced OS concepts
Hefty list, and not geared toward what your program is producing at all - but this is about what I would look for.
The end result is, what job do you want when you get out - looks like your ciriculum will produce system/network engineers, I am after people that have software engineer somewhere in their title... My program wouldn't train you to be able to do that job at all
I have mod points and I am not afraid to use them
It seesm like a ton of Information Resources are utilized at businesses, and as the resident business geek, I get tons of questions regarding how some accounting proceedures work (journaling, account closing, payroll). So I'd suggest that technical IT curriculum, not those who will be doing research into CS theory but those who will be the day to day practitioners of it, get a few accounting classes. For starters I think the average IT student would benefit from a Principles of Accounting (100 level class) and a managerial finance (how to use accounting to make business decisions type of 200 level class) almost all colleges and technical schools offer them and they would probably do more than any other thing to improve the productivity of a graduate than anything else I can imagine. As a bonus it would be quite useful for anyone planning to start a business. Finally, the thinking behind accounting is very similar to the data manipulation that I've seen in beginning programming classes. Later, a personal finance class and principles of economics class would be more marginal improvments.
Degaussing scares the bad magnetism out of the monitor and fills it with good karma.
Your basic problem is you want people who know .Net
how to use certain products and nothing else.
This is generally a bad idea for a CS major
or even a tech school major. Realize when VC++
changes the interface your requirements for VC++
becomes worthless. Knowing C++ is still useful
even if a compiler changes, support gets dropped,
or you change to a new platform. Should VC+
end up going nowhere, you still want people to take
a worthless class.
Try to understand, curriculums tend to change very little.
When they do change, it means anybody in that major
will have to switch to a new one, thus many people
who took a class will have to take another class.
Realistically, this curriculum you list has very little
relevence to an actual CS curriculum. You should
have started by looking at a real CS curriculum
(or even several). From there, you should have a rough
idea of what to come up with.
Also realize while this may work for you, it likely won't
work for others. Would you want someone who graduated with
a degree but only took classes with no relevence to
anything you use or do working for you? Just think of someone
else who would want a CS graduate but only uses a few of the programs
you have listed.
Overall, I think its a good thing you aren't the one
designing an actual curriculum. There are several problems
within your listed curriculum and it will have no relevency
to many other people who might be looking for CS grads.
Stick to managing.
Of the data, good DBA do, yes. And we are talking statistical analysis more of the distribution of the data.
If you have 50% of the values of the first field in the key are 0, then that isn't that good of a first key field, since it will tend to lump your data together. This is just one example of the kinds of things one must be aware of.
All of you are wrong!!!
You only need two classes to survive in IT these days.
1. Outsourcing 101
2. Marketing 101
Who needs to learn algorithms, principles, and all that stuff? Just outsource it all and sell management on what a great thing it is. Get that bonus... then on to the next company.. rinse... repeat...
And the student programmers in this school are asked to develop a working class enrollment management system, or a college payroll system, or a proposal for a desktop upgrade.
Etc.
Disclaimer: I do NOT have a CS degree in any way, shape, or form.
Of the many things noted in that curricullum that is lacking is a fundamental understanding of the HARDWARE you will be writing to or working with. It's all well and good to know the software, but I don't know how many CS students I've seen that could write these nice little programs that do great little things, but couldn't fix a basic problem on their system (hardware or software wise)if their lives depended on it. This is by no means the rule, just the observations of a lot of graduating CS students that have come my way. I think if more schools focussed more on the underlying hardware theory, the software theory would fall into place much easier and the students would have a much fuller grasp of what they are doing.
Now, in stating what I have in the above paragraph, if you're looking at just doing a training course on specific tools, you HAVE to include hardware knowledge. I guarantee you any school will get a bad name if someone fres out of college with high marks is thrown into a Net Admin job or head of IT and can't troubleshoot a basic problem like a faulty power supply, memory, corrupt drivers, file system corruption, etc. Do paper MCSE's ring a bell???
sigs are like a box of chocolates, they all suck remove the underscores to email me
Look at RIT
it.rit.edu
IT can't be compressed into one track -- you need diffrent skills for diffrent parts. Your webbies will be diffrent from your DBpeople who will be different from your systems people who will be diffrent from your security people who will be diffrent from your HCI people: There's a lot to IT.
There's also a lot of overlap. (I haven't RTFA, sorry. Papers to write.)
1) IT people need to know how to program in a REAL programming language. Right now, we consider that to be java, but that's going to be an internal flamewar.
2) IT people need to know how to speak. Lots of communicatino courses
3) IT people need to know how to get requirements. Lots of HCI fundamentals -- interviewing, STDs, DFDs, etc..
Beyond that, look to RIT to get some specific ideas.
IT is not CS, and it isn't IS. We're happily in the middle.
That sounds like one semester there - at least for a university level student. You're splitting up your classes too much - linux, for instance, by the end of a semester, a student should be able to implement a kernel module that does something like /dev/magic8ball or something. An advanced class would involve designing and implementing a network filesystem (including the data structures on disk and all that fun stuff).
Where I went to school, a 3 unit class meant that you were in class for an hour a week and expected to spend about 2 hours on the class out side of class. 60 units in a semester was a rough semester, but not entirely uncommon (I think I did 56 a couple of times -- 8 semesters of 45 was the requirement for graduating - basically). I think your unit estimates are in line with the time required for teaching those things.
Both of the course listings sound like topics for a minor in being a corporate IT person at most. IT isn't worthy of a major -- combine it with some business, technical writing etc. and you've got a good start on a career in IT -- call it MIS or BIS (management/business information systems).
A CS degree is going to be lots of theory, lots of proofs, lots of math etc. Algorithm design, OS design, analysis of complex systems, information theory, etc. None of it should be training in specific technologies.
I originally started college in Computer Science/Engineering and ended up switching to Information Systems, which was in the college of business. Which track you enroll in really depends on your end goals as a developer. Two quick points:
.NET languages and some coldfusion.
1. I love business. All I ever wanted to do was work with accounting, finance, order management, etc. By moving to IS I got a hefty helping of how a business actually works. Because of this, unlike some of my CSE coworkers, I tend to have a VERY good relationship with the end users.
2. Low level stuff bores me. I have no desire to code an operating system or anything remotely like that. I love to step into my visual studio world, and make some nice data in data out applications that are easy and useful to my end users. My real joy does not come from rewriting a function x times until I shave 5 processor cycles, nor is it from doing some new sort of funky AI. I mean, kudos to all the more "hardcore" folks who like doing that stuff, but my joy comes from seeing a user happy with what I produce.
So that being said... I think that programming needs to be split into a few tracks:
There should be a track for what I would call a low level programmer, someone who does the very important coding of operating systems etc. We're talking assembler, circuit theory, pretty much what you'd get in a good engineering program.
A second track should be made for database / client server programmers. These guys would specialize in SQL, database design/theory, and c++/java.
The third track would be your web developers, once again I think SQL is a must and then toss in some
The tracks should be open enough to let people pursue extras such as AI or any other deeper more technical coursework, or do what I did and fill the extra with business.
OK, I'm not qualified to give an IT/IS curriculum outline -- What I DO feel qualified to do is suggest a generic CS outline.
As many other posters have pointed out, the outline presented reads like a trade school/training course outline: Learn Cisco IOS. Learn MS Win2K+3. Learn Linux (presumably redhat). Learn MS SQL Server, MySQL, Whatever. Learn VB. Lern Visual C++. etc.
Rather than tying students to a particular product, teach them genericly useful skills.
For example:
Now that they are well-versed in the basics you can start feeding them more advanced topics:
This course would include a BASIC discussion of security.
One of the most important things that any student - IS, IT, CS, Trade School, WHATEVER - needs to learn is HOW TO READ THE F***ING MANUAL -- The great failing of my school is that there are people at my level (seniors) who have been "using" the CS department's UNIX machines (Solaris) for almost four years now who do NOT know about "man" and "apropos".
The things employers (my employers anyway) look for are the ability to THINK and solve problems, and the skills to know where to look to find the answer -- Man pages, news groups, google, etc. are all resources that seem to be wasted on many of my peers. Not knowing where to look is a huge resource sink in the Real World, and will not be helpful to your chances of future employment.
/~mikeg
I agree whole heartedly with people who say the underlying theory is most important. However, employers expect you to know how to use specific technology, or they'll never hire you (the Catch-22). A person who gets a CS degree and wants to be a DBA, but has never used anything other than Access to make a simple DB for a class assignment will never get a job!
A CS or IS degree in and of itself does not seem to be good enough. So, some specific certification would seem to be necessary to even be considered employable!
Since I've been out of school, I've had to learn 4 different computer languages. But that was no problem, because I had the theory and background in my (computer engineering) coursework and degree.
Honestly, computer languages just come down to syntax[1]. If you have the theory and background to know the "ways to code" (not just "coding in C++"), then languages are just about learning syntax.
Coding in the real work is 30% design, 10% implementation (coding), 10% fixing bugs, and 50% maintainability. If you just know different computer languages, you can handle 10% (even 20%) of the job (implementation and fixing bugs). You need a good theory basis for a good design, and a really good design for good maintainability.
[1] Well, functional, object oriented, and procedural languages types, then syntax. Writing an app in lisp, java, and C are all different style of coding altogether, but you still need to know how to use the theory with these language types.
Good quote, too many chars. Seriously, the slashdot 120 char limit sucks!
Sounds to me like your DBA never learned the basics of database design.
In ANY data storage system where there are interrelations between the elements (objects) being stored (this includes the obvious relational systems as well as hierarchical systems) the design phase is always best carried out on paper using some kind of modeling scheme (UML, Entity-Relationship drawings, etc.)
This is the method my company uses to design large-scale databases to support our systems and network management software.
The result? A few whiteboards full of circles and arrows and dotted lines (the intermediate nastyness while we work out exactly who will be related to what in which ways) culminating in a diagram that translates very nicely into the Relational world, and subsequently into the hierarchical world (LDAP ala RFC 2307).
While sometimes staring at the code is the ONLY way to understand something, the importance of a thorough understanding of the reasoning behind the design CANNOT be overstated.
/~mikeg
I was in a MIS program a few years ago as a moderately experienced low level network technician. As a student, I wanted to learn real world practical, applicable, specific skills that I could easily transfer to a job/the-real-world.
Instead the college they taught me broad concepts, theories, structures, and abstract ideas to instill knowledge of different fields of IS. I was introduced to multiple programming languages, not to teach me these languages, but to try to make me a developer (and to teach me the mindset and background that I would need to have to actually learn a language). I was taught the relational data-model, the theories of good design, and how to create a logical, practical DB on paper (sure we built projects in Oracle, but we had to learn O development ourselves). The rest of my time was spent learning about things that I saw as a complete waste of time (statistics, accounting, finance, management, marketing, etc.).
While I was in school I was surrounded by people that were getting an MI$ degree, they were just looking for the path of least resistance and the highest paycheck. My program left me as a jack of all trades, and far from a master of anything. I considered my time at the University a complete waste of time. As I entered the job market late in 2000 I also realized that the well had run dry and most of the jobs were gone, and the money was nowhere to be found.
I finally found a job, and believe me it was a humbling experience. My previous on-college-related experience landed me the position, but the degree must have looked good on paper (but I knew difference). Over the past few years I have climbed the ranks and have attained the goals of my five year plan way ahead of schedule, and the funny thing is that I now realize that my hard earned experience was useful for about a week. My degree, and the concepts that it taught me have paid off daily (and will for the long haul).
Your program looks more like a vocational/technical program than a college curriculum. This would be a great resume builder, and short term payoff for students, but learning vendor/brand specific training is no substitute for an education. It is harder to design a network than to configure a router, it is easier to learn C++ than it is to learn how to program, it is harder to learn relational data modeling than it is to learn how to develop an Oracle database. Odds are, the program you and your peers want to re-design probably serves you best (in the long run).
But that is just my $.02 (but at my hourly rate is would actually be about ~$50.00).
We do whiteboards, but during the "meeting" to discuss the design, our dba snapped at anyone who tried to talk / discuss, so ignoring all developer input / collaborative work.
So whats the point of a "design" if not all the important parties involved.
After 15 mins into the meeting of him being a pompous cock, i returned to reading a book, another stared into space, and the 3rd went back to his laptop.
All of my documentation now that refers to anything in his database says "This dumps into our DBAs design so it's his responsibility to document and write the stored procedures".
I'm not going to help someone who won't consider input, it's his ass I'm staying 10ft away from it.
DBAs = great concept
A stoner asshole grumpy old man for a DBA = lame duck of the industry aka more harm then good.
Too right - I am a HUGE proponent of the "if it's broken just reinstall it" school - In many cases it's faster.
:))
On the other hand, sometimes it just IS NOT an option. When I took my current job (almost 5 years ago) I inherited a horribly broken NIS/NFS mess in our UNIX environment -- So broken that if machines needed to be turned off (or on) it had to be done in a specific order or the entire UNIX network would collapse on itself.
Surely blowing everything away and starting over would have fixed the problems, but it would also have taken me months to rebuild since I had no understanding of how the structure came to be the way it was (and my bosses had long since forgotten).
Instead I slowly repaired the mess from within, and within a year we had a setup where almost any machine can be switched off without causing any problems (the main NFS server, for obvious reasons, must remain on.
------------
Of course, there is the problem of HOW to give students this experience. At my school the CS department is not really responsible for its own equipment (a completely seperate issue involving university politics), and as a result if something breaks (like a machine losing its NFS or NIS+ lifeline) our only recourse is "reboot and hope it comes back". We can't even unmount/remount NFS partitions or force the systems to rebind to NIS+.
Many schools actively deny their students the experience of fixing broken systems, and as long as this is standard practice we will continue to get graduates who don't understand that sometimes a big magnet is NOT the best tool for the job.
/~mikeg
First of all it uses words like Linux, Windows, Exchange... Those are things you can learn by reading HOW-TO's on the Internet and O'Reilly books. Paying tuition for this sort of thing seems like a waste of money.
This may be a radical point of view, but I believe that one should only hire a teacher to learn things that one could not learn himself. An extreme example of that is playing a musical instrument - you can take 3 years to read all the HOW-TO's on piano playing in the world, and I will bet that a 7 year old who has a good teacher will play far better than you after the same period of time.
I rank myself pretty high when it comes to knowledge of computers and networking, and yet I never took any courses on Linux (or UNIX - Linux barely existed back then). The things that helped me most in my career were my ability to read, write, speak, listen and understand, experience in basic science (math and physics), my musical training, my study of foreign languages (English being one of them) and perhaps the few courses in programming (BASIC and Pascal).
You have to focus on skills that do not become obsolete - creativity, ability to think out of the box, persistence, patience, communication skills. And when it comes to spefic knowledge, learn history, science, literature - they are constants, their value does not decline with time.
The specific knowldge of "Linux", "Windows", "IOS" or "OSPF" etc. should be treated as "figure it out when you need it and foget it afterwards"
MIT OpenCourseware -- As the parent post said this is a great starting point for any school redesigning their CS curriculum. I'm sure it also has value as add-ons to an IT/IS/MIS curriculum. No mod points - Someone please mod parent up. Thx.
/~mikeg
Is that communication with bosses or between employees?
There's so many things wrong with these proposals I won't even bother going into specifics.* What I will say is, there is a Better Way, and I have seen its genesis. The Master of Fine Arts in Software, and the University of Illinois just recently gave the idea a trial run, which I was thrilled to have been able to participate in.
* OK, I couldn't help myself, I had to mention one specific: Why is writing HTML and CSS in the programming curriculum?
Are you trying to build network admins, system admins, user support personel, operations staff, or what?
I've actually thought quite a bit about this, as I used to work in higher education (user support, programming, system administration), and I believe that there are two key aspects that you're missing:
You also have to give the students some choices. You should have more classes offered than are needed to graduate, and designate them as core and elective.
I'm going to assume that a person is going to take 15 credits per semester, with there being 4 semesters for an associate's degree, 8 semesters for a bachelor's, and am going to ignore master's, and assume that those folks would be in IT management (MIS, or Engineering Management degrees).
I would want someone working on an associates to intern at least one summer, and a bachelor at least two. Also, work study [about 10hrs per week, qualifying for 3 credit hours per semester] for 1/2 their semesters. I'd prefer each of them to do their first semester in user services, no matter what the discipline, as system administrators need to have an appreciation for what the front line support has to go through.
Work study tasks might include such IT related tasks at the university as telephone support, supporting a computer lab, or being assigned to a specific academic or administrative department to handle their support issues. They might work inside the university's data center, helping with network wiring, configuring hardware and racking systems, but well, that all depends on the size of the data center.
They should be working with full time staff members, not left on their own, like overnight operators monitoring logs. [maybe as a paid job if they're known to be trustworthy, but not as part of work study]. For those doing user support, they should be able to escallate problems to other full time staff members, should it be outside of their scope.
Okay, this message is getting too damned long... Here's a few thoughts about classes. Which ones are core, and which ones are elective, and which go with which specialization can be worked out later. [some should be apparent] Not all of these would be 3 credits.
Well, you get the idea... There's so many more classes that you could teach. I haven't even touched upon hardware, and only barely on OSes.
Oh, and for the core c
Build it, and they will come^Hplain.
Back when I was in University computers were still a relatively new thing. There weren't any entrenched ideas about how it should be taught. And Microsoft was a decade away from a monopoly.
Consequently, we were taught computer science. No programming, not server administration, and most definitely not Windows. Very first class was Pascal, just to teach use the basics of programming. The next was assembler to learn the low level stuff about how computers worked.
Then the very next class was Algorithms and Data Structures I. We were to use C on BSD UNIX, neither of which we had been exposed to before. The first assignment was due in a week. This sink-or-swim method taught us two important lessons. First, language wasn't important. Second, it taught us the real-world skill of learning new stuff on our own.
After that the core classes were more data structures and algorithms, programming language concepts (where we learned lisp, prologue, ada and smalltalk, among others), and compiler design and construction. Others outside of the core included networking, operating system principles, etc.
I felt it was a well rounded curricula. But when I talk to recent University graduates, they're learning tech-school stuff like Windows, CISCO routers and Linux administration. While these are important skills, they're not computer science. If you want to learn a trade, go to a tech-school. Real colleges and universities are for education. Knowing the technical details of Windows might serve you for the next five or ten years, but learning the underlying principles of operating system design will serve you for a lifetime.
Aeronautic engineers don't go to school to learn about Beechcraft and Lear, so why are software engineers being taught CISCO routers?
Old Fart signing off...
Don't blame me, I didn't vote for either of them!
I see you've added Graphic Design to the Information Technology: Development curriculum, I like that. Currently I'm in a web program, specifically "Web Programming" now. Design is a compleatly different degree, and we don't do any of it. I'd rather we did, at least some classes in it. It's weird, here in the states I haven't seen any degree programs dealing with the web that covers much of both design and programming yet I've chatted with students in Canada and England and they do both. They also have to take classes in accessibility, which we bearly touch. All we've had to do was to use Bobby to validate it and Bobby misses a lot when it comes to accessibility. With the federal accessibility laws on the books I'd think colleges would do a better job of covering it.
With a disability myself accessibility is an interest of mine, and I'm thinking if there's one thing I'll specialize in it's accessibility. If so though I'll have to do it on my own.
Should there be a Law?
For someone into skydiving, gunfighting and bashing OSX on slashdot.
Why are the terms "Computer Science", "Information Technology", and "Information Sciences" being used interchangeably here? If the goal is real, honest to goodness programmers... shouldn't they be in a CS program instead of something else? By virtue of being in an IT or IS or MIS (or, or, or), there's something else they're doing. If the goal here is to create a person who is more Pointy-Haired Boss than Dilbert, what's the point in teaching them core programming concepts again? Smash them in the face with $programming_language (VC.NET, COBOL, PHP in Swahili) so they have a comprehension of what the process of programming is like (and a very concrete one at that), so they have a better context to communicate with programmers... not to actually be one themselves. Of course, I have no idea what it is any of these degrees actually are supposed to be, despite the fact I'm years into one...
I agree with everything you said, as this seems to be a more solutions-oriented approach than most. I would add three more: 6) Communication At many organizations, there are rooms full of programmers who are technically brilliant enough to make computers dance on command, but those aren't the ones who talk to customers and often aren't the ones who are promoted. The most effective and valuable technical professional is one who is great at what they do AND can communicate intelligently in a variety of media. This course would cover technical and business writing, public speaking, speaking and listening aspects of discussion, and persuasion. 7) Documentation (prerequisite: Communication) This course would cover two types of documentation: inline code comments for future programmers who may edit your code, and user documentation in html (or another readable form). Inline comments would cover things like explaining what certain identifiers stand for, prefaced explanations (inputs/outputs is a good place to start) and anything that you would want to know when editing someone else's code. User docs will teach how to identify one's audience and write to that user level and at just the right pace. 8) Security Theory Needless to say, keeping its information secure is one of the biggets concerns of any organization, and it will continue to be so. Students need to know general concepts of keeping a network secure, not just the latest Cisco-specific DeVry offerings, and need to understand that most the specifics they learn may be obsolete before they have a chance to apply them. This course would take a very diverse network running on several different platforms and simulate attacks to test the proactive and reactive concepts that students have learned. I hope this was helpful! Let me know if you agree/disagree.
In Iowa State University's curriculum, I've been exposed to VB, C++, Scheme, Java, MIPS assembly, and I believe the operating systems course would normally have used C, but they had a different professor teaching it (so C++ was used instead). One other required (semester) course is primarily a group project in which the students can use any language or platform they want. Most of my other classes have been math-heavy; calculus, physics, algorithms, languages (math, not programming). One semester I actually didn't need a computer at all.
On the subject of Java, the feel I got from the class was, "Welcome to Computer Science 362. Here's some Java. Learn it by tomorrow." That wasn't actually said, but Java was very sink-or-swim, by a few weeks in one had to have a grasp on it. The actual course was heuristics and program design.
Sigs are like bumper stickers.