Fog Creek Software
Discussion Board

Languages to learn?

I know this topic has been done before.  But I want to go over it again.  How languages should someone learn?

I'm asking because of this reason.  I work mostly in Perl and Java.  I dabble/do a little work in others such as VBA, Python, PHP and C.  I still feel I haven't totally mastered Perl or Java-but sometimes I wonder if I'm limiting myself by doing all my work (90%+) in these two languages.

For the job market right now-you have to have a lot of skills because of the loose labor market.  How many languages do you think it's good to be highly proficient at vs. familiar with??? 

One thing I've though of course-it's a lot different switching from Perl to PHP than Perl to Python or VB.  So obviously the difference and complexity of the language matters (I gave up trying to work in Lisp too much because it seemed kind impractical at this point).

razib khan
Thursday, March 7, 2002

This does depend on what kind of work you do or want to do.  Are you allowed to select the language you use at work or is this for self study?

You didn't mention SQL.  I have been working on an engineering application recently (comm satellite) and have needed it.  If you're doing business apps you'll probably have even more use for it.

Learning C++ may be helpful, but depends on your applications.

Thursday, March 7, 2002

I would say C++, not because it's a great language to learn, but because C++ is almost over-the-top in it's linguistic features (and if you're sadistic enough, learn COM and ATL). Icon is also good for that - giving contrast - since most self-taught programmers tend to program in languages that are most "in vogue" - ie. whatever wrox book is most prominently stacked in the bookstore ;-)

Python is also one of my favorites.

You also might want to look at a non-procedural languages such as lisp, prolog.

Also, Assembler! If you really want to round out the top and bottom of your knowledge base :-)

James Wann
Thursday, March 7, 2002

Plan on learning new languages for the rest of your career.  Learn to learn.  The more languages you expose yourself to, the easier it will be to pick new languages up later.

Also, note that there are really only a handful "root" languages, and all the rest are simply derivatives of that root.  If you know a popular language for each root, you're maximizing your ability to learn later.  For example, Java and C# are closely related to C++, and knowing only one of them will allow you to pick up the other two relatively easily.  Perl, Python, and many other languages are also from the same root, and really all work more or less the same way, with relatively subtle differences in syntax, type handling, and the libraries attached to them.  Once you have the basic concepts of OO and scoping down, and look at the languages hard enough, you see that there's really very little difference between most languages at the core.

Also learn to separate syntax from operation.  Smalltalk is completly unfamiliar in syntax, but the concepts are all quite familiar to anyone who knows OO from a more mainstream language like Java.

LISP is from a whole other universe, although it's nowhere near as "different" as things like ML and Prolog, which use wholly different conceptual frameworks from languages that are familiar to most programmers.  Learning these are of interest, but unlikely to do much to furthur a career, if that's the goal.

James Montebello
Thursday, March 7, 2002


In reply to:

For example, Java and C# are closely related to C++, and knowing only one of them will allow you to pick up the other two relatively easily


I disagree with this statement.

I do not believe that someone who has only been exposed to Java can 'easily pick up' C++.

The fact that the Java programmer might not have ever used pointers before would be a big stumbling block.

For these particular languages (C++, Java, C#)...I would suggest learning C++.
If that programmer can create programs in C++ switching to Java or C# would be a breeze (but not the other way around).

William C
Thursday, March 7, 2002

I agree with the last statement about learning C++.  I'm not very proficient in it-but I knew a little about it (took a course on C++ before I ever learned Java) before Java and noticed that Java left stuff out.

I use SQL and stuff a lot-but I was just talking about the all-purpose type languages btw.  I'm thinking right now of getting into VB and C++ since it seems a lot of the languages are related to these two somehow.

razib khan
Thursday, March 7, 2002

Stream of consciousness:

Python takes about 5 hours to learn, and is fun.

If you know C, you can get a job in nearly any field from embedded devices, to web/database, to game programming, to programming MRI machines, to robotics, network programming , etc.

The perl skill you need to "master" is knowing what module to download from CPAN.

"Mastering" java/C++/VB really means mastering the particular API most important in the problem space you are working in.

Think one step ahead. It is probably better to imagine what you want to be doing once you learn the new language. Want to write an MP3 codec? Learn C. Want to write a windoze gui around your MP3 codec? Learn Visual C++. Want to write a OSX application? Learn Objective-C.  Want to write a device driver for your sphygmometer? Learn C. Want to write a palm pilot app? Learn C. Want to write a unix based network snooping utility? Learn C. Want to write a 3-D rendering engine? Learn C. (Note, a lot of things end in "learn C"... you might want to learn it)

random flamebait:

If you think one step ahead, it is highly unlikely that you'll think "I want to write another crummy windows based client interface to some corporate data system" (Viz Basic) or "I want to write an N-tiered base middleware system for a bank " (Java). However, according to this board and others, it seems like a lot of people DO want to write these things, so YMMV.

Thursday, March 7, 2002

> How languages should someone learn?

I'd say English is a good start.

Thursday, March 7, 2002

You state your GOAL in learning new langauges is for the job market.  Well, the person telling you to learn ATL, Python, LISP, Prolog is an idiot just tying to be a guru.  James Waan, stop wasting people's time.  He wants skills that will land him a real job.  I'm sure you are home unemployed with all your useless academic languages. 

To answer your question, go look in the local classified ads for what skills are in demand.  You answer lies there, not with the unemployed purists here.

Thursday, March 7, 2002

C++ programmers are such pathetic bigots.  Go code your video drivers.  The majority of programmers are BUSINESS programmers, apps with a GUI, or apps that manipualate databases.  We dont need your advice here.  You haven't a clue.  Go build your GUI by hand with your Motif.  We'll be in testing while your still adding a button to the screen. 

Thursday, March 7, 2002

er. SSSS...who looks in the LOCAL CLASSIFIED ADS for programming jobs? he's obviously not looking for a job as a fry cook. 

that said, SSSS is on the money. if you are looking to get a job programming, just learn the language advertised in the job listing. don't be fooled by people telling you to learn X, Y , or Z because it will give you a "deep understanding" of whatever. computer science is academically moribund and software engineering is not a particularly "deep" endeavor. If academic stimulation is what you are looking for, try neuroscience or astrophysics...

Thursday, March 7, 2002

Wow - SSSSS, I'm not sure if you were trying to be a troll or not. Good point, I agree with you. Most work done in a software environment is blue-collar type work. That means scrubbing data off databases, cranking out tons of data entry forms and reports. Not the fun stuff that we were promised in the computer science programs.

However, if you look at something like craigslist's software jobs page:

You'll find that a large number of non-java/web related jobs require *gasp* C++ and some Microsoft related skill. Visual Basic would be the top language to learn if you wanted to be employed imo. Soon C# I'm guessing.


James Wann
Thursday, March 7, 2002


Didnt you have your happy snappy flakes this morning ?

James Ladd
Thursday, March 7, 2002

In reply to:

C++ programmers are such pathetic bigots.


Boy oh boy, somebody has a bug up their butt.
Sounds like someone with an inferiority complex.

Just in case you were replying to anything I said...please go back and read it again (and 'understand' what I was replying to).

In fact, I wasn't even giving an answer to the original question that started this thread.
I said that I think that this statement,
"I do not believe that someone who has only been exposed to Java can 'easily pick up' C++."
is wrong.

And if you can disagree with my assessment, you my friend, don't have a clue.

Also, maybe this guy *doesn't* want to be a business programmer.
Maybe he wants to do more engineering-type work.
mybe he wants to program for PocketPC or Palm (which I do).
And if you program for handhelds, he damn sure better know C and C++.
Because we have looked into Java for the handheld and that's just a no-go right now.

The fact that we use C++ doesn't slow us down.
In fact, we put together a handheld app for FDNY ( a humanitarian effort on our part after the events of sept. 11th ) in two days!
The GUI, the GPS, the bar code scanning, and the database portions -- tied together -- DELIVERED in TWO days (this is not a misprint).
Oh, and there were just 4 of us.

William C
Thursday, March 7, 2002

Sorry, cut and paste the wrong quote...
I meant to say that I thought that this statement,

"For example, Java and C# are closely related to C++, and knowing only one of them will allow you to pick up the other two relatively easily. "

was wrong.

Not my own statement in reply to that one! :)

William C
Thursday, March 7, 2002

Too much attention on languages turn into flamewars.  Because at some point it's like talking about the best editor to use.

It's not how trendy the language is, it's how you use it.

That said, go for the lowest-level language that still is widely known.  You want to deal with pointers, no doubt.  So C or C++.  C++ has the advantage of having shoehorned in the ability to use all sorts of methodologies, like generic programming.

Red paint
Thursday, March 7, 2002

i type "java" and "perl" and "VB"/"Visual Basic" on a regular basis in MONSTER just to get a sample.  i want to be carefull about picking up skills because they're "hot" for the moment-things change so quickly.  but i think learning C++ is a good choice from what i can seem.

razib khan
Friday, March 8, 2002

IMHO, its not so much about what languages you should
learn. I think that you should learn enough languages so
that you cover most platforms you come across.

How many platforms do people really use? I dont have a
very extensive experience (7 yrs), and I have done development for only Windows and UNIX. I've come across
some OS/390 also, but that is not very common.

1) Windows client stuff means Delphi to me, and thats not
saying C++ sucks. C++ is cool for client development too.

2) UN*X - C (i am rusty with C, but can handle it) and
Perl and shell scripting usually gets you were you need
to go.

Just my 2 cents

Friday, March 8, 2002

...forgot about Oracle and PL/SQL, which i have used for
web development. But PL/SQL is platform independent
so it does not matter which platform you choose for that.

Have fun,

Friday, March 8, 2002

For those interested in the history of computer languages... this link might be an interesting diversion for a few minutes....


Walter Matte
Friday, March 8, 2002

That's a great link, Walter, thanks much.

I agree with James Montebello's observation that there are root languages that are most worth learning.  You may think that practicality is the overriding concern, i.e., what will get me jobs?  That is true.  However, it does NOT mean you should only learn the languages of the current day.  Rather, learn the roots, and later, the languages of the day, which change from year to year, will always be easy to pick up.

I also agree with William C, to a point.  Learning Java might not give you as much exposure to pointers as you might need.  Then again, I would say that Java is merely disguising the fact that every single Object variable you use is in fact a pointer.  It's trying to get you to use pointers the "right" way, by not doing Frankensteinian things such as pointer arithmetic.  The only reason you will need this is to either debug existing C or C++ code, or, once you really know what you're doing, writing such code for some high-performance application.

In terms of "root languages", things center more around paradigms.

Procedural is the simplest paradigm, and is closest to the manner in which the computer actually works.  All code is lists of instructions to be executed in the order they are given.  Good roots to learn are C, and the various assembler languages.  I recommend at least one assembler language, as it should help cement the notion that the computer is doing exactly what you tell it to do, no more, no less.  It also gives you the opportunity to understand disassembled binary code.

The object-oriented paradigm is similar to the procedural one.  Small portions of it are identical to procedural code, and are executed the same way.  The difference conceptually speaking includes things like polymorphism and inheritance and encapsulation.  To learn OOP is to learn large-scale design.  Good roots include Java and Smalltalk.

Past this point, the code is not so much a series of instructions to deliver to the CPU, but rather to a virtual intermediary, or interpreter.  Generally this is abstract the programmer more from the implementation of a program, and get the programmer to think more about the problem itself.

In the functional paradigm, everything's a function - an expression which resolves to some value.  The classic example root is LISP.

In the logical paradigm, the idea is define rules about what is considered a solution to a given problem, and leave the details of implementation to the computer.  The classic root is Prolog; however, SQL also fits into this paradigm, assuming you don't yield to temptation and learn the procedural PL/SQL.

In the stack-based paradigm, the main data structure is a single stack.  All instructions either push or pull something off the stack, or perform some operation on the top N items of the stack, possibly pushing a result onto it afterwards.  The classic example is PostScript.

Paradigms are somewhat fuzzy.  The languages I mention exemplify their paradigms to a large extent, but may have features which herald other paradigms.  (Prolog can be used in a procedural manner, for instance.)

Paul Brinkley
Friday, March 8, 2002

To paraphrase Sesame Street: C is the language for me!
Chunks had it right. If you know C you can do embedded development. If you want to stay employed and avoid the ups and downs of the high tech world, embedded is the place to be.
When you have a good grasp of C, then C++ is just OOP. You will not struggle with the C syntax on top of learning the new syntax.
C is not difficult to learn. I’ve said it before, buy “The C programming language” by K&R and go through it. Tools are free too (also an advantage of Python).
It is true that large, complex programs can be built without pointers. If you are asking me, you should learn and really understand pointers.  It is worth the time and effort.

Doug Withau
Friday, March 8, 2002

If you want a high-paying job, I recommend either of two pathes: C++ (for app programmer) or Oracle/SQL (for biz programmer). These will be in high demand for the foreseeable future. Just look in the want ads.

Banana Fred
Friday, March 8, 2002

Hate to bring this 'elevated' discussion down to the newbie level, but the one thing I don't grasp is when is it appropriate (or more common) to use C instead of C++? 

I've taken classes in both - C about 15 years ago as an undergraduate and C++ a couple years ago in some non-CS graduate coursework.  Haven't used either since.  But as I recall, in the introduction to the C++ class, the instructor billed C++ as an improvement over C.  Is this an 'improvement' only for certain types of applications, but too much overhead for others?

Friday, March 8, 2002

Coded right, C++ has the same (if not less) overhead then C - unfortunately there are a lot of people who don't really know C++ coding in it...

The desision is usually based on tradition (Unix utilities are written in C), preference, or knowledge. Size does matter, to an extent, but successful and unsuccessful projects have been done in all sizes with both languages. My personal preference is that it doesn't matter for the small stuff but C++ is bettern then C for large projects.

Jeff Pleimling
Friday, March 8, 2002

Particularly on embedded systems platforms, I've heard that good C++ compilers are hard to come by.

For myself, I'm a corporate-dev type who normally works in VB.

Dave Rothgery
Friday, March 8, 2002

Granted I don't know C, or C++, but from Languages I do know VB,JAVA,SQL,PERL it seems that more important than language is environment. For instance, my first language is VB and I have done a lot of DB programming in it, When I was learning Java I picked up DB programming almost instantly- because I understood what a connect, statement, resultset etc... was. Now the opposite is true, I have learned a lot about Internet programming (Sessions, Contexts...) from working with JSPs and it made going back and learning ASP.NET much easier, since I already know a lot of the concepts behind the code.

This is not always true(for instance IO, and Printing and Events are very different in VB and JAVA), but in most cases
it works

Daniel Shchyokin
Friday, March 8, 2002

> when is it appropriate (or more common) to use C instead of C++?

For example, I haven't looked recently but it used to be that when writing NT device drivers, the NT DDK didn't "support" C++. Which means that you could write C++, but only if you were using a sufficiently small subset of C++ that your executable would not be relying on any support from the [Microsoft] C++ run-time library, which doesn't exist in device-driver land.

IMO the good thing about C++ as opposed to C is that it provides more features, more support to the /programmer/, who is attempting to organize and understand the code (it makes relatively little difference to the /machine/). If for example the program is small enough that you can put everything in a single *.c file or module, then there's correspondingly little advantage to using C++ instead of C.

Also, consider that all C++ programmers and compilers know C, but not vice versa.

Christopher Wells
Friday, March 8, 2002

> But PL/SQL is platform independent
so it does not matter which platform you choose for that

HAHA, yea, but it's DATABASE dependent.  And that's 100x worse!  Are you for real??

The guy wanted to get a job.  Part of saying NOT to bother with C++ is that he *probably* won't get himself a job doing it.  There is a big learning curve, and it's not something I've ever seen an unexperienced (ie: book knowledge) guy get hired for.  If he wants a job in a new technology, he needs to set his sights more realistically.  It's not just about the "best" language.

>when is it appropriate (or more common) to use C instead of C++?

Some correct me if I'm wrong (this isnt my forte), but C++ is a superset of C.  In fact, last I did C++, you compile your C++ code into C, then compile your C code!  Other than a few syntax additions, the main difference is the OO features.  If you don't feel like structuring your code in OO, then you are writing in C.  But I guess even one giant class is technically OO, so C++.  (vs. just a .h and .c, etc)  All your C code can be complied thru your C++ complier. 

Sunday, March 10, 2002

I am 40 and have been developing code for about 12 years professionally. I have had a US$80K-140K income for about 8 of those 12 years.
For the first 4 years I earnt less I was writing Clipper/C applications.

For the next 4 years I used C++.
For the last 4 years I have been using VB, and very seldomly (rarely useful) C++.

I am currently deciding whether of not to get on the .NET bandwagon or not. I'd say its mostly likely the most profitable route for me.

Sunday, March 10, 2002

> All your C code can be complied thru your C++ complier.

This is not really true any longer, the new C Standard (99) has some new features in it which are currently not supported by C++, even though the C++ Standard might adopt them soon. Of course, many C compilers are older than the standard and will not support the new features anyway, but if your C code is really up to date, it will not be compatible to an up to date C++ compiler.

Also, whatever you do, do not try to learn C and C++ at the same time or even C first to learn C++ later. This will probably lead to very ugly C/C++ mix code. Both languages have their own concepts and if you mix them, it gets pretty confusing. Stay away from those "Become a C/C++ programmer" books, because you do not want to become one :-)

Have fun,

Jutta Jordans
Monday, March 11, 2002

Excuse the off-topic-ness;

>HAHA, yea, but it's DATABASE dependent. And that's 100x >worse! Are you for real??

Yes. It is database dependant. You may call it 100x worse
than platform dependance. I really dont care. The DB apps
I have come across that supports multiple DBs always
suffer from the least common denominator problems.

Run this on Oralce, MS SQL Server, MySQL and what have
you, and you will get a solution that barely runs on any
one of the DBs. So database dependency is really not a
big problem, imho.

>The guy wanted to get a job. Part of saying NOT to >bother with C++ is that he *probably* won't get himself a >job doing it.

I didnt say "Dont bother with C++", reread my post. I said
C++ is OK for client development. I also said I have not used it extensively, simply because there was no need.

Monday, March 11, 2002

Just to add my opinion... ;-)

Any good application should do what it is expected to do.  It should not be more complex than neccessary, nor less complex (i.e. limiting the user).  The end user is always the target.

The view of what is complex or not may differ a lot.  Users like when the application runs fast.  Your software-house boss thinks that you should be able to deliver (i.e. to develop) the wanted application fast.  The person responsible for maintenance of such application (if it is going to survive for longer time) wants the design to be as clean as possible.  Someone else may wish something else.  What of the views are more important than the others?

Technically speaking, writing a program means transformation of your ideas into some very formal prescription what actions must be done in some situations.  Writing the application, you are transforming your mental picture of what should be done into a working application.  In other words, you should design the application using the abstractions that are easily available in your programming language, or you should choose the programming language that offers the abstractions that you need.

If your mental picture of the being solved problem is not clear enough, you may prefer languages or tools that support building of prototypes.

Apparently, the languages that are specialized for some area (i.e. easy to use in that area) are usually not so good in other areas.  The languages that are good for almost everything are usually complex and more difficult to learn.  The languages that are easy to learn usually hide the complexity of some aspects and they are not so good for programming in large.

Try to point out applications that you think you should be able to write and then ask what was the programming language they are written in.

Finally, (my personal opinion). Use whatever for rarely used or very specialized or simple applications.  Learn C++ if you plan to write something more complex one day.

P.S. Google for Bruce Eckel's "Thinking in C++" on-line book.
Read the "Al Stevens Interviews Alex Stepanov".

Petr Prikryl
Monday, March 11, 2002

Hi Folks.  Here is the unofficial score thus far (every mention of a coding modality gets one point):

Perl 9
Java 25
Python 7
C 54
C++ 68
VB 11
Lisp 5
SQL 11
Assembler 3
prolog 5
C# 5
Smalltalk 2
ML 1
Delphi 1
Postscript 1

My Comment:  Participants tend towards procedural rather than functional programming techniques (Lisp is the only functional language I recognize here) and there is a tendency to be stand-offish about admitting Microsoft VB into the pantheon (only 12 votes?).  Perhaps that is related to C envy - I don't know.

My additions:  XSLT - a quasi-functional programming language that is indispensable for elegant handling of XML; and ECMAScript, equally indispensable for talking to your client's browser.  There, now we can add:

ECMAScript 1

Karl T
Thursday, March 14, 2002

I highly recommend SNOBOL.  Okay, so I lied, I just wanted to see it in the list.

Timothy Falconer
Monday, March 18, 2002

I think you can start off with C. Me, I started with VB and ASP but then I was a late starter..really late.

Wednesday, March 20, 2002

Do not, under any circumstances, start with RPG II.

Hmm, perhaps we need a "worst language you ever worked with" thread. Except I bet it would end up listing all of the languages that have already come up in this thread.

Mike Gunderloy
Friday, March 22, 2002

Ah, the language question again..

First, learn Visual Basic! I know, those *real* programmers do it in C++, C# and C%, because Basic is for "beginners". Well, VB is widespread, and is here to stay. It is the embedded language in the MS Office apps, and once you know VB, you can easily automate Office Apps, create PDA applications, and ActiveX controls. VB is a simple and fast way to learn object oriented programming.

Monday, March 25, 2002

*  Recent Topics

*  Fog Creek Home