- I try not to work with 2 languages at the same time
- Try not to carry paradigms over wrt var names, module functions, deployment options
- Keep a single editor (vim) for all of them
- I might need a few minutes to 'warm up', specially when dealing with go-routines, threads or a magical change in syntax (ex: from Javascript to Coffeescript)
- Warm up gets harder if I don't touch certain language for a while. Ex: Focusing on a single language for 1 - 2 days makes me extremely comfortable with language X, but harder to switch to language Y
EDIT: I see at least one example of someone who claims to use only javascript. I don't even see how this is possible. Not even a shell language? How do you deploy your javascript?
Perhaps they hand it off to the next person in the work chain? Most larger IT shops divide up their development and deployment staff along technology and language lines - it makes recruitment easier for the managers who only need to rattle off a list of languages in their job ads, and managers can better control their staff by withholding access to technologies perceived as desirable to work on.
Perhaps you ask this question because you work in the new-fangled full-stack area where one person does everything. IMO the "DevOps" doctrine is a huge step backwards for business integrity. The doctrine for IT shops previously was to keep separate the people with access to the data and those with access to the code, hence "Development" and "Operations" were two separate areas. Creating "DevOps" people who can change both the data and the code in the name of full-stack processes opens the door up to large-scale fraud by workers of their employers' data and even cash.
I would say I'm "equally productive" in all three, in the sense that I am comfortable in all of them, produce about the same quality of work for each, and rarely get blocked on problems because of something I don't know in the language. The volume of work in each is not the same, as they obviously are necessary for different things and at different times.
On a pure volume basis, I have a number of side projects that are 100% JavaScript (i.e. Node backend), so JavaScript is definitely the language I use the most. But in terms of expressiveness, I find C# to be the friendlier language over the long term, as my programming style has grown towards exploiting static checking for refactoring. Increasingly, I find myself prototyping things in JS, then translating portions to C#.
I would ultimately like to replace C# in my workflow, though. It's difficult, as I don't like the Java tool ecosystem. I like progressively enhanceable tools, stuff that one can do a very simple Hello World in without requiring a package manager or project template initializer, and add components to as you require more complexity in your projects. That's absolutely tied to how I learn new languages by running side projects in them. I hate having things in my project directory that I don't understand and thus can't stand the modern trend of starting a beginner's tutorial with a language's own, custom package manager's "init" command.
It depends on the language, but it's usually the same project: either Tetris or a text adventure that eventually gets upgraded to be a MUD. I find it to be a great way to learn languages: you get the basics of data structures and control flow right up front, then you jump right into either graphics or networking. Tetris was how I first learned C# (coming from Java), and MUDs were how I first learned Racket and Node.
If I had to do it over again (alright, when), I'd try to segment the work better. I was writing a service in Ruby (Sinatra) and consuming it from ObjC. I should have planned better upfront so I wouldn't be hopping so frequently. Like, I don't know, spec out my API instead of just writing it.
I find I typically mistype things 3 or 4 times per day, like var instead of int for variables, bracket positioning or === which has gone from looking completely weird to now looking correct, leaving me feeling that my comparisons in C++ are sloppy. I usually catch it immediately and if there is a productivity cost, it's so small that I don't notice it myself.
Nowadays, (moved on to another company) the first half is in Scala (Play), HTML/CSS and Javascript for a web project and the second half in Java (Android) for a mobile project.
It has been not been that difficult to manage switching between languages unless the programming paradigm changes (Java <-> Scala), but even that you get used to. The major goal is, in my opinion, to become so proficient with the language(s) that you're working with, that it becomes second nature to transform your thoughts to source code. Very much similar to learning a second natural language. It's not really necessary to learn the ins and outs of each language that you work with, but at least the stuff that would be required.
Some problems that I had,
* Realizing it takes time to get used to the context switch.
* Using different editors. I was doing C and bash coding in vi, but working and modifying Linux source in KDevelop, mostly due to changes in coding style like tabs vs spaces. Java(Android) coding was in Eclipse and HTML/CSS/Javascript was in Sublime Text.
* If you go off one lanugage for a couple of days, it takes some time to get back into it. Doing at least a few things daily keeps one in the flow.
* Static compilation helps a lot when we make mistakes after a context switch. Javascript and Bash proved to be a major pain for this (I did try out JsHint for Sublime, but it slowed the system down, so I went back to looking at errors in browser console).
I find the biggest hassle working with multiple languages is trying to keep the libraries and data structure interfaces straight (i.e. push, extend, unshift, push_back, cons, :, ::, ...). Once I get into the language mindset the syntax itself doesn't seem to be much of a problem.
I think I'm probably the most productive in python, mostly due to the huge ecosystem. I'm happiest when solving problems in haskell though, and increasingly I like rust (really hoping for higher-kinded types, which would put it in the running for my favorite).
At my previous job I got to use Racket quite a bit, and I was about as productive there as I am in Python.
I'm a proponent of using the most appropriate language(s) for a particular project, but sometimes the powers that be will demand something particular (around here, they usually want C++ or Perl). We've got a static analysis project slated to start next year, and I'm hoping to talk them into letting me use OCaml. We'll see...
My productivity in any of them is usually pretty decent, but it depends more on what I'm doing. In Dylan, I'm often hacking on the compiler or the runtime, so that's harder and slower going than doing some web services in Python, or Javascript for some visualization / UI. C++ varies from fairly easy work to modifying the standard C++ library to add instrumentation hooks, so again, the productivity varies.
I'm now only using python for simple scripts. The one thing that kept me away from python (among few others) is modifying functions do not return values, which makes code unnecessary verbose and wastes my time in debugging since I always forget about that. I'm hoping someone will create a "coffeescript" for python since the python ecosystem has pretty much everything from web to machine learning.
Productivity: Java feels more solid than the scripting languages, but is extremely verbose. Python is the easiest dynamic language I've worked with, it strikes a good balance between speed of development and consistency. Codebases in dynamic languages don't scale too well, though especially when your refactoring tools are "sed" and "mv". OCaml is exceptional in terms of error-checking at compile time, readability, speed and small LOCs.
Working in any web stack, you are likely to use Javascript (almost) on a daily basis. And much less likely to use Javascript or Javascript-based technology on the back end.
I think I would also add SQL, for the "not no-SQL" backing store. This is a funny beast: a programming language which (arguably) has not originally been intended to be used as a programming language, but often is.
(I use C# for the middle tier, but it could be anything depending on the stack.)
At home, I experiment with IBM 370/390 assembly. However, since I have yet to figure out how to run anything even using an emulator, I think it would be more counter-productive than productive.
Setting up a Java project takes excruciatingly long but after that, it's worth it. Having code logically organized saves time in the long run. PHP and JavaScript give you short term productivity gains but after a while, there is a feeling of being lost in the woods.
I have to say that since I've started working on AngularJS apps though, JavaScript seems much more pleasant.
I developed my dev skills more in RoR than PHP, so tend to feel more at home there, so switching isn't as natural as it could be (partly because it's mainly flat PHP, MVC feels more intuitive).
Python and bash are the most productive, but quickly become troublesome as program size grows, at which point I switch to Go. C and C++ are necessary to interact with system, third-party libraries, and extreme performance on occasion. Javascript is just an unfortunate necessity for the web.
SQL and PL/SQL
Java (server-side stuff that uses the db)
Perl (server-side stuff that doesn't use the db)
Unix shell script (ksh93; server-side stuff that mostly just calls other things)
They're each suited for different things, and I think my productivity is better than if I tried to do everything in a single language.
- Most of my time is spent on Objective C, Swift and PHP for side projects.
- Sometimes I use Objective C in Swift, PHP in Objective C, not super annoying as the IDE marks these as errors
- Productivity is not awesome but its a cost that I have to pay to work on more than one language.
if I stack with C# Stile it's OK but if I do same Objective C or PHP. it's .... ;-(
Most productive when working in the SQL/C#/JS parts of our stack and then need a warm-up period whenever I delve into the VBScript areas.
I'm much more productive in Ruby or even C#, just able to get more done and happier developing in those languages too.
At home, I dabble in m68k (Amiga) assembly and C.
On the bus, Racket (don't ask me why).
Go/Node in my free time(hobby projects).
Then some Clojure exercises lately, but I'm not actually building anything. Yet.
More experienced developers will add a preprocessor for each of those: slim (or haml, jade, erb, etc.), scss (or less, sass, etc.), and coffeescript. You're writing in the preprocessor, but debugging in the language it compiles to, so we're at at least six.
Now if you're programming a webapp with an actual backend, you'll need to use some middleware:either Ruby on Rails (my personal favorite), Python's django, Cake PHP (or whatever the cool kids on PHP are using these days), C#'s .NET, or Perl's dancer. The reason Node.js was a big deal was that it let you save a language here: you could re-use your javascript skills on the backend. The framework is so dramatically different, though, that I'd still count it as another language.
Now we're at seven.
Presumably you'll be interacting with some kind of API that uses either JSON or XML, so we'll call it eight.
Maybe your ORM (object-relational mapper) isn't quite robust enough to handle a query you need to make to your database, so you have to dip a bit into SQL (or Mongo, Redis, or whatever popular database you happen to be liking right now). You could potentially skirt this by using a service like Firebase that will let you keep your javascript and json skills for your database, but I'm still counting this as nine.
If you're just an app developer, and you either work on some kind of team that has other people that like to do this next part, or you're rich and can afford heroku, then you can stop here. Otherwise we've got a few more.
To deploy your app you've got to know how to log into your server and install your app dependencies, so you've got to learn bash (and a lot of other nix tools, like ssh, scp, tmux, and vim, but those aren't really languages). Ten, easy.
One of the things you have to install is a web server like Apache or nginx. The config files of these things are a language unto themselves: they're both kind of* XML-ey, but not really. I'm counting this as eleven even though it's usually something people just pick up by changing variables of, and nobody's actually writing in the stuff.
So a minimum of eleven. Personally, I also take notes in Markdown, jump between projects that are using different preprocessors and backends, and get myself into more trouble than I should on the server side. On a given day I think it's fair to say this could hit twenty.
And that, ladies and gentlemen, is how I almost always won the "who knows the most programming languages" dick-swinging contests in high school and college.
I'm shit at css, but I do just enough of it to have a serious respect for the people who know it well, and I wouldn't refuse to call what they do programming.
If I had it my way, it would just be Rails. Much more productive.
necessary for cross platform development
C++ for the win. its annoying apple and google break the universality of C/C++ by forcing you to use tools built on top of C/C++ :P
JavaScript, Python at home.
SQL,
Golang,
Bash
(sadly in this order of frequency)
It's not necessatily on a daily basis, but mostly it's VBA.
App tier: Java
Backend: Oracle
<3 my job
Sometimes Im way more productive in Bash than in Python, sometimes its other way around, and sometimes Im most productive in Java.
You cant do web development with Bash so I guess me or anyone else would be infinietley more inproductive trying to use that for web dev.
Similary just some stuff you cant do in your favourite language.
Choose wisely and you'll be productive.
Well, actually... http://www.yolinux.com/TUTORIALS/BashShellCgi.html
If you gonna go that road, then use netcat echo and loops for a web server too.