0:00:27.000,0:00:34.900 HEMANT KUMAR: So I would ask our panelists[br]to come forward and chat. 0:00:34.920,0:00:41.270 So Chad is, Chad Fowler is the author of The[br]Passionate Programmer 0:00:41.270,0:00:45.070 and he has been a- 0:00:45.070,0:00:46.940 CHAD FOWLER: Yes? 0:00:46.940,0:00:51.560 H.K.: He's been like, he's one of the oldest, 0:00:51.560,0:00:55.970 one of the oldest Ruby guys around. He's embarrassing[br]me. 0:00:55.970,0:01:01.870 C.F.: I'm one of the oldest people here. Thank[br]you Colby (00:01:00). 0:01:01.870,0:01:08.630 H.K.: And next, Yogi. Yogi is principal architect[br]of Flipkart 0:01:08.630,0:01:13.759 and he has obviously worked in one of the[br]largest 0:01:13.759,0:01:20.759 deployment serve and supply chain in Ruby,[br]and yeah. 0:01:21.420,0:01:27.490 Next person I'm gonna ask is Baishampayan[br]Ghose, uh, BG. 0:01:27.490,0:01:30.889 Is he outside? Can you, can anyone? So. You[br]guys can sit. 0:01:30.889,0:01:36.740 C.F.: Yes, what? 0:01:36.740,0:01:38.889 H.K.: You guys can sit actually. 0:01:38.889,0:01:42.020 C.F.: He wants us to sit down. Sorry, I'll[br]sit. 0:01:42.020,0:01:47.079 H.K.: So, yeah, our next panelist is Baishampayan[br]Ghose. 0:01:47.079,0:01:49.539 He is a polyglot programmer 0:01:49.539,0:01:55.329 and he is CTO of Helpshift, a start-up running[br]from California. 0:01:55.329,0:02:02.329 And last I would like to call on Venkat Subramaniyan. 0:02:07.990,0:02:11.330 He is CEO of Mahaswami Software. 0:02:11.330,0:02:15.420 He has been programming in Ruby for like ten[br]years, 0:02:15.420,0:02:21.940 and for a real long time, so. 0:02:21.940,0:02:28.940 OK, so we'll start the panel discussion by[br]asking the panelists like, 0:02:30.530,0:02:36.650 what is your current language of choice primarily,[br]and why? Swami, Venkat. 0:02:36.650,0:02:41.970 Venkat Subramaniyan: OK, we use primarily[br]Ruby. 0:02:41.970,0:02:45.510 We've been using Ruby for the past, I mean, 0:02:45.510,0:02:48.780 writing bigger-sized products since six, seven[br]years. 0:02:48.780,0:02:51.450 But we use quite a bit of Java along with[br]it. 0:02:51.450,0:02:53.970 H.K.: Why? Like, why do you use it? (00:02:51) 0:02:53.970,0:02:58.080 V.S.: Well, see there is some very, like, 0:02:58.080,0:03:00.230 well-established libraries, like reporting[br]GINs, 0:03:00.230,0:03:02.650 and several stuff that you don't want to really,[br]you know, 0:03:02.650,0:03:04.290 try to match from the Ruby side. 0:03:04.290,0:03:06.460 So we just bring the best of both worlds by 0:03:06.460,0:03:08.040 cutting forward all the good libraries. 0:03:08.040,0:03:10.830 Jewels we have used quite a bit. Jasper reports. 0:03:10.830,0:03:13.570 These are all stuff for which there isn't[br]an equivalent exist, 0:03:13.570,0:03:15.890 and we just want to use the knowledge 0:03:15.890,0:03:18.660 and, you know, the well-established software[br]there, 0:03:18.660,0:03:24.700 for their purpose. So that's one of the main[br]reasons. 0:03:24.700,0:03:28.930 Baishampayan Ghose: So we use multiple languages,[br]but, 0:03:28.930,0:03:32.120 Closure is our main programming language of[br]choice. 0:03:32.120,0:03:34.680 We have been using it since I think late 2008. 0:03:34.680,0:03:40.750 We're one of the first companies to put Closure[br]into production. 0:03:40.750,0:03:42.760 We use Closure because a variety of reasons,[br]but, 0:03:42.760,0:03:49.130 I guess if I have to say name a few reasons,[br]that would be, 0:03:49.130,0:03:52.100 Closure lets me focus on the problem, 0:03:52.100,0:03:53.900 and it pretty much gets out of the way. 0:03:53.900,0:03:58.490 And there is a lot of focus on awesome things[br]like immutability, 0:03:58.490,0:04:04.160 data as a main construct for doing competition. 0:04:04.160,0:04:07.370 And of course it's a lisp so I get all the[br]power, 0:04:07.370,0:04:10.630 and it's also something that runs in the JVM, 0:04:10.630,0:04:15.510 so I can also leverage the awesome Java ecosystem. 0:04:15.510,0:04:16.839 So yeah, but, at the same time, 0:04:16.839,0:04:18.380 we do use different languages for different[br]needs. 0:04:18.380,0:04:22.350 We have used Erlang in the past, we use Go[br]as well, 0:04:22.350,0:04:27.610 and of course there is JavaScript and a bunch[br]of other languages. 0:04:27.610,0:04:29.490 H.K.: So do you think like, let's say, 0:04:29.490,0:04:31.260 Closure doesn't seem to be right language[br]for 0:04:31.260,0:04:33.970 how to write utility to you know like 0:04:33.970,0:04:37.820 do something on my OS X, for example. 0:04:37.820,0:04:40.500 If I auto-install something or manage processes[br]or anything. 0:04:40.500,0:04:44.040 Do you think like it's a right tool for that[br]sort of thing? 0:04:44.040,0:04:47.580 B.G.: So, to build your, if you want to build[br]a small utility, 0:04:47.580,0:04:49.490 you'd need a faster start-up time, 0:04:49.490,0:04:51.350 and that problem is inherent in JVM. 0:04:51.350,0:04:54.510 It has nothing to do with Closure, per se. 0:04:54.510,0:04:57.370 But Closure also has something called Closure[br]Script, 0:04:57.370,0:04:59.530 which lets you write whatever code that you[br]want to write in Closure, 0:04:59.530,0:05:01.280 but then the compiler compiles it down to[br]JavaScript, 0:05:01.280,0:05:07.850 and basically you can create a node.js application[br]out of Closure code. 0:05:07.850,0:05:11.230 You get all the flexibility and constructs 0:05:11.230,0:05:14.250 to build abstractions that Closure provides, 0:05:14.250,0:05:18.440 but you can target, you know, different run-times. 0:05:18.440,0:05:21.990 So you can run, you can build a shell utility[br]as well. 0:05:21.990,0:05:22.740 C.F.: Do you actually do that? 0:05:22.740,0:05:24.710 Do you like write command line programs? 0:05:24.710,0:05:28.630 B.G.: We've done it a few times. We've done[br]it a few times. 0:05:28.630,0:05:30.460 It's not something that we publicly do, but[br]yeah, 0:05:30.460,0:05:33.300 Nailgun is another upload that you talked[br]about in your talk, right. 0:05:33.300,0:05:36.940 And, so yeah, so that's what we do. 0:05:36.940,0:05:37.889 But there are other hacks, like tweaking 0:05:37.889,0:05:39.290 the boot class paths in JVM to make the start[br]up times faster. 0:05:39.290,0:05:43.680 That's what something learning new is in Closure. 0:05:43.680,0:05:48.820 There are ways of getting it, but yeah, you[br]are, 0:05:48.820,0:05:52.990 in a way, right that, by default, it's, Closure[br]is probably not a, 0:05:52.990,0:05:57.490 not the right run time for building shell[br]utilities. 0:05:57.490,0:06:01.669 H.K.: OK, so, before we move to Chad, like,[br]you said like, 0:06:01.669,0:06:03.260 all the power of lisp actually, 0:06:03.260,0:06:04.380 so, can you elaborate on that? 0:06:04.380,0:06:05.370 What do you mean by all the power of Lisp? 0:06:05.370,0:06:09.590 B.G.: Sure. So, how many people use Emacs[br]here? 0:06:09.590,0:06:11.930 Twenty percent maybe. You do? 0:06:11.930,0:06:17.230 C.F.: No, I don't personally. 0:06:17.230,0:06:19.220 Never. 0:06:19.220,0:06:25.480 B.G.: Never? But you talked about Emacs 0:06:25.480,0:06:28.910 as well as good software systems. 0:06:28.910,0:06:32.210 C.F.: Not to use, though, just as an example. 0:06:32.210,0:06:36.760 B.G.: Just to talk a lot. Anyway, so Emacs[br]as a software 0:06:36.760,0:06:38.449 is thirty-five years old today, 0:06:38.449,0:06:43.370 and still is in production, so to speak, 0:06:43.370,0:06:44.090 you can still use it. 0:06:44.090,0:06:46.740 So, what can we learn from Emacs? 0:06:46.740,0:06:50.800 Well, the language is always available to[br]use, 0:06:50.800,0:06:53.949 right, so if you compare it with, let's say, 0:06:53.949,0:06:56.580 Python or Java, there is a difference between 0:06:56.580,0:06:59.540 compile time and run time. When you are running, 0:06:59.540,0:07:06.540 the language is not available to you. 0:07:06.710,0:07:09.590 You cannot, you know, manipulate the code[br]itself 0:07:09.590,0:07:14.820 while it is running, or generate new code,[br]dynamically. 0:07:14.820,0:07:21.820 So that is one thing that lisp dialect exploits[br]by design, 0:07:22.820,0:07:25.729 because they have something, 0:07:25.729,0:07:27.050 a property called homoiconicity, 0:07:27.050,0:07:29.650 which basically means that the code and data 0:07:29.650,0:07:30.360 are pretty much the same. Even though they[br]may not be identical, 0:07:30.360,0:07:30.490 but, for all practical purposes they are the[br]same. 0:07:30.490,0:07:33.919 That means when a Closure code is running, 0:07:33.919,0:07:36.250 it can manipulate itself while it's running, 0:07:36.250,0:07:38.370 and it can maybe generate new code, optimize[br]something away. 0:07:38.370,0:07:41.030 So basically it lets you write code which[br]writes more code, 0:07:41.030,0:07:42.250 so, and that is something which is always[br]preferable. 0:07:42.250,0:07:44.889 It is better to write a code that writes more[br]code 0:07:44.889,0:07:51.889 than to just write code. So, and there are[br]many other features 0:07:52.430,0:07:56.389 that lisp has, for example, the language itself[br]is so simple, 0:07:56.389,0:08:01.259 like there are just few primitives to understand[br]and learn about. 0:08:01.259,0:08:02.540 Syntax is pretty much non-existent, 0:08:02.540,0:08:04.009 and very simple to understand and learn. 0:08:04.009,0:08:09.139 And that really reduces a lot of cognitive[br]overload 0:08:09.139,0:08:09.900 that some languages might introduce. 0:08:09.900,0:08:11.970 So yeah, I mean, these are probably a few[br]superficial advantages. 0:08:11.970,0:08:17.699 I can go deep into it, but maybe we can talk[br]about it after. 0:08:17.699,0:08:24.699 H.K.: Yeah, so, Chad, like, what is your poison[br]of choice? 0:08:30.000,0:08:32.429 C.F.: My poison of choice? 0:08:32.429,0:08:34.669 H.K.: Yeah. 0:08:34.669,0:08:37.750 C.F.: I guess, it's hard to answer that question. 0:08:37.750,0:08:39.240 I don't have an answer, right? 0:08:39.240,0:08:43.549 The one single answer I could give you is[br]anything except for Ruby. 0:08:43.549,0:08:44.240 H.K.: OK. 0:08:44.240,0:08:49.170 C.F.: And I mean that very seriously. 0:08:49.170,0:08:53.670 I remember in 2007, I was at MountainWest[br]Ruby Conference, 0:08:53.670,0:08:57.440 the first one, that Coby was talking about[br]earlier, 0:08:57.440,0:09:00.520 and I did a keynote, my first- no, it wasn't[br]my first keynote, 0:09:00.520,0:09:02.330 it was my first Ruby Conference keynote. 0:09:02.330,0:09:06.020 It was about, like, what do we do next, after[br]Ruby? 0:09:06.020,0:09:10.260 And I was already deep in the like toil 0:09:10.260,0:09:13.520 and stress of being worried that I identified 0:09:13.520,0:09:16.310 too heavily with Ruby, in 2007. 0:09:16.310,0:09:19.120 So I wanted to like get out of the Ruby thing 0:09:19.120,0:09:21.480 and not be the Ruby guy, 0:09:21.480,0:09:23.890 and I'm still desperately trying to do that. 0:09:23.890,0:09:27.000 But, no, I mean, like, I said, 0:09:27.000,0:09:28.620 when I was speaking earlier, 0:09:28.620,0:09:35.620 I'm using Closure, Scala, Node, Java, Objective[br]C, Ruby, Erlang, everything, 0:09:35.760,0:09:40.490 at work right now. I think probably what I'll[br]learn next 0:09:40.490,0:09:42.610 really seriously is Objective C. 0:09:42.610,0:09:47.290 But I'm going to try to use it, even on the[br]server, 0:09:47.290,0:09:50.140 as like a language to develop services in, 0:09:50.140,0:09:52.300 just as an experiment so I can learn it better 0:09:52.300,0:09:55.089 and do better job on the clients. 0:09:55.089,0:09:58.200 H.K.: So like not Ruby? 0:09:58.200,0:10:01.450 Is it because like you already had kind of[br]a Ruby like, 0:10:01.450,0:10:02.390 you obviously work with Ruby as like with[br]the, 0:10:02.390,0:10:02.520 along with Dave Thomas, and all of these guys, 0:10:02.520,0:10:08.700 you were one of the earlier adopters of Ruby,[br]so like, are- 0:10:08.700,0:10:11.870 C.F.: Yeah, because I will never learn anything[br]else about Ruby, 0:10:11.870,0:10:13.540 cause I know everything. 0:10:13.540,0:10:17.740 No, it's- I'm always suspicious of myself 0:10:17.740,0:10:22.580 when I identify too heavily with anything[br]extrinsic to me. 0:10:22.580,0:10:24.490 Like for me to say I am a Ruby programmer- 0:10:24.490,0:10:27.700 if I say that, I feel bad, and I know that[br]I've made a mistake. 0:10:27.700,0:10:30.570 I know that I'm creating some rigidity of[br]value 0:10:30.570,0:10:36.200 that is ultimately counter productive to my[br]success 0:10:36.200,0:10:38.870 and to the success of people around me. 0:10:38.870,0:10:41.950 So like I've been doing more Java in the past[br]month 0:10:41.950,0:10:47.459 than Ruby, which I used to do full time in[br]1999. 0:10:47.459,0:10:49.760 And it's been a really good freeing thing, 0:10:49.760,0:10:53.230 like I am not a Ruby programmer, I am a programmer, 0:10:53.230,0:10:54.459 and even that is kind of limiting, 0:10:54.459,0:10:57.209 because I'm more and less than that at the[br]same time. 0:10:57.209,0:10:59.640 So it's not so much that I'm worried about[br]Ruby itself, 0:10:59.640,0:11:01.209 it's that I'm worried about putting myself 0:11:01.209,0:11:03.450 into a bucket that I can't get out of, 0:11:03.450,0:11:07.410 even if it's a subconscious problem. 0:11:07.410,0:11:13.580 H.K.: OK, Yogi. Yeah, so what do you- 0:11:13.580,0:11:14.330 Yogi Kulkarni: Sure. 0:11:14.330,0:11:16.740 So, if you're asking about personal choice[br]then, 0:11:16.740,0:11:19.279 sure, you know I like coding in Ruby. 0:11:19.279,0:11:21.839 I just love it because it's compact. 0:11:21.839,0:11:26.339 I feel the translation from my thoughts to[br]code is shortest in Ruby, 0:11:26.339,0:11:28.860 so it just feels very natural. 0:11:28.860,0:11:32.550 But that said, I think I've moved the last[br]seven years 0:11:32.550,0:11:37.040 from being a kind of a language geek, of sorts, 0:11:37.040,0:11:40.110 not really, but, I used to love program language[br]theory 0:11:40.110,0:11:42.029 and getting into stuff like that, 0:11:42.029,0:11:45.870 but to actually not caring too much about[br]it. 0:11:45.870,0:11:47.930 I think programming languages are good, 0:11:47.930,0:11:50.700 and they kind of get you excited, 0:11:50.700,0:11:54.600 but when it comes to actually solving hard[br]problems, 0:11:54.600,0:11:57.040 it's the ecosystem that matters around that[br]language. 0:11:57.040,0:11:59.959 Things like the tools, the profilers, the[br]monitoring tools, 0:11:59.959,0:12:03.519 debuggers, you know that's the stuff which[br]no language 0:12:03.519,0:12:06.080 is gonna save you when you're in production,[br]right. 0:12:06.080,0:12:06.920 So you just need to have that, 0:12:06.920,0:12:10.200 the maturity of an ecosystem is really important[br]there. 0:12:10.200,0:12:12.709 Which is why we keep going back to the JVM[br]over and over, 0:12:12.709,0:12:15.930 and even the new languages are being built[br]on the JVM as, 0:12:15.930,0:12:19.290 it's for exactly that reason. 0:12:19.290,0:12:21.399 But among the newer languages on the JVM, 0:12:21.399,0:12:25.080 I'm actually surprised that I've- so, I'm[br]kind of 0:12:25.080,0:12:26.209 intrigued by Closure and Scala. 0:12:26.209,0:12:28.990 We actually looked at Scala very carefully 0:12:28.990,0:12:32.230 for the system I spoke about. 0:12:32.230,0:12:36.269 But I didn't think it gave the kind of jump. 0:12:36.269,0:12:39.980 I felt was kind of marginal, 0:12:39.980,0:12:42.600 the improvement over just doing good Java, 0:12:42.600,0:12:44.680 that Scala gave, that's arguable. 0:12:44.680,0:12:47.290 There's a lot of language features there, 0:12:47.290,0:12:48.640 possibly too many language features, 0:12:48.640,0:12:51.560 which is one of my concerns. 0:12:51.560,0:12:53.209 But Closure, we looked at that also, 0:12:53.209,0:12:54.740 but we didn't look, we didn't actually 0:12:54.740,0:12:56.529 take it that seriously, because of basically 0:12:56.529,0:12:57.640 the prefix notation being too alien. 0:12:57.640,0:12:59.589 We wanted something block structured 0:12:59.589,0:13:04.200 for people moving from Java to Ruby. 0:13:04.200,0:13:05.760 So I think, yeah, 0:13:05.760,0:13:08.709 those are the kind of things that are on my[br]mind. 0:13:08.709,0:13:12.779 H.K.: OK. So, Ghose, do you- I'm gonna call[br]you BG, OK? 0:13:12.779,0:13:15.279 Yeah, so, BG, do you ever like, 0:13:15.279,0:13:19.190 the programming languages do not matter all[br]that much, 0:13:19.190,0:13:22.760 do you think the state of it are like if you[br]improved like- 0:13:22.760,0:13:28.190 B.G.: I'm told Alan Pearl is here, 0:13:28.190,0:13:32.140 and he basically said that programming language 0:13:32.140,0:13:36.019 basically shapes the way you think about solving[br]problems. 0:13:36.019,0:13:37.250 So even if you do not use Closure or Scala 0:13:37.250,0:13:37.570 or whatever fancy language that comes out, 0:13:37.570,0:13:42.459 you should try it out because ultimately 0:13:42.459,0:13:45.360 you're trying to solve a problem, right. 0:13:45.360,0:13:47.360 You have the problem at hand, 0:13:47.360,0:13:50.329 and you'd like to look at the problem from[br]different perspectives. 0:13:50.329,0:13:52.690 See if you only have one way of looking at[br]the problem, 0:13:52.690,0:13:56.149 then you know, by repeating the same approach[br]a 0:13:56.149,0:13:59.010 thousand times is not going to help you. 0:13:59.010,0:13:59.370 You should look at different ways of 0:13:59.370,0:14:00.200 maybe approaching the problem, 0:14:00.200,0:14:04.740 and even understanding the problem itself. 0:14:04.740,0:14:11.740 Simple example, parallel processing can be[br]done using threads. 0:14:13.370,0:14:16.070 You can use quarantines. 0:14:16.070,0:14:17.459 You can use CSB, you can use Actor. 0:14:17.459,0:14:18.290 What should I use, given any situation? 0:14:18.290,0:14:19.350 So even if that- if I don't even know about[br]Actors or CSB, 0:14:19.350,0:14:20.470 I'll never be exposed to that line of thought, 0:14:20.470,0:14:24.730 so that code is basically to learn a language, 0:14:24.730,0:14:27.700 not to just switch wholesale to that language, 0:14:27.700,0:14:34.390 but to be able to appreciate new ways of looking[br]at solving problems. 0:14:34.390,0:14:37.350 Y.K.: So I think that's a great point, and[br]when I, 0:14:37.350,0:14:39.899 kind of, I missed mentioning this, see, 0:14:39.899,0:14:42.160 when I was a program language geek, 0:14:42.160,0:14:46.160 I think the one great important inspiration[br]for me was SICP, 0:14:46.160,0:14:49.180 right, structural interpretation of computer[br]programs. 0:14:49.180,0:14:52.800 And that's something which, again, goes back[br]to what is, 0:14:52.800,0:14:55.640 what are the fundamental abstractions again, 0:14:55.640,0:14:58.310 you can reach out to solve problems of different[br]natures, right. 0:14:58.310,0:15:01.279 And that was the crux of it, you can use data[br]as abstraction, 0:15:01.279,0:15:02.120 procedures are abstraction, 0:15:02.120,0:15:05.740 stream processing and actually creating languages[br]of your own. 0:15:05.740,0:15:08.790 So the point is that there are far more paradigms,[br]right, 0:15:08.790,0:15:11.320 and I think getting a grasp of those paradigms[br]is very critical, 0:15:11.320,0:15:13.140 but for that you don't necessarily need to[br]go 0:15:13.140,0:15:16.019 every new languages around for you to see[br]what 0:15:16.019,0:15:18.579 ideas are implemented well in which language, 0:15:18.579,0:15:19.269 what can you adopt. 0:15:19.269,0:15:21.269 Take for example, after reading SICP, 0:15:21.269,0:15:24.220 I think my Java programming became so much[br]better, 0:15:24.220,0:15:28.649 I have said using more anonymous functions[br]or classes, 0:15:28.649,0:15:34.870 yeah, that's ugly but, so yeah. So I totally[br]agree with that. 0:15:34.870,0:15:39.000 H.K. So we, you talked about like, 0:15:39.000,0:15:42.850 how many of you heard of like something like, 0:15:42.850,0:15:45.290 or used a after patch in full or any sort[br]of concurrent programming, 0:15:45.290,0:15:46.810 can we have a show of hands? 0:15:46.810,0:15:50.300 OK, so, anybody wants to explain like yeah? 0:15:50.300,0:15:52.920 B.G.: There is nothing to explain. 0:15:52.920,0:15:56.600 Just go and read on Wikipedia. 0:15:56.600,0:15:59.399 C.F.: Or DFM. 0:15:59.399,0:16:03.139 B.G.: Or DFM, yeah. 0:16:03.139,0:16:06.440 H.K.: So. Which language you think like does 0:16:06.440,0:16:09.800 the whole active pattern problem programming[br]properly? 0:16:09.800,0:16:13.490 B.G.: So Actors are well implemented in Erlang, 0:16:13.490,0:16:18.930 and Echo, if you are using Scala, so take[br]a look at it. 0:16:18.930,0:16:20.600 And again this is not a single bullet, 0:16:20.600,0:16:22.050 again go back to your own basics, 0:16:22.050,0:16:23.240 Fred Brooks told you guys many years back, 0:16:23.240,0:16:23.980 go back to your basics. (00:16:28 - ??) 0:16:23.980,0:16:25.100 So Actors will not solve all kinds of problems 0:16:25.100,0:16:25.579 for you but you should be aware that there[br]is 0:16:25.579,0:16:25.620 another abstraction that I could probably[br]leverage 0:16:25.620,0:16:32.620 to solve whatever problem that I have and[br]can. 0:16:38.290,0:16:43.100 CSP is another thing that I briefly alluded[br]to. 0:16:43.100,0:16:46.550 That's something that is embodied in Go. 0:16:46.550,0:16:50.529 So Yogi just said that you don't need to learn[br]a programming language, 0:16:50.529,0:16:54.810 but look at systems where all these ideas[br]are well-implemented, 0:16:54.810,0:16:58.250 but I would also argue that not all ideas 0:16:58.250,0:17:01.740 can be implemented as well in all languages. 0:17:01.740,0:17:05.099 So you cannot, for example, Java does not,[br]I mean, 0:17:05.099,0:17:07.679 Java has something called Lambdas, but Java[br]hasn't, 0:17:07.679,0:17:09.369 does not have any of those functions. 0:17:09.369,0:17:10.949 So if I really wanted to understand the value 0:17:10.949,0:17:16.079 and virtues of any of those functions, 0:17:16.079,0:17:18.410 I can't learn it through Java. 0:17:18.410,0:17:20.240 The closest I'll get to is dependent injection, 0:17:20.240,0:17:23.069 but that is yet another level of abstraction, 0:17:23.069,0:17:28.799 which basically removes me part of the way[br]from the core goal, right. 0:17:28.799,0:17:34.240 So there are languages which are design to[br]level certain principles. 0:17:34.240,0:17:38.730 Go for example is built on top of CSP, 0:17:38.730,0:17:41.419 and the channels are a first class thing, 0:17:41.419,0:17:41.760 Erlang, also has something similar. 0:17:41.760,0:17:45.140 So maybe learning those languages will expose[br]you 0:17:45.140,0:17:47.919 to those ideas much better than something[br]other language. 0:17:47.919,0:17:48.860 H.K.: Chad, you want to- 0:17:48.860,0:17:50.040 C.F.: Yeah, I think from a, 0:17:50.040,0:17:52.770 from the perspective of learning the paradigm, 0:17:52.770,0:17:55.340 I think Yogi is lucky that he is smart enough 0:17:55.340,0:17:58.850 to read a book and then get all these things. 0:17:58.850,0:18:00.700 My experience is not the same. 0:18:00.700,0:18:01.799 I'm honest about that. 0:18:01.799,0:18:02.660 I don't think you're not being sincere, 0:18:02.660,0:18:07.360 I think some people, including me, 0:18:07.360,0:18:09.299 have to actually use the thing, 0:18:09.299,0:18:11.950 not just the language but the paradigm. 0:18:11.950,0:18:15.910 So like I can read about Actors in five minutes. 0:18:15.910,0:18:20.350 I totally understand it from a theoretical[br]perspective. 0:18:20.350,0:18:21.090 But it takes awhile, 0:18:21.090,0:18:22.490 and it takes actually trying 0:18:22.490,0:18:27.090 for me to really get where it makes sense,[br]you know. 0:18:27.090,0:18:28.299 B.G.: To appreciate it. 0:18:28.299,0:18:31.200 and also to appreciate the edges of it. 0:18:31.200,0:18:33.630 So I actually think like, 0:18:33.630,0:18:35.990 I've been trying to get out of Ruby 0:18:35.990,0:18:36.860 as I've been saying. 0:18:36.860,0:18:39.150 I mean the truth is I have learned, 0:18:39.150,0:18:40.820 I don't know how many programming languages 0:18:40.820,0:18:42.290 since I started doing Ruby, 0:18:42.290,0:18:44.130 but I have never stuck to one. 0:18:44.130,0:18:45.809 I have, but you know, 0:18:45.809,0:18:48.010 I have rarely stuck to one long enough to[br]where 0:18:48.010,0:18:50.780 I really, really thought like that, 0:18:50.780,0:18:53.160 and like the best case scenario for me 0:18:53.160,0:18:58.790 in picking up these other paradigms is to[br]like 0:18:58.790,0:19:03.570 get so into Go programming that then I go[br]back to Ruby, 0:19:03.570,0:19:07.290 and I go to do something, and I don't try[br]to implement channels, 0:19:07.290,0:19:10.890 I just say, damn it, channels aren't here,[br]I'm frustrated now. 0:19:10.890,0:19:13.940 And it, I see that this language isn't perfect 0:19:13.940,0:19:15.190 because no language is. 0:19:15.190,0:19:17.150 But you can't get to that point, 0:19:17.150,0:19:19.070 and that's like where the maturity comes from, 0:19:19.070,0:19:21.860 where you're not in love with any certain[br]thing, 0:19:21.860,0:19:24.080 and you're, you see the entire landscape, 0:19:24.080,0:19:26.299 and this is a part of why I can't answer the[br]question 0:19:26.299,0:19:28.070 of what my go-to language is right now. 0:19:28.070,0:19:30.870 Like I'm doing a lot of Scala because there 0:19:30.870,0:19:35.419 are certain things that I'm working on that[br]work really well with Actors. 0:19:35.419,0:19:39.130 Like I can conceptualize them with Actors[br]and that's what I'm gonna- 0:19:39.130,0:19:42.190 I'm gonna write it in Scala because we already[br]have the JVM, 0:19:42.190,0:19:44.549 so therefore it's easy to do Scala versus[br]Erlang. 0:19:44.549,0:19:48.200 H.K.: But still there's a problem here. 0:19:48.200,0:19:50.220 Like the way you approach programming language 0:19:50.220,0:19:53.090 for example like in Ruby world for example, 0:19:53.090,0:19:56.510 like Eric Hodel or [00"19"54] ?? 0:19:56.510,0:19:59.080 these guys are maintaining tools that you[br]have written actually, 0:19:59.080,0:20:02.260 for many years back, and those tools all have, 0:20:02.260,0:20:04.770 like for example Ruby gems didn't have proper 0:20:04.770,0:20:08.630 test suite for awhile actually, and like the[br]building- 0:20:08.630,0:20:12.220 C.F.: That's because tests are a design smell. 0:20:12.220,0:20:13.179 That's why. 0:20:13.179,0:20:17.970 H.K.: My point is like building a tools like[br]of a language, 0:20:17.970,0:20:19.460 around a language takes time actually. 0:20:19.460,0:20:21.780 Do you think like for example like Eric Hodel 0:20:21.780,0:20:24.289 and these guys are probably working with this[br]thing 0:20:24.289,0:20:26.370 for like nine years or so, 0:20:26.370,0:20:28.000 and they're still doing it, right, 0:20:28.000,0:20:30.280 so how do you like, if, how do you fix that? 0:20:30.280,0:20:34.280 Like you need to stay long-term in a language 0:20:34.280,0:20:37.460 to really change it, right, or like am I wrong[br]here? 0:20:37.460,0:20:40.220 C.F.: You mean you need to stay in it to change[br]the language itself? 0:20:40.220,0:20:42.360 H.K.: To change the language or build like 0:20:42.360,0:20:46.690 the infrastructure or the libraries, gems[br]to support it. 0:20:46.690,0:20:48.169 C.F.: Yeah, somebody does. 0:20:48.169,0:20:50.530 It doesn't have to be me, right. 0:20:50.530,0:20:52.770 B.G.: Again, so let me add something to what[br]Chad said. 0:20:52.770,0:20:57.490 So Chad said that I don't want to remain a[br]Ruby programmer. 0:20:57.490,0:21:00.460 I think what he means is the Ruby mindset,[br]OK, 0:21:00.460,0:21:03.650 or any mindset thereof. It's not about writing, 0:21:03.650,0:21:05.010 just coding that language. 0:21:05.010,0:21:05.820 So you can still be a Ruby programmer for[br]twenty years, 0:21:05.820,0:21:10.370 but that doesn't mean you keep the same mindset 0:21:10.370,0:21:13.490 all the time, right. There are things which[br]are not even new, 0:21:13.490,0:21:15.100 but we are not discovering those things 0:21:15.100,0:21:17.010 because we are not looking beyond Ruby. 0:21:17.010,0:21:18.850 H.K.: Can anyone else, sorry - 0:21:18.850,0:21:21.980 can anyone else carry the mic 0:21:21.980,0:21:26.020 and give it to the audience actually because-[br]there's no mic 0:21:26.020,0:21:26.860 B.G.: It's not just about Ruby, per se, right, 0:21:26.860,0:21:27.610 it's about any- it's applicable to any language, 0:21:27.610,0:21:31.809 like JavaScript, or Scala, or even Java for[br]that matter. 0:21:31.809,0:21:36.230 V.S.: So this, this is kind of intrinsic to, 0:21:36.230,0:21:39.610 something intrinsic to all we actually select 0:21:39.610,0:21:42.940 a language or set of languages to develop[br]these tastes, 0:21:42.940,0:21:44.070 depending on the nature of the problem, 0:21:44.070,0:21:47.090 I guess you pick what is called like a language 0:21:47.090,0:21:50.260 to which other languages can actually circle[br]around 0:21:50.260,0:21:52.580 and support various smaller problems, 0:21:52.580,0:21:55.250 whereas this core language that you're picking[br]is solving 0:21:55.250,0:21:58.130 like majority of the nature of the problem. 0:21:58.130,0:21:59.520 For example, web application, 0:21:59.520,0:22:00.720 but you got some parallelism stuff 0:22:00.720,0:22:03.240 that you need to do or you got some 0:22:03.240,0:22:04.940 functional programming stuff you need to do[br]like Scala, 0:22:04.940,0:22:07.039 so you probably pick one language, well like, 0:22:07.039,0:22:10.360 Ruby, as to kind of like hold everything together, 0:22:10.360,0:22:12.020 but you do have these other languages in which 0:22:12.020,0:22:12.309 you actually solve problems differently. 0:22:12.309,0:22:18.510 So it's more of- but different problems in[br]some contexts, 0:22:18.510,0:22:19.880 Scala may be the code language, 0:22:19.880,0:22:21.500 and you may want to wrap it around Ruby 0:22:21.500,0:22:23.890 a little bit or maybe other things a little[br]bit as well, 0:22:23.890,0:22:26.309 so it's more of starting from the 0:22:26.309,0:22:28.440 architecture of the nature of the problem, 0:22:28.440,0:22:30.970 but being polyglots, you have this choice[br]now, 0:22:30.970,0:22:32.919 not to implement and struggle with one language 0:22:32.919,0:22:34.970 like you just talked about example, but I[br]wish 0:22:34.970,0:22:37.110 channels were there in one particular case. 0:22:37.110,0:22:39.780 But now you could pick, if you can become[br]a polyglot 0:22:39.780,0:22:42.400 and learn these other languages to a good[br]degree, 0:22:42.400,0:22:44.580 you could pick other languages to compliment[br]it 0:22:44.580,0:22:46.610 and solve those specific problems. So this[br]seems 0:22:46.610,0:22:49.130 to be an approach that's kind of intrinsically 0:22:49.130,0:22:50.169 developing right now. 0:22:50.169,0:22:55.470 QUERANT: I have a point very close to what[br]you're saying. 0:22:55.470,0:22:59.940 Like based on, like especially what you said[br]about languages, right. 0:22:59.940,0:23:04.280 Like a general message could be use the right[br]tool 0:23:04.280,0:23:07.360 for the right thing kind of a thing, 0:23:07.360,0:23:12.919 but the problem could be that not everyone[br]can pick up, 0:23:12.919,0:23:14.539 so when you go into a code based on, 0:23:14.539,0:23:16.549 let's say, five different languages are being[br]used 0:23:16.549,0:23:19.360 for the right kind of problems, 0:23:19.360,0:23:20.950 so they are doing the right thing, 0:23:20.950,0:23:22.440 but for someone to go into that code base 0:23:22.440,0:23:24.690 and pick it up would become very hard right, 0:23:24.690,0:23:26.990 because not everybody's turned in that way. 0:23:26.990,0:23:30.039 So that's like, so polyglot comes with a very[br]heavy cost 0:23:30.039,0:23:31.789 of being able to replace yourself. 0:23:31.789,0:23:34.130 At least that's been my experience, 0:23:34.130,0:23:35.549 so that's my first question, 0:23:35.549,0:23:40.190 and like adding onto that like it's very easy 0:23:40.190,0:23:43.530 like you said you know like to pick up a book, 0:23:43.530,0:23:44.960 read through it, go through some you know 0:23:44.960,0:23:47.110 tutorials or whatever it is but like Yogi 0:23:47.110,0:23:49.299 was saying how his team had a, 0:23:49.299,0:23:51.409 they needed about three to four months 0:23:51.409,0:23:53.630 to start writing idiomatic Ruby, right, 0:23:53.630,0:23:55.070 and that is a big deal, 0:23:55.070,0:23:56.539 because in those three to four months 0:23:56.539,0:23:59.950 it's critical that you keep churning out code,[br]right. 0:23:59.950,0:24:01.309 You'll kill yourself or you can't 0:24:01.309,0:24:04.390 come to a halt because now you're getting[br]this new language on board. 0:24:04.390,0:24:07.820 You guys had the luxury of having an existing[br]system, 0:24:07.820,0:24:09.690 which was, and you were replacing that system, 0:24:09.690,0:24:12.100 but that's not necessarily always the case. 0:24:12.100,0:24:17.330 You have to write, so- yeah, so 0:24:17.330,0:24:17.409 H.K.: [indecipherable] (00:24:14) 0:24:17.409,0:24:19.659 QUERANT: Yeah, so like my second point was[br]around, like, 0:24:19.659,0:24:22.809 that was the first question for polyglot recruiting 0:24:22.809,0:24:24.240 and things like that would become very hard, 0:24:24.240,0:24:25.929 how do you know that. 0:24:25.929,0:24:29.330 Second, it's easy to pick up a language on[br]a theoretical sense, 0:24:29.330,0:24:31.980 but to be able to start writing idiomatic[br]programs 0:24:31.980,0:24:35.870 while also developing production-quality code, 0:24:35.870,0:24:39.460 do you guys have any experience about how[br]you got that working? 0:24:39.460,0:24:42.650 H.K.: That was the second question here that 0:24:42.650,0:24:46.809 I was about to ask actually, which was like, 0:24:46.809,0:24:48.020 at least one part of, but like, 0:24:48.020,0:24:50.890 how does an organization adopt a new you know[br]like language? 0:24:50.890,0:24:51.570 For example in Flipkart, like, 0:24:51.570,0:24:54.490 or the company where all of us work, 0:24:54.490,0:24:56.600 like you know like there's a, 0:24:56.600,0:24:58.299 in January a programmer decides I'm going[br]to build 0:24:58.299,0:25:00.360 this program in Erlang or I'm going to build[br]this thing 0:25:00.360,0:25:02.770 in Go and there's nobody else Go, 0:25:02.770,0:25:04.250 nobody else doing Go, 0:25:04.250,0:25:06.270 so as like you guys, 0:25:06.270,0:25:08.909 a senior person in your respective companies, 0:25:08.909,0:25:12.090 so do you listen to that guy or - 0:25:12.090,0:25:15.650 our deployment system is attuned for like[br]JVM deployment 0:25:15.650,0:25:19.789 or Ruby deployment and whole package management[br]or whatever, 0:25:19.789,0:25:21.240 and don't write this. 0:25:21.240,0:25:23.789 So there is like an aspect of like adopting[br]a new technology, 0:25:23.789,0:25:28.380 hiring, you know like the skill, the idea[br]of entry, 0:25:28.380,0:25:35.380 like in code business which are like- so how[br]do you tackle that problem in general? 0:25:36.390,0:25:42.230 Y.K.: So it's a hard problem, right. So at[br]Flipkart, 0:25:42.230,0:25:44.640 we were already fairly polyglot, 0:25:44.640,0:25:49.190 for example we all, the website is in PHP, 0:25:49.190,0:25:50.970 the search engine is in Closure, 0:25:50.970,0:25:53.140 the UGC system is written in Scala, 0:25:53.140,0:25:54.880 Java is all over the place, 0:25:54.880,0:25:56.450 Ruby came into the supply chain, 0:25:56.450,0:25:58.640 node.js is there in the seller platform and[br]more. 0:25:58.640,0:26:00.280 So we were already there, 0:26:00.280,0:26:02.520 but we actually ran into a few problems there. 0:26:02.520,0:26:07.190 So when, I think the question of technology[br]selection 0:26:07.190,0:26:08.710 is actually quite critical. 0:26:08.710,0:26:10.780 Very often a lot of it is driven by, 0:26:10.780,0:26:14.809 is mostly blog-driven decision making, 0:26:14.809,0:26:20.640 and that is, that can be quite scary. 0:26:20.640,0:26:23.169 So we've started to put in some kind of process, 0:26:23.169,0:26:24.590 it's hard, it's not worked so far. 0:26:24.590,0:26:26.059 We've been trying for one year 0:26:26.059,0:26:27.179 and the process is like, 0:26:27.179,0:26:29.220 you know OK go up to somebody else in the[br]team 0:26:29.220,0:26:30.870 and just ask them, just bounce off your thoughts 0:26:30.870,0:26:33.539 first before you kind of take up a new system, 0:26:33.539,0:26:34.330 a new technology. 0:26:34.330,0:26:38.419 So we tried to formalize that, we failed miserably[br]at it. 0:26:38.419,0:26:41.490 But right now what we have set focus on is[br]interfaces. 0:26:41.490,0:26:46.370 So we've become fairly diligent about 0:26:46.370,0:26:48.690 making sure that the interface and contracts[br]are good, 0:26:48.690,0:26:50.570 building systems, and then the systems can[br]call independently, 0:26:50.570,0:26:51.600 whatever tech stack they use, 0:26:51.600,0:26:53.570 as long as the team is committed to it, 0:26:53.570,0:26:56.320 that's not a completely way-out language. 0:26:56.320,0:26:59.169 So we moved from being predominantly 0:26:59.169,0:27:02.549 thrift-oriented interfaces to HTTP, 0:27:02.549,0:27:02.789 and that's added a huge amount of value. 0:27:02.789,0:27:06.980 QUERANT: Can you say what thrift is? (00:27:06[br]- indecipherable) 0:27:06.980,0:27:10.770 Y.K.: Sure. So Thrift is a binding protocol 0:27:10.770,0:27:12.070 which came out of Facebook I think, 0:27:12.070,0:27:15.169 so it basically gives you both RPCM point 0:27:15.169,0:27:16.580 and a data utilization mechanism, 0:27:16.580,0:27:21.620 so it's basically like Corba, 0:27:21.620,0:27:23.240 but it's, so it basically gives you a fast,[br]uh- 0:27:23.240,0:27:25.350 C.F.: These people are too young for that[br]actually. 0:27:25.350,0:27:28.179 Y.K.: Oops. What is Corba? Yeah. 0:27:28.179,0:27:31.029 C.F.: Do not ask that question. 0:27:31.029,0:27:34.470 B.G.: That'll be a big panel discussion by[br]itself, right. 0:27:34.470,0:27:36.190 C.F.: You have to be at least twenty-one to[br]hear 0:27:36.190,0:27:38.950 about Corba and not everyone in this room[br]is twenty-one. 0:27:38.950,0:27:44.429 Y.K.: Protocol buffers. It's more like that,[br]OK anyway. So- 0:27:44.429,0:27:46.650 C.F.: I think connection is open too, right- 0:27:46.650,0:27:47.200 Y.K.: Sorry? 0:27:47.200,0:27:49.460 C.F.: You can keep a long-running PCP connection[br]with that. 0:27:49.460,0:27:54.070 Y.K.: With Thrift you can do it, yes I think[br]so. Yes. 0:27:54.070,0:27:57.100 C.F.: You can keep a long-running PCP connection[br]open too, 0:27:57.100,0:28:00.480 which makes performance better than HTTP in[br]some cases. 0:28:00.480,0:28:03.789 Y.K.: Right, but if you already moved to HTTP[br]1.1% 0:28:03.789,0:28:04.890 connections that's kind of taken care of. 0:28:04.890,0:28:07.559 So yeah most modern libraries have that. So- 0:28:07.559,0:28:09.900 H.K.: We are digressing I think- 0:28:09.900,0:28:11.850 Y.K.: Yeah, where were we? 0:28:11.850,0:28:13.440 C.F.: Let's keep digressing, let's go. 0:28:13.440,0:28:16.750 Y.K.: We were talking about the language and[br]like the context- 0:28:16.750,0:28:19.190 Y.K.: Right, so we become pretty delusioned[br]about contacts, 0:28:19.190,0:28:23.590 so HTTP and the, and actually having sensible[br]rest end points 0:28:23.590,0:28:26.240 and resources has become kind of defacto, 0:28:26.240,0:28:27.970 and that's actually helped a lot. 0:28:27.970,0:28:29.940 So systems within Flipkart are extremely open, 0:28:29.940,0:28:32.970 you can actually query them pretty easily[br]to extract data, 0:28:32.970,0:28:37.240 not push data to it, but yeah, so I think[br]that works. 0:28:37.240,0:28:41.409 And then each team can independently take[br]decisions 0:28:41.409,0:28:42.340 with some guidelines at hand, 0:28:42.340,0:28:44.720 so we kind of brought people towards 0:28:44.720,0:28:47.950 a few languages and technology stacks that[br]have worked, 0:28:47.950,0:28:49.840 but not insist on it, so if somebody goes[br]out and says you know, 0:28:49.840,0:28:52.200 Elixir is also meant for these reasons, 0:28:52.200,0:28:54.029 we'll at least ask them that OK, 0:28:54.029,0:28:56.860 does it check a box on tooling, 0:28:56.860,0:28:59.090 on some mode of profiling or monitoring, 0:28:59.090,0:29:01.220 and basically a small check list of sorts. 0:29:01.220,0:29:03.299 We have not implemented this yet. 0:29:03.299,0:29:04.320 It's probably going to- 0:29:04.320,0:29:06.900 shit's going to hit the fan when we kind of[br]suggest it, 0:29:06.900,0:29:08.890 but yeah that's the idea. 0:29:08.890,0:29:13.029 C.F.: Our solution is a little more messy, 0:29:13.029,0:29:18.440 I guess, as you would probably expect from[br]me. 0:29:18.440,0:29:21.039 But like you said, not too way-out language, 0:29:21.039,0:29:24.159 I like the way-out languages, and I would[br]like everyone 0:29:24.159,0:29:27.520 to be able to do any weird language they want, 0:29:27.520,0:29:30.510 cause I hate that being a thing that people[br]talk about 0:29:30.510,0:29:33.150 and are frustrated about at work. 0:29:33.150,0:29:34.590 Such a stupid thing to worry about. 0:29:34.590,0:29:37.840 So as I talked about in my talk this morning, 0:29:37.840,0:29:41.059 I will tell developers, any language you want,[br]fine, 0:29:41.059,0:29:43.880 go ahead, but you have to write very little[br]code, 0:29:43.880,0:29:46.350 it has to be a very small well-defined thing. 0:29:46.350,0:29:49.210 We are also working very hard on the interface[br]definitions, 0:29:49.210,0:29:52.330 and that's why I was talking about that JSON[br]Schema validation stuff, 0:29:52.330,0:29:56.029 to add one more layer of monitoring to it. 0:29:56.029,0:30:01.529 But most importantly, I want to hire people[br]that I trust, 0:30:01.529,0:30:04.799 and I want to show them that I trust them. 0:30:04.799,0:30:07.409 So if someone really, really wants to do something[br]in Elixir, 0:30:07.409,0:30:11.380 and I have one guy who really, really wants[br]to do something in Elixir, 0:30:11.380,0:30:13.990 he actually proposed it for one project and[br]I said fine, 0:30:13.990,0:30:16.460 whatever. Then we realized we needed to do[br]a lot of stuff 0:30:16.460,0:30:20.470 that talked to Amazon SQS, and there was no[br]good Erlang library 0:30:20.470,0:30:22.100 or Elixir library we could find, 0:30:22.100,0:30:24.630 so we did it in Scala instead, because it[br]was easier. 0:30:24.630,0:30:27.659 But he made the choice, not me, and so, 0:30:27.659,0:30:32.049 like, we have one thing in Lua even, in engine[br]X. 0:30:32.049,0:30:37.500 I would love to have like Assembly and Objective[br]C on the server, 0:30:37.500,0:30:39.789 you know any, maybe, I don't know, Visual[br]Basic, 0:30:39.789,0:30:43.000 does that still exist? We could do that too. 0:30:43.000,0:30:43.600 Off-screen: It totally does. 0:30:43.600,0:30:44.630 C.F.: Yeah, it does. All right, awesome. 0:30:44.630,0:30:46.070 Server-side Visual Basic. 0:30:46.070,0:30:52.169 B.G.: So I guess it's more of a cultural problem, 0:30:52.169,0:30:54.659 it's not really a technical problem. 0:30:54.659,0:30:58.169 And I think it can be solved by setting the[br]right expectations 0:30:58.169,0:31:03.900 and what Chad said, totally agree. Trust your[br]team members. 0:31:03.900,0:31:08.169 Give them the opportunity to try out new tools,[br]and you know, prove them. 0:31:08.169,0:31:11.929 So what we do is that, when a new programming[br]language 0:31:11.929,0:31:14.480 comes out, any way as such we are using a[br]cool 0:31:14.480,0:31:19.190 and really hip programming. But if something[br]cooler comes out, 0:31:19.190,0:31:22.610 like, I don't know, something might come out[br]tomorrow. 0:31:22.610,0:31:28.730 But we always have encouraged people to try[br]out new languages 0:31:28.730,0:31:32.779 and maybe build a internal project and show[br]it to us 0:31:32.779,0:31:36.580 and we take a collective decision in such[br]cases. 0:31:36.580,0:31:39.039 But, yeah. So I think it seems more like a[br]cultural situation, 0:31:39.039,0:31:40.640 and as far as hiring is concerned, I think[br]it's better off, 0:31:40.640,0:31:45.169 better if you hire programmers, instead of[br]Ruby programmers 0:31:45.169,0:31:48.190 or Java programmers, or PHP programmers. 0:31:48.190,0:31:50.600 Get people who can write code and who can[br]learn new things, 0:31:50.600,0:31:54.679 because even in the Ruby world, you are doing[br]new things every day. 0:31:54.679,0:32:01.270 If you cannot learn new tools or techniques[br]then you are stuck. 0:32:01.270,0:32:01.570 QUERANT: (indecipherable - 00:31:57) 0:32:01.570,0:32:03.539 B.G.: A code base, you are talking about a[br]code base. 0:32:03.539,0:32:04.190 QUERANT: (indecipherable - 00:32:04) 0:32:04.190,0:32:07.350 B.G.: So idioms are formed over time, right, 0:32:07.350,0:32:09.720 and they are also learned over time. 0:32:09.720,0:32:12.149 So if you are working on a sufficiently complicated[br]code base, 0:32:12.149,0:32:14.990 any way will take you some time to grok it, 0:32:14.990,0:32:16.120 if there's and existing code base. 0:32:16.120,0:32:17.559 Now if you were trying to learn something 0:32:17.559,0:32:19.970 and to build something fresh. 0:32:19.970,0:32:21.760 It will take you some time, there will be[br]some iterative- 0:32:21.760,0:32:24.549 some iterations, right. That, I think is perfectly[br]normal. 0:32:24.549,0:32:27.990 C.F.: Yeah, I actually meant to answer the[br]idiomatic thing. 0:32:27.990,0:32:30.880 If it works and everyone can understand it, 0:32:30.880,0:32:32.140 I don't really care. 0:32:32.140,0:32:34.080 Like let it look like Java code written 0:32:34.080,0:32:36.850 with Ruby syntax. Doesn't matter if it performs 0:32:36.850,0:32:39.059 and the person enjoyed doing it and it, 0:32:39.059,0:32:42.049 you know, didn't take them forever, 0:32:42.049,0:32:44.159 and it's not completely confusing. 0:32:44.159,0:32:47.419 But, and my answer to that is keep it really[br]small. 0:32:47.419,0:32:50.539 If it does, it doesn't matter if it's idiomatic[br]at all. 0:32:50.539,0:32:51.450 H.K.: But there's like- 0:32:51.450,0:32:54.990 B.G.: Another thing, just one thing that I'll[br]add is that, 0:32:54.990,0:32:56.460 how do you really define idiomatic code, OK? 0:32:56.460,0:33:00.399 A code in which you are able to leverage the[br]features 0:33:00.399,0:33:03.970 of a programming language the best is idiomatic[br]code, right. 0:33:03.970,0:33:05.429 So if you're championing a programming language 0:33:05.429,0:33:08.679 you are trying to introduce the new programming[br]language to your company, 0:33:08.679,0:33:11.640 and of course you'd like to exploit all its[br]features, right. 0:33:11.640,0:33:15.740 Unless it is handed down to you by your boss,[br]right. 0:33:15.740,0:33:18.770 So if someone is championing a new programming[br]language, 0:33:18.770,0:33:23.679 it's his prerogative to you know to learn[br]what the idioms are, 0:33:23.679,0:33:25.470 maybe figure them out over time. 0:33:25.470,0:33:28.460 H.K. This not working? 0:33:28.460,0:33:35.460 B.G.: Yeah that doesn't seem to work. 0:33:36.080,0:33:38.380 V.S.: So it's gonna be a slow process, you[br]know, 0:33:38.380,0:33:40.549 obviously we just talked about lots of languages, 0:33:40.549,0:33:43.080 and the key thing is are we doing in house, 0:33:43.080,0:33:44.590 we have control of the deployment environment, 0:33:44.590,0:33:46.440 versus, we are gonna consult. 0:33:46.440,0:33:49.059 So for example, Flipkart, or, in several cases, 0:33:49.059,0:33:52.020 that there's a lot, you're in control of the[br]whole thing, 0:33:52.020,0:33:53.690 that, and you basically decide, or, 0:33:53.690,0:33:56.059 you live with the consequences of the whole[br]thing, right. 0:33:56.059,0:33:58.520 Then when you're dealing with the customer-based[br]solution, 0:33:58.520,0:34:01.270 obviously there's a lot more constraints as[br]to, 0:34:01.270,0:34:02.860 you know, he would look for somethings that[br]he can 0:34:02.860,0:34:04.659 add more people to work with as opposed to[br]just you, 0:34:04.659,0:34:05.820 and what if you can go away, 0:34:05.820,0:34:07.600 and in-house holds the same problem. 0:34:07.600,0:34:11.359 So probably to start with just learn one more[br]language. 0:34:11.359,0:34:13.250 Just learn one more language and start using[br]it, 0:34:13.250,0:34:14.379 and it's gonna take some time, like you said, 0:34:14.379,0:34:15.829 it's just cultural thing, you know. 0:34:15.829,0:34:18.498 Particularly in India the context is not just, 0:34:18.498,0:34:21.978 you know, just start with one more language, 0:34:21.978,0:34:23.199 try to use it in deployment, 0:34:23.199,0:34:25.559 so it doesn't look like you're grabbing this[br]opportunity 0:34:25.559,0:34:28.779 to as many language as possible into solution[br]you build, 0:34:28.779,0:34:31.089 just for the sake of learning new things. 0:34:31.089,0:34:33.809 But just do one more language, carefully. 0:34:33.809,0:34:34.958 But in order for you to do that 0:34:34.958,0:34:37.549 you probably will have to casually learn five-six[br]languages. 0:34:37.549,0:34:38.949 And you may want to pick that language 0:34:38.949,0:34:40.869 that you want and it's gonna be a slow process. 0:34:40.869,0:34:41.259 You're not gonna be able to finally deliver[br]all this, 0:34:41.259,0:34:46.699 and then you know, introduce a new language[br]just like that next day. 0:34:46.699,0:34:48.708 C.F.: Yeah, when I started learning Ruby, 0:34:48.708,0:34:52.049 I started using it in 2000 network, 0:34:52.049,0:34:53.829 and it was to generate Java code, 0:34:53.829,0:34:55.369 because no one would let me deploy Ruby. 0:34:55.369,0:34:57.018 So I just wrote Java generators 0:34:57.018,0:34:58.859 and I wrote everything like as a DSL in Ruby. 0:34:58.859,0:35:00.599 V.S.: Yeah absolutely. 0:35:00.599,0:35:02.709 My first experience with Ruby was not really[br]mainstream. 0:35:02.709,0:35:04.829 We were just doing, it was called load disk[br]conductors. 0:35:04.829,0:35:07.289 It was an OpenSource thing that we were just[br]doing. 0:35:07.289,0:35:09.209 So what we wanted is we wanted to drive these[br]command lines, 0:35:09.209,0:35:11.019 and Ruby was a language to do that. 0:35:11.019,0:35:12.839 So there are other opportunities for you to[br]use 0:35:12.839,0:35:15.089 new languages may not be in your main code[br]base, 0:35:15.089,0:35:17.229 all the supporting tool systems as well. 0:35:17.229,0:35:18.039 So there's a lot of opportunities, 0:35:18.039,0:35:20.229 so you may not look at it as, 0:35:20.229,0:35:25.349 can I change my main language, or how soon[br]can I do it? 0:35:25.349,0:35:26.140 K.H.: So- 0:35:26.140,0:35:28.469 Y.K.: So, one of the, I don't know, 0:35:28.469,0:35:30.709 this is a thought, this has been kind of crossing[br]my mind repeatedly, 0:35:30.709,0:35:32.959 and kind of worrying me, also. 0:35:32.959,0:35:38.410 So I used to be kind of involved in the language[br]choice wars a lot, 0:35:38.410,0:35:44.959 and always on the now try out something new[br]side. 0:35:44.959,0:35:46.430 And I've kind of discovered a completely 0:35:46.430,0:35:47.660 different way of working at Flipkart, 0:35:47.660,0:35:50.259 and some of the other people who've been there. 0:35:50.259,0:35:52.589 They kind of shook me out of, 0:35:52.589,0:35:56.440 maybe my Thoughtworks influenced it in a certain[br]way. 0:35:56.440,0:36:00.170 So, and there's a very key point when that[br]happened. 0:36:00.170,0:36:03.190 So I think the difference was this, right. 0:36:03.190,0:36:05.369 The take-away was that, 0:36:05.369,0:36:06.920 if I'm arguing about a programming language, 0:36:06.920,0:36:11.920 I probably don't understand the problem domain[br]well enough, right. 0:36:11.920,0:36:15.779 And I've seen cases where systems have been[br]built 0:36:15.779,0:36:19.329 which go fundamentally towards the problem[br]being solved as really about, 0:36:19.329,0:36:20.309 and modeled the code abstraction so beautifully, 0:36:20.309,0:36:24.099 that then, or it identified the co-op section[br]so beautifully 0:36:24.099,0:36:28.920 that it doesn't matter which language you[br]implement it in, 0:36:28.920,0:36:30.170 because that problem is solved. 0:36:30.170,0:36:33.009 And even before we started implementation[br]that is beautiful. 0:36:33.009,0:36:34.099 I think with this giant perspective, 0:36:34.099,0:36:36.329 I think somewhere that has got lost. 0:36:36.329,0:36:38.729 We try to kind of get into implementation[br]much sooner. 0:36:38.729,0:36:41.979 So if I could actually go back and say what's[br]the most, 0:36:41.979,0:36:43.150 my favorite programming language, 0:36:43.150,0:36:45.309 I think I would say domain-driven design actually. 0:36:45.309,0:36:47.859 I would actually just recommend people to... 0:36:47.859,0:36:50.180 oh and actually do that on my team also, too, 0:36:50.180,0:36:53.529 actually read that book and try and apply[br]it. 0:36:53.529,0:36:57.039 Because I think a huge set of wins are possible[br]from that, 0:36:57.039,0:36:59.920 without even going down to the programming[br]language level. 0:36:59.920,0:37:03.910 C.F.: Yeah, the programming language is a[br]tactical choice, 0:37:03.910,0:37:06.799 in most cases, right, but the domain, 0:37:06.799,0:37:09.150 it's like what you were saying about performance[br]earlier. 0:37:09.150,0:37:12.829 You could use Java or you could use JRuby,[br]doesn't really matter, 0:37:12.829,0:37:15.099 because the database is gonna be slow, right. 0:37:15.099,0:37:18.390 When it comes to application design and architecture, 0:37:18.390,0:37:21.719 it's really a hierarchy, so domain-driven[br]design is 0:37:21.719,0:37:23.729 at a level higher than the languages. 0:37:23.729,0:37:27.269 I would still say that the languages make[br]you think differently, 0:37:27.269,0:37:30.559 and some languages suit different domains[br]better, 0:37:30.559,0:37:33.380 and having really open-mindedly going, 0:37:33.380,0:37:36.989 gone back to Java recently for various reasons, 0:37:36.989,0:37:40.890 I can tell you that it's terrible to use,[br]it really is. 0:37:40.890,0:37:42.729 It wastes my time compared to Ruby 0:37:42.729,0:37:45.519 and compared to Scala and compared to more[br]modern languages. 0:37:45.519,0:37:47.039 And it's not a knock against Java - 0:37:47.039,0:37:49.549 Java's older and doesn't have those benefits. 0:37:49.549,0:37:52.859 So I think tactically, it's a bit of an exaggeration 0:37:52.859,0:37:55.450 to say that the language doesn't matter, but[br]I get your point. 0:37:55.450,0:37:57.759 Y.K.: Sure. So just as a counterpoint to that. 0:37:57.759,0:38:00.150 Actually having gone from Ruby back to Java, 0:38:00.150,0:38:03.450 there's a few very low-latency systems that[br]we had to 0:38:03.450,0:38:07.529 build out recently and those are built with[br]some of the newer Java stacks, 0:38:07.529,0:38:12.609 like say dropwizard which has got Hibernate[br]integrated into it, 0:38:12.609,0:38:16.880 and Netti and, so it's basically a complete[br]stack 0:38:16.880,0:38:18.440 and actual systems and the designs that came[br]out of it 0:38:18.440,0:38:18.650 were actually pretty good, 0:38:18.650,0:38:22.019 and I was surprised and actually happy 0:38:22.019,0:38:23.269 to go back and look at Java. 0:38:23.269,0:38:27.140 And I actually enjoy looking forward to Java[br]ahead. 0:38:27.140,0:38:29.859 More than Scala in a sense. 0:38:29.859,0:38:31.920 H.K.: That's good, because- 0:38:31.920,0:38:37.319 So the Java aid that you mentioned and then[br]Scala. 0:38:37.319,0:38:38.499 So there's a couple of things 0:38:38.499,0:38:43.599 like if you talked about this Java like and[br]Scala like, 0:38:43.599,0:38:44.690 why would you choose like, for example, today, 0:38:44.690,0:38:46.569 like Java it is not released. 0:38:46.569,0:38:52.229 But what would issues like, is there any reason[br]to choose 0:38:52.229,0:38:55.069 like Scala over Java now actually? 0:38:55.069,0:38:57.829 Because now for example, (00:38:57 - ??) 0:38:57.829,0:39:00.160 is a good system, but it is usable from both[br]the languages, 0:39:00.160,0:39:04.239 right, so is there any reason to pick- Chad? 0:39:04.239,0:39:09.680 C.F.: Yes. So the question is, 0:39:09.680,0:39:11.529 is there any reason to pick Java over Scala, 0:39:11.529,0:39:13.819 or Scala over Java. Does one win? 0:39:13.819,0:39:19.430 H.K.: No, no, no, no. Just Java, like Scala[br]over Java, like- 0:39:19.430,0:39:21.829 C.F.: Is Scal- or, should you actually, 0:39:21.829,0:39:23.719 because of Java aid, does Scala need- 0:39:23.719,0:39:25.279 H.K.: Or Java seven, yeah. 0:39:25.279,0:39:29.319 C.F.: Java seven, then yes. Like. 0:39:29.319,0:39:35.450 For me I see Scala as like totally over-engineered, 0:39:35.450,0:39:38.509 in the same way that Yogi almost said, but[br]like, 0:39:38.509,0:39:42.709 too many features. But, and I'm even writing[br]a book about it, 0:39:42.709,0:39:45.709 but I kind of hate it. 0:39:45.709,0:39:49.140 That said, you can program Scala like Java 0:39:49.140,0:39:52.109 with less annoying syntax. You can do that, 0:39:52.109,0:39:54.170 you can make it be like a Java program, 0:39:54.170,0:39:56.849 and if you do, I would argue very strongly, 0:39:56.849,0:39:58.170 and maybe, and this is subjective 0:39:58.170,0:40:00.690 and maybe even kind of fashion-oriented, 0:40:00.690,0:40:03.390 I would argue that the Scala code is better[br]to look at 0:40:03.390,0:40:05.809 and easier to write than the Java code. 0:40:05.809,0:40:09.430 There's less typing, and I mean that in two[br]sense. 0:40:09.430,0:40:10.410 Less typing on the keyboard 0:40:10.410,0:40:15.069 and less having to explicitly type because[br]of type inference. 0:40:15.069,0:40:18.599 I'm sure, and like with Java seven there are[br]Lambdas, 0:40:18.599,0:40:20.509 with Java 8 I'm sure it's gonna be some sort[br]of 0:40:20.509,0:40:23.539 anemic thing that doesn't quite work the way[br]we want it to. 0:40:23.539,0:40:25.299 It's perfect in Scala. 0:40:25.299,0:40:27.140 There's a lot of great stuff about Scala, 0:40:27.140,0:40:31.519 as a next evolution of Java. 0:40:31.519,0:40:34.469 But, you can also, like Ruby, 0:40:34.469,0:40:37.630 with meta-programming and eval and all the[br]crazy stuff you can do, 0:40:37.630,0:40:44.630 you can completely shoot yourself in the foot[br]with it, too. 0:40:46.599,0:40:53.599 QUERANT: So, when we compare these languages, 0:40:55.380,0:40:56.749 like Java and Ruby and all that, 0:40:56.749,0:41:00.440 the thing that we kind of focus on is the[br]amount of, 0:41:00.440,0:41:04.999 volume of code. Volume of code doesn't lead[br]to the ease of understanding. 0:41:04.999,0:41:07.660 One of the thing that Java really does well 0:41:07.660,0:41:11.519 is things are so simple that there's no, 0:41:11.519,0:41:13.739 there's implicit stuff happening behind 0:41:13.739,0:41:17.199 the scenes and all that. And very, very well-factored[br]Java code 0:41:17.199,0:41:18.880 is not so ugly to look at. 0:41:18.880,0:41:20.609 We have written all small methods 0:41:20.609,0:41:22.589 and composed stuff out of it. 0:41:22.589,0:41:25.479 It's not so ugly to write or ugly to look[br]at it. So- 0:41:25.479,0:41:26.589 C.F.: I would like to answer that 0:41:26.589,0:41:28.569 even if you're not asking me, 0:41:28.569,0:41:31.400 cause I could imagine myself saying that 0:41:31.400,0:41:33.029 if I were in the audience. 0:41:33.029,0:41:36.499 But right now I strongly disagree with you. 0:41:36.499,0:41:41.890 I think Java is simple as a language, yes, 0:41:41.890,0:41:46.880 but what it leads to is, because of its lack[br]of flexibility, 0:41:46.880,0:41:49.150 it's not the volume of code that I hate - 0:41:49.150,0:41:51.279 I mean sometimes it is, sometimes it's literally[br]because 0:41:51.279,0:41:53.599 I have to type date date equals new date. 0:41:53.599,0:41:56.219 I don't need that. 0:41:56.219,0:41:59.119 But it's also the ability to be expressive, 0:41:59.119,0:42:02.259 and to me that's where Java strongly lacks. 0:42:02.259,0:42:05.999 It's pretty good as a system language, like, 0:42:05.999,0:42:08.339 at the point where you decide you need to[br]make that distinction, 0:42:08.339,0:42:10.779 but maybe as things get faster you don't need[br]to anymore. 0:42:10.779,0:42:15.479 But I believe that the abstractions that people[br]end up creating for Java, 0:42:15.479,0:42:19.069 at least idiomatic Java, like in the Java[br]world, 0:42:19.069,0:42:21.549 idiomatic is a bad sign, I would say, 0:42:21.549,0:42:24.469 because it leads to this kind of pattern soup[br]thing. 0:42:24.469,0:42:26.809 And it's true that you can reason about it, 0:42:26.809,0:42:29.170 because it's statically typed, and there are 0:42:29.170,0:42:31.499 less opportunities for meta-programming, 0:42:31.499,0:42:34.140 but it's a slow process in my experience of[br]reasoning about it, 0:42:34.140,0:42:37.180 because you get so far away from the domain, 0:42:37.180,0:42:40.119 creating all these factories and interfaces[br]and crap, 0:42:40.119,0:42:42.769 just so that you can make it testable and[br]plugable, 0:42:42.769,0:42:47.959 that it, the actual logic and the core of[br]the business gets lost. 0:42:47.959,0:42:52.459 Do you have a- anyone have a point to make[br]on that? 0:42:52.459,0:42:55.589 B.G.: So yeah, I totally agree with Chad here. 0:42:55.589,0:42:57.949 Java the language is designed to be very simple, 0:42:57.949,0:42:59.839 but at the same time it's also very rigid. 0:42:59.839,0:43:03.690 So imagine explaining philosophy to a kid,[br]right. 0:43:03.690,0:43:07.089 The kid probably has a vocabulary of maybe[br]hundred words. 0:43:07.089,0:43:11.839 How do you do that? You cannot discuss the[br]existence of God, 0:43:11.839,0:43:14.630 you know, or maybe the nature of knowledge, 0:43:14.630,0:43:18.299 in front of a kid, because the kid doesn't[br]have the vocabulary 0:43:18.299,0:43:21.359 that you need to communicate with that child,[br]right. 0:43:21.359,0:43:23.549 So what you end up doing is over-simplification. 0:43:23.549,0:43:26.579 So by the time you simplify the concepts to 0:43:26.579,0:43:29.380 the primitives that the child can understand, 0:43:29.380,0:43:33.109 you're far away from Aristotle and Plato,[br]you know. 0:43:33.109,0:43:36.809 So that's the example that I give you. 0:43:36.809,0:43:39.289 QUERANT: I have a question. 0:43:39.289,0:43:41.769 At what point do you feel comfortable or something 0:43:41.769,0:43:46.400 like a threshold level for new languages to[br]be used in production, 0:43:46.400,0:43:48.160 you know, like, there are some languages which[br]are 0:43:48.160,0:43:49.969 coming up now but you still you know 0:43:49.969,0:43:51.430 that it's not something that you use. 0:43:51.430,0:43:53.789 As for me I would probably look at an example, 0:43:53.789,0:43:55.749 if I would say OK, there are quite a few systems, 0:43:55.749,0:43:58.449 big huge systems based on Ruby, I could recommend 0:43:58.449,0:44:01.239 it to someone people who are comfortable say[br]if 0:44:01.239,0:44:04.059 they say it is OK if I use Ruby yeah say because 0:44:04.059,0:44:06.009 there are people who use it. But at production[br]level 0:44:06.009,0:44:07.769 when that new language is- at what point do[br]you feel 0:44:07.769,0:44:08.799 comfortable to say that, OK, this is viable[br]to use 0:44:08.799,0:44:08.999 in production? 0:44:08.999,0:44:09.940 B.G.: Fantastic question. I would say that[br]this is a 0:44:09.940,0:44:10.279 case that you need to develop over time, and[br]I think 0:44:10.279,0:44:10.799 it comes with experience. The more you learn[br]of different 0:44:10.799,0:44:16.849 programming languages, the better you get[br]at evaluating them, 0:44:16.849,0:44:23.849 but having said that, community support does[br]matter, 0:44:25.299,0:44:27.650 based on- 0:44:27.650,0:44:32.349 (00:44:36 - dead audio - 00:44:37) 0:44:32.349,0:44:39.349 OK, you can have a language which can have[br]a 0:44:40.259,0:44:42.279 huge community around it. 0:44:42.279,0:44:44.180 That does not necessarily equate to the language[br]being awesome, OK. 0:44:44.180,0:44:46.059 Documentation is also another thing, ?? (00:44:45) 0:44:46.059,0:44:47.319 is also another thing. 0:44:47.319,0:44:52.640 But again I would say that one of the ways[br]is to really see, 0:44:52.640,0:44:55.519 what is the USB of the language, what kind[br]of problem 0:44:55.519,0:44:58.880 is the language helping you solve, OK. If[br]you see that, 0:44:58.880,0:45:02.199 it's like you already know Python, and there[br]is Ruby, 0:45:02.199,0:45:04.039 not really very different, honestly. 0:45:04.039,0:45:08.380 So, but if you see Go, again, very different, 0:45:08.380,0:45:12.479 a lot of interesting concepts, and so you[br]might 0:45:12.479,0:45:16.799 find problems where that language might fit[br]in just perfectly, right. 0:45:16.799,0:45:21.739 So it's OK to maybe wait for a production[br]by a larger community, 0:45:21.739,0:45:25.209 but sometimes you have to be that champion[br]yourself, right. 0:45:25.209,0:45:28.319 Someone started using the language first,[br]when Ruby came out, right. 0:45:28.319,0:45:30.420 (00:45:27) was the guy, probably. 0:45:30.420,0:45:32.119 That's why he's worshiped today. 0:45:32.119,0:45:35.640 So why not be the (name) yourself. 0:45:35.640,0:45:38.640 QUERANT: (indecipherable - 00:45:37) 0:45:38.640,0:45:43.949 Y.K.: Yup. Yeah, so I think it's, 0:45:43.949,0:45:47.180 there are quite a few kind of milestones for[br]a language 0:45:47.180,0:45:49.190 to go through, but I think the most critical, 0:45:49.190,0:45:51.219 so again, it depends on the kind of client 0:45:51.219,0:45:52.509 that you're kind of suggesting this to, right, 0:45:52.509,0:45:54.239 like if it's a small start up then sure, 0:45:54.239,0:45:55.349 you have a lot more flexibility. 0:45:55.349,0:45:56.999 If it's a larger system, it has to scale, 0:45:56.999,0:45:58.900 you got different constraints. 0:45:58.900,0:46:02.449 But I think by and large the existence 0:46:02.449,0:46:08.239 of a very low latency production profiler 0:46:08.239,0:46:12.039 or on-time run system is probably that milestone. 0:46:12.039,0:46:14.519 The moment that it is in place, 0:46:14.519,0:46:17.359 a profiler which can actually run in production, 0:46:17.359,0:46:19.729 for that language, I think that marks a very[br]critical 0:46:19.729,0:46:22.009 milestone when the language starts evolving[br]at a very 0:46:22.009,0:46:25.319 different pace. Because you start kind of[br]finding issues 0:46:25.319,0:46:27.789 which you never had been able to find before,[br]right. 0:46:27.789,0:46:30.739 So for example, with both tools, we've been[br]able to do 0:46:30.739,0:46:32.819 amazing things in production with Ruby, which[br]was just 0:46:32.819,0:46:35.249 not possible before we knew, even the commercial[br]ordinative, 0:46:35.249,0:46:37.509 like ?? (00:46:35) for that matter, right,[br]so either a 0:46:37.509,0:46:40.099 commercial or opensource production profiling[br]tool I 0:46:40.099,0:46:41.219 think is a pretty significant milestone. 0:46:41.219,0:46:43.819 QUERANT: I have a couple of questions here. 0:46:43.819,0:46:45.890 B.G.: Right, Yogi. 0:46:45.890,0:46:51.430 Y.K.: I don't know. Haven't you seen production? 0:46:51.430,0:46:56.309 B.G.: The production level compiler which[br]you can plug into a running system? 0:46:56.309,0:46:59.039 Y.K.: So there are- 0:46:59.039,0:47:03.339 (00:46:58 - dead audio - 00:47:29) 0:47:03.339,0:47:07.940 B.G.: Yeah, but those are Valgrind but, which[br]is not probably- 0:47:07.940,0:47:08.920 Y.K.: Sure. 0:47:08.920,0:47:12.499 B.G.: I think, what I will say is that, 0:47:12.499,0:47:16.459 Yogi is talking about the presence of a profiler[br]being very important. 0:47:16.459,0:47:18.900 I think again it depends on the domain that[br]you are in. 0:47:18.900,0:47:21.849 What kind of company you work for, what your[br]challenges are. 0:47:21.849,0:47:24.769 It could just be documentation for you. Right[br]or it could be 0:47:24.769,0:47:29.829 just the existence of a all-out library for[br]you, right. 0:47:29.829,0:47:34.579 So I think it depends. The answer, real answer[br]is it really depends. 0:47:34.579,0:47:39.499 QUERANT: I have a question. Like when do we[br]actually 0:47:39.499,0:47:42.539 choose a interpreted language versus a compile[br]language, 0:47:42.539,0:47:45.170 is my first question. Like for example, 0:47:45.170,0:47:48.130 Ruby's interpreted language, and like Java[br]is kind of both, 0:47:48.130,0:47:51.749 like when do we actually choose that one is[br]the first question, 0:47:51.749,0:47:53.420 and second question is- 0:47:53.420,0:48:00.420 H.K.: Just ask one question. Please ask one[br]question. 0:48:02.509,0:48:08.569 QUERANT: Yeah. The question is asked. 0:48:08.569,0:48:14.660 Y.K.: So, OK again this is, as Baishampayan[br]said, 0:48:14.660,0:48:19.209 it's kind of a black art. But roughly the[br]euristics that I used were, 0:48:19.209,0:48:23.930 is primarily driven by is the system gonna[br]be 0:48:23.930,0:48:30.930 CPU-bound or IO-bound? What kind of latencies[br]do you need? Do you want 0:48:34.939,0:48:38.319 (00:48:27 - dead audio - 00:48:42) 0:48:38.319,0:48:43.400 I'd probably go straight away to 0:48:43.400,0:48:48.489 Java or any other static-type language, 0:48:48.489,0:48:49.660 which gives those kind of performance. 0:48:49.660,0:48:53.979 So I think latency is one. I don't know - you[br]might- 0:48:53.979,0:48:56.579 B.G.: So I would say that the differences[br]between 0:48:56.579,0:48:58.989 interpreted and compile languages, they are[br]kind of 0:48:58.989,0:49:02.069 like blurring these days. I think you, what[br]you really mean, 0:49:02.069,0:49:05.380 is a native language versus a language that[br]runs in the VM. 0:49:05.380,0:49:11.670 OK. So I think VMs are as fast as natively[br]compiled languages today. 0:49:11.670,0:49:16.729 And so for example, one of the lowest latency[br]languages 0:49:16.729,0:49:19.890 would be Erlang, but it's not really a natively 0:49:19.890,0:49:23.430 ompiled language for that matter. 0:49:23.430,0:49:27.809 So again, Yogi is absolutely right, it depends[br]on the problem. 0:49:27.809,0:49:30.829 If it's CPO-bound, maybe you should use a[br]language 0:49:30.829,0:49:33.769 which spits out a native binary or maybe 0:49:33.769,0:49:36.699 has a very fast git compiler inside of VM. 0:49:36.699,0:49:40.999 Or if it's IO-bound, which most web-applications[br]are by the way, 0:49:40.999,0:49:44.009 then just use Python, Ruby or whatever, or[br]JavaScript. 0:49:44.009,0:49:48.549 C.F.: Yeah, but in, it is a blurring not only[br]of that boundary, 0:49:48.549,0:49:50.489 but a blurring of concerns. 0:49:50.489,0:49:55.749 So like you said you have never used Ruby[br]for something that 0:49:55.749,0:49:57.019 requires that low-latency. That's because[br]Ruby's not fast enough, 0:49:57.019,0:49:58.180 not because it's an interpretive language,[br]right. 0:49:58.180,0:50:04.199 If it were, yeah, so I would personally say[br]on anything where 0:50:04.199,0:50:04.439 I don't mind having the source code present,[br]which means any 0:50:04.439,0:50:04.509 server-side thing for example, I would use[br]interpretive languages, 0:50:04.509,0:50:04.829 because it's a pain in the ass, I don't want[br]to do that. 0:50:04.829,0:50:05.099 And what all of these things do is the answer,[br]effectively 0:50:05.099,0:50:05.249 just compile it for you, anyway. 0:50:05.249,0:50:05.449 QUERANT: My question is for all panel members. 0:50:05.449,0:50:05.640 From invention of a competitive we're seeing[br]that 0:50:05.640,0:50:05.839 there are so many languages came and gone, 0:50:05.839,0:50:12.839 and each language right on the veil, 0:50:13.199,0:50:20.199 are serving out their time. 0:50:34.289,0:50:41.289 I would say that today Ruby is one of those[br]languages riding on the veil. 0:50:44.680,0:50:48.229 C is the only language which is there for[br]a long time, 0:50:48.229,0:50:51.430 and it is from the starting of the computer[br]still it is there. 0:50:51.430,0:50:55.529 So my question is, how long do you think that[br]the Ruby will be last, 0:50:55.529,0:50:59.479 and what is going to be the next veil? Will[br]it be Closure, or Scala, 0:50:59.479,0:51:03.650 Go or any other language, because the moment[br]is coming to the market 0:51:03.650,0:51:06.709 and total paradigm of programming is changing. 0:51:06.709,0:51:09.469 B.G.: Great question. I will just, in my recollection, 0:51:09.469,0:51:12.130 the oldest language that is still in existence[br]is Lisp, 0:51:12.130,0:51:17.689 and not C. It predates Unix and C by twenty[br]years. 0:51:17.689,0:51:18.209 And anyway- 0:51:18.209,0:51:21.039 C.F.: So that's a huge wave is what you're[br]saying. 0:51:21.039,0:51:22.160 B.G.: Huge wave. 0:51:22.160,0:51:27.029 C.F.: We're still in the Lisp bubble, which[br]will soon burst. 0:51:27.029,0:51:30.989 Everyone will realize that was stupid. 0:51:30.989,0:51:35.059 Do you really want an answer to that question.[br]We didn't really answer it. 0:51:35.059,0:51:38.339 B.G.: So languages do come and go but paradigms[br]do stay, 0:51:38.339,0:51:40.869 OK. So fine, don't focus on languages, 0:51:40.869,0:51:42.839 focus on learning different paradigms. 0:51:42.839,0:51:45.849 C.F.: But they don't really come and go that[br]much. 0:51:45.849,0:51:47.390 I mean think about it, like- 0:51:47.390,0:51:49.699 B.G.: They might, like PHP fell out of favor. 0:51:49.699,0:51:51.890 C.F.: But it's not, not it's out of fashion.[br]Fashion. 0:51:51.890,0:51:53.049 B.G.: It is that. 0:51:53.049,0:51:55.799 C.F.: It is heavily deployed, right, you're[br]running it. 0:51:55.799,0:51:57.059 So it still exists. 0:51:57.059,0:51:59.880 H.K.: A bit sheepishly but running. 0:51:59.880,0:52:04.410 V.K.: But remember one thing. Ruby is older[br]than Java. 0:52:04.410,0:52:06.529 It's been there since 2004. 0:52:06.529,0:52:08.549 But how many people started referring to Ruby 0:52:08.549,0:52:12.170 until Ruby on Rails came? So it's a solution[br]that language 0:52:12.170,0:52:15.199 or a framework provides this, what inspired[br]everything. 0:52:15.199,0:52:18.140 In fact Ruby on Rails inspired the entire[br]ecosystem 0:52:18.140,0:52:21.420 much more of other languages beyond just Ruby. 0:52:21.420,0:52:24.959 So that's in fact, it's Ruby on Rails that[br]made Ruby popular. 0:52:24.959,0:52:28.299 B.G.: It's also Ruby's Achille's heel, by[br]the way. 0:52:28.299,0:52:30.449 V.K.: Absolutely. There's a downside to it,[br]extra- 0:52:30.449,0:52:32.329 B.G.: I'll keep patching FTW, right? Not. 0:52:32.329,0:52:34.869 V.K.: But remember, you know, we were doing[br]all 0:52:34.869,0:52:38.849 this web XML business till Ruby on Rails came[br]about, 0:52:38.849,0:52:42.789 and all this other stuff. So what changed,[br]if you were to call it, 0:52:42.789,0:52:45.989 you would call it Ruby on Rails for the better,[br]rather than Ruby- 0:52:45.989,0:52:47.839 H.K.: Are you saying that the whole rest 0:52:47.839,0:52:52.119 thing was because of Rails? Venkat? 0:52:52.119,0:52:56.339 V.K.: Certainly the moment was more simplification, 0:52:56.339,0:52:58.259 convection over configuration, 0:52:58.259,0:53:00.249 so that's what the Ruby on Rails was inspiring. 0:53:00.249,0:53:01.479 So you could just say that, you know, 0:53:01.479,0:53:03.809 people who were doing Ruby on Rails were doing[br]more 0:53:03.809,0:53:05.759 rest than people who were doing dot net 0:53:05.759,0:53:06.949 and doing the sub-business. 0:53:06.949,0:53:10.809 But by the way, sub seems to be effectively[br]dead, right. 0:53:10.809,0:53:12.999 C.F.: But unfortunately it's dead 0:53:12.999,0:53:16.449 in the same way that PHP is dead. It still[br]exists. 0:53:16.449,0:53:19.599 V.K.: That's true. The same that Colba is[br]dead, right. 0:53:19.599,0:53:21.369 C.F.: And Colba, for that matter. Sorry kids. 0:53:21.369,0:53:25.189 V.K.: And that will never go away, because[br]as long as- 0:53:25.189,0:53:30.739 H.K.: So the next question that I wanted to[br]ask is like, 0:53:30.739,0:53:32.160 Yogi talked about in his presentation, like, 0:53:32.160,0:53:35.269 how using a service architecture, 0:53:35.269,0:53:37.829 like for interface-based for, you know like[br]multiple small 0:53:37.829,0:53:39.759 micro-applications, small applications. 0:53:39.759,0:53:42.739 So the next question is like how do you go[br]about 0:53:42.739,0:53:45.029 in an organization, you have a product, 0:53:45.029,0:53:46.849 or maybe more than one product. 0:53:46.849,0:53:51.249 How do you go about building a true polyglot[br]system, 0:53:51.249,0:53:53.479 where you know like programmers are encouraged[br]to come 0:53:53.479,0:53:55.839 and you know like use different languages. 0:53:55.839,0:53:58.839 Does this require like some previous thought, 0:53:58.839,0:54:00.459 or does it happen automatically, like, yeah. 0:54:00.459,0:54:04.099 What are the best practices and everything? 0:54:04.099,0:54:08.189 C.F.: It's for one of us isn't it. 0:54:08.189,0:54:11.390 Or he says it's for me and I say it's for[br]you. 0:54:11.390,0:54:15.779 OK, so I, actually Yogi did sort of answer[br]this a minute ago. 0:54:15.779,0:54:18.209 You know, you really do need to focus on the 0:54:18.209,0:54:20.430 architecture of the system first. 0:54:20.430,0:54:23.089 That's essentially what my whole rant was[br]this morning, 0:54:23.089,0:54:25.859 is about the architecture of a system that's 0:54:25.859,0:54:31.709 made of small components that interact in[br]well-defined ways 0:54:31.709,0:54:35.160 with very clear responsibilities of each component, 0:54:35.160,0:54:37.849 and the components can and will be thrown[br]away. 0:54:37.849,0:54:40.749 I think for us once we have that set up, 0:54:40.749,0:54:44.199 I really can say yes, write a service in Rust, 0:54:44.199,0:54:46.329 I don't care. I don't even know what it looks[br]like, 0:54:46.329,0:54:48.229 I haven't bothered to read about it yet. 0:54:48.229,0:54:50.559 It's fine. Yeah, it's like C++. 0:54:50.559,0:54:54.019 So yeah it's excellent. It's battle-worn. 0:54:54.019,0:54:57.369 But if it performs well enough 0:54:57.369,0:54:59.239 and it actually works and we're monitoring[br]it 0:54:59.239,0:55:03.319 and doing these, and it's deployable in the[br]way that we can deploy, 0:55:03.319,0:55:06.799 I don't need an ecosystem for polyglot programming[br]then. 0:55:06.799,0:55:09.209 I just need to encourage people to try things 0:55:09.209,0:55:13.049 and to throw them away if they didn't work[br]out. 0:55:13.049,0:55:15.119 H.K.: Venkat, you had something- 0:55:15.119,0:55:16.349 V.K.: Actually there's something 0:55:16.349,0:55:18.829 we just talked about this morning. 0:55:18.829,0:55:21.609 We have to move away from a language requiring 0:55:21.609,0:55:23.939 to be hidden in a web service just to be safe, 0:55:23.939,0:55:25.549 and you can throw it away later. 0:55:25.549,0:55:28.420 I think the languages will have to find a[br]way to work together, 0:55:28.420,0:55:30.949 where you don't need to hide things behind[br]rest. 0:55:30.949,0:55:33.809 All these languages will have to come with[br]a way to improve, 0:55:33.809,0:55:36.869 thereby they should, Ruby should really 0:55:36.869,0:55:38.519 see a world of coexistence with Java, 0:55:38.519,0:55:40.630 and a world of coexistence with dot net. 0:55:40.630,0:55:42.579 Because in many cases we develop in, like[br]JRuby, 0:55:42.579,0:55:45.079 right. You develop in Ruby and you deploy[br]it in Java, 0:55:45.079,0:55:47.359 or J to E, with all the monitoring tools, 0:55:47.359,0:55:49.189 and you talked about profiling. 0:55:49.189,0:55:52.509 JVM and the JV-maker system is very great[br]for deployments 0:55:52.509,0:55:55.709 actually better. So in order for you to use[br]it, 0:55:55.709,0:55:58.309 the Ruby language has to become friendly with[br]Java. 0:55:58.309,0:55:59.910 The simplest thing for example is RJB, which[br]is a bridge to 0:55:59.910,0:56:03.390 Java, which is still, we use by the way, 0:56:03.390,0:56:05.170 over in JRuby as well as separately. 0:56:05.170,0:56:07.299 So you need a way to actually have one language 0:56:07.299,0:56:09.769 talk to another in somewhat standardized,[br]simpler, 0:56:09.769,0:56:11.049 less overhead mechanism. 0:56:11.049,0:56:14.079 And I think that would really encourage people 0:56:14.079,0:56:16.599 to use different languages without having 0:56:16.599,0:56:19.499 to build this up layer or risk layer. 0:56:19.499,0:56:21.679 Y.K.: So you're saying that at like binary[br]level, 0:56:21.679,0:56:24.849 actually like a foreign function interface[br]and. 0:56:24.849,0:56:27.119 I think the simplest way to do that is still[br]over the network. 0:56:27.119,0:56:29.140 Like when it's rest or it's zero MQO or whatever,[br]right, 0:56:29.140,0:56:31.599 it's like independent processes interacting[br]with each other, 0:56:31.599,0:56:33.599 isolated, not messing with each other. 0:56:33.599,0:56:36.519 It just works well. Not convince the RJB or- 0:56:36.519,0:56:38.369 V.K.: You're talking about it from an architecting 0:56:38.369,0:56:41.189 a bigger system standpoint, but I'm just talking[br]about 0:56:41.189,0:56:43.809 simply, I'm running this web application,[br]but certain 0:56:43.809,0:56:45.920 part has to be paralyzed. I should be able[br]to do it 0:56:45.920,0:56:50.539 with less overhead, less new layers, if a[br]simpler 0:56:50.539,0:56:52.329 problem exists where that's applicable, right. 0:56:52.329,0:56:54.150 What you were just talking about, it's applicable, 0:56:54.150,0:56:56.689 has certain complexity and certain layer,[br]but 0:56:56.689,0:56:59.259 generally encouraging people to apply multiple 0:56:59.259,0:57:01.589 languages to a single solution, right now, 0:57:01.589,0:57:02.809 has so much overhead. 0:57:02.809,0:57:06.109 I mean, today colleges are teach kids, 0:57:06.109,0:57:07.969 people about different languages, 0:57:07.969,0:57:09.640 but it's as if, like if you don't get a job 0:57:09.640,0:57:12.589 in Java then go and look for a dot net job. 0:57:12.589,0:57:14.359 That's really how we are learning multiple[br]languages, 0:57:14.359,0:57:16.400 so but we are not learning, it's not that 0:57:16.400,0:57:17.609 we are not learning multiple languages, 0:57:17.609,0:57:20.469 but we are not polyglots by default or 0:57:20.469,0:57:22.589 by simplicity of the system. 0:57:22.589,0:57:24.910 That is I believe, if you want to be, 0:57:24.910,0:57:26.289 if you want to encourage polyglotism, 0:57:26.289,0:57:27.829 you just have to go to the next level 0:57:27.829,0:57:30.479 where languages will have to coexist with[br]each other. 0:57:30.479,0:57:30.949 B.G.: I think- 0:57:30.949,0:57:32.319 V.K.: That is what we built with that notion. 0:57:32.319,0:57:33.929 B.G.: Fair enough. So I think co-existence[br]can 0:57:33.929,0:57:35.910 be looked at from different angles. 0:57:35.910,0:57:39.269 I think what you're talking about is run-time[br]co-existence, 0:57:39.269,0:57:42.609 you know, inside one run-time you have multiple[br]languages running. 0:57:42.609,0:57:44.439 I don't know that that's technically feasible- 0:57:44.439,0:57:46.069 V.K.: It may not be run time, it may not be 0:57:46.069,0:57:48.660 a single process co-existence- it would be[br]a multi-process. 0:57:48.660,0:57:51.429 B.G.: But it would have to be over some network,[br]right. 0:57:51.429,0:57:53.039 V.K.: No. For example, take RGB. 0:57:53.039,0:57:54.380 B.G.: How does it work? 0:57:54.380,0:57:56.059 V.K.: It's almost like you're just calling 0:57:56.059,0:57:57.299 it into the process and kind of like- 0:57:57.299,0:57:58.189 B.G.: But how does it really work? 0:57:58.189,0:57:59.819 V.K.: It could even be- 0:57:59.819,0:58:01.670 C.F.: It's still one process, right, RGB. 0:58:01.670,0:58:02.670 B.G.: Yeah it's still one process. 0:58:02.670,0:58:03.400 V.K.: I agree. 0:58:03.400,0:58:04.859 B.G.: It's still one process, right. 0:58:04.859,0:58:06.569 V.K.: JVM does its own thing, right. 0:58:06.569,0:58:08.509 In a way JVM has its own layer- 0:58:08.509,0:58:10.420 B.G.: But ultimately it's all JVM bite code- 0:58:10.420,0:58:11.380 V.K.: True. 0:58:11.380,0:58:14.529 B.G.: So I think we are all building, or have[br]to 0:58:14.529,0:58:17.079 build distributor systems at the end of the[br]day today, 0:58:17.079,0:58:18.829 and we're also trying to build abstractions. 0:58:18.829,0:58:20.999 Right, that is the whole goal of building 0:58:20.999,0:58:24.949 a software architecture that lets, let me[br]find out which parts 0:58:24.949,0:58:26.809 I can abstract and how. 0:58:26.809,0:58:28.769 So what Yogi talked about, 0:58:28.769,0:58:30.049 and totally agree with him, 0:58:30.049,0:58:34.869 I think the best approach is to abstract away[br]the optimal concerns 0:58:34.869,0:58:35.939 and constructs of the system 0:58:35.939,0:58:38.829 and tie them together using one language 0:58:38.829,0:58:40.420 that is spoken on the system. 0:58:40.420,0:58:43.410 So I think they used JSON in JSON Schema for[br]the- 0:58:43.410,0:58:44.189 Y.K.: It was in HTTP. 0:58:44.189,0:58:45.289 B.G.: It was in HTTP, OK, yeah. 0:58:45.289,0:58:48.309 So what you could use- you guys use it- 0:58:48.309,0:58:50.459 you could use a message queue or maybe use 0:58:50.459,0:58:53.359 something like zero in cue sockets to communicate 0:58:53.359,0:58:57.939 over and maybe use Thrift or even JSON data[br]for communication, but- 0:58:57.939,0:58:58.509 H.K.: So- 0:58:58.509,0:59:01.439 B.G.: The idea is to basically build a system 0:59:01.439,0:59:04.789 of optimal components tied together but using[br]one system, 0:59:04.789,0:59:06.439 but then for the message buzz you can either 0:59:06.439,0:59:09.439 use a socket or a message queue. 0:59:09.439,0:59:14.400 H.K.: So, there's definitely a lot of tools[br]which are, 0:59:14.400,0:59:18.259 like run-times that exist which allow run-time[br]re-use of languages, 0:59:18.259,0:59:22.219 for example like, either on top of the LLVM[br]or on top of JVM, 0:59:22.219,0:59:24.929 you know like how you have Closure collections[br]you can use 0:59:24.929,0:59:27.309 from JRuby actually, there are projects that[br]allow that. 0:59:27.309,0:59:29.289 Do you think that all those are basically[br]toys 0:59:29.289,0:59:32.599 and shouldn't be used in any seriousness? 0:59:32.599,0:59:35.209 B.G.: Closure collections are not toys. 0:59:35.209,0:59:39.369 But what I would say that, I think that this[br]idea, 0:59:39.369,0:59:42.549 it can be applied to the JVM languages, 0:59:42.549,0:59:44.109 but many times you have to use some language 0:59:44.109,0:59:46.910 which is not available on the JVM, right. 0:59:46.910,0:59:48.499 And you cannot use LLVM for it, 0:59:48.499,0:59:50.809 because it's something which is much lower[br]level 0:59:50.809,0:59:53.679 than the JVM. So you'll have to use the network 0:59:53.679,0:59:57.019 to communicate over each other. 0:59:57.019,0:59:59.640 But as far as JVM languages are concerned,[br]yeah, why not. 0:59:59.640,1:00:03.849 At a theoretical level, inter-opt between[br]languages 1:00:03.849,1:00:06.890 is something that we should shoot for. Absolutely. 1:00:06.890,1:00:10.130 QUERANT: I have a complaint and a question[br]here. 1:00:10.130,1:00:13.609 Complaint: You're arguing too much. 1:00:13.609,1:00:17.429 You obviously are in disagreement. 1:00:17.429,1:00:18.199 So 1:00:18.199,1:00:22.009 B.G.: Agreeing too each other. 1:00:22.009,1:00:26.799 C.F.: Closure collections are a toy then- 1:00:26.799,1:00:29.479 I actually, when he was saying are these things[br]a toy, 1:00:29.479,1:00:32.989 I don't mean Closure collections, but I do[br]think that, 1:00:32.989,1:00:38.339 the whole idea of interrupt in a VM or in[br]a process is overrated. 1:00:38.339,1:00:40.709 And I think it's overrated, like, 1:00:40.709,1:00:43.920 I remember being at Fu Camp talking to the[br]parrot guys 1:00:43.920,1:00:46.929 and LLVM guys awhile back in a workshop, 1:00:46.929,1:00:48.089 and they were all complaining because they 1:00:48.089,1:00:52.079 had tried to do like JavaScript on all these[br]different VMs. 1:00:52.079,1:00:53.910 They realized that like an array in JavaScript 1:00:53.910,1:00:55.640 has different semantics then like an array[br]in Java 1:00:55.640,1:00:57.939 and an array in Ruby. You know if you add 1:00:57.939,1:01:00.890 something way off in the distance, 1:01:00.890,1:01:02.759 past the end of the array, in some languages 1:01:02.759,1:01:04.789 it's an error and in some languages it nil[br]fills, 1:01:04.789,1:01:07.849 in some languages it's you know, so like, 1:01:07.849,1:01:09.069 that's a really stupid example, 1:01:09.069,1:01:12.380 and you can all imagine there's some way to[br]solve that. 1:01:12.380,1:01:15.239 But with the more interesting features of[br]the language, 1:01:15.239,1:01:18.429 that lead us to want to be polyglots, 1:01:18.429,1:01:20.920 like I don't really think it makes sense to[br]instantiate 1:01:20.920,1:01:23.150 a Ruby class from Java, for example. 1:01:23.150,1:01:24.329 Because the Ruby class does different 1:01:24.329,1:01:27.799 things than the Java class and vice versa. 1:01:27.799,1:01:30.289 Yes it can sometimes be nice. 1:01:30.289,1:01:31.279 So like when you're in Closure 1:01:31.279,1:01:33.039 and you want to use someone's ancient 1:01:33.039,1:01:35.579 Java library that has been working for years, 1:01:35.579,1:01:37.519 you just do it. When you do it, though, 1:01:37.519,1:01:39.400 it's hideous, and it like, the Java interrupt 1:01:39.400,1:01:42.079 is really not nice. And you know you're doing[br]- 1:01:42.079,1:01:44.819 it works fine. But it's uglier than Closure[br]code. 1:01:44.819,1:01:46.849 Right, so then you want to write something[br]so it 1:01:46.849,1:01:49.699 looks like Closure and feels like Closure. 1:01:49.699,1:01:53.839 So personally I think an operating system[br]is also 1:01:53.839,1:01:56.509 like one process, you can think of it that[br]way these days. 1:01:56.509,1:01:59.219 It didn't use to be the case. But I can spin[br]one up 1:01:59.219,1:02:01.619 and start running it, and then have language[br]interrupt 1:02:01.619,1:02:05.049 with multiple processes in there talking via[br]sockets, 1:02:05.049,1:02:07.559 and it's conceptually not very different.[br]Like if 1:02:07.559,1:02:09.489 I describe it to my mom she won't know the[br]difference 1:02:09.489,1:02:12.119 between that and a virtual machine, so. 1:02:12.119,1:02:14.019 B.G.: There's domain sockets in Unix, right. 1:02:14.019,1:02:15.219 C.F.: Oh yeah domain sockets in Unix. Of course. 1:02:15.219,1:02:16.739 This might be the solution, then. 1:02:16.739,1:02:19.099 QUERANT: Quick question to all the panelists. 1:02:19.099,1:02:22.609 As we stand today, what is the minimum number[br]of languages, 1:02:22.609,1:02:28.410 minimum set-up languages you would recommend[br]to all the programmers. 1:02:28.410,1:02:32.559 H.K.: 01:02:30 - dead audio 1:02:32.559,1:02:38.449 C.F.: Did you tell him his question was invalid,[br]is that it? I disagree. 1:02:38.449,1:02:43.890 H.K.: So what I was trying to- 1:02:43.890,1:02:44.489 B.G.: I would say it's a really awesome question. 1:02:44.489,1:02:47.839 I would say is that maybe don't worry too[br]much about 1:02:47.839,1:02:49.799 the number of languages that you are learning, 1:02:49.799,1:02:52.519 but number of different paradigms that you[br]are learning, right. 1:02:52.519,1:02:58.660 H.K.: So the question was like, like a kind[br]of paraphrasing, like, so- 1:02:58.660,1:03:01.679 B.G.: Doesn't matter. Look at the paradigms. 1:03:01.679,1:03:05.130 If you already know C, then don't bother about[br]C++, 1:03:05.130,1:03:07.759 you know, for example, or whatever. 1:03:07.759,1:03:12.189 H.K.: Yeah so the next question I had here[br]was like, 1:03:12.189,1:03:15.529 I'm just jumping back and forth, but like[br]yeah, 1:03:15.529,1:03:18.349 what next programming languages, like for[br]example, 1:03:18.349,1:03:22.829 you guys are looking forward to. Like you[br]know 1:03:22.829,1:03:26.499 starting with Swami like, sorry, Venkat, like- 1:03:26.499,1:03:30.669 V.K.: OK I'm just looking for a better Ruby. 1:03:30.669,1:03:32.809 H.K.: What do you mean by that? 1:03:32.809,1:03:35.069 V.K.: It's more of- I'm just looking for a 1:03:35.069,1:03:37.039 standardized Ruby where I should be able to 1:03:37.039,1:03:39.529 switch between the Java world and the MRA[br]world, 1:03:39.529,1:03:41.880 without lots of friction and you know, and[br]better 1:03:41.880,1:03:43.709 performing Ruby generally speaking. When as[br]much 1:03:43.709,1:03:47.089 as we just talked about low-level you know[br]you talk 1:03:47.089,1:03:48.749 low-latency stuff. I think we can't keep saying[br]that 1:03:48.749,1:03:53.509 Ruby's, you know, it's really slow for a reason,[br]right. 1:03:53.509,1:03:57.630 And Ruby can run in a hot spot. I want- Java[br]was slow 1:03:57.630,1:04:00.069 because of hot- before hotspot. But Java became[br]very, 1:04:00.069,1:04:03.410 very fast through that time and lots of new[br]work has 1:04:03.410,1:04:05.259 put in there. So there has to be some research[br]into 1:04:05.259,1:04:08.079 performance in Ruby I think or something.[br]I'm just looking 1:04:08.079,1:04:13.739 for better Ruby essentially. For my investment[br]of time and 1:04:13.739,1:04:15.999 language. But certainly, I mean I would like[br]to learn Scala 1:04:15.999,1:04:17.499 and stuff that like, something. 1:04:17.499,1:04:20.709 B.G.: So for me learning a new programming[br]language is 1:04:20.709,1:04:24.109 more like a cognitive exercise to expand my[br]own thought 1:04:24.109,1:04:29.679 processes, not specifically to you know apply[br]in production. 1:04:29.679,1:04:33.199 So the new language that I will be learning[br]in 2014 is Factor, 1:04:33.199,1:04:35.369 and you should check it out. 1:04:35.369,1:04:39.059 C.F.: I was gonna say Factor. 1:04:39.059,1:04:41.109 We should not sit next to each other. We're[br]too similar. 1:04:41.109,1:04:44.229 H.K.: Why, but why, can you just like say[br]why exactly Factor? 1:04:44.229,1:04:48.779 C.F.: I would say Factor because it really[br]hurts to, 1:04:48.779,1:04:50.329 it hurts in a non-stupid way. 1:04:50.329,1:04:53.890 Like if you learn Befunge it hurts in a stupid[br]way. 1:04:53.890,1:04:57.369 Like there's no reason to learn Befunge except[br]for fun. 1:04:57.369,1:05:00.729 Factor, though, there's something clearly[br]there, right. 1:05:00.729,1:05:07.269 It's concatenative programming. It's a different[br]way of having to think. 1:05:07.269,1:05:10.229 And it's a different way that to me feels 1:05:10.229,1:05:15.469 like it's deeper than it is stupid. It, so,[br]actually 1:05:15.469,1:05:19.949 I wouldn't probably learn it now, but I almost[br]said that though. 1:05:19.949,1:05:21.439 It was on my list. 1:05:21.439,1:05:25.459 B.G.: I already know APL and a little bit[br]of J maybe. 1:05:25.459,1:05:28.679 But APL is, again another concatenative language, 1:05:28.679,1:05:30.259 which inspired Factor. 1:05:30.259,1:05:33.630 APL is some language which I can read but[br]cannot type, 1:05:33.630,1:05:36.269 because to type APL code you need a separate[br]keyboard. 1:05:36.269,1:05:39.749 That's why I'm learning Factor this year. 1:05:39.749,1:05:41.079 H.K.: Yogi? 1:05:41.079,1:05:45.719 Y.K.: I don't know, Sanskrit, maybe. (01:04:41[br]??) 1:05:45.719,1:05:48.880 But yeah, I think Go or Haskel. 1:05:48.880,1:05:53.089 I think there the most differences from what[br]I already know, so. 1:05:53.089,1:05:57.890 H.K.: Fair enough. So I think a lot of first[br]- 1:05:57.890,1:06:01.319 learn programming languages and then the Dave[br]Thomas 1:06:01.319,1:06:04.729 like his book Pragmatic Programmer recommends[br]like learn 1:06:04.729,1:06:06.259 a programming language a year actually. 1:06:06.259,1:06:09.809 And so one of the things that I've been 1:06:09.809,1:06:13.150 wondering is like, how do you exactly like 1:06:13.150,1:06:15.209 go about learning a language? You cannot, 1:06:15.209,1:06:18.689 so like you cannot go to Flipkart and deploy 1:06:18.689,1:06:21.049 a production system in Hascal, that, I don't 1:06:21.049,1:06:24.579 know if you allow, but we talked about that[br]already, actually. 1:06:24.579,1:06:26.759 So but like how do, how does a person like 1:06:26.759,1:06:28.390 when picking up a language go about 1:06:28.390,1:06:32.229 learning a programming language, and like[br]so- 1:06:32.229,1:06:35.339 V.K.: So I think I've probably got the - 1:06:35.339,1:06:39.059 so yeah like. I actually read the manual. 1:06:39.059,1:06:44.059 Yeah, I'm so boring. And so I just read the[br]manual 1:06:44.059,1:06:47.400 just to get a flavor of what it's about and[br]what's possible. 1:06:47.400,1:06:50.559 Without going deeply into it it usually takes 1:06:50.559,1:06:51.619 like a few hours, because it's really superficial. 1:06:51.619,1:06:53.669 But once I get a sense of what the language[br]is about, 1:06:53.669,1:06:54.979 what the code constructs are, then do a second[br]pass 1:06:54.979,1:06:55.549 to kind of just decide really what's it about 1:06:55.549,1:06:56.109 and then play around with some code. But as- 1:06:56.109,1:06:56.419 (01:07:03 - dead audio space 01:07:47) 1:06:56.419,1:06:57.049 C.F.: I would try to do some simple services 1:06:57.049,1:07:01.809 and you know stuff with Actors running in[br]the background. 1:07:01.809,1:07:08.809 And whenever I saw something I didn't understand 1:07:29.609,1:07:36.609 I would just go look in the source code for[br]play. 1:07:51.839,1:07:58.839 Then I would look at this crazy Scala type[br]stuff 1:07:58.900,1:08:00.739 and have to then read the manual for a few[br]hours 1:08:00.739,1:08:03.619 to figure out what's happening. But now I[br]will never forget, 1:08:03.619,1:08:06.390 because I encountered it through a painful[br]situation, 1:08:06.390,1:08:11.119 so I have like the emotional trigger to never[br]let go of that knowledge. 1:08:11.119,1:08:12.910 B.G.: That's interesting, yeah. 1:08:12.910,1:08:16.660 I think, so every new language brings a different[br]way 1:08:16.660,1:08:20.420 of thinking to the table. So reading the manual 1:08:20.420,1:08:23.080 should be the first thing that you should[br]do I think. 1:08:23.080,1:08:24.759 Maybe because, usually the manual is written 1:08:24.759,1:08:26.310 by the author of the language, 1:08:26.310,1:08:30.158 or at least some supporting material about[br]the rational 1:08:30.158,1:08:32.368 or the ethos of language. 1:08:32.368,1:08:34.319 And once you have some superficial idea 1:08:34.319,1:08:37.078 what the language, start building something. 1:08:37.078,1:08:39.469 And at the same time look at the source code 1:08:39.469,1:08:41.649 of the language, or maybe the standard library 1:08:41.649,1:08:44.689 or some other products or tools that have[br]already 1:08:44.689,1:08:45.960 been written in that language, 1:08:45.960,1:08:48.479 to get a sense of how things are detected, 1:08:48.479,1:08:50.089 what the idioms could be. 1:08:50.089,1:08:53.948 And basically read more code, and then write. 1:08:53.948,1:08:56.529 I think I've always benefited more from 1:08:56.529,1:08:59.359 reading a lot more code than writing. 1:08:59.359,1:09:02.549 V.K.: Yeah I think the problem comes first[br]in, 1:09:02.549,1:09:02.988 I don't choose a language, just more of a[br]problem, 1:09:02.988,1:09:05.948 and I think this language could be better[br]to solve that problem, 1:09:05.948,1:09:08.179 and then just to find the quickest way to[br]solve the problem 1:09:08.179,1:09:09.719 and learn the crux of the language. 1:09:09.719,1:09:14.429 And then go learn further by looking into[br]the manual and other stuff. 1:09:14.429,1:09:17.589 H.K.: So Chad I was talking to you before 1:09:17.589,1:09:21.889 and like you said like don't just learn a[br]language, 1:09:21.889,1:09:23.460 deploy something production like similar, 1:09:23.460,1:09:27.279 and don't learn a language in a year, like[br]spend time with it. 1:09:27.279,1:09:29.460 Build something, solve a hard problem, 1:09:29.460,1:09:31.988 build something complicated, how do you say- 1:09:31.988,1:09:35.259 C.F.: Well yeah what I was telling you about[br]is Dave Thomas, 1:09:35.259,1:09:37.988 who is one of the authors of Pragmatic Programmer 1:09:37.988,1:09:41.408 who coined this language of the year idea, 1:09:41.408,1:09:44.569 he spoke at RubyConf 2010 and he said that[br]he had 1:09:44.569,1:09:48.069 revised his thoughts on what the challenge[br]should be. 1:09:48.069,1:09:49.908 Instead of just learning a language every[br]year, 1:09:49.908,1:09:53.238 I think he has the same problem I do, he can't[br]retain it. 1:09:53.238,1:09:56.340 He challenged everyone to learn a language[br]and deploy it 1:09:56.340,1:09:58.760 to production every year. 1:09:58.760,1:10:02.360 Because to him again it's the same thing I[br]just described for myself, 1:10:02.360,1:10:05.670 that he personally can't hold on to the knowledge 1:10:05.670,1:10:08.400 unless he experiences the real pain 1:10:08.400,1:10:10.570 of putting something into practice. 1:10:10.570,1:10:11.699 V.K.: Absolutely. 1:10:11.699,1:10:15.280 H.K.: So the pretty much like, 1:10:15.280,1:10:17.550 you learn programming languages like a lot[br]of persons, 1:10:17.550,1:10:21.300 but really our day jobs still requires to[br]programm in Ruby 1:10:21.300,1:10:25.170 or Java or whatever, so, one of the key things[br]like, 1:10:25.170,1:10:28.079 you write Lisp, you become a better Java programmer. 1:10:28.079,1:10:30.659 That's the wisdom so, like, how do you exactly[br]go 1:10:30.659,1:10:32.369 about adopting features, you know like, for[br]example, 1:10:32.369,1:10:37.929 like Closure or Scala or Haskel or Go, and[br]you know 1:10:37.929,1:10:41.789 like the language the you program in day to[br]day, 1:10:41.789,1:10:44.329 maybe for the dayjob. So like, 1:10:44.329,1:10:45.250 B.G.: How do you adopt a new language? 1:10:45.250,1:10:46.630 H.K.: How do you adopt features? 1:10:46.630,1:10:47.260 B.G.: Ideas. 1:10:47.260,1:10:48.199 H.K.: Ideas, yeah. 1:10:48.199,1:10:51.010 B.G.: So, as I said, every language has a[br]different 1:10:51.010,1:10:55.719 way of you know solving problems. So for example 1:10:55.719,1:10:57.110 if I take the example of Closure, in Closure[br]there 1:10:57.110,1:11:01.300 is a lot of emphasis on data. OK, you don't[br]hide data 1:11:01.300,1:11:04.090 inside objects and stuff. 1:11:04.090,1:11:06.840 You basically treat everything as first class[br]data structures 1:11:06.840,1:11:09.750 and then manipulate the data using standard[br]library 1:11:09.750,1:11:12.530 functions and spit it out into a different[br]format 1:11:12.530,1:11:16.280 if you need to. So that, some design or architectural 1:11:16.280,1:11:18.710 thinking that can be applied to any language,[br]right. 1:11:18.710,1:11:21.409 I know people who are actual provisional 1:11:21.409,1:11:23.429 Python programmers, who learned Closure, 1:11:23.429,1:11:25.909 did some real programming in Closure, 1:11:25.909,1:11:28.190 and went back to doing Python 1:11:28.190,1:11:30.929 and came back to me and told me that my Python[br]code 1:11:30.929,1:11:33.320 is so much better now, right. 1:11:33.320,1:11:34.760 So I think it's not just about Closure 1:11:34.760,1:11:39.770 or any specific language, but the idea is[br]that, 1:11:39.770,1:11:42.360 get a taste of the language, 1:11:42.360,1:11:44.550 see how they think about solving problems, 1:11:44.550,1:11:46.079 and you know, you may not be able 1:11:46.079,1:11:47.829 to transport all the ideas, 1:11:47.829,1:11:49.139 like if you like channels in 1:11:49.139,1:11:51.510 Go you cannot build a channel-like thing in[br]Java, 1:11:51.510,1:11:55.360 for example. It would be very hard for you[br]to do it. 1:11:55.360,1:11:58.039 But at least if you have an appreciation for[br]it, 1:11:58.039,1:11:59.079 maybe who knows tomorrow you might 1:11:59.079,1:12:03.199 be able to use a third party library to use[br]it. 1:12:03.199,1:12:06.949 C.F.: There's actually a problem that can[br]happen, 1:12:06.949,1:12:08.840 though. So you can take good things, 1:12:08.840,1:12:12.780 like the data orientation or the ideas of[br]immutability 1:12:12.780,1:12:16.889 by default in Closure and then just try to[br]make your 1:12:16.889,1:12:20.309 Ruby code be like that, because you understand[br]the benefits. 1:12:20.309,1:12:23.429 Or you could do stuff like try 1:12:23.429,1:12:26.039 (01:12:23 - dead audio space - 01:12:36) 1:12:26.039,1:12:30.199 it's even possible to then simulate the features 1:12:30.199,1:12:34.889 of one of these languages that you're learning[br]from, 1:12:34.889,1:12:41.150 but you emulate them in an environment that's[br]not friendly to them, 1:12:41.150,1:12:47.520 and it's a bad idea. So I would say don't[br]go too crazy trying 1:12:47.520,1:12:50.530 to make Ruby be functional more than it is, 1:12:50.530,1:12:52.929 or to be Actor-oriented or whatever. 1:12:52.929,1:12:57.130 B.G.: There will always be incidents (01:12:53) 1:12:57.130,1:12:58.929 in practice, right. 1:12:58.929,1:13:03.329 You'll figure it out if you try to apply it. 1:13:03.329,1:13:07.179 Y.K.: I'm gonna agree with Chad, so. 1:13:07.179,1:13:12.119 V.K. Yeah, OK, I'm not into this functional[br]side 1:13:12.119,1:13:15.880 or you know the Lisp side of Closure set of[br]things yet. 1:13:15.880,1:13:18.190 So my experience is essentially trying to[br]play more 1:13:18.190,1:13:20.520 ideas from Ruby into Java, and there was a- 1:13:20.520,1:13:22.869 you know probably Java at level that we just[br]talked about. 1:13:22.869,1:13:25.710 It's such a, what is it called, a restrictive[br]language. 1:13:25.710,1:13:29.070 There is a lot that I could actually learn[br]and apply to 1:13:29.070,1:13:31.000 Java and Ruby which was really exciting. 1:13:31.000,1:13:31.960 There were libraries, 1:13:31.960,1:13:35.070 I think there were coming up for like 1:13:35.070,1:13:37.360 calling anonymous functions or proc like things 1:13:37.360,1:13:38.900 that I could actually use them. 1:13:38.900,1:13:41.420 So those are, it was not really really tangible[br]at 1:13:41.420,1:13:44.840 specific example I could give. My Java programming[br]extensively improved. 1:13:44.840,1:13:49.360 Or readability of the code improved by having[br]written Ruby code. 1:13:49.360,1:13:51.960 Some of it will actually happen naturally[br]I believe. 1:13:51.960,1:13:54.119 B.G.: I don't think that - 1:13:54.119,1:13:56.340 For example I was doing a lot of Python before 1:13:56.340,1:13:59.710 I started doing some real Lisp programming. 1:13:59.710,1:14:03.050 Python always had the map and filter and reduce[br]functions. 1:14:03.050,1:14:05.400 I was never able to appreciate those functions[br]when 1:14:05.400,1:14:08.320 I was just a Python programmer, OK. For example, 1:14:08.320,1:14:11.630 Closure has something called protocols, OK. 1:14:11.630,1:14:15.550 How many people here have heard about refinements[br]in Ruby 2.0. 1:14:15.550,1:14:17.389 C.F.: Refinements, yeah. 1:14:17.389,1:14:19.550 B.G.: Yeah. It's a new feature. 1:14:19.550,1:14:22.579 So, see, minority. OK, it's a really good[br]feature, 1:14:22.579,1:14:25.900 and it lets you do code monkey patching but[br]restricted 1:14:25.900,1:14:29.369 to a specific module, OK. So I think that, 1:14:29.369,1:14:31.929 Ruby guys don't, are often are don't 1:14:31.929,1:14:36.639 understand benefits then it's kind of like[br]a shame, right. 1:14:36.639,1:14:39.010 Y.K.: Yeah but that's a point right, 1:14:39.010,1:14:40.820 that's something which has to happen at the[br]language level. 1:14:40.820,1:14:44.650 Like as a application developer who's not[br]working on the language itself, 1:14:44.650,1:14:48.539 adoption of features from other languages[br]will run into bottle necks. 1:14:48.539,1:14:52.059 So that's definitely one area where, for example[br]in the Java world, right, 1:14:52.059,1:14:55.500 when you move back from a lot of the ex-Ruby[br]programmers 1:14:55.500,1:14:58.489 move back to Java, and they created some beautiful[br]libraries. 1:14:58.489,1:15:02.520 Like for example I know an ex-thoughtworker[br]who's done 1:15:02.520,1:15:05.599 a library called (01:15:03), which allows[br]you to kind of mimic 1:15:05.599,1:15:07.309 Closures in Java, and it works through 1:15:07.309,1:15:12.750 actually hooking up a Java agent at run time. 1:15:12.750,1:15:14.679 So the point is it's a beautiful experiment, 1:15:14.679,1:15:17.369 but you can't really use that in production 1:15:17.369,1:15:18.579 because your IDs not going to recognize it, 1:15:18.579,1:15:21.280 you know simple things like that which might 1:15:21.280,1:15:23.300 seem like trivial but they actually hurt,[br]because 1:15:23.300,1:15:25.860 another the code syntax highlighting is kind[br]of 1:15:25.860,1:15:28.199 gone for a toss. The debug obviously doesn't[br]work, 1:15:28.199,1:15:28.309 you can't- 1:15:28.309,1:15:33.719 So you got to hook up the agent while running[br]the app. 1:15:33.719,1:15:38.900 So it becomes tricky, so I think a lot of[br]the language 1:15:38.900,1:15:41.719 features which get adopted do get a lot of[br]those frameworks. 1:15:41.719,1:15:44.170 For example, Actor systems, even though we[br]don't have 1:15:44.170,1:15:49.000 it in Java, kind of analogies of that have[br]been funnily 1:15:49.000,1:15:52.409 enough systems like Mule (01:15:40) right,[br]which is again 1:15:52.409,1:15:55.409 enterprising and boring, but essentially it[br]solves 1:15:55.409,1:15:56.949 the same problem. Like not at the language[br]level but 1:15:56.949,1:16:00.190 it allows you to coordinate independent Actors 1:16:00.190,1:16:04.369 and construct bulges (01:16:01) of flows which[br]kind 1:16:04.369,1:16:06.869 of do something productive and allow you to[br]scale 1:16:06.869,1:16:08.270 out in a very simple way, right. 1:16:08.270,1:16:11.550 So frameworks end up kind of taking their[br]place in a certain way. 1:16:11.550,1:16:14.199 I think it's difficult to bring it down to[br]a language very well. 1:16:14.199,1:16:16.579 V.K.: That kind of introduced like using 1:16:16.579,1:16:18.099 play framework in Java, right. 1:16:18.099,1:16:20.139 It actually brings a lot of Rails goodness 1:16:20.139,1:16:23.090 and Rails inspiration into Java, so you don't, 1:16:23.090,1:16:24.500 it's not necessarily about the language weights. 1:16:24.500,1:16:27.409 It's also things like dimension or configuration, 1:16:27.409,1:16:29.440 which can be learned and applied into other[br]languages. 1:16:29.440,1:16:31.969 So just ideas are behind a specific paradigm, 1:16:31.969,1:16:34.750 the simplicity or the philosophy behind it[br]can 1:16:34.750,1:16:37.020 be applied into other languages, like Java[br]from Ruby. 1:16:37.020,1:16:39.889 So I think the framework side of it plays[br]I think a big role. 1:16:39.889,1:16:41.300 Y.K.: Yeah that's a great point because there's 1:16:41.300,1:16:46.230 funnily enough right like a framework like[br]Rails 1:16:46.230,1:16:48.989 or Sinatra was invented in Java. Why is that? 1:16:48.989,1:16:52.030 Because the thought process that's behind[br]Java 1:16:52.030,1:16:54.030 is just not tooled to the kind of thinking[br]and 1:16:54.030,1:16:55.750 such lightweight simplistic services. 1:16:55.750,1:16:59.239 And it only took somebody to kind of look[br]at Ruby, 1:16:59.239,1:17:01.159 see its simplicity and be able to kind of[br]build 1:17:01.159,1:17:02.349 something so simple as Sinatra, like it's[br]beautiful. 1:17:02.349,1:17:04.250 And now that thought process has come out. 1:17:04.250,1:17:05.900 So yeah play's a great example actually. 1:17:05.900,1:17:07.840 V.K.: Yeah I think there's two things you[br]know, 1:17:07.840,1:17:10.929 the discussion kind of weighed towards more[br]towards 1:17:10.929,1:17:14.469 the paradigms, more. But I think there is[br]an 1:17:14.469,1:17:16.280 things like simplicity, conventional configuration 1:17:16.280,1:17:20.409 or concepts, which is another side that languages[br]have, 1:17:20.409,1:17:23.369 which are not specific to how to make parallelism[br]better 1:17:23.369,1:17:25.320 which are not specific to how to do functional[br]programming, 1:17:25.320,1:17:27.340 but still something which was not done before[br]or 1:17:27.340,1:17:29.780 easy enough in your language, which you could[br]have applied. 1:17:29.780,1:17:31.210 You know the language is easier. 1:17:31.210,1:17:32.639 But those are not new libraries 1:17:32.639,1:17:34.570 or nothing to do with really specific functions. 1:17:34.570,1:17:36.969 But you could get better in other languages[br]by 1:17:36.969,1:17:39.179 looking at this other philosophy behind 1:17:39.179,1:17:41.699 the language just beyond a specific paradigm 1:17:41.699,1:17:43.119 of the strength of the language. 1:17:43.119,1:17:47.469 H.K.: So we are about to close the panel discussion. 1:17:47.469,1:17:50.980 Any questions? We have time for questions. 1:17:50.980,1:17:51.659 Actually. 1:17:51.659,1:17:55.179 C.F.: Or how about you just raise your hand 1:17:55.179,1:17:56.199 if you want to ask a question 1:17:56.199,1:17:59.230 and otherwise we'll all get tea. You have[br]a question. 1:17:59.230,1:18:04.739 B.G.: Or we can just move the discussion to[br]the break room. 1:18:04.739,1:18:10.340 We could do that. So let's just you know - OK. 1:18:10.340,1:18:17.340 QUERANT: So I worked in different programming[br]languages. 1:18:17.800,1:18:22.869 So about four to five, so I think programming[br]languages 1:18:22.869,1:18:26.469 rose to such heights because either because[br]the programming 1:18:26.469,1:18:29.170 language itself or through its supporting[br]libraries. 1:18:29.170,1:18:32.539 For example, Ruby was not in so much mainstream[br]until 1:18:32.539,1:18:38.610 Rails came into existence. And Python for[br]scientific calculation. 1:18:38.610,1:18:41.949 C for internal system, you know Linux kind[br]of stuff. 1:18:41.949,1:18:42.969 C++ for games and other stuff. 1:18:42.969,1:18:45.849 So what all, I mean do these programming languages 1:18:45.849,1:18:50.369 have and uh, example like Scala, Closure,[br]Go, Erlang. 1:18:50.369,1:18:53.000 So these are upcoming, like dot also. 1:18:53.000,1:18:54.860 So what do these programming languages have 1:18:54.860,1:18:57.380 that they'll come on call. I mean what do[br]these libraries, 1:18:57.380,1:19:00.420 I mean what are the bigger libraries that[br]they have, 1:19:00.420,1:19:03.170 so that people like me can use them for certain[br]purpose. 1:19:03.170,1:19:06.480 So what all they are useful for? 1:19:06.480,1:19:08.760 C.F.: That'll take awhile. 1:19:08.760,1:19:11.340 B.G.: That's a very long-winded question. 1:19:11.340,1:19:13.909 I'll very quickly answer that. 1:19:13.909,1:19:16.909 Every language probably has a killer app,[br]right, 1:19:16.909,1:19:20.059 to champion it or maybe make it famous or[br]popular. 1:19:20.059,1:19:25.909 Not every, not all languages have one specific[br]killer app, 1:19:25.909,1:19:28.320 for example, while, what would you say the 1:19:28.320,1:19:30.489 killer app for JavaScript is, right? 1:19:30.489,1:19:31.969 Or what about Objective C? 1:19:31.969,1:19:33.949 Right, just that you don't have any other[br]choice 1:19:33.949,1:19:37.400 in those cases, right. If you want to program[br]for the browser, 1:19:37.400,1:19:38.889 JavaScript is your only choice, 1:19:38.889,1:19:42.119 Objective C if you are doing Apple programming,[br]right. 1:19:42.119,1:19:45.030 So yeah, I mean, every once in awhile there 1:19:45.030,1:19:47.929 are projects or libraries or products which 1:19:47.929,1:19:49.480 do come and make something very famous. 1:19:49.480,1:19:54.510 But it may not be true for everything. 1:20:01.400,1:20:02.740 H.K.: If anybody has any other questions 1:20:02.740,1:20:06.000 then I can (drowned out by applause - 01:20:05) 1:20:06.780,1:20:08.740 Thank you.