What Programming Languages Should You Learn Next? 759
simoniker writes "Over at Dobbs Code Talk, Chris Diggins has been discussing programming languages beyond C++ or Java, suggesting options such as Ruby ('does a great job of showing how powerful a dynamic language can be, and leverages powerful ideas from Smalltalk, Perl, and Lisp') but suggesting Scala as a first choice ('Very accessible to programmers from different backgrounds.') What would your choice be for programmers extending beyond their normal boundaries?"
no Ps (Score:2, Interesting)
None (Score:3, Interesting)
Re:Wrong Question (Score:5, Interesting)
"Beyond C++ and Java?!?!?" (Score:2, Interesting)
But my suggestions are:
Python - go learn why strong-typing doesn't mean a lot in practice (except for headaches).
Lisp / Haskell / whatever - go learn ' a different way' of programming things. Trust me, it rocks.
Ruby / ECMAScript - it's the future baby.
Re:Wrong Question (Score:5, Interesting)
Malbologe (Score:2, Interesting)
Re:Wrong Question (Score:3, Interesting)
It has a funny name, and carries the mystique and credibility you seek. Nothing says "way old school" and "MIT Wizard" like piles of LISP with your tag on them. Of course, you'll have to leave vim behind - there is only one, true tool [gnu.org] for the LISPer, now that dedicated machines like Symbolics are all in the museums.
The opportunities here are boundless - there are whole categories of libraries for HTTP and HTML that simple don't exist yet! If that seems to trivial a challenge, why not look into one of the projects to write and OS [common-lisp.net] in LISP?
Get the Little Schemer (Score:5, Interesting)
I recommend the book The Little Schemer [neu.edu] This book is like no other programming book you have ever used. It is a socratic dialog between you and the interpreter. Questions on the left, answers on the right. It is meant to be used with an interpreter.
Once you make it through this book you'll be a much, much better programmer. You'll also have an easy time learning languages like Haskell, which is used quite a bit in academia and is useful for real world software.
So buy a copy of the Little Schemer and download an interpreter, Dr. Scheme is pretty good, and get cracking.
D: The Language (Score:2, Interesting)
Best Language to Learn Multithreaded Programming? (Score:3, Interesting)
Re:SQL is next for me (Score:4, Interesting)
Screw them all. (Score:5, Interesting)
Don't Forget Piet (Score:4, Interesting)
Re:Verilog (Score:5, Interesting)
after learning C++, Java and a few others I decided to get into Microprocessor and Microcontroller programming and did so in whatever flavor of assembly the chip supported. I gained an entirely new respect and understanding about how these chips work on physical level as well as a much greater understanding about how inefficient most applications are and the enormous potential for improvement, as well as the enormous potential of modern CPUs and how much that potential is squandered on what people actually use them for.
I've developed a number of embedded applications now and the way I think about other applications has really changed too. My next language will probably be Verilog because the price of FGPAs has dropped significantly and they are incredibly versatile tools if you know how to use them... some of the things I've seen people use them for are mind boggling
Re:Verilog (Score:5, Interesting)
I'd suggest erlang for its own sake -- a parallel programming model that doesn't suck as much as threads with locks.
Disclaimer: I don't actually know Smalltalk (Squeak won't run on my machine), Prolog, Verilog, or Scheme. I did learn Lisp, once upon a time.
Also: I think that while we do have languages that are good for specific tasks, every language I've tried is missing something I consider to be critical.
Sometimes I'm able to bring it in -- with JavaScript, I can almost emulate Ruby's iterators (each, collect, etc). But sometimes, it's something more pervasive -- for instance, while most languages support some kind of threads, they often allow supporting libraries to be written in such a way that they break when used in threads, and some of my favorite languages (Ruby, Python, Perl) don't support real OS threads actually running in parallel. (Python has a Global Interpreter Lock, and Ruby seems to be about to adopt the same, meaning that a single process of each won't be able to really take advantage of multicore/multiprocessor systems.)
Sometimes, these things are mutually exclusive -- how do you have a purely-functional, lazily-evaluated language, and also make it simple and imperative? But most of the ones I care about aren't -- there's no reason a language like Ruby couldn't be written to be fast, bytecode-compiled, and truly threaded. There's no reason a language like Erlang has to have non-variable variables and ass-ugly syntax.
Re:Wrong Question (Score:2, Interesting)
But if you're just looking to pad your resume, then I really don't think LISP will do you much good. It may look cool to the guy making the decisions, but you need to get past HR first, and they have no idea what LISP is nor do they care if you're smart enough to learn other languages.
Re:Verilog (Score:2, Interesting)
FPGA
It's tends to be harder to get an FPGA to "hello world" but it seems these days that all the cool kids are compiling their dataflow graphs into reconfigurable logic. If you want to be a 1337 fpga programmer, then you should learn Bluespec [bluespec.com]. Guarded atomic actions for the masses!
Or Excel [blogspot.com]
Re:Wrong Question (Score:3, Interesting)
Really? What kind of idiot programmers do you work with? My life is finite and my time is valuable. If you don't care what language you program in, you don't care what language you learn, and you must not care what framework you learn either. Heck, all languages and frameworks must be worth learning! Reality check: What kind of languages you spend time to learn, matters.
Much discussion goes into what languages my team will use for what project and why. We don't fear learning new languages, but even as individuals away from work, nobody wastes time learning languages that do not serve a purpose in the workplace or in our own personal projects just to "know them". I've dabbled in Erlang, Lisp, Perl, Python, Ruby, etc. Mostly Erlang. None of these languages would I claim to "know". I'm not going to learn any of them. It doesn't help me to know them right now or in the future AFAIK, which is the point.
Flex Actionscript programming I've had to learn and have taken Adobe classes to learn. I "know" Flex and the associated Cairngorn framework. It's been the most useful thing I've learned in a long long time. I'd recommend to anyone, learn Flex.
See, that's an answer, not this constant
Re:It's not all syntax (Score:5, Interesting)
Visitor? If you have first-class closures, it's the most natural thing in the world to pass a function to a traversal function. You don't need a name for it or a specialized set of trigger terms so that maintainers can see easily divine your intentions. You don't name your closure "visit", you name it after what it does.
Singleton? Whatever for, if you can create object literals, or your classes are as first-class and polymorphic as instances?
Factory? In Python, you override __new__...
Learning other languages lets you determine the difference between unification and duct tape.
Re:None of the above... (Score:3, Interesting)
I've taken a course on this in university. The tools I remember did basically an exhaustive search of all states in your program, and verified that there were no deadlocks and the properties you specified hold in every state.
Needless to say, this is very memory consuming, and can take a long time. So what you really get to verify is simple models, not your actual application with all its different variables. Also, the tools didn't grok Real World programming languages, so you had to write your model in a language other than the one you would eventually write your application in.
In the end, the impression I got is that formal verification is great, but the tools we used don't tell you _anything_ about the application you write, because that's not the code you ran the verification on.
I know that's just the tools we used in that course, but how do you do it? Which tools do you use, and how do they work?
Re:Specialization Versus Breadth (Score:5, Interesting)
Honestly, a lot of the older coders I know just don't have the time. The company will both pay for and tell them what they need to learn next or they ain't learning anything at all.
By having a breadth of knowledge and skills, you can make informed, smart choices about what language, framework, technology, etc. is best suited to solving your problem. Should your current problem be solved with a "Web 2.0" interface, a rich client application, etc. In your case, you should know what the benefits and downsides of the various J2EE containers are, and in fact, you need to know what using J2EE in the first place is buying you. Make informed decisions that help you solve your problem.
JSP, Servlet, PHP, and Rails programmers should have experience with Java Swing, Java Web Start, and other technologies in order to decide what the optimal solution is -- or at least, the lead developer or senior software engineer needs to have an exceptionally wide range of skills in order to make these kinds of decisions.
My team was stuck for years on a project that was forced into a web application mold (using Java servlets, JSP, Apache Struts, etc.) which caused us relentless headaches for most of the time. It should have been a regular application! A rich client. For many reasons. Unfortunately, at the inception of the project, the project lead had firmly decided that it had to be a web application.
At my employer, I'm constantly learning new technologies to find new and better ways to solve problems. You need to be proactive and take the lead, and solve problems! I had previously been focused mostly on graphics programming, Java application and web programming, but when my project needed it, I learned about embedded programming, embedded operating systems, electronic design, microcontroller programming, etc., on my own. I learned how to do things that no one at the company has done yet, and I have found ways to make our product orders of magnitude better (10x smaller, 10x more battery life, 10x better performance). Since many of my colleagues are focused on their more specialized areas of expertise (e.g., Java application programming, or Java web programming, or functional testing, or database programming, or electronic circuit design), I actually am often frustrated because I have no one to consult with when I have a problem to solve.
You express concern about learning technologies you will never use, but the fact is, that unless you acquire some other areas of expertise, you will never know what is the best tool for the job!