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]
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.
New school teaches every language + programmming concepts and our poster complains - maybe the new gen kids are unteachable.
This is not a signature.
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
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 :)
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.
I've been a SQL
Stop right there. This is probably some of the best advice you'll get.
Of course, it depends on what you want to do. But for the standard, current-track Internet/Cloud/Distributed blah blah blah, many people are dreadfully bad at SQL for how much it applies to their job.
That said, haven't we had enough of these language posts? You can google this and you'll see the same arguments spread out since the birth of the Intarwebs. Everyone has doubts about the language that their using when they don't know many, and want to know what to use.
Just be glad that you didn't attend a program that only taught you Java and never showed you how operating systems really work or what a pointer is. That is a great start.
As someone whose worked in a few of the largest software companies, I can tell you that this really isn't a big concern. You won't get tested on the vagaries of a programming language in an interview. They want to know exactly what you're being taught: that you understand the theories and concepts underlying what you are doing. Projects never use only one language. You often need some glue (Perl, Python, Ruby, etc) and some 'lower-level' code (C++, Java), some data storage (SQL), and maybe a dynamic web page or two (PHP).
Get an internship. This was the best way for me to learn where I fit in on a development team, what sort of thing I felt inadequate at compared to my co-workers, and learned the place of programming language in the work environment. By the time you've gotten your second or third job, most people don't list languages on their resumes anymore.
Once you know a few languages, it shouldn't take you more than a week or two to pick up a new language. On the topic of being an 'expert' at a language, that probably isn't important for your first job. What you need is strong foundations, a good attitude, and hopefully avoiding a tendency to break all the existing code.
If you're really passionate about programming, you'll probably pick up a few languages and be enthusiastic about one or another at a time. I'm currently on a big C++ and Perl kick, as well as loving debuggers in lieu of print statements.
If you're not passionate about this and you want a good 40 hour a week job where you only need to know a thing or two, I don't know what to tell you. I've found this field rewarding because the limit is only how much I'm able to learn and apply. And I've found my employers have recognized that.
Use the right tool for the job. Write readable code in whatever language you write in. Good code is easy to understand, efficient, and concise.
Put on your flame-retardant mecha-suits, this thread is about to get spicy.
Final note: Do everyone a favor and learn how to use grep and other Unix tools to do simple data transformation tasks.
Long live the BSD license
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.
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...
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.
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.
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.
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!
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).
With only one language, chances are that that most graduates' knowledge of basic concepts will be too biased by the lens of their single language. How easy is it to think of functions as parameters coming from a language without closures? If everything you do is compiled, how can design by capability ever make sense? Not to say about how little one can teach about maintainability and readability if one is stuck in one language.
While it's silly to force students to use a different language in every single course, making sure that every student has tried to use at least a few different languages: An assembly, a C descendent and a dynamically typed language. Competence in 3 languages is probably not too much to ask from graduates, and still provides more perspective than a single language education
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 :(
Take it from me, a computer science degree definitely won't help you get a job.
He may be right. Which is sad.
I'm not complaining personally. I've been fortunate enough to do plenty of good computer science over the course of a long career. I've done everything from networking theory to proof of correctness to autonomous robots. I've done web stuff, too, and today write mostly Python, so I'm not stuck in the past.
But new graduates, especially if they only have a BS, are going to have trouble finding a good career. Most of the basic problems in the field have been solved, and the ones that remain require deep specialization before you can make progress. The previous poster is right; employers want a bunch of buzzwords, because much of programming at the working levels today is knowing how to interface with a huge collection of ever-changing APIs, and those take time to learn.
A century ago, the stationary engineers who set up factories to run on electricity and steam had the same problem. In 1870, that was cutting-edge technology. By 1910, factory owners just ordered motors and hooked them up. Today, it's a union job.
There are good computer science problems to work on today, but it's hard to find a job that needs them solved. There's great stuff going on in machine learning. Game AIs could get much better. Robotics is finally starting to work. Computer vision is getting very good. There's a whole world of interesting technology associated with semiconductor design automation. But 99% of working programmers won't get into those areas. They'll be stuck doing e-commerce sites forever.
The smart young people I know all seem to be going into either bio or law. A few years ago, some of them were going into hedge funds, but that seems to be over.
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.
Technology is not a zero sum game. The existence of Indian programmers does not prevent good programmers in any other country from getting work. Good is the key. Improve your game, it's a better tactic than racism.
>Try telling your neighbor about Jesus and showing them the gospel and show them the greatness in your life that you have gained by following The Truth.
and they will move out within a a week.
Bloody good idea. No one wants to live next door to bible bashers.
Open Source Drum Kit, LPLC deve board - mjhdesigns.com
Are you trying to learn computer science, or are you trying to learn a trade?
No one wants to live next door to bible bashers.
You mean "Bible thumpers". Bible bashing is what you are doing.
Running with Linux for over 20 years!
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.
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
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.
No, there won't. Few people, outside the inner circle who are actually developing the language and building its tools, care about Perl 6 at all. Once it's released in a stable form, some people will switch to Perl 6, but other people will switch to other languages (since existing code won't be entirely compatible anyway). Many will just continue using Perl 5, because it's good enough. And of course, most people who are using other languages will continue to do so.
$x='S24;r)>63/* h@<5+oZ)32"5cz';$me='phroggy'x$];
$x=~y+ -xz+\0-Tx+;print$_^chop$me for split'',$x;
"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.
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