Which Language Approach For a Computer Science Degree?
wikid_one writes "I recently went back to college to finish my CS degree, however this time I moved to a new school. My previous school taught only C++, except for a few higher level electives (OpenGL). The school I am now attending teaches what seems like every language in the book. The first two semesters are Java, and then you move to Python, C, Bash, Oracle, and Assembly. While I feel that it would be nice to get a well-rounded introduction to the programming world, I also feel that I am going to come out of school not having the expertise required in a single language to land a good job. After reading the syllabi, all the higher level classes appear to teach concepts rather than work to develop advanced techniques in a specific language. Which method of teaching is going to better provide me with the experience I need, as well as the experience an employer wants to see in a college graduate?"
After reading the syllabi, all the higher level classes appear to teach concepts rather than work to develop advanced techniques in a specific language.
It's great that you have it like that. Its the concepts that matter more than just teaching some language dependant pack of tricks. Languages can always be learnt afterwards and quickly, and they also tend to change during years. Concept stay somewhat the same, and those are what you need to understand. I wish I would had the same kind of program in school.
I also feel that I am going to come out of school not having the expertise required in a single language to land a good job.
Usually programmers are quite self-taught. Schools can teach you concepts and languages, but the real knowledge comes from when you're interested in it and try out and do stuff. Yes, this means you should have some interest in coding at home for your pleasure too, as a hobby. I would think that programming would being really really boring if you dont have the interest to learn yourself or even program your own stuff at home.
You didn't mention if you do programming yourself, but if you dont you should start to. Start coding some games yourself or stuff you think are useful to you. Or learn PHP and start coding websites. You can even start to make some cash out of it, either by selling your software/game, running websites or coding as a freelancer. Try out things.
However the most stupid approach is to think you should be awesome in one language and lack everything else. Usually you need combination of different languages and better understanding generally. Read some programmer job listings and you see how they always contain lots of different thingies and qualities they're looking for. Programming languages used at work will most likely change aswell (Java was hot in some apps programming years ago, but C# and other languages have been stealing position from it). This is why you want to have the general understanding instead of just knowing tricks&tips of one language.
A CS degree is not about making you a monkey that can program only one language. It is about learning how to think. The multi-language approach will ensure that you are exposed to many ways of representation.
The "real" world will train you how to be a monkey well enough.
If knowing one language well enough to get a job, a certification in Java, C# or whatever will serve your simian side better. Use the knowledge in the diversity in languages to tell potential employer that you can quickly learn to program in whatever environment is required.
They shouldn't teach any language. Seriously. Maybe a hypothetical one like MIX or MMIX, but not an actual language. They should teach math instead.
Find a serious computer science course.
The choosing among languages will be more a matter of taste than of actual contents.
Maybe Computers will never be as intelligent as Humans.
For sure they won't ever become so stupid. [VR-1988]
Learn how to learn languages. If you can do that, whatever language you need to use for whatever job you end up with can be easily learned. Learn different concepts that are pervasive throughout different langauges, object oriented desgin, memory management, functional techniques, etc.
The skills that are in highest demand is the ability to write code in C# and to use Bing. C# is now the dominant choice among the new-wave languages (which includes Java) that appeared after 1990. What employers want to see is the ability to write a C# program to automatically issue requests via HTTP to Bing to query the WWW and to retrieve the search results.
I hope you do programming on your own. You do, right?
Eveyrone knows you are a college grad. They know you have shit for experience. So if you want a better than entry level job, start doing some side work now (open source, hobby projects, anything.) Seriously though, anyone who hires you knows what they are getting, being a new college grade. Take the job, get your experience, and move on or up.
New school teaches every language + programmming concepts and our poster complains - maybe the new gen kids are unteachable.
This is not a signature.
I should add that, back when I got my (math) degree, the school offered 1/4 credit courses in particular programming languages. Popular back then were PL/I and IBM 370 assembly language. You can see why it's silly to waste time learning a particular programming language! But my skills in math--statistics, computational geometry, calculus--save my butt every day!
I've been a SQL/.NET guy for quite a while and I've never had a problem getting a job and I still get job info from people a few times a week and I haven't had my resume up in probably 9 months.
I make a good salary and work from home.
Not commenting on any sort of technical superiorities or inferiorities, just commenting on the market.
They shouldn't teach any language. Seriously. Maybe a hypothetical one like MIX or MMIX, but not an actual language.
They should teach math instead.
That's just silly. It's true that the school should focus on theory first and implementation second, but you certainly don't want to graduate with a CIS degree never having used a C++ compiler or written an entire program from start to finish.
I always thought that learning the concepts was the majority of a CS program while learning how to design and write software was what Software Engineering was all about. Obviously both degrees involve a bit of both, but it seems Sofware Eng. involves more practical courses, and material on managing large software projects, etc. From your post I get the impression that the problem isn't the number of languages learned, but the lack of teaching the "work to develop advanced techniques" regardless of the language taught.
I studied EE, so I'm not the best source; but maybe you should give Software Engineering a look, it may be more what you're looking for.
I wouldn't be too worried. Having exposure to a variety of languages will mean that you have more job opportunities available to you, and therefore you'll get more interviews. Once you land a job and start using a specific language, that will become your specialty.
Despite what many believe, a CS degree is not about learning to program. A CS degree is about learning the theoretical and mathematical constructs that programming is based on.
If you know those basics, the language is largely irrelevant.
C is Pascal is Java is JavaScript is VB is C# is C++ - it's mostly syntactic sugar if you ignore the objects, and even the objects are similar. If you can't swap {} for () or begin-end or whatever, you have no hope of being a decent programmer.
If you're looking for vocational programming training, find a vocational school. It's that simple.
The preferred solution is to not have a problem.
OK, let me put it to you this way:
Let's say I'm a hiring manager and conducting interviews for junior programmers.
If you get your degree from the first school, I'm only going to hire you if I need a person who's going to write the code he's told to write. I'm never going to assign stuff to you that requires you to do any kind of analysis.
If you get your degree from the school to which you transferred, you are far more likely to get hired into a position with a lot of growth opportunities. You will have not only know some of several languages, you will also have a good background in abstract concepts.
The problem with most schools today is that they focus far too narrowly on one topic instead of teaching the concepts necessary to handle what tasks are placed in front of the graduates. There have been several articles about the "Java schools" and how the graduates of them can barely program their way out of a paper bag because they don't have the broader information necessary to do a proper analysis. Sure, with modern languages you can often "ignore" things like memory management and code optimization. Unfortunately, all too often I've seen what happens when things are written by people who have no understanding of how to apply basic concepts... when something should be a compiled application... when something should be a simple shell script (mind you, the person who did this thinks that a compiled program with calls to "system()" make this a "system program" and doesn't even know how to write a shell script... I am going to have to clean up that mess in the near future)... and even when to use what language.
No one language is the be-all and end-all of programming. Each language is a tool. You don't normally use a screwdriver to hammer in a nail or as a chisel... so why should you use C or C++ to write what is better written as a shell script? Why would you use Java to write something that requries careful memory management? (Yes, I know some people would just put the question mark after "Java"... :) )
Because it's all you know how to do? Guess what... either you're not getting the
job for which you just interviewed or I'm going to have to go hire someone else to
augment my team to do what you should've been able to do... which means when it
comes time for RIFs, you're name is going to go towards the top of the list because
you can only minimally contribute to the team.
OCO is Loco
I think you're lucky to have even those language courses offered. At my school, CS department only taught Java and Lisp (barely). All advanced courses are about abstract concepts rather than specific languages. Of course, to be able to succeed in the program you need to know how to program in a variety of languages. However, specific languages is something that you learn on your own. That's how the good CS departments operate. Once you understand the abstract concepts, picking up a new language should be easy on your own. This is how it's done in the real world.
Not unless trade schools suddenly get better, and software engineering programs suddenly become ubiquitous.
And not while most students learn better by implementing parts of the theory. And not while employers expect them to be half-competent coders.
And, well, not :)
You really want just enough to not get too stuck on one language, get good at learning new languages, and understanding different classes of languages. Beyond that is counter productive.
Ideally learning C++ (and C), a garbage collected / reference semantics language (like Java or C#), a modern scripting language (Python, Ruby, or Perl), some exposure to an assembly language (doesn't need to be x86 although mine was) and some exposure to functional languages (ML, Haskell, LISP). This would be a good start, knowing one of these languages really well is a definite plus. At this point you should be able to pick up and adapt to whatever is needed for a project.
Learning a language is easy. It doesn't take a degree to be able to program in C++ or any other language. That's not what schools should be teaching (at least after the first couple of courses).
As everyone else has said, it's the concepts that are important. It's not unheard of for a software company that develops only in language X will hire someone who has never used that language before. It doesn't take long at all to get familiar with a new language once you already know a few.
I got my Bachelors degree in 'Web Design and Multimedia' but the courses taught me a little about everything but not enough in anything to excel. So, I'm left with teaching myself or going back to school... and I definitely don't want to do that. So, atm, I am trying to learn some C# and the .NET framework. GL to you.
Teaching programming in a computer science curriculum is a bit like teaching welding to mechanical engineering students, or construction skills to architecture students: valuable things to know, but not a core part of the intellectual training that the students are paying for.
With a proper CS background, becoming proficient in a new language should be something you can do quickly and easily because you already have most of the conceptual "hooks" to hang the syntax of the new language on. If you are getting a CS degree to learn to be a good programmer, you might save some money and look elsewhere. CS Grad students in top departments write some of the most dreadful, unmaintainable code.
Focus on the concepts in class, teach yourself to be a good programmer. You will learn many languages/environments in your career, and there should be nothing particularly special about the first one.
Any "CS" degree, much less "software engineering" degree, that ever has a course about teaching a language is just a joke. Find a better CS program at a better school.
Are Bash and Oracle really programming languages?!? I would consider that more of a scripting language, and SQL.
"My immediate reaction is "WTF? What kind of moron doesn't make things 64-bit safe to begin with?" Linus
Chinese, Tagalog, Vietnamese, or whatever the hell those Indian tech support people speak (claimed to be English, but clearly not). Seriously, you'll need to know one of those languages so you can move to where all the programming jobs will be.
After reading the syllabi, all the higher level classes appear to teach concepts rather than work to develop advanced techniques in a specific language.
Which is exactly as it should be. The focus of a CS degree should not be "how to write a program in as many languages as possible". If you want that, go read Wikipedia or this. I tend to think that the goal of the degree should be (more or less) threefold:
- Weed out people who have no business programming. For those who can it seems crazy, but there really are people who just cannot seem to think logically or in an algorithmic fashion. They should be gone after the first or second class.
- Teach those unfamiliar with programming at least a single language to act as a starting point and as a language to be used in later classes. It used to be that C/C++ was the definitive standard for this since you could mix both high and low level techniques, but lately it seems like most places are starting off with a garbage-collected language such as Java, Python, or C# and then moving to C or C++ later on. In either case, after being 3-4 classes in, the student should be well versed in at least one language. Ideally those still left that should not be programmers would be gone after this point, but as anyone in the field will tell you, this sadly isn't the case.
- Stop teaching languages and start teaching algorithms, techniques, and the 'engineering' part of software engineering. At the end of the day it doesn't matter how many languages you know if you can't use any of them in real-world team-based programming of large and complicated projects. You also get into the more specialized areas you are interested in such as graphics, AI, computational analysis, etc.
Some of my least-favorite CS classes were about language and programming theory and while they aren't real exciting or fun, they do make you really think about good solutions to a problem and not just sitting down to "hack something together". Additionally, all the assignments were language-agnostic, so you could program in whatever you wanted as long as you completed the program spec.
In short: a decent program should be able to sit down and pick up an unfamiliar language without too much trouble, so I wouldn't worry too much about what language you learn first. What's important is that you lean to program well -- after that the language just doesn't matter that much.
"What do you despise? By this are you truly known." --Princess Irulan, Manual of Muad'Dib
/)
We can't help you unless you tell us what job you want. If you want a job from a computer science degree, then you shouldn't be worried about language specific concepts. Those are for code monkeys. If you want to be a code monkey then you probably want a different degree. My degree is in Computer Engineering (though it has a much greater CS bent than EE). I came out of college knowing that I would never work in a higher level language than C. I didn't need roadblocks to perfect hardware control. Now I work as an "Application Developer." I design and write code from the ground up. I had a much more difficult time picking up the specifics of Java than my Software Engineer and Programming degree'd brethren. But because of my background I finally understood why higher level languages were made. None of my co-workers appreciate the simplicity and elegance of sticking to a pure OOP model (since we work on our own projects, the lack of collaboration has made the Software Engineers lazy). None of them understand exactly what the JVM is or how the Garbage Collector works. They worry about optimizing code down to removing method calls when we're doing networking...they don't understand that the nanoseconds saved by not making the method call not only makes the code more difficult to read, it also has no appreciable effect since the SNMP call before it took milliseconds (sometimes even seconds).
Almost more important to any of that though is the changing nature of the business. The 2 Computer Programmer degrees on the team are having a very difficult time moving to the new Java EE standards. We'll be picking up Glassfish v3 and Java EE 6 here soon and will have to update our code. I and the Software Engineers are rejoicing since we understand the benefits even though it means more learning and more work in the short-term. The Computer Programmers on the team are annoyed since they have to learn new concepts and re-work code.
So, do you want to be stuck to the language specific concepts that will make you readily employable? Or do you want breadth of knowledge that enables you to do pick up any task? The choice is yours. But your question is lacking until we know this.
I make the hiring decisions at my company. I check to see if people can solve complex problems. I don't care what language you know. You can learn PHP in a couple of hours. Sure, your first 5.000 SLOC are going to look like whatever language you know best, but right out of college your first 5.000 SLOC are going to suck anyway.
Learning a bunch of languages has the advantage that you learn what concepts are universal to programming and what are just entrenched in the language, but what really matters is learning to think algorithmically, no matter how many languages you know, be it one or one thousand.
It sounds like you've already made your decision about which school you're attending, you just want some assurance that this education won't be wasted. Let me assure you that it won't.
There are, essentially, two kinds of computer languages: Imperative and declarative. Both styles should be taught, as well as their difference, and when to use what.
What matters is that you learn the theory behind it. The mathematics. The logic. That you learn how to break a problem down to an algorithm (imperative) or how to break it down into terms your language can understand (declarative). What language you use to solve it is a different matter and not really important. You will see, if you know your theory and your logic, that it does not matter whether you implement a problem you plan to solve imperatively in C, Perl, PHP or if you really have to Pascal. It is, essentially, the same. The algorithm you develop will be the same. You will write different code, you will account for the various quirks and requirements the language may have, but they will be few and easily picked up.
What matters is your algorithm.
We used to have a Bill of Rights. Now, with the rights gone, all we have left is the bill.
That's like saying an Art MFA shouldn't teach any actual art in any particular medium, just hypothetical art.
There IS a distinction between the "craft" of programming in any particular language and software engineering, but in order to become a software engineer, you need to work through the medium of the language. That's the only way to access it. Knowing how to paint in oils doesn't make you a good artist, but you do have to start making art in some manner in order to get there.
It's a difference between "Computer Science" which is technically about the math and algorithm problems of programming and "Software Engineering" which involves actually implementing things and understanding how data structures work. Many software engineering programs are incorrectly sold as computer science programs because the two were originally one and the same. As computers got better the distinction becomes very obvious. GP is just being curmudgeonly about it.
A code monkey or a computer scientist?
Learn how to work on a team, work with QA, and learn how to deliver products.
That's what you need to be asking.
- Zav - Imagine a Beowulf cluster of insensitive clods...
no, in a CS degree you take a compilers course and learn something like C++ in a few days to do your homework. you don't take a language course where they teach you C++
That could easily box you in and reduce your chances too. If you only are an expert in XYZ, company A may only use ABC and wont even talk to you. Even if you choose the most popular language today, it may or may not be when you are ready to look for a job. ( or get downsized and have to look after years in the field ).
However, if you are versed in several, it shows you have learning/comprehension potential and have a leg up on what company A uses and might just get the interview.
---- Booth was a patriot ----
If after a year or more of college, you think OpenGL and Oracle are programming languages, maybe CS isn't the right major for you.
As others have suggested, try a trade school or community college. They will be happy to teach you to be a single language code monkey, without bogging you down with complicated high-level concepts like "what is a programming language?"
All that we see or seem is but a dream within a dream.
> I also feel that I am going to come out of school not having the expertise required in a single language to land a good job.
You HAVE to practice writing software on seperate/personal projects while in school.
It doesn't matter what they teach in a CS degree program, if you don't work on personal projects, you'll never be a great software developer.
In other words, what they teach in the program is irrelevant. A Bachelors degree in Computer Science does not give anyone expertise required to land a good job. the It is what you do outside of class that gives you the expertise required to land a good job.
Whatever specifics you learn at university will be out of date by the time you start work, and will be a hindrance five years later. You need to get the generalisations so that you can build on what you learn. Learning is about increasing your horizons, not narrowing them. Give a man a fish, and he'll be fed for a day, teach a man to fish and he'll be fed for a week until everyone else who can fish deplete the resources. Tech him a concept of fishery management and he'll feed the world forever.
If after a while you haven't discovered that all languages are essentially the same you should find another career path. But don't program in COBOL if you can avoid it.
Help stamp out iliturcy.
Learn about Binary Search Trees, Red Black Trees, Bubble Sort, Quick Sort, Heaps, etc. Those are the important things to know. Bob Dylan is not famous for knowing English grammar and spelling. He is famous for what he does with them. Teach him Chinese, and he can most likely make amazing songs in Chinese as well. You didn't go to college to learn grammar and spelling. You can learn that in elementary school. Instead, you're going to college to learn how to use the language to create amazing things. It is an abstract level above the syntax level you see on the computer screen, and it is something crucial that anyone learning anything in college _must_ understand.
They should teach math instead.
Good god, man, have you seen a mathematician's code? It's worse than that of electrical engineers!
Programming is a craft, and it requires study, it requires practice, and it requires a holistic perspective. It is more akin to architecture than mathematics, despite the fact that is so heavily reliant on mathematical theory.
As a Perl lover it really pains me to say it, but Python appears to be really taking off. You're going to start seeing Python used by businesses in the same way that they've been using Java over the past decade.
$x='S24;r)>63/* h@<5+oZ)32"5cz';$me='phroggy'x$];
$x=~y+ -xz+\0-Tx+;print$_^chop$me for split'',$x;
Find one or two companies that does the work which interests you, call them up, and ask them what languages they use. Chances are they'll need everything from PHP, Java, Actionscript, Javascript, SQL, or .NET for the web site to C++, Objective C, J2ME, or something else for computers, mobile phones, and game consoles. Seriously, just call them. Make sure you make a distinction between the various positions they have. A single company might have hundreds of programming positions, each of which specializes in some particular thing. A friend of mine who interviewed at Microsoft in the 90's met someone whose entire job was practically dedicated to the print preview dialog box for MS Word. Another friend of mine works for EA or some other game company here in LA. A typical task for him is to prevent that flanging sound when two players fire the same weapon in rapid succession in a first-person shooter. He tends to specialize in audio-related coding.
I think a CS major today should be conversant in at least three languages by the time of graduation. At a minimum you should have knowledge of an assembly language to better understand how a microprocessor really works, a monolithic scripting language like Python or Perl, and a systems language like C, C++, or Java. From there it becomes easy to add on what you need as you need it because you begin to recognize toe commonality in how things are done between different languages so you just have to absorb the new syntax for the most part.
I am becoming gerund, destroyer of verbs.
Perhaps you should look at schools in India.
Warning: this article may contain humor, sarcasm, parody, and perhaps even irony. Read at your own risk.
"try out and do stuff"
Ayup. If you do one long project in assembler and really get the feel for it you'll be more useful than if you learned every language extant.
"When interviewing programmers, always hire the one that knows assembler" - Andrea Frankel, HP, 1987.
Need Mercedes parts ?
You are getting a degree in Computer Science, not attending trade school. Their job is to give you the tools you need to analyze and solve computer problems. Your career is your job. If that means obtaining expertise in a particular language on your own, so be it.
Going over a lot of different languages will give you the tools you need to understand almost any computer language. In any case, CompSci curriculums don't change nearly fast enough to keep up with Language of the Week.
It's actually a good thing your school is doing what they are... too many CompSci programs dont.
SirWired
"They shouldn't teach any language. Seriously."
Well, maybe English.
Take it from me, a computer science degree definitely won't help you get a job.
Major in something whose industry actually has entry-level job openings. The only computer science jobs out there all say "Minimum 5-8 years industry experience required, must be proficient in Java, SOAP, XML, XHTML, SHTML, ZHTML, ABCDEFGHTMLIJKLMNOP, ORACLE, MYSQL, SQL SERVER, JAVASCRIPT, WEB 3.0 TECHNOLOGIES," and other things that are the complete opposite of what you found interesting and intellectually stimulating about computer science when you enrolled.
Unless you actually like hopping on the WEB! WEB! WEB! bandwagon, in that case then go for it. Otherwise a computer science major is only good for knowing how to better work on your hobby projects in your free time while your actual income ends up being working minimum wage as a cashier at Safeway.
Fuck...
Slashdot requires you to wait longer between hitting 'reply' and submitting a comment.
They should be teaching you how to think. How to take requirements and turn them into a finished product. After all, you are going to school for a CS degree. Not Management. Not Business. Not Math. Not Physics. But, Computers.
You need to understand the problem, break it down into manageable components and develop a plan. Take that plan and design a solution. Code that solution. Debug that solution. Design that solution. Code that solution. Debug that solution. Design that solution. And so on.
Note that I did not mention an language, a discipline or an industry. It applies to building a payroll system to a new gene sequencer.
I can't stand the grads that I have seen in the past ten years. They KNOW everything. They know JAVA. They can not dissemble a problem into workable, manageable parts. They can not read. They can not write. Schools need to get back to the basics and teach the student how to survive in the real world.
I don't give a crap about Oracle or Python, as next week, I might have to use MySQL and C#.
So far, in the past three years, I have used all of them, and then some. However, I have never used Java beyond learning it. Knowing that, I would still learn it. It gave me a different perspective on things I still do today.
While you're at it make sure you get exposed to a Lisp based programming language, transaction processing and understand databases. It sounds like a real college so use your free electives to work on your written and oral communications.
E.g English and public speaking oriented classes. Classes in Psychology and Sociology will help too, you need to learn to understand people who don't think like you do.
People who go to diploma mills get ripped off.
Enjoy it. It can be fun.
putting the 'B' in LGBTQ+
Personally, I favour Springbrook Valley Woodelven.
CompSci does not worry about a language. Instead, they teach abstraction around a base language, and will have one to two classes concerning different language (comparative languages). The problem is that languages popularity's change. What you want is fundamentals, and skip the garbage about what language de jour. Go with a program that uses a single language (the ACM base language is java, though it was C++ and before than it was pascal).
I prefer the "u" in honour as it seems to be missing these days.
I am a geek like many of you and lack some social skills, and need some advice, but this question will never make it through the firehose. I live in an apartment and my downstairs neighbors fight pretty much every night. The other night, it was worse than usual, and one of them fled the building leaving a blood trail all the way to the subway. The cops have been here on many occasions but do not appear interested or able to do anything. I worry that their two young sons might be in harm's way. How should I approach this? Go talk to the guy? His wife? Call the police every night?
I'm firmly of the opinion that you should learn as many different programming languages as you can early on, so you learn how to think in each language and understand what the strengths and weaknesses of langauges are. Honestly, if you learn on language really well, you'll have a niche, but you won't be able to grow nearly as well as if you have loads of experience working in different languages.
You don't graduate a college/uni with 'expertise'. You graduate with knowledge. Expertise is learned by actually working in the field. The closest you might come is if you find a school that requires you to apprentice for 2 years before you can graduate, like a medical doctor/nurse/etc has to. I doubt you'll find one.
Stop thinking you need to learn a language and start thinking you need to learn to program. A good programmer can pick up any language as needed. A great programmer can start programming on day 1 with just a reference book and no prior knowledge of the language.
"If you make people think they're thinking, they'll love you; But if you really make them think, they'll hate you." - DM
But timothy didn't ask about a software engineering degree. He asked about a computer science degree. Computer science is the study of the topics of mathematics that relate to computation. CS programs should teach theory, algorithms, data structures, complexity, computability, logic, and the like. I disagree with themeparkphoto, though, because I think that programming languages are a very useful tool to teach these concepts. But they aren't the goal, they are only the means.
You're not going to come out of school with the expertise to be a professional software engineer in any case, whether you focus on one language or many. It's a hard job, and 90% of what makes it hard are factors of time longer than a quarter/semester, and factors of dealing with non-Computer Scientists and people with demands other than your professor.
It's okay, we (the hiring industry) know this, and a lot of us are willing to put in the investment to do the appropriate apprenticeships. CS Degrees are one way to select people who are more likely to succeed, but it's a discipline that's only learned through doing for the most part, and best done with people who are more senior teaching you. (I self-taught a lot after my CS degree, but I advanced more in the first year I had a real mentor than I did in the previous 6 I was doing it mostly myself. But people do vary, and if you're the exception, great.)
I'd recommend the variety approach, because people _do_ vary. Some people love the rigid structure of a Python, the massive infrastructure available to Java, the exposure of the bare metal of C, the total control of Assembly, the flexibility and rapid development of Perl, or whatever suits you. At this stage: Try a lot! Find a language you have fun with, and code more in that. You'll be a lot happier with your job if you don't find the language you use every day to be high in however you define bullshit. And if you don't fall in love with a particular approach, you've got a lot more starting nodes for your resume and can do a broader job search.
Employers have hired college students before, and we know that what you learn in your CS classes with respect to being a professional programmer is _really_ not that much, and hire more for people who we think will learn quickly, not be a pain in the ass, and actually have some amount of work discipline. Whether someone took one or three C# classes is not very interesting. (Personal side projects using the language of choice, those are more interesting.)
Good luck!
-- Kate
With respect to actually knowing things and getting work done, it's better to understand computer science concepts in general then to know obscure details of one or a few particular languages. But keep in mind that the people who hire progammers are not themselves programmers. Head hunters and HR departments are generally non-technical and will not understand (or care) if you talk about these concepts. The fact is, unless you're getting a Ph.D., you have to tailor your resume to be consumed by a half-broken computer program with multiple choice check boxes, and that is how you're going to be judged. It doesn't matter if you know C++, Java, Lisp, Ruby, PHP5, Python, Haskell, and assembly for 10 different processors. If the job calls for C#, and you don't claim to know it, you won't even be considered. If you DO claim to know it, it's hit or miss whether or not you'll be tested on it. I've actually gotten less than perfect scores on C and C++ tests due to things that I KNOW are wrong with the test, so you're up against that too. As much as you have to know computer science, you also have to know how to game the system.
Here's what has worked for me:
(1) Know your concepts well. Know how to take any program and implement it in pseudocode. Learn how to do it in structured, object oriented, and functional languages. This will help you actually get the job done and get raises and stuff once you're hired.
(2) Find out what languages are hot and read at least one small tutorial on each, and write programs in each of at least, say, 1000 lines. Whatever it takes to get used to the basics. Also, read the wikipedia articles and google for "trick and tips" and "gochas" and other things that people praise or gripe about for those languages. Get your feet wet. This way, you can then claim that you have programmed in each of those languages, and you can answer some of the weirder questions someone might ask.
(3) Familiarize yourself with different types programming environments or platforms. Program something on Windows. Program something on a Mac (if you can get your hands on one easily enough). Program something on Linux. Program something on an embedded system or at least a language used on them.
You have to lie judiciously. For instance, my background included assembly for several processors, C, C++, for modern system as well as things like 6502's, along with a fair amount of chip design experience. Could I do embedded systems programming? Duh. But at this one point, I didn't have any ACTUAL embedded systems programming experience. So I was honest and explained that while I hadn't, I clearly had enough related experience that was easy. I didn't get the job. What I should have done was done a bit of reading on the subject to ensure that I know the names of a few embedded processors and bluffed my way through. The problem was that the head hunter wasn't technical enough to understand my explanation, so all he knew to do was check "NO" on the embedded systems experience. He can comment in there about the chip design, but the HR people he would hand this off to wouldn't know what do do with it.
To summarize, to prepare yourself for working in the IT industry, you have to learn programming, but more importantly, you have to learn how to translate what you know into the language of the nontechnical people who do the hiring. This requires a kind of intelligence (subterfuge, to a limited extent) that many technophiles are not very skilled at. If you don't you give away control to the people who understand the art of deception better than they understand technical things. But those are the ones who rule the world. Politicians succeed not by knowing things but by knowing how to SPIN things.
"Computer Science is no more about computers than astronomy is about telescopes."
If it teaches software development methodologies, or specific languages then it's not a pure CS degree. It may well be more valuable for most people - but call a spade a spade.
The school I am now attending teaches what seems like every language in the book.
Back when I was in college they had a rule: CS majors were not permitted to take computer language classes for credit. One of the professors explained it this way: As a Computer Scientist you will use many computer languages over the course of your career. You're expected to learn any computer language you need to know whenever you need to know it. You're not here to learn a computer language; you're here to learn the fundamentals of Computer Science which will be applicable in any language.
So, my comment for the poster is this: welcome to a real school and congratulations on your admission. Don't sweat what employers are/aren't looking for. For folks with a deep understanding of computer science, there are jobs to be had in every programming language. Even lisp if you can believe that. Your time at this school will prepare you for an enjoyable software development job so you won't end up stuck as a routinely disrespected code monkey.
But I know you're going to sweat it anyway, so here's my advice: pick a language you like and start writing open source with it. By the time you graduate, you'll have considerable experience.
Moderating "-1, Disagree" is simple censorship. Have the guts to post your opinion.
Everyone's knocking the poor guy for being an idiot, but give him a break; he's a first-year student. That aside, actually this list seems pretty decent.
A student could certainly do worse. If anything, given this whole list, I'd hope that the school is even more focused on concepts than he's complaining about. You shouldn't be learning about embedded systems programming if you don't have a good understanding of data structures, for instance. If they're doing it right, "learning" all these languages will basically mean picking them up on your own, and class time will be devoted to concepts.
Breakfast served all day!
At the interview I'm looking for one thing: Assurance that we won't have to teach you how to solve problems. I also personally look for some fine arts curriculum in your science degree, but that's my personal bias. I like to see Computer Science or Chemistry majors with a music minor.
I really don't care what languages you studied. If you're deficient when you come to me, I will throw you books and mentors and give you an opportunity to learn. Even if you learned a language in school, I guarantee you have plenty of things to learn about it before you are up to speed with the work we do in my shop.
It really doesn't matter what languages you learned, but I would personally have more respect for a curriculum that had Java, C, an assembly language (even a hypothetical one in a computer organization course), and a capstone project where you made something interesting. I'd like you to have a good grasp of databases, networking, and at least enough parallel and distributed programming experience that you understand the issues associated with those.
Personally if I were to make the decisions on hiring someone, and give the choice between a person who knew only one language inside and out and a person who was exposed to 4 or 5 different language but needed a quick peek at a reference book to make sure they got the syntax right or some such, I would pick the 2nd person without even blinking.
You see, to the first person, he has only one tool in his tool box (a hammer), and to him everything will look like a nail.
Programming is so much more then just simply banging out a bunch of lines of code. It's looking at the requirements and picking the best tool for the job. In addition things are never static. A little tool may be needed and python may just fit the bill, then there will be that web application that needs enhanced and that is written in PHP, and the boss just dropped by and said that corporate just got a new application in and it has it's own scripting interface and it needs in interface to the application that you are responsible for.
Sure... if you are working on a big project, that project may have decided to use just one language and you will spend the next 3 years looking at java, but knowing how a computer really works (from that assembly class - even though you've never code a single line of assembly) you can make some wise decisions on how to implement something, or maybe just maybe you might come back and say - you know right here it would be beneficial to call out to a routine written in C because Java just isn't going to cut it right here.
Computer Science is a subset of Mathematics. You don't need a degree to do mere programming. You don't go to medical school and residency because you want to be a good phamacist.
The Admin and the Engineer
sopssa, excellent & VERY WELL PUT!
(Because, you're right - &, when you're right? You're RIGHT as rain!)...
Only thing I might add onto what have already stated, is to do what I had 14++ yrs. ago or so once I was out of academia (where I did nothing but "overload" on languages, so I could learn by PRINCIPALS, rather than focus on 1 language tool only, in taking C & C++, Fortran, Basic, COBOL, Pascal, VB, & x86 Assembly (via MASM & DEBUG))?
DO A SHAREWARE or FREEWARE...
I.E.-> It makes YOU focus on building a tool that you wanted, but cannot find (or, a "BETTER VERSION" of a tool you like, that might lack a featureset others like it possess) - & makes you do things that you may not have in academia (which gives you a foundation only, a base to build on, work tasks do the rest, but tend to focus in a specific area generally (which is, for most of us, the "steady eddy" end of the field in DB work (MIS/IS/IT type work))... the nicest part is, is that OTHERS may find your tool useful as well & who knows what kind of "industry exposure" it can give you (it helped me out a great deal this way as well).
Imo? It helps "round you out", beyond what you learn on the job OR in academic environs... imo, @ least!
(AND, keeps your interest HIGH in this art & science as well, by focusing on a "pet project" too... something YOU really want to build, not just what you're paid to do to eat/live etc. et al)
An alternate to THIS might be to get involved in an already ongoing project in the Open Source world possibly too... but either one will help! Especially for new guys...
APK
P.S.=> Others here gave a LOT of the same type answer, & kudos to them as well... they've been there, obviously, & it shows in their responses - It's just that you put it just a WEE bit better imo, than most others have already also... no small wonder you were "modded up" +5, so hats off to you, for giving the questioner the right "pointers" (pun intended, lol).
(If I could give mod points I would, but I elect to post as "A/C" here (for good reasons, don't want to "get into it" as to why though), but? There's no modding up the max/perfect, so... there ya are!)... apk
The thing that your are forgetting though is that the universities are derived from the Greek schools of philosophy
and medieval monasteries both of which placed more emphases on arguing all day than actually accomplishing
anything.
Personally I'm self educated and I tend to phase out when trying to read something on CS but I can read and write
code.
The only way to learn how to write software is, you guessed it, write software. Write a game in opengl or a physics simulation (gravity works nice) if you aren't into games. Do it in several languages and you'll see why they're teaching you the way they are - because language ultimately doesn't matter.
Do not take this golden opportunity and flush it down the toilet. A specific programming language is irrelevant to skill in programming.
(Writing as someone who has interviewed programmers for positions before).
I believe that school should run you through...
* A bit about assembly. You're going to learn how CPU is built, right?
* C. To make you think about algorithms once you know how things run.
* Lisp. To make you understand functional programming.
* Java/Python. Probably the latter, to show you OO approach.
Apart from that, learn on your own whatever seems to be the current fad. You'll be changing the languages you write in anyway, but with some basics it should be easy. :)
Knowing the libraries and "ecosystem" of specific languages, well, that's totally different story. Can't give you an advice here, as I'm not a developer
-- we're here you're not
Language is irrelevent to a computer science degree. CS is about concepts, and bringing new ideas into the world. Once you understand CS, languages are easy. I've not yet taken on a full-time job where I already knew the primary language I'd be using, but was able to demonstrate to the (thankfully clued up managers) that I was capable of picking it up. If you're more interested in the specifics of learning programming in specific techologies and methodologies, get a software engineering degree. If you want to go into consulting, engineering is also better - but you must have experience for consulting.
When I went to university, they used a Modula-2 variant for imperative programming, Poplog (Prolog+Lisp variant) for AI and I have forgotten what was the language for functional programming but it was another oddball one.
Anyways... The argument for it was: You won't encounter these languages in the "real world (tm)" but everything you learn can be transplanted into whatever languages you need to use.
In the final year, some C/C++/Java was looked at as a means to transplant the knowledge learnt earlier.
To be honest: When I started at university, I was already a proficient at C, C++, Turbo Pascal and 80386 assembly so I mostly went to get the piece of paper. I guess another reason why they used an in-house modified language for teaching is that it puts everyone at the starting point for those languages.
No sig. Move along - nothing to see here.
University does *not* teach you to program. Employers know (or should know) this, so don't worry about that.
My gut feeling is that the more languages you learn, the less you are locked into one way of thinking. The only language that every computer science major needs to learn is assembler. Many Universities do not teach assembler and the students come out with some weird ideas about how computers actually work.
Most of my work is in C, and my concept of hell is teaching pointers to comp sci students who have only worked in java :(
I agree!
Except for the first 2 intro CS courses my school didn't teach any languages. The classes were all about concepts. The teacher would show up and say we were using X language, maybe give some pointers to websites about the language, and then expect the students to figure out the language aspect on their own.
I took an OpenGL graphics programming elective and the teacher didn't care what language we used as long as it had OGL bindings and a linux compiler/interpreter.
This hasn't been true for at least a decade, perhaps more, and no amount of protesting or wishing otherwise will change it back.
"You can either have software quality or you can have pointer arithmetic, but you cannot have both at the same time."
The problem is most employers require at least 5 years of Bing experience.
Microsoft's search engine, in some name or other, has been on the default home page of every copy of Windows Internet Explorer since 1998.
In order to answer questions about this general problem of how to become an UberG33k I have prepared the following video.
http://www.youtube.com/watch?v=jhz-RdohR8U
Go to a good tech school if you want learn how to use tools. Go to a university if you want to learn how to think.
Any one else concerned that the new school - unless it is teaching python to really teach about lambda - is ignoring functional programming techniques?
Unless I'm misunderstanding him, "Oracle" seems pretty vendor/product specific to me as opposed to learning SQL and general concepts in database administration.
Right as rain, & I'll tell you pretty much the SAME THING I told the GP, sopssa:
Great post!
This particular course lends an insight into a COOL set of "tricks" that come into play more than most folks might think, even in today's "prebuilt tools" & object-oriented Object.Property Method world... especially with raw data sets that you have to put into other things like databases, or not!
(Think files you need to find duplicates in, or sort, etc. et al (though most listboxes & controls have these built into them already, there are times you need them anyhow, & which works BEST/FASTEST, + on what size & type of data involved))
Seriously good suggestion on your part on a great piece of coursework a person takes by their sophomore year typically anyhow... on a bachelors that is (senior year for 2 yr. tech associates degrees though, they get it too)
APK
P.S.=> This is one of those courses that teach you the "KUNG-FU" level stuff early on, the really interesting material that helps you THINK properly, for computing (good computing & programming)... apk
Need to decide what you want first: do you want language training programme to land you the next job, or an education to last you a whole career? If you want to join faceless, replaceable, assembly-line coders belching out reams of cookie-cutter flavor-of-the-month, go with the language training program. If you want the *chance* to ascend that race, and create something new and valuable, you'll need to first learn how to think. As someone who has been responsible for hiring, I have no interest in employing the first category of developers. Real value is in doing something never done before, and for that you'll need to be able to think independently. The implementation details, such as choice of problem domain appropriate language, will be up to you -- so you'd better know more than one, and it better not take more than a week to get functional in it. Moreover, if you intend to be promoted beyond coding some day, you'll need other skills besides Java.
After leaving university, I've worked in 6+ different programming languages. I'd have said that a course which introduces you to a broad range of languages is better than one which ties you into one language, even if that language was the industry standard in many areas. I mean, lots of languages share a set of similar conventions, but no one language is sufficient to introduce you to all of them. You simply cannot guarantee that you will always work in the same language for your entire working life, and IMHO you're better getting experience with other languages when you're at university than when struggling to meet an unrealistic schedule in a real job.
mysql> SELECT * FROM `places` WHERE `place` LIKE 'home`; Empty set (0.00 sec)
If you know one language in a group of languages, chances are that you could teach your self another. In the list you mention I don't see any functional languages. For example Haskell, which has lazy evaluation, would be a good candidate. (google a haskell implementation of Sieve of Eratosthenes for an eye opener). One of the language trends is to surrender the idea that one language fits all problems. Expect to meet lots of new small languages on your way. As an example, the .Net runtime is designed to let different languages interoperate in the same application.
If you are just learning the basics in 4 to 6 different languagues ("hello world") then you are NOT getting a proper education. If they are teaching the concepts and constructs and giving you an overview in several languages, then perhaps it is a decent school.
My preference would still be for the school to teach you the concepts and constructs for a single language (maybe 2) throughout your schooling, while making note how it might be done differently in others.
If you went to blacksmith school and they simply taught "this is a mason's hammer, you use it concrete and brick, this is a ball peen hammer, use it for cold chisels and forming metal, this is a mallet, use it when worried about marring a surface." they haven't actually taught you anything useful other than the type of job for which the tool is designed. If they then have you use the tools to actually bend and form metal and build things, then you have the foundation of an occupation.
Best bet is to go to a 2-year tech school and get into an internship or coop program. The 4-year CS programs charge an arm and a leg for the basic coursework which is already covered in most high schools. Many never get any better than that.
Actually, it looks to me that the course of study offered to you is quite good. A good Computer Sciences curriculum will teach you the concepts necessary to be an excellent critical thinker and problem solver. After you are solid with the fundamentals, you will realize that learning a new programming language is nothing more than memorizing syntax and library functions. To tell you the truth, after learning the more advanced concepts in the upper level courses, picking up a programming language will be quite easy and even mundane. You will be glad your curriculum didn't waste valuable classroom time "just learning a language," and this is why (at least from my experience), if a CS course offered by a reputable CS department requires that you know, say, straight C as a prerequisite, the department will not spend time teaching it to you, but rather expect that you, as a consummate Computer Scientist, will go and learn the language on your own, and that you should be able to do that well.
While I feel that it would be nice to get a well-rounded introduction to the programming world, I also feel that I am going to come out of school not having the expertise required in a single language to land a good job.
It sounds like you enrolled in a better school the second time around.
Ideally, school should teach you the nuances of each language and all the conpcets, but there is limited time. Learning how to program in one language will make you just make you a code-monkey if you don't learn how to extend the programming concepts to other languages and projects. Learning the programming concepts and a number of languages will send you on the path to be a computer scientist and teach you the basics of a number of languages. Personally, I feel that you can easily learn syntax yourself with a compiler and a book. It takes more mental effort and motivation to learn the larger-scale concepts, so it is better to learn these in class.
So you really need to decide what you want to be: a programmer or a computer scientist.
From your employer's perspective, anyone fresh out of school is going to be pretty useless at first. You have no corporate work experience and probably limited experience working with a team. But just think what would be more embarrassing to you as a new employee? Would you rather admit to your boss that you don't know the proper syntax for an if statement in Java or that you never fully worked out what a three-dimensional array was?
"Computer Science is no more about computers than astronomy is about telescopes."
How many astronomers don't know how to use a telescope?
1.) Concepts
.....Fortran77/90.
.net Plattform, ;)
:D
- most said almost nothing to aid
CS - are not programmers in the first
2.) Usage
ENGINEERING
If you want to have a look at engineering software which is used to solve numerical problems(FEA,MBS), you most likely will run into the good/bad old
And Fortran will last longer than you live, even that MSC/Adams tries to jump to a C++ Solver for better code maintainance doesn't mean anything for now - but I suspect a bit more of a market hype, lack of good (future) fortran coders and that C++ Coders are cheaper than their Fortran counterparts,
you want to know why ?
Answer(*)
Interfaces and Generics ( the code is too maintainable and you're expandable )
But yes Fortran is beautifull and ugly at the same time, Fortran is pure code it's no concept, that had to be worked out on beforehand,
Fortran is just a way to implement.
3.) suggestions, from the real (work) life - as a mechanical engineer who has also to be a part-time programmer, and has to look above the fence
I would suggest, with given priority except d. - which is the most important skill
a.)
Excel-VBA - a helpfull swiss army knife, when it comes to handle data using a combination of VBA and the functional spreadsheets, this is nearly a must,
because if no other tools are available or allowed to use, excel is installed on nearly every office-PC, VBA is easy but the Excelobjectworld has to be
learned also.
b.) choose one but Fortran has the geeky vintage factor on it's side, it's like a 12" vinyl
Fortran/Pascal - knows Pointers and memory management, imperative, highly structured, teaches "clean" coding.
c.)
F# - functional and
- exotic but very neat
- few very good books about, there nearly are no more than those few good, there aren't even bad ones
- fast
d.)
be adaptive, be creative, a good programmer must not be the best coder.
An analytical problem-orientated approach, in combination with creativity and the ability to adapt to new situations are the key abilities to
get a good job and to stay in, and using ExcelVBA is also a key ability:
In short, the program has to evolve in your head, not within the language you implement it in, but you will find Excel everywhere
Don't take it too serious.
* it's a JOKE
I see alot of people saying that the language doesn't matter to learn CS. But how can one fully understand how programming works if they don't understand pointers, references, and heap memory (c/c++)?
In the debate about concepts vs. specific languages, one thing is missing: the most important skills in the "real world" are communication skills. It hardly matters how good of a programmer you are; if you can't communicate, you're going nowhere. That means being able to speak clearly and coherently, write well, understand and respond to other people's communications, and so forth. You could be a god-like programmer, but if nobody can understand what you're doing, your code won't be of much use and you won't be asked to do anything of interest because nobody will know what you can do. One of the best CS classes I took at MIT, about 25 years ago, had no programming or even design component whatsoever. It was called Computer Systems Engineering, 6.033 if I recall correctly. The common joke about it was that it was a humanities class. That's because the work involved reading a substantial body of material each week (often some of the major foundation papers of the field) and writing critiques. There were in addition two term papers, which involved architecting a solution to a particular problem (no design work here -- just the architecture). My observation was that students either loved it or hated it. The ones who hated it were the ones who just wanted to get down and dirty with coding. The ones who liked it were the ones who had good communication skills who wanted to really understand the field.
As far as the language issue goes, are you looking for a trade school or a professional education? Languages will come and go. If you have a sound technical base, you can pick up the fundamentals of any new language quickly enough, and languages constantly evolve anyway (C++ today isn't what it was 10 years ago, and who knows what the language de l'heur will be in 2 years, anyway). I learned JavaScript a few years ago while hacking on an internal tool to generate bug reports (something I've used for years to assist me in managing projects) -- someone wanted a more interactive experience. I'm no JavaScript expert, but I picked up the basics quickly enough -- and more importantly, because of my basic background in interface design, algorithms and optimization, my reporting tool is very fast, and the JavaScript can be used by anyone else in the company who wants to do similar manipulations on HTML tables. Similarly, I learned Python about 6 months ago because a planning tool I wanted to use was written in Python, but I wanted to add some new features, speed it up, and fix some bugs. No classes, no books, just reading the code and doing some Google searches when I needed to learn more about wxPython. When I was an undergrad, the only programming classes offered by the CS department used Scheme and CLU -- two languages with no significant commercial value even then (at that time, the commercially interesting languages were Fortran, Cobol, and C). Why? Because those languages had features that were particularly good for teaching the desired concepts.
Also, learning programming isn't very expensive. As others have said, you can learn a lot on your own at the cost of the computer that you already have. Better yet, you can create or work on something useful in the FOSS world.
When I've interviewed candidates for engineering jobs (both as a manager and as an engineer), I've never been concerned with "what languages or libraries does this person know". Depending upon the seniority of the person, I'm looking for good reasoning capability, ability to execute, and ability to communicate. I hired a fantastic engineer out of school. What set her apart from everyone else was her ability to explain why she did something. She didn't merely recite her class projects, she explained why she made engineering choices that she did in a way that was more than enough to demonstrate her technical chops, and her explanations were clear, and she could answer questions in a way that showed real understanding. Since my group was distributed (most of the people were on the other side of the country), communication
I'd say Python. I grew up on C++ and Java. VB .NET was the next step. At the moment I'm infatuated with Erlang. I've dabbled in Python, but ever since I discovered Erlang I dropped it.
Python is a nice way to start things off. It's very powerful and yet very easy to build simple applications. It's great to learn new stuff in and has plenty of reference material online and in stores.
I'd recommend you pick something up that teaches you about parallel processing (Erlang or just general message queuing systems.) The reason being is that with even more cores, this will be the next big problem to overcome (on a daily basis) in computing.
Short term: look at you local job ads
Long term: read Knuth
All Jock units report immediately to Slashdot for a beat-down and *WHOOOOOSH*! Code 15* in progress. Suspect is a balding, bearded, white, basement-dwelling nerd in his mid-forties; he has a six-digit uid and is wielding an unintelligable signature, plus links to his homepage and journal entries.
Suspect is not as likely to confuse or bore you to death as a 3-digit uid'er, but caution is still required. If he attempts to show you his journal entry on Bayesian Filtering, it's a trap! Kick him in the nuts before you start thinking there's more to life than American football and shagging cheerleaders.
Repeat: all Jocks report to Slashdot for a beat-down and *WHOOOOSH*
* nerd replying to a joke with an encyclopedic answer.
some programmers view programming as language design. the construction of abstractions
and their composition is really the same as defining a specialized version of the parent language
with the desired semantics.
if you really care about the topic learn broadly about languages. about how they handle
things like scoping, composition, interaction with the runtime, types, and static analysis.
i guarantee that you and your future employers will benefit
When I was in college, once you reached the senior level Computer Science classes, you were allowed to use any language you like to complete various projects for each course. Most people chose Java, since it was taught in earlier classes, but I explored around a bit in C#, and sometimes submitted projects in multiple languages just for fun. I even wrote a crappy zelda-like game entirely in JavaScript for a web languages class. It really comes down to applying general concepts like MVC GUI design with event handling, threading, network communication, file reading/writing, XML, and algorithms. Once you can use these concepts for one language, the transition to a new one is relatively simple.
Are you trying to learn computer science, or are you trying to learn a trade?
C# and Mono. Forget everything else you have heard. Mono is one and only future of programming in this life.
It sounds like you want your school to make you into the next .NET code monkey off the conveyor belt.
If that's what you want, why are you studying Computer Science at all? It is not about giving you expertise in specific tools.
you had me at #!
Here's the thing. Let's say you find a school, that uses just one language and covers it "in depth".
What does that even mean? Out in the real world, especially iT, no-one is going to think any of the programming experience you had is college is worth much at all. The projects are generally too contrived, and do not present real-world problems that you have with a real team and real customers and real businesses owners and so forth.
So when looking at hiring someone, I'm going to be a lot more impressed with someone who has had a variety of language experiences than someone with a single language and also no real projects. Now if you say you've used multiple languages I may well test you on that, so be prepared to back up what you say you know - but also it's OK to say that you're really rusty with some language so that if you make syntax mistakes we understand why.
It's also way more fun and practical knowing multiple languages, because you never know when adopting an approach from one language even if you are working with another may come in handy.
"There is more worth loving than we have strength to love." - Brian Jay Stanley
I have just finished my first year of CS at uni, i know people across the spectrum from oxbridge to old polytechnics like myslef and it seems most places are teaching theory behind programming in a single language and then once the basics are in the mind my uni expands the teachine quite rapidly by inserting heskel, C variations and ruby. From what i've found if you can programm in one language u can program in any, its just a case of learning syntax. Its all based on logic.
If you really want to impress an employer after school, demonstrate that you've attempted to learn what most schools won't teach you:
1. Source control
2. Source level debugging with gdb
a. Writing gdb macros
3. Writing automated tests
4. Maintaining existing code
5. Working with globally distributed teams
6. Working with experienced programmers
7. Writing documentation and commenting code clearly
Participation in a large FOSS project like Open Office is a good way to learn all of the above.
The last thing is to be sure you have
8. Complete and utter mastery of linked lists, arrays and
hash tables, which are the three most used data structures
by a long shot, at least in systems work, which is what
I do.
9. Familiarity with bsearch( ) and qsort( ), or the equivalent in
your chosen language, and an understanding of when to
use them and when not to.
If you are struggling with weird stuff like scorpion graphs in some algorithms class, just concentrate on surviving. Rest assured that you will never have to deal with one of these in industry. Learn the basics well, don't sweat the complicated stuff after the test, and you'll be fine. But you sound like you need to work with code more. See previous comment about FOSS.
Computer science is not computer programming, but computer programming is a tool of computer science. Computer science gives you the training to determine if a problem is "computable". Computer programming is the tool. With a good computer science background, you should be able to pick up new things quickly and learn how to deal with problems that require a computation.
Try learning a simple assembly language or IL, like ARM or CIL. Or better yet, make up your own implementation (like, some stack-based evaluation system). Then, try writing your own language and see what you come up with. I tried this when I was taking CS and it really enhanced my practical understanding of much of the theory they threw at us.
Actually, this was exactly what they were having us do, I just didn't fully realize it because of all the jargon and terminology I found kind of above my head at the time. But the experience really did help me later think about things like Java and C++ actually work, and more importantly, why.
When Perl 6 comes out, there will be a tsunami of developers falling over themselves to abandon everything else and port everything over to the new uber scripting language.
is learn how to learn on your own. Take what you learned in college and learn to do your own research so that you can learn any programming language, data structure, whatever on your own after college is over.
Keep in mind that technologies change almost every three years or so, which means what you know today may be out of date in three years, or more. So even after college you need to keep learning to stay up to date on whatever technology that you use.
Which means you need to learn how to solve problems, work as a team, work with a help desk, work with quality assurance, meet with people to help in the analysis and design of a program, learn important communication skills in person and in email, learn how to document things, how to do project management, how to debug your programs,how to prototype your program and work in a beta test environment, etc. Most of these things you won't learn in college and will have to learn them from a mentor or on your own, or by trial and error and learn from your mistakes.
While OpenGL and Oracle are not programming languages, I assume you made a typo. OpenGL is a library and a set of API calls, and it is good to learn that so that you can learn to use other libraries and API calls. Oracle is a database that uses PL/SQL for database queries, but you need to learn other databases as well like MS-SQL Server, MySQL, PostgreSQL, Firebird, etc because you never know what an employer might use. You need to learn a variety of programming languages, libraries, databases, etc and then learn how to change and adapt to new ones as needed.
This is very complex and goes beyond what college and Comp Sci classes can teach. For example colleges teach how to write small programs, but employers want tens of thousands of lines of code or more for their large programs that are complex and very hard to maintain and need constant changing and adapting.
Remember, Slashdot does not have a -1 disagree moderation, and no, troll, flamebait, and overrated are not substitutes.
Sounds like a decent mix to me. I see little reason to complain. Specific languages you could learn on your own since you likely don't know where you will end up. College is only the starting block.
Table-ized A.I.
This is probably a rehash (pun intended :-) of other people's answers, but all the same, I cannot help myself ...
... or whatever other -ability the customer wants.
...
... -- that covered some of my first grey hairs), Pascal, C, C++, C#, Java, JavaScript, Perl, PHP, Ruby, Python, and whatever languages I have forgotten (like FORTH, LISP and Prolog). Most of these languages (being functional) are basically the same with slightly different syntax and semantics. Some of the languages are radically different like FORTH (reverse Polish notation made into a programming language), LISP (List processing) and Prolog, where you basically tell the computer what you want, not how you want it done. (I cannot wait until quantum computers gives Prolog or a similar derivative a new lease of life.)
My best programming work is done in a drawing application like Inkscape or Visio.
Long before the first line of code is committed to the harddisk, I have (bar for the simplest of programs) made one or more drawings depicting the interrelations between the modules of the program I am making. Not only does this ensure a modular approach to the problem solving, but it also gives a nice documentation to present to other people. With a bit of verbal grease (knowing me, people would probably say: verbiage), it often makes it possible for me to explain to non-technical people, how the program is supposed to work and that I have ensured scalability, usability
The selection of the actual program language for implementation comes later and is often based on other parameters, like Perl for quick (and often "dirty") solutions that need pattern matching, associative arrays and object orientation, PHP if the solution is not too heavy on pattern matching and associative arrays but is web-oriented, C (or C++ or C#) if I need a fast and efficient solution without (too much) pattern matching and associative arrays, COBOL for one of my customers, who uses no other language (oh yes, they DO exist!)
Sometimes the language is given by the customer, based on whatever capability the customer's organisation has. I honestly do not care. I can program in most major languages like {patting my shoulder} ALGOL, FORTRAN, COBOL, RPG, APL, Ada, COMAL, Simula, BASIC (that covered most of my teenage years and early twenties), assembler (IBM, x86, 6502, M6800, M68000, RCA1802,
So (at long last) the conclusion is: The method is much more important than the programming language. The more you know the better prepared you are for whatever an employer (or customer) may throw at you. And I cannot count the number of times I have created a quick proof of concept in Perl, only to have it programmed in some other language for actual implementation.
Remember, programming languages can be taught, programming can not. (OK, do not flame me! I do know, some programming can be taught, but the most elegant and efficient programming is more akin to creating mathematical proofs or composing beautiful poems or painting stunning pictures, an art, not a craft!)
I don't know. I have used several different languages in the last 20 years. While some may think it's good to be able to display a modal dialog box in 10 different languages, I find it a quite tedious exercise to have master the whims of the latest and greatest (fad) language. Sure, it's all the result of competition and it all eventually will make for higher productivity, but really, I have a project to do now and I don't have time to figure out a new and arbitrarily different syntax just because some manager gets a bug up his ass and decides that this formerly language A shop is now a language B shop.
It seems to me that at some point, it would be better for the industry if at least some constructs always, always, always had the same syntax and usage. For instance...iterations, assignments, math, comments.
The never ending "language of the quarter that will obsolete all others" is getting pretty old and irritating. Jazz, C#, C++, C-+, Swing, Mamba, Cow, Shell, Ahhhhhh!
O'Rielly is going to run out of freaking animals for their books.
When Fascism comes to America, it will call itself Anti-Fascism, and tell you to give up your guns.
What programming languages you know is really beside the point. Computer science is about algorithmic math, problem modeling, combinatorics, etc. Computer programming is the easy bit, you should be able to pick up just about any of them pretty quickly because, as a computer scientist, you'll understand how the languages work, why they work that way, and so on. Sure, you're not going to know the ins and outs of specific libraries and APIs, but you'll have the skills and, hopefully, documentation necessary to use that as required.
Overall that sounds like a pretty good mix of languages. Far more important to get a wide understanding of different approaches than to learn any one language exclusively, and in the short term a mix is also much more marketable.
The only omission is functional programming, which is not yet commercially important but is incredibly powerful - one example is mlvirsh, which is a rewrite in the OCaml functional language of a C-based library, reducing number of lines of code by 85% - see http://libvirt.org/ocaml/README.txt for the stats.
I remember my first year of college, I heard a lot of the students talking about how useless the first class was because we were being taught COMPONENT PASCAL! Obviously, this doesn't appeal to the job market very much, which is what they were upset about, but it was a GREAT first language. It is so simple and easy to read that the professor simply used it to teach basics like loops, recursion, pointers, and object oriented programming, aka the THEORY behind the algorithms. I loved this approach, even though it had little bearing in the job market, because when we moved on to other languages, it was easy to abstract away that specific languages syntax and semantics, and really just get to the heart of the problem. By the end of the major, students learned component pascal, c++, java, lisp, scheme, and assembly, and I feel that having an array of languages really helps me pick up any other language I would have to, because it's just a different syntax.
By the time you get out of college things are pretty much certain to have changed. Learn the same language as everybody else and you'll be just like anybody else. Learn a single language and you will get left behind. The only route nowadays is to learn lots of languages, even if you'll never use them, because you'll be learning the real useful skill which is picking up languages quickly and understanding the differences between them. If an employer expects you to be an expert in their flavour of the month then they're not looking for graduate caliber employees, they're looking for a code grunt.
Quidnam Latine loqui modo coepi?
That's a good list of languages being taught at the university. To be well-rounded in programming, you need to exposed to different programming paradigms. Object Oriented, Imperative, Functional are the most popular. You also need to be exposed to light weight scripting like Bash and on the other extreme low level systems programming in C and Assembly. But as you pointed out, merely knowing the concepts will not get you anywhere. You need to work on your own personal projects and code in your free time to get good at this. A lot of people I know, are very good in programming in college, but they just can't do any real life coding. Only when you start coding on your own can you make your bag of tricks and solve problems creatively.
So ya, Java/Python, C, Assembly, ML/Haskell, Ruby/Perl is generally a good list of languages to choose from
--- Shahriar
You might want to consider Hindi, Urdu, or Mandarin. I assume you are willing to relocate to where all the programming jobs are located...
We are having the very same question each quarter with the very same answer. Can the editors point the submitters to an other very similar thread instead of putting this on the main page of the best news website ever ?
Sounds to me like you want a community college. If you want to learn a specific, fixed list of skills to go straight out to work using those skills, you want a community college.
Learning a broad range of languages will allow for broader knowledge of programming, allowing for better coding even if using just one language, but will also allow for learning new languages much more quickly. C++ only? If you begin using a new language and it's not like C++, you're learning from scratch. With the multi-language education, it'll be like "Hmm, this seems like a nice combination of Python and java" for instance.
You can see where I'm leaning with this I think, I would go for the broad range of languages. But if you do have jobs in mind that *just* use C++ and OpenGL (for instance), then by all means I don't think it'll be a horrible decision to go somewhere more focused.
Having worked as a software engineer for 20 years and taught computer science at the college level for 8, I cannot stress enough that you need to become fluent in at least one language. It is great to know a bit about a bunch of them, but if interviewed many programmers and had many students show up in class unable to actually write a program in some language. They know a smattering of 5 languages, but can't code off the top of their head in any of them.
So... feel free to expose yourself to many languages, but make sure you are an expert in at least one, or you won't pass my class, and I wouldn't hire you.
Since the degree is in computer science ... you should feel blessed you get to program at all ;-)
As a scientist, you do need to understand the concepts and many a computer scientists ends
up doing more math (algorithms and such), devising new ways for machines and humans
to interact and many other beautiful things .... not coding. Programming by itself is not a
science (although many aspects of it can be subjects of scientific research).
Although 'trade schools' may not be the best way to go, some colleges nowadays offer various
programming oriented degrees (such as web developer). A good program of this sort will teach
you how to program as well as the concepts that go along with it.
On the other end of the spectrum: problem solving, computing related concepts etc. in combination
with solid basic programming skills will have you program enough in any language to be dangerous
without putting all your eggs in the same basket (... 'I program well in Visual Basic' does not go
over well during interviews ... 'I have strong programming skills' feeds the kids).
Languages come and go (as they should ... call it progress). Good programming skills stay.
The answer is 54, you just have to know that reads as 42 in base 13.
The discussion in our small software ecosystem about skills and capabilities gets similarly confused. All the marketing, sales and head hunters have no deep understanding about the business of software. In their ignorance, they believe that they don't need to understand us; they are wrong. They are parasites, not symbionts.
To all of them, people like me are an inconvenient truth, an irritating oxymoron, because... I specialize in being a generalist. I dont fit into their curricula, or populations, or territories, or verticals, or skillsets, or . So screw them!, Their opinions, though much publicized, do not matter.
You will see irritating jobs and career adverts that list required skills in excruciating detail, often impossibly so. You may be interviewed by idiots who ask for 5 years expereince in a 3 year old Tech, just ignore all that crap.
I believe that building software should always be fun and practical Any software woth developing, has never been built before, it's complex and hard, but you must think it worthwhile, worth the effort; that's kinda the point.
I am just a happy SOB that got into this business to build real and useful systems for real and useful people. No BS, I figured I would usually get paid that way, for once I was mostly right.
Whatever your reasons may be, I suggest pursuing whatever is interesting and fun and practical. Learn the original meaning of "Hacker", before it was corrupted by the lazy media to be a synonym for "Cracker"
Find the edge, the too hard stuff, the useful stuff, the stuff people really need, the stuff that nobody has done, yet. Then build it, using whatever tools and languages you may need.
Learn how to learn whatever you need to know.
For me... Expertise in particular things... was, and is, a random side effect of the effort to create something useful.
Some people call it experience, mostly I call it irrelevant, or history.
You asked a great question, and surprisingly your school seems to doing the right thing.
Kudos.
Enjoy the ride, and welcome to the real world.
There is no god; get over it already! Never exchange a walk on part in the war, for a lead role in a cage.
I know it can be tempting, but please restrain the urge to go after my lice with a magnifying glass and a pair of tweezers.
I asked the exact same thing as the editor did back when i was in high school in my AP computer programming course. The teacher of mine (who also taught nothing but c++ as his taught launguage) told me that computer languages are emerging constantly, and a solid advanced understanding of one will not only help you in your resume process, but will also show that you have the fortitude necessary to segue into other languages. So, tl;dr (or at least what i got out of the whole question) was to learn a single language hardcore, then maybe spend a few nights with a couple others to learn the differences. Ah well though, i'm unemployed at the moment though, so take what i say with a grain of salt. Heh.
WÌÌfÍ--ÍSÌÒÍ...Í...ÌHÌÍfÍÍÍ--ÍÍÍ
Your future employer won't really believe that you are competent in language X anyway, until you have programmed in it professionally for about a year. So, don't worry about being seen as a newbie when you are fresh out of school -- you are.
.. with the exception of Leet - do not go anywhere near it!
Having written a lot of Perl, from Perl-4, and more recently Python I can tell you that Python is MUCH more understandable than Perl for the COBOL/FORTRAN/PL.1 generation programmers. That is sad but true, and Python is not that bad -v- Perl and is much better understood by oldies.
... gur ...
Perl and C is where it really is. C++ is an overcomplicated mess as the Myres books ably demonstrate, virtual destructors
One thing the whole thing makes clear is that no real consensus on either language or methodology.
Close. Bible bashing is a heated argument between two people of differing faiths where they each try to win by claiming specific passages in the Bible that back them up. It usually gets ugly. The Bible is reinterpreted and misinterpreted so thoroughly that it cannot be used to quell such a discussion. To use a net term - Bible bashing is a religious flame war where the ammo of choice is scripture.
It's a bad practice (I believe: an evil one). It should be avoided.
Your definition of Bible thumping is common and appropriate. I think the etymology of the term is different from those who engage in the practice, though. Many pastors literally slam their Bible into the podium as they preach (Making a loud "thump"). On the other hand, I don't think the major proselytizing religions usually do that. I'm not sure why that term stuck to the wrong group of people. (probably historical significance somewhere)
I won't join Slashcott. OTOH, If Beta goes live, I just won't be back until it's fixed. Sorry Dice.
No one programs in D because no one CAN program in D, but that doesn't mean it's not a great language. Get Computer Science out of the dark ages and ignore the ancient relics that decry it because they can't be bothered to learn a new language. I'm just a hobby programmer, but I want computer programming to evolve to the point where 50 years from now we have a language that is mapped to peoples brain patterns so we can program things easily with the power of thought.
Or do you mean for a job?
The two are not necessarily the same.
I found languages like Lisp, Prolog, and Smalltalk to be of the most use for learning the science. These are not your sweatshop languages, though.
On the plus side, if you learn the science, learning a new language isn't tough.
-- Cerebus
the main thing i'm going to look for is
* someone who can think like a computer, i don't care in what language
* someone with a portfolio: what have you actually built, and can you show it to me ?
i would suggest focusing on the advanced conceptual stuff as much as possible. you'll pick up whatever languages you need along the way, but it's much more difficult to just ambiently pick up a proper understanding of algorithms, computational complexity, math, and statistics (and physics if you're interested in say game programming).
If they teach us only one language, we complain that we're only getting taught one language and that it's not enough.
If they teach us many different languages and more higher level concepts, we complain that they don't focus enough on one language.
We're a fussy bunch hey?
I spent a month and a half living in an apartment beneath a woman with 2 small girls. She was extremely verbally abusive. She yelled at them constantly. I don't just mean frequently, I mean she simple didn't stop an unending stream of insults. I felt like worthless trash just listening to her through the ceiling. Those poor girls really needed some kind of protection.
I will always regret not calling Child Protective Services. There needed to be a social worker involved (minimum).
Your situation sounds worse. You know violence is involved, you just don't know if it has been directed at the kids. (odds are very high)
Yes, call the cops. Yes, call the local equivalent to CPS. If you need an ally, figure out which school they go to and who their teachers are. You may contact the schools councilor/psychologist. They'll know what to do. Besides, if a teacher is looking for signs of abuse, and sees it, they are required (in the US, at least) to report it.
I won't join Slashcott. OTOH, If Beta goes live, I just won't be back until it's fixed. Sorry Dice.
To quote my mentor back in the 1980's, "programming is prose, the language is just punctuation".
A few years ago, one of my junior guys was marveling at a hacked-together bash/sed/awk script that I threw together to do some testing, and asked how many programming languages I knew. I thought about it for a while, and came up with over 20 languages that I have used professionally in my (25+ year) career. Some I know to the depths of their existence (Smalltalk, C++, Forth), some that I became fairly proficient in (assembler, Python, Lisp), and others just enough to debug and extend existing code (Fortran, Perl, APL). Right now I probably couldn't punch out an off-the-cuff program in most of the languages I have worked in, but give me a couple hours to google the syntax and it will come back to me.
What's hard is understand what your program does, and why. THAT is why you go to university.
My boss for my first real programming job (He liked to joke that he "worked" on ENIAC because his job as a student was to sweep out the CPU .... yeah he really did) used to make the distinction between the two approaches as Training vs. Education.
Traiing is just being told what to think, learning how to code in one language and think in one way, it will work for a while and whenthat goes out of fashion, you are left high and dry and inneed of re-training.
Education is learning How to think, what are the concepts necessary to solve a problem what advanced techniques will help you get the job done, choose the right tool etc. education will alwys serve you well and you will realize that languages are a only a tool, the craftsman knows what to use and when.
I can't tell you how annoying it is to work with "trained"programmers that can't solve a problem, but can code like fiends. Those are the people you have towrite specs for that probably take more time to write than if you just wrote the program yourself.
It is unfairto paintthem all with the same brush,but it has been my experience that the offshore programing talent is more trained than educated I had very difficult times getting them to even understand why the results of a program they wrote aren't acceptable (here's how the date is accessed, here's how it is structured, here's what I want, it should look like this. The answers should be exactly the same as this example,,,,, they'd rewrite, and come to me smiling with the wrong results.
Give me one person that I can present a problem, walk away and see thema few days later with good results or good progress and analysis and I'll value them more than 10 or more code monkeys. In fact the'll be in charge of the code monkeys.
Also Ditto to the posts that value communications skills it will always serve you well. I worked in small startup that liked to have the sales force and management bring in the IT guys to besure we were communicating directly, the problem was that my staff was from India primarily and the sales people spoke heavily in sports and movie metaphors, I was able to communicate with them because we shared a culture but my staff just smiled and nodded glassy eyed, they never played Baseball or Football, they never saw those movies etc... it really brought home to me the difference between knowing a language (the spoken kind) and being able to convey abstract concepts through shared culture or experiences.
I actually started a list of movies they should rent and had us play Baseball and Cricket at our next team building outing.
When I look for developers, I will not hire anyone who knows only one programming language, because frankly that's likely evidence that person doesn't know how to -think- about problems in more than one way. (Sapir-Whorf, http://en.wikipedia.org/wiki/Sapir-whorf)
Languages come and go, we're far away from the 'ultimate language' . What's important is (a) ability to think about the problem; (b) ability to do good design based on understanding underlying things such as complexity theory/Big O notation/concurrency, etc.; (c) learn and apply the appropriate technology for the problem; (d) ability to write coherently; (e) ability to work within a team; (f) ability to understand and apply methods and techniques to write correct code (I am -not- impressed by debugging skills. I am impressed by people who treat the debugger as an admission they don't know what their code is doing!); (g) ability to learn on-the-job, including identifying problems and researching/analyzing potential solutions. Ability to write little programs in some currently popular programming language doesn't make my list.
I blame both hiring managers/HR departments and academia for reducing much of computer science/software engineering to mere programming-in-the-small vocational training.
Like others have said language does not really matter (in school). What matters is:
1/ ability to analyse the problem (critical thinking);
2/ ability to find the best answer possible (algorithms, requirements analysis, proof of concept, choose the tool appropriate to the task = concepts);
3/ ability to understand the potential issues and find solutions.
No method of teaching will provide you with proper experience. The only way to get experience is to actually develop a real world application. Get out there (while you study), get yourself a job where you need to use your newly acquired programming skills (you may have to start at a cheap rate, or you may not), get involved in projects (school/uni, Internet) or make your own project with a clear goal and deadlines in mind.
This is what will give you the best experience.
Besides no one can answer which is the best language because there is no answer to that question. It all depends what you're trying to achieve, it depends who you intend to work for, what industry, what type of project...
The aviation industry for instance tends to lag 10 to 20 years behind (though not always); banking could be anything between bleeding edge modern day technology and 30 years old; web companies tend to be on the cutting edge - but there is some inertia too depending how old the company is. Some industries require you to have highly reliable applications with heavy multitasking, others require difficult real-time engineering while some are happy with plain sequential code on a single processor. It all depends on the task that needs solving.
Your best bet is to do some research on the topics of particular interest to you. But well rounded sounds good to me.
You will only get experience once you start working in earnest.
Enjoy,
w
Your question is an oxymoron. You won't get experience in college. You will either learn to think, or you will not learn to think. If you learn to think, you will be hired. If you don't learn to think, you will not be hired, or at least not by the people you want to hire you.
Hiring managers looking for a particular language have a short term problem, and are probably better off looking at rent-a-coder. Hiring managers looking for someone who can think don't give a rat's rear end what language you used to develop thinking skills.
Don't learn a language. Learn to solve problems.
If you can master that, you have proven yourself as a programmer.
My CS university didn't teach a single programming language. I'm happy about that. They taught concepts. Languages come and go. Techniques are more about how to get something done than oddities or quirk about particular languages. Learn the concepts of data structures, data access, communication and you'll be fine. Who knows what language will be important in a few years after you've graduated. When I was in school in the 80s, Basic, Pascal and C were around. FORTRAN was considered dead, but that has so far been proven to be wrong time and time again. Of course COBOL was around too, and I even learned some of that - but I'd never put it on a resume.
Look at it this way. Suppose you wanted to become an auto mechanic. Which tool would you specialize in? Would you study crescent wrench? Or perhaps ball-peen hammer? Or would you go more mechanized, and study only impact wrench?
All if this is silly. Computer languages are tools, not destinations. You use the language that is appropriate to the task at hand. If you aren't intimately familiar with that language, snag a couple of books and learn.
In school, you should be learning approaches to problem solving. Far too many of the current crop of computer scientists are a whiz at a language, but unfamiliar with the concepts of algorithms and measurement of software solutions.
A whole lot of the ongoing and multitudinous bugs in Microsoft software stem from the belief, all those years ago, that decades of computer science research simply didn't apply to PC's.
There is a vast body of knowledge about how to construct reliable software, and how to avoid problems, and not a bit of it worries about whether such software is written in Java, or Eiffel, or C#, or any of the plethora of tools now available.
Don't take life too seriously; it isn't permanent.
Of all the programming languages, English will serve you best, followed by Marketing Speak.
Excuse me, but please get off my Pennisetum Clandestinum, eh!
All my geek friends mocked me for taking such a prissy language in college, but it was the only guy amongst the 20+ girls in class.
"Only two things are infinite, the universe and human stupidity, and I'm not sure about the former."
If you understand the concepts for logic, iterative problem solving and analysis, and the fundamentals of how modular, linear, and OOP programming work, and when to apply which type of design, you can learn the intricacy's of any language. I'd rather work with a someone who is generally familiar with a dozen 'languages' but understands and can apply the above fundamentals, than someone who can whip out an entire application + GUI in C# or Mono but can't break a problem down into it's component parts and if confronted with a PERL application gets a blank stare and says "What's this?" instead of "Give me enough time and I can figure this out!".
There is no way you are going to become proficient in a language through coursework; only working through time on significant projects will build the necessary expertise. An exposure to a wide variety of language forms and general skills will prepare you for a career: i.e., you're going to continually have to learn new, different languages and concepts if you expect to succeed in programming. Believe me, I know. I tried to spend a career in Fortran, and that didn't work out as expected. Now, get off my lawn ;^).
Keep Doing Good.
Can you give some examples of algorithms that are patented? Thanks.
Also, if you're REALLY that worried, just learn to do every exercise for Lisp, C++, Java, whatever you're doing in school, in the language of your choice as well. Don't try to undercut your branching out and learning other language - that will just weaken you in the long run.
"having the expertise required in a single language to land a good job"
If, first and foremost, you are concerned about landing a programming job, it helps to know what industry you're looking to enter. Healthcare and Electronic Medical Records are hot topics right now with a lot of money, private and public, backing it. IT adoption in Healthcare is seen as a panacea for all that ails, and while I may not agree with that directly, there is certainly a lack of trained programmers willing to work in the field. Most EMRs are decades old and use MUMPS as the back end.
http://en.wikipedia.org/wiki/MUMPS
It's quirky, "old" and not OO, but if it's a JOB you want, there's worse things out there than helping deliver better care through M programming.
No battles to the death are recalled. Mumpsman can hit to attack and cause brainsmashing.
Don't go to a CS school. Go to a school that tries to churn out flavor of the month language programmers.
Surely that's obvious?
Actually, I think it's important to understand what "sorting" is and then know how to use the standard libraries (of whatever language) to do the sorting for you.
If someday in the future of your career you need a faster sort, google it up. Chances are the solution you'd find would be better than what you had learned in school (had you been paying attention).
There are so many comments in here this will probably get buried, but just in case: I'm a software engineer of 20 years. If you want to be an engineer, and not a programmer, the larger your toolbox the better. There is a difference - programmers churn stuff out in a given language, engineers solve problems given constraints.
You need the widest exposure to languages and concepts you can get in college. That's what college is for. I hope you end up having to write a compiler, even if you would never actually do such a thing normally. I hope you have to write comprehensive documentation for it, and maybe even do a Gantt chart, even though you hate all that sooooo much. There are things you need to do at least once.
You need C and assembly to teach you about the realities of the lower levels - people without this write hideously bad code because they have no idea what's actually going on. You need to understand pointers and freeing memory even if it's incredibly annoying and you never deal with it again - what it really means that Java/Python strings are invariant. People who've never done this have no chance at all of understanding what a cache line miss is either.
You need Oracle (or any SQL DB) because it's useful to have something to store your data in - you might find non-relational stores like key/value work better for your apps, but SQL is the default and as such a good comparison point.
You need bash because it's used a lot and you need to be punished with some of the worst syntax on earth (bad is good too, it's educational). See what happens when something is accreted rather than designed. You don't need csh, though, because that would be counterproductive.
Python (or Ruby) is an excellent thing to have experience in because it gives you the experience of being (relatively) utterly unconstrained by underlying worries - these languages exist to get things DONE. You can concentrate on the high level algorithms instead of worrying about whether methods are virtual. You can make huge changes to your architecture with relatively minimal code changes and see what happens.
Java is a good thing to know because it's the new COBOL and there is no better virtual machine - it's fast and the sandboxing is unparalleled outside of special high-security setups. The language is intended to be a straitjacket to contain incompetent consultants from doing too much damage on huge projects, but that's still something that's worth knowing how to do.
But if you knew just Python/Ruby/Java without knowing C you'd be cut off at the knees, or at least not suitable for real projects. What does it really mean that objects are just shared references (now that you know what pointers are)? What does it mean that strings (or other mappable keys) are invariant?
I'd actually like to see some C++ in there - as horrible as it is syntactically, it is the zenith of eking out maximum speed and minimal memory usage at the cost of vomitous syntax, and that's worth studying. Used right, C++ templates plus private inheritance let you do incredible things that fail at compile time rather than run time, which is huge for commercial deployment.
Still, you are rightly concerned about your lack of specialization here, to which all I can say is: pick your favorite language(s) and write lots of stuff that interests you or at least a major project. If you can't do that you shouldn't be in this field anyhow. This curriculum is far better than being stuck with one or two languages for your entire degree just because your teachers are cranky old farts who don't want to learn something new. I envy you!
Don't even worry so much about the language - lean the science of computing.
I can't tell you how fustrating it is to work with new and old coders that have no idea how to write solid secure code that will work outside their dev machine. It is my personal oppinion that C# and Java have done more harm to computer science than good. College graduates are ready to work in a sweat shop churning out lines of code without having any idea as to why things function. They are not adaptable.
In order to be truly usefull you need to build a solid understanding of how computers function, how they use memory, how their I/O systems work, and how they communicate.
The best way to learn all of these systems is to actually use the computers. Learn memory management and master difficult concepts. Knowing Java and C# is great - untill one of your servers starts to crash and everyone is pointing fingers. Knowing the deep internals will allow you to work as a great asset by debugging the server and fixing the problem - even when that problem is not your code.
You real job as a developer is to do just that develop solutions.
The most important facet of development is communication.
Languages are going to continualy evolve. Be good at learning, communicating, and developing solutions. You will often find that every project will require you to either learn new langauages or refine existing skills.
Rejoice in your new school. Sieze every oppurtunity to learn the why behind all of the languages. Jump on every oppurtunity to branch out (I.E. take electives in hardware design).
Most of all - enjoy the jorney! I consider Computer Science to be the best job in the world. There are many days that I wake up in amazement that I am actually paid to do what I love!
And most pure CS programs would do well to focus on a tool or two so that students can standardize on the tool and stop focusing on it. Unfortunately, many CS degrees are actually software engineering degrees and give a broad introduction to many languages. So many, in fact, that the students stop learning algorithms and computation because they are so focused on making the particular piece of technology work.
While I feel that it would be nice to get a well-rounded introduction to the programming world, I also feel that I am going to come out of school not having the expertise required in a single language to land a good job. After reading the syllabi, all the higher level classes appear to teach concepts rather than work to develop advanced techniques in a specific language. Which method of teaching is going to better provide me with the experience I need, as well as the experience an employer wants to see in a college graduate?"
Learning to program is not about specific languages - it's about those concepts. You're supposed to be able to figure out how to program in any given language all by yourself, having learned the concepts. The instruction they are giving you in particular languages is just to reinforce the concepts, and a little practice in using them.
If you can't figure out how to master the programming languages all by yourself, then you should not attempt a career as a computer programmer.
If you want to work as some low-level "coder" drone, probably using one language, then you don't need anything more than a high school education. Rather than going to college, there are trade schools that can quickly certify you for that kind of work. A few courses at a community college could also fulfill that. Not sure I'd call it a "career", and you're not going to advance very much. I think there is still some demand for such people; not sure how much. We don't hire people like that at my company or any of the companies I've personally worked for. I did see some at one shop where I consulted about 10 years ago, though. They were using Java.
I learned the most from an internship. I got to see code that others had written...good and bad. Try to modify it. Write my own bad code (that I thought was good at the time) over and over again until I learned what good code was.
My professor back in the day said, "Most computer science professors will teach you a programming language. A good professor will teach you to program." Looking back, he sure taught me to program; to him, the language he used to teach was irrelevant.
Wh47 d1d j00 541, 31337 15n't t3h r0xor5 ne m0r3???
Concepts are what is important. Concepts are what separate skilled engineers from the common coder. Languages are tools which change often, but the fundamentals are generally constant.
I finished college with a healthy working knowledge of C and Java from academic and side projects. I had become extremely proficient in Perl and I also had a year of internship experience in C++. I interviewed for jobs focusing on all of those languages. My favorite was Perl, and I eventually accepted a position which dealt primarily a project that was Perl-based. Six months later I had to do a fairly complex Java project (lasted 3 months). Immediately after that I started a year long project in Objective-C, a language which I had absolutely no knowledge of. Now I hardly code Perl (I miss it, but I do not mind Obj-C much... I'm quite proficient in it by now).
The point is you never know where life will take you. I can attest from experience that switching to a completely foreign language stinks. It can be very rough initially, but if your fundamentals are strong, you'll have something to lean on instead of falling down. Not to mention that a generalist is an extremely valuable position to be seen in by your boss.
It's important to know languages, but they are secondary to mastering the fundamental concepts that you'll take with you for your entire career.
There are 10 types of people in the world. Those who understand binary and those who do not.
And I'm dead serious. Learn assembly, then learn the various idiologies and practices taught at the second school. Once you understand assembly, and become attuned to the oriented design, design patterns, etc..., you will become language and *platform* agnostic(can't stress this one enough), and finally see the Matrix.
Being a mainly C++ cross-platform developer, how long did it take me to learn J2ME syntax? Maybe a day? PHP syntax? A few days? Software Engineering? Still working on that one.
But, at the end of the day, you're just putting 1's and 0's in the right order anyway.
But timothy didn't ask about a software engineering degree. He asked about a computer science degree. Computer science is the study of the topics of mathematics that relate to computation. CS programs should teach theory, algorithms, data structures, complexity, computability, logic, and the like. I disagree with themeparkphoto, though, because I think that programming languages are a very useful tool to teach these concepts. But they aren't the goal, they are only the means.
Do you even work in this field?
If you can't implement your theory, your degree is worthless.
You think you're going to get a real algorithm based design job right out of school?
Get real, there are hundreds of assholes with advanced degrees coming out out of universities every year who also want those jobs.
So you better learn a language that's marketable, because I'm not going to hire an entry level engineer who only knows only languages like Lisp, Scheme, Haskell, Eiffel and Smalltalk.
Think about this: unless you're from one of the top schools, and have recruiters offering you a job based on where you got your degree or you have a Ph.D., you're just another asshole looking for a job slinging code.
And I wouldn't even consider hireing a "trade school" grad to sling code. I have enough trouble finding engineers who have been banging out code for 5+ years who are actually competent, I don't even waste my time with the "trade school" guys. The best job a programming trade school is going to get you isn't development, but QA or help desk. If I see Chubb on your resume, you won't even get a call; you would do better simply claiming that you were self taught.
Seriously, Universities are for concepts and continuing on to graduate level/research/etc. They are not there to prepare you for industry. Fortunately, what they do teach indirectly prepares the student for industry. Namely, they teach you how to think.
Honestly, it takes no time at all to learn a language and anyone that I know that is actually *really* good at any one language can list at least 1/2 dozen to a dozen other languages that they know well to *really* well as well. It's the nature of the beast. The more languages you learn, the better you are. Why? Because, each language requires a different approach (slightly to significantly) to solving any problem. The more you get of that the better you'll be at solving problems in the most efficient way possible.
It's this one language fits all nonsense that really frustrates people who have a clue. I got questioned by a boss once because I wanted to do a project in PHP and not Perl. He questioned my abilities in Perl and assumed that I just wanted to do it in PHP because I was good at that and sucked a Perl. I informed him that I learned PHP to do the project and did that because the qualities of the language were superior in that instance. Even then he still wasn't convinced (btw, he is a politician with zero programming knowledge) and it took a co-worker and my supervisor to convince him that PHP was the best language for that job.
What I'm getting at here is that if you only know one language, then you are really screwing yourself over. Not only is it going to be more difficult to learn other languages, it makes you less employable and makes the job more difficult because you have less tools in your tool-belt to solve the problems that come across your desk. For that matter, why aren't you doing things on your own? I actually learned several other languages during school and afterwards *on my own*. I also expanded my skill set in other ways as well. Remember that the I in IT stands for INFORMATION. If you limit yours, you might as well throw in the towel now.
First of all I'm going to a take a contrary view to other commenters. Most of them are saying "don't treat school like trade school. Learn theory." I disagree. While you are getting a degree in computer science, I'm guessing you don't actually want to work as a computer scientist. You want to work as a software engineer. While you should get exposure to algorithms and stuff and I'm sure you will, what you really need is practical skills that will get you hired. Then you will learn theory on the job. Not CS theory, but software engineering theory which is good coding practices, project management etc. You might need to know some more CS theory in the end, but you can learn that at work as well. The most important thing you can get out of school is a job. It's not like you can never learn again. Anyway, your prospective employers aren't going to believe you have such an in depth understanding of a certain language even if you do. So what can you do. Learn a lot of languages and have lots on your resume. Make sure you don't just know different languages. Figure out what you want to get into and take classes in that (databases, web, systems programming, games). But this "in depth" knowledge thing isn't so important at this stage.
Democracy Now! - your daily, uncensored, corporate-free
I mainly hire developers who are generalists, versatile, fungible and smart. If you can't show that on a resume or in an interview, it is highly unlikely enough engineers at my company will give you a thumbs up for a hiring manager to justify hiring you.
“Common sense is not so common.” — Voltaire
I'm a Japanese-English translator. I translate because I love a good puzzle, and I love to write but often don't have much luck coming up with my own content. Translation fits this perfectly -- I get the content handed to me, and just need to figure out the best way to write it.
Meanwhile, I cannot tell you the sheer numbers of native-English-speaking J-E "translators" who fell into the field by dint of happening to speak Japanese. (It might be the same for native-Japanese speakers, but my limited experience suggests otherwise.) Usually this consists of men who moved to Japan as bachelors, got married to a Japanese woman, and gained passable Japanese language skills. However, they generally lack much by way of social graces, which can be very necessary for properly translating some of the subtle nuances of certain types of text, and they generally lack much by way of writing skills. They're not much fun to be around, and tend to write crap English that would flunk them out of any competent high-school writing class.
Thankfully, this clueless type is not the only one in the field, but good lord, there are certainly more than enough of them. I suspect this is partly due to the whole Japan mystique thing, making me think that translators in other language combinations might not exhibit similar trends. I also suspect this is closely related to the white-single-male-expat-in-Japan "Charisma Man" phenomenon. Unfortunately, what a lot of these guys don't realize is that one of the big attractions of a white guy for a Japanese woman is that he represents a possible ticket out of the country. I've heard numerous tales (some second-hand) of relationships dissolving once the guy lets it be known that he intends to stay in Japan. (FWIW, I met my wife at uni in Indiana, and she ain't Japanese. :)
Cheers,
"What in the name of Fats Waller is that?"
"A four-foot prune."
I have nothing to add. Instead, I'll just quote you.
Being an expert in one programming language is fine if you just want to be a programmer. If you want to be a computer scientist, it's neither necessary nor sufficient.
That was beautiful.
Help stamp out iliturcy.
But computers have millions of times the RAM that they did in the 1980s. There's no longer any need for tight code, and compact data structures. Sadly, the value of knowing assembler is waning.
I say this as someone who's pretty far from an assembly prorammer -- I've only studied and worked with it in school. But near as I can tell, this isn't its only nor its most important value. The value of learning assembly is in no small measure about having some idea of what's going on under the hood when you're writing in a higher level language (eg what does the machine actually do when you make a function call?).
Tweet, tweet.
I'd far rather someone knew how to program, than knew the specifics of a given language. Languages can be learnt as needed fairly easily; the skills required to design and implement good software are a lot harder to pick up, they're foundation that you build on top of.
Courses that spend more time teaching you how to program than teaching you how to program in a given language seem like rather a good thing to me, especially given the language du jour is going to keep changing.
Yeah, I had a sig once; I got bored of it.
When I was working on my CS degree I did not have a preference for one language. My methodology was simple. Analyze the problem and see what would work best. For a couple of projects I used Java. For another project I used Lisp. When I had to turn out a solution quickly and where having an OO solution would have been an overkill I used C.
LISP because you should learn that a really restrictive syntax can still be useful - and to covet less restrictive languages for what they attempt to be
FORTH because you should understand RPN and how to really use a stack when it makes sense
Assembler (or better yet, machine language) so you can appreciate what goes on at the hardware level and truly understand why you should revere and worship compiler writers - or better yet, if you have the math ability, become one - they're getting scarce.
Fortran because you should understand why scientists like it so much and why you should not annoy them unnecessarily about this
PL1 so you can appreciate just how much cruft can intrude on what might otherwise have been a truly useful language, all in the name of being "the only tool you'll need"
Having done this you'll be prepared to learn any language's syntax and understand that in most cases it is the libraries that you really need to learn and appreciate. You'll learn the language that makes your employer happy or that is most relevant to the project at hand - and probably keep on learning languages for the rest of your life. I know - I've never stopped - forgotten more than mentioned above by at least an order of magnitude.
But if you want to sit in a cube farm and crank code day after day then by all means, learn and live with only C++ or C# or even Java. Personally, I'd rather hire someone a bit more flexible.
Been there, done that, paid for the T-shirt
and didn't get it
Sucky Lines Of Crap?
Well, let's just say my 2nd 5,000 sucked less.
Knowledge is how to play a game, intelligence is how to win, wisdom is knowing what game to play.
One of my professors said, "If you wanted to learn a programming language or tool, you should have majored in Computer Information Systems. Computer Science teaches you the foundation and from that you will be able to understand the languages and tools that are built on that foundation."
You all forgot one thing: parallel. Bubble sort is awesome when massively parallelized.
Read your Knuth.
And now, get off my lawn ;-)
There is a difference between an intimate understanding and just translating the words. Dylan was great because he mastered the English language to not just follow the rules, but bend and break them - "When you ain't got nothing, you got nothing to lose."
Every programming language has it's own little quirks that must be navigated. High level concepts may translate across languages, however, the most elegant implementation is often derived from experience.
Different skill sets can be applied to the same problem and come up with different solutions that work. There is no perfect curriculum for a particular job, success ultimately depends on how well one adapts their toolset to meet the needs of a particular task.
D6 63 0D 70 89 81 BB 8E 7B 7C 5F 5D 54 EA AB 73
He who dies with the most tools wins.
All languages are tools and this should be taught at college/uni/whatever.
I have a terribly inquisitive mind to the point of distraction which means my projects tend to grind to a halt while I figure out the most effecient way to deal with something, rather than getting something to work at all.
This is why I started off learning C and ended up with assembler,
Looking back I learned more about stacks and and data structures using assembler than I did using Java.
I think it is most helpful to see what C code gets compiled into and how it could be optimized using other assembler instructions. I saw a wonderful example of this for x86 for arbitrarily sized integers. One or two instructions could be exchanged for a whole bunch of logic in C.
Java can be really bad if taught before any other language.
"An Object is not a pointer, it's a reference which just happens to throw NullPointerException when it doesn't point to^H^H^H^H reference anything" this confuses the hell out of just about everyone I met when passing objects into functions.
I wide variety of languages should be taught at what they are good for.
Prolog for weird stuff
Assembler to see how the guts work and what a pointer is.
C for reasonably simple maths based stuff
C++ for code that is to be maintained and developed
Java similar but also for throwing portable undefined instantiable objects across a network.
Interpreted/scripted stuff for getting stuff done quickly in an afternoon to get your boss off your back.
You kiddin'? Good code is exactly like good math: make things as pretty as possible with minimal effort. You build tools to take care of the grunt work, and the best ones start with "say... haven't I done this before?"
you can have my violent video games when you pry them from my cold, dead hands.
Prime UID Club
Should I learn lots of languages or not? Will a prospective employer want lower-level skills in lots of languages or higher-level skills in one language? Well, obviously they'll want skills in whatever language they typically use in development, so the trick is going to be choosing the correct small range of languages to learn (possibly one really central one). If you want to study computer programming languages, you will need to study a range. If you thoroughly understand one language, picking up others will be no trouble anyway.
Do I need to learn programming through a formal education process or can I pick it up myself? While it is probably true that most developers learn the languages they use through trial and error, it is also true that most developers create crappy code. You need to understand how to use programming languages properly and a well-structured education will help with this. A really good grounding in general object-oriented software design principles is probably equally valuable here, though.
So which language should I go for? Well, the customers I deal with (banks, petrochemical, manufacturing, public sector...) predominantly use non-Microsoft environments for their servers; mainframe, Linux, HP-UX, AIX and Solaris are all popular, although there are obviously a few MS servers in the mix as well. C# only really runs on Windows (certainly using runtimes which large corporations might choose), so that is going to limit your options. COBOL is widespread and a great choice if you want to spend your life repairing ancient code. FORTRAN isn't used much in business, if at all. Assembly language is far too hard to maintain. Java (JavaEE specifically) runs on all useful platforms and provides a range of options to cover all eventualities. I'd go for Java, but you might have other interests.
Should I be learning programming at all? This is an interesting question. If you're living in a rich country, such as the US or somewhere in Western Europe, you may well find that all the programming jobs you might have wanted to apply for are now available elsewhere - in India or possibly Eastern Europe. You might be better off focussing on design and architecture than real source-level development.
If you are doing crypto and coding libraries, then probably just C. If you are doing web, then php might be good to learn. I personally find that for most of my uses, python wins out. But I think if you are going to do anything unixy, then you need to know Bash; especially on Linux.
Bash
C
Python
Php
SQL
That gets me by 98% of all things.. I don't do Java because anything lower level should be C, anything higher level should be Python. But that's just my opinion YMMV.
Congratulations! You've discovered the difference between college and technical school. Now it's just a question of which you should attend.
I once heard a teacher answer that question, 'Greek or Latin' - a somewhat elliptical response but he went on to explain the way he valued multi-lingualism over mono-lingualism and education over training. I saw his point. More recently, I've had the opportunity (privilege) to employ student cadets and early career CS graduates. I found that it didn't matter what languages they had experience with but, if they were smart, well-educated and well-motivated, the time it took to become productive in the required language was insignificant.
The latter approach is the better one in the long term.
You are expected to learn any programming language to actually use
by yourself. The university gives you the basics, a broad overview,
and the tools you need to learn these.
It is also a common mis-conception that youâ(TM)ll be employed immediately
after finishing university. No, really not. University does not prepare
for the workplace. You need more real-life experience than that, which
is why universities (donâ(TM)t know about America, but over here they do)
require at least one internship be passed before the diploma can be
achieved. You will learn real-life work skills there, and (in case of
a programming job) get real-life programming experience, which is dif-
ferent from merely learning a programming language.
Trust me if I say that, with some shell languages such as mksh, you
can both _script_ and _program_ in shell, such huge is the difference.
Most never see the latter niveau.
Iâ(TM)d suggest you use the university time to _really_ get to know the
basics of as many languages as you can â" including functional and
other âoeweirdâ languages. Gwydion Dylan, Haskell, LISP, you name it.
Then, do your assignments in various languages for play; youâ(TM)ll find
out which ones you like/dislike and which ones are better/worse suited
for the task at hand. Bonus points (to you only) if you do some of the
assignments in two languages (probably using *different* algorithms â"
tailor the algorithm to the language used, not to the theory related
to the assignment, as academics want to make you).
Note I know both the academic world and that of âoecraftmanshipâ, Iâ(TM)ve
seen both sides.
My Karma isn't excellent, damn it! (And
Bubble Sort is needed so you can take and pass those stupid "pre-job" tests. That's about the only use for it.
Algorithms and data structures are what you need and a healthy overview of a bunch of languages so every problem gets the appropriate tool.
Learn flex and yacc too.
1 week.
2 weeks if one is really dumb.
Do you want that narrow aspect of your education to have such a decisive way in your future?
I would have been elated to have learned more languages when I was in Uni.
What is wrong with you!?
IANAL but write like a drunk one.
When I was working on obtaining my MSCS degree, I took a class in programming languages - specifically designed to teach us that different programming languages are good at solving different problems. I learned more in that class than any other single class I took over the years. Struggling to solve a problem that requires recursion with a language that does not allow recursion is a real eye opener. Looking at the results from a problem solving session like that, with one set of code taking many, many lines, and a second set of code taking only a few lines has an impact on you that can last your entire career. Stay the course. You will be much better prepared to tackle problems in the "real world" if you have training across several languages, and you know the types of problems that each is best suited to address. Just my two cent's worth... smp
But timothy didn't ask about a software engineering degree. He asked about a computer science degree. Computer science is the study of the topics of mathematics that relate to computation. CS programs should teach theory, algorithms, data structures, complexity, computability, logic, and the like. I disagree with themeparkphoto, though, because I think that programming languages are a very useful tool to teach these concepts. But they aren't the goal, they are only the means.
You don't know what you are talking about. The mathematical models of computation without physical boundaries (think Turing machines and their infinite tapes) provide an upper limit (or lower limit in many cases) for what can be done. Then you have mathematical models that take physical limits into consideration. Enter programming languages. You could mathematically model what you can or cannot do once you have physical limits imposed on you.
There is also type theory, compiler theory, programming language theory, theories of usability, issues regarding extensibility, maintainability, entropy of source code over time, requirement analysis, program verification, etc, etc, etc. Programming languages is where problems and solutions expressed in pure mathematical models meet their physical-bound representations.
Software engineering is an offshoot of computer science, and neither can you have the former without a background in the later, nor have the later being taught as a facilitator of the former. Furthermore, software engineering is the refinement of one of the main questions in computer science: how do code?.
To presume you can have a computer science degree without a solid foundation in programming or the basics of software engineering is utterly ridiculous. Programming languages themselves are focus of study in computer science, and they provide constrains on how fundamental concepts get implemented. There are costs and ROI factors in implementing something with a given language or technology, and that is also another focus in computer science.
Computer science is not some blindly seeking pursuit of mathematical models of computation. Computer science is about those mathematical models and the EFFICIENT models of transforming those into solutions to REAL WORLD problems. You can't have that without a solid programming/software engineering background.
And most pure CS programs would do well to focus on a tool or two so that students can standardize on the tool and stop focusing on it. Unfortunately, many CS degrees are actually software engineering degrees and give a broad introduction to many languages. So many, in fact, that the students stop learning algorithms and computation because they are so focused on making the particular piece of technology work.
What's wrong with many of these schools being software engineering schools? That's what the industry need.
Besides, a good software engineering school is also a good computer science school. If it fails to teach what you claim to be teaching for pursuing programming language practice, then they are not only bad computer science schools, but bad software engineering schools as well. You can't be a good software engineer without being a good computer scientist. Besides, this alleged problem that you describe (which does exist btw) belongs to a different category of problems to be discussed.
You are simply creating a false dichotomy just for the purpose of fostering your weak line of argument.
This may not necessarily be the ideal approach, and, I don't think there actually is one when it comes to learning how to develop software. First, learn C. This will give you a fundamental understanding of low-level programming concepts while at the same time using a language that is still important in industry. Second, learn C++. C++ is a natural progression from C in order to introduce object-oriented concepts. Lastly, learn Python. This will give you a good understanding of higher-level languages. If it turns out that Python is your lifetime language of choice, all is not lost with your C training. Obviously, the concepts learned remain but Python and C are highly interoperable.
APK, you really know your stuff, but god damn your style is a PITA to read. It's like English in a Lisp + Mindf*ck wrapper...
let's keep this topic relative to a career...
Yes, you need to be interested in programming, know the concepts, etc... but in a more practical (career-wise) approach...
More often than not, YOU do NOT dictate the programming language... at least not initially (and to do this *requires* familiarity with multiple languages, strengths and weaknesses). So... you absolutely SHOULD be comfortable with more than 1 language.
I would probably choose between hardware interaction (low level languages), and application development (no device drivers, etc... also uses higher languages)... then become familiar with 3 to 6 of them.
I prefer app development, and I'm profecient with VB.Net and C# (yes, I'm on the MS side) and SQL. I'm familiar with: C++, Java. My hobby time will explore F#.
If I were to be on the hardware side, I'd probably choose: Assembly, C, C++ (maybe C# since it supports inline assembly and such).
Web dev would probably include: ASP.Net (VB or C#), Silverlight, Flash, JavaScript (maybe Java applets).
Other esoteric languages exist as well, such as Extreme or Cobol... I'm aware of an ERP that uses FoxPro. (and I've had to support that at times).
find your interests, then figure out which languages are most common/useful. All languages will have their strengths and weaknesses... and eventually they blend (generics and functional programming in .Net) as they mature. Knowing the concepts and benefits helps take advantage of these new features as they become available.
It sounds like your new school is trying to give you an education. In my personal and professional opinion, your computer science degree should not be illuminating you on the method of preventing memory fragmentation in C++, it should be teaching you about how languages (such as C++) ultimately make use of hardware (such as memory) and what the potential unexpected pitfalls could be. You shouldn't be thinking of your degree as a 'degree in ' but as a degree in computational science (or similar.) Sadly, there are many schools out there that have 'Computer Science' degrees that are, in actuality, software engineering degrees - or worse - programming degrees. Now, my school was very heavy on theory, but the practical applications of that theory in the labs and software projects were language independent. The profs didn't care what you used as long as it worked well (stable/useful) and your code looked like you'd given some thought to its design and layout ;). Needless to say, only about 10% of the people who started CSCI at this school finished - not because it was particularly difficult (though it wasn't easy) but because it rapidly separated those who wanted to tinker from those who really were interested in computing.
Anyhow, I think you should be glad that your new school doesn't focus on a given language but instead on theory. Now, it is up to you to develop the practical skills to embrace and extend (and perhaps extinguish) those theories.
It is very easy to get to know a language intimately, write complete applications - not samples.
Good luck :)
Loading...
Learn C++ early on. I thought it was a mistake that in my college they over-simplified with java. I'd say as I am finishing up my degree, its annoying to not only have to learn high-level concepts, but also be bothered by trying simultaneously to get used to the syntax/concept of pointers (an & and * should never be in a language... pressing shift takes time). Java's simplicity should be a luxury, not a way for profs at the low-level classes to have overly-abstracted courses. Other then C++, I'd say LISP would be your best bet. Even though LISP has the simplest syntax, it's versatility makes it the best one to learn.
Expose yourself to as many useful languages as you can. Learn a bit about the (business-wise) useless ones too -- they can still teach you a thing or two. The really important thing to learn in school is the theory of developing systems that work, and doing so as simply and elegantly as possible. Any company worth working for will pick up on that. If you really learned from your CS degree, learning a new language will simply be a study in syntax. For a true nerd, it is easy enough to "master" the nuances of a specific language in your free time; learn as much of the hard stuff in school while you can!
Turing machines, finite state automata, asymptotic time complexities, proof by smallest counter-example using the Well Ordering Principle.. mmm that's the good stuff! :)
In the short term, a language focused course is better. It will help you get a job(so long as the language you want doesn't go out of style before you're done. If your goal is to get your foot in the door, then a language based course will probably help you do that(depending on where you live and what kind of jobs you're looking for). That's not an unworthy goal, and a lot of people go down that route, if you have a good course, one which actually teaches you how to use the language as opposed to just how to pass the certification, you'll probably get a lot out of it.
The problem with this approach is that it really binds you to a certain track in your career. You'll essentially be an expert in a certain language, which may or may not be the language you want to be in at any given time, and the skills from that language may or may not be easily transferable to another kind of job or another language, and it may or may not be easy for you to break out of the patterns which you have learned and do something else.
In the long term, knowing a bit about the theory is somewhat helpful. That's not to say that you should be going for a pure computer science degree or anything, personally I don't think that pure computer science should even exist at the undergraduate level. Leave all the largely pointless stuff to people who actually want to do research, there are very few jobs for that sort of thing, the competition is fairly fierce, and perhaps most importantly, most of those jobs are a lifestyle in and of themselves and require you to spend so much of your life at work that you probably won't have much time for anything else like a family. Nothing wrong with that, but it should be something you select fully knowing what it is, not something you ended up in because you didn't want a Business degree.
Personally I went through a degree program a lot like your new one(UW-Madison if you're interested), and while I don't use a lot of what I learned directly, the ways of thinking and the theory I learned have been quite invaluable as part of my career. I can also say that, while I use Java as part of my job these days, it has very little resemblance to the java I learned back in university. In those days, servlets, JSP, and all that sort of thing didn't really exist in the Java language, let alone beans or anything more advanced like that. You can take that however you like. That said, I graduated when things were still pretty bad after the dot com crash and I had to go halfway around the world and work in support for a couple of years to get where I am today, so there's pluses and minuses to any option you might take.
My university taught Pascal (granted, this was a while ago, but nobody used Pascal professionally). There were survey classes that covered other languages, but Pascal was the core language of the program. Other students, upon graduating and looking for jobs, would ask, "Why did they teach us this? Nobody is using it."
But the actual language makes no difference. I started off doing PL/I professionally. Then C, then C++, now C#. Technologies change. If you can't adapt right out of college, you're definitely not going to be able to make the transition every few years to whatever the new thing is, so you may as well find another career.
bah.. don't worry about what language you are learning. learn how the machine itself works (memory, cpu, busses). next, learn how to write a compiler for something like fortran. next, learn how they wrote compilers for things like c, java. Play with javacc, antlr or similar and create your own parser. imho, if you can figure out how a compiler works, you will pick up any programming language you come across with minimal trouble.. learn the basics and the theory behind them and then you can learn the rest as you go. if you are going to college to 'learn how to program in language X', i think that you may be missing the point.. The idea being that you should be able to teach yourself how to express an algorithm in some specific language.. Trying to pick one or two to be really good at sort of pigeonholes you.. I bet that, given the time and motivation, you could figure out how to use to perform , provided you understand the task from an algorithmic pov.. it may sound silly.. but actual engineering courses may help you learn about the software engineering.. Try taking an EE or ME course, just to get an idea of how unlike engineering much of SE is :D
SE is all about measurements.. the real question, to me, is this: what are you measuring and what exactly do your measurements mean?
in classical engineering, these questions are often 'black and white' - that is to say, there are usually answers..
in SE, these things are much less clear..
You can't learn to be a good SE by taking courses.. THe theory does help but you must, in the end, learn by doing.
I recommend joining some open source projects. Get experience.
A BSc is nice.. A MSc is nicer (depending on the school, of course...).. Actual experience working on projects will often trump the degrees :D
What sort of software do you like working with? I'm pretty sure that you can find some open source project that is looking for someone just like you to help it along. Work with a team, see how it is done..
That being said, you may find that the open source development is not a whole lot like 'industry' development.. But experience is experience.. Go ye forth and get ye some!
The OP should realize that software development comes in many flavors (and quite frankly intensities). To suggest otherwise simply highlights a lack of understanding of software developmet outside of the scope of your own experience.
To suggest the C# is a prime candidate for scientific modeling, firmware development, visualzation, etc... is just as ridiculous as offering up C/C++ as a candidate for developing a line of business web-based application. Different types of software development have different applicable tool sets. What would be chosen in one context, may not be chosen in another. I would not begin to suggest which type of software development is "superior," although I'm sure there are those that would try to tell you that one is over another. The challenges that one team may face may be wholy different than another. Some types of development call for a higher level of technical aptitude which a more business oriented developer may find themselves ill-equipped for. In the same fashion, some business situations may find a highly technical programmer scrambling to cope with the requirements for business knowledge and certain soft skills.
The OP should give good thought to the type of work they want to do as a CS degree may not even be the route you want to take. If, however, CS is thr proper route for you, I think your institution has the right idea as any good program should be putting the emphasis on these types of concepts and less on the actual implementation. Anyone I know that is worth their salt as a programmer or developer will tell you that the language is largely irrelevant. I've seen fantastic developers take on projects implemented in technologies they don't even know and not break stride. Once you know the fundamental concepts behind software development, I think you'll find that any language's syntax and feature set is only a quick read through a book away.
It doesn't matter which langauge / methodology / whatever you do in your course. Its VERY HARD to get any job at the moment - in case you have not noticed.
You will be very lucky to land any position other above graduate level - and employers (mostly) know this means you are only now going to start learning how to do stuff in the real world. If you really want to work in software you would be better to stop worrying about the content of your course and get yourself out there working voluntary part-time and making some contacts / good impressions / experience.
If you wait till you are finished it will probably be too late.
Neither is Oracle.
The fact that you do not even know which of these topics are actually programming languages shows how absolutely worthless your original training was.
OTOH, I make a fair amount of money teaching programming languages to people who went to schools like your first school. They know C, or they know Java, and now their company is switching to C++ or C# or some other language and they come and take my classes so they can keep their jobs. They don't know enough to be able to teach themselves a new language. That was a skill their "school" didn't teach them.
BTW, none of the languages I teach existed when I was in school back in the 70s. But, I went to a school where the professors gave home work assignments in what ever language was appropriate. They would give us a hand out detailing how to do simple I/O write a function, create a counted and conditional loop and let us go off and do the work. Could be LISP one week, and FORTRAN the next, with a COBOL chaser... The second course every CS major took covered *concepts* of programming languages and taught a common way to look at them.
I have never taken a class on a specific language since I left college. (And only then to push up my GPA. All language specific classes were for non-CS majors.) Yet, I can read a book on a language and go teach a class about it to college educated "programmers" who do not know how to learn a new language.
One other thing, some companies change languages by trying to retrain their programmers and firing the ones who resist the change or who fail to learn the new language. Others just fire everyone who doesn't already know it and hire new people who do.
Stonewolf
I myself graduated from a similar program at Indiana University. It has served me well. When I first graduated I felt like you said. I was Unsure of whether the concept and theory would translate into something useable in a real world project. It did.
One of the most useful courses I took in college was one called Programming Languages. It was a 300 level course that attempted to explain the way programming language are implemented behind the scenes. We used Scheme (a lisp based language). Using Scheme, we were able to implement a variety of other languages. For one project in the course we implemented a scheme interpreter inside scheme, then translated the code via some formalized transforms into C code. This meant that at the end of the course we had written the core of a scheme interpreter in C.
After a course like this you should have no problem picking up whatever language you need for a job. You will start to see how with a little massaging they are functionally equivalent.
Just don't tell them you don't know a given language in an interview.
So here is the skinny on companies for developers:
1) The guys who use you like a tool:
- Want you to know a specific language already and expect you to be able to churn out code like a bored Amish wife making butter.
- Don't care about how much "programming" or "conceptual programming" knowledge you know, rather just want the job done.
- Usually pays pretty low.
2) The guys at say... IBM:
- Expect you to know your conceptual programming knowledge
- Expect you to know at least one language pretty solid so that learning other languages (such as their legacy languages like PLMI) comes easy
- Expect you to ESPECIALLY know how to make your code run 100% efficiently (I.E. knowing performance statistics compared to other languages, and how they run native on some machines, etc.)
- Pay scale is usually pretty baller for a developer in this kind of field
So it's pretty much either one of those. It's useful when you know a lot of languages because its like having more tools on your work bench. If you don't know how each tool works or how it can be used outside of it's "functional" schema, then there's a problem. School can't teach you what you need to know necessarily, it can only provide the foundation for experience to be constructed upon. In other words, think about the job you want in the future (somewhere in the realms listed above), and then study accordingly.
And learn that. Programming is about money or it's mental masturbation (not that there's anything wrong with that!).
Please do not read this sig. Thank you.
Take the classes in the other languages. It will help you.
Proverbs 21:19
Don't worry too much about learning a particular language. If you understand the core principles of good programming practice, you will be able to readily take advantage of the feature set of almost any good language.
In this regard, I think the best book to learn and reinforce the fundamentals of computer science would be Abelson and Sussman's Structure and Interpretation of Computer Programs.
http://mitpress.mit.edu/sicp/full-text/book/book.html
It uses the language called Scheme, which is a *very* slight variation of common lisp that is much simpler. Lisp is already a very simple language due to its regular syntax (sometimes thought of as "lack of syntax"), and yet it is wickedly powerful and succinct.
All this being said, if you *really* want to get the most mileage out of learning a particular language, learn C. It is the inspiration for the syntactic nuances of most new languages that have been created over the last 30 years. It has been the common-denominator-language that all software developers share.
So NOT true.
If money is the only critera you care about then you already made the wrong choice by becoming a Software Developer.
"Computer Science is no more about computers than astronomy is about telescopes."
If it teaches software development methodologies, or specific languages then it's not a pure CS degree. It may well be more valuable for most people - but call a spade a spade.
Is that from SICP?
I watched a few of the lectures on Youtube - that opening tirade about "Comp Sci is not Computer Science" just struck me as a waste of breath... And it missed the point that learning to understand the process of problem-solving with computers is part of the path to understanding of the science behind it.
Bow-ties are cool.
I make the hiring decisions at my company. I check to see if people can solve complex problems. I don't care what language you know. You can learn PHP in a couple of hours.
Sadly, it takes much, much longer to unlearn it. :)
Bow-ties are cool.
If you think you go to school to learn how to program/gain experience programming, then it's time for you to switch majors. Broad exposure to several languages is the better system, IMO. It's then all on you to take it home and gain the experience by practicing and also by studying other people's better code.
That's a nice luxury if you can afford it. Many of us are neither artists nor wealthy enough to make those choices.
I'd also like to point out that you can love software development AND find the language that generates the most money. There's nothing mutually exclusive here. It's just a strategy.
Please do not read this sig. Thank you.
Hi there, What I have learnt from my personal experience is that a Computer Programmer is the compound of programmer, graphic artist, data librarian, psychologist, manager & technical writer.
:) ), Online Banking System and a lot others.
:)
Main skills to acquire are solid concepts of Data Structures like Binary Tree, Stack, Heaps etc. Algorithms, solid programming concepts. Some personal skills required are innovation, determination, team player and thinking out of the box.
The best languages to start getting all the datastructures and algorithms into your bones is C & C++. Then once you have mastered all this then you should try to be innovative and apply these acquired skills to real world application.
During my university years, I was taught all languages from Assembly to COBOL, C to Java. But, I only took one language seriously and applied all my concepts in it and graduated. I used to do several softwares just for fun and ended up earning money out of them to support my studies. The projects I still remember were Chess game, Net Sniffer, Customized Compiler (I called it Nazeer++
I read in the thread that you should also learn SQL, well you must learn SQL as there is no business application that doesn't do data manipulation.
What I recommend is, gather some of your college mates with similar interests as yours then start working together on a project. Do everything as it should be done. Do proper documentation, analysis, timelines & stuff and start cracking on with it. Get to the bottom of every detail untill you can see the electrons flowing through your hardware.
Cheers,
Mo
Why do so many programmers love to re-invent the wheel constantly? To un-solve the solved problem? To write their own instead of using the one that Javascript, or C++, or .net, or whatnot provides in a single freakin' line of code? Ugh
Because sometimes the library version sucks. One example I read about was from Id Software. They discovered that the library memcpy routine that came with their compiler wasn't optimized well at all. They wrote their own in assembly and sped it up 4 times or something.
Now, of course this approach doesn't work in Java if you want to keep it portable. Certainly, knowing when to do this in a work situation is important. However, I believe good programmers want to know how things work under the hood, and will sometimes find better ways to make the engine run better. The easiest way to do that is try another approach and see if it makes a difference.
For all intensive purposes, "whom" is no longer a word. That begs the question, "who cares"?
I won't disagree with others that concepts are more important than teaching any one single language - they are, and if I put a curriculum together myself I'd teach no less than 6 different languages.
However, concepts are not the apex of a degree that colleges (and professors) make them out to be either.
Students need a balanced approach between implementing software (programming) using a number of tools (languages) and the theoretical. Sadly, computer science has largely gone theoretical, almost to the point of complete uselessness.
This is partially due to the maturity of the field - it's still highly immature, and I don't simply mean that programmers are immature - there are quite a number of very mature programmers. The field is just young compared to all other fields. For example, we need to get over the whole 'programming is art' thing and grow up - yes, there is an artistic aspect to it, just as there is to building a bridge or a car, etc; but it's not all about art, it's about building things. (If you don't agree, then you'll certainly be making a fine example of what I mean by the 'grow up'.)
We also need degrees that work through problems better, encourage innovation, and teach how to learn from our mistakes. This is the essence of an engineering degree. Talk to a mechanical or electrical engineer about their undergrad program - it's rife with pitting students against each other for the best methods, and upping your score by showing how you learned from the mistakes you made in the design, the whole 'why didn't it work as expected'. Yet, this is exactly what is lacking in nearly every computer curriculum. Students are taught to be code-monkeys ("I told you do it this way, so you better do it this way") with in-flexibility ("well that's what the professor said to do"), and severely lacks on the learning from mistakes. Sure you have to work through a debugger to find the problem - but what about when you design the program, hit the dead-line, and it's still not working? Give up? Re-write? Or dive in, learn what you did wrong, and report on it?
Yes - I'm pushing for a true software engineering degree that exists as part of every engineering department, not an off-shoot of the mathematics department. Teach the theory, but balance it with implementation. Doesn't have to be anything grandiose - but it does have to prove the points, teach the underlying principle, and give the students opportunity to learn from failure (what went wrong? how could you have avoided the problem?) as well as enjoy the success of competition (who can do it better?!).
Truth is like the sun. You can shut it out for a time, but it ain't goin' away. - Elvis Presley (source: imdb.com)
Your new college knows exactly what they are doing. Well at least by exposing you to multiple languages. Hopefully, they are also giving you a strong learning foundation on which to build future knowledge. Because trust me, the language you learn today is unlikely to be the language in use tomorrow.
When you first get out of school you'll find that many positions in software development wants "real world" experience. The only way I found to break through this barrier was to show them how quickly I could learn new languages because of the good foundation my education gave me. I'd make it your goal to learn the details of how programming languages work and how to develop logical algorithmic solutions to problems. These skills will undoubtedly come in handy as soon as the next greatest programming language ever comes out. ;^)
Learn software development.... not languages.
In descending order of marketability for a developer. If you've got one from each category, no new language is going to challenge you all that much.
The languages mentioned in the article are all fairly similar procedural languages. Choosing such similar languages makes it difficult to convey the breadth of powerful programming practices and paradigms. A good programming curriculum teaches all of the major programming paradigms, first using languages which emphasize those paradigms, then multi-paradigm languages, then making sure that the student can use any paradigm in any language. Along with learning one or two procedural languages, one of which should be C, I would recommend Squeak, Clojure, Haskell, Mozart/Oz, Curry and Flora2.
_Greg
As a now old software engineer, this question, and some of answers sadden me bit!
If there are unquestionably somewhat better languages "du jour", that is not what is so important.
What is important, is to understand what you do!
And if you write a very nice piece of code, in say Pascal, rewriting it in C is very easy.
What counts as suggested above, is the quality of thinking in the algorithms, this is where Donald Knut, Dijskra, Tanenbaum, and some other great name in computer science have put the emphasis.
To get a job, indeed requires to know the language use for the project.
But if you know any structured language, going from Pacal, or Algol to C, requires very little work (excepted for the tools... which are also important).
If you know one OO language going from one to another is also quite easy.
For the libraries, they tend now to be multi-languages...
Programing in assembly is almost another discussion: it is the language used for "low level logic", and if you have written lots of assembly for one machine, you will have no problem writing in assembly for another! (It take some time though). But here you need to understand low level logic concepts. (Borrow, carry, shits, etc...)
Same for use of pointers: it is almost language agnostic! Just learn how to use them for linked lists, functions calls by mean of pointers, ashing algorithms, and more...
About SQL, it is more an application, than a language... (See the OSI seven layers.)
About languages, I tend to regret that some of the very best languages ever designed, Prolog (A Lisp derivative) and Eiffel (OO language with smart assertions support), are rarely used, and so far poorly supported by the open source community.
Here the accusation that the open source community copies a lot, and creates little is unfortunately verified. Human nature may be?
About tools see:
SED, TECO (old but amazing!), TEX and LATEX, any excellent debugger (Don Knut mentioned that his language of choice was the one with the best debugger, I agree!).
TAGS (see etags, ctags, gtags).
I was too long. Sorry.
A.G
c++ ftw learn some BASH too if you want to be good with linux which is IMO just as important to know for developers
Weird-- Oracle isn't a language-- it is a database. You can use SQL(which is a language) on Oracle(database). I am not sure why they are still teachning assembly-- most view assembly as not really helpful in an academic environment as we now have and have had compilers for ages that work well and well if you want to write a compiler 1. you are a geek and 2. you are reinventing the wheel. Believe me, with the other items on that list-- there is more than enough for a Bachelors.
I think a general problem with education today is we get really caught up with making "good workers" instead of "good people".
College is there to make you a better person. To make you aware of the world and how to think, question, and create, both in a specific field, and in general. The particular language and the depth of how it is taught and how useful that is for employment are secondary to learning the concepts behind letting your create something useful with whatever tools you may be using. Of course concrete examples and hands on experience are part of this, but they are just part of the means and not the ends.
Of course we all need to work for a living, but you never know what the future holds. Job requirements and environments change, our interests change, our abilities develop, and we keep on being presented with new challenges. While in college you have a chance to explore and not get bogged down in the details that may be required for survival. Learn all you can from other subjects especially the humanities, because they give you background on ways to look at the world and examine your place in it. With this background you'll find you can pick up any specifics you need rather quickly, but more so, you'll be able to apply them that much better.
Good employers do recognise good people who can solve problems, communicate well, and be creative within their field, and reward them. If you need to "pay your dues" to get in the door and get some experience with some deep knowledge of something particular (like a certification or the like), don't let the pursuit of that detract from the kind of personal development that you now have a unique opportunity to gain.
As a CS graduate you are expected to be a good to great programmer and an expert in a few of the common languages. You are expected to understand most of the algorithms (including runtime and space complexity) in Cormen et al Intro to Algorithms. You must understand and recall many of the common design patterns and be able to implement them in a common OO language.
If I was you I would choose to become a serious expert in C++ or Java, and learn a couple of scripting languages (python,perl,ruby) and at least one SQL based db product. To get past interviews in C++, you should be able to answer most questions in the C++ FAQ by Cline.
Another real world skill that is not always taught is working with large frameworks. Find an open source project in your OO language of choice and become a contributor. In a company, you will be working with an existing code base that's hundreds of thousands of lines of code. Your classwork of writing 2000 line class projects from scratch is very different from the reality.
Be an expert in something. Keep learning new algorithms, new languages. Stay on the bleeding edge.
If you want experience, then you want something like a summer internship. Lots of companies hire college students for 10-12 weeks over the summer. You'll get a little bit of experience, and you'll get better pay than working at Starbucks.
Or you can work part-time during the school year. I did a part-time job 20 hours a week at a local research institute affiliated with the college I went to as an undergrad. It was nice enough pay to get some spending money on top of paying for the basics, and I got a lot of useful experience.
There's also open source experience, but I know nothing about that personally.
If you wanted to focus on a language, I suppose you could look into various certifications, like Sun Java certifications. Those cost money. The type of hiring we do, we don't care about those (we're a research institute, we want to see advanced degrees) but some others might have an idea if they're actually worth anything in the programming field. I'm skeptical, but maybe it's useful for a new grad.
.. the one they're teaching today is probably the wrong one, anyway.
So, I double majored in EE and Computer Science, with a minor in Psychology. Had I not already learned assembly, BASIC, and FORTRAN on my own (not so easy back in the 70s), it would have been immediately clear that language is just a means to an end... we had assembly in an EE course, LISP in psychology, and primarily Pascal in CS courses (they did offer one using FORTRAN, which was apparently of interest to ChemE students).
My first CS course was of the "let's get them programming" nature, and used Pascal... most of the people who took that course did not go on in CS, this was for all engineering and science students. Today, they would probably use C/C++ or Java, either would be just dandy.
The second class (the late 70s/early 80s version of 15-211 at CMU, before they broke it up into two semester-long intro courses) did not initially teach any programming language.. you already had one, any other is a simple matter of a day's study... right. We learned finite state machines, lambda calculus, all the stuff you need to know... including all of the possible things one might put into an arbitrary programming language (well, most of them, I didn't learn about generators until I played around with the Icon language, years later... most people don't need that anyway).
And that's the right answer. Since I first logged onto my Dad's timeshare account at Bell Labs when I was 12, I have used well over 40 different languages... some for fun, some for real work, a few for both (C/C++, Pascal, VHDL, HTML, Java). If you can't start to program a new language in a day or two*, given a good PRM, you need to go back to the fundamentals. As for the initial choice, if you have it, pick one that's sufficiently sophisticated you can use it and learn good modern programming, not so complex it'll eat you up. Real C++ may be too much for some people, and it's not a fast language unless you have a huge library... and using STL, you're kind of changing the language (others disagree, of course). Java's fine, too... but hey, Gosling was at CMU back then, I used his version of Emacs for years, and will continue to bless all of his works. I liked Oberon, but it never caught on, at least in North America.
* You can learn the language itself, and apply it to your knowledge of the generic constructs, in a day or two. You will not become proficient in some weird-ass standard library associated with that language, if it exists, in those days. When writing in LISP, you always had a fairly big tome describing the vast collection of functions available in the language at the time... well beyond C/C++ and even Java's basic support routines today (well, given this was largely pre-graphics, so we didn't have an ancient alternative to Swing or whatever).
-Dave Haynie
If you want to be a good programmer learn assembly first. You will understand better about what is programming.
Go to job searching web site. As you will see system programmer makes the most money.(C++ and Java).
if C++ or java is hard for you then try to learn web languages such as php asp net.
As an IT grad, or even as a non-grad IT person, you'll find yourself in situations where you're thrown in the deep end with nothing more than some outdated refs - if you're lucky. You've got to be able to instantly scrape together fragments of data into a coherent framework and put that framework to use before your boss starts handing out pink slips. I'm not even a programmer and I've been hauled off on no notice to write some nationwide corporate application in a language I'd never seen to that point, simply because I made the mistake of mentioning I'd once tinkered with Perl for a couple of days.
Learn how to whip up basic versions of standard libraries in double-quick time. Not in one language, but in as many as you can lay your hands on. C. C++. Java. Python. Ruby. Haskell. Fortran. Perl. Befunge. Bash. Freakin' DOS batch code. Focus not on the vagaries of a single method, but on being able to feel the flow and curl of logic states and data. That way, it won't matter what language is in vogue by the time you hit the workforce, you'll be able to pick it up, swing it a few times to get the heft, and be ready to play ball.
History (Brooks, McCarthy etc) shows that the "LOC" per day is closer to ten than one hundred. A quarter of a centuary of anecdotal experience concurs.
Sad but true.
-- Butlerian Jihad NOW!