HEMANT KUMAR: So I would ask our panelists
to come forward and chat.
So Chad is, Chad Fowler is the author of The
Passionate Programmer
and he has been a-
CHAD FOWLER: Yes?
H.K.: He's been like, he's one of the oldest,
one of the oldest Ruby guys around. He's embarrassing
me.
C.F.: I'm one of the oldest people here. Thank
you Colby (00:01:00).
H.K.: And next, Yogi. Yogi is principal architect
of Flipkart
and he has obviously worked in one of the
largest
deployment serve and supply chain in Ruby,
and yeah.
Next person I'm gonna ask is Baishampayan
Ghose, uh, BG.
Is he outside? Can you, can anyone? So. You
guys can sit.
C.F.: Yes, what?
H.K.: You guys can sit actually.
C.F.: He wants us to sit down. Sorry, I'll
sit.
H.K.: So, yeah, our next panelist is Baishampayan
Ghose.
He is a polyglot programmer
and he is CTO of Helpshift, a start-up running
from California.
And last I would like to call on Venkat Subramaniyan.
He is CEO of Mahaswami Software.
He has been programming in Ruby for like ten
years,
and for a real long time, so.
OK, so we'll start the panel discussion by
asking the panelists like,
what is your current language of choice primarily,
and why? Swami, Venkat.
Venkat Subramaniyan: OK, we use primarily
Ruby.
We've been using Ruby for the past, I mean,
writing bigger-sized products since six, seven
years.
But we use quite a bit of Java along with
it.
H.K.: Why? Like, why do you use it? (00:02:51)
V.S.: Well, see there is some very, like,
well-established libraries, like reporting
GINs,
and several stuff that you don't want to really,
you know,
try to match from the Ruby side.
So we just bring the best of both worlds by
cutting forward all the good libraries.
Jewels we have used quite a bit. Jasper reports.
These are all stuff for which there isn't
an equivalent exist,
and we just want to use the knowledge
and, you know, the well-established software
there,
for their purpose. So that's one of the main
reasons.
Baishampayan Ghose: So we use multiple languages,
but,
Closure is our main programming language of
choice.
We have been using it since I think late 2008.
We're one of the first companies to put Closure
into production.
We use Closure because a variety of reasons,
but,
I guess if I have to say name a few reasons,
that would be,
Closure lets me focus on the problem,
and it pretty much gets out of the way.
And there is a lot of focus on awesome things
like immutability,
data as a main construct for doing competition.
And of course it's a lisp so I get all the
power,
and it's also something that runs in the JVM,
so I can also leverage the awesome Java ecosystem.
So yeah, but, at the same time,
we do use different languages for different
needs.
We have used Erlang in the past, we use Go
as well,
and of course there is JavaScript and a bunch
of other languages.
H.K.: So do you think like, let's say,
Closure doesn't seem to be right language
for
how to write utility to you know like
do something on my OS X, for example.
If I auto-install something or manage processes
or anything.
Do you think like it's a right tool for that
sort of thing?
B.G.: So, to build your, if you want to build
a small utility,
you'd need a faster start-up time,
and that problem is inherent in JVM.
It has nothing to do with Closure, per se.
But Closure also has something called Closure
Script,
which lets you write whatever code that you
want to write in Closure,
but then the compiler compiles it down to
JavaScript,
and basically you can create a node.js application
out of Closure code.
You get all the flexibility and constructs
to build abstractions that Closure provides,
but you can target, you know, different run-times.
So you can run, you can build a shell utility
as well.
C.F.: Do you actually do that?
Do you like write command line programs?
B.G.: We've done it a few times. We've done
it a few times.
It's not something that we publicly do, but
yeah,
Nailgun is another upload that you talked
about in your talk, right.
And, so yeah, so that's what we do.
But there are other hacks, like tweaking
the boot class paths in JVM to make the start
up times faster.
That's what something learning new is in Closure.
There are ways of getting it, but yeah, you
are,
in a way, right that, by default, it's, Closure
is probably not a,
not the right run time for building shell
utilities.
H.K.: OK, so, before we move to Chad, like,
you said like,
all the power of lisp actually,
so, can you elaborate on that?
What do you mean by all the power of Lisp?
B.G.: Sure. So, how many people use Emacs
here?
Twenty percent maybe. You do?
C.F.: No, I don't personally.
Never.
B.G.: Never? But you talked about Emacs
as well as good software systems.
C.F.: Not to use, though, just as an example.
B.G.: Just to talk a lot. Anyway, so Emacs
as a software
is thirty-five years old today,
and still is in production, so to speak,
you can still use it.
So, what can we learn from Emacs?
Well, the language is always available to
use,
right, so if you compare it with, let's say,
Python or Java, there is a difference between
compile time and run time. When you are running,
the language is not available to you.
You cannot, you know, manipulate the code
itself
while it is running, or generate new code,
dynamically.
So that is one thing that lisp dialect exploits
by design,
because they have something,
a property called homoiconicity,
which basically means that the code and data
are pretty much the same. Even though they
may not be identical,
but, for all practical purposes they are the
same.
That means when a Closure code is running,
it can manipulate itself while it's running,
and it can maybe generate new code, optimize
something away.
So basically it lets you write code which
writes more code,
so, and that is something which is always
preferable.
It is better to write a code that writes more
code
than to just write code. So, and there are
many other features
that lisp has, for example, the language itself
is so simple,
like there are just few primitives to understand
and learn about.
Syntax is pretty much non-existent,
and very simple to understand and learn.
And that really reduces a lot of cognitive
overload
that some languages might introduce.
So yeah, I mean, these are probably a few
superficial advantages.
I can go deep into it, but maybe we can talk
about it after.
H.K.: Yeah, so, Chad, like, what is your poison
of choice?
C.F.: My poison of choice?
H.K.: Yeah.
C.F.: I guess, it's hard to answer that question.
I don't have an answer, right?
The one single answer I could give you is
anything except for Ruby.
H.K.: OK.
C.F.: And I mean that very seriously.
I remember in 2007, I was at MountainWest
Ruby Conference,
the first one, that Coby was talking about
earlier,
and I did a keynote, my first- no, it wasn't
my first keynote,
it was my first Ruby Conference keynote.
It was about, like, what do we do next, after
Ruby?
And I was already deep in the like toil
and stress of being worried that I identified
too heavily with Ruby, in 2007.
So I wanted to like get out of the Ruby thing
and not be the Ruby guy,
and I'm still desperately trying to do that.
But, no, I mean, like, I said,
when I was speaking earlier,
I'm using Closure, Scala, Node, Java, Objective
C, Ruby, Erlang, everything,
at work right now. I think probably what I'll
learn next
really seriously is Objective C.
But I'm going to try to use it, even on the
server,
as like a language to develop services in,
just as an experiment so I can learn it better
and do better job on the clients.
H.K.: So like not Ruby?
Is it because like you already had kind of
a Ruby like,
you obviously work with Ruby as like with
the,
along with Dave Thomas, and all of these guys,
you were one of the earlier adopters of Ruby,
so like, are-
C.F.: Yeah, because I will never learn anything
else about Ruby,
cause I know everything.
No, it's- I'm always suspicious of myself
when I identify too heavily with anything
extrinsic to me.
Like for me to say I am a Ruby programmer-
if I say that, I feel bad, and I know that
I've made a mistake.
I know that I'm creating some rigidity of
value
that is ultimately counter productive to my
success
and to the success of people around me.
So like I've been doing more Java in the past
month
than Ruby, which I used to do full time in
1999.
And it's been a really good freeing thing,
like I am not a Ruby programmer, I am a programmer,
and even that is kind of limiting,
because I'm more and less than that at the
same time.
So it's not so much that I'm worried about
Ruby itself,
it's that I'm worried about putting myself
into a bucket that I can't get out of,
even if it's a subconscious problem.
H.K.: OK, Yogi. Yeah, so what do you-
Yogi Kulkarni: Sure.
So, if you're asking about personal choice
then,
sure, you know I like coding in Ruby.
I just love it because it's compact.
I feel the translation from my thoughts to
code is shortest in Ruby,
so it just feels very natural.
But that said, I think I've moved the last
seven years
from being a kind of a language geek, of sorts,
not really, but, I used to love program language
theory
and getting into stuff like that,
but to actually not caring too much about
it.
I think programming languages are good,
and they kind of get you excited,
but when it comes to actually solving hard
problems,
it's the ecosystem that matters around that
language.
Things like the tools, the profilers, the
monitoring tools,
debuggers, you know that's the stuff which
no language
is gonna save you when you're in production,
right.
So you just need to have that,
the maturity of an ecosystem is really important
there.
Which is why we keep going back to the JVM
over and over,
and even the new languages are being built
on the JVM as,
it's for exactly that reason.
But among the newer languages on the JVM,
I'm actually surprised that I've- so, I'm
kind of
intrigued by Closure and Scala.
We actually looked at Scala very carefully
for the system I spoke about.
But I didn't think it gave the kind of jump.
I felt was kind of marginal,
the improvement over just doing good Java,
that Scala gave, that's arguable.
There's a lot of language features there,
possibly too many language features,
which is one of my concerns.
But Closure, we looked at that also,
but we didn't look, we didn't actually
take it that seriously, because of basically
the prefix notation being too alien.
We wanted something block structured
for people moving from Java to Ruby.
So I think, yeah,
those are the kind of things that are on my
mind.
H.K.: OK. So, Ghose, do you- I'm gonna call
you BG, OK?
Yeah, so, BG, do you ever like,
the programming languages do not matter all
that much,
do you think the state of it are like if you
improved like-
B.G.: I'm told Alan Pearl is here,
and he basically said that programming language
basically shapes the way you think about solving
problems.
So even if you do not use Closure or Scala
or whatever fancy language that comes out,
you should try it out because ultimately
you're trying to solve a problem, right.
You have the problem at hand,
and you'd like to look at the problem from
different perspectives.
See if you only have one way of looking at
the problem,
then you know, by repeating the same approach
a
thousand times is not going to help you.
You should look at different ways of
maybe approaching the problem,
and even understanding the problem itself.
Simple example, parallel processing can be
done using threads.
You can use quarantines.
You can use CSB, you can use Actor.
What should I use, given any situation?
So even if that- if I don't even know about
Actors or CSB,
I'll never be exposed to that line of thought,
so that code is basically to learn a language,
not to just switch wholesale to that language,
but to be able to appreciate new ways of looking
at solving problems.
Y.K.: So I think that's a great point, and
when I,
kind of, I missed mentioning this, see,
when I was a program language geek,
I think the one great important inspiration
for me was SICP,
right, structural interpretation of computer
programs.
And that's something which, again, goes back
to what is,
what are the fundamental abstractions again,
you can reach out to solve problems of different
natures, right.
And that was the crux of it, you can use data
as abstraction,
procedures are abstraction,
stream processing and actually creating languages
of your own.
So the point is that there are far more paradigms,
right,
and I think getting a grasp of those paradigms
is very critical,
but for that you don't necessarily need to
go
every new languages around for you to see
what
ideas are implemented well in which language,
what can you adopt.
Take for example, after reading SICP,
I think my Java programming became so much
better,
I have said using more anonymous functions
or classes,
yeah, that's ugly but, so yeah. So I totally
agree with that.
H.K. So we, you talked about like,
how many of you heard of like something like,
or used a after patch in full or any sort
of concurrent programming,
can we have a show of hands?
OK, so, anybody wants to explain like yeah?
B.G.: There is nothing to explain.
Just go and read on Wikipedia.
C.F.: Or DFM.
B.G.: Or DFM, yeah.
H.K.: So. Which language you think like does
the whole active pattern problem programming
properly?
B.G.: So Actors are well implemented in Erlang,
and Echo, if you are using Scala, so take
a look at it.
And again this is not a single bullet,
again go back to your own basics,
Fred Brooks told you guys many years back,
go back to your basics. (00:16:28 - ??)
So Actors will not solve all kinds of problems
for you but you should be aware that there
is
another abstraction that I could probably
leverage
to solve whatever problem that I have and
can.
CSP is another thing that I briefly alluded
to.
That's something that is embodied in Go.
So Yogi just said that you don't need to learn
a programming language,
but look at systems where all these ideas
are well-implemented,
but I would also argue that not all ideas
can be implemented as well in all languages.
So you cannot, for example, Java does not,
I mean,
Java has something called Lambdas, but Java
hasn't,
does not have any of those functions.
So if I really wanted to understand the value
and virtues of any of those functions,
I can't learn it through Java.
The closest I'll get to is dependent injection,
but that is yet another level of abstraction,
which basically removes me part of the way
from the core goal, right.
So there are languages which are design to
level certain principles.
Go for example is built on top of CSP,
and the channels are a first class thing,
Erlang, also has something similar.
So maybe learning those languages will expose
you
to those ideas much better than something
other language.
H.K.: Chad, you want to-
C.F.: Yeah, I think from a,
from the perspective of learning the paradigm,
I think Yogi is lucky that he is smart enough
to read a book and then get all these things.
My experience is not the same.
I'm honest about that.
I don't think you're not being sincere,
I think some people, including me,
have to actually use the thing,
not just the language but the paradigm.
So like I can read about Actors in five minutes.
I totally understand it from a theoretical
perspective.
But it takes awhile,
and it takes actually trying
for me to really get where it makes sense,
you know.
B.G.: To appreciate it.
and also to appreciate the edges of it.
So I actually think like,
I've been trying to get out of Ruby
as I've been saying.
I mean the truth is I have learned,
I don't know how many programming languages
since I started doing Ruby,
but I have never stuck to one.
I have, but you know,
I have rarely stuck to one long enough to
where
I really, really thought like that,
and like the best case scenario for me
in picking up these other paradigms is to
like
get so into Go programming that then I go
back to Ruby,
and I go to do something, and I don't try
to implement channels,
I just say, damn it, channels aren't here,
I'm frustrated now.
And it, I see that this language isn't perfect
because no language is.
But you can't get to that point,
and that's like where the maturity comes from,
where you're not in love with any certain
thing,
and you're, you see the entire landscape,
and this is a part of why I can't answer the
question
of what my go-to language is right now.
Like I'm doing a lot of Scala because there
are certain things that I'm working on that
work really well with Actors.
Like I can conceptualize them with Actors
and that's what I'm gonna-
I'm gonna write it in Scala because we already
have the JVM,
so therefore it's easy to do Scala versus
Erlang.
H.K.: But still there's a problem here.
Like the way you approach programming language
for example like in Ruby world for example,
like Eric Hodel or [00"19"54] ??
these guys are maintaining tools that you
have written actually,
for many years back, and those tools all have,
like for example Ruby gems didn't have proper
test suite for awhile actually, and like the
building-
C.F.: That's because tests are a design smell.
That's why.
H.K.: My point is like building a tools like
of a language,
around a language takes time actually.
Do you think like for example like Eric Hodel
and these guys are probably working with this
thing
for like nine years or so,
and they're still doing it, right,
so how do you like, if, how do you fix that?
Like you need to stay long-term in a language
to really change it, right, or like am I wrong
here?
C.F.: You mean you need to stay in it to change
the language itself?
H.K.: To change the language or build like
the infrastructure or the libraries, gems
to support it.
C.F.: Yeah, somebody does.
It doesn't have to be me, right.
B.G.: Again, so let me add something to what
Chad said.
So Chad said that I don't want to remain a
Ruby programmer.
I think what he means is the Ruby mindset,
OK,
or any mindset thereof. It's not about writing,
just coding that language.
So you can still be a Ruby programmer for
twenty years,
but that doesn't mean you keep the same mindset
all the time, right. There are things which
are not even new,
but we are not discovering those things
because we are not looking beyond Ruby.
H.K.: Can anyone else, sorry -
can anyone else carry the mic
and give it to the audience actually because-
there's no mic
B.G.: It's not just about Ruby, per se, right,
it's about any- it's applicable to any language,
like JavaScript, or Scala, or even Java for
that matter.
V.S.: So this, this is kind of intrinsic to,
something intrinsic to all we actually select
a language or set of languages to develop
these tastes,
depending on the nature of the problem,
I guess you pick what is called like a language
to which other languages can actually circle
around
and support various smaller problems,
whereas this core language that you're picking
is solving
like majority of the nature of the problem.
For example, web application,
but you got some parallelism stuff
that you need to do or you got some
functional programming stuff you need to do
like Scala,
so you probably pick one language, well like,
Ruby, as to kind of like hold everything together,
but you do have these other languages in which
you actually solve problems differently.
So it's more of- but different problems in
some contexts,
Scala may be the code language,
and you may want to wrap it around Ruby
a little bit or maybe other things a little
bit as well,
so it's more of starting from the
architecture of the nature of the problem,
but being polyglots, you have this choice
now,
not to implement and struggle with one language
like you just talked about example, but I
wish
channels were there in one particular case.
But now you could pick, if you can become
a polyglot
and learn these other languages to a good
degree,
you could pick other languages to compliment
it
and solve those specific problems. So this
seems
to be an approach that's kind of intrinsically
developing right now.
QUERANT: I have a point very close to what
you're saying.
Like based on, like especially what you said
about languages, right.
Like a general message could be use the right
tool
for the right thing kind of a thing,
but the problem could be that not everyone
can pick up,
so when you go into a code based on,
let's say, five different languages are being
used
for the right kind of problems,
so they are doing the right thing,
but for someone to go into that code base
and pick it up would become very hard right,
because not everybody's turned in that way.
So that's like, so polyglot comes with a very
heavy cost
of being able to replace yourself.
At least that's been my experience,
so that's my first question,
and like adding onto that like it's very easy
like you said you know like to pick up a book,
read through it, go through some you know
tutorials or whatever it is but like Yogi
was saying how his team had a,
they needed about three to four months
to start writing idiomatic Ruby, right,
and that is a big deal,
because in those three to four months
it's critical that you keep churning out code,
right.
You'll kill yourself or you can't
come to a halt because now you're getting
this new language on board.
You guys had the luxury of having an existing
system,
which was, and you were replacing that system,
but that's not necessarily always the case.
You have to write, so- yeah, so
H.K.: [indecipherable] (00:24:14)
QUERANT: Yeah, so like my second point was
around, like,
that was the first question for polyglot recruiting
and things like that would become very hard,
how do you know that.
Second, it's easy to pick up a language on
a theoretical sense,
but to be able to start writing idiomatic
programs
while also developing production-quality code,
do you guys have any experience about how
you got that working?
H.K.: That was the second question here that
I was about to ask actually, which was like,
at least one part of, but like,
how does an organization adopt a new you know
like language?
For example in Flipkart, like,
or the company where all of us work,
like you know like there's a,
in January a programmer decides I'm going
to build
this program in Erlang or I'm going to build
this thing
in Go and there's nobody else Go,
nobody else doing Go,
so as like you guys,
a senior person in your respective companies,
so do you listen to that guy or -
our deployment system is attuned for like
JVM deployment
or Ruby deployment and whole package management
or whatever,
and don't write this.
So there is like an aspect of like adopting
a new technology,
hiring, you know like the skill, the idea
of entry,
like in code business which are like- so how
do you tackle that problem in general?
Y.K.: So it's a hard problem, right. So at
Flipkart,
we were already fairly polyglot,
for example we all, the website is in PHP,
the search engine is in Closure,
the UGC system is written in Scala,
Java is all over the place,
Ruby came into the supply chain,
node.js is there in the seller platform and
more.
So we were already there,
but we actually ran into a few problems there.
So when, I think the question of technology
selection
is actually quite critical.
Very often a lot of it is driven by,
is mostly blog-driven decision making,
and that is, that can be quite scary.
So we've started to put in some kind of process,
it's hard, it's not worked so far.
We've been trying for one year
and the process is like,
you know OK go up to somebody else in the
team
and just ask them, just bounce off your thoughts
first before you kind of take up a new system,
a new technology.
So we tried to formalize that, we failed miserably
at it.
But right now what we have set focus on is
interfaces.
So we've become fairly diligent about
making sure that the interface and contracts
are good,
building systems, and then the systems can
call independently,
whatever tech stack they use,
as long as the team is committed to it,
that's not a completely way-out language.
So we moved from being predominantly
thrift-oriented interfaces to HTTP,
and that's added a huge amount of value.
QUERANT: Can you say what thrift is? (00:27:06
- indecipherable)
Y.K.: Sure. So Thrift is a binding protocol
which came out of Facebook I think,
so it basically gives you both RPCM point
and a data utilization mechanism,
so it's basically like Corba,
but it's, so it basically gives you a fast,
uh-
C.F.: These people are too young for that
actually.
Y.K.: Oops. What is Corba? Yeah.
C.F.: Do not ask that question.
B.G.: That'll be a big panel discussion by
itself, right.
C.F.: You have to be at least twenty-one to
hear
about Corba and not everyone in this room
is twenty-one.
Y.K.: Protocol buffers. It's more like that,
OK anyway. So-
C.F.: I think connection is open too, right-
Y.K.: Sorry?
C.F.: You can keep a long-running PCP connection
with that.
Y.K.: With Thrift you can do it, yes I think
so. Yes.
C.F.: You can keep a long-running PCP connection
open too,
which makes performance better than HTTP in
some cases.
Y.K.: Right, but if you already moved to HTTP
1.1%
connections that's kind of taken care of.
So yeah most modern libraries have that. So-
H.K.: We are digressing I think-
Y.K.: Yeah, where were we?
C.F.: Let's keep digressing, let's go.
Y.K.: We were talking about the language and
like the context-
Y.K.: Right, so we become pretty delusioned
about contacts,
so HTTP and the, and actually having sensible
rest end points
and resources has become kind of defacto,
and that's actually helped a lot.
So systems within Flipkart are extremely open,
you can actually query them pretty easily
to extract data,
not push data to it, but yeah, so I think
that works.
And then each team can independently take
decisions
with some guidelines at hand,
so we kind of brought people towards
a few languages and technology stacks that
have worked,
but not insist on it, so if somebody goes
out and says you know,
Elixir is also meant for these reasons,
we'll at least ask them that OK,
does it check a box on tooling,
on some mode of profiling or monitoring,
and basically a small check list of sorts.
We have not implemented this yet.
It's probably going to-
shit's going to hit the fan when we kind of
suggest it,
but yeah that's the idea.
C.F.: Our solution is a little more messy,
I guess, as you would probably expect from
me.
But like you said, not too way-out language,
I like the way-out languages, and I would
like everyone
to be able to do any weird language they want,
cause I hate that being a thing that people
talk about
and are frustrated about at work.
Such a stupid thing to worry about.
So as I talked about in my talk this morning,
I will tell developers, any language you want,
fine,
go ahead, but you have to write very little
code,
it has to be a very small well-defined thing.
We are also working very hard on the interface
definitions,
and that's why I was talking about that JSON
Schema validation stuff,
to add one more layer of monitoring to it.
But most importantly, I want to hire people
that I trust,
and I want to show them that I trust them.
So if someone really, really wants to do something
in Elixir,
and I have one guy who really, really wants
to do something in Elixir,
he actually proposed it for one project and
I said fine,
whatever. Then we realized we needed to do
a lot of stuff
that talked to Amazon SQS, and there was no
good Erlang library
or Elixir library we could find,
so we did it in Scala instead, because it
was easier.
But he made the choice, not me, and so,
like, we have one thing in Lua even, in engine
X.
I would love to have like Assembly and Objective
C on the server,
you know any, maybe, I don't know, Visual
Basic,
does that still exist? We could do that too.
Off-screen: It totally does.
C.F.: Yeah, it does. All right, awesome.
Server-side Visual Basic.
B.G.: So I guess it's more of a cultural problem,
it's not really a technical problem.
And I think it can be solved by setting the
right expectations
and what Chad said, totally agree. Trust your
team members.
Give them the opportunity to try out new tools,
and you know, prove them.
So what we do is that, when a new programming
language
comes out, any way as such we are using a
cool
and really hip programming. But if something
cooler comes out,
like, I don't know, something might come out
tomorrow.
But we always have encouraged people to try
out new languages
and maybe build a internal project and show
it to us
and we take a collective decision in such
cases.
But, yeah. So I think it seems more like a
cultural situation,
and as far as hiring is concerned, I think
it's better off,
better if you hire programmers, instead of
Ruby programmers
or Java programmers, or PHP programmers.
Get people who can write code and who can
learn new things,
because even in the Ruby world, you are doing
new things every day.
If you cannot learn new tools or techniques
then you are stuck.
QUERANT: (indecipherable - 00:31:57)
B.G.: A code base, you are talking about a
code base.
QUERANT: (indecipherable - 00:32:04)
B.G.: So idioms are formed over time, right,
and they are also learned over time.
So if you are working on a sufficiently complicated
code base,
any way will take you some time to grok it,
if there's and existing code base.
Now if you were trying to learn something
and to build something fresh.
It will take you some time, there will be
some iterative-
some iterations, right. That, I think is perfectly
normal.
C.F.: Yeah, I actually meant to answer the
idiomatic thing.
If it works and everyone can understand it,
I don't really care.
Like let it look like Java code written
with Ruby syntax. Doesn't matter if it performs
and the person enjoyed doing it and it,
you know, didn't take them forever,
and it's not completely confusing.
But, and my answer to that is keep it really
small.
If it does, it doesn't matter if it's idiomatic
at all.
H.K.: But there's like-
B.G.: Another thing, just one thing that I'll
add is that,
how do you really define idiomatic code, OK?
A code in which you are able to leverage the
features
of a programming language the best is idiomatic
code, right.
So if you're championing a programming language
you are trying to introduce the new programming
language to your company,
and of course you'd like to exploit all its
features, right.
Unless it is handed down to you by your boss,
right.
So if someone is championing a new programming
language,
it's his prerogative to you know to learn
what the idioms are,
maybe figure them out over time.
H.K. This not working?
B.G.: Yeah that doesn't seem to work.
V.S.: So it's gonna be a slow process, you
know,
obviously we just talked about lots of languages,
and the key thing is are we doing in house,
we have control of the deployment environment,
versus, we are gonna consult.
So for example, Flipkart, or, in several cases,
that there's a lot, you're in control of the
whole thing,
that, and you basically decide, or,
you live with the consequences of the whole
thing, right.
Then when you're dealing with the customer-based
solution,
obviously there's a lot more constraints as
to,
you know, he would look for somethings that
he can
add more people to work with as opposed to
just you,
and what if you can go away,
and in-house holds the same problem.
So probably to start with just learn one more
language.
Just learn one more language and start using
it,
and it's gonna take some time, like you said,
it's just cultural thing, you know.
Particularly in India the context is not just,
you know, just start with one more language,
try to use it in deployment,
so it doesn't look like you're grabbing this
opportunity
to as many language as possible into solution
you build,
just for the sake of learning new things.
But just do one more language, carefully.
But in order for you to do that
you probably will have to casually learn five-six
languages.
And you may want to pick that language
that you want and it's gonna be a slow process.
You're not gonna be able to finally deliver
all this,
and then you know, introduce a new language
just like that next day.
C.F.: Yeah, when I started learning Ruby,
I started using it in 2000 network,
and it was to generate Java code,
because no one would let me deploy Ruby.
So I just wrote Java generators
and I wrote everything like as a DSL in Ruby.
V.S.: Yeah absolutely.
My first experience with Ruby was not really
mainstream.
We were just doing, it was called load disk
conductors.
It was an OpenSource thing that we were just
doing.
So what we wanted is we wanted to drive these
command lines,
and Ruby was a language to do that.
So there are other opportunities for you to
use
new languages may not be in your main code
base,
all the supporting tool systems as well.
So there's a lot of opportunities,
so you may not look at it as,
can I change my main language, or how soon
can I do it?
K.H.: So-
Y.K.: So, one of the, I don't know,
this is a thought, this has been kind of crossing
my mind repeatedly,
and kind of worrying me, also.
So I used to be kind of involved in the language
choice wars a lot,
and always on the now try out something new
side.
And I've kind of discovered a completely
different way of working at Flipkart,
and some of the other people who've been there.
They kind of shook me out of,
maybe my Thoughtworks influenced it in a certain
way.
So, and there's a very key point when that
happened.
So I think the difference was this, right.
The take-away was that,
if I'm arguing about a programming language,
I probably don't understand the problem domain
well enough, right.
And I've seen cases where systems have been
built
which go fundamentally towards the problem
being solved as really about,
and modeled the code abstraction so beautifully,
that then, or it identified the co-op section
so beautifully
that it doesn't matter which language you
implement it in,
because that problem is solved.
And even before we started implementation
that is beautiful.
I think with this giant perspective,
I think somewhere that has got lost.
We try to kind of get into implementation
much sooner.
So if I could actually go back and say what's
the most,
my favorite programming language,
I think I would say domain-driven design actually.
I would actually just recommend people to...
oh and actually do that on my team also, too,
actually read that book and try and apply
it.
Because I think a huge set of wins are possible
from that,
without even going down to the programming
language level.
C.F.: Yeah, the programming language is a
tactical choice,
in most cases, right, but the domain,
it's like what you were saying about performance
earlier.
You could use Java or you could use JRuby,
doesn't really matter,
because the database is gonna be slow, right.
When it comes to application design and architecture,
it's really a hierarchy, so domain-driven
design is
at a level higher than the languages.
I would still say that the languages make
you think differently,
and some languages suit different domains
better,
and having really open-mindedly going,
gone back to Java recently for various reasons,
I can tell you that it's terrible to use,
it really is.
It wastes my time compared to Ruby
and compared to Scala and compared to more
modern languages.
And it's not a knock against Java -
Java's older and doesn't have those benefits.
So I think tactically, it's a bit of an exaggeration
to say that the language doesn't matter, but
I get your point.
Y.K.: Sure. So just as a counterpoint to that.
Actually having gone from Ruby back to Java,
there's a few very low-latency systems that
we had to
build out recently and those are built with
some of the newer Java stacks,
like say dropwizard which has got Hibernate
integrated into it,
and Netti and, so it's basically a complete
stack
and actual systems and the designs that came
out of it
were actually pretty good,
and I was surprised and actually happy
to go back and look at Java.
And I actually enjoy looking forward to Java
ahead.
More than Scala in a sense.
H.K.: That's good, because-
So the Java aid that you mentioned and then
Scala.
So there's a couple of things
like if you talked about this Java like and
Scala like,
why would you choose like, for example, today,
like Java it is not released.
But what would issues like, is there any reason
to choose
like Scala over Java now actually?
Because now for example, (00:38:57 - ??)
is a good system, but it is usable from both
the languages,
right, so is there any reason to pick- Chad?
C.F.: Yes. So the question is,
is there any reason to pick Java over Scala,
or Scala over Java. Does one win?
H.K.: No, no, no, no. Just Java, like Scala
over Java, like-
C.F.: Is Scal- or, should you actually,
because of Java aid, does Scala need-
H.K.: Or Java seven, yeah.
C.F.: Java seven, then yes. Like.
For me I see Scala as like totally over-engineered,
in the same way that Yogi almost said, but
like,
too many features. But, and I'm even writing
a book about it,
but I kind of hate it.
That said, you can program Scala like Java
with less annoying syntax. You can do that,
you can make it be like a Java program,
and if you do, I would argue very strongly,
and maybe, and this is subjective
and maybe even kind of fashion-oriented,
I would argue that the Scala code is better
to look at
and easier to write than the Java code.
There's less typing, and I mean that in two
sense.
Less typing on the keyboard
and less having to explicitly type because
of type inference.
I'm sure, and like with Java seven there are
Lambdas,
with Java 8 I'm sure it's gonna be some sort
of
anemic thing that doesn't quite work the way
we want it to.
It's perfect in Scala.
There's a lot of great stuff about Scala,
as a next evolution of Java.
But, you can also, like Ruby,
with meta-programming and eval and all the
crazy stuff you can do,
you can completely shoot yourself in the foot
with it, too.
QUERANT: So, when we compare these languages,
like Java and Ruby and all that,
the thing that we kind of focus on is the
amount of,
volume of code. Volume of code doesn't lead
to the ease of understanding.
One of the thing that Java really does well
is things are so simple that there's no,
there's implicit stuff happening behind
the scenes and all that. And very, very well-factored
Java code
is not so ugly to look at.
We have written all small methods
and composed stuff out of it.
It's not so ugly to write or ugly to look
at it. So-
C.F.: I would like to answer that
even if you're not asking me,
cause I could imagine myself saying that
if I were in the audience.
But right now I strongly disagree with you.
I think Java is simple as a language, yes,
but what it leads to is, because of its lack
of flexibility,
it's not the volume of code that I hate -
I mean sometimes it is, sometimes it's literally
because
I have to type date date equals new date.
I don't need that.
But it's also the ability to be expressive,
and to me that's where Java strongly lacks.
It's pretty good as a system language, like,
at the point where you decide you need to
make that distinction,
but maybe as things get faster you don't need
to anymore.
But I believe that the abstractions that people
end up creating for Java,
at least idiomatic Java, like in the Java
world,
idiomatic is a bad sign, I would say,
because it leads to this kind of pattern soup
thing.
And it's true that you can reason about it,
because it's statically typed, and there are
less opportunities for meta-programming,
but it's a slow process in my experience of
reasoning about it,
because you get so far away from the domain,
creating all these factories and interfaces
and crap,
just so that you can make it testable and
plugable,
that it, the actual logic and the core of
the business gets lost.
Do you have a- anyone have a point to make
on that?
B.G.: So yeah, I totally agree with Chad here.
Java the language is designed to be very simple,
but at the same time it's also very rigid.
So imagine explaining philosophy to a kid,
right.
The kid probably has a vocabulary of maybe
hundred words.
How do you do that? You cannot discuss the
existence of God,
you know, or maybe the nature of knowledge,
in front of a kid, because the kid doesn't
have the vocabulary
that you need to communicate with that child,
right.
So what you end up doing is over-simplification.
So by the time you simplify the concepts to
the primitives that the child can understand,
you're far away from Aristotle and Plato,
you know.
So that's the example that I give you.
QUERANT: I have a question.
At what point do you feel comfortable or something
like a threshold level for new languages to
be used in production,
you know, like, there are some languages which
are
coming up now but you still you know
that it's not something that you use.
As for me I would probably look at an example,
if I would say OK, there are quite a few systems,
big huge systems based on Ruby, I could recommend
it to someone people who are comfortable say
if
they say it is OK if I use Ruby yeah say because
there are people who use it. But at production
level
when that new language is- at what point do
you feel
comfortable to say that, OK, this is viable
to use
in production?
B.G.: Fantastic question. I would say that
this is a
case that you need to develop over time, and
I think
it comes with experience. The more you learn
of different
programming languages, the better you get
at evaluating them,
but having said that, community support does
matter,
based on-
(00:44:36 - dead audio - 00:44:37)
OK, you can have a language which can have
a
huge community around it.
That does not necessarily equate to the language
being awesome, OK.
Documentation is also another thing, ?? (00:44:45)
is also another thing.
But again I would say that one of the ways
is to really see,
what is the USB of the language, what kind
of problem
is the language helping you solve, OK. If
you see that,
it's like you already know Python, and there
is Ruby,
not really very different, honestly.
So, but if you see Go, again, very different,
a lot of interesting concepts, and so you
might
find problems where that language might fit
in just perfectly, right.
So it's OK to maybe wait for a production
by a larger community,
but sometimes you have to be that champion
yourself, right.
Someone started using the language first,
when Ruby came out, right.
(00:45:27) was the guy, probably.
That's why he's worshiped today.
So why not be the (name) yourself.
QUERANT: (indecipherable - 00:45:37)
Y.K.: Yup. Yeah, so I think it's,
there are quite a few kind of milestones for
a language
to go through, but I think the most critical,
so again, it depends on the kind of client
that you're kind of suggesting this to, right,
like if it's a small start up then sure,
you have a lot more flexibility.
If it's a larger system, it has to scale,
you got different constraints.
But I think by and large the existence
of a very low latency production profiler
or on-time run system is probably that milestone.
The moment that it is in place,
a profiler which can actually run in production,
for that language, I think that marks a very
critical
milestone when the language starts evolving
at a very
different pace. Because you start kind of
finding issues
which you never had been able to find before,
right.
So for example, with both tools, we've been
able to do
amazing things in production with Ruby, which
was just
not possible before we knew, even the commercial
ordinative,
like ?? (00:46:35) for that matter, right,
so either a
commercial or opensource production profiling
tool I
think is a pretty significant milestone.
QUERANT: I have a couple of questions here.
B.G.: Right, Yogi.
Y.K.: I don't know. Haven't you seen production?
B.G.: The production level compiler which
you can plug into a running system?
Y.K.: So there are-
(00:46:58 - dead audio - 00:47:29)
B.G.: Yeah, but those are Valgrind but, which
is not probably-
Y.K.: Sure.
B.G.: I think, what I will say is that,
Yogi is talking about the presence of a profiler
being very important.
I think again it depends on the domain that
you are in.
What kind of company you work for, what your
challenges are.
It could just be documentation for you. Right
or it could be
just the existence of a all-out library for
you, right.
So I think it depends. The answer, real answer
is it really depends.
QUERANT: I have a question. Like when do we
actually
choose a interpreted language versus a compile
language,
is my first question. Like for example,
Ruby's interpreted language, and like Java
is kind of both,
like when do we actually choose that one is
the first question,
and second question is-
H.K.: Just ask one question. Please ask one
question.
QUERANT: Yeah. The question is asked.
Y.K.: So, OK again this is, as Baishampayan
said,
it's kind of a black art. But roughly the
euristics that I used were,
is primarily driven by is the system gonna
be
CPU-bound or IO-bound? What kind of latencies
do you need? Do you want
(00:48:27 - dead audio - 00:48:42)
I'd probably go straight away to
Java or any other static-type language,
which gives those kind of performance.
So I think latency is one. I don't know - you
might-
B.G.: So I would say that the differences
between
interpreted and compile languages, they are
kind of
like blurring these days. I think you, what
you really mean,
is a native language versus a language that
runs in the VM.
OK. So I think VMs are as fast as natively
compiled languages today.
And so for example, one of the lowest latency
languages
would be Erlang, but it's not really a natively
ompiled language for that matter.
So again, Yogi is absolutely right, it depends
on the problem.
If it's CPO-bound, maybe you should use a
language
which spits out a native binary or maybe
has a very fast git compiler inside of VM.
Or if it's IO-bound, which most web-applications
are by the way,
then just use Python, Ruby or whatever, or
JavaScript.
C.F.: Yeah, but in, it is a blurring not only
of that boundary,
but a blurring of concerns.
So like you said you have never used Ruby
for something that
requires that low-latency. That's because
Ruby's not fast enough,
not because it's an interpretive language,
right.
If it were, yeah, so I would personally say
on anything where
I don't mind having the source code present,
which means any
server-side thing for example, I would use
interpretive languages,
because it's a pain in the ass, I don't want
to do that.
And what all of these things do is the answer,
effectively
just compile it for you, anyway.
QUERANT: My question is for all panel members.
From invention of a competitive we're seeing
that
there are so many languages came and gone,
and each language right on the veil,
are serving out their time.
I would say that today Ruby is one of those
languages riding on the veil.
C is the only language which is there for
a long time,
and it is from the starting of the computer
still it is there.
So my question is, how long do you think that
the Ruby will be last,
and what is going to be the next veil? Will
it be Closure, or Scala,
Go or any other language, because the moment
is coming to the market
and total paradigm of programming is changing.
B.G.: Great question. I will just, in my recollection,
the oldest language that is still in existence
is Lisp,
and not C. It predates Unix and C by twenty
years.
And anyway-
C.F.: So that's a huge wave is what you're
saying.
B.G.: Huge wave.
C.F.: We're still in the Lisp bubble, which
will soon burst.
Everyone will realize that was stupid.
Do you really want an answer to that question.
We didn't really answer it.
B.G.: So languages do come and go but paradigms
do stay,
OK. So fine, don't focus on languages,
focus on learning different paradigms.
C.F.: But they don't really come and go that
much.
I mean think about it, like-
B.G.: They might, like PHP fell out of favor.
C.F.: But it's not, not it's out of fashion.
Fashion.
B.G.: It is that.
C.F.: It is heavily deployed, right, you're
running it.
So it still exists.
H.K.: A bit sheepishly but running.
V.K.: But remember one thing. Ruby is older
than Java.
It's been there since 2004.
But how many people started referring to Ruby
until Ruby on Rails came? So it's a solution
that language
or a framework provides this, what inspired
everything.
In fact Ruby on Rails inspired the entire
ecosystem
much more of other languages beyond just Ruby.
So that's in fact, it's Ruby on Rails that
made Ruby popular.
B.G.: It's also Ruby's Achille's heel, by
the way.
V.K.: Absolutely. There's a downside to it,
extra-
B.G.: I'll keep patching FTW, right? Not.
V.K.: But remember, you know, we were doing
all
this web XML business till Ruby on Rails came
about,
and all this other stuff. So what changed,
if you were to call it,
you would call it Ruby on Rails for the better,
rather than Ruby-
H.K.: Are you saying that the whole rest
thing was because of Rails? Venkat?
V.K.: Certainly the moment was more simplification,
convection over configuration,
so that's what the Ruby on Rails was inspiring.
So you could just say that, you know,
people who were doing Ruby on Rails were doing
more
rest than people who were doing dot net
and doing the sub-business.
But by the way, sub seems to be effectively
dead, right.
C.F.: But unfortunately it's dead
in the same way that PHP is dead. It still
exists.
V.K.: That's true. The same that Colba is
dead, right.
C.F.: And Colba, for that matter. Sorry kids.
V.K.: And that will never go away, because
as long as-
H.K.: So the next question that I wanted to
ask is like,
Yogi talked about in his presentation, like,
how using a service architecture,
like for interface-based for, you know like
multiple small
micro-applications, small applications.
So the next question is like how do you go
about
in an organization, you have a product,
or maybe more than one product.
How do you go about building a true polyglot
system,
where you know like programmers are encouraged
to come
and you know like use different languages.
Does this require like some previous thought,
or does it happen automatically, like, yeah.
What are the best practices and everything?
C.F.: It's for one of us isn't it.
Or he says it's for me and I say it's for
you.
OK, so I, actually Yogi did sort of answer
this a minute ago.
You know, you really do need to focus on the
architecture of the system first.
That's essentially what my whole rant was
this morning,
is about the architecture of a system that's
made of small components that interact in
well-defined ways
with very clear responsibilities of each component,
and the components can and will be thrown
away.
I think for us once we have that set up,
I really can say yes, write a service in Rust,
I don't care. I don't even know what it looks
like,
I haven't bothered to read about it yet.
It's fine. Yeah, it's like C++.
So yeah it's excellent. It's battle-worn.
But if it performs well enough
and it actually works and we're monitoring
it
and doing these, and it's deployable in the
way that we can deploy,
I don't need an ecosystem for polyglot programming
then.
I just need to encourage people to try things
and to throw them away if they didn't work
out.
H.K.: Venkat, you had something-
V.K.: Actually there's something
we just talked about this morning.
We have to move away from a language requiring
to be hidden in a web service just to be safe,
and you can throw it away later.
I think the languages will have to find a
way to work together,
where you don't need to hide things behind
rest.
All these languages will have to come with
a way to improve,
thereby they should, Ruby should really
see a world of coexistence with Java,
and a world of coexistence with dot net.
Because in many cases we develop in, like
JRuby,
right. You develop in Ruby and you deploy
it in Java,
or J to E, with all the monitoring tools,
and you talked about profiling.
JVM and the JV-maker system is very great
for deployments
actually better. So in order for you to use
it,
the Ruby language has to become friendly with
Java.
The simplest thing for example is RJB, which
is a bridge to
Java, which is still, we use by the way,
over in JRuby as well as separately.
So you need a way to actually have one language
talk to another in somewhat standardized,
simpler,
less overhead mechanism.
And I think that would really encourage people
to use different languages without having
to build this up layer or risk layer.
Y.K.: So you're saying that at like binary
level,
actually like a foreign function interface
and.
I think the simplest way to do that is still
over the network.
Like when it's rest or it's zero MQO or whatever,
right,
it's like independent processes interacting
with each other,
isolated, not messing with each other.
It just works well. Not convince the RJB or-
V.K.: You're talking about it from an architecting
a bigger system standpoint, but I'm just talking
about
simply, I'm running this web application,
but certain
part has to be paralyzed. I should be able
to do it
with less overhead, less new layers, if a
simpler
problem exists where that's applicable, right.
What you were just talking about, it's applicable,
has certain complexity and certain layer,
but
generally encouraging people to apply multiple
languages to a single solution, right now,
has so much overhead.
I mean, today colleges are teach kids,
people about different languages,
but it's as if, like if you don't get a job
in Java then go and look for a dot net job.
That's really how we are learning multiple
languages,
so but we are not learning, it's not that
we are not learning multiple languages,
but we are not polyglots by default or
by simplicity of the system.
That is I believe, if you want to be,
if you want to encourage polyglotism,
you just have to go to the next level
where languages will have to coexist with
each other.
B.G.: I think-
V.K.: That is what we built with that notion.
B.G.: Fair enough. So I think co-existence
can
be looked at from different angles.
I think what you're talking about is run-time
co-existence,
you know, inside one run-time you have multiple
languages running.
I don't know that that's technically feasible-
V.K.: It may not be run time, it may not be
a single process co-existence- it would be
a multi-process.
B.G.: But it would have to be over some network,
right.
V.K.: No. For example, take RGB.
B.G.: How does it work?
V.K.: It's almost like you're just calling
it into the process and kind of like-
B.G.: But how does it really work?
V.K.: It could even be-
C.F.: It's still one process, right, RGB.
B.G.: Yeah it's still one process.
V.K.: I agree.
B.G.: It's still one process, right.
V.K.: JVM does its own thing, right.
In a way JVM has its own layer-
B.G.: But ultimately it's all JVM bite code-
V.K.: True.
B.G.: So I think we are all building, or have
to
build distributor systems at the end of the
day today,
and we're also trying to build abstractions.
Right, that is the whole goal of building
a software architecture that lets, let me
find out which parts
I can abstract and how.
So what Yogi talked about,
and totally agree with him,
I think the best approach is to abstract away
the optimal concerns
and constructs of the system
and tie them together using one language
that is spoken on the system.
So I think they used JSON in JSON Schema for
the-
Y.K.: It was in HTTP.
B.G.: It was in HTTP, OK, yeah.
So what you could use- you guys use it-
you could use a message queue or maybe use
something like zero in cue sockets to communicate
over and maybe use Thrift or even JSON data
for communication, but-
H.K.: So-
B.G.: The idea is to basically build a system
of optimal components tied together but using
one system,
but then for the message buzz you can either
use a socket or a message queue.
H.K.: So, there's definitely a lot of tools
which are,
like run-times that exist which allow run-time
re-use of languages,
for example like, either on top of the LLVM
or on top of JVM,
you know like how you have Closure collections
you can use
from JRuby actually, there are projects that
allow that.
Do you think that all those are basically
toys
and shouldn't be used in any seriousness?
B.G.: Closure collections are not toys.
But what I would say that, I think that this
idea,
it can be applied to the JVM languages,
but many times you have to use some language
which is not available on the JVM, right.
And you cannot use LLVM for it,
because it's something which is much lower
level
than the JVM. So you'll have to use the network
to communicate over each other.
But as far as JVM languages are concerned,
yeah, why not.
At a theoretical level, inter-opt between
languages
is something that we should shoot for. Absolutely.
QUERANT: I have a complaint and a question
here.
Complaint: You're arguing too much.
You obviously are in disagreement.
So
B.G.: Agreeing too each other.
C.F.: Closure collections are a toy then-
I actually, when he was saying are these things
a toy,
I don't mean Closure collections, but I do
think that,
the whole idea of interrupt in a VM or in
a process is overrated.
And I think it's overrated, like,
I remember being at Fu Camp talking to the
parrot guys
and LLVM guys awhile back in a workshop,
and they were all complaining because they
had tried to do like JavaScript on all these
different VMs.
They realized that like an array in JavaScript
has different semantics then like an array
in Java
and an array in Ruby. You know if you add
something way off in the distance,
past the end of the array, in some languages
it's an error and in some languages it nil
fills,
in some languages it's you know, so like,
that's a really stupid example,
and you can all imagine there's some way to
solve that.
But with the more interesting features of
the language,
that lead us to want to be polyglots,
like I don't really think it makes sense to
instantiate
a Ruby class from Java, for example.
Because the Ruby class does different
things than the Java class and vice versa.
Yes it can sometimes be nice.
So like when you're in Closure
and you want to use someone's ancient
Java library that has been working for years,
you just do it. When you do it, though,
it's hideous, and it like, the Java interrupt
is really not nice. And you know you're doing
-
it works fine. But it's uglier than Closure
code.
Right, so then you want to write something
so it
looks like Closure and feels like Closure.
So personally I think an operating system
is also
like one process, you can think of it that
way these days.
It didn't use to be the case. But I can spin
one up
and start running it, and then have language
interrupt
with multiple processes in there talking via
sockets,
and it's conceptually not very different.
Like if
I describe it to my mom she won't know the
difference
between that and a virtual machine, so.
B.G.: There's domain sockets in Unix, right.
C.F.: Oh yeah domain sockets in Unix. Of course.
This might be the solution, then.
QUERANT: Quick question to all the panelists.
As we stand today, what is the minimum number
of languages,
minimum set-up languages you would recommend
to all the programmers.
H.K.: 01:02:30 - dead audio
C.F.: Did you tell him his question was invalid,
is that it? I disagree.
H.K.: So what I was trying to-
B.G.: I would say it's a really awesome question.
I would say is that maybe don't worry too
much about
the number of languages that you are learning,
but number of different paradigms that you
are learning, right.
H.K.: So the question was like, like a kind
of paraphrasing, like, so-
B.G.: Doesn't matter. Look at the paradigms.
If you already know C, then don't bother about
C++,
you know, for example, or whatever.
H.K.: Yeah so the next question I had here
was like,
I'm just jumping back and forth, but like
yeah,
what next programming languages, like for
example,
you guys are looking forward to. Like you
know
starting with Swami like, sorry, Venkat, like-
V.K.: OK I'm just looking for a better Ruby.
H.K.: What do you mean by that?
V.K.: It's more of- I'm just looking for a
standardized Ruby where I should be able to
switch between the Java world and the MRA
world,
without lots of friction and you know, and
better
performing Ruby generally speaking. When as
much
as we just talked about low-level you know
you talk
low-latency stuff. I think we can't keep saying
that
Ruby's, you know, it's really slow for a reason,
right.
And Ruby can run in a hot spot. I want- Java
was slow
because of hot- before hotspot. But Java became
very,
very fast through that time and lots of new
work has
put in there. So there has to be some research
into
performance in Ruby I think or something.
I'm just looking
for better Ruby essentially. For my investment
of time and
language. But certainly, I mean I would like
to learn Scala
and stuff that like, something.
B.G.: So for me learning a new programming
language is
more like a cognitive exercise to expand my
own thought
processes, not specifically to you know apply
in production.
So the new language that I will be learning
in 2014 is Factor,
and you should check it out.
C.F.: I was gonna say Factor.
We should not sit next to each other. We're
too similar.
H.K.: Why, but why, can you just like say
why exactly Factor?
C.F.: I would say Factor because it really
hurts to,
it hurts in a non-stupid way.
Like if you learn Befunge it hurts in a stupid
way.
Like there's no reason to learn Befunge except
for fun.
Factor, though, there's something clearly
there, right.
It's concatenative programming. It's a different
way of having to think.
And it's a different way that to me feels
like it's deeper than it is stupid. It, so,
actually
I wouldn't probably learn it now, but I almost
said that though.
It was on my list.
B.G.: I already know APL and a little bit
of J maybe.
But APL is, again another concatenative language,
which inspired Factor.
APL is some language which I can read but
cannot type,
because to type APL code you need a separate
keyboard.
That's why I'm learning Factor this year.
H.K.: Yogi?
Y.K.: I don't know, Sanskrit, maybe. (01:04:41
??)
But yeah, I think Go or Haskel.
I think there the most differences from what
I already know, so.
H.K.: Fair enough. So I think a lot of first
-
learn programming languages and then the Dave
Thomas
like his book Pragmatic Programmer recommends
like learn
a programming language a year actually.
And so one of the things that I've been
wondering is like, how do you exactly like
go about learning a language? You cannot,
so like you cannot go to Flipkart and deploy
a production system in Hascal, that, I don't
know if you allow, but we talked about that
already, actually.
So but like how do, how does a person like
when picking up a language go about
learning a programming language, and like
so-
V.K.: So I think I've probably got the -
so yeah like. I actually read the manual.
Yeah, I'm so boring. And so I just read the
manual
just to get a flavor of what it's about and
what's possible.
Without going deeply into it it usually takes
like a few hours, because it's really superficial.
But once I get a sense of what the language
is about,
what the code constructs are, then do a second
pass
to kind of just decide really what's it about
and then play around with some code. But as-
(01:07:03 - dead audio space 01:07:47)
C.F.: I would try to do some simple services
and you know stuff with Actors running in
the background.
And whenever I saw something I didn't understand
I would just go look in the source code for
play.
Then I would look at this crazy Scala type
stuff
and have to then read the manual for a few
hours
to figure out what's happening. But now I
will never forget,
because I encountered it through a painful
situation,
so I have like the emotional trigger to never
let go of that knowledge.
B.G.: That's interesting, yeah.
I think, so every new language brings a different
way
of thinking to the table. So reading the manual
should be the first thing that you should
do I think.
Maybe because, usually the manual is written
by the author of the language,
or at least some supporting material about
the rational
or the ethos of language.
And once you have some superficial idea
what the language, start building something.
And at the same time look at the source code
of the language, or maybe the standard library
or some other products or tools that have
already
been written in that language,
to get a sense of how things are detected,
what the idioms could be.
And basically read more code, and then write.
I think I've always benefited more from
reading a lot more code than writing.
V.K.: Yeah I think the problem comes first
in,
I don't choose a language, just more of a
problem,
and I think this language could be better
to solve that problem,
and then just to find the quickest way to
solve the problem
and learn the crux of the language.
And then go learn further by looking into
the manual and other stuff.
H.K.: So Chad I was talking to you before
and like you said like don't just learn a
language,
deploy something production like similar,
and don't learn a language in a year, like
spend time with it.
Build something, solve a hard problem,
build something complicated, how do you say-
C.F.: Well yeah what I was telling you about
is Dave Thomas,
who is one of the authors of Pragmatic Programmer
who coined this language of the year idea,
he spoke at RubyConf 2010 and he said that
he had
revised his thoughts on what the challenge
should be.
Instead of just learning a language every
year,
I think he has the same problem I do, he can't
retain it.
He challenged everyone to learn a language
and deploy it
to production every year.
Because to him again it's the same thing I
just described for myself,
that he personally can't hold on to the knowledge
unless he experiences the real pain
of putting something into practice.
V.K.: Absolutely.
H.K.: So the pretty much like,
you learn programming languages like a lot
of persons,
but really our day jobs still requires to
programm in Ruby
or Java or whatever, so, one of the key things
like,
you write Lisp, you become a better Java programmer.
That's the wisdom so, like, how do you exactly
go
about adopting features, you know like, for
example,
like Closure or Scala or Haskel or Go, and
you know
like the language the you program in day to
day,
maybe for the dayjob. So like,
B.G.: How do you adopt a new language?
H.K.: How do you adopt features?
B.G.: Ideas.
H.K.: Ideas, yeah.
B.G.: So, as I said, every language has a
different
way of you know solving problems. So for example
if I take the example of Closure, in Closure
there
is a lot of emphasis on data. OK, you don't
hide data
inside objects and stuff.
You basically treat everything as first class
data structures
and then manipulate the data using standard
library
functions and spit it out into a different
format
if you need to. So that, some design or architectural
thinking that can be applied to any language,
right.
I know people who are actual provisional
Python programmers, who learned Closure,
did some real programming in Closure,
and went back to doing Python
and came back to me and told me that my Python
code
is so much better now, right.
So I think it's not just about Closure
or any specific language, but the idea is
that,
get a taste of the language,
see how they think about solving problems,
and you know, you may not be able
to transport all the ideas,
like if you like channels in
Go you cannot build a channel-like thing in
Java,
for example. It would be very hard for you
to do it.
But at least if you have an appreciation for
it,
maybe who knows tomorrow you might
be able to use a third party library to use
it.
C.F.: There's actually a problem that can
happen,
though. So you can take good things,
like the data orientation or the ideas of
immutability
by default in Closure and then just try to
make your
Ruby code be like that, because you understand
the benefits.
Or you could do stuff like try
(01:12:23 - dead audio space - 01:12:36)
it's even possible to then simulate the features
of one of these languages that you're learning
from,
but you emulate them in an environment that's
not friendly to them,
and it's a bad idea. So I would say don't
go too crazy trying
to make Ruby be functional more than it is,
or to be Actor-oriented or whatever.
B.G.: There will always be incidents (01:12:53)
in practice, right.
You'll figure it out if you try to apply it.
Y.K.: I'm gonna agree with Chad, so.
V.K. Yeah, OK, I'm not into this functional
side
or you know the Lisp side of Closure set of
things yet.
So my experience is essentially trying to
play more
ideas from Ruby into Java, and there was a-
you know probably Java at level that we just
talked about.
It's such a, what is it called, a restrictive
language.
There is a lot that I could actually learn
and apply to
Java and Ruby which was really exciting.
There were libraries,
I think there were coming up for like
calling anonymous functions or proc like things
that I could actually use them.
So those are, it was not really really tangible
at
specific example I could give. My Java programming
extensively improved.
Or readability of the code improved by having
written Ruby code.
Some of it will actually happen naturally
I believe.
B.G.: I don't think that -
For example I was doing a lot of Python before
I started doing some real Lisp programming.
Python always had the map and filter and reduce
functions.
I was never able to appreciate those functions
when
I was just a Python programmer, OK. For example,
Closure has something called protocols, OK.
How many people here have heard about refinements
in Ruby 2.0.
C.F.: Refinements, yeah.
B.G.: Yeah. It's a new feature.
So, see, minority. OK, it's a really good
feature,
and it lets you do code monkey patching but
restricted
to a specific module, OK. So I think that,
Ruby guys don't, are often are don't
understand benefits then it's kind of like
a shame, right.
Y.K.: Yeah but that's a point right,
that's something which has to happen at the
language level.
Like as a application developer who's not
working on the language itself,
adoption of features from other languages
will run into bottle necks.
So that's definitely one area where, for example
in the Java world, right,
when you move back from a lot of the ex-Ruby
programmers
move back to Java, and they created some beautiful
libraries.
Like for example I know an ex-thoughtworker
who's done
a library called (01:15:03), which allows
you to kind of mimic
Closures in Java, and it works through
actually hooking up a Java agent at run time.
So the point is it's a beautiful experiment,
but you can't really use that in production
because your IDs not going to recognize it,
you know simple things like that which might
seem like trivial but they actually hurt,
because
another the code syntax highlighting is kind
of
gone for a toss. The debug obviously doesn't
work,
you can't-
So you got to hook up the agent while running
the app.
So it becomes tricky, so I think a lot of
the language
features which get adopted do get a lot of
those frameworks.
For example, Actor systems, even though we
don't have
it in Java, kind of analogies of that have
been funnily
enough systems like Mule (01:15:40) right,
which is again
enterprising and boring, but essentially it
solves
the same problem. Like not at the language
level but
it allows you to coordinate independent Actors
and construct bulges (01:16:01) of flows which
kind
of do something productive and allow you to
scale
out in a very simple way, right.
So frameworks end up kind of taking their
place in a certain way.
I think it's difficult to bring it down to
a language very well.
V.K.: That kind of introduced like using
play framework in Java, right.
It actually brings a lot of Rails goodness
and Rails inspiration into Java, so you don't,
it's not necessarily about the language weights.
It's also things like dimension or configuration,
which can be learned and applied into other
languages.
So just ideas are behind a specific paradigm,
the simplicity or the philosophy behind it
can
be applied into other languages, like Java
from Ruby.
So I think the framework side of it plays
I think a big role.
Y.K.: Yeah that's a great point because there's
funnily enough right like a framework like
Rails
or Sinatra was invented in Java. Why is that?
Because the thought process that's behind
Java
is just not tooled to the kind of thinking
and
such lightweight simplistic services.
And it only took somebody to kind of look
at Ruby,
see its simplicity and be able to kind of
build
something so simple as Sinatra, like it's
beautiful.
And now that thought process has come out.
So yeah play's a great example actually.
V.K.: Yeah I think there's two things you
know,
the discussion kind of weighed towards more
towards
the paradigms, more. But I think there is
an
things like simplicity, conventional configuration
or concepts, which is another side that languages
have,
which are not specific to how to make parallelism
better
which are not specific to how to do functional
programming,
but still something which was not done before
or
easy enough in your language, which you could
have applied.
You know the language is easier.
But those are not new libraries
or nothing to do with really specific functions.
But you could get better in other languages
by
looking at this other philosophy behind
the language just beyond a specific paradigm
of the strength of the language.
H.K.: So we are about to close the panel discussion.
Any questions? We have time for questions.
Actually.
C.F.: Or how about you just raise your hand
if you want to ask a question
and otherwise we'll all get tea. You have
a question.
B.G.: Or we can just move the discussion to
the break room.
We could do that. So let's just you know - OK.
QUERANT: So I worked in different programming
languages.
So about four to five, so I think programming
languages
rose to such heights because either because
the programming
language itself or through its supporting
libraries.
For example, Ruby was not in so much mainstream
until
Rails came into existence. And Python for
scientific calculation.
C for internal system, you know Linux kind
of stuff.
C++ for games and other stuff.
So what all, I mean do these programming languages
have and uh, example like Scala, Closure,
Go, Erlang.
So these are upcoming, like dot also.
So what do these programming languages have
that they'll come on call. I mean what do
these libraries,
I mean what are the bigger libraries that
they have,
so that people like me can use them for certain
purpose.
So what all they are useful for?
C.F.: That'll take awhile.
B.G.: That's a very long-winded question.
I'll very quickly answer that.
Every language probably has a killer app,
right,
to champion it or maybe make it famous or
popular.
Not every, not all languages have one specific
killer app,
for example, while, what would you say the
killer app for JavaScript is, right?
Or what about Objective C?
Right, just that you don't have any other
choice
in those cases, right. If you want to program
for the browser,
JavaScript is your only choice,
Objective C if you are doing Apple programming,
right.
So yeah, I mean, every once in awhile there
are projects or libraries or products which
do come and make something very famous.
But it may not be true for everything.
H.K.: If anybody has any other questions
then I can (drowned out by applause - 01:20:05)
Thank you.