Getting the Most Out of a CS Curriculum?
Henry asks: "In September I start on a CS-type degree course. I am probably a fairly typical newbie programmer, in that most of my knowledge centers around scripting and high to very high level programming. There's much to choose from: languages, concepts, mathematics, and so on. From previous stories, I know that many readers have strong opinions on the failings and weaknesses of university courses and students. Apart from all of the coding that I will do, what can I do in the coming months to maximize what I get out of this? "
Well spelling is obviously not one of them.
Get as much math as you can. The analytical skills you pick up will stand you in good stead throughout your career. If math isn't your thing, try to get as many courses that are important to businesses, like systems analysis, the practice of software engineering, control systems -- it'll help you work effectively in the wider world beyond programmers. And if you actually like CS, do look at (my biases) distributed virtual worlds, robotics and pattern recognition ... lots and lots to do in those areas. However (as I mentioned) a basic grounding in math, logic and the usual basic engineering subjects will stand you in good stead in all these areas.
Go somewhere random
"Getting the Most Out of a CS Cirriculum?"
I'm still waiting for "Getting the most out of a 'Cooking School' Curriculum"
What's that? There is no such thing as "Computer Science alike". Either it is Computer Science, a degree that originally has nothing to do with using (or even programming) computers, but with the theoretical science involved in computation processes (disciplines like automata theory, Computability theory, Analysis of algorithms, Artificial intelligence, Formal language, etc., or in the math realm, linear algebra, Graph theory, etc.), or it is not. If studying the inner theories of computation processes is not for you, but you want to become a ready to market programmer, I advise you to choose a Technology Information degree or something more related. It is all up to what you are really aiming to.
Back in the day I was getting my CS degree in Brazil, where you are required to choose your major *before* you are admitted to the university, the dropout rate in the first 2 semesters was something like 20% (8 out of 40), because students choose CS thinking they would learn programming and advanced hackeries, and game programming when the truth was that they would have to go deep in calculus, algebra, data structures and everything "boring" first, in order to have the scientific basis to progress in the course. People just didn't understand that CS goal is not to produce developers to the market but researchers that have the necessary skill to learn everything they will eventually need to use. IT is a fast moving field, but the foundations of it are mostly static. Learn the foundations once, and keep in pace with the zeitgeist and you will be successful.
Before the usual spelling bitchslap about the editing, I want to get this in: Cliff actually did a decent bit of editing on my submission here. He's moved around some of what I typed and tweaked the wording slightly to improve the style. He also changed "CS degree" to "CS Cirriculum", which is unfortunately a bit of an own goal.
Learn Chinese and Hindi. That way, you'll be able to understand the professors.
In that most of my knowledge centers around scripting and high to very high level programming.
That's not the mark of a newbie programmer, there are many expert Java programmers out there; just because some of them haven't touched the assembly, doesn't mean they are newbie. Having most knowledge center around high-level language is smart, and it is the mark of a programmer that's realistic, as in actual practice high-level language is used the most (and most sophisticated and desirable to know).
Probably if you have any prior knowledge at all of the language that will be used for the curriculum, you will be an "expert". Figure out which language will be used and read up on it in advance, look at examples, and bookmark useful URLs.
You can be a master of x86 assembly and still be considered somewhat of a newbie in a Java programming curriculum. But in case you already know Java, you will start ahead, and have a better chance at mastering the much more important higher-level, language-neutral concepts such as proper design, understanding of algorithms, data structures, etc.
I suspect many CS programs nowadays may cover low-level language details barely if at all, that may be up to you to study independently.
Many students start with knowing no language at all. Knowing a little of just one language is what I consider the mark of a newbie. Advanced programmers know multiple languages, usually of different types -- not necessarily a lot of the low-level details, unless they choose to be low-level programmers, or they need some assembly code to solve a performance or to be able to understand their debugger's assembly dump.
A non-newbie should be able to find good reference material and read from the platform manual and learn parts of the language on the fly, as needed for the problem at hand, and that's about enough. :)
Find a problem that isn't adequately solved and do it. Nothing says serious developer more than someone who can develop, maintain, document, and support a useful OSS project. Bonus points: Your future employer may be a user (worked out for me :-)).
People who coast through uni without really taking the initiative are a dime a dozen. If you want to stand out you have to get yourself organized and build a portfolio of public projects that demonstrate you're a competent fellow.
Tom
Someday, I'll have a real sig.
Better yet, go into Medicine or Law.
A CS degree means nothing: you're not qualified for the intense algorithm development roles - that's what Math majors and Engineering majors are for. Example: CAD/CAM. The mathematicians write the algorithms and code for the computations and all of the intense calculations and simulations. The CS guys wrote the UI - that's it.
The only thing a CS degree is good for is to get into an interview with the CS degree snobs who think you need one to program.
Almost all the time the difference I see between OK programmers and exceptional ones is the work they do on their own projects outside of class. I am not sure which is cause and which is effect though, but I won't hire anyone who's resume doesn't show that they do it for fun too.
Also, if you already do it for fun, college is the best time to work on your own things -- even great programming jobs leave you sick of it at the end of some days.
I hate to tell you guys, there is no such thing as a Counter-Strike curriculum. Some of you take that game *way* too seriously.
Make sure you have the development lifecycle and procedures down, and learn as much science as you can other than computer science. You may get paid to develop software but that software has to do things - and usually that has a lot to do with maths, science, research, data processing, and all of that needs testing.
:)
If you train yourself to be a project manager, study the development PROCESS rather than the menial low-level grunt work, the project will come out better for it. You needn't be a great coder - as when you are a great project manager, you get to tell other people to write great code for you
Well, at least the article isn't about getting the most out of an English "cirriculum".
He who lights his taper at mine, receives light without darkening me.
Most programming problems that have been worth while to attack for me have been extremely vague. These vague problems require you to look at numerous different solutions that you won't be covered by in class material. Most CS students fear these kind of assignments and hesitate to attack them. I would urge you to instead train yourself to enjoy learning new things. Once you get good at that you will be a more fearless programmer who doesn't fear: learning a new programming language, getting handed someone's spaghetti code that is 10,000 lines long and has functions that are 1000 lines long. ---- The first priority of your coding should be that it is readable by humans (emphasis on maintainability). ---- Most likely you will start with java or something else high level. But don't let that first language you use box you into only using it. Other languages have their uses. C is still the golden standard for embedded systems / DSP. Matlab is still the golden standard for prototyping / winning lots of million dollar DoD contracts.
If you want to get a job at Google, take all
the machine learning courses you can.
Otherwise, just make sure you program on your own
as much as possible; take project courses that
let you work on your own stuff, and become
a regular contributor to an open source project.
(Wine is a great one because they're in good
shape technically, they're lots to do there, and
they have a strong test suite so
you can't screw up too badly.)
1. Remember you are not at school. Really. If we could get this into the heads of our student son day one it would be so much easier. Many still act like they're in school when they're in their 3rd year. You are doing the degree for you and what you will gain will be proportional to the amount of effort you put in.
... when I ..." ..."
2. Ask questions of your TAs and lecturers (when appropriate of course). Getting students to ask questions is difficult; especially when they don't understand. If you don't get what's going on, chances are that lots of other people don't, and they will be greatful when you ask the question they were to timid to ask. If you don't understand the answer say so and get the person to walk you through it. See point 1, it's your degree and it's for you, asking questions might make you look silly (in fact, having been on both sides of this, it doesn't; students just think it makes them look silly - see not being at school, in general asking questions makes you look smart) but which is more important you learning or what people who think they are still at school think of you? See the ESR guide on how to ask smart questions. You may not agree with the writing style but the points are valid.
3. Program. Lots. Anything and everything. In a variety of languages on a variety of topics. The *only* way to become a really good programmer is be experience and hard graft. Not only will this make your coursework easier and faster to do and help you pass your programming courses, it will improve your CV, but most important of all - it will help you understand what you are doing. Learn to use a variety of languages and tools like version control, symbolic debugging, static analysis, etc. Think of each language as a tool; the more tools you have the more likely you are to have the one you need. This applies to special purpose tools as well - SAT solvers, linear programming systems, machine learning, GAs, etc. A tap wrench can easily dismissed as 'useless' because you can't hammer things in or pry thing like you can with a claw hammer; but if the problem you are facing is removing a tap - they are invaluable.
4. The right attitude is vitally important. Classic wrong attitudes:
Spoilt - "It doesn't compile"
(Tempting flippant response - "That must really suck", Actual response - "Have you read what the error messages say?")
Defeatist - "I can't do this"
(Tempting flippant response - "and I can't be bothered to help you", Actual response - "What seems to be the problem")
Bigot - "Why do we have to do this with technology X, technology Y is so much better"
(Tempting flippant response - *sigh*, Actual response - "We're trying to teach ideas, not technologies")
World-owes-me-a-degree - "It's too hard"
(Tempting flippant response - "Well as the course is supposed to be obvious I guess we should drop this part", Actual response - "What seems to be the problem")
Too-busy-socialising - "I don't have time"
(Tempting flippant response - "That's too bad then isn't it", Actual response - "How long have you spent on it so far")
Right attitudes:
"Can you help me find why I'm getting a segmentation fault on line
"I'm not getting on well with this course; where is a good place to start?"
"I've done all of the exercises but I still don't feel confident with technology X. Can you recommend any good books."
"I've re-read my notes and gone through the examples; could you help explain why Z is needed when
"I've spent 10 hours practising this since last week's tutorial; could you check I'm going in the right direction?"
5. Work. Actually do the recommended reading (it's their for a reason) and the exercises. To get most of of your degree you should be doing at least 40 hours a week (including lectures, labs, etc.), less than 20 is poor and you will find the later years harder beacuse of it. Time invested in getting the foundations solid is never wasted.
Mod parent up. A couple of the best programmers I know make a point of starting each personal project they write in a new language. Even if they never touch the language again once they've finished, they are then able to apply the concepts from that language to their existing tools.
I am TheRaven on Soylent News
CS-type or CS? There is a difference (see below).
Apart from all of the coding that I will do, what can I do in the coming months to maximize what I get out of this?
If it is a CS course, you probably will do some "coding" but not alot. Computer Science is about much more than writing code. In the majority of my classes we wrote no code at all, because its about learning the ideas and concepts and not the specific implementations (it is assumed you can figure out how to write code). So my advice to you is to dig deeper than just simply learning how to write code.
I Heart Sorting Networks
Not sure of the environment you are going to be taught in but make the most of what tools are at your disposal, also try to get experience in things that interest you.
Since it is a school situation team up with people and build relationshios and swap skills.
Keep in mind once you are out of school, working becomes the #1 priority for most of your day time and learning new stuff is crammed in somewhere below that. Learn what you can now without the pressure of bosses, deadlines and family keeping you from it later on.
"Enjoy what you're doing! If it becomes drudgery, you're doing it wrong!" - Jim Butterfield
Discrete mathematics is very similar to computer science in many ways as it deals with logic, sets, Boolean algebras in general, algorithms, graphs (also featured in a data structures course), and many other interesting topics that can usually be applied to computer science. If you want to get a good grasp on the theory of computer science such that you can pick up on any programming language in any paradigm, it would be very useful to work on math courses on the side such as discrete mathematics or Boolean algebra.
Of course, you should always remember that programming languages are just implementations of computer science, so learning a specific language is really something you do after you know the concepts well. You can probably learn a lot of the base concepts using either C++ or Java, but when you get to your second or third year of CSC, you will definitely begin to explore many different languages (including assembly), especially ones you'll probably end up hating (e.g. Pascal, Fortran).
Also note that I am working on a computer science major, but I have not graduated yet, so this is just based on my experience so far.
'Yes, firefox is indeed greater than women. Can women block pops up for you? No. Can Firefox show you naked women? Yes.'
Its hard to say not knowing your program, but I can speak from mine. I'm at the other end of the table from you; a senior in an undergraduate liberal arts program who has just finished his BA in Computer Science.
I found that my program was way too theory-oriented. Way too early on there was an emphasis on intense algorithm efficiency that lasted for the first two years, and then disappeared from the coursework entirely. Similarly, for the first two years all classes were taught using Java, and then afterwards you could use whatever language you wanted to (most used Java). There was no push for learning other languages, which I understand. And there was more than a deemphasis on practicality; our department chair actually thinks that practical knowledge is something bad. The long and the short of it is that simply following the CS curriculum, without putting in any effort on your own time will get you nowhere.
Answering the poster's original question, in the short-term make sure that you know Java and at least one scripting language (it was Python for me). If your CS department is like mine, your first two or three courses (Freeshman-Sophmore year) will be Java intensive. At the very least, a strong knowledge of Java will put your "Intro to Object Oriented Programming" course in the bag for you.
After that, its what I said in the reply post subject; its what you make of it. Your program may not hand you anything you really need on a silver plate; I discovered this about my program very early on. As a freshman (after playing with UNIX somewhat) I realized that I wanted to someday design operating systems. So I taught myself C. Then I wanted to get in some research experience. When nobody in the CS department would take me, I went over to Biology and got into a Biomathematics research group where I coded a theoretical biological model in C. My software design skills there put me above the others in my lab, who were all Bio or Math majors and had no coding experience at all; soon I ended up teaching them a workshop on C programming. I wanted an internship, I had to find it on my own. I wanted a job, I had to find it on my own.
Contrast this with most of the other students in my class. Because it wasn't a big name program, most other students always came off to me as the type in the field for easy money. At the least, few of the students that I ever worked with actually applied themselves or even cared. These people mostly go to work at a local payroll services company after graduation. I start at a Fortune 500 company this summer... doing OS design.
An enlightenment painter would paint a grand house on a lawn; A romantic painter would paint it on fire.
I used to respond to these questions with a whole course list, but you know what, just enjoy college. Play Dungeons and Dragons, go to LAN parties, eat pizza at 2 am. You have the rest of your adult life to become an amazing programmer. You don't have to walk off with your degree saying, "I'm the next Bill Gates. My programming skillza are similar to those of a ninja." You should be good at what you do. Doing a few side projects won't hurt. Finding a summer internship won't hurt. But most importantly, enjoy these four years because they go by fast.
As much as /.'ers like to advocate spending your CS undergrad time learning math and not computing, I think its equally, if not more important, to spend your time understanding how computers work. In addition to the standard math track (calculus, discrete math, numerical analysis, probability), a well rounded CS curriculm should expose the computer science student to the inner workings of computers and software.
Do an architecture track that covers logic design and computer architecture. This will give you a solid understand of what is possible on modern hardwarend and teach you how to apply what you learned in discrete math.
Next, take an operating systems course. This will show you how software interfaces with the hardware.
Along the way, make sure to take at least two programming language courses, ideally one imperative/procedural and one functional. This will teach you there are multiple ways to solve the same problem. Once you're comfortable with languages, take a real algorithms course with a focus on analysis (not just design). If you have time, a compiler course will fill in the final gap between hardware-os-language-program.
Fill out your electives with things that interest you - graphics, HCI, databases, AI, languages, etc. Be sure to have fun in these courses and apply what you're learning in the other courses.
In the end, a good understanding of the whole stack - hardware, software, and theory - will give you the foundations to build a solid career in computer science, in industry or academia. If you want to specialize more, consider a Masters or Ph.D.
I've learned from experience in both industry and academia that a solid foundation gives you an advantge over people who specalized too early in their careers. A strong theory focus as an undergrad makes it difficult to understand what's practical, too much focus on the hardware side makes it difficult to understand what's possible, and only learning the latest trends makes it impossible to design an debug real systems. Strive for balance and breadth early, specialize later.
-Chris
In most courses, there are several ways for you to learn the material (assignments, readings, lectures, study groups). Figure out which one works best for you (sooner rather than later). A study skills evaluation might be worthwhile to start. A lot of people don't figure these things out quickly enough and end up banging their heads against ineffective study habits.
Your school likely has some course like "comparative programming languages" where you're exposed to functional and logic programming. Take it. If you know only OO/imperative programming, you're missing out. Even if you don't end up a LISP programmer, it will help you think differently about programming problems.
You'll likely be required to take an "algorithms and data structures" course. Pay attention. That's the kind of thing that separates a computer scientist from a programmer. A lot of more practical students hate that course, but it's like making a kids eat their vegetables: it really is good for you.
If it's not required, make sure to go out of your way to learn about concurrency and threads. This can be subtle stuff, so it's best to be taught the basics. Somebody's going to have to use the power of these multi-core processors. It might as well be you.
I wrote a post in a recent Slashdot discussion on computer science that might be of interest. Short version: read around your subject, try to gain a breadth of experience using the resources available at your university, and never stop learning. The linked post is the long version with specific examples. HTH...
If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.
If you can swing it financially, take 1 or 2 extra full-time semesters.
Take 5-10 courses in:
Also:
If you are considering grad school, check with grad schools to see what they are looking for in undergrads. Same goes if you are looking for a particular employer or a particular type of job straight out of school.
One more thing that can help a career is the military. After you graduate, join as an officer in a technical career track. Serve your 8 years then go into the private sector. With your security clearance in hand, you'll have the inside track on defense work. Employers love to see someone with the self-discipline necessary to serve in the armed forces. Just be careful and don't get shot. Of course if we are still at war when your 8 years are up they might not let you out.
Knowledge is how to play a game, intelligence is how to win, wisdom is knowing what game to play.
I'd say read, and read a lot. Read about some problems in computer science, read about the various sub-disciplines of computer science and consider attaching yourself to one or two (for instance, I prefer network programming to AI). Don't be afraid to ask your future profs what languages you're going to study during your college career, and then pick up a book or two on them. Barnes and Noble has an excellent series that gives a brief overview of various languages. It's the "In Easy Steps" series. Each book runs about $10, but it's less if you're a member of B&N's book club thingy. When I asked my prof what languages I'd be learning, he said Java, C, Scheme, and Smalltalk for sure. He said that the Java classes would be very introductory, as math majors are also required to take them. So, he suggested that I brush up on C before I took the class where we learned C (operating systems). I bought the "In Easy Steps" book (ISBN: 0760755043) and I'm fairly sure that the book helped give me a boosted understanding that helped me ace the class. Oh, and I'm of the ilk that believes that books are better than on-line tutorials, because you can get your attention completely away from the computer to read the book. The examples in the "In Easy Steps" C book are short enough that you can practically compile them in your head and know what's going on, provided you read the section.
Colin Dean Go a year without DRM
No, seriously - have a program somewhere on your computer, which finds a random system file and deletes it! Then try and find out what went missing, how to replace it, etc...
OK, maybe that's a little excessive, but learn to play with your computer, break it, fix it, install linux on it, install a different linux on it, download random shit from the internet and run it - work out what it does, how to use it, how it works. Compile stuff, add a feature to it, break it, write shell scripts that do stuff you don't actually need to do. Setup some server applications.
A few rules for a proper CS student's computer - NEVER store important stuff on it - if it's the sort of stuff that would cause a problem if it was deleted, backup, daily. NEVER let it stay constant
DO NOT spend your degree doing the sort of stuff that you will end up doing in a proper job. Spend your degree doing all the stuff you won't really be able to in the real world. If it's a good CS course, it will give you enough grounding to approach more or less any RW problem. There is an exception - make sure you do at least one groupwork project.
Take a wide range of courses. Believe me when I say, you're tastes will change, and you should make sure you don't cut off your options too soon.
.sigs are for losers
If you know C++ you can pretty much figure out any language that you might encounter. It's much easier to go from C++ to Java and etc. than it is to go the other way. The two most useful classes that I had were an operating systems course and algorithms. Good luck in your studies. Graham
There's not much you can typically do in the first 2 years, since those are mostly for fulling general requirements anyway. Just try to get all of them out of the way ASAP so you're last years can be spent not only on CS course requirements but also on you can load up on any CS electives that spike your interest, or are pre-reqs for CS courses that spike your interest. And like what some of the other posters said, a double major in math, or even just a minor will help because those courses will teach you analytical skills which will help you design more efficient algorithms for the programming world.
Live life to the fullest. It's not that life is short, but that you are dead for so long.
I agree with everyone else above. That was the best post on slashdot I've read in quite a long time. It was so good, I took a couple of minutes and made a prettified version, and uploaded it here. If you feel that's inappropriate, please, message me and I'll take it down. But thank you very much.
The prettified version lives Here.
Yeah, because people are always asking me math questions in my job interviews.
Better option: Become an expert at SQL and the language of your choice. I would choose something popular.
Seriously if you leave a CS program knowing more about math than programming you are fucked. Have fun learning on the job while making 2/3 what you would otherwise be worth.
Algorithms, data structures, concurrency, networking and assembly.
Notice I didn't mention any particular language. If you have the aforementioned skills and one language, you can pick up any other. If you're in a CS class that doesn't heavily involve at least one of these skills, drop the class and pick up something that does. Try and take at least one class in the EE program. I took digital design.
In my eight year career I have worked on an OS kernel's networking code and supercomputer control systems.
Ye Olde Coder
I18N == Intergalacticization
And have fun being out of a job when your language of choice falls out of favor. Part of learning a lot of math in a CS degree is also learning a lot of CS theory. Understanding linked lists, stacks, queues, binary trees, and the like will help you to switch between programming languages. Sometimes you will realize that you need to represent data in a way that your language does not have a standard library for. Usually that means you're not looking hard enough for someone else's solution to your problem. But sometimes it means that you have to implement a binary tree yourself. That is becoming less and less the case these days, but just being able to phrase a SQL question in terms of tuples calculus can help you abstract the question in your mind and solve it better.
--- Justin Dearing http://www.justaprogrammer.net/ We're just programmers.
> And have fun being out of a job when your language of choice falls out of favor.
Oh he doesn't even have to wait until it falls out of favor. If the language becomes really popular (e.g. Java), there'll be hundreds of drones in Bangalore or Saigon who'll do the job for a tenth of his asking rate. He'll then spend all his time unemployed and bitching about f*king Indians on Slashdot.
Go somewhere random
But it's worse than that. While knowing about databases and transactions is a good thing (and has some really nice CS depth to it) just knowing how to hack up SQL isn't the same thing at all. It's a road to anonymous skill-less poverty, and a total waste of a higher education.
My advice is to always push yourself. Do the assignments and labs set, but don't just do that. Try to find the most elegant or the most "oh wow!" ways of solving things. Look at how other people solve problems and try to think for yourself why their solutions are good ones or bad. Got a problem? Try to solve it yourself first. Then ask for help, and try to solve it again for yourself after having had the help. Take as many different courses within CS as you can; you never know when you'll need what you learned in them. (Oh, and don't be tempted to plagiarize; if your tutors wanted someone random's solution off the 'net, they'd google it themselves, OK?) Last of all, pay at least some attention to what other disciplines are doing too; for example, I find the various physical sciences, standard engineering, business, contract law and psychology all to be relevant to the area of CS where I now work. The bigger and more diverse your skill-set, the easier it is to find a useful technique for a particular problem, and it's easier to learn principles and fundamental theories across a broad spectrum than it is to do the "SQL and Ruby" approach of just learning specifics across that spectrum...
"Little does he know, but there is no 'I' in 'Idiot'!"
Out without a degree, but making "real money". Did it set me back a few years? Yes. Would I recommend it to anyone? I'm not sure, give me another 10 years of hindsite. I know I'm making 2k less than a a friend I started college with that graduated, 3k more than another that graduated and is now a manager, and 17k less than another friend without a degree that was doing ASP programming while he was in college.
What makes me sound like I'm in college? Do I stress theory to much? I like to program in C as a hobby and write my own linked lists. Tutorials I read to learn postgres threw around the phrase tuples calculus a lot so I do the same. I don't go writing binary trees in something like C# or Java when there are classes that can sort a list of numbers and find duplicates for me. However, its nice to know how everything works under the hood.
--- Justin Dearing http://www.justaprogrammer.net/ We're just programmers.
I'm a 2nd year undergraduate, also in CS. Its really important that you discipline yourself. Honestly, the amount of people I've seen dropping out because they did'nt understand this is frightening. Basically, what happens is you get a load of people who think they know computers coming into the degree and they take it easy. Before they know it theres 5-6 hefty assignments sitting on them + exams. You'll have a pretty easy life for teh first few monthes but trust me things can get hairy pretty quick. I had a higher diploma in computing and a few years experience behind me before embarking on teh Bsc - I thought i knew a bit about computers then but now I know different. My financee bearly remembers what I look like when I go downstairs & my idea of a break is spending an hour reading Slashdot ( sad i know). Seriously though, having good time management skills will see you through a lot. Its a great course and it'll get better in 2nd/3rd year...enjoy it :)
Don't set your machine up so that you can't pull the plug.
Maby he'll be like me and master Asp.NET which lots of Indians know but few are really good at. There are serious consequences to your product if you choose to outsource. Ive heard dozens of firsthand stories of failure but not one success story of outsourcing to India. Programming is not like manufacturing. Anyone can manufacture a battery, only someone good, skilled, and likely gifted will write good software. I know, I've read alot of other people's code.
Maby thats why I make $70k+ less than 2 years after graduating from college.
let the course lead you to your destiny. I started my course (now 3rd year undergrad) and my career goal was to be in IT security, but now I see more than that. I'm more interested in AI or Distributed Systems. You will have to make decisions during your course so just take the road and see where it takes you. If you really like what you are doing you will make the right choices.
Here's my suggestion, something I did: Co-op. Trust me. What else are you going to put on your resume? "I worked at The Gap and did a pile of unrelated schoolwork". Also, my school teaches pretty much everything with a Linux bias. You should try to learn the opposite of whatever the school teaches at your co-op job or on your free time. I never did this, but I have some friends that did, and I think I would recommend it: Google Summer of Code. Get some interest outside of CS that's useful to an employer. Very few companies do CS-only work, and it would be an asset if you knew something about what they did (engineering, chemistry). Try if you can to do a minor in this thing. Get involved with some level of student government; it looks great on a resume. Even computer science club is fine. Finally, friends are your friends. The more people you know, the more people that can help you if you get stuck on some assignment or exam.
Get your fundamentals down. Any theory. Database normalization, database design, algorithms, language design, and data structures. Because you're only going to need to struggle for the rest of your career to keep yourself sharp and it's all the harder when you're starting with nothing.
You are not going to learn how to be a good programmer in college. You might think you're a great programmer and you'd be wrong. Dead wrong. The sooner you are prepared to deal with that realization the sooner you can get started becoming a good programmer in the real world.
I second this - I've been a commercial software developer for over 8 years now, but doing my CS degree only now.
.NET platform, as an example, I was doing Perl/Mason work. I thought I'd like to get more familiar with it, and a year later, I'd rate myself at expert level, with a good understanding of all layers of the stack, and a new language, C#.
I'm taking all the math and non-CS related courses I can. If you do programming in your spare time, take part in an OSS project or two, that and your assignments will give you a fair bit of programming familiarity.
Software development lifecycle stuff, and all the peripheral knowledge you need when developing, you will pick up on the job. A little more than a year ago, I had no experience developing for the
Get your money's worth out of uni, do as much as you can of things you won't be able to pick up in a job.
Don't take the "easy" CS courses, take ones that you know will push you.
I always learn the most with programming when i push the functionality of a program into an area i am blind to; blind for lack of inexperience, exposure, knowledge...
an example might have a programmer who writes some gui spreadsheet program from the ground up, then - deciding his brat would benefit, coding features for graphing, imaging and drawing.
take a lab project that does some menial task and extend it to execute on another platform, rewrite it in a language you don't know, make some command line program compile on windows, linux and mac. write a utility for a friend who is taking math beyond your understanding.
something else programming classes do not seem to cover is essential tools like version control software (cvs, svn) and issue tracking systems for collaborative development; lets not forget planning ahead for a clean rollback when updates choke. learning how to utilize these invaluable means, or better yet - setup and administer them, will help to illuminate oneself as well as future coworkers.
-v
Amen! One addition that may be of particular importance for the original poster:
Another wrong attitude: "I already know this stuff."
When I teach CS1, I usually have some students who know some Java and are totally bored while I teach "this is a variable, this is a loop", and decide the class has nothing to teach them. So when I get to recursion or linked lists or whatever they are not paying attention (despite my warnings) and fall behind.
Minor in CS. Major in math or English or industrial psychology or something. Most CS degrees are crap - either devoted to theory as prep for graduate work (and you are expected to learn programming on your own in these programs) or dedicated to developing programmers for a specific local corporation, in which case they teach primarily what the local companies are looking for and not something useful industry wide.
Learn C/C++, learn database administration (the whole, not just hacking SQL), learn Unix administration (at least 2 of Solaris, AIX, HP-UX and Red Hat Linux) and pick up some networking know how. Other useful things: COBOL (yes, it's still used a lot), Java, mainframe knowledge. BTW part of learning programming is a good datastructure class...many of which are taught in Pascal. And if the training is available, learn SAN.
Go through SICP book. DrScheme is a nice scheme implementation for trying examples in the book. You'll learn to understand some deeper programming concepts, that you problably would not pick up in a few years of random programming practice.
Hint: Getting an A+ certification and waiting an extra 3-4 years to graduate will tell future employers you failed out of college the first time (whether that's true or not, that's what they'll think).
I agree with the general thrust of your post, but this is a pet peeve of mine. (Or maybe I'm just showing off my favority new bit of knowledge. Is there a difference?) Assembly programming doesn't take you anywhere near the metal on many modern processors, especially superscalar workstation and server processors. True, with some kinds of processors, the ISA gives you an idea of the how the processor is structured and how it will perform, but with many others, the real processor bears no similarity to the simple machine model suggested by the ISA. Modern x86 and x86_64 chips from Intel and AMD don't even execute the machine code directly; they dynamically translate the instruction stream into something more suitable for superscalar execution. x86 assembly programming only gets you close to the bare metal of (maybe) ten years ago.
Getting an A+ in high school or fresh out will help you get summer jobs or part-time jobs at "A+ certified" computer repair centers.
It's not gonna help with a career but it will help pay the bills.
Knowledge is how to play a game, intelligence is how to win, wisdom is knowing what game to play.
use the textbook "Computer Organization and Design" by Patterson and Hennessy, just kill yourself and save yourself the pain and eyestrain. Seriously.
Have fun trying to get a job without being able to implement or use the binary trees in a language, and being able to convey that knowledge in an interview. Because if you aren't proficient in at least one marketable language, or your aren't from a top CS school like MIT, you're going to be fucked. I've known people with Masters in CS from GA Tech who couldn't code for shit. I don't care what kinds of algorithms or advanced math they learned, if they can't apply it ,(i.e. code), to design and build a decent application, they're fucking incompetent. I know people who got their CS degrees go never got a decent job because they never learned a decent language.
Lean all the CS you can, AND make sure you can code. Learning to code will get you the first job, learning the CS will hopefully keep you employed.
If someone is passing you on the right, you are an asshole for driving in the wrong lane.
Tutorials I read to learn postgres threw around the phrase tuples calculus a lot so I do the same.
In hindsite maybe you shouldn't have gone to those websights.
To get the most out of my CS, I spent afternoons and evenings in the main library. If you really love computers you will be happy to do so. Find the Computer Section usually 000-200 in dewey decimals. You will find the most esoteric and amazing stuff there. I took out books on the most amazing and crazy stuff in CS and even maths. I found it a treasure trove of ideas even if the books were a bit complex at the time. Especially if you are already coping with your CS - then you must broaden your horizens. If you are struggling - get your studies right first. Then become a guru. I personally haven't stopped. Ever since I left varsity I have been buying more and more books. I have books on AI, IEEE CSDP, Robotics, Distributed Systems, OS etc. This is just the theoretic stuff. I even have excellent books on Modern Compiler Theory and Type Systems - shit I had never seen even in varsity. I spend three hours a month going through my local online bookstore trying to find the wierdest shit I can find. I have a list which I maintain of my favourite top 10 books I need to buy this year. Plus I did 3 years of an Electronic Engineering degree and I am going back over the courses looking for recommended readings and reworking my studies and getting new books on this stuff so that I can combine the knowledge of the two theories into one. Now I am looking to write my own OS and are outlining a new programing language using this stuff. It is all fun. PS get a NXT Mindstorms - it's a great way to learn various aspects of programming. It provides you with great excuses to read up on AI, Control Theory, Planning etc.
Peek your head into some more traditional "engineering" courses. A shortcoming of the CS field is that it ignores classical engineering lessons, which are needed when you write large programs. For example, I took "Technology of Alpine Skiing" my senior year because I needed it as a credit to graduate. It was the only class that I took that described "requirements based engineering," a concept that any CS major needs to understand, even if (s)he isn't going to work as a corporate drone.
No, I will not work for your startup
Have fun trying to get a job without being able to implement or use the binary trees in a language, and being able to convey that knowledge in an interview. Because if you aren't proficient in at least one marketable language, or your aren't from a top CS school like MIT, you're going to be fucked. I've known people with Masters in CS from GA Tech who couldn't code for shit. I don't care what kinds of algorithms or advanced math they learned, if they can't apply it ,(i.e. code), to design and build a decent application, they're fucking incompetent. I know people who got their CS degrees go never got a decent job because they never learned a decent language.
Lean all the CS you can, AND make sure you can code. Learning to code will get you the first job, learning the CS will hopefully keep you employed.
You naild it perfectly. You need practical skills and theory. The theory to describe things in abstract terms and the practical skills to get things done.--- Justin Dearing http://www.justaprogrammer.net/ We're just programmers.
While this is marked as flamebait, there is some truth to it.
My advice would be twofold, first if you love the subject and want a job in IT get your CS degree. For me I was programming when I was 8, and my dad is a programmer, so I've always wanted to be a programmer. If you are going into CS for the money (lol) or other reasons, consider looking into another field.
Secondly, build a *solid* portfolio while you are going through your classes, and make it a point to learn a few in demand languages. Despite the comments above, learning a language that is 'in vogue' can be a skillset you will use for years. For example, Java and C++ aren't going away anytime soon.
My advice is to find a sub-area within CS that you particularily are interested in and study it more on your own. Your program will be designed to make you a well rounded graduate with knowledge in a number of areas. This is all good but to be marketable you have to have strengths. For me my early specalty was systems. After taking several CS classes I didn't really know how computers and operating systems worked until I took a class called "Computer Organization." I had many epiphanies in that class and knew that systems would be my area. In spite of my interest my first job wasn't doing systems work, I was researching and developing software for pattern recognition, data compression, and digital signal processing. I did some good work here but I was really over my head in math but my strengh in systems work allowed me to get into systems work for my next and all subsequent jobs.