 Okay, so the title of this talk is Great Developer Steel, and I'm sure all of you are familiar with the quote from the artist's version, one of which in carnations is here, right? The Bad Artist of the Great Artist of Steel by Pablo Picasso, also by Maxi, and by anybody else who wants to say it, in any form, language, phrasing is possible. And I think that the reason that this quote is interesting, and the reason it gets longated so often, is because we have these intrinsic associations with the words of you, right? Stealing, we think is bad. So if it's a great artist's part, are they stealing? Is it plagiarizing? Is it straight up copying? Is it hordery, right? The interplay between what the words mean in common usage and what they imply in this particular structure is what makes this quote exciting. And I think that, well, I hope that after this talk, you'll get a sense of how that applies to us in software development. But before I get there, we need to talk a little bit about music and how stealing works in music, okay? So I think there are three main ways of stealing things in music. There's sampling, there's influence, and there's covers. And we're just going to go ahead and click on sampling first. Sampling is pretty much as close to stealing in music as you get, unless you actually want to steal somebody's digital masters and install them in your own. Sampling is practice of taking a chunk of a piece of music and putting it into another piece of music, right? The current, one of the current masters of this would probably be Girl Talk. I don't know if you guys saw this infographic. It was in Wired about a year ago, maybe a little more than that. And it breaks down by time signature, what, or time, a lot much, right? What samples we're using, Girl Talk's song, what it's all about, okay? So you can see that Beyonce is used from zero to 11 seconds, and D.J. Paltz-Simmons is fewer than 21, and Overlap's and Bill Collins is very, it is an amazing feat to take all of these works from other people, just tiny snippets of them, and assemble it into a new, original piece of art. But if you look at it, right, there's actually no sound in this song that Girl Talk himself came up with. All of the sounds in it, everything that makes up the piece comes from somewhere else. He's stolen these little pieces from elsewhere, and there are all sorts of legal issues to say I'm playing that we won't talk about. But it's just sort of a phenomenon, and a feat in itself. So that's the most direct version of Schumann. The least direct, I think, is influence, right? And you look at artists like Jimi Hendrix, or Beatles, or, you know, Aldous Gerald, or Snotter, or whoever that have influences on large sloths of the music landscape. I don't know how many amazing guitarists you can ask, and they won't say that Hendrix is one of their influences. Someone from whom, by whom they were inspired, someone who they played their solos over and over again, I was talking to a friend of mine, he mentioned that jazz musicians still will try to replicate the ridiculous improvised solos that other jazz musicians do, just to sort of get at the feeling underneath, and make it their own, and make it part of their own unique style. So it's not really stealing the essence, like it's not stealing the object, which is sampling. It's more stealing the underlying style and trying to make it your own. And then the last one I want to talk about are covers, right? The covers are weird, so we're going to talk about them a while. In fact, this isn't extended, kind of, or, so I'm still a little upset. So covers, right? Covers are kind of hard to define, right? We all have an instinctual understanding of a cover is a song that was made popular by somebody, and then somebody else forms it, right? But if you look at different covers, they differ in all kinds of things, right? They have different melodies, they have different lyrics, they have different styles, they have different themes. I think when you dig through all the examples, usually the lyrics are closest to the same, but just as an example, the exact same words don't necessarily mean the exact same things are here in their set. Who here knows Pierre Menard, author of the Cajune? Yes. Okay, so this is a short story by Borger, and it's actually, it's written that don't follow reading it, right? It's written as an academic dissertation, a study of this guy, Pierre Menard, who rewrote Don Quixote word for word, not copying Don Quixote, but he tried to get himself into the same mindset as Cervantes was 300 years earlier when he was writing it, and he tried to recreate it, but with his background, which meant that every word meant something completely different than what Cervantes wrote. It's this crazy, like, only word that could have written this, right? It's insane, but it's the same words meaning something completely different because of the context in which they're created. I think you can do that, you can look at that as a way of looking at covers too, right? So you look at it, easy listening cover, or easy listening song that's covered by a death metal band, right? Same exact words, totally different meanings. I can't talk about covers, I'm talking about bad covers. I can't talk about bad covers. It is lonely up here in space. Yeah, okay, so that was just a sample of that cover. And you should be grateful that it was only up here. I am the only one who ever really had to suffer for it, except for, like, Jeff, I'm sure he has this album, so. That's true. Yeah, so, so bad covers can be bad in one of two ways, right? They can be bad aesthetically, which I think this one is. Or they can be bad because they don't make enough of a difference to the song. Good covers, on the other hand, I think the best covers are those where you really have a genre of it, right? I think you can have great covers, you can have a great jazz cover by another jazz artist or a great pop song covered by another pop artist, and they can be fantastic. But the really interesting ones are where you cross genres because different genres are good at expressing different things, right? You don't listen to easy listening when you're in a suicidal mood, right? You listen to death metal, not that everyone who listened to death metal is suicidal. But that's just the idea, right? So it's really useful to pay attention to genre. And this, again, is where you get the same song expressing something completely different. This is Frank Sinatra's version of, well, not his version, right? But this is Lucky Lady Night, which Frank Sinatra's saying in Guys and Dolls, covered in 1993 by the Tony's before they got big. It's obviously very different than Frank Sinatra ever would have sung it. And actually, I think that because in 1993 I was running a movie theater, and this guy brought in a 2CE album set of covers of Frank Sinatra by punk and alternative rock bands. And it was filled with really good covers, like this one where they sort of make the song their own, and they used it to express emotions that Sinatra would not have. And it was filled with really bad covers, too, where you actually had punk bands trying to prune Frank Sinatra's songs. I did not actually include any of those covers. So you can all think of it. I can't really talk about covers without talking about one other way of stealing, but this is even less like stealing any of them, like standards, right? And covers only came into existence in the 50s. Before that, and in certain genres, songs don't really belong to people as much, legally they do. But in the parties, an impoverished song would immediately be re-recorded by 18 different other artists. And you would go to the record store and say, I want this song, not I want being Crosby's original song. It was a very different way of looking the world. And jazz still has that, right? There are tons of jazz standards that every jazz musician who worked their song has recorded because they want to make it their own, or it expresses something fundamental about communication, or whatever. Standards are sort of their universal in an interesting way. So that's it for the diversion, the digression, the metaphor of music, except it'll pop up back up. In soft war, in soft war. In soft where, I think we have exact analogs for each of those, sampling, influence, covers, and standards. And those are libraries, influence, ports, and patterns. Libraries are, you're using other people's code, or maybe your own code in the past. And you're reusing it in a new context. You could, like Girl Talk, create an application entirely composed of other people's code. That would actually be really cool. And I'd love to see a Rails-Rumble like competition where you didn't get the right name and code of your own. You just got to glue together pieces that other people would build. Does that exist? That's great. It's Rails. It's Rails? That's pretty much what we're seeing. Ah! All right. So other than pointing that out, I don't think library usage is just dealing with this particular interesting. Influence is a little more interesting because we see it a lot, a serious example, X unit, the X unit pattern. It started way back when Kent Back was working with small talk programs. He'd come into a team. And the first thing he would have them do is write their own test program. Every team wrote a different version of this S unit. And it was good. Kent looked upon it and thought it was good. But there was no, there was no one S unit. Every single team had their own different version of it. One storm unit. I went to a storm unit in Hawaii. Kent Back and Eric Gamble were sitting next to each other on a small plane flying across the Atlantic journey. And they decided, as they were going to do two programs today, so they wrote J unit, which was a distillation of the ideas in an S unit written into Java. So they didn't actually take any code from S unit. They didn't look at the code in S unit and point it over it. They just took the ideas, moved them over and moved them in for Java. So it was a very clear, actually it's kind of self-influenced. If you ever had written it by yourself, it would have been pure influence with Kent Not Evolved. I'm classifying that as influence. So ports, I think, are the most thing you have to copy the two covers. And as we'll see, there could be good covers and bad covers and good ports and bad ports. Keeping with the X unit example, we've got S unit influencing the development of J unit. And then you've got N unit. Here's the N unit, version one. Okay, so I haven't. But it is my understanding that N unit at version one was a line by line port of J unit in translation in the C sharp to the extent that there were lines of code, there were chunks of code that only actually applied to Java programs and would never be executed in any situation in .NET. So I would classify it as a bad cover. Because they took the artifact and they just translated it directly over into this new artifact that was good but it wasn't idiomatic .NET and it wasn't useful for all .NET and it had all this crux in it that they just didn't do it. A better cover of port is Michael Feather CDD unit. So he knew J unit. He was working in C++ and he ported it but not by copying it line by line across. He just took the ideas and possibly clearly not code because it's Java in C++ but implementation details he translated directly across. And I think just as we look at covers and genres, different genres are good at expressing different things. Different languages in programming are good at expressing different things. I think language can do everything. Any other things language can do. But tell me that you wouldn't rather write telco software in Erlang than you would in JavaScript. They're good for different things. They make certain practices expressive or not. We're here writing Ruby. Does that stretch your question? Stretch. If they were all completely equal then it wouldn't matter what we were all doing independently. We could still come to every single conference and get the same amount of it. So that equivalent to standards are their patterns. These are things that you're not necessarily copying but you either arrive at independently before the game or before their book. All the patterns existed and they were being used up and they were well. They were just codifying and identifying. They were making a dictionary not writing your research. Does that make sense? That's something like the data mapper pattern. For my friends who think it's only one word and I use the number to indicate it's actually the pattern. You look at the data mapper pattern and you can see it in the wild in various contexts. There's also data mapper one word in PHP which they didn't know about until last night. There's one bit of mapper and there's esophatomy which the ORM part of it is the data mapper pattern. They're all illustrations of the same pattern though it's not necessarily the case that any developer or one of them was looking at the code that the ORM they were just looking at the pattern itself. With that sort of structure I want to look at the genealogy of some software and show you where things have been influenced or where things have been stolen and where things have been covered. We can start with VDD. In the beginning there was JVHA conversations that Dan North had with various other people and Dan North saw it and it was good. From conversations around JVHA and being near the development of it and talking to all the important people Steven who spoke earlier wrote the first version of RSpec which then sort of took those principles in a slightly different way. Dan North actually came back into the picture and wrote RVHAVE which was a groovy port of JVHAVE that eventually grew into a sort of urban cucumber. Then you got PHPSpec that was derived from RSpec and Jasmine which drew from at least four different frameworks to provide VDD for JavaScript. And this is my corporate slide. So at the top you've got the CEO or the idea which is VDD that sort of led to JVHAVE where JVHAVE was the first emergence of it. That influenced the development of RSpec and RSpec then splintered and actually there were way more than just these three. The two that comes from PHP one, it influenced the development of all of these and they came back into form Jasmine. RVHAVE itself grew into Storyrunner which then was rewritten, I think this is actually two rewrites. So RVHAVE was rewritten into Storyrunner which was included in RSpec and it was rewritten into cucumber which we all know and love. So I think for most software you can probably create a crazy corporate work chart of its history like this. I'm not going to do any more of those and no more of these slides. Rails clearly has been ordered or copied or maligned as you like it. These are Rails, KPHP. So I think a round version like 0.8.2 or something of Rails, KPHP came up with hey that's a really good idea, let's do that in PHP. And for a while, Rails released a new feature and a month later KPHP dropped a new version that included that feature. It was like popular. It was really kind of sad for the KPHP folks. I guess they were happy they were ready to be created. Yeah. But since then it is my understanding KPHP has evolved in some direction but for a while it was a very direct cover and I would argue that cover of Rails. Perhaps even worse is Groovy on Rails. All they did was put a stick in G in front of it and said hey we've got our own thing but in fact it obviously is just a port. Right on Rails was written by Steve Yeggy it's a JavaScript version of Rails which is, I don't know why you do that. And then the first time I started talking about this stuff I was talking to one of my friends who's a .NET developer, I didn't call him my friend an acquaintance who was a .NET developer and he said oh my god ASP.NET stills everything and he proceeded to list off you know hibernate, yeah we have in hibernate and whatever we have in whatever et cetera. In fact yes? You omitted the wheels framework which is Rails on Coalfusion. Meals is Rails on Coalfusion. Yes! You think that was an act of hill-on-mission? Okay. So ASP.NET MVC came out like a year and a half ago maybe two years ago and in fact it took a lot of its ideas from existing frameworks whether they're officially MVC or not it re-implemented a lot of its ideas. Some of that I'm sure is tradable in the same pattern some of it is just straight up popping. Whiskey, do you guys know Whiskey? A couple? So Whiskey is from Python there was a guy, actually we heard about it earlier right, we had Papo up here, I don't know where he went but yeah. So Python programmer was reading several APIs and said hey that sounds cool except it's Java and I do Python. So he wrote the Whiskey spec. Whiskey is itself a spec, it is not executable code. The first Python framework that implemented it was paste, paste a since it's been decorated, now they have web-album which is a fun word to say because web-album is much more fun to say. Crucian records you saw the Whiskey spec say hey that's awesome I want to make it Rack and it's in Ruby and it blew up, right? We'll talk more about that in just a second because it is awesome. In JavaScript you have Giskey and Jack and probably you have Giskey and Plack and it has what we have Hack 2 which is actually the successor to Hack no number which is what I like to call that. So Whiskey is a spec this is the code example that is included in the PEP, the PEP URLs all the slides will be on the web and you can see that the URL is important. This looks fairly familiar right if we're all familiar with Rack this looks pretty similar we have headers and we've got a body it's a little different, there's this weird start-response thing I don't know web-album so this is the current implementation of Whiskey that most of Python uses apparently I think it can improve high levels but it looks identical right the environment, the start-response is just smooth down Rack we all know and love here we get the start-response we just have the environment hash and then we return status, headers, body Jack actually has changed since the last time I get to talk he used to be in an array, now it returns a drop-script object ready to status headers and body let's erase them all to Rack Plack looks identical to Rack except being in Perl which is a cracker only sorry to whoever liked it earlier but second I kid, I love Perl when I can read it so in half we have you know a drummer too so Hack is in Haskell, actually I find this harder to read in Perl but you can see what's going on there's a response, 200 status, headers and string so we have a clear pattern here we also have a pattern in the naming, so a quick interlude on naming notice that most of these were called acts, Jack, Plack, Hack 2 I'm sure, actually I'm not a knack there would be if I didn't have a server built in that's node node? so they're all named after Rack whereas some of them we have some things named after Whiskey when I gave this talk the first time there was no jizby so it was just whizzy and jizby also if I'm a worser to say so the idea here is that you can trace genealogy by looking at the names people use so I've met you that Plack was written by someone who was not being inspired by Whiskey but was being inspired by Rack at the end of that interlude so Sinatra, we all know a lot of Sinatra Sinatra also has I'm going to make this claim and I have no evidence to back it up but if you're not going to, yeah whatever Sinatra is the most copied web software in the world, that's my claim because if you look at any language there at least half a dozen clones of Sinatra most of them are like somebody started to do it because it looked easy and they stopped look at these wrap pack flasks from the Nancy I could have put twice as many on there without a crumb Sinatra we know so you can write your template you can pull up RAM out of the URL and you can process post it in, you can have across the body wrap pack is the groovy version shocking weight, it looks so much like a groovy version except you have to set a template root flask is the Python version it's a little more cruffy and it's got four spaces between it because it's Python but it does the same stuff Slam is the APHB version I think or more APHB version than anything else oh that's probably a mistake it shouldn't be slim, cool, cool, or RAM but yeah it looks like the HPB Nancy, this one's shocking this is the .NET version of Sinatra this is all, there's not like eight screens of configuration in it this is all it is they actually did a really good job of this with Nancy so again on naming again notice we've got flask clear associated with Sinatra, Nancy, Sinatra slim which I guess is anything for one of the wrap pack wrap pack, there's also Fitzgerald there's BlueEyes which is a skull framework there's, what? SammyJS, yep so a lot of them are named according to wrap pack members or Sinatra himself the first skull framework that was a port of Sinatra, does anyone know what it was called? so there's BlueEyes now which is more popular but the first skull framework was named Skalatra I think they kind of missed the boat line the source of the name is there but yeah, okay so we've seen lots of examples of people actually stealing why should you therefore go out and steal everybody else is doing it I told you everybody else was jumping off the bridge what I expected you to there are three reasons to look at taking ideas and code from other languages and other places and making them your own the first is opportunity so you're out learning language, you see something awesome say, hey, that's cool shit I wish I had that cool shit in one of my work in at work you steal it you guys know Web Machine yep, I know Steve knows Web Machine so Web Machine is written in Erlang and it's awesome it's super cool and Sean Cropes and he used it in Erlang a lot saw it and saw hey, I wish Ruby had something like that so he created Web Machine which is awesome if you like Steve's talk on hypermedia guys, Web Machine is where you should look the second reason to steal stuff is to educate yourself this is kind of a reversing thing it's not you find something to copy in this case I want to learn Python for a lot of other reasons because I don't want to learn it by implementing something in it that I already know how to implement and this is the blogging everybody has to write a blog so when you learn a new language or web framework you go to write a blog in it in real life in non-software in non-software or language stuff when I needed to refresh my Italian I got the Harry Potter books in Italian because I knew Harry Potter was really really well and so I was able to actually learn some Italian and read it I knew that now this is a great strategy I highly recommend it if you're trying to learn a new language pick a book you know really well get in that language and read it on tape if you want to speak it, I actually don't like talking to people so the reason I think the most interesting reason is need driven it's like I need to feed my family so I'm going to steal some bread or I need to solve a really hard problem in my language I'm going to go out and look for a solution and steal it from somebody else so a case here would be like I did some iOS work a while ago and this was before testing was easy in iOS so somebody said, I have a need to I'm going to test the crap out of my iOS projects there's no answer to that in Cocoa right now so I'm going to look around and there's no good answer and I guess he was familiar with Ruby and he looked at RSpec that's really cool I wonder if I can work that over and again and now there's a project called Cedar that is RSpec like testing for iOS it's really cool does anybody hear you Cedar? somebody knows iOS go out to you Cedar and tell me how cool it is powerfully varied but moderately would be acceptable so you have a need how do you then proceed with your thefting beefing that's the word therving I like bergling I don't like actually bergling I like the word bergling scare quotes make everything better we're going to look for something to steal so I think in Ruby we're sort of blessed in that we can look to a lot of different languages to steal things and it will be relatively easy to steal we can look at functional languages we can certainly look at object-oriented languages we can look at prototype languages if we want to do something crazy and just use onion classes and you know and I think I just made Evan cry a little bit was it because of the word or because of the suggestion that people should do it this is a suggestion don't look at prototype languages unless you're stealing stuff from JavaScript is that okay? I'm going to stamp Evan's approval on that slide so where do you look once you've decided I want to look around GitHub, Bitbucket, Google code and if you're desperate source for it the Sinatra examples if I recall correctly I found that by typing Sinatra into GitHub and just skipping over all the Ruby ones even though I could have done it the entire slide I'm just Ruby port of Sinatra which is Sinatra but apparently people didn't think I was kidding the other place there are places for specific languages to look there are places for good languages that you can look from work so if you're trying to steal the Ruby go look at RubyGames if you're trying to steal the Python, Peps and PyPy C-Pan obviously is a great idea all package repositories I bet you for any given language other than like some language I don't know you can find a repository of all the packages and look at it once you see stuff how do you know if it's any good well you can look at the activity of the repository the edge case testing that means that somebody's actually get the edge cases which means that somebody's using it the citations are being used in other projects are a good way to tell if it's worthwhile documentation and history are extremely important when you're looking for ideas because they document the ideas and they show you how things evolve over time so you can perhaps avoid potholes in your stealing and pouring it into your own language the strong opinions is an interesting one I hate Hamel Jeff Jeff loves Hamel I like to excuse my call projects that incite strong opinions and people are interesting and worthy of discussion current and final interlude, the mathematics of beauty you guys know okCupid? the dating site? so they have a blog called okTrans which is amazing they take their greens of data and they analyze it and tell you cool stuff the mathematics of beauty where they show that profile pictures one is ugly and one is hot pictures of people that are rated uniformly high like average of 4 and most of the ratings are 4 they get x amount of messages per week pictures where they average 4 but they're split between 5s and 1s they get like 3x and there are lots of reasons why 3 proposals are super cool but we're drawn to things where people have the working opinions and it's there, it's profitable to look for deeper understanding of those places and software ok so almost done what to do? you found your project how do you steal it? well you can steal it line by line like in unit version 1 I do not recommend that that gets you, that's like carnival I'm going to do exactly the same things they did translating syntax over to my language and think it's going to be good it's actually not going to be good, you're not going to understand so what I do recommend is acceptance testing, we're talking about fairly large codes that have definable inputs and outputs so it should be relatively easy to write acceptance tests in whatever language you like, cucumber, whatever run it against the original code run your acceptance test against that code and then you write your Ruby version to make maps the same as us so what you're doing is you're copying the intent of the code, not the actual mechanics of the code and that's it, thank you